画像アセットを使ってサイズ別に書き出しつつ、.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
  1. トップ
  2. tech
  3. Photoshop でアプリケーションアイコンを作るときの仕上げ (書き出し) 方法

重要な点

常に単に縦に並べるだけなら 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 のサイズが計算されるさい、子要素のサイズを計算しようとするが、このとき子要素が%指定されていても、まだ親のサイズが決まっていないためゼロになる?

とりあえず、このテクニックは多様する。

  1. トップ
  2. tehc
  3. flex layout によるレスポンシブ入力フォームの勘どころ

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 上で動くように実装しなおした。

  1. トップ
  2. tech
  3. リファレンスマニュアルをインクリメンタル検索するやつを Electron で実装した