bouzuya.hatenablog.com

ぼうずやのにっき

『プログラミング言語の基礎概念』を読み終えた

プログラミングの基礎概念』を読み終えた。

理解度はおそらく 10% ほどだ。雰囲気では分かるけど、練習問題を解いていないし、証明なども読み流しているだけなので……。推論規則・導出・帰納法。導出システムで証明していく。ペアノ自然数の扱いで練習し、 OCaml の機能の意味を順に見ていく。最後は型システム。一部で道具を揃えて、二部・三部はそれを使いながら OCaml (ML) を見ていく感じ。積み重ねという感じがする。ざっくり読んだのでざっくりとした理解しか得られなかった。気まぐれに読み返すつもりだ。

次は『アンダースタンディング コンピュテーション』を読もうと思っている。また計画を立てよう。


王子動物園の夜桜の通り抜けに行ってきた。雨で人は少なかった。桜も満開とは言えない感じ。それでもまあそこそこに咲いているし、こんなものかな。

空メールでのメールアドレス登録

今日は「空メール送信によるメールアドレスの入力」を考えていた。

メールアドレスを要するときは直接入力させるよりも空メールを送ってもらうほうが良いのではないか。たとえば、ユーザー登録のときに mailto: を使って空メールを送ってもらい、その FROM を入力とするようなイメージだ。

長所としては次のようなものがある。

  • 入力の手間を減らせる
  • 入力の間違いがない

短所としては次のようなものがある。

  • サービス側に受信メールを処理する仕組み (別の口) が要る
  • 希望するメールアドレスを登録できない可能性がある (FROM に登録したいメールアドレス以外が使われている)
  • ユーザーが手続きを理解しづらくなる可能性がある

なんとなく古くさい感じがする手続きなのだけど、入力の手間の削減と間違いを防止できるのはなかなか良い気がする。

追記: ユーザー登録に関して言うとパスワードを安全にやりとりするのが難しそうだ。

事前に https でメールアドレス・パスワードを送信する場合は、メールアドレスの存在確認のためだけのメールが漏れてもパスワードが漏れないためログインされない。

しかし、上記のフローだとパスワードを安全な手段でやりとりできない。仮パスワードなどを合わせて送れば漏れてしまい、ログインされてしまう。まあ、一般的なパスワードリマインダーも似たような問題を抱えているので、気にしないというのも手だけど……。

スーパーマリオ ランの感想とか

スーパーマリオ ランほか、雑多なことを書く。

昨日 (2017-04-03) は、追加の収納ケースを買いに行ったり、 SPA: Single Page Application について雑談しているうちに時間がつぶれてしまった。それもあってろくに何もできなかった。


Android の環境は整えたけど、内発的な動機ではないので、いまひとつ燃えない感じ。今日も https://github.com/mixi-inc/AndroidTraining を眺めたり、各種ドキュメントを眺めるばかりで、もやもやしている。どこから手をつけたら……という状態。


『プログラミングの基礎概念』は順調に読み進めていて、明日の分まで既に読んで、読み返している感じ。練習問題はやっていないんだけど。「完全に理解した(分かってない」みたいな状態。


スーパーマリオ ランAndroid で出たので、買って遊んでいる。ゲームに詳しくはないけど、適当に感想を書く。

まず値段の話。 iOS に出た当時 1,200 円という値段への文句をよく見たが、ぼくは実際に遊んでみたところ高いと感じなかった。無料で遊べるゲームが多すぎるからなのかな。買い切りだし、この程度のボリュームで 1,200 円は上々だと思う。そもそもインターネットのサービスやアプリにお金を払わない人が多すぎる……。任天堂的にはいわゆるソシャゲーみたいに運営してお金を稼ぐみたいな形じゃなくて、新しいものを出していく形にしたいのかな、そちらのほうが健全だと考えているのかな。分からないけど。

スマホという、操作に制約のある環境に合わせて、よく考えてつくってあるなあという印象。基本的にはタップのみ。タイミングや押す長さで、あとはマリオが勝手に走る。ただ進むだけではなくて、壁を蹴って逆方向に跳んだり、コースによっては方向を変えつつ上に登っていったりもする。何にせよ、操作はタップだけ。あと無駄にカッコよく、気持ちよく動く。馬跳びで敵を乗り越えたり、そこからタイミング良くタップすれば敵を潰しながら高く跳んだり……。アサシンクリードの移動しているだけなのにカッコいい、みたいのと似てるかも。

6 ワールド * 4 コース + スペシャル (?) なのかな。コース数は少なく見えるけど、各コースに難易度が三段階ある。低い難易度をクリアすることで次の難易度が選択できるようになる。この難易度はカラーコインで表現されている。5 枚のカラーコインを集めるだけなのだけど、配置が絶妙で場所を把握しても一周でそれらのすべてを集めないといけないので、意外と難しい。

カラーコインの配置だけじゃなくて仕掛けが変化するものもある。「無料だとたった 3 コース」という意見も見たけど、最初の 3 コースのすべてのカラーコインをコンプリートするだけでもなかなか面白かった。

良くないところ。キノピオチケットが割と潤沢にあって、ずっとカンストしている。もうすこし足りない感じでいいんじゃないかと思うんだけど……。キッズが他人に負けまくってなくなる想定とかなのかな……。うーん。建物、わりとどうでもいい感じ。なんとなく一個ずつ買ってみたりしているけど、そんなに楽しめてない。あとはキノピオを集めるためだけに同じコースをループさせられるのも、なんだかなあって感じ。対戦相手は変わるけど、ほとんど接戦にはならないし……。

ちなみに、まだクリアしてない。ゴールデンクリボーのイベントに合わせて、同じコースを繰り返している。うーん。

bouzuya/fake-history-fns をつくった

bouzuya/fake-history-fns をつくった。

fake-history-fns は bouzuya/fake-history (2017-04-01) の class を使わない版。 fake-historyHistory interface を備えた fake object である 。特徴というか利点は次のとおり。

  • 関数単位での import ができる
  • JSON.stringify / JSON.parse で serialize / deserialize できる
  • (個人的に) OOP は難しいので FP (?)

README にある例。

import * as assert from 'assert';
import {
  back,
  create,
  current,
  currentState,
  length,
  next,
  nextState,
  previous,
  previousState,
  pushState,
  state
} from 'fake-history-fns';

const p0 = create();
const p1 = pushState(p0, 1, '1', '/1');
const p2 = pushState(p1, 2, '2', '/2');
const p3 = pushState(p2, 3, '3', '/3');
const b1 = back(p0);

assert(length(b1) === 3);
assert(state(b1) === 2);

assert(current(b1) === '/2');
assert(currentState(b1) === 2);
assert(next(b1) === '/3');
assert(nextState(b1) === 3);
assert(previous(b1) === '/1');
assert(previousState(b1) === 1);

bouzuya/mr-jums には fake-history でなく fake-history-fns を採用した。実際には関数単位での import なんてしないし、 History を永続化する意味はまったくないので、趣味の問題だ。

2017-W13 ふりかえり

2017-W13 をふりかえる。

2017-03 の目標

  • ☐: 『型システム入門』を読む
  • ☑: 斑鳩を続ける
  • ☑: bath 2.0.0 をつくる
  • ☐: PureScript でなにかつくる

2017-04 の目標

2017-W13 の目標

  • 斑鳩をクリアしたことを書く
  • ☑ 3 月のふりかえりを書く
  • ☑ rev-hash のことを書く
  • ☑ mr-jums に bath 2.x を適用する

すべての今週の目標を達成できた。ひさしぶりだ。……とは言え、「〜を書く」以外の項目である bath の mr-jums 適用は 2017-03-05 から引き伸ばしてきたものなので、いまさらではある。

今週の記事

つくったもの

2017-03-27/2017-04-02

今週の目標にもあった mr-jums の bath 適用のほか、新たにつくった fake-history-fns も適用している。 fake-history-fns のほうは既存の形が悪く、あまりうまく適用できていないのだけど……。

何にせよ、今年の目標にも含めた「自分の使うものはできるだけ自分でつくる」にもあっているし、「なるべくはやく見えるもの・かたちあるものにする」のようにかたちのあるものをつくれている。良い傾向だ。

来週は諸事情により Android の開発について調べていくつもりだ。

その他

2017-03 ふりかえりにも書いた (2017-03-31) が、斑鳩をクリア (2017-03-27) し、今年の目標をひとつ達成した。

プログラミング言語の基礎概念』を読んでいる。いまの調子で進めば来週には読み終わるだろう。

姪っ子および妻へのプレゼントとして、椅子と収納ケースを買った。忘れそうなので書いておく。

2017-W14 の目標

bouzuya/fake-history をつくった

bouzuya/fake-history をつくった。

fake-historyHistory interface を備えた fake object だ。

次は README から引用した例。

import * as assert from 'assert';
import { FakeHistory } from 'fake-history';

const history = new FakeHistory();
history.pushState(1, '1', '/1');
history.pushState(2, '2', '/2');
history.pushState(3, '3', '/3');
history.back();

assert(history.length === 3);
assert(history.state === 2);

// extended
assert(history.current === '/2');
assert(history.currentState === 2);
assert(history.next === '/3');
assert(history.nextState === 3);
assert(history.previous === '/1');
assert(history.previousState === 1);

欲しくなった理由は react-router などを使わず自前で実装していて、 Browser の History と似た挙動をする fake object が必要だったから。具体的には currentprevious あるいは next などが欲しかった。それらで history.back() が可能かを判断したかった (もちろん、厳密には確認できないのだけど) 。

気が向いたら使ってみてほしい。

……で、ぼくの場合、これで要件としては問題ないはずなんだけど……。ぼくは History との互換性のために classproperty を使っているのが嫌なので、 fake-history-fns をつくってそちらを使おうかと思っている。

あ、ちなみに 2017-04-01 だからといって、 fake-history は嘘じゃない。

2017-03 ふりかえり

2017-03 をふりかえる。

期間別の目標

2017 の目標

  • 自分の使うものはできるだけ自分でつくる。
  • なるべくはやく見えるもの・かたちあるものにする。
  • 納得のいくものをつくる。
  • こつこつとやる。
  • 斑鳩ノーマルをノーコンティニュークリアする。
  • 型システム入門を読む。

2017-03 の目標

  • ☐ 『型システム入門』を読む
  • 斑鳩を続ける
  • ☑ bath 2.0.0 をつくる
  • ☐ PureScript でなにかつくる

斑鳩はノーマルをノーコンティニュークリアし、 2017 年の目標を達成した。

週別のふりかえり

つくったもの

2017-03-01/2017-03-31

blog などは除外している。

DefinitelyTyped は htmlescape ではじめて PR した。 dts-gen は Error の継承の件で PR した。

mr-jums の修正が主で、 bath / spa-town / fake-history あたりが新規のはず。 bath は 2.0 になった。 fake-history についてはまだ書いていない。明日には書くつもりだ。

その他

2017-01 は病気、 2017-02 は落ち込んで、 2017-03 もあっという間に過ぎ去ってしまった。 2017-03 は斑鳩の目標を達成できた点で大きい。ひとつ区切りをつけて、次へと進めていきたい。年間目標にあるとおり「こつこつ」やろう。

読書。『型システム入門』を再開すると書きながら再開できていない。ざっと目を通すくらいはしたのだけど、ほとんど分かっていない。かわりに『プログラミング言語の基礎概念』を読んでいる (2017-03-30)。こちらは 4 月には読み終わるだろう。読めるようになるために何かを読むかたちになっている。

ゲーム。先に書いたとおり斑鳩で目標を達成した (2017-03-27) 。ほかには『スーパーマリオ ラン』が Android に来たので買った。まだ書いていない。アナログゲームは増えていない。ダンジョンオブマンダムがすこし欲しいが、ボードゲーム同好会が 2017-03 の #9 でしばらくおやすみらしいので、これを気にすこし控えめにしよう (2017-03-20) 。

その他。食洗機を買った (2017-03-18) 。半月ほど使っているが、快適だ。

2017-02 の bouzuya.net に続いて、 blog.bouzuya.net が https になった (2017-03-23) 。 mr-jums も気まぐれに開発を進めている。 https 対応の関係で使っている CloudFront (2017-03-22 etc.) や、それに関連して Heroku での Docker 利用 (2017-03-16) など、すこし環境を見直している。 Lambda の活用ももっとしたほうがいいんだろうな……。

shinosaka.hs は 2017-03 の #4 でしばらくおやすみらしい (2017-03-25) 。 Haskell と PureScript はどちらも止まってしまっている。触れていきたいけど、 Android も触らないといけないことになっていて……。 Rust ももうすこしやりたいんだった……うーん (2017-03-17) 。時間が足りない。

2017-04 の目標