Windows用のインストール支援システムにはScoopというのもあるらしい
tag: scoop,windows,chocolatey
https://chocolatey.org/ chocolatey との違いは、Admin特権不要( インストール先は全部個人ユーザーディレクトリの中の ~/scoop/以下 )ということらしい。
主に開発用のコマンドラインツールを中心にパッケージというかバケットを提供するとのこと(chocolateyはFireFoxとかWinMergeとかメジャーなGUIモノも提供している)。
Spring Boot のドキュメントの中で出てきたのでメモ
ソフトバンクの大規模通信障害が発生中
182,584bytes
東京周辺、大阪周辺、名古屋周辺みんなダメっぽいね。 報告数が多いから地図に出てるけど、これ日本全国ダメなんじゃ・・?
写真画像はダウンディテクターから 15:20ごろのもの
p.s.
入場チケットのQRコード確認もできなくなるのか。なかなか大変だ。
p.p.s
原因はエリクソンのvMMEの証明書の期限切れとのこと。
まれに良くあるヤツだwww
結局、13:39ごろから21時ごろまで全国的に通信不能だった。
ソフトバンクのiPhone8 Plusは3Gモードにフォールバックしてたけど、全く通信できなかったw
変な予告CM入れてて一部ではウケてた模様
Docker for Windows (CE) stable版 新しいのでた (Docker Community Edition 2.0.0.0-win78 2018-11-19)
tag: docker-for-windows
今回からバージョンの付け方が変わるらしい。 Docker 18.09相当のようだ。
今回のリリースでは大きな変更はなくマイナーチェンジ版とのこと。
ssh経由でrsyncする際に、向こう側のホストでsudoする方法
tag: rsync,sudo,rsync-path
ssh経由のrsyncで外部ホストのバックアップを取る場合、sshで入れるユーザーはrootではなくてubuntuとかになっている。
ubuntuユーザーのままだとパーミッションの関係でバックアップできないファイルが結構でてくるので、ubuntuユーザーでsshしてroot権限でrsyncバックアップする時の小技。
相手側のホストでsudo rsyncはパスワードなしでできるようにあらかじめ設定しておいて、 --rsync-path="sudo rsync" と指定する。
以下実例。
export LANG=ja_JP.UTF-8
rsync --progress -av -e "ssh " --rsync-path="sudo rsync" --delete --exclude .ssh/ george@${FROMHOST}:/home/george/ /newdisk/rsync/home/george/
テキストエリア(textarea)のv-modelのデータ初期化 from HTMLデータ (vue.js, axios)
tag: vue2, axios, wiki
■概要
俺のwikiにもクリップボードに画像がある状態でテキストエリアでCtrl-Vすると画像を自動でアップロードして、 その画像へのリンクテキストをテキストエリアに挿入する機能が欲しかったので実装してみた。
その際、HTMLから文字列データ(Mustache形式を含む)を得てtextareaのv-modelを初期化するのが大変だったのでメモ。
■背景
貼り付けイベントを拾って、クリップボード内に画像があればaxiosで画像をアップロードする話は↑に書いてあるのだけど、テキストエリアの初期データ投入に困った。
元々俺のwikiはpure JSP/Servletなので、編集前wikiテキストデータが<textarea>〜データ〜</textarea>という形でJSPにてHTML形成されてくる。
Vueの場合、テンプレートを用意せずに DOM の Element をマウントすると、元々あったHTML構造をテンプレートとして採用してくれる(推奨はされていない)のだが、 その中に {{ Mustache }} 形式の文字列があるとテンプレート展開しようとする。
Mustacheが変数として未定義ならWarningが出るし、 {{ Mustache(hoge) }} みたいな関数呼び出し形式が存在すると、関数定義が存在しないとErrorになって画面が出ない。 つか関数が実在してもここで呼び出しされては困る。 元々Vueの関数を呼び出すつもりなどない <textarea> の中で、俺のwikiのpluginを呼び出す書式として書いているだけなのだ...。
■対策
textareaのv-modelの初期化の話はGoogle先生に聞いてもでてこないので、適当にでっちあげてみる。
考え方としては以下。
<!-- vue.jsのロード -->
<script type="text/javascript" src="/kjwikig/js/vue.js"></script>
<script>
Vue.prototype.$appName = 'MemoDir/ClipboardImageUpload'
Vue.prototype.$appContextPath = '/kjwikig';
</script>
<!-- axiosのロード -->
<script type="text/javascript" src="/kjwikig/js/axios.js"></script>
(中略)
<!-- vueにマウントするターゲットのdiv。子要素は一つだけになるように無駄なdivを入れている。目印の class も指定。 -->
<div id="app_form_editsub_0" class="div_app_vue_ctrl_v_img">
<div>
<form class="forminput" name="regist" method="post" action="/kjwikig/kjwikiedt">
<!-- 問題のテキストエリア。初期データが既に mustache 形式を含んでいる。目印の class も指定。 -->
<textarea name="page" wrap="soft" rows="20" v-model="textareavalue" v-on:paste="handlePaste" class="textarea_app_vue_ctrl_v_img">
テキストエリアの中身。
{{uploadfileref(image.png)}}
みたいな、Mustache形式なんだけどwikiのplugin表記が入ってくる。
</textarea><br>
<input type="submit" value="保存する">
</form>
<div v-show="vue_message">{{ vue_message }}</div>
</div>
</div>
(中略)
<!-- 自作のJavaScriptロード -->
<script type="text/javascript" src="/kjwikig/js/imagePaste.js"></script>
//
// テキストエリアに対して画像をペーストすると、自動的にアップロードした上で、画像へのリンクを貼る
//
// 参照 https://imatomix.com/imatomix/notes/1509535920 マークダウンエリアへの画像の直接入力 by Keita Imatomi
//
// 実行前に以下のデータを設定しておくこと
// * Vue.prototype.$appName ... WikiName を設定しておく
// * Vue.prototype.$appContextPath ... アップロード先のベースURL
//
// textareaの中に {{ Mustache }} があると発狂するので、マウント前に innerHtml の内容を空にする。マウント後に初期化関数経由でデータを投入する。
//
// 2018.12.15
//
var el_app_vue_upload = document.querySelector(".div_app_vue_ctrl_v_img");
var el_app_vue_upload_textarea = document.querySelector(".textarea_app_vue_ctrl_v_img");
if (el_app_vue_upload != null && el_app_vue_upload_textarea != null) {
var vm_form_upload_0 = new Vue({
data: {
vue_message: 'from vue: Vue version ' + Vue.version,
textareavalue: ''
},
methods: {
// textareaデータを初期化する
initTextData: function (value) {
console.log("enter initTextarea.")
var textarea = document.querySelector('.textarea_app_vue_ctrl_v_img')
var pos = textarea.selectionStart
pos = 0
// update v-model
this.textareavalue = value
// update DOM
textarea.value = value
textarea.selectionStart = pos
textarea.selectionEnd = pos
},
// imageデータをpostする
postImage: function (formData) {
console.log("form post path is " + Vue.prototype.$appContextPath + "/kjwikiuploadapi")
axios
.post(Vue.prototype.$appContextPath + "/kjwikiuploadapi", formData)
.then(function (response) {
var textarea = document.querySelector('.textarea_app_vue_ctrl_v_img')
var sentence = textarea.value
var len = sentence.length
var pos = textarea.selectionStart
var before = sentence.substr(0, pos)
var after = sentence.substr(pos, len)
for (var image of response.data.images) {
// var word = '' // for markdown
var word = '{{uploadfileref(' + image + ')}}' + "\n"
sentence = before + word + after
// update v-model
this.textareavalue = sentence
// update DOM
textarea.value = sentence
textarea.selectionStart = pos + word.length
textarea.selectionEnd = pos + word.length
this.vue_message = "from Vue : uploaded " + image + " and link is pasted"
console.log("from Vue : uploaded " + image + " and link is pasted")
}
})
.catch(function (error) {
console.log(error)
this.vue_message = "axios post error."
})
.then(function (response) {
// always done
})
},
// pasteされた際のフック
handlePaste: function (e) {
var items = e.clipboardData.items
var formData = new FormData()
this.vue_message = 'from vue: pasted.'
formData.append('name', Vue.prototype.$appName)
for (var item of items) {
if (item.type.match('image.*')) {
this.vue_message = 'from vue: image data pasted.'
formData.append('note', item.getAsFile())
}
}
if (formData.has('note')) {
this.postImage(formData)
}
}
}
})
// マウント前にテキストエリアの内容を保存
var tmp_form_upload_0_textvalue = el_app_vue_upload_textarea.value
// テキストの中に {{ Mustache }} があると異常動作するので、テキストは消しておく
el_app_vue_upload_textarea.value = ''
el_app_vue_upload_textarea.innerHTML = ''
el_app_vue_upload_textarea.pos = 0
// マウント実行
vm_form_upload_0.$mount(el_app_vue_upload)
// vmの中のv-modelのデータに値をコピーする初期化関数呼び出し
vm_form_upload_0.initTextData(tmp_form_upload_0_textvalue)
}
Vue.jsのtwo way データバインディングって、 HTML側の指定をガン無視(checkbox, radio)したり、 テキストエリアの初期化がHTMLからできなかったり、 なんか足りない感じ。
まっさらのformから編集開始するなら良いんだけど、登録済みの情報の編集画面とかどうすんのかな。 axios APIで既存データを個別に取得してモデルデータに展開すんのかな。
■参考文献 Vue.js
この規模の翻訳やってるって凄いなこれ...
■参考文献 Vueで使われているテンプレートエンジン Mustache 記法について
Vueで使われているのは本家Mustacheとは違うみたいで、単体のMustacheテンプレートエンジンがある模様。
今回は {{ Mustache }} 記法の誤爆発動で苦しんだけど、記述方法自体は色々できるっぽい。
Mustacheはロジックレスなテンプレートエンジンと言うことで、ループ展開も {{ #items}} 〜 {{ /items }} みたいな記法で済ませる根性は割と好きw
HP ENVY 4520 Series (HPF475F9) (プリンタ/スキャナ) Windows 10 ver 1809/1803 からカラー印刷ができない / プリンタの印刷設定で一般保護例外が出る
Windows Update で Windows 10 ver 1803/1809 に最新化してるとNGっぽい。強制的に白黒印刷になる。
Windows 10 ver 1703 までのPCからだとカラー印刷できるし、プリンタの印刷設定画面も開く。
うーん。購入は2017/12/03だったけど、1年もたないプリンタってどうよ・・・。本体価格 4,888円だからこんなモン?
ドライバ供給がタコなのでHP製品はダメぽ
FreeBSD 12.0 RELEASE 出た
tag: freebsd, freebsd12
アップグレード中に不気味なエラーが出たけど、これ大丈夫か?w
root@n3050 ~ $ freebsd-update install Installing updates...install: chown 0:0 ///proc: Operation not supported install: chmod 555 ///proc: Operation not supported
root@n3050 ~ $ freebsd-update install Installing updates...rmdir: ///var/db/etcupdate/current/usr/share/openssl/man/en.ISO8859-1: Directory not empty rmdir: ///var/db/etcupdate/current/usr/share/openssl/man: Directory not empty rmdir: ///var/db/etcupdate/current/usr/share/openssl: Directory not empty rmdir: ///var/db/etcupdate/current/usr/share/man/en.UTF-8: Directory not empty rmdir: ///var/db/etcupdate/current/usr/share/man/en.ISO8859-1: Directory not empty rmdir: ///var/db/etcupdate/current/usr/share/man: Directory not empty done. root@n3050 ~ $
再起動後、pkgインストールしようとすると、以下のエラーがww
ssh george@n3050 ~ $ pkg ld-elf.so.1: Shared object "libssl.so.8" not found, required by "pkg" ssh george@n3050 ~ $
華麗に以下の記述に引っかかったのね;;
At this point, users of systems being upgraded from earlier FreeBSD releases will be prompted by freebsd-update(8) to rebuild all third-party applications (e.g., ports installed from the ports tree) due to updates in system libraries.
After updating installed third-party applications (and again, only if freebsd-update(8) printed a message indicating that this was necessary), run freebsd-update(8) again so that it can delete the old (no longer used) system libraries:
pkgコマンドまでやられるとは予想してなかったけども・・。
仕方がないので、VirtualBox + vagrant で起動する FreeBSD 11 RELEASE バックアップマシンからpkg(8)コマンドに必要な3個の共有ライブラリをscpでコピーして持ってくるという顛末にww
pkgの実行に必要な共有ライブラリファイルは以下の3個。
ssh george@n3050 ~ $ tar tvzf hoge.tar.gz -r--r--r-- 0 root wheel 470352 6月 22 2018 usr/lib/libssl.so.8 -r--r--r-- 0 root wheel 2542360 6月 22 2018 lib/libcrypto.so.8 -r--r--r-- 0 root wheel 788968 6月 22 2018 usr/lib/libarchive.so.6 ssh george@n3050 ~ $
このまま cd / ; tar xvzf ~george/hoge.tar.gz すれば pkg コマンドだけは動くようになる。
そしたら全部のパッケージを再インストール。
pkg update pkg upgrade
ひとまずこれでFreeBSD 12.0 RELEASE への移行ができた。
Oracle VM VirtualBox 6.0 出た
tag: virtualbox, virtualbox6
実行パフォーマンスは悪くなるけど、Hyper-V上でのVM実行をフォールバックとしてサポートしたらしい
早速、Hyper-Vを有効にしたマシンで、vagrant 2.2.2経由でvirtualboxを使って起動してみる。
フォールバック実行できないっぽい。 Hyper-Vが有効でダメな時と同じエラーを出している。 これはVBoxManagerとvagrantの対応待ちかな。
==> default: Booting VM... There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below. Command: ["startvm", "f0e9d6e2-85e2-415d-844a-9cee5a7fdd7b", "--type", "headless"] Stderr: VBoxManage.exe: error: (VERR_NEM_MISSING_KERNEL_API). VBoxManage.exe: error: VT-x is not available (VERR_VMX_NO_VMX) VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
今度はOracle VirtualBox を直接使用してみる。
Windows 10 Pro ver 1809 Hyper-V 有効 (Docker for Windows 2.0.0起動中) のメインマシンで VirtualBox 6.0.0を起動して、FreeBSD 12.0 RELEASE の DVD-ISOイメージを使用してみた。
起動はするんだけど、FreeBSD インストール中に src.txzのチェックサムが違うとか言われてインストールはできず。
何度か試しているうちに、VMの起動もVT-xが無いと言われてできなくなってカオス。
うーん。謎。
早いもので今日は大晦日ですよ
去年の年末はIntel CPUのSMT関連脆弱性で盛り上がっていたけど、今年は何もなしかな
108の煩悩
某アリスギアアイギスというスマホゲームにて、ガチで108個のHEXマスをタップさせてて鐘の音を鳴らし、108個の煩悩を全部ゲーム登場キャラで補足解説/煩悩実演/時にはダジャレしつつ煩悩を払うという大晦日イベントやってて笑ったww
煩悩の内容にはよく似た内容のものも多くて本当に108種類あったかどうかは定かではないけど、ゲームキャラによる解説/煩悩実演は確かに108種類あったwww(←そっちしか覚えていない)
108種類ガン見したのはこれが初めてかもしれん
歴史とか古典とかもそうだけど、エンタメストーリー仕立てにしてあると頭に入ってきすぎて困るww
p.s.
108個というのは数字のごろが良いから採用されているようで、沢山という意味らしい。 108個の内容は宗派によって色々で特に決まっているわけではない模様。