2013/12/12

NeoBundle の NeoBundleLazy したプラグインをファイル名指定で autoload する

前回、 Processing なファイルを Vim で扱いやすいようにしたのですが、プラグイン導入には NeoBundle を使いました。
NeoBundle には Lazy Load 機能があって、プラグイン必要な時にロードすることができます。
その設定には特定の command が実行された時に load したり、 filetype によって load したりすることができます。
しかし、 Processing な filetype が Vim に無く、そもそも Processing 用の filetype を追加するためのプラグインが vim-processing でした。

なので、これを Lazy 化した後に必要な時のみ load する案として、
  • NeoBundle では NeoBundleLazy するだけ
  • autocmd で BufRead や BufNewfile の時のみ NeoBundleSource する
という方式で前回は Lazy Load していました。

そこで「filetype が無いファイルのために、拡張子ごとに autoload する設定とかが NeoBundle に無いかなー」とかつぶやいて寝て起きると実装されていました。暗黒美夢王さんすごい。

autoload に  filename_patterns というものが指定できるようになりました。
ファイル名の正規表現 もしくは 正規表現のリストを指定することにより、このファイルを編集した時に autoload してくれるようになります。

ということで、前回の *.pde を開いた時に vim-processing を load する、という設定が
NeoBundleLazy 'sophacles/vim-processing'
augroup Processing
    autocmd!
    autocmd BufNewFile *.pde NeoBundleSource vim-processing
    autocmd BufRead    *.pde NeoBundleSource vim-processing
augroup END
から
NeoBundleLazy 'sophacles/vim-processing' , {'autoload' : {'filename_patterns' : '.*\.pde'}}
に。
行も減ったし augroup も減ったので良い感じ。

あと、正規表現に対応しているのでオレオレファイルを開いた時に autoload とか、独自拡張子とかにも対応できそうです。

暗黒美夢王こと@ShougoMatsuさん、ありがとうございますー。

2013/12/11

Processing を Vim から使う

Processing を使うことになったのですが、Vim に Processing な filetype は無い様子。

vim-processing という plugin があるらしく、それで filetype 検出や syntax highlighting はやってくれるみたいです。
加えて設定をすると、 quickrun から実行できるようなので設定など。


ということで以下の設定 .vimrc に追加してプラグインを入れる。
NeoBundleLazy 'sophacles/vim-processing'
augroup Processing
    autocmd!
    autocmd BufNewFile *.pde NeoBundleSource vim-processing
    autocmd BufRead    *.pde NeoBundleSource vim-processing
augroup END
これで *.pde を開くときちんと syntax highlighting されます。
あと、quickrun の設定で
let g:quickrun_config.processing = {
\     'command': 'processing-java',
\     'exec': '%c --sketch=%s:p:h/ --output=/tmp/processing --run --force' }
も追加。

これで quickrun から processing-java というコマンドで processing を実行できます。

processing-java のインストールは参考サイトにあるように、
Processing の Menu -> Tools -> Install "Processing-java"
で可能です。
インストールすると Command Line から processing を呼べるようになります。

ちなみに使い方は
--sketch で sketch のディレクトリ指定
--output で出力先を指定
するようです。

sketch は hoge/hoge.pde みたいなディレクトリ構成になってないといけないようで、 --sketch ではディレクトリごと指定してやる必要があるみたいです。
なので %s:p:h を使ってディレクトリを指定。
%s は quickrun の symbol で file name です。
:p:h はファイル名を絶対パス化した上でディレクトリのみを抜きだす、というもの。
filename-modifiers とかいうものらしく、 quickrun の document に You can use filename-modifiers for the symbols. って書かれてました。
:p:h の詳しい解説は :h filename-modifiers を見た方が早いはず。
ちなみに write してない buffer は名前の関係で quickrun できません。

あと --output は無難なところで /tmp に変更。

そんなこんなで、 processing な sytaxhighlighting + quickrun で実行できるようになりました。

2013/11/30

Unity を 4.3 にしたら MonoDevelop の補完が効かなくなった

Unity を 4.3 にアップデートしたら、 Mono Develop の補完が効かなくなった話。

環境

  • Mac OSX Mountain Lion
  • Unity 4.3
  • MonoDevelop-Unity 4.0.1

経緯

Unity を 4.2.1 くらいから 4.3 にアップデート。
4.3 の dmg を落としてきて実行する形式でアップデート。
そうすると MonoDevelop の見た目が変わっていて、 Unity な Object の補完が効かない。
どうやら、新規インストールではなくアップデートすると補完が効かなくなる現象があるらしい

解決方法

参考にしたところの通り、消して入れ直したら直りました。
具体的には
$ rm -rf /Applications/Unity/MonoDevelop.localized/
して .dmg から Unity 4.3 を入れ直し。
私の環境ではこれで直りました。

Unity に Blender で作成したアニメーション付きモデルをインポートする

Blender で作成したアニメーション付きモデルファイルを Unity でインポートするとか。

環境

  • Mac OSX Mountain Lion
  • Unity 4.3
  • Blender 2.68a

方法

.blend ファイルを Unity にドラッグアンドドロップする。
インポートされたファイルを選択し、Inspector -> Rig -> Animation Type  を Legacyに変更。
それで OK でした。参考にした記事はこちら

一旦 fbx にエクスポートしてからやる、みたいなのもありましたが .blend がそのまま使えるみたいです。

アニメーションは、 Inspector -> Animations の Clips  に + やらで登録して、Unity内でのアニメーションの名前と Blender でのアニメーションの名前を対応させる。
それから Scene にそのモデルを入れた時に Animation Component を追加とする。
Animation Component の項目は Animation が default のアニメーションで、Animations が使うアニメーションの種類らしい。
なので Animations の size を指定して、 element 0 とかに設定したアニメーションの名前を追加していくと良いみたい。
そこまですると Script から使えるようになって、 animation["<animation_name>"] くらいで参照できる。
アニメーションするには Animation.Play("<animation_name>") とか。

2013/11/26

PyPy ソースコード読み会に参加してきた

PyPy ソースコード読み会に参加してきました。
通算3日くらい。
バージョンは Python は 2.7.2 で pypy は 2.2-dev くらいで commit は 67874:84a635eb05a7 なところ。
環境は Mountain Lion。

これだけ大きいソースを追っていくのは初。
割と分かってないところが多いので間違っていることを書いているかもしれません。

PyPy

Python で言語を定義するとそれを pypy なレベルに落として、最終的にバイナリにしてくれるみたいです。
それが rpython なスクリプトで、例えば pypy は Python の実装を Python Code で書いて、それを実行すると一旦 C なファイルになって、それをコンパイルしてバイナリを生成するみたいです。

pypy-c

公式のページにある
$ pypy ../../rpython/bin/rpython -Ojit targetpypystandalone 
をすると python で実装された python が C に落ちて pypy-c という Python 実行系なバイナリができます。
その時には、  rpython/path/to/*.py は rpython_path_to_*.c みたいに / が _ になった C コードが生成される様子。
--lldebug とかを付けて
$ python ../../rpython/bin/rpython --lldebug -Ojit targetpypystandalone 
にすると lldb とかで追えるようになります。
生成されたコードは変数に5ケタとかの番号が付いてたり goto しまくりで直接読むのは厳しいです。

ちなみに pypy は 生成した C コードや debug object を /private に置くので、しばらくしていると消えてしまうようです。
なので PYPY_USESSION_DIR や PYPY_USESSION_KEEP を設定すると良さそう

とりあえず一旦 C に落ちてからバイナリが作られるので、バイナリを追っても python code は読めなさそう、という結論に。

Python Code を読んでいく

Pypy には大量のモジュールがあるので、それらの知りたいところだけを追おう、ということに。
なのでテストルーチンを最小限に切り出して、それを実行していく形式にしました。
個人的にテストを直接 pdb で追おうとしていましたが、 py.test で書かれてるようで、どうも通常のコードとは勝手が違って断念。
ということで test くらいからめぼしいものを拾ってきて、method 1つを実行できるようにして pdb debug で trace していくことに。
これだと python 側のコードで読めます。
ちなみにテストコード側には space とかの環境っぽいコードは無かったりしたので、 pypy/bin/pyinterpreter.py とかの インタプリタコードな pypy/interpreter/main.py から StdObjSpace のコードを拝借したりで動かし動かし。
おそらくすぐ動く小さいコードは pypy/bin/pyinterpreter.py なので足りないパーツはその辺りにあるんじゃないかな、とか思ってます。

テストを切り出してみる

parser とか astcompiler とかのソースを追いたいので
pypy/interpreter/astcompiler/test/test_compiler.py
の compile_with_astcompiler を拾ってくる。
足りない space とかは
pypy/interpreter/main.py
から拾ったり。mainmodule とか w_globals  とかも。
そんなんで作ったコードがこんな感じ。

pyparser / astcompiler

そんな感じのコードを使って pyparser を読んだり。
tokenize で lines を split したりと割と富豪的。
おかげで高速化とかされていないわけなので素直で読みやすいといえば読みやすいかも。
astcompiler は buld_ast な parse 後のコードから ast を生成する部分をちょろっと読むなど。
token の type に応じて handle_expr やら handle_binop やらの関数で parse した node を拾ってきて AST オブジェクトを new っていく感じらしいです。
あと Python VM なやつは pyinterpreter を追っていったら出てきたような。

symbol table

token から ast にする時に expr_node.type を確認していったりするのですが、 この type が syms.stmt やら syms.simple_stmt やらとガンガン if で比較していく形式。if-elif祭り。
syms.stmt の値は定数の数値なので、 expr_node.type の数値が分かっても syms の何に相当するのかが謎。
なので dir(syms) とかで syms にある attr を拾ってきて getattr(syms, attr) とかしていって逆引きテーブルを作ったりして対応を取ることに。
この辺の対応を確認する便利コードが pypy にありそうだけれどなー、とかなりつつ。
というかこいう enum みたいなコードって 書く/読む 分にはマジックナンバーが隠れて良いけれど、実行していく分にはチェックするの大変だなー、とか思うなど。特にマジックナンバーな値しか分からない時。
そういう時はやっぱり debug helper チックなのでも書いてたら良いのかな。逆引きとか。

所感 / tips / もろもろ

読んでいくというよりは実行していく、といった感じで読んでいきました。
流れが分かりやすいし使わないところは読まなくて良いので、こんな感じで読むのかー、と。

ただ、実行の仕方分からないとだいぶ大変そうだなー、と。 python 分からない。
一番単純な example とか how to reading sources とかあれば嬉しいよなー、とか。

object の class を見て関連しそうなところとかを探していったり、関数に入ったら l っていってざっくり見てから n/s るのが自然な読み方なのかも?

一見見えないところでも lldb で stepi するとアセンブラに書かれてたりするのでそれを頼りに読むとかあってすごいなー、と。

lldb の debug symbols が /private にあったので読んでたら消えたり、なんか一部のコードを単体で実行したら pypy が動かなくなったり謎ハプニングも。
ちなみに動かなくなったら hg clone しなおしでどうにか直る。
でも hg diff には引っかからなかったのでどこが壊れたのかも謎でした。

とかとかいろいろあった読み会でした。

2013/11/13

MacBookPro のパーティションを切って使っていたらやらかした話

MacBookPro 13-inch, Early 2011 を使っているのですが、パーティション切って運用しているとエラい目にあいかけたのでそのログとか。

ことの発端

もともとは Snow Leopard が入っていて、 Mountain Lion に upgrade する時に「どうせだし Snow Leopard も残しておくか」とパーティションを切って、 Mountain Lion + Snow Leopard の2つ運用をしていました。
Mountain Lion を使い続けてパーティションの容量が一杯になったので、 Snow Leopard を消して容量を確保しようとしたのですが

悲劇

パーティション分割は起動中にできたので、結合も簡単だろうと思ってググる。
disk utility.app だとパーティションを消さないと無理そう。
diskutil の mergePartition を使えば良いっぽいことを知る。
そしてサイトのコマンドをペーストして、編集しようとしたらエンター込みでペーストされる。
^c を押すも Recovery HD が吹き飛ぶ。
別に使っていなかったし大丈夫か、くらいのつもりで、残るパーティションを結合しようと試みる。
Mountain Lion 以外を全て統合しきった後に、「unmount できないと結合できないよ」と言われる。
そして残ったのは容量が変わらない Mountain Lion のパーティションとパーティション未割り当て領域のみ。
ちなみにこんな状態でした。なんか EFI のやつとかも吹き飛ばし済という。
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *320.1 GB   disk0
   1:                  Apple_HFS Mountain Lion           159.8 GB   disk0s1

格闘

unmount 状態じゃないと merge できないっぽいので、recovery mode あたりで起動しようと思ったら Recovery HD は吹き飛ばした後。
起動時に cmd + r で何も起動してくれない。
そして、Recovery HD を再作成するには OSX 再インストールしかないらしい。
ということで仕方無くアップデート待ちだった Marvericks にするか、とインストーラを起動するもインストールできませんと言われる。
Mountain Lion Installer を起動するもインストールできませんと言われる。
この辺で割と厄介なことをしてしまったと思う。
仕方無いので Mountain Lion を完全に再インストールすることにする。
が、最後に backup を取ろうとしたら Time Machine の HDD を認識しない。
dock に入れてクリック長押しからのメニューでどうにか認識。なにそれ。
とりあえず怪しいながらもバックアップを取る。

復活

Mountain Lion の Installer を USB に作ってもらって、起動時に option からの boot 。
これは認識してくれた。
そんでパーティションを1つにして一旦フォーマット。
からのOS再インストール。
んで Time Machine から restore 。
これでどうにか帰ってきた。
消しちゃった EFI とかもあるしたぶん復活でしょう。
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *320.1 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Mountain Lion           319.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

まとめ

  • パーティションは切るのは楽だけれど統合割と面倒
  • ペーストのエンターこわい
  • diskutil さん sudo いらんのこわい
  • Recovery HD は壊しちゃいけない
  • USB/DVD boot なデバイスは残しておくべき
  • Snow Leopard パーティション使った記憶が無い
  • 何気に Snow Leoprad って typo して使っていた
  • Time Machine 重要
  • @各位 ごめいわくおかけしました。

2013/11/11

アプレンティスシップ・パターン を読んだ

アプレンティスシップ・パターン を読みました。

リファクタリング・ウェットウェアを読んだ 後、ドレイファスのモデルとかを知ったのは良いけれど具体的に何をするべきなんだろうか、とか言っていたら kimihito さんからこんな本あるよー、とか勧められたので読みました。

実を言うとだいぶ時間を空けながら読んでしまったのと、訳があまり私に合わなかったので正直斜め読みというか記憶があまり無いというか。

さらっと目次を見ると思い出したのですが、憶えようと思っていたのがお茶の話。
パターンで言う「白帯」とかですね。
新しいことを教えようという時に、今までの考えのみを使って考えていたようであれば、教えようにも教えられない、みたいな話。
「すでに一杯になっているカップを持って、私のもとにやって来たのであれば、私がどうやってあなたに何か飲み物を与えられるでしょうか」
と。本文引用。
どうも私は聞きかじりの知識で対応しようとしてしまう癖があるようなので非常に耳の痛い話。
しかも目次を見直すまで今まで憶えずに忘れていたという……。

技術者にまつわるよう問題に対して、どう対応するべきか、みたいなパターン集でした。

2013/11/04

競技プログラマが知るべき97のこと を読んだ

最近 @_simanman さんと @kanpe777 さんと #ie_procon なる競技プログラミング勉強会をしているのですが、そこで紹介された薄い本。
競技プログラミングに関する TIPS 本です。
kanpe777 さんから借りて読みました。


印象に残っているのは
  • 競技プログラミングはネトゲである
  • float ではなく double を使う
  • 定数倍高速化はムダ
  • 100, 300, 600, 1000
  • コーディング規約
  • コードの綺麗さ
  • 絨毯爆撃
  • Editor な話で Vim が無い
  • 摂動
  • 自作ライブラリ、他人の自作ライブラリ
  • 煩雑なデータ構造へのアクセサ
といった感じでしょうか。



それぞれについてちょっとコメントすると

競技プログラミングはネトゲである

  • みんなが集まってクエスト(問題)を解いていくから、と。なんかそれっぽい。

float ではなく double を使う

  • 精度の関係で double 安定らしいです。

定数倍高速化はムダ

  • これはちょっと耳が痛い話。 
  • 初心者がやりがちらしい話らしくて、定数倍程度のちまちました改善は基本的にムダらしい。 
  • 計算量を見直すレベルじゃないとダメだとか。

100, 300, 600, 1000

  • 競技プログラマには解いた問題によって実力の壁があるんだとか。 
  • それが 100, 300, 600, 1000 らしくて、すごい方々は1000とか解いているらしい。
  • 私は100も解いてない。うーむ。 

 

コーディング規約

コードの綺麗さ

  • 競技プログラミングのコードは基本的に書いて終わりだから、綺麗さをどうしようかという話。 
  • 競技プログラマのコードは汚いんじゃないか、みたいなイメージもあったりなんだりらしいけれど、競技のコードとそれ以外のコードは分けよう、とか。 
  • あと、チーム戦なら競技でもちゃんと書いた方が良いし、自分のためにもちゃんと書こう、みたいな。

絨毯爆撃

  • これは知らなかった。というかその発想は無かった。
  • 撃墜フェーズで良いコーナケースを思い付いたら、それでひたすらに爆撃していくらしい。
  • 大量得点 or 大量失点 の大博打らしいです。

Editor な話で Vim が無い

  • 補完の関係では Visuatl Studio, Eclipse とか、構文チェックでは Eclipse, Visual Studio, Emacs + flymake とかが紹介されてました。 
  • Vim も Makefile 書けば quickfix に syntax error 残るし、 quickrun とか quickrun + watchdogs とか syntastics とか入れたら捗りそうなのになー、とかって私見。

摂動

  • 実数を扱う時には誤差を考慮したりするのだとか。知らない世界でした。

自作ライブラリ、他人の自作ライブラリ

  • 競技で頻繁に使うたコードはライブラリにしたりするのだとか。
  • 他人のライブラリと比較したり自分なりのアレンジを作ったりなんだりするらしい。

煩雑なデータ構造へのアクセサ

  • これは良いなと思った。
  • クラスを作るようなサイズで無い(とか時間が無い)構造体を定義する時とかに、それにアクセスするためだけのメソッドを定義する、というもの。
  • triple の変わりの pair pair だと hoge.first.first とかになって分かりづらいので accessor(my_triple hoge) { return hoge.first.first } とか      


他にもいろいろありましたがこんなところで。
細かい tips もあったりしたので、簡単に手に入るなら手元の置いておいても良いのかな、とか思いました。

2013/10/14

vim-enhanced を yum で入れる際に注意すること

vagrantbox.es な Fedora19 でのログ。
Fedora19 でのデフォなのか、 box 化された Fedora19 の設定だったのかは謎だけれど。


vim が vim-minimal だったので vim-enhanced を入れようと
$ yum install vim-enhanced
すると vim-common が vim-minimal と conflict とか出てくる。
Transaction check error:
  file /usr/share/man/man1/vim.1.gz from install of vim-common-2:7.4.027-2.fc19.x86_64 conflicts with file from package vim-minimal-2:7.3.1314-1.fc19.x86_64

ってな訳で vim-minimal を消す
$ yum erase vim-minimal
そうすると依存の関係で sudo が消える。 たぶん visudo とかの関係。
Running transaction
  Erasing    : sudo-1.8.6p7-1.fc19.x86_64              1/2
warning: /etc/sudoers saved as /etc/sudoers.rpmsave
  Erasing    : 2:vim-minimal-7.3.1314-1.fc19.x86_64    2/2
  Verifying  : sudo-1.8.6p7-1.fc19.x86_64              1/2
  Verifying  : 2:vim-minimal-7.3.1314-1.fc19.x86_64

sudo を erase すると /etc/sudoers が消えるので /etc/sudoers.rpmsave にバックアップされるみたい。
なので vim-enhanced を入れる時に sudo も入れて、 /etc/sudoers を元に戻すと元通りのはず
$ yum install vim-enhanced
$ yum install sudo
$ mv /etc/sudoers.rpmsave /etc/sudoers
これで sudo できるし vim も enhanced になってめでたしめでたし。
というか sudo 消えるのこわい。

実践Vim を読んだ

実践Vim を読みました。
買って一ヶ月くらいで読んだ様子。
たぶんしばらく放置して数週間くらいかけて読んだよーな。

内容ですが、 Vim の基本機能に関する TIPS 集みたいな感じでした。200個くらい TIPS がある。というか全ての項目が TIPS としてまとめられてる。


発見したことはいくつかあって、憶えてるのだと

  • Expression Register
  • / した後に :s//hoge/ すると置換のパターンが最後の / と同じになる
  • :global が便利そう(使ってなかった)
  • :spell している状態でスペルミスの部分を修正できる(z= とか)
あといくつかあったのですが、結構多くて忘れてる。
大量の TIPS があるので後から見直せば良いのかなー、とか。


あと、読んでて思ったこと。
Vim の基本機能の解説なので、割と知ってる内容でした。
なのと、自分で勝手に使ってる Vim な方法と違う方法が書かれていて違和感。
別の方法もあるよー、的な感じですがこう、読んでて「私ならあーする」みたいなのが脳内に出てきてこの辺は静かに読んでない感。

大量の TIPS 群なので、実際に手を動かしながらやると強力さが分かったりするものもあるんだろーな、と思いながら紙でずっと読んでました。
私としては、使えるものをいくつか拾えたら良いのかな、ってスタンスなのでたぶん使えそうなやつを使うくらい。自分の使いたいように使えば良いと思う。(投げやり)

あと、プラグインの解説とかはメインでは無くて、標準の Vim じゃできないことも、これを入れれば、できるんですよ、みたいな話は無し。コラムにちょろっとあるけれど。 Kana さんと Tim Pope さん流石っぽい。 あと KoRon さんとか mattn さんとか名前が載ってたり。
便利なプラグインを入れよう、とかそういう役目は Vim テクニックバイブル 担当そうですね。

基本の機能解説には良いと思います。
個人的には基本的機能解説は 入門vi を読んでしまったのでそっちが印象強いですが。
Vim を使うならこっちから読んでも良いのかな、でも入門viの方が薄いし。うーん。
とりあえず、入門vi (or|and) 実践Vim からの Vim テクニックバイブル の流れが良さそう。

2013/10/11

Vagrant で box が add できない

時系列は前後するのですが、 Vagrant 導入時にちょっと引っかかった内容。

Vagrant は ruby base だと聞いていたので導入は
$ gem install vagrant
でやったところ、入るのは 1.0.x 系列らしい。

1.0.x 系列で CentOS の最新版や Fedoraの最新版の box を add しようとすると、ダウンロード終了後の展開時に
Failed to untar the box file. This is usually because you're
attempting to add a box that isn't a valid box file. Please
double check that the box file is properly packaged.
とか言われて落ちる。
VAGRANT_HOME の関係で、ホームディレクトリでやると良い  とか それでもダメだったからバージョン低い box でやった とかいろいろ対策があるみたい。
私は前者はダメで、後者の方のバージョンが低い CentOS の box を指定すれば add できた。

実際何が原因だったかと言えば、 vagrant のバージョンでした。最新だと問題無し。
Vagrant 公式の最新は 1.3.4 で、これは gem からだと入らないみたい。
dmg を落としてきてインストールする必要がある。

インストールした Vagrant は /Applications/Vagrant/bin くらいに command があるけれど /usr/bin に symlink が貼られている様子。
なので、 gem の方をアンインストールして dmg な /usr/bin/vagrant の方を優先するようにすると実行できる vagrant が 1.3.4 に。
1.3.4 だと fodora19 の box も問題無く add できた。
gem の方を uninstall しなくても良いかもしれないけれど、パスの優先度を変えたり追加するのも面倒だったので gem の方を消すことで対処。

とりあえず最新の fedora を box 化するような人が古い Vagrant 使うはずがなかったんやー、みたいなオチで一つ。

Vagrant + Puppet で Fedora 19 に MySQL を入れる

MySQL な環境を構築しよう、ということになったけれど、どうせなので Vagrant でやることに。
と思ったら非常にいろいろハマったのでメモ。

環境

  • OS X Mountain Lion
  • Vagrant 1.3.4

Vagrant のインストール

Vagrant のサイト から最新な 1.3.4 をインストール。
ちなみに /usr/bin/vagrant くらいにシンボリックリンクが貼られるので、 rbenv な vagrant は uninstall した。


Fedora 19 を入れる

Vagrantbox.es から最新な Fedora19 を使うことに。
$ vagrant box add fodora-19 https://dl.dropboxusercontent.com/u/86066173/fedora-19.box
これで box がダウンロードされる。
box は直接起動する訳じゃなくて、
$ vagrant up
した時にコピーされて起動するみたい。
なので
$ vagrant destroy
しても box そのものは消えない。



Puppet で MySQL を入れる

入れようと思ったら大量にハマるなど。
以下に導入ログとトラブルシュートなログ類。

Puppet の Install

$ vagrant plugin install puppet
くらい。 gem からでも入るっぽいけれど、vagrant な例に習って gem の puppet は uninstall した。

Puppet の設定

Vagrantfile に書かれているやつをコメントアウトする。
  config.vm.provision :puppet do |puppet|
    puppet.manifests_path = "manifests"
    puppet.manifest_file  = "mysql.pp"
  end
とか。
mysql.pp とかはマニフェストの名前。何でも良いはず。
ディレクトリ構成は
.
├── Vagrantfile
└── manifests
    └── mysql.pp
みたいな感じになる。
この状態で mysql.pp に設定を書いていく感じ。

 

Puppet の実行

puppet で環境を構築するのは provision すると良いみたい。
up の時に provision も実行するなら
$ vagrant up --provision
しないなら
$ vagrant up --no-provision
1.3 系だと up は初回は provision が走って、次回以降は走らないのがデフォらしい
ちなみに up してる時にも
$ vagrant provision
で provision が実行されて puppet が走る。



エラーログ

ここからエラーログ

IP アドレスが取得できないっぽい

$ vagrant provision
した時に
Running Puppet with mysql.pp...
Could not retrieve macaddress: undefined method `each_line' for nil:NilClass
Could not retrieve macaddress: undefined method `each_line' for nil:NilClass
Could not retrieve macaddress: undefined method `each_line' for nil:NilClass
Could not retrieve ipaddress6: undefined method `scan' for nil:NilClass
Could not retrieve netmask: undefined method `split' for nil:NilClass
Warning: Could not retrieve fact ipaddress
とか怒られる。
IP が見えてないっぽい。
fedora19 には最初から ifconfig とかが入ってないらしいので
$ yum install net-tools
しておく必要があるみたい。
この辺も manifest に書いておくと怒られない。
ちなみにこう怒られたのは yum update の時。

hostname と DNS 周りが変らしい

warning: Could not retrieve fact fqdn
とも言われた。
この辺は hostname が fqdn に対応してない(のかな?)っぽいのと、dnsな設定が変らしい。
どうやら VM の domain が適切に設定できてないとダメらしい。
/etc/resolve.conf に domain な記述が無いといけないらしい
んで、 resolve.conf は vagrant が勝手に設定するらしいので、実行するホストの環境によっては設定されなかったりするっぽい。
generated by NetworkManager とか書かれてたので vagrant 側じゃなくて fedora 側が勝手に作ってるのかもしれないけれど。
無理矢理 /etc/hostname に hostname を書いて、 /etc/resolve.conf に domain を書くと出ない。
ちなみに hostname と dnsdomainname コマンドがおかしい時に出てくるエラーらしい
あと vagrant ssh して
$ factor | grep fqdn
すると、エラーが出る方には fqdn な値が無かったり。
この辺設定できるとエラーは出ないのかもしれない。

そもそも MySQL が Fedora19 に無い

$ yum install mysql
とかがダメで
$ yum intall community-mysql
とからしい
しかも接続してみると MySQL じゃなくて MariaDB とか出てくる。
調べてみると fedora19 から MySQL の default が MariaDB だとか


Vagrantfile と manifests/mysql.pp

書き方はググりながらだったので省略するとして、最終的にできた Vagrantfile と manifest はこんな感じ。
mysql をインストール + 有効化とパッケージのアップデートをしてくれます。
あと hostname の設定。


最終的に

$ vagrant up
$ vagrant provision
で起動と環境構築をしてくれるようになりました。
便利だけれど実行できるようになるまで大分ハマった。
この辺ささっとできると良いのかなーうーん。

2013/09/29

git勉強会 in Okinawa に行ってきた

2013/09/28 に git勉強会 in Okinawa があったので紛れ込んできました。
togetter は こんな感じ


まずは git のハンズオン。資料はこんな感じでした。
ハンズオン形式は始めてでしたが、これは個人でやるタイプなのでひたすらもくもくでした。
割と見たことある内容なので資料を読んでました。
rebase で fixup にするとコメント無し squash にできそうなので便利そう。


次は @Tomohiro さんによる git を使った開発の話。

git は「複数人数で開発とかする上で使えそうなもの」であって、開発のスタイルとかに合わせて使っていこう、みたいな話とか。
例えば git-flow とか github-flow とかみたいに git を使うスタイルはいくつかあるらしくて、自分達に使えそうなものを取り入れていけば良いのでは的な話。
具体例として @Tomohiro さん達はスクラムしてたりします、とかとか言ってました。
github 使うなら huboard 使えばカンバン化できたりするよー、とかとか。
型に合わせるのも良いけれど必要なところだけ取ってけるともっと良いんだろーなー、とか思いましたまる。

あとは、環境な話とか。
vagrant を使えば環境構築のレシピをテキストベースで保存できる == git で管理可能ですよー、とか。
環境の依存とかも解決できるしロールバックもできるし良い感じそう。
packer を使って OS Install -> vagrant で上げて -> puppet でコマンドとかを入れる
とかしてるみたいです。
chef も良いけれど、 chef は割と厳密なファイル構成でファイルを書かないといけないらしくて、 puppet は単純な構成でも厳密な構成でもできるし良いよー、と。
とりあえずテキストベースで環境を構築できるしこうやって公開もできます、みたいな話。
便利そうなので次何か構築する時は使ってみたいなー、とか思ったり。


ハンズオンの二回目はコンフリクトの解消。
だけれど曰く「ちゃんとコミュニケーションできてたらコンフリクトなんて起きないよ」と。
ハンズオンでは積極的にコンフリクトして解消する作業。
「コンフリクトするのは怖くないよ」みたいな印象を持ってもらえば良いな、って形らしいです。

ちなみに、 rebase 派 と merge 派 は分かりあえないらしいです。
rebase は svn とかのユーザの感覚らしい。まっすぐなので。
merge はなんだろ。 mercurial かな。
ちなみに私は rebase からの merge --no-ff 派。
merge 時に conflict するのは面倒だけれど master に残すのは merge commit じゃないと面倒そうなので。
なので rebase -i で 1つにするほどでも無いけれど、master に 直 merge も嫌かなー、くらいのスタンス。



おまけで勉強会の時に飛んできた URL 群たち。

Git を学ぶ - @Tomohiro さんによる gist。 git を学ぶ上で便利そうな tips とか command とかの紹介。
あと、git-バルスでは「どうやるとgitがぶっ壊れるか学べるから良いよね」とのこと。
ちなみに加えて「まぁやらないですけれど」とのこと。

ChangeLog を支える英語 - yamane さんが投げてたURL。
commit message の先頭は大文字にしましょうねー、とか comment を書く上での tips 集。

git commit時のコメントを英語で書くための最初の一歩 | hiro345 - kanpe さんが投げてました。
これも tips 集みたいな感じ。ざっとしか目を通してません。
commit する前に確認すべきこと、みたいなのは良い感じだったよーな。

ChefとPuppetの比較 - こちらも kanpe さん。git じゃないけれど。実を言うとまだ目を通してない。


感想。

全体的にもくもくな感じでした。
コンフリクトのハンズオンの時に知らない人とあたればまた違ったのかもしれませんが。
というか私が知らない人と話してないだけか。
git そのものは知ってる知ってるみたいな反応してしまったし。でもほぼ個人でしか使ってないオチ。
個人的には仮想環境な話が聞けて良かったかなー、と。次に git を使った開発の実例とか。
git user (というかバージョン管理する人)が増えると良いなー、とか思いながらかんそーおしまい。

2013/09/10

リファクタリング・ウェットウェア を読んだ

リファクタリング・ウェットウェア を読みました。

2009年の本らしいです。
なんで今読んだかと言えば、本屋でふらふらまわって立ち読みしてて見付けてしまったので。この辺は本屋流石ですね。

さてこっちも確か読み終わったのは昨日。
最近は一日数章読んで数日かけるスタイルかもしれない。単に一気に読み切る集中力が無いとも言う。

内容としては達人プログラマをちょっとアップデート + プログラマ臭が少し抜けた、みたいな印象。 達人プログラマは全部読んでないので憶測ですが。

割と心理学とかそーいうもの寄りで、効率良く学ぶには、みたいな話とか。
心理学うんぬんで若干うさん臭いけれど、「うさん臭い話ですが」みたいな書き方されてる。根拠が不明瞭な分ちょっと違和感はある。ただ、こういう役に立ちそうな話ありますよ、みたいな感じ。

特に印象的なのがドレイファスのモデル。
「技術を修得するためにはこのような段階を持つ」みたいなの。
実際、これが正しいかとかは謎だけれど。

一応、具体的な学習例とかあるかな、とか思ったけれど割とアバウト。
方針は示してくれるので、本に書かれている通り「レシピ」チック。

「毎年言語を学べ」みたいに、達人プログラマの方が具体的なのかも。あれ。「学べ」って具体的かな?
学習の仕方とかも「目標立てよう」とか。確かに立てた方が良さそうだけれどどうしようーん。みたいな。いやそれも含めて自分で考えなアカンのか……。

うさん臭いうんぬんと言えば、脳の仕組みの活用とかいろいろあったり。別に否定してる訳じゃないけれど。いかに効率を上げるか、みたいなのが大量にあるから少しでも取り入れると良いんじゃないかなー、みたいなスタンスで読んでました。

あとは印象的な単語はエクソコーテクス。
実を言えば「エクソコーテクス」って 単語は憶えていなかった。
エクソコーテスが何かと言えば、外部脳、らしい。
本とかを丸暗記するんじゃなくて「この本にはアレが書かれてた」って憶えれば、その知識は活用できるし丸暗記の労力は減るよね。みたいな。
私が「エクソコーテクス」って単語を忘れたら恐らくこの記事を見るはず。ちゃんと「そういうものが残ってる」って憶えてればだけれど。

効率を高めるためのtips集みたいな感じだったかも。



というか Teem Geek といい リファクタリング・ウェットウェアといい、最初の章はインパクト強めなー。立ち読みを買わせる戦略か何かなのだろうか。

Teem Geek を読んだ

Teem Geek を読みました。xHago とかで評判が良かったので読みました。

というか読み切ってました。実を言うと数週間前くらいに読み終えて、感想を今書こうかとしてるところです。
割と記憶が薄れ気味なのでパラパラ捲ったり目次を読みながら書くことにします。

記憶薄れてるってことは微妙だったのか感あるので、まずは憶えてることから。
印象としてはやっぱり HRT 。
  • Humility - 謙虚
  • Respect - 尊敬
  • Trust - 信頼
人と関わるんならこれを信条にしよう、みたいなもの。
確かにHRTを実践できると悪く思う人は減りそうだなー、とは思いました。
ただ、これができたら苦労しないよね、とか思ってしまうので私にはまだまだ精進が必要そう。

次に憶えてるエピソードは文化を大事にしよう、みたいな話。
ここで言う文化はコーディングスタイルとかで、オープンソースなソフトウェアに「とても良い機能だけれど文化が少し違う」ものを取り入れるかどうか、みたいな。
Teem Geek で出てきたエピソードでは、文化を優先するためにそのコードは取り入れてませんでした。そこまでするのかー、と印象に残ってます。
あとは天才の神話とか。「一人でやるには限度がある」とか「誰もが一人で籠って完璧なのを作り幻想を抱くが幻想だ」みたいな感じ。

この辺からパラパラ捲りつつ書きつつ。

全体的な印象としては オープンソースのコミュニティの失敗例と成功例、みたいな感じ。
「ギークでなくても本書のアドバイスは読む価値がある」って帯に書かれているんだけれど、やっぱり目線はギーク寄りなのかな、とか思う。
なんだろ。この文脈としての「ギーク」は「創造的なことをする」とか「複雑なことをする」とか「それ以外のことに苦痛を感じる」みたいなニュアンスかな。

ブログに感想を書いていて思ったのだけれど「そういう人達の処世術」とかみたいな意味合いっぽいな、とか。この本を一言で言うなら割とそれっぽい感。
最初の辺りに書かれているのが「チームワークについてどう思うか」で「誰も信じられない」とかだし。
この部分立ち読みして買ったのもあるのだけれど、割と冷静に見ると失礼だよなー、とか思う。いや確かにチームワークの思い出には苦いものが当然あるんだけれど。
そういう人に向けてるんだろーな、とか思いました。

ちなみにそういった内容エピソードとしては、チームワークの残念例とか、その対処とか、組織でこの先生きのこるには、とかとか書いてありました。
割とあるある事例紹介みたいなところもあるので、てっきり自分がギークなのかと思わせてしまう辺りも流石かもしれない。
そしてその事例に俺はこうしたぜ、的な。それこそ経験をまとめて本にしちゃいましたー、って流れなのかもしれない。

チームワーク面倒、とかって思ってしまったことある人向け本なのかもなー、とか思いつつ。

2013/08/25

ハッカーズチャンプルーに行ってきた

2013/08/24 に ハッカーズチャンプルー なるイベントがありまして、ふらっと行ってきました。
プログラムはこんな感じ

感想含む忘備録チックな感じで非常に長くなってしまった感。

カンファレンス

実はちょっと遅れて行きました。時計セットし忘れ。むむ。

きしださんな Java8 な発表は資料無しでブログとライブコーディングが資料な発表でした。
なんだかんだでブログにまとめてると後から役に立つのかな、とか。
して発表内容ですが、Java8 から lambda とか Optional とか入って良い感じになるよー、とのこと。内心では「それRubyだとあんなか」って感じで聞いてました。
けれど「Javaそのものは3年くらい遅くて、それがずっと続く感じだと思ってる」とのこと。そういうスタンスもあるのねー、とか思いました。

丸山さんの発表は、今までの時代とこれからの時代的なお話でした。特にWebアプリって何ぞ、みたいな感じ。印象に残ってるのは「WebPageはクライアント側のUpdateいらないよね」みたいな話。Packaged Web App は新しいモデル、みたいな感じなんだろうか。MVC的な感じとかとか。

CodeIQさんからはお菓子とか飲み物とか大量に貰いました。ごちそうさまです。
弁当もありがとうございました(これはスポンサーさんかな?)

dankogai さんはプログラミングってどう考えてるのみたいな話。FizzBuzzに焦点を当てて、一番単純なものから捻ったもの、はてはHaskellで書いたものまで見ていく、といった流れ。全編ライブコーディングでした。
ちなみにRubyの解説の時に当てられて答えられたのでちょっと満足。まとめとしては関数型は文脈に依存しないから並列にすると良い感じよねー、みたいな。というか Haskeller あまりいなかった。ってことはやっておく価値ありそうなんかなー、とか思いながら。

AWS な堀内さん、後藤さんは AWS使ってないこともあって事例とかはいまいちピンと来ず。そろそろ触れって感じでしょーか。

大石さんは相変らず時代劇な感じ。「安心を取るか安全を取るか」とか「情報はお金みたいなもの。重要だからって自社に全部置く? 普通は銀行に置かない?」みたいな話はなんか納得してました。あれくらい良い指摘ができるようになればそれこそクラウドを上司に認めさせられそうだなー、とか思いながら聞く。

PostgreSQL な永安さんは「すべき、べからずのn箇条。」nが何だったか憶えてない。というか一覧欲しい。
パラメタはデフォルトのままやめよう、とかあったのだけれど今のところデフォルトで十分動いちゃったりするので私にはまだ早い話だったかもしれない。
ただ、TLは大分「耳が痛い」的な話だったのでそのうち耳に染みるようになるのでしょうか。とりあえずバックアップ取らなきゃなー。

矢野さんな OKINAWA GIRL's lab のおはなしはガールズトークセッションと呼べば良いのかな。「腹を割って話さなきゃ」って言ってる通り、割と腹を割った話を会場でやってた印象。それを会社とかで言うと結構変わるのかなー、とか。いやまーとっくに言ってるかもしれないし、腹を割るってこのレベルじゃないのかもしれませんが。
とりあえず私としては、やっぱり話し合ってみなきゃ分からないよねー、みたいな印象を持ちました。こういう悩みとかあるよね、ってのを知ったのだけでも良かったのかもしれない。

米須 さんも相変らず。大事なことなのでn回良います。あのテンション良いと思います。
して、DevOps知らなかったので具体的には分からず。ただ、権限の切り分けは重要そうだな、と。
というか「本番で動かないでござる」が無くなるのならどうぞどうぞしてしまうかもしれない。

ビーチパーティー

なんとスポンサーさんの力によりバーベキュー無料。タダ飯。ありがとうございます。
yota さんが dankogai さんのサイン貰って doya-face してました。私は急いで来たから本を家に忘れてしまって貰えず。dankogaiさん来年サインください。
というかお話もできたのでなんかすごい。言い方アレかもしれないけれど、ブログの向こう側の存在が目の前に居る感じ。何事。
話しをしてると web application な脆弱性の話から system call な話になったり、 CPU architecture な話になったり、攻殻とか艦これが顔を覗かせたり。話題多いなー、と。
あとCodeIQな方とか Tokyo な方多かったですね。終電って何ですか。というか電車って何。
お酒もアリの場でしたけれど楽しめた感あります。
あと、 #世界の麦汁 さんが #世界の土下汁 になってました。おさけ良く分かりません。

かんそう

素敵なチャンプルーでした。
是非来年も開催して欲しいですねー。
ってな訳で皆々様方、ありがとうございました。

2013/08/18

Monad のようで Monad じゃないものを書いてみた

最近は すごいH本読んだり とか Haskell ってたのですが Monad が謎だったので試しに書いてみました。

結論から言えば Monad 則を満たしていないので、「Monad の instance にできてしまった何か」なのですが。
ってな訳で HookMonad なるものを作ってみた話。

HookMonad

a -> a な関数と a な値を持つデータ構造を定義。
>>= で関数を適用する際に a -> a の関数を適用してから関数を適用する、ってものにしてみました。

適用してみる想定として座標を考える。名前は nonMinusPoint とかにしてみました。
座標用のデータ構造で、値が 0 以下になったら 0 にしてくれる、って代物。
「プログラマブルセミコロン」のたとえを聞いて最初に思いついたものがコレ。
毎回 「0 以下なら……」 的なロジックが必要無さそうなので良いのかなー、と。
ソースはこんな感じ。

どう処理してるのか

Hook に a -> a な f として「0 以下なら 0 にする」lambdaを渡してます。
そうして >>= で関数を適用したい時はその lambda を適用してから関数を適用させる、と。
それを単純に使うために nonMinusPoint とかって名前を付けておく。
値を操作する関数 add とか multi には 「値が 0 かどうか」的なロジックはいらない。はず。
(とは言っても nonMinusPoint を結局使うので、毎回 lambda 書いてるのとあまり変わらない気もするけれど)
そうすると、 >>= で関数を適用する分には値が 0 以上になることが保証されそう。
あと、 Maybe の「失敗するかもしれない演算」みたいに「マイナスになるかもしれない演算」があったとしても確実に 0 以上であることが保証される。
だから add とかじゃなくて「0 以上でないと使えない関数」を定義した方が良いのかも。

 

ちなみにこれはMonadじゃない

ただし前述したけれどこれは Monad 則を満たしてません。
ちなみにMonad 則は以下。
return a >>= f ≡ f a
m >>= return ≡ m
(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
1はどうにか満たしてるはず。
2は無理。return の型を合わせるために id を使ってるので、 m >>= return すると a -> a な関数が id に変わっちゃう。
3はどうだろ。たぶん満たしてそうだけれど反例が思いつかないだけかもしれない。

さらに問題点

もともとは「数値演算をしたら non zero にする」みたいなものを作りたかったので
Hook f n >>= g = fmap f $ g n
とかにしたかった。
だけれど >>= の型は
(>>=) :: Monad m => m a -> (a -> m b) -> m b
なので、 埋め込んでる a -> a な関数を m b に fmap しようとしてダメ、って言われる。
あと HookMonad が Functor じゃないと f を数値演算後に適用できないのだけれど、 fmap の型も
fmap :: Functor f => (a -> b) -> f a -> f b
ってなってるので、 Hook (a -> a) b になっちゃってダメ。
さらに、 return に id を使ってるので、汎用性を高めるために return を使ってるようなコードだとかえって a -> a な f が id になっちゃって埋め込んでたのが消えちゃう。
完全に Monad則 の 2 がダメになっています。
ってな訳でいろいろ問題点は多し。
ただ、「演算のたんびに何かする」ことはできたので良いのかなー、とか思っています。
まー、>>= に与える関数の中でも nonMinusPoint とか書いてるから「毎回何かする」部分を毎回書いちゃってる説もありますが。
(いやでも nonMinusPoint にすることで型が Hook になるので Hook なコードを書いてたら 型チェックされる ==  非ゼロ保証 だし良いのか? うーん)

なんか良いこと

あと書いててすごいなー、と思ったこと。
この Hook ですが deriving Show してません。
どうしてかと言えば関数を持ってるから deriving だと無理。
だから getValue を定義して、値だけを取り出すようにしないと ghci で値を見られませんでした。
その getValue の中でも f を適用するようにしたので、最後の最後だけ処理後に 0 以下かどうかのチェックができてます。
あと、コメントアウトしてるのは ghci で実行してみた例なのですが、 foldl でガンガン処理していけるっぽいです。
あと途中結果を見るために scanl を使ってみたのだけれどそのままだと見られない。
scanl は計算途中の内容を List にして返すので、その List に対して fmap で getValue かけたらきちんと見られました。
ちゃんとした Functor すごいなー、とか。
あと scanl で計算結果の途中を見ると、 0 以下になるところで 0 になってるっぽい。

ってなわけで Monad のようで Monad じゃない何かを書いてみました。

2013/08/11

xHago4 に行ってきた

2013/08/10(Sat) は xHago4 でした。

機械学習を使って顔文字検出してみた ってことで発表もしてきました。
内容を一言で言えば「オリジナルの特徴ベクトル設計で単純なやつよりは良い結果出たよ」みたいな。
プレゼンとしては機械学習やってみたー、みたいな話をしたつもり。
ただ、教師あり学習とか特徴ベクトルの話は削っちゃっても良かったのかも、との指摘も頂くなど。時間足りなかったですし。
私としては「コードそのものに工夫するのではなくデータの見方とか処理とかを工夫するような世界もあるんだー」的なことを言いたかったです。
どこでもデータの見方は必要だと思いますし、データの処理でコード書かないといけませんが。

リスナーとしては、今回は良い話とかコミュニティの話が多かったなー、という印象でした。
何か作りました、って話でも内部のロジックよりはAWSでこうこう、みたいな感じ。
意外と中身話すよりも、プレゼンでインパクトで伝えて「詳しくはGithubで」くらいのが良いのかな。

あと夜の部がhagoでした。

2013/07/22

オープンキャンパスな話

2013/07/20 に オープンキャンパス があったので参加するなど。

午後の部の体験ツアーなるもので Programming III の成果物を発表してきました。
内容は Open Source Conference な感じなので詳細は来た人のみってことで。

基本的に高校生に話す、ってことだったのだけれど、どういった風に話をしたら良いのか謎でした。

例えば、プロトコルの名前をそのまま出すのはダメな気がしたので、ざっくり話したり。
それでも「ログ」とか口走っちゃうと「対数関数ですか?」とか言われたり。
だからと言ってぼかせば「そんな単語分かってるよ」って人がいたりとか。
後半は、どのくらいの感じで話せば良いのか調べるためにも「どうやってると思う?」的な逆に質問を投げてみるとかしました。いくらかマシにはなったかと思う。
オチとしては「詳細は大学で学べますよ」とか言っておいた。オープンキャンパス的にも。
しかし、相手のバックグラウンドが分からないと言葉選べないなー、とか思いました。
(んで、前の打ち上げの時に黙ってた自分を思い出してかなしみにくれる。次からどういう背景があるのか言った方が良さげだな、とか思いつつ、実際そんな時は忘れてそう……)
ある程度の共通認識が存在する空間に居続けて麻痺してるのがあるのかもしれない。
麻痺する前からアレだった説も否めませんが。ががが。

そんな話はともかく、最後は @morobororo さんの感動的なプレゼンと「1飯テロ1質問」の話。
あと @sister_clown さんが一日で機能増強してたりしててすげーなー、とかとか。

あとは、先輩方と戦闘しかけたりとかなんだかんだありましたが終了。単に私の勘違い。
「自宅にルータ2台置いてプライベートAS番号振ってBGPルーティング。ただし端末は普通のMacBookPro1台」とか笑ってしまった。

なにはともあれ、皆様方お疲れさまでございました。

2013/07/15

すごいHaskellたのしく学ぼう! を読み終えた

いわゆる「すごいH本」を一応読み終えました。一応。

実を言うとゴールデンウィークくらいから読み始めて、しばらく読んだあとに時間が取れなくなって放置、そして今さっき最後まで読み終える、みたいな流れでした。
ながいごーるでんうぃーくだったなー。

Haskell の入門書として良い感じ、という評判に漏れず、いろいろとさらえた感じ。
実際 Haskell 使ってるわけじゃないので、まだまだ入口にも辿りついてない可能性もありますが。
とりあえず内容としては基本的な構文から関数定義に始まり、再帰関数の話や型定義、くらいまでが他言語から聞いたことあるような話。
んで、 IO, Functor, Applicative Functor, Monad, Zipper くらいから Haskell 特有な感じかなー、と。

こうやって書いてると Haskell 特有なところ、理解度低い感じしてかなしい。
とりあえず、Haskell書くなら手元に置いておきたい一冊かなー、と思う。


んで、Haskell そのものについてコメントるのは以下くらい。
  • pattern match
  • guard
  • where
  • data type
  • Functor, Applicative Functor
  • Monad


pattern match

Haskell では関数定義の時にパターンマッチって構文があるみたいです。
こんなん。
fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2)
フィボナッチ数列を計算する fib 関数。
fib に渡す値が 0 ならー、みたいな if を書かずに書ける、って感じみたいです。
0ならこう、って直接書ける。
あと、 pattern match を使えば 強制的に早期 return になるのも良いなー、と


guard

pattern match の条件版みたいなやつ。
こんなん。
isPlus n
    | n > 0     = True
    | otherwise = False

これは0より大きかったら True を、それ以外は False を返す関数。
条件にあったらここ実行して、みたいなやつをこう書ける。
もちろん条件は複数書いて良い。
otherwise が case の default というか else というか。
pattern match もだけれど、上から調べていくので、 Haskell は巨大な switch 、とかって言ってる方もいたよーな。
これも早期 return っぽくなるし、良いんじゃないかなー、とか


where

これも関数定義。
関数のみ有効なスコープの関数を定義できる。
lambda 以上 定義した関数以下、って気分。
スコープを汚さずに、繰り返し処理を書かなくて良い感じ。
let でも同じことができるっぽい。 let は上に書いて where は下に書く。個人的には where 派かも。
こんなん。
squareMinNumber x
    | square x > 100 = x
    | otherwise      = square x
    where square x = x * x
2乗して100以上ならそのままの数値、100以下なら2乗する、って関数。
x * x を2回書かなくて良い、みたいな。

data, class

この辺からあやしい。
とりあえず、型変数が無い型は enum みたいだなー、とか思ったり。
型変数があるやつは class 的に扱えば良いのかな、とか思うけれど自作する場面がふと思いつかない。
木構造とか、リストとか、自分でデータ型を定義とかしないと恩恵や実感湧かなさそう。むむ。
class は なんか Java の Interface チック。
この型 class に所属するものはこの関数が使える、みたいな。


Functor, Applicative Functor

この辺までくると言われたことをやってる感じ。
Functor で包む利点ってなんなのかなー、とか思い始める。
リストは非決定性演算に使えるっぽいけれど、発想が未だArrayなので追いついてない感。


Monad

よー分かんない感じになってくる。
とりえあずいろんな記事とか見てて「プログラマブルなセミコロン」とかあったので、自分なりにMonadを作ってみようとしたけれど ghc に怒られてる。
個人的には、>>= を使って Monad な演算をする分には「モナドに包まれた値に対する演算時に、モナドに付属する値(Maybeとか?)にも演算が同時にできる」ものだと思ってるけれど。
実際謎っぽい。ぐーぬ。
とりあえずもしちゃんと書けたら記事を書こうとは思っている。
もしかしたら「書けませんでした」記事になるやもしれない。
あ、でも Maybe Monad 便利そうだなー、とは思った。使えるかどうかはアレ。


まとめ

Haskell分かってない。

2013/07/09

オープンソースカンファレンス 2013 Okinawa に行ってきた

2013/07/06 に オープンソースカンファレンス2013 Okinawa があったので行ってきました。

ちなみに発表もするなど。A会場で 11:00 から。
ちょっと内容が学科向けのものだったので詳しくは書けませんが。
「ちゃんとデータベースバックアップしてる? 大事なデータなら日時レベルでやっとかないと」みたいなツッコミも頂けました。ありがとうございます。

そしてブースをぐるぐる周る。
  • Apache Camel
  • NetBSD
  • はごー勉強会
  • PostgreSQL
  • さくらのクラウド
  • NetCommons
とかとか見ました。
他にも、「働いたら負け」Tシャツが置いてあるけれど、見に行った時には人がいなかったブースとかありました。あれはなんだったんだろ。

話を長めに聞いたのは Apache Camel と NetBSD。
Apache Camel はプロトコルが違うサーバとかの真ん中に置いてプロトコルを相互変換してくれるやつみたいでした。なんか fluentd っぽい匂い。

NetBSDは携帯端末でNetBSD祭りしましたー、って感じでした。
Zaurusとかそーいうの。 WillCom 多し。
あと、mikutterが動いてたので「ておい人いるんですか」と聞いたらそうでも無いとのこと。
話を聞くと、mikutterは結構リソースを食うし、X上げないといけないし、Ruby動かさないといけない(= C Compilerを動かさないといけない)ので、「ここまでやったぜ」みたいな指標なんだとか。へー。
他にもNetBSDなSocket昔話とか、GPL汚染の話とか聞きました。
あとぺんぎんさんスタンプ。

あと声優さんいらっしゃってた様子。なんかめうめうの中の人らしい。某人物がサインゲットしてました。

ってなわけで戦利品はこんな。

あとセミナーは同じ時間のやつと Haskell による Web Service 構築入門 見てきました。
同じ時間は Unity によるゲーム入門。 ローグしようぜ状態。
Haskell は途中参加だったので、「型便利」みたいな感じでした。
コンパイル通れば割と良い感じだし、関数とかの意味も型を見たら分かるよ、みたいな。

最後に懇親会。
個人的に技術的な裏話とか期待してたら皆様方おっさけー、だったので私だけ真顔。
そんなんで続けてたら「それ打ち上げに期待するもんじゃない」って言われるなどして少々ヘコむ。
それでも色々語ってくれる人はいて、それを聞いてた感じ。
なんかすみません感。おさけこわい。

2013/05/31

Vimperator で migemo な検索をする

普段は Vimperator を使ってブラウジングしているのですが、試しに Chrome に Vichrome を入れてみて設定を覗いていると、 migemo な search ができる様子。
有効にしてみると / で普通に migemo 検索できて良いなー、と。

Chrome の Address Bar を消せるなら乗り換えを検討したのですがどうも無理っぽい。
一時期の Chrome はアドレスバーを消せた ようなのですが、最新のだと無理とのこと。

Vimperator でも migemo な検索ができないかなー、ということで導入してみたログ。


環境

  • Mac OS X Mountain Lion
  • Firefox 21.0
  • Homebrew 0.9.4
  • coreutils 8.21
  • md5sha1sum 0.9.5
  • 最新の XUL/migemo (2013/05/31 時点では bb2d73f)
  • migemo-find.js (2013/05/31 時点での最新)


XUL/migemo のインストール

まずは XUL/migemo のインストール。
firefox add-ons からインストールできるのは古いので github から最新を build する。

sha1sum コマンドと、coreutils が必要。
どうやら cp とかは gnu のやつを想定しているようで、Mac のデフォルトの cp だと無理。
ということで sed で cp を gcp にしてごまかすとどうにかなった。
あと buildscript が submodule で引っ付いてる。
make かけると submodule update するのだけれど、今回はsedるために手動で update する。

ってなわけでコマンドはこんな感じ
$ brew install coreutils
$ brew install md5sha1sum
$ git clone git://github.com/piroor/xulmigemo.git
$ cd xulmigemo
$ git submodule update
$ sed -i -e 's/^\(.*\)cp/\1gcp/' **/*.sh
$ make
$ open -a "firefox" xulmigemo.xpi
無事に入れられたら初回起動時に辞書のインストールを求められるのでインストール。
手順は忘れたけれど next とか ok 連打でどうにかなる。はず。たぶん。どうにかして。


Vimperator から migemo を使う

あとは
~/.vimperator/plugin
migemo-find.js を置いて終了。
私は repository を clone して symbolic link を貼っているので、同じようにするなら
$ git clone git://github.com/vimpr/vimperator-plugins.git
$ ln -s `pwd`/vimperator-plugin/migemo-find.js $HOME/.vimperator/plugin
くらい。

あとは normal mode で /nihongo とかで検索できるようになってるはず。

2013/05/23

mecab を ruby で使う

mecab を ruby で使えるようにするおはなし。

環境

  • Mac OS X Mountain Lion
  • Homebrew 0.9.4
  • ruby 2.0.0-p195

brew で mecab の install

$ brew install mecab
$ brew install mecab-ipadic
mecab本体と一緒に辞書である ipadic を入れます。
デフォルトで UTF8 なのでこのままでおそらく大丈夫です。


mecab-ruby の install

mecab-ruby は gem にも brew にも無いので、ソースを落としてビルドします。
2013/05/23 時点での最新版は 0.996 なので
$ wget https://mecab.googlecode.com/files/mecab-ruby-0.996.tar.gz
$ tar xzf mecab-ruby-0.996.tar.gz
$ cd mecab-ruby-0.996
くらいで落として解凍します。

ここで、Macにはデフォルトでmecabが入っているせいで mecab-ruby が見るライブラリのパスが違ってしまう問題があるので、brew でインストールした方を使うように extconf.rb を修正する必要があります。

具体的には
dir_config('mecab',
`mecab-config --inc-dir`.strip,
`mecab-config --libs-only-L`.strip)
を $CFLAGS += の上くらいに入れます。

その後、mecab-ruby を build して install します。
$ gem build mecab-ruby.gemspec
$ gem install mecab-ruby-0.99.gem
きちんとインストールできたかは、gemspec と同じディレクトリにある test.rb を実行して、文が分解されているかを見てみると良いと思います。

mecab-ruby のテスト

$ ruby test.rb
を打ってばーっといろいろ分解された品詞とかが出たら成功だと思います。たぶん。
あとは require 'MeCab' とかしていろいろすると良いんじゃないかなー。

2013/05/01

#ieLT で発表してきた

2013/04/29 に 新入生歓迎LT祭り があったので行ってきた。
Togetter はこちら。 ust のアーカイブは 2013/05/01 時点では無いっぽい?

所感としては全体的にわいわいしてる感じだったなー、って印象。イイネも多かったし。
なんかゆるいねー、とか、質問あるの変じゃね、みたいな話もあったけれど、新入生に楽しさを伝えるって意図なら達成できてるのではー、とか。
それを言えば趣旨ってそもそもなんだっけ、とか考えつつ。

一応  Hello Command Line World. ってことで発表もしてきました。
なんというか5分が意外と短かかった感。
考えてたネタがいくつかできなかったけれど、5分ってそんなもんかなー、って気も。

一応目的としては
  • CLI使おう
 ってだけ。

なんというか、PC使うのってGUIだけでも無いですよー、と。
Xcode の Command Line Tools はインストール大会で入れるので、基本的なコマンドは使えるので活用してみよう、ってな意図。
The Unix Super Text を読もう、ってのもあながち冗談じゃなくて、半分くらい読めば割と捗る気がする。というか私自身が半分くらいで止まってるのは内緒。
シェルのパスのくだりとかはアレを読んで納得したので良い本だと思ってます。重いけれど。

まー、具体的に CLI の方が効率良いかと言われたらどう答えて良いか謎なのだけれど、とりあえず私は zsh + Vim + git で割と快適に作業してる、つもり、です。
でも提出スクリプトとか書くと楽かも。rsyncを手で 打つことは無くなったし。
あとは make とかかな。 Vim から呼べるから書きながらプレビューできる。
platex を手で打つこともなくなったし。とかとか。ステマっぽいな。

あと、新入生に斧投げてくるような人いないかなー、いたら ryudai.rb にこないかなー。とかとか。

2013/04/27

Cloud on the BEACH 2013 in 沖縄 へ行ってきた

Cloud on the BEACH 2013 in 沖縄 に行ってきました。

昼の部だけの参加で、昼からのビーパとか、前日あったらしい前夜祭とかは行ってないです。

AWSとかは使ったことがなくて、とりあず見に行ってみる、くらいの感じでした。
なんというかこういった関係の勉強会(?)に参加するのは初なので、その所感もいろいろ。

AWSについて聞いた印象をまとめると
  • ポチるだけでインスタンスが立ち上がる
  • だから場合によって増やしたり減らしたりとかも余裕
  • ストレージだったりサーバだったりロードバランサだったりDBだったり、いろんなサービスがある
といった感じ。

なんというか、お手軽にいろいろ組み合せられる、ってイメージなのでレゴとかそういった印象がふと。

あと、お手軽すぎてサーバ構築する経験とか、運用経験が無くなるんじゃないか、と古い人間みたいな思想が思い浮かんだのですが
  • ビジネスにとって、自社で受けもつにはリスクだったりする
  • コストもかかるし
  • 誰がメンテするのか
  • 動いてるのが当然って言われて、何かあったら怒られちゃう
みたいな話もあって、ビジネスの面からすると自分で運用するのは割と悪い点が目立つ様子。

ただ、自分でやった経験が無いのも問題かも、という視点もあって、
  • 教育的な意味合いでは一度は自分で構築する経験はしてよ
  • 構築よりも、運用する方が大変なので運用する経験とかもして
  • 会社はお金はあっても時間は無かったりするし、そういうのはクラウドで担保してるってこと
 とかって話もあるみたいです。
そういう意味ではC言語とかとLL言語にまつわる話っぽくも見えてきましたし、学校教育が実践で役にほげほげみたいな話にも見えてきましたが閑話休題。

そういうものも含めて、一番印象に残ったのは
作るのは楽しいから、作っちゃう人は多い。
けれど、その時間とかコストとかメンテとかを考えると、 作るんじゃなくて使う方が良い場合もある。
そういうところを合理的に判断して、どこまで作ってどこまで作った方が良いか判断しよう。
みたいな話でした。
自分で運用した方が良いんじゃ、って言い出しかけてた身としては耳が痛いなー、と。
サーバを自前で運用しないと知識付かない、っては言うけれど、OSとかってさも当然のようにあるもの使ってるでしょ?クラウドとは言ってもそれがインフラになっただけで、一部をアウトソースしてるだけだよね、と。

「つまりどの層で価値を創出するかだよね」
みたいな話も伺いました。
確かに非常に合理的だなー、と思わざるを得ない。

なんというか、みなさん大人だなー、といった印象を受けた勉強会(?)でした。まる。

2013/04/06

Firefox20 にしたら MyBookMarks が動かなくなった

Firefox のバージョンを 20 に上げたらアドオンの MyBookMarks が動かなくなった。

Vimperator で Bookmark を開くのが良く分かんないので MyBookmarks を一旦開いてから Bookmark にアクセス、ってしてたのでけっこう痛い。

Add-on の update を試してみても更新無しで困っていたのだけれど、
公式のページ には最新版がきてた。
直接ダウンロードしてインストールしたら動いた。やたー。

ちなみに動かなくなった時のバージョンは 0.6.7 。
この記事を書いた時に入れた最新版は 0.6.8 。

2013/04/03

Vimperator でページのタイトルを yank する

先日、Firefox のバージョンが20になって、アップデートしたは良いものの、Vimperatorのプラグインの source がうまくいかないようになってしまうなど。

使っていたプラグインに copy.js というものがあって、 :copy title でページのタイトルが yank できたのだけれど、sourceでエラーが出るようになってしまった。

そこで前に書いた Vimperator で マルチバイトな URL を yank する  を改変してどうにかできないかなー、と思って試してみたらできた。
nnoremap Y :js util.copyToClipboard(buffer.title, true)
とか .vimperatorrc に書くとOKみたい。
この場合は Y でページのタイトルをyankできる。


しかしプラグインが全滅っぽい感じがするなー。
とは言っても copy.js 消したので使ってるのは smooziee.js だけなのですが。
この辺も直さないとなー。

2013/02/26

tweet を中央寄せで blogger に埋め込む

Twitter の tweet は

みたいに埋め込めるのだけれど、デフォルトだと中央に寄ってないのでどーせなら中央に寄せたいなー、と。

上のツイートのリンク先に詳細があるのだけれど、
<blockquote class="twitter-tweet" lang="ja" > 

<blockquote class="twitter-tweet" lang="ja" align="center">
くらいにすると良いみたい。

最初は <center> でやろうかと思ったけれど 非推奨らしい ので。

あと、ツイートの埋め込み方法は ツイートのページ に行って その他 -> ツイートをサイトに埋め込み で html が出てくるので、それを blogger の html に貼りつけるだけ。

Vimperator で マルチバイトな URL を yank する

ブラウザは firefox + vimperator を使ってるのですが、マルチバイトURLを y で yank すると
http://ja.wikipedia.org/wiki/日本語
という感じに。もちろん p できちんと開けるのだけれど、Twitterとかで短縮URL化する時にマルチバイトの部分が無視されちゃったり。
困っていたら @teramako さんから
すると良いよ、とのリプライが。ありがとうございます。

ということで早速 .vimperatorrc に
nnoremap y :js util.copyToClipboard(buffer.URL, true)<CR>
を追記。一応 nnoremap に変更。
y で yank すると
http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%AA%9E
と。ちゃんとエスケープされてる。

URLをパッと見で内容が分かるのは上の方だけれど、短縮URLを使うためにはこっちの方が相性良さげなのでこっちを使ってみることにするかなー。
にしても私のツイート日本誤してるな。

2013/02/25

2.0.0 の rubyinterp 対応な最新の Vim を Homebrew でビルドする

ruby 2.0.0-p0 が出たので
atton.blog: rbenv で --enable-shared な ruby 2.0.0-p0 をビルドする
で dylib がある ruby 2.0.0-p0 を rbenv でビルドしてみた。

それを反映した Vim をビルドしてみる。

環境

  • Mac OSX Mountain Lion
  • Homebrew 0.9.4
  • rbenv 0.4.0
  • ruby-build 20130224
  • Vim (HEAD は  7.3.831 )

方法

$ brew install --HEAD vim
 おしまい。
--enable-shared な ruby があれば一発みたい。
1.9.1 系列から 2.0 への変更にも対応できるような rubyinterp だったらしい。良いですね。

一応
:ruby puts RUBY_VERSION

2.0.0
が出る。

なんだか --enable-shared な 2.0.0 に比べてあっさり。
いや、苦労しないのは良いことなので良いか。

rbenv で --enable-shared な ruby 2.0.0-p0 をビルドする

ruby 2.0.0-p0 が 昨日リリースされましたねー。

私は rbenv で ruby を管理しているので、rbenv の ruby installer の ruby-build への反映待ち プラス、 ruby-build を brew で入れてるので brew への反映待ちということで今日試してみることに。 というかこう見ると依存酷い。

あと、Vim で rubyinterp を使うためには dylib が必要なので、 --enable-shared な 2.0.0-p0 が欲しいところ。なのでビルドしてみた。

環境

  • OS X Mountain Lion
  • XCode 4.6 + Command Line Tools
  • rbenv 0.4.0
  • ruby-build 20130224 

結論

$ RUBY_CONFIGURE_OPTS="--enable-shared" rbenv install 2.0.0-p0
とりあえず結論から先に書くと、RUBY_CONFIGURE_OPTS を使えば良い様子。
以下、格闘のログだのぼやきだの。

 

格闘ログとかぼやきとかつぶやき


atton.blog: ruby 1.9.3 の rubyinterp を有効にした最新の Vim を brew でビルドする で書いたように

$ CONFIGURE_OPTS="--enable-shared" rbenv install 2.0.0-p0 
じゃダメな様子。

1.9系列の yaml みたいに、2.0.0 では openssl を rbenv が依存の解決として入れてくれるのだけれど、 openssl の configure にも --enable-shared が渡っちゃって configure が落ちる。
openssl は shared ってオプションがあるらしいので、そっちに合わせると、今度は ruby の configure が通らない。

どーしたものかしてると 2.0.0-rc2 のビルドが通らない的な issue を見つける。
そこでは openssl の path とか gcc とか cc の話もあるのだけれど
2.0.0-rc2 build failed · Issue #290 · sstephenson/ruby-build · GitHub
RUBY_CONFIGURE_OPTS=--with-openssl-dir=`brew --prefix openssl`  ...
 というのを発見。

RUBY_CONFIGURE_OPTS 使えば良いのかなー、と思って試してみる。
この issue 的に brew の openssl を使いたかったからかもしれないけれど、 --with-openssl-dir も指定する必要があるらしい。
けれど私は brew で入れてる訳じゃないのでどーしたものか。
とりあえず、試しに openssl-dir は無視して
$ RUBY_CONFIGURE_OPTS="--enable-shared" rbenv install 2.0.0-p0
する。通った。なんか怖い。
一応、 configure のオプションを見るために ruby-build に echo 挟んだつもりなのだけれど全く出ていない。なんか怖い。
でもちゃんと dylib ある。うーん。
%ls ~/.rbenv/versions/2.0.0-p0/lib/
libruby.2.0.0-static.a    libruby.2.0.dylib    pkgconfig
libruby.2.0.0.dylib    libruby.dylib        ruby
rbenv とか ruby-build がどこで作業してるのか分からないので configure の log 見られないし、ruby が見てる openssl のバージョン確認もできそうにない。
 ちなみにコマンド打つと出てくる openssl は Mac のデフォルトの様子

%which openssl
/usr/bin/openssl
%openssl version
OpenSSL 0.9.8r 8 Feb 2011

うーむ。 ruby-build 側の openssl でちゃんと build されてるかな。 気になる。
とりえあず、openssl の version が低くて bundle install がコケる事例 があるらしいので、逆に bundle install できたら良いかな、と思ってその辺も試す。

まずは 2.0.0-p0 を使うように
$ rbenv global 2.0.0-p0

とりあえず github から 本家 rails を clone。んで、bundle install 前にバージョン確認
%ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
%gem -v
2.0.0
大丈夫そう。
念のため gem の version を update
%gem update --system
Latest version currently installed. Aborting.
最新。
いざ bundle install と思ったら
%bundle install
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  1.9.2-p320
  1.9.3-p194
入ってない。入れる。
%gem install bundle
さらにもう一度 bundle install と思ったら
%bundle install
Bundler is not compatible with Ruby 2.0 or Rubygems 2.0.
Please upgrade to Bundler 1.3 or higher.
なんか 2.0互換無いっぽい。gem install bundle で入った bundler は  1.2.4 で
Ruby 2.0 で bundler を使うには 1.3 以降を入れたら良い らしい。ので
$ gem install bundler --version '1.3.0.pre'
いざもう一度 bundle install。
いろいろ入ったので大丈夫っぽい。 mysql の native extention の compile はコケたけれどこれは bundler 側の問題じゃないよね……?
bundle install できたので openssl も有効であると勝手に判断。最低限、古くはなさそう。
一応 irb で requre 'openssl'  すると true 返ってきたから良いのかな。
その辺分かる方いたら教えて欲しいです。 ruby が見てる openssl の path 表示方法とか。

という訳でなんだかんだしながら --enable-shared な 2.0.0-p0 のビルド完了。
2.0.0 でほげほげする前に大分時間食った感。
brew だと brew install ruby --enable-shared とかで良いのかな。 rbenv さんもその辺サポートしてくんないかな。
あと、1.9.3だと gcc のversion は組込みだと落ちたのに、2.0.0だと通ったのも気になる。大丈夫かな。

まー、今のところ問題無し。何もしてないので問題の発生しようも無いけれど。

2013/02/23

brew な git で zsh の補完が効かなくなった

brew で入れた git を使っていて
$ git add hoge<tab>
とかすると
(anon):6: command not found: __git_main
とかエラーが出て補完できないなど。

こちら を見るとどうやら補完用のスクリプトがちゃんとリンク貼られているかが問題な様子。

$ brew unlink git
$ brew link git

でリンクを貼りなおすと復活。
ログは残ってないけれど、 unlink が 214 で link が215 くらいなので一個消えてたっぽい。
brew cleanup で prune されたのが1つあったよーな気もしたので、それで消えたのかな。

2013/02/21

ひさびさに Okinawa.rb Meet Up に行ってきた

ひさびさに Okinawa.rb Meet Up に行ってきました。

ブログに書くまでが勉強会らしいので書いてみます。

@_siman_ さんについてってひさびさにギー沖へ。
ひさびさすぎてボケーっとしてたら _siman_ さんが AtCoder の D問題難しいですよねみたいなことを@tompng さんとしてたので横で考えて唸ってました。唸るだけで全然分からない。

その後くらいから@kimihito_ さんが discourse のソース読もうぜー、してたので読んでるのを眺めてました。
@hanachin_ さんがテレビにMBA繋いでソース解説。 いつの間にかsubl使いに。あとdivvy。

discourceのソースが膨大だったので Gem 覗いたり、Chrome の Developer Tools で要素とかnetwork でアクセスが飛んでる URL から method 検索したりでいろいろ見たこと無い操作多し。WebWebしい感じ。

あとは @naopontan さんが Okinawa.rb in 北谷 的なやつでやったペアプロなあみだくじ 読みとか。ペンさんのデバッグがマッハ。

ペンさんといえばjsでそれっぽい背景を生成するの作ったよー、ってことでそれの解説をきみひとさんにしてるのを横で聞いてたり。数学ー。

ちなみにそのあと、あみだくじの実装が思い浮かんだのでついカッとなって実装して今では公開している

とりあえず一言まとめ
  • siman さんが競技プログラマ
  • はなちんさんが Gem master
  • ペンさんがマッハ 
  • きみひとさんがくるくるしててなんかソース読もう読もうしてる
  • うあー、数学かー

んで、RubyなTipsということで正規表現のキャプチャをそのまま変数に入れたりできる方法をはなちんさんから紹介されるなど。
/(?<variable>< regexp>/ みたいな感じ。テキトーに書いた例題はこんな感じ。
なんか ?<> は String の #{} みたいな感じで読むと良いのかな。
あと、和暦西暦変換で H とか M とかで変換できるよ、みたいなのもあるらしいです。



それと、来週木曜から ryudai.rb やる、ということで偵察に来てた意味合いもあったのですけれどテレビ見てわいわいしてた感じ。なんかWebWebしい系多かった。
個人的には割と Rails or Ruby なら Ruby の方やってみようかなー、といった感じなので偵察失敗。Web分からないだけとも言う。
スパイは「偵察しに来た」とは言っちゃいけないなー。
ちなみに「良い本ありませんか」の答えは「Land of Lisp」でした。Lispかー。

さて意外と長くなったしリンク多いな。
blogger横幅大きくないかなー、どこで設定するのだろ。

とりあえずひさびさの Okinawa.rb はこんな感じでした、と。

2013/02/19

ruby 1.9.3 の rubyinterp を有効にした最新の Vim を brew でビルドする

rbenv + brew な環境で、rubyを入れて HEAD のVimをビルドしていると
:ruby puts RUBY_VERSION
するとSEGVでVimが落ちてしまう現象が発生。
Mac標準の /usr/bin/vim だと落ちないのでどうやら自分でビルドしたのが問題みたい。
原因がbrewなのかrbenvなのかruby-buildなのかrubyなのかVimなのか分からなかったけれど一応解決したので。


環境
  • OS X Mountain Lion
  • XCode 4.6.2
  • Homebrew 0.9.4
  • gcc 4.7.2
  • rbenv 0.4.0
  • ruby-build 20130208
  • Vim  7.3.822  
  • ruby 1.9.3-p385


こちら の記事を見ると、どうやら ruby のdylibが無いのが問題の様子。
rbenv global の ruby を見ると確かに無い 。
$ ls ~/.rbenv/versions/1.9.3-p374/lib/
libruby-static.a
libyaml-0.2.dylib
libyaml.a
libyaml.dylib
libyaml.la
pkgconfig
ruby

ruby をビルドする時に オプションを指定  すると良いらしく、渡し方は こうらしい
今回は --enable-shared のみを有効化してみる。

なので
$ env CONFIGURE_OPTS="--enable-shared" rbenv install 1.9.3-p385
したけれどmakeに失敗。どうやら cc が問題らしい。

XCode 4.6 の Command Line Tools の gcc 4.2.1 じゃ make できない様子。
brew を使って gcc 4.7.2 を gcc-4.7 という名前で入れていたのでそっちを使ってみる。
Web 見てると env があるのと無いのがあるので消している方でも試す。
$ CC="gcc-4.7" CONFIGURE_OPTS="--enable-shared" rbenv install 1.9.3-p385
これだと通った。

ライブラリを見るとちゃんとdylibがある。
$ ls ~/.rbenv/versions/1.9.3-p385/lib/
libruby.1.9.1-static.a
libruby.1.9.1.dylib
libruby.1.9.dylib
libruby.dylib
libyaml-0.2.dylib
libyaml.a
libyaml.dylib
libyaml.la
pkgconfig
ruby
そっちを使うようにしてから
$ rbenv global 1.9.3-p385
 最新のVimをbrewでビルド。ちゃんと通った。
 $ brew install --HEAD vim
 そして確認
:ruby puts RUBY_VERSION
#=> 1.9.3 
動いてる。やたー。


今のところオムニ補完とかで文句も出ていない。
CONFIGURE_OPTS を自分で指定した ruby は始めて使うけれど、大丈夫かなー。
Vim の rubyinterp が 1.9系に対応してるのかとかも気になるけれど、とりあえずビルドできたのでこれで良いかな、とか。

ちなみに最初のlsが 1.9.3-p374 なのは p385 のlsを取る前にp385を消してしまって、ブログのログ用にp374で代替したからだったり。
一応p385の時点でもdylibは無かったです。