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 を求める

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

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 に出したぞ

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. モバイル回線オンリー敗北

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 の仕様

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

UIには出ていないがAPI経由だと取得できる。認証なしで誰でもとれる (権限いらない)。

curl https://api.github.com/repos/atom/electron/releases | ruby -rjson -e 'JSON.parse(ARGF.read).each{|release| release["assets"].each{|a| puts "% 10s %s %s" % [release["name"], a["download_count"], a["name"]] } }'
  1. トップ
  2. tech
  3. github releases に登録した assets のダウンロード数を一発でリスト表示するワンライナー

ネットで文章書くときに一番重要なのは、ゴミみたいなことを言ってくる人をできるだけ避けること。

ネットでは常に書き手が最初から不利な状態にある。だから中立よりも負よりに考えて書かなければ、不要な謗りをうける。

「読み飛ばすことができる人」

読み飛ばしても良いと本人が思った場合その通り読み飛ばす、ないしは読み飛ばさずに内容を理解しようと努めてくれる。なので、そもそもこういう人向けには配慮の必要がない。

「読み飛ばすことができない人」

読み飛ばすということができず、ただ書いてあること全てを飲みこもうとする。こういう人に対して「ここは読む価値はありませんよ」とか「本題とは直接関係ありませんよ」ということを書く必要がある。そうしないと、こういう人は飲み込めなかった文をそのまま書き手に投げつけてくる。

土曜日の午後ぐらいから体調が悪くなった。日曜夜ぐらいから良くなって、朝には解熱した。

普段でも夢見が悪いが、熱がでるとさらにひどい夢を見る。なんとかしてほしい

もはや Promise がスタンダードに入り、モダンな実行環境ではポリフィルすら必要なく使えるケースが増えましたね。

かくいう自分も JSDeferred は使っておらず完全に Promise 依存に切替えております。外部ライブラリ依存なんてないほうがいい!!

JSDeferred と Promise の違い

機能的にはほぼ変わりがないので機械的に置き換えできますが、Promise は1度だけしか resolve できない点だけ違うので注意が必要。JSDeferred は値を保持しませんが、Promise は resolve した値を保持し、その後の then ではその値が返ってきます。

var resolver;
var promise = new Promise(function (resolve, reject) {
	resolver = resolve;
});

promise.then(function (r) {
	console.log(r); //=> foo
});

resolver('foo');

promise.then(function (r) {
	console.log(r); //=> foo
});

resolver('bar'); // nothing happened (invalid operation)

JSDeferred は遅延された (Deferred) な処理を表現していますが、Promise は未来の値に関する約束を表現している点で違いがでます (Promise は値なので継続(手続)のように扱うことはできない)

基本

JSDeferred() のグローバルな next() を引数なし Promise.resolve() に置き換えます。あとの next() は全部 then() に置き換えます。

next(function () {
    alert(1);
    return next(function () {
        alert(2);
    }).
    next(function () {
        alert(3);
    });
}).
next(function () {
    alert(4);
});

これを

Promise.resolve().then(function () {
    alert(1);
    return Promise.resolve().then(function () {
        alert(2);
    }).
    then(function () {
        alert(3);
    });
}).
then(function () {
    alert(4);
});

こうじゃ

parallel() は?

Promise.all(list) を使う

earlier() は?

Promise.race(list)

wait() は?

new Promise( (resolve) => {
    setTimeout(resolve, 100);
});
  1. トップ
  2. tech
  3. JSDeferred -> Promise 置き換え方法