未踏OB開発合宿1日目日記
アマゾンは本をきちんと整理して棚に直していない。 場所はコンピュータが知っている。 選ぶべきものを入力すると最短経路を答えてくれる。
棚を整理していないので、増やすときには適当に棚を追加して適当に本を入れればよい。 整理をしないからスケールする。
BtoBtoCのtoは右結合性。(BtoB)toCではなBto(BtoC)。
ブックマークレットでメニューをインサートして選ばせるくらいならば、 ライトユーザーにも使わせられる?
複数人で開発する際は、 「メソッドをアルファベット順に並べる」というルールにすれば、 並べる順を迷わなくなる。
SQLiteは本体のコードよりもテストのコードの方が多い。
キン肉マンは最初の方巨大化したりビームを打ったりする。
ドカベンは最初は柔道をしていた。
YouTubeやニコニコ動画のブームのおかげで、CDNが儲かった。アカマイとか。 ゴールドラッシュの時に儲かったのは金を掘りに行った人ではなくツルハシを売ったブラナン。
メールアドレスにtmpと入っている。これはむごい。
「ここ禁煙って書いてあるけど、半田付けはOKかな?」
アドエスではDirectXで書いたアプリがネイティブで動く。
アドエス用のGPSがあるがいいアプリがない。
トラックが通ると振動する会場。
電通大を通った人が6人。
カシオペアはアルマジロとつながる。
さしえショーって赤塚さんだったのか。 どんな文章も“紙芝居”にする「さしえショー」 - ITmedia News
フリープログラマーの赤塚大典さんが制作した。文章を句読点や改行部で分割し、形態素解析してキーワードとなる単語を抽出。「Yahoo!検索」の画像検索のAPIを活用し、その言葉に関連した画像を検索して表示する。
Pythonコードリーディングが大ブーム。
SNYDER's ハラペーニョ
Ustream.tv - mitou kaihatu gasshuku
ごはん。
= ご飯後一眠り→21時は起床
アクセルをかけるためにちょっとヘッドホンを使いますよ。
= ノウハウ入出
出:
コマンドプロンプトをUTF8にするには: プロパティでフォントをラスタフォントからMSゴシックに変えてからchcp 65001
入:
コマンドプロンプトでF7で履歴メニューがでる画面バッファの高さを大きくしておけば、 流れ去ったログが消え去りにくくなる。
= ぴかちふ謹製のモバイルモニタがすごくいい。 使わないときにはインテリアにもなる。 でも売ると壊れたときのサポートの労力が出るので売りたくないって。
= 今作っているパーサジェネレータは テストをたくさん書く方針でやっている。 例外が投げられることをdoctestでどうやって表現するにはどうするんだろう。
ドキュメントにちゃんと書いてあった。 必ずFailっていう例外を投げるmatcherを書いた。
class MatcherAlwaysFail(Matcher):
"""
>>> MatcherAlwaysFail().match("foo")
Traceback (most recent call last):
...
Fail
"""
= 初めてPythonのstaticmethodを使った。 古いユーザなのでこういう本質的でない機能ってあんまり知らない。
= 高速再生中のロイツマ
Jatsu tsappari dikkali dallan ヤッツッ ツァッパリ ディッカリ ダッラン Tittali tillan titstan dullaa ティッタリ ティッラン ティチタン ドゥラー Dipidapi dalla ruppati rupiran ディピダピ ダッラー ルッパティ ルピラン Kurikan kukka ja kirikan kuu.. クリカン クッカヤ キリカンクー Ratsatsaa ja ribirabi dil\ ラッツァッツァー ヤ リビダビ ディル la Beritstan dillan dillan doo.. ラ ラベリツタン ディラン ディラン ドゥー A ba-ribbattaa baribarii\ アバリッバッター バリッバリー ba Dibi dibidibi disten dillan doo ←歌詞間違い? バ ディビディビディスタン ディッランドー Ja barilla stillan deijaboo ヤバリッ ラッ スティラン デイヤーボー A daba daba daba daba dybjabuu, ア ダバダバダバダバ デイビャブー Baristal dillan suillan duubadag バリスタゥ ディラン スイラン ドゥバダグ Dagadaga duu duu deijadoo ダガダガ ドゥードウー デイヤドー
= 行きの電車の中であったメソッドをどこに追加していくかという話、 確かに複数人で開発している場合に、ソートしてからコミットするというのは 「複数人で開発している場合」にはいい戦略かとは思う。
一人でプロトタイプをがりがり作っている場合は、 小さいユーティリティ的なものを上に、 大きい「呼び出しもと」が下に来るように書いているという話。 僕はこれだったのだけども、この方法の問題点は、 脳の揮発メモリがこのプロジェクトの情報でいっぱいの時はうまく行くけども、 100行を超えて書いてしまうと後で読んだときに複雑に絡み合っていて解きほぐすのに苦労する点だ。
今回テストをきちんと書きながら進んでわかったのだけど、 テストを書くと挙動が明示されるから、Aを書いた後でBを追加したときに、 Aの挙動を変える必要が出たらテストも修正しないと行けなくなるんだ。 というわけでなるべくBを変更してもAを変更しないでいい設計にしようというバイアスがかかる。 これはルースカップリングだ。 Coupling And Cohesion
例えば、「A / B」という表記で 解析表現文法 - Wikipedia のOrderedChoiseを表現できるようにしようと思うと、 AやBの基底クラスの__div__に書きたくなるわけだけど、 そういう機能追加を上に上がって書き足すのを避ける。 もちろんこうやって設計してできあがった上でパフォーマンス上の問題が出れば、 「PEGのOrderedChoiseは切り離せなくしても問題ない」 と言ってべったり貼り付けて高速化するかも知れないけど、 あくまで最初はルースカップリングにする。
というわけで基底クラスに注入してみた。
class OrederedChoice(Matcher):
"""
>>> m1 = ExactMatcher("foo")
>>> m2 = ExactMatcher("bar")
>>> (m1 / m2).match("barbaz").group
'bar'
"""
def __init__(self, m1, m2):
self.m1 = m1
self.m2 = m2
def match(self, s):
try:
r = self.m1.match(s)
return r
except Fail:
r = self.m2.match(s)
return r
@staticmethod
def build(m1, m2):
return OrederedChoice(m1, m2)
Matcher.__div__ = OrederedChoice.build
= __add__なんかの情報ってドキュメントのどこに書いてあるんだろう。
あった。 7 数値型をエミュレーションする
深いところにおいてあるなぁ。
= rimoの初音ミクチャンネルをBGMにするといいらしい(何が)
= Lingrより。
# 2:33am 26x26にしお # 今日はPEG完成させて寝たい # 明日Pythonのパーサを作って使い物になることを検証する # 自分自身をパースできたら万歳 # 2:53am 26x26にしお # あうー # NotPredicateの実装ができて、テストを書いたら今日は終わりのつもりなのだけど # いいテストが思いつかない
= 前回作ったときはいきなり正規表現を使うMatcherを使ったのでgdgd。 短く書くための短い名前なんかもがんがん作ったのでdmdm。 今回はあえて短い名前や正規表現を禁止してPEGパーサを作った。
明日は実際にこれを使ってPythonのパーサを書いてみて、 労力とかパフォーマンスとかを調べる。 労力が高いのは目に見えている( ExactMatcher("a")はないよねー )。 でも言語内DSLで変なトリックを使うのはダメだと思う。
class NotPredicate(Matcher):
"""
>>> a = ExactMatcher("a")
>>> b = ExactMatcher("b")
>>> c = ExactMatcher("c")
>>> m1 = a + Optional(Ref("m1")) + b
>>> Ref.m1 = m1
>>> m1.match("aabbbb")
'aabb'/4
>>> m2 = b + Optional(Ref("m2")) + c
>>> Ref.m2 = m2
>>> m3 = AndPredicate(m1 + NotPredicate(b))
>>> m3.match("aabbcc")
''/0
>>> m = AndPredicate(m1 + NotPredicate(b)) +\
OneOrMore(a) + m2 + NotPredicate(c)
>>> m.match("aabbcc")
'aabbcc'/6
>>> m.match("aaabbcc")
Traceback (most recent call last):
...
Fail
>>> m.match("aabbbcc")
Traceback (most recent call last):
...
Fail
>>> m.match("aabbccc")
'aabbcc'/6
"""
def __init__(self, m):
self.m = m
def match(self, s):
try:
r = self.m.match(s)
raise Fail
except Fail:
return Result(
group = "",
end = 0,
rest = s
)
= 眠気ないなー。 378行。
350行に縮めた。文字列を消費しないマッチ結果オブジェクトを Resultクラスのstaticmethodで生成するようにした。 UnaryOperatorクラスをmixinするようにした。
class AndPredicate(Matcher, UnaryOperator):
"""
(テスト13行)
"""
def match(self, s):
r = self.m.match(s)
return Result.empty(s)
テストの方が長い、わーい。
= フタエノキッワッミッアッアッー
フ タ エ ノ キ ワ ミエ ノ キ ワ ミ アッアッアー
= クリカンクッカヤキリカンクー
寝る前の間食は控えるべきである! だがしかし! 「駄菓子菓子!」
□ 正規表現Matcher □ PEGパーサ
= Ctrl+Alt+TABで開発合宿の隣の人の画面がいつでも見られるように。
= 29時。ぴかちふが玄関で酔いつぶれている。 未踏ユースOBから除名せざるを得ない。