Kazuho's Weblog: H2O version 1.7.0-beta1 released with enhanced mruby scripting, CGI, and much more

H2O version 1.7.0-beta1 からは htpasswd も使える Basic 認証のサポートが入ったので、以下のようなコードは最早必要ありません。

現時点だと h2o に Basic Auth の機能が入ってなさそうなので mruby.handler で雑に書く

        mruby.handler: |
          USER = "tsun", PASS = "dere"
          lambda do |env|
            auth = env['HTTP_AUTHORIZATION']
            if auth
              method, cred = *auth.split(' ')
              if method == "Basic"
                user, pass = cred.unpack("m")[0].split(':')
                if user == USER && pass == PASS
                  return [ 399, {}, [] ]
                end
              end
            end
            [ 401, { 'Content-Type' => 'text/plain', 'WWW-Authenticate' => 'Basic realm="Restricted"' }, [ 'Authorization Required' ] ] 
          end 

これをかけたいとこに書けば basic auth がかかる。

最初 htpasswd 読むようにしようとしたが mruby に String#crypt はなかったのでやめた。

  1. トップ
  2. tech
  3. h2o で Basic Auth

Quick Charge 2.0 とは

現行でも採用事例がある USB コネクタでの急速充電の仕様。USB は規格上 5V なので、急速充電のために電力高めようとすると電流が多くなってしまいコネクタやケーブルの発熱を招く (USB のコネクタは定格では 1.5A までしか流せない) 。なので、供給電圧自体を上げて (9V, 12V, 20V) 供給可能電力を増やそうというもの。

USB 公式には USB PD (Power Delivery) があるが、USB PD のためにはまず USB Type-C コネクタの普及が必要だし、ハンドシェイクが割と複雑なので専用のコントローラICが必要。

一方 Quick Charge 2.0 は既存 USB コネクタを流用した規格かつ簡単なプロトコルなので採用しやすい。

 -

3.0 / 5.0

既に対応したモバイルバッテリーがあるし、端末側でも対応しているものがちらほらある。(ZenFone 2 も対応している)。割と単純なプロトコルなので Quick Charge とは言わずに対応してる端末もある (権利的なアレかな)

Quick Charge 2.0 の仕様

公式の仕様書がみつからない。NDA? よくわからんけど、サポートチップのドキュメントやリファレンスデザインのドキュメントにはある程度詳しいことが書いてある。

D+, D- ラインに対し 0V, 0.6V, 3.3V の3値を使う。

  • D+ に 0.6V を 1.25s 間かける
  • D- を 1ms 間プルダウン
  • 設定したい電圧に応じて D+ D- に電圧をかける

http://www.gamma.pl/PDF/powerint/chiphy.pdf

D+ をプルダウンすると直ちにリセットして Quick Charge 2.0 のステートを抜けるようなので、各状態遷移の間は D+ を0Vにしないようにする必要がある。

D+ 0.6V, D- が GND の場合は 5V のなので、初期化 (D- 1ms プルダウン) 直後は必ず 5V になる。

ref.
http://www.gamma.pl/PDF/powerint/chiphy.pdf
http://www.tij.co.jp/jp/lit/ug/tidu917/tidu917.pdf

  1. トップ
  2. tech
  3. Quick Charge 2.0 の仕様

4年ほど前の引っ越しからずっと固定回線を契約せずモバイル回線+テザリングだけで自宅回線をまかなってきた。

  • 固定回線の契約・解約が面倒くさい
    • いちいち工事予定の日に家にいる必要があったり
    • 解約時に機器を送りかえす必要があったり
  • 引っ越しがだるくなる
    • ↑ に関連するけどとにかくだるい
  • 料金が高い
    • そんなに家にいないのにこんなに金払うの??ってなる
  • 固定回線とかもう古い

最初は WiMAX 付きのスマフォだったので良かったのだが (RTTは長いが容量制限はない)、LTE になって 7GB 制限ができてかなり不便になった。

キャリアに不満がつのって MVNO にしたらそもそも安定して通信できなくなった。

固定回線

ググっても評判の良いプロバイダというのは存在しない。マジで存在しない。どこも名目上のスピードは 100Mbps だったり 1Gbps だったりするけどこれは全くアテにならない。だからといって、口コミみたいなのも全くアテにならない (口コミ書く人のリテラシがバラバラすぎるから)

ということで、2年縛りみたいなクソなことをやってないところのうち安いところから試すことにした。

うつりかわり

キャリア
  1. au
    • 約6,600円

MVNO ぷららモバイルLTE無制限

  1. ぷららモバイルLTE無制限 (音声付き)
    • 3736円

固定回線 + MVNO ぷららモバイルLTEライト

  1. ぷららモバイルLTEライト(音声付き)
    • 1760円
  2. excite光
    • 3360円

モバイル回線 + 固定回線で 5120円ぐらい。

  1. トップ
  2. tech
  3. モバイル回線オンリー敗北

金曜あたり頭がぼーっとするなぁと思っていたら、土曜日午後あたりから急激に身体もだるくなってひたすら寝ていた。

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度と払いたくない。元をとれるならいいけど

  1. トップ
  2. tech
  3. Chemr を Mac App Store に出したぞ

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);
});
  1. トップ
  2. tech
  3. node.js で git の blob sha1 を求める

=IMPORTXML("http://kakaku.com/item/xxxxx/", "string(//*[@id='minPrice']/a/span)")+0

みたいにすればいい。

Google Spreadsheet 側は ¥ マークとかカンマとかを無視して数値解釈してくれる。ただ、+0 をつけないと SUM() できない。

これで最安構成の合計金額をすぐだせます。

IMPORTXMLは2時間のキャッシュがあるそうですがこの用途では問題にはなりませんね。

  1. トップ
  2. tech
  3. kakaku.com の最安データを Google Spreadsheet で自動的に使う

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 の設定


  1. Cmd+; (File → Project Structure…) して、左ペインの SDKs を選択。
  2. "+" を押して IntelliJ Platform Plugin SDK を選ぶ
  3. Name を "IntelliJ Plugin SDK" に変える (git に入ってる設定とあわせる)

開発

コードを変える。

これで、Run → Run 'IdeaVim' すれば別インスタンスの IntelliJ が起動する。初回起動時は、初回起動のウィザードがでるが、全部適当でいい。途中でプラグインを有効にするか?みたいな画面がでるけど無視でいい (デフォルトで IdeaVim が有効になった状態で起動するので、余計なことはしない)

このインスタンスで挙動を確認する

常用する

常用するには一旦パッケージにする (jar にする) 必要がある。ant dist すればできる、ということになっている。

  1. View → Tool Windows → Ant Build を選択し
  2. IdeaVim → dist を実行すると out/build/IdeaVim.jar ができる。

はずなんだけど、build.properties の idea.download.url を最新のやつにしないとダメだった。

できた out/build/IdeaVim.jar を、常用している IntelliJ の Preferences → Plugins → Install plugin from disk… で読みこむ。

一回インストール済み IdeaVim を削除したほうがいい気がして削除してからやったけど、別にいちいち削除する必要ないみたい。

  1. トップ
  2. tech
  3. IdeaVim の挙動に不満があるときのストレス発散方法

ずっと 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 を全部とってくることにした。

しばらくこれでやってみる。

やっぱ数字(ウィンドウ番号)指定でも移動したいので、どっちもいけるようにした。。

  1. トップ
  2. tech
  3. cdd とお別れして、別の cdd を定義した

1/100 出雲大社

4年ぐらい前にもらったやつをくみたてた (色だけほぼ塗った状態で放置してたのを組み立てた)

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