金曜あたり頭がぼーっとするなぁと思っていたら、土曜日午後あたりから急激に身体もだるくなってひたすら寝ていた。
体調不良
Chemr を Mac App Store に出したぞ
Electron の MAS ビルドが v0.34.0 から提供されるようになったので、それを使って出してみた。が、v0.34.0 にはまだ private api usage があって reject だった。バグ報告したらすぐ修正されて、v0.34.2 で治った。
通常ビルドも継続配布
https://github.com/cho45/Chemrtron
App Store に出すことができたら github releases のほうにはパッケージをアップロードしないようにしようと思ったけど、今のところあげてある。パッケージ自体は一緒で sandbox 化もされている。
いろいろ思うとことがあって、開発環境をつくって、いつでもパッチ書けるような状態にするインセンティブがどこかで働くとよいな、と思うとパッケージを releases にあげない (できあいのが欲しければ買う) のがいいと思うんだけど、そもそも Chemr 程度ではそのようなインセンティブは働かないだろうという…
Mac App Store のショバ代がクソ高い
税込 (消費税8%) ¥12,744/年もかかります。勉強代だと思って1回払ってみましたが2度と払いたくない。元をとれるならいいけど
node.js で git の blob sha1 を求める
github の API とかに出てくる "sha" は git 的な sha1 で、ファイルの内容のみからとった sha1 ではない。なんか変なヘッダをつけたうえで計算される。
これを node で計算する
var fs = require('fs');
var crypto = require('crypto');
function gitSHA1 (filename) {
return new Promise(function (resolve, reject) {
var shasum = crypto.createHash('sha1');
fs.stat(filename, function (err, stats) {
if (err) return reject(err);
shasum.update('blob ' + stats.size + "\x00");
var stream = fs.createReadStream(filename);
stream.on('data', function (data) {
shasum.update(data);
});
stream.on('end', function () {
resolve(shasum.digest('hex'));
});
stream.on('error', function (error) {
reject(error);
});
});
});
}
gitSHA1(filename).then(function (shasum) {
console.log(shasum);
}).catch(function (e) {
console.log(e);
});
kakaku.com の最安データを Google Spreadsheet で自動的に使う
=IMPORTXML("http://kakaku.com/item/xxxxx/", "string(//*[@id='minPrice']/a/span)")+0 みたいにすればいい。
Google Spreadsheet 側は ¥ マークとかカンマとかを無視して数値解釈してくれる。ただ、+0 をつけないと SUM() できない。
これで最安構成の合計金額をすぐだせます。
IMPORTXMLは2時間のキャッシュがあるそうですがこの用途では問題にはなりませんね。
IdeaVim の挙動に不満があるときのストレス発散方法
https://github.com/JetBrains/ideavim ここの Development Environment を読みます。ちょっと冗長なのでまとめると
初期設定
まずは clone
git clone git@github.com:JetBrains/ideavim.git
開く
普通の IntelliJ IDEA 13.1+ (Community or Ultimate) で File → Open… → clone したディレクトリまで移動して Choose
SDK の設定
- Cmd+; (File → Project Structure…) して、左ペインの SDKs を選択。
- "+" を押して IntelliJ Platform Plugin SDK を選ぶ
- Name を "IntelliJ Plugin SDK" に変える (git に入ってる設定とあわせる)
開発
コードを変える。
これで、Run → Run 'IdeaVim' すれば別インスタンスの IntelliJ が起動する。初回起動時は、初回起動のウィザードがでるが、全部適当でいい。途中でプラグインを有効にするか?みたいな画面がでるけど無視でいい (デフォルトで IdeaVim が有効になった状態で起動するので、余計なことはしない)
このインスタンスで挙動を確認する
常用する
常用するには一旦パッケージにする (jar にする) 必要がある。ant dist すればできる、ということになっている。
- View → Tool Windows → Ant Build を選択し
- IdeaVim → dist を実行すると out/build/IdeaVim.jar ができる。
はずなんだけど、build.properties の idea.download.url を最新のやつにしないとダメだった。
できた out/build/IdeaVim.jar を、常用している IntelliJ の Preferences → Plugins → Install plugin from disk… で読みこむ。
一回インストール済み IdeaVim を削除したほうがいい気がして削除してからやったけど、別にいちいち削除する必要ないみたい。
cdd とお別れして、別の cdd を定義した
ずっと cdd ( http://secondlife.hatenablog.jp/entry/20080218/1203303528 ) を使ってたけど、以下のような感じでいいかなと思ったのでついに使うのをやめてみた。(cdd はスクリーンの別ウィンドウのディレクトリに簡単に移動するためのコマンド)
function cdd() {
if [[ $1 == "" ]]; then
local selected_dir=$(lsof -c zsh -w -Ffn0 | perl -anal -e '/cwd/ and print((split /\0.?/)[1])' | uniq | peco)
if [ -n "$selected_dir" ]; then
cd ${selected_dir}
fi
else
local pid
if [[ $(uname) == "Darwin" ]]; then
pid=$(command ps -E -o 'pid,command' | WINDOW=$1 perl -anal -e '/STY=$ENV{STY} / and /WINDOW=$ENV{WINDOW} / and /^ *([0-9]+) +[^ ]*zsh/ and print $1')
else
pid=$(command ps e -o 'pid,command' | WINDOW=$1 perl -anal -e '/STY=$ENV{STY} / and /WINDOW=$ENV{WINDOW} / and /^ *([0-9]+) +[^ ]*zsh/ and print $1')
fi
if [[ $pid == "" ]]; then
echo "window not found"
else
local dir=$(lsof -p $pid -w -Ffn0 | perl -anal -e '/cwd/ and print((split /\0.?/)[1])')
cd $dir
fi
fi
} 実際のところウィンドウ番号じゃなくて一覧から選択できたほうが嬉しいなと思い peco に託すことにした。
ディレクトリ一覧は lsof で起動中の zsh プロセスの cwd を全部とってくることにした。
しばらくこれでやってみる。
やっぱ数字(ウィンドウ番号)指定でも移動したいので、どっちもいけるようにした。。
✖
Photoshop でアプリケーションアイコンを作るときの仕上げ (書き出し) 方法
画像アセットを使ってサイズ別に書き出しつつ、.icns ファイルと .ico ファイルを作るまで
画像をつくる
1024px × 1024px で作るか、全部ベクター(シェイプ)で作る。
必要レイヤー全体をグループに入れ、グループに空のレイヤーマスクをかける。
書き出し対象のレイヤー全体をグループに入れる。この範囲だけが有効の状態で出力される。
また、空のレイヤーマスクをつけることで書き出し範囲を画像全体にする。これをやらないと透明部分が削除されて書き出されるため、余白がつかない。
画像アセット用のレイヤー名設定
グループのレイヤー名を
16 x 16 icon_16x16.png, 32 x 32 icon_32x32.png, 64 x 64 icon_64x64.png, 128 x 128 icon_128x128.png, 256 x 256 icon_256x256.png, 512 x 512 icon_512x512.png, 1024 x 1024 icon_1024x1024.png
にする。これで 16x16 〜 1024x1024 まで全部書き出される。このとき .png24 にすると後述する iconutil が認識できないファイルができるので、普通に .png を指定する
実際の生成
ファイル→生成→画像アセットにチェックを付けて保存する。[PSD basename]-assets/ ディレクトリ以下に自動的に書き出される。
OS X 用アイコンファイルへの変換
OS X 用のアイコンファイルは .icns という変な形式になっている。これを作るためには iconutil というツールをつかう。
iconutil は .iconset という png ファイルが入ったバンドルを .icns に変換するという動作をするため、まずは .iconset 形式にあうようにフォーマット(ファイル名)を変える。
cp -r foobar-assets icon.iconset cd icon.iconset cp icon_32x32.png icon_16x16@2x.png mv icon_64x64.png icon_32x32@2x.png cp icon_256x256.png icon_128x128@2x.png cp icon_512x512.png icon_256x256@2x.png mv icon_1024x1024.png icon_512x512@2x.png cd .. iconutil --convert icns --output icon.icns icon.iconset
Retina 用に @2x という名前のファイルがいくつか必要になる。これで icon.icns ができる。
Windows 用アイコンファイルへの変換
Windows 用のは .ico という変な形式になっている。これを作るためには imagemagick が使える。
imagemagick に複数引数を与えて .ico を出力に指定すればいいだけなので、以下のようにできる。
convert \ ./foobar-assets/icon_16x16.png \ ./foobar-assets/icon_32x32.png \ ./foobar-assets/icon_64x64.png \ ./foobar-assets/icon_128x128.png \ ./foobar-assets/icon_256x256.png \ ./foobar-assets/icon_512x512.png \ ./foobar-assets/icon_1024x1024.png \ icon.ico
これで icon.ico ができる。ico 形式は基本ただの bitmap で、フォーマット上の制限で最大 255px × 255px までしか対応してないが、Vista以降はPNG埋め込みできるようになっているらしく、identify すると以下のような感じになる。
icon.ico[0] ICO 16x16 16x16+0+0 32-bit sRGB 121KB 0.000u 0:00.000 icon.ico[1] ICO 32x32 32x32+0+0 32-bit sRGB 121KB 0.000u 0:00.000 icon.ico[2] ICO 64x64 64x64+0+0 32-bit sRGB 121KB 0.000u 0:00.000 icon.ico[3] ICO 128x128 128x128+0+0 32-bit sRGB 121KB 0.000u 0:00.000 icon.ico[4] PNG 256x256 256x256+0+0 8-bit sRGB 121KB 0.000u 0:00.000 icon.ico[5] PNG 512x512 512x512+0+0 8-bit sRGB 121KB 0.000u 0:00.000 icon.ico[6] PNG 1024x1024 1024x1024+0+0 8-bit sRGB 121KB 0.000u 0:00.000
flex layout によるレスポンシブ入力フォームの勘どころ
重要な点
常に単に縦に並べるだけなら flex layout はいらない。
適用箇所
たくさんの項目をできるだけ詰め込む場合 flex layout はあらゆるスクリーンサイズへの対応で大きな活躍をする
min-width 及び適切な範囲でのグループ化を行なったら、あとは flex によるレイアウトに身をまかせる。
flex になったボックス内で width: 100%; や height: 100% が効かない
flex プロパティが指定されている要素を親に持つ要素に width: 100% や height: 100% を指定しても効かない (computed が 0 になる) ことがある。
flex box の仕様のなかでどこに書いてあるのかよく読めてないが、flex 指定された要素 (flex item) の見掛け上の大きさと、子要素に対する計算上の大きさが違うようで、どうしよもない。
同じことをやりたい場合、flex 指定した要素 (flex item) を position: relative に指定し、子要素を position: absolute; top: 0; left: 0; right: 0; bottom: 0; とすれば、この子要素の width/height が確定し、子要素の子要素 (flex 指定された要素の孫要素) では正しく width/height の % 指定が効くようになる。
flex item のサイズが計算されるさい、子要素のサイズを計算しようとするが、このとき子要素が%指定されていても、まだ親のサイズが決まっていないためゼロになる?
とりあえず、このテクニックは多様する。
リファレンスマニュアルをインクリメンタル検索するやつを Electron で実装した
https://github.com/cho45/Chemrtron
機能
- インデックス用のクローラ
- 作ったインデックスのインクリメンタル検索と表示
できるだけ雑にインデックス作成用のクローラを実装できるようにしたかったので、そのようになっている。
オフライン閲覧はあんまり考慮してないが、file:// でインデックス登録すればオフラインでも使えると思う (ネットワークよりもディスクサイズのほうが厳しいのでオフラインにあまり興味がない…)
動かしかた
レポジトリをクローンする場合 electron-prebuilt が必要。
npm -g install electron-prebuilt
git clone https://github.com/cho45/Chemrtron.git cd Chemrtron electron .
または https://github.com/cho45/Chemrtron/releases のページから .dmg を落としてくる。うまく動くかわからないが、こちらはランタイムを全て含むので electron-prebuilt や npm などは不要。
インデクサの選択
歯車アイコンまたはメニューの Preferences… から設定画面を開くと選択できる。
まだ並べかえを実装していないので、オンにした順に並ぶ。
インデクサの実装
マニュアル単位でインデクサを実装する必要がある。主要なものは実装済みでレポジトリに入れてあるが不完全かもしれない。対応済みの一覧
だいたいの場合 HTML で全メソッド/クラスへのリンクが張ってあるページがマニュアルに存在しているので、そのページをとってきて querySelectorAll とかで雑にリンク抽出すれば十分なインデックスをつくれる。
インデクサのコードは非表示の別ウィンドウで実行されるので、ある程度重い処理でブロックしても問題ない。
インデックスの内容
インデックスといっても転置インデックスではなく、検索対象文字列の一覧を正規表現でマッチをかけているだけである。
リファレンスマニュアルのようなものの検索の場合フルテキストサーチよりも、ある程度一貫性のある文字列を検索させたほうが余計なものがヒットしないので気持ちがいいと思う。
例えば Array.prototype.slice みたいなページを表示したいとき、arr sli とかだけでいいようにしたい。既に行きたいページが明確なので雑なクエリで確実に辿りつきたい。
インデクサの書きかた
https://github.com/cho45/Chemrtron/blob/master/indexers/nodejs.js
あたりを参考にして雑に書くと動く。もし動かない場合、View → Toggle Developer Tools とするか、設定から Developer Mode をオンにすると console と、インデクサ用のウィンドウが表示させるのでデバッグ可能になる。
~/.chemr/indexers/ に置いても読むようになっている。
おすすめのインデックス
MDN (Mozilla Developer Network) は HTML, CSS, JavaScript を横断して検索でき、ブラウザごとの互換情報とか、ポリフィル方法 (実装概略) とかも載っていて、とりあえずウェブ系ならこれを検索しとけば良い感じで便利。
で、Dash で良くない?
クローラを内蔵していて、雑にインデックスを作るのが楽という方向性を目指しています。
今後
せっかくなので Windows 版を作ろうとしたがうまくいってない。
バックグラウンドで自動更新するようにしたい。
経緯
昔 Chemr というリファレンスマニュアルをインクリメンタルサーチするアプリケーションを書いていた。最初の Chemr は HTML Help を読め RubyCocoa で実装していた。次はFirefox + Greasemonkey 上で動くユーザスクリプトとして実装した。そして Electron が流行ってきたので Electron 上で動くように実装しなおした。
諏訪大社
仁科神明宮
諏訪大社に続き、仁科神明宮にも行ってきた。諏訪からは同じ長野県内ではあるがかなり離れており、駅からも30分ぐらい歩く。
現存する神明造社殿では最古で、本殿が国宝に指定されている。
神社はどの神社も式年遷宮で造りなおされる傾向があり古いものがそのまま残っているケースが少ない。この神社も300年前までは建て替えをしていたみたいだけど、その後は修繕をやって残っているらしい。
ちなみに神明造りに限らなければ、現存最古の神社は京都の宇治上神社で、こちらも国宝になっている (なおかつ京都の世界遺産を構成する1つ)。宇治上神社は5年前に行った


































