APIデザインケーススタディ読んだ

ようやく積んでた本を読んだ。読んだというか、途中まで読んでてきつくなったのでパラパラ眺めてどうにか一周終わらせた、ってかんじ。話の内容は多分面白くて書いてある中身もきっと面白いんだけど、対象に今の自分があまり興味がなかったから仕方ない。

APIデザインケーススタディ ――Rubyの実例から学ぶ。問題に即したデザインと普遍の考え方 | Gihyo Digital Publishing … 技術評論社の電子書籍

第1章─I/O, 第2章─ソケット, 第3章─プロセス, 第4章─時刻, 第5章─数,文字列 とあって、要は自分が一番好きなプレゼンの使いやすいライブラリ API デザイン. 日本Rubyカンファレンス2006 コレと近い内容なんだけど、I/O, ソケット、プロセス、時刻まであんまり興味がないので、その、あれ。

URI.encode_www_form出てきてやっと興味あるとこキタ! と思ったらそれが最後でしょんぼり。

なので、あとは思い出したことを並べる。

使いやすいライブラリAPIデザインから、自分は強烈な印象を受けていて、過去の自分の名作 https://github.com/sanemat/slip/blob/b49f8a609741c29054cacf0fe84a2a6d377bba53/slip.rb#L14 に色濃く出ている。

脱線すると、httpライブラリの好みの変遷としては、何使ってたか覚えていない -> 感銘を受けて open-uriに -> httparty で楽して楽しく -> REST厨なのでrest-client -> faraday でインターフェースを統一するんだ -> net-http やっぱり標準ライブラリだね、あとeasy, simpleだとsimpleよりのがいい イマココ

コレも好き。matz を説得する方法. RubyKaigi2008

さがしてまわっちゃったけどここにあった。Publications of Tanaka Akira

MASTERING BITCOIN二周目と商店

mastering bitcoin一周目が途中でさっぱりわからなくなったのでMastering Bitcoin一周目とbitcoin買うまで | 實松アウトプット、社内商店のとなりにbitcoinでしか買えない商店を開いて、実験してみた。

50-100円ぐらい単位で消費したい社内商店だとtransaction feesにまけちゃうなーとか、なかなかたのしい。一般的なモバイルクライアント?だとそこまでtransaction feesけちれない。

二周目はコレがこうなって、とblockchain.info みながら、なるほど、なるほどと読めた。秘密鍵なしにビットコインアドレスの残高は取れるけど、秘密鍵なしにウォレットの残高取れないと、決済とか資産管理とかつらいんじゃないかなーと思うけどどうなんだろう。

bitcoinで少額を送る

From electrum 2.6.4 (desktop)
8000bits送ろうとしたら、fee 40bitsでは送れなくて、50bitsかかった。

From Mycelium (android)
2000bits送ろうとしたら、41.46bitsかかった。

From Copay (android)
2000bits送ろうとしたら36bitsかかった。

一度8000bits受け取って、それを原資に2000bitsおくると、お釣りの計算できるまで5964bitsあるわけではなく、
0bitsになるんだ。なるほど…

Copay androidはよくあることだけどnexus 5xでカメラが逆になる。
phonegap のplugin?のバージョン上げる必要がありそうだ。

bitcoinとmoneyforward

moneyforwardでbitcoinはアグリゲーションできる。できるのだけど、1ビットコインアドレスあたり1金融機関扱いになってしまうので、実用性があんまりない。せめて1walletが1金融機関扱いじゃないとなあ。もっというと、1walletはビットコインという金融機関下の、普通預金とか定期預金とかそのカテゴリーでほしい。

現状こんなかんじになってしまう。

Screenshot from 2016-08-14 16-48-46

bitflyerだと1金融機関にまとめられる気はするが、取引所においておくってのナンセンスなのでなし。

Mastering Bitcoin一周目とbitcoin買うまで

Mastering Bitcoinの日本語版がCC by SAで読めるTranslations of Mastering Bitcoin | Mastering Bitcoinので、読んだ。

一周目、途中でさっぱりわからなくなったが最後までたどり着いた。

翻訳にむむむってところがあれば、ここから直しに行くと良さそう。多分typo直せた気がする。
Mastering Bitcoin | Overview

あとは自分でいじってみたり、alt coinやalt chain作ってみたりしないとわからんな、ということでbitcoinを買った。

1JvMhFUq7BDF1RFxXednUHSVbdvQ4j3RW7 Screenshot from 2016-08-14 00-17-37 送ってみたい人受け取ってみたい人は連絡ください。

ビットコインの保管(ウォレット比較) | Bitcoin日本語情報サイト こういうところ読んだりしつつ、まあたいていこういうのの日本語情報って周回遅れになってること多いので、コレも話半分に見ていく。

ubuntu desktop環境なので、いろいろ困るかと思いきや、Electrum (Pythonベース、GUIも)とCopay(Javascriptベース、nwjs)とで、Electrumはaptで、Copayはファイル伸長するだけで動いた。先にElectrumで環境整えたので、Electrumでやってるが、制限などなければChrome extensionなどあるCopayもよさそう。

スマホ側はandroidなのでMyceliumいれた。iosにはbreadwallet入れたが、breadwalletはまだ試してない。

クライアント側の準備ができたので、早速ビットコインを買う。ビットコインは購入所と交換所がある、などの基礎的なところからふむふむ読んでいく。bitflyer.jp にアカウント作って、銀行口座登録して承認され、住信SBIネット銀行から7000円入金。ビットコインが0.01BTC単位で買えるので、1BTC 61000円ぐらいだったので 0.11BTC購入。取引所に滞空させておく意味はないので、bitflyerの自分のアドレスから、デスクトップの自分のアドレスに送金してbitflyerの出番は終わり。transaction feeはbitflyerが今のところ負担してくれる。日本円端数がbitflyerに残り続けてしまうけど、まあしゃーない。

最小単位は現在のところ1 satoshi。100 satoshis = 1 bits (あるいは1 μBTC)。1000 μBTC = 1 mBTC、1000 mBTC = 1 BTC。
546 satoshis 以下はdustとして送金できない。
1BTC 60000円ぐらいなので、1 mBTC 60円、 1μBTC 0.06円 ぐらい。

よく、手数料安いよ、最高!の文脈でbitcoin出てくることある。ただ、それは相場として情報転送量あたりに値段をつけて、それを処理してもらうので、supereconomyモードでもコレぐらいだよ、ってcopayは表示してる。 165bits/kiB。なので、安い安いとはいっても、少ない額を送金するほど手数料の割合は増す。実際Electrumでは、少なすぎるfeeは弾かれてしまった。800bitsにfee8bitsとかそのくらい。Electrumは圧縮転送サポートしてないからデータでかくなりがち、っての数年前のフォーラムで出てきたけどいまどうかはよくわからない。8000bitsにfee40bitsは送れた。ずっと承認されなかったらどうなるんだろ?とおもうが承認されたので良かった。少額決済はやっぱりまとめないとダメなのかなあ。むー。

ECMAScript 2016 I18n API

ECMAScript® 2016 Internationalization API Specification がECMAScript 2016と同時にリリースされた。
I18n APIってなんだよってことで、MDN読んでた。Intl – JavaScript | MDN
specは読んでもわからんので…

I18n系のライブラリはいくつもあるし、なんでそんなのあるのって言うの読んでた。
The ECMAScript Internationalization API

ES5にもES2015あたりにも、ちょっとだけ仕組みが入ってるのをおしすすめた。
各ライブラリが個別に再実装するはめになってる。でかい変換テーブルがいる。インターフェースを決める。

そのへんか。なるほど。
まあ例によってユーザーがそのままこのAPI使うわけではなく、ライブラリ作者が楽に高速になるよね、系のアレ。fetchとかみたいな。

ブラウザ実装状況見ると、
chrome 24, firefox 29, ie 11, opera 15, safari 未実装。
chrome for android 26。モバイルはあと未実装。
なので、あーというかんじ。
ただ、safari 10に実装されることが発表されているので、mac os x sierra, ios 10で入る。
将来的にはいい感じになりそう。

ここから下は、仕様の話じゃなくて、もうあるchromeとfirefoxの実装の話。注意。

あとはだいたいMDNからのコピペ。コードを動かしてみるのは主にchrome 51。

Intl

Intlという名前空間があって、その下にオブジェクトがあるのと、あとString, Number, Dateにメソッドが生えてる。

コンストラクタ
Intl.Collator
Intl.DateTimeFormat
Intl.NumberFormat
メソッド
String.prototype.localeCompare()
Number.prototype.toLocaleString()
Date.prototype.toLocaleString()
Date.prototype.toLocaleDateString()
Date.prototype.toLocaleTimeString()

String.prototype.localeCompare()

ウムラウト区別できても関係ないよなーと思ってた。
けど、ふとひらがなカタカナ半角カナで試してみたら、なるほどーとなった。
まあブラウザ実装依存なんだろうけど、おおーってならない? そうでもないか。

'a'.localeCompare('c');
-1
'check'.localeCompare('against');
1
'a'.localeCompare('a');
0
'ä'.localeCompare('z', 'de')
-1
'ä'.localeCompare('z', 'sv')
1

# ドイツとスウェーデンでソート順が違う。ここまでMDNコピペ

'あ'.localeCompare('ア')
-1
'あ'.localeCompare('ア', 'ja')
0
# !?
'あらすか'.localeCompare('アラスカ', 'ja')
0
'あらすか'.localeCompare('アらスカ', 'ja')
0
'あらすか'.localeCompare('アラスカ', 'ja')
0

Number.prototype.toLocaleString()

プリセットでいろいろある。通貨は結構うれしい。デフォルトプリセット気に入らなかったら、設定上書きできる。
数字部分だけ色変えたいとかあるのはまあ自分で文字列切り刻んだり文字列追加したりでやれってことかな。

var number = 123456.789;
undefined
number.toLocaleString()
"123,456.789"
number.toLocaleString('de-DE')
"123.456,789"
number.toLocaleString('ar-EG')
"١٢٣٬٤٥٦٫٧٨٩"
number.toLocaleString('en-IN')
"1,23,456.789"
number.toLocaleString('zh-Hans-CN-u-nu-hanidec')
"一二三,四五六.七八九"
number.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' })
"123.456,79 €"
number.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' })
"¥123,457"
number.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY', minimumFractionDigits: 2 })
"¥123,456.79"

Date.prototype.toLocaleString()

chromeやるな。 平成って文字列出てきた。でもMDNと違うぞ。でfirefoxで動かしてみたらMDN通りになった。
やっぱりブラウザ間実装差が。

var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));
undefined
date.toLocaleString('en-US')
"12/20/2012, 12:00:00 PM"
date.toLocaleString('en-GB')
"20/12/2012, 12:00:00"
date.toLocaleString('ja')
"2012/12/20 12:00:00"
date.toLocaleString('ar-EG')
"٢٠‏/١٢‏/٢٠١٢ ١٢:٠٠:٠٠ م"
date.toLocaleString('ko-KR')
"2012. 12. 20. 오후 12:00:00"
date.toLocaleString('ja-JP-u-ca-japanese')
"平成24/12/20 12:00:00"

firefox 47

var date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));
undefined
date.toLocaleString('en-US')
"12/20/2012, 12:00:00 PM"
date.toLocaleString('ja-JP-u-ca-japanese')
"24/12/20 12:00:00"

エレクトロンならワンちゃんあるかな。

rubykaigiのトークに何応募するか考え中

話したいこと

rubyのコマンドラインツールとプラグインシステムと設定の読み込みを作ってみて、設計に失敗したはなしとどうすればよかったのかについて

題材

tachikoma

tachikoma.io

saddler

項目

  • 言語選択
  • 大きな方針
  • アーキテクチャ選択
  • 設定の読み込み
  • shell or script language
  • エラー設計
  • リリースと依存、またその確認
  • テスト容易性
  • 本体の配布、プラグインの配布
  • 実行ファイルを単一
  • アプリケーションと同じGemfileに入れるか
  • 他のツールとの親和性

話した結果自分は何を得たいか

  • 自分の考えたことをダンプして、次作るならもうちょっとマシにしたい
  • 誰か詳しい人の知見を吸いたい
  • 似たようなこと考えてる人の設計の参考になればいい

聴衆に何をしてほしいか 明日から何を始めればいいか

  • ruby, node, golangでツールを作りだそう
    • 言語、ツールの特性、エコシステム的に最適なところを選べる
  • gem, npmなどのエコシステムを活用する
  • 柔軟なやつも作りはじめられるぞ たぶん

rubyでの成功例

  • fluentd
  • omniauth
  • fog
  • rails(?)
  • rubygems(?)

先行資料

1個のライブラリにまとめたくなる呪縛

rubyのgemは1個のgemがやろうとすることが多すぎる。npm moduleは1メソッドが1packageぐらいの粒度。だから自分はnpmが好き。

って普段から言ってるのに、似たようなことやるからこのgemにメソッド生えてたほうがいいかな、とメソッド増やそうとしてしまった。気づいたから良かった。packageわけよう。rubyだから、nodejsだから、というわけでもないと思うんだが何なんだこの呪縛は。

kindle paperwhite 2012 で破損したファイルに対処する方法

TL;DR

ないので、usbケーブルでパソコンと繋いで、documents以下の対象ファイルと伸長後のディレクトリを削除する。

kindle paperwhite 2012

kindle paperwhite 2012、化石のような端末をまだ使っている。
ページ送り遅かったり、前ぶりなく突然再起動したり、キー入力効かなくなったりするが、だましだまし使っている。
で、限界が来たとおもってpaperwhite 2015を買った。その経緯。

端末だけでは破損したデータを綺麗に出来ない

ディスクがフルになる時にダウンロードしていたファイルが、どうにもこうにも直せなくなってしまった。
破損したまま展開されて、そのままでは取り込めない。
download complete でそのままになって、グレーアウトしてて読めない。
5度も6度もkindle端末を再起動してみたが、結果として、ダウンロードしたキャッシュを消す手段もない。ダウンロード途中で止めてキャンセルにしたらファイル消えるかな、と思ったけどそんなこともなかった。どうするんだこれ。
2時間ぐらい格闘した結果、ファクトリーリセットするしかないんかな、とamazonに問い合わせようとした。
あと、この本自体の配布しているファイルが壊れてる可能性もあるのでは??みたいなの。
で、問い合わせようとpcから購入履歴を開いた。kindle paperwhite2012はcontactフォームすら見つけられなかったのだ。そうすると、管理のメニューの中に、ダウンロードしてUSBで転送する、というのがあった。
ん?とおもって、やってみた。
usbケーブルでパソコンとつなぐと、ubuntuだけど、usbストレージとして認識する。そして、documentsというディレクトリの中におけと説明があった。
指示通りに繋いでみると、そのdocumentsというディレクトリの中に、展開前のファイルと、伸長後の本個別のディレクトリが存在する。
ん?これならいろいろできるのでは、とようやく気づく。
なので、不完全なファイルと、そのディレクトリを消して、念のためkindleを再起動してから、展開前のファイルをそこに置き、usbのマウントを外すと、伸長されて、本が読めるようになった。やった!

途中でイライラが限界に来てpaperwhite 2015を買ったが、だましだましまだ行けないこともない、いや無理か。
漫画や雑誌はandroid tabletのxperia z3 compact tabletで読んでいるので、こっちは活字系のものだけである。
あと、tabletは落として割るのが嫌だから持ち歩かない、nexus7は前落として割った。泣いた。
kindle paperwhiteは落としても今のところ壊れないから、雑に扱う端末として重宝している。
あと電車の中とか、飛行機の中とかで便利。アメリカでも移動中に便利だった。

操作が耐えられないほど重かったり、破損したファイルをどうにもできなくなってる間に、新型買うってバカ以外の何物でもない気はするが、書籍はkindleに完全ロックインしているため仕方ないね。

osx to ubuntu (1password to keepass)

メインマシンをubuntuに引っ越している

dropboxはubuntu版があったので、それでさくっと移動できた。
1passwordはkeepass (keepassx, keepass2android)に引っ越した。

1password to keepass

1passwordがつらい。
ubuntu版はないため、wineでwindows版を動かすらしい。
えーー
気の迷いでwineインストールしたらi386なライブラリがごっそり入ったのでヒエ~ッとなってwine消した。
dockerでwine動かすエントリーをいろいろ見てた。
busybox的なので動かんかな、と思ったら
Alpine Linux で Docker イメージを劇的に小さくする – Qiita
alpineというのがあるようだ。しかも、これでwineはこのディストリのapkとやらのリストに入っているので、楽々インストールが出来る。
ググるといくつかコレを使ったwineがdocker pullできるやつがある。
って道に行きかけたけど、1passwordってずっと常駐するやつだし、docker運用もそれはそれで厳しそうだなという気がすごくする。

なので、linuxで動くkeepassに引っ越すことにした。
1password vs lastpass しか聞いたことなかったんだけど、keepassというオープンソースのがあるらしい。
1passwordがubnutuで動けばそれ買うんだけどな。

既存の1passwordのデータをkeepassのフォーマットにコンバート、するのがだいぶつらい。

知らなかったkeepass知識

windows keepassはv1というのが長い間続いていた。
それがmacやlinuxで動かすにはmonoとかxquartzとかいるので、使いづらくUIもダメになるので、keepassxというのがmacで主流になっていた。
windows keepass v2というメジャーバージョンアップが出ていたが、keepassxはずっとv1のフォーマットしか読めなかった。
keepassx が2015/12 にようやくv2フォーマットが読めるようになり, keepassx v0.4 -> v2 になった。

import (or convert)

で、import(convert)はというと、ほぼkeepass v2にしかない。keepassx v2はkeepass v1のフォーマットのインポートしか出来ない。
ググるといろいろ変換ツールはあるんだけど、試してみたらどれもkeepassx v2で読めるもしくはimport出来るフォーマットにならない。
monoとxquartzいれて、keepass 2.23というちょい古バージョンを動かそうとしたけど、起動でコケて起動しない。
KeePass 2.x for Mac OS X – KeePass http://keepass.info//download/p_macosx/index.html
EXC_BAD_ACCESS (SIGABRT)になってしまう。

いろいろ探した結果、どれもダメで mac上にwineでkeepass v2.32を動かして、importすることにした。
ちょっと何言ってるかわからない。
macは捨てていく環境だしもう汚れてもいっか的な。wineとwinetricksインストールがめっちゃ長くて、そういえば古いwindows環境あったなと思いだした。
windows環境引っ張り出してきて、そこにusbメモリで1passwordのtsvファイルを運んでいって、コンバート、というほうがよかったか。
と思ったのでwindows環境でやってみた。これでよさそう。
よさそう、とおもいきや title, username, password, url, note しか移行できなかった。
複数パスワードを持っているものなど手で移行するのかー

ってこれ移行前に1password側でやればいいやんけ。そうしよう。
tsvを作って、usbメモリでwindowsに運ぶ。windowsのkeepass v2.32で、general csv import でインポート、usbメモリで運んでmac側のkeepassxで読めた。
keepass用データベースが出来ればこっちのもので、ubuntu側のkeepassxは普通に読めて終わり。

android

keepass2android offline と dropsyncを組み合わせるといいと読んだので、その組み合わせ。
androidのdropboxはsyncするわけじゃなく、ダウンロードしてくるアプリになっている。
dropsyncは無料で1ディレクトリだけ定期syncできる。15minとか1hourとか間隔で。
なので、syncするディレクトリを作って、そこにkeepass用データベースを投げ込む。
はじめだけ、ファイラーでsyncしているディレクトリに行って、それをkeepass2androidで開くようにする必要がある。
1passwordと同じようにキーボードになってくれるので、そこで入力すればok。
あと、副次的に、android側はいままでreadonlyだったけど、双方向にパスワードも作れるようになった。えらい。

そんなわけでkeepassに移行完了した。
もうちょっとはやくいろいろできていれば、会社用に自腹で+1アカウント買った1password要らなかったなあ。6000円。