詩と創作・思索のひろば (Poetry, Writing and Contemplation)

ドキドキギュンギュンダイアリーです!!

ghq v0.5-pre1 をリリースしました(`ghq import` が変わります)

https://github.com/motemen/ghq/releases/tag/v0.5-pre1

ようやく重い腰をあげ、ghq に、懸案であった ghq import への変更をいれました。

このバージョンでは以下の非互換なものを含む変更が入ります:

  • ghq import はサブコマンドを取らず、標準入力から URL のリストを受け取り、それぞれに ghq get を行うコマンドになります。
    • それに伴い、ghq import starred および ghq import pocket は廃止されます。
    • 副次的な効果として、Mercurial がインストールされていなくても go get で ghq をインストールすることができます。(わらい)
  • リリースにより配布されるコンパイル済バイナリが環境によりうまく動かなかった問題が修正されます。

そもそもこんな変更でいいのか、など特に反応がなければこれをバージョン 0.5 としてドキュメントを整備してリリースしたいと思います。

ghq import starredghq import pocket を使っていたみなさまにおかれましては、以下のような代替策を用意してあります。

GitHub でスターをつけたリポジトリをクローンする

github-list-starred を使います。

% go get github.com/motemen/github-list-starred
% github-list-starred motemen | ghq import

Pocket に追加した GitHub のリポジトリをクローンする

go-pocket を使います。

% ghq get https://github.com/motemen/go-pocket
% ghq look motemen/go-pocket

% go install -ldflags "-X main.consumerKey '<YOUR_POCKET_CONSUMER_KEY>'" ./cmd/pocket
% cp pocket 
% exit

% pocket list --domain=github.com | ghq import

go-pocket は現在鋭意開発中なのでもうちょっといい感じになる予定です(物理的な理由で push できてない)。


そのほかご意見ご感想などお気軽に Issue によろしくお願いいたします。エゴサーチが壊滅してるので……

『Write Great Code: Volume I: Understanding the Machine』を読んだ

Write Great Code: Volume I: Understanding the Machine』を読んだ。副題に注目。予想していた以上にマシンの話だった。

自分たちが書くあらゆるプログラムは、それが現実界で動いている以上、必ず物理的な実体を持つコンピュータの上で動いている。こう動いてほしいと願って書いたコードがどんな風に解釈され、表現され、実行されるかということを、この本ではごくごくマシンの側から描いてくれる。C言語が一種の高級言語という範疇に収められているところから、その立ち位置を想像されたし。

今自分が書き、走らせているプログラムは様々な抽象の上に構築されているのだけれど、それらのあらゆる抽象化を取り去って、数値や文字列といった、プログラムが扱うデータはどんな風にメモリ上に配置されるのか。CPU への命令はどんな風にビット列として表されるのか、それを CPU はどんな風に処理するのか。メモリやディスクへの IO はどんな風に行われ、どんな風に高速化が試みられているのか。一台のマシンの中ではどんな機器が協調して働いているのか。などなど、もちろん知らなくてもプログラムを動かすことはできるが、知っていれば効率のよいコードを書けるだろう知識を広く扱っている。

プログラミングに欠かせないプロセスとして抽象化された概念が、実のところどのように現実的・物理的に実現されるか、垣間見ることができたのはとてもおもしろかった。特に CPU の働き、キャッシュの仕組みを見ると、ものすごく複雑な仕組みの上で自分のプログラムが動いていることを知って、感謝の念が湧いてくる。マシンの歓声を聞くことも、もしかしたらできるのかもしれないという気がしてくる。

この本では、こういったマシンの働きを知ることがグレートなコードを書くことにつながると言っている。実際のところ、現在のかなり抽象度の高い環境でこの知識たちが直接活用できるとは思えないけれど、例えば OS の働きを知るのにこういった土台のことを知っていることは重要だろう。出版年が古く(2004 年)、扱われるトピックも具体的な名前は古いところが時おり見られるが、本質的な部分はまだまだ通用するはず。

最近日本語訳も Kindle化 されたらしいです。洋書はこのボリュームで 2000 円しなくて安い。

Write Great Code: Volume I: Understanding the Machine: 1

Write Great Code: Volume I: Understanding the Machine: 1

Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く

Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く

  • 作者: Randall Hyde,鵜飼文敏,まつもとゆきひろ,後藤正徳,トップスタジオ
  • 出版社/メーカー: 毎日コミュニケーションズ
  • 発売日: 2005/12
  • メディア: 単行本
  • 購入: 2人 クリック: 129回
  • この商品を含むブログ (105件) を見る

この本の次によむならこの本でもよく挙げられているパタヘネか Linux カーネル(再読)かネットワーク低レイヤの本かな(どんな本がいいのか知らない)。

コンピュータの構成と設計 第4版 上 (Computer Organization and Design: The Hardware/Software Interface, Fourth Edition)

コンピュータの構成と設計 第4版 上 (Computer Organization and Design: The Hardware/Software Interface, Fourth Edition)

  • 作者: デイビッド・A・パターソン,ジョン・L・ヘネシー,成田光彰
  • 出版社/メーカー: 日経BP社
  • 発売日: 2011/11/17
  • メディア: 単行本
  • 購入: 7人 クリック: 19回
  • この商品を含むブログ (8件) を見る

Linuxカーネル2.6解読室

Linuxカーネル2.6解読室

ブラウザで動くラムダ計算器を作った(Scala で)

最近 Types and Programming Languages を読んでいて、はじめは我慢していたものの、やはりラムダ式の簡約をコンピュータで確認したい気持ちが高まってきたので、ブラウザで動くものを書いてみた。この本には OCaml による実装の章がときどき挟まれるので、演習の一環ともいえる。

Lambda Calculator

"(λx.λy.x y)(λz.z)" といったラムダ式を入力して送信すると(λ\ で代用可能)、解析された項が出力される。その後1ステップずつ簡約して、項が評価されていく過程を眺められる。評価戦略は TAPL にしたがって call-by-value と call-by-name を提供してるつもりです。毎回どのサブ項が評価されたのかがハイライトされるので、実用的。

f:id:motemen:20140731133327p:plain

同じ項を何度も入力するのが辛いので文字列マクロを導入してあり、"$omega" などと書くと展開した上で解析される。グローバル変数のような概念がないので、文字列置換です。いくつかのよく使う(?)式を定義しておいた

パーマリンクもあるので、ラムダ式を SNS で共有することもできる。

http://motemen.github.io/lambda-calculator/untyped.html?s=call-by-value#$omega

実装は JavaScript……ではなく主に Scala で行い、Scala.js で JS に変換した。ハマると解決できなそうなので動かなかったら諦めようと思っていたんだけど、普通に動いてしまったので感動です。とはいえいくつか工夫しなくてはならなかった点があるのでここに記す。

Scala.js で parser-combinators を使う

id:xuwei さんのアドバイスにしたがって、bintray にアップロードされているものを使うよう変更できました。あざーす!

Scala.js には Scala のパーザコンビネータは含まれていない(JS にコンパイルできない)が、2.11 になって切り出されたもののフォークが存在するので、これを利用する。(参考

今のところ公開された場所に登録はされていないらしいので、依存プロジェクトとして sbt のビルド定義に含んでやる。この時、サブプロジェクトの plugins.sbt は読み込まれないのでルートプロジェクトのプラグインとして指定する必要がある。コアプロジェクトをこれに依存させる。(build.sbt

JS として切り出すプロジェクトを分ける

はじめ Scala で実装してテストも Scala で書いてたんだけど、このプロジェクトをそのまま Scala.js のプロジェクトとすると sbt test の挙動も変わってしまった。これは意図的なもので 、Scala がコンパイルするものと Scala.js がコンパイルするものとの間に互換性がないためらしい(JVM のバイトコードを JS に変換してるわけではないってことかな)。なので JS 側へのインターフェースだけ別プロジェクトに切り出し、コア部分に依存させるということにする。

ちなみに Scala.js でクライアントサイドの JS を全て書くこともできるんだけど、そこまでの意欲はないのでコア部分のインターフェースを書いたら、あとは生の JS でやることにした。

結果、こんな感じの構成になった。

. [Scala, depends modules/scala-parser-combinators]
|-- js [Scala.js, depends root]
|-- modules
    `-- scala-parser-combinators

gulp でビルドしたい

sbt が律速(重い)なのでビルドは sbt に一元化したくなるけれど、とにかく重いしこの前段階でもう飽き飽きしたので、gulp から sbt を呼ぶようにした。まあ必要なのはほぼ sbt ~fastOptJS だけなので spawn するだけ。Scala.js はコンパイル時、生成先のファイルにどんどん追記して完成させるらしいのだけど、これが gulp.watch と相性悪い。内部ではファイルシステムのイベントに対して debounce と呼んでる遅延処理がデフォルト 500ms かかっているんだけど、どちらかというと throttle と呼ぶべき代物で(underscore のネーミングを拝借すると)、困るのは、最後の書きこみが行われたあとにイベントが発生しないことがある。そこでコールバックのほうで 1s ほど _.debounce してやることにした。

そのほか

本体の話全然書いてないけどライブラリ使ったらパーザもだいぶ楽できた。愚直に書いたら無限に再帰しだして、久しぶりに左再帰とかいう言葉を思い出した。項を簡約するときに木のどの位置が簡約されたのか示すあたりのコードがあんまり綺麗ではない。

結局のところ評価して得られたこの値って何なの、というのがどうしても分からないことがあるので、ラムダ式を JS の関数に評価する API も作ってある。チャーチ数の確認とかにご利用ください。

> λ('λs.λz.s (s z)')
function (s) { return (function (z) { return s(s(z)) }) }
> λ('λs.λz.s (s z)')(function (x) { return x+1 })(0)
2

最後に書くようなことではないけど、実装が合ってるのかどうかイマイチ自信がない。業界で標準的なテストケース集とかあったら教えてほしいです。プルリク待ってます

型システム入門 −プログラミング言語と型の理論−

型システム入門 −プログラミング言語と型の理論−

  • 作者: Benjamin C. Pierce,住井英二郎,遠藤侑介,酒井政裕,今井敬吾,黒木裕介,今井宜洋,才川隆文,今井健男
  • 出版社/メーカー: オーム社
  • 発売日: 2013/03/26
  • メディア: 単行本(ソフトカバー)
  • クリック: 68回
  • この商品を含むブログ (9件) を見る

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

  • 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
  • 出版社/メーカー: インプレスジャパン
  • 発売日: 2011/09/27
  • メディア: 単行本(ソフトカバー)
  • 購入: 12人 クリック: 235回
  • この商品を含むブログ (45件) を見る

minimatch(node.js で path match するライブラリ)のチートシートを作った

minimatch っていうのは Gruntgulp.js その他あちこちで(npm もらしい)使われてるグロブマッチライブラリです。最近よく gulp を使ってるんだけど、毎回 gulp.src() の書き方で迷ってしまう。調べた結果 minimatch に行き当たったんだけど各種 glob 実装のドキュメント読んで把握しろ、という感じでよく分からなかったので早見表を作った次第です。

https://github.com/motemen/minimatch-cheat-sheet

確認用にテストを書いていて、そのテストケースからドキュメントを生成してるので間違いはないはずです。説明が間違ってる、この例も乗せた方が見やすいだろ、とかあればプルリクください。

折角なので日本語版を書いておきますね。

基本

  • * はパスセパレータを含まない任意の文字列にマッチ
  • ** はパスセパレータを含む任意の文字列にマッチ
  • ? はパスセパレータでない任意の1文字にマッチ
パターン マッチする マッチしない
xxx.* xxx.yyy, xxx.y.z abcxxx.yyy, xxx.y/z
xxx/*/yyy xxx/abc/yyy xxx/yyy, xxx/abc/def/yyy, xxx/.abc/yyy
xxx/**/yyy xxx/abc/yyy, xxx/yyy, xxx/abc/def/yyy xxx/.abc/yyy
xxx/**yyy xxx/yyy xxx/abc/yyy, xxx/abc/def/yyy, xxx/.abc/yyy
x?y xAy xy, xABy, x/y

ブレース

  • {foo,bar} は "foo" と "bar" に展開
  • {1..3} は "1", "2", "3" に展開
パターン マッチする マッチしない
{foo,bar} foo, bar baz
{x,y/*}/z x/z, y/a/z y/z
foo{1..3} foo1, foo2, foo3 foo, foo0

否定

  • ! で始まるパターンは真偽を逆転させる
パターン マッチする マッチしない
!abc a, xyz abc

コメント

  • # で始まるパターンはコメントとみなされて何にもマッチしない
  • \# とすることでエスケープできる
パターン マッチする マッチしない
#abc abc, #abc
\#abc #abc abc

extglob

  • +(pattern) は pattern の1回以上の繰り返し (/(pattern)+/)
  • *(pattern) は pattern の1回以上の繰り返し (/(pattern)*/)
  • ?(pattern) は pattern の0回または1回の出現 (/(pattern)?/)
  • @(pattern) は pattern そのもの (/(pattern)/)
  • !(pattern) は pattern にマッチしないというパターン (/(?!pattern)/)
  • カッコ内のパターンは | で連結可能 (/(foo|bar)/)
パターン マッチする マッチしない
a+(xy) axy, axyxy a
a*(xy) a, axy, axyxy
a@(xy) axy a, axyxy
a!(xy) ax axy, axyz
a+(x|y*z) axx, ayzxyzxx, axyAAAz axy, a

デザイン4+1の基本ルール: 『The Non-Designers Design Book』を読んだ

なんかで Kindle の洋書が安かったときに何となく買っていた『The Non-Designers Design Book』を読み終えた。素人のための……というよりは新人デザイナーのための本のようなのだけど、エンジニアの自分が読んでも面白かったので書いとく。日本語版もある。

4つのルール

曰わく、デザインには基本的な4つのルールがある。それぞれの頭文字を取ると "CRAP" ……となるのだけれど、これは上品な単語ではないのでそう示唆されるだけではっきりとは書かれない。ともかく、各々に対応する原則は以下のとおり。

  • Contrast(コントラスト)
  • Repetition(反復)
  • Alignment(整列)
  • Proximity(近接)

これらにどういう意味があり、どう活用すべきであるか。本で紹介される順に書いていく。

Proximity

意味的に関連する要素どうしを近くに置いてグルーピングする。逆に直接関係のない要素どうしは離して配置する。そうすることで、ページ内の情報を組織化できる。

Alignment

ページ上の要素どうしを視覚的に関連づける。たとえ二つの要素が離れていても、同じように整列されていればそれらは関連しているように感じられる。安易に中央揃えしない! 右でも左でも、一方に要素を揃えることでより強く関連づけられる。組織化と統一が目的。

Repetition

色やフォントなどの視覚的な要素を繰り返し、一貫性を持たせる。これは1ページ内のことに限らなくて、例えば数ページに渡る文書でも、見出しや罫線といった部分の体裁を同じに整える。ここでは統一と視覚的に関心を持たせることが目的。

Contrast

2つの要素の違いを際立たせる。要素どうしがなんか違うという状況では単に間違えてるだけに見えてしまう。ここで違いというのは色とかフォントとか文字サイズだけじゃなくて、横長の罫線に対して縦長のカラムを置くとか、そういうことでもいいらしい。目的はページに関心を持たせること。

至上のルール

以上4つの法則に加えて、何度も何度も繰り返されるいちばん基本的なルールは、"Don't be a wimp"。怖気付くな! コントラストを作るなら中途半端じゃなく思いっきりやる、空白を怖がらない。等々。ホントに何十回と言われるのでよっぽど大事なことなんだろう。

タイプについて

それからタイプ(書体?)についての話も面白かった。CSS だけからなるこれまでの経験で、フォントの違いには serif、sans-serif と等幅とあと装飾的なの、くらいしか区別できていなかったけれど、本当はもっといろいろある。特にこれまで serif だと認識していた中にも Oldstyle, Modern, Slab serif なんてカテゴリがあるんだそうだ。この章を読み始めたときはそんなの気にするのアルファベットを日常的に使ってる人間だけで日本語ユーザの自分には関係ないだろう、と斜に構えていたのだけど、読んでみて、実際に試してみると、確かに……と思えてしまったので面白かった。これらの違いを理解して、うまくコントラストを作ってやることが大事。

まとめ

4つのルールなどといっても、聞いてみればそりゃそうだろうという気もするかもしれない(自分はちょっとした)。けど本当に大事なのは、こういったルールに名前をつけて、自覚的になることだ。自分がデザインしたページに違和感があるときに、その原因は何なのか名前を上げることができるようになることが重要である。そうすれば、何となく今ひとつに感じてしまうデザインを確実によりよくできるはずだ。……とまあ実際に実現可能かどうかは別として、これまでは結局センスの産物なんだろうと思っていたデザインを、新たな視点で見られるようになったと思う。

Kindle 版の場合はカラーで(タブレットやスマートフォンで)読むのがオススメ。

The Non-Designer's Design Book (3rd Edition) (Non Designer's Design Book)

The Non-Designer's Design Book (3rd Edition) (Non Designer's Design Book)

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

  • 作者: Robin Williams,吉川典秀
  • 出版社/メーカー: 毎日コミュニケーションズ
  • 発売日: 2008/11/19
  • メディア: 単行本(ソフトカバー)
  • 購入: 58人 クリック: 1,019回
  • この商品を含むブログ (105件) を見る

4つの原則の日本語訳はこのスライドを参考にした。とても分かりやすいし、本の内容がかなり補強されると思う。

スーパーハッカーの夢を諦め、普通自動車免許を取得しました

photo by Thomas Hawk

表題の通りです。実のところ、もう一年も前のことになります。

優秀なエンジニアの多くが自動車免許を所持していないことは有名な事実です[要出典]。私も彼らに憧れ、免許を持たずに生活していましたが、歳を取るにつれ「自分はスーパーハッカーにはなれない」と次第に実感してきたこと、新たな自分に変身したい、という思いと、あまりに暇でヤケになった気持ちから思い立って自動車学校に入学したのが一昨年の年末です。会社に通いながらの教習でしたが、週末と早退・遅刻を活用することで、半年かけて免許を獲得しました。当時のチームメイトに感謝。

すべてを終え、保有者サイドに堕ちてしまった私からそうでないあなた方に伝えられることは……「初心者マークの車に近づくな」。いち歩行者しかなかった頃は車であればどれも同じやろと考えていましたが、運転する側になると全然違う。初心者マークの車は生まれたての子馬のような存在です。それでいて研ぎ澄まされたナイフのようでもあります。近づかず、優しく遠巻きに見守ってあげてください。それがお互いのためです。

あと教習日記をつけていたのをブログで公開します。まだひと記事しかありませんが、随時更新していきますのでご購読くださいね。(実際の日付を使ってるので古い記事になります)

http://karimen.hatenablog.com/

最後に、自動車を運転するとはどういうことか、と尋ねられましたら、私はこう答えようと思います。「それは魚になって泳ぐ夢のようだ」。この意味が分かるようになる日があなたにもきっと来るはずです。

一発合格!普通免許超速クリア問題集

一発合格!普通免許超速クリア問題集

AdSense のレポートを CLI で確認できるツールを書いた

Go

motemen/adsense-report-cli · GitHub

例によって go get github.com/motemen/adsense-report-cli でインストールできます。

使用例

デフォルトで、直近 7 日間の日毎の収入を表示します。

% adsense-report-cli
DATE            EARNINGS (JPY)
2014-07-01      1
2014-07-02      0
2014-07-03      2
2014-07-04      0
2014-07-05      0
2014-07-06      1
2014-07-07      0

(数字はサンプルです)

dimension, metric などのパラメータを指定することで、自由に知りたい情報を取得することができる。dimension と metric については Metrics and Dimensions - AdSense Management API — Google Developers、日付の指定方法については Using Relative Date Keywords - AdSense Management API — Google Developers を見るとすぐに分かると思います。

% adsense-report-cli -dimension=MONTH -metric=PAGE_VIEWS -from=startOfMonth-3m -to=today
MONTH   PAGE_VIEWS
2014-04 500
2014-05 500
2014-06 1000
2014-07 300

(数字はサンプルです)

前準備

Google の API を使うので、OAuth 認証のために https://console.developers.google.com からプロジェクトを登録する。またその際、

  • "APIS & Auth" > "APIs" より "Adsense Management API" を有効にする
  • "APIS & Auth" > "Credentials" > "OAuth" > "Create new Client ID" より "Web Application" を登録し、Redirect URI として "http://127.0.0.1" を登録する
    • f:id:motemen:20140707134259p:plain

  • 登録したアプリについて "Download JSON" から client_secret_XXXXX.json をダウンロードし、~/.adsense-report-cli/client_secret.json に置く

必要があります。あとは初回起動で OAuth 認証するだけ。大変だけどがんばって!

応用例: tmux のステータスバーに今日の収入を表示する

誰だって自分の収入は気になるもの。ステータスバーに収入を表示して、自然と目に入るようにしてみては?

以下のスクリプトと設定で表示してみた例です。う〜ん便利

f:id:motemen:20140707135226p:plain

(数字はサンプルです)

# ~/.tmux.conf
set-window-option -g status-right "#[fg=green]#(adsense-todays-earnings)#[default] | %Y-%m-%d(%a) %H:%M:%S"

Show today's AdSense earnings using https://github ...

Known issues

  • 複数の dimension, metric に対応していない
  • 複数アカウントに対応していない
    • あとから気づいたのでやってない。ちょっと書いたらすぐ対応できそう。

motemen/adsense-report-cli · GitHub