2014/12/27

私の git の参考文献とか使い方とかまとめ 2014

git どうやって勉強したのさー、って質問が。
参考になるかはともかく私の最近の git の使い方についてまとめてみます。
このコマンドはどういう挙動をします、って話ではなくて、どんな時に使う、くらいのまとめです。
調べるためのキーワード提供にでもなれば。


参考文献とか考えとか

  • staging とか workspace とか commit とか : どこだっけ。ちょっと覚えてない。
  • rebase とか –no-ff の知識 : こわくない git かな。 基本的に git の話するときはこれを勧めてます。
  • tips とか : ここ とか。必要になったら調べる感じ。
  • branching model : 過去のログを見るとここを参考にしてたみたい
  • branching model : 複数人数で git を使う時の自分の中ルールだと
    • master には直接 commit しない
    • origin/master への push -f は最終手段
    • merge は master に対して –no-ff
    • conflict の解消は branch での rebase で解決する
    • github を使ってるなら merge は pull request で、 conflict したら branch で rebase 
  • commit message とかの話 : ChangeLog を支える英語


基本的に使うコマンド

  • git init
    • リポジトリ作る。
  • git ( add | mv | rm )
    • ファイルの追加とか移動とか削除とか。
  • git st
    • status を見る。面倒なので alias かけてます。
  • git commit
    • コミット。
  • git log
    • ログを見る。2.0 くらいから特に設定しなくても色が付くようになってうれしい。
  • git diff (–cached)
    • diff を見る。
    • diff で commit と workspace 間の diff。 add してなかったらこっち。
    • diff –cached で commit と staging 間の diff。 add した後に diff りたかったらこっち。
  • git fetch
    • remote から変更を取ってくる。
    • commit してない変更がある時とか、ローカルブランチで作業してる時に変更が欲しかったら fetch
  • git pull
    • remote から変更を取ってくる + 変更を反映する
    • master で変更を取ってきたいなら pull で良いかな、くらいの使い方
  • git clone
    • リポジトリを clone する
    • github は https:// を clone すると毎回 password 聞いてくるので git:// で clone すると楽
  • git merge (–no-ff)
    • branch を merge する
    • 私は master には直接 commit せずに –no-ff する主義。
  • git branch (-a | -d | -D )
    • ブランチを見たり作ったり
    • -a で remote も含め全部。
    • -d で削除。 -D で強制削除。
  • git co ( -b | -f )
    • checkout する。面倒なので alias かけてる
    • 最近 branch するのが面倒なので -b を良く使う気がする
    • 作業前の状態にしたいやー、って時は -f を使う。
    • stash でも良いけれど本当にいらないと思うときはこっち。
  • git reset
    • add したやつを戻す。
    • soft reset, hard reset がある
  • git rebase -i
    • rebase は -i を良く使うかも
    • master から派生した branch にいる時は rebase -i master が楽
    • conflict したら –abort 諦めるくらいの軽さで commit の入れ替えとかたまにやる。
    • 最近は commit –amend するより commit して rebase -i で fixup とかする
    • fixup と rewind で –amend みたいなことができるし良いかなーといった感じ
  • git remote ( add | rm )
    • そんなに使わない
    • clone すると origin があるので基本はそれを使ってる
    • fork したリポジトリの upstream を設定する時くらい


あると便利

  • git grep
    • リポジトリ内を grep する
  • git ls-files
    • リポジトリに入ってるファイルの一覧
  • git remote prune origin
    • remote に無い branch を local でも消してくれる
    • branch -a がうるさく無くなるのでちょっと快適
  • git reset –hard
    • 最終兵器。
    • 間違って master に commit した時に checkout -b して reset –hard HEAD^ とか便利
  • git reflog
    • rebase, merge にミスった時はコレ
    • reflog 漁って git reset –hard で大体解決する
    • ので gc は設定で切ってたりします。コマンド打つと勝手に gc して止まるのも何だし。
  • git stash ( pop | apply |save )
    • workspace の変更を一時保存
    • 軽量 commit みたいなものだけれど最近は commit + rebase してしまうかも
    • この実装でいけるか怪しいけれど一応は保存しておきたい、くらいの時に save するかなー、くらい
  • git bisect
    • エンバグした時に便利
    • 動いてた時と動いて無い時を指定して、動かなくなった commit を特定するやつ
    • これをまともに使うためにも master は必ず動く状態の commit のみで構成したい理由はコレ
    • コンパイル通らない、とかだと bisect できない
  • git cherry-pick
    • 特定の commit を拾ってくるやつ
    • master に特定の commit があるなら rebase で拾うけれど
    • 欲しい commit が他 branch でそれ以外の commit を拾いたく無い時とかに使う
  • git archive
    • repository を zip とかにできる
    • なんか提出する時とかに使ってた記憶。そんなに使わないけれど特定の人達には需要あるかも

2014/12/14

ghc 読み会に参加してみた

コンパイラの講義で行なわれた ghc 読み会に紛れ込んできました。2014/12/06と07。

まずは ghc の内部構造の話から。
ここ を参考にしながら ghc がどのような流れでバイナリを吐くのか、みたいな話とか。
まずは Core に変換されて、STG に変換したあと LLVM なり gcc なりのバックエンドで実行コードを吐く、みたいな流れみたいです。
Core は Haskell でついてる型からどうやって Primitive 型に変換するか、みたいなのも処理する様子。
あと型変数とかも処理するので、関数に型を渡したりもできる言語っぽいです。
ほとんど Agda みたいに見える。
case で実行するので、 case を使う場所によって遅延評価にしたり正則評価にしたり変えられるみたい。
Core の定義そのものはシンプルっ。Exprは6種類しか無いとか。
ただ ghc 自体は 200k 行とかあって、シンプルな言語だとしても処理系側でカバーしてるだけなのかなー、とか。Core しかり Haskell しかり。
あとは Haskell はグラフだぜー、とか要素いろいろ。良い資料っぽさげ。


次に実際にデバッガで追っていこう、ということに。
Vagrant で box 作ってその中で実行したのでログとか。
  • $ vagrant init chef/ubuntu-14.04
  • $ vim Vagrantfile
    • メモリとか CPU 割り当てとか編集
  • $ vagrant up
  • $ vagrant ssh
  • $ sudo apt-get update
  • $ sudo apt-get install git cabal-install vim
  • $ sudo apt-get build-dep -y ghc
  • $ vim ~/.bashrc
    • export PATH=$HOME/.cabal/bin:$PATH
  • $ source .bashrc
  • $ cabal update
  • $ cabal install cabal-install
  • $ cabal install happy alex
  • $ git clone git://github.com/ghc/ghc.git
  • $ cd ghc
  • $ ./sync-all -r git://github.com/ghc get
  • $ perl boot
  • $ ./configure --with-ghc=/usr/bin/ghc
  • $ vi mk/buil.mk
    • buildFlavor を devel2 に
    • GhcDebugged = YES を末尾に
  • $ make MAKE="make -j" -j
    • 1時間くらい。付けなかったら3時間とかかった
  • $ sudo make install
  • $ ghci -fobject-code -cpp -DSTAGE=2 -I. -I./stage2 -I./stage2/build -illvmGen:prelude:cbits:specialise:stranal:coreSyn:stgSyn:basicTypes:main:stage2:iface:simplCore:simplStg:cmm:types:codeGen:typecheck:profiling:parser:rename:utils:nativeGen:hsSyn:deSugar:ghci:vectorise:stage2/build: main/DriverPipeline.hs
    • すると .o ができる
    • DriverPipeline は読みたいので DriverPipeline.hi を消して
  • $ ghci -cpp -DSTAGE=2 -I. -I./stage2 -I./stage2/build -illvmGen:prelude:cbits:specialise:stranal:coreSyn:stgSyn:basicTypes:main:stage2:iface:simplCore:simplStg:cmm:types:codeGen:typecheck:profiling:parser:rename:utils:nativeGen:hsSyn:deSugar:ghci:vectorise:stage2/build: main/DriverPipeline.hs
    • で b compileFile できる
  • $ s <- SysTools.initSysTools (Just "/usr/local/lib/ghc-7.9.20141205")
  • $ env <- HscMain.newHscEnv $ DynFlags.defaultDynFlags s
  • $ DriverPipeline.compileFile env (DriverPhases.Hsc DriverPhases.HsSrcFile) ("/home/vagrant/hoge.hs", Nothing)

とりあえず compileFile って関数があるので呼んでみよう、というログが上のもの。
ghc の main を直接 ghci で実行すると、「今呼んだらもう遅い」みたいな abort で落ちたので main 以外を実行しようとして見つけたのが compileFile 。
stage 2 の ghc の library とかを使って ghc の DriverPipeline.hs なるソースを読もうとしたログ。

読もうとした時に問題発生。
そもそも Haskell ってどうデバッグしたり追っていくものなのだろう、という疑問。
調べると ghci が出るんだけれど、 ghci の trace って読むために使うものだろうか。
とりあえずそれ以外の選択肢は無かったので ghci で実行してた。

実行することはできたのだけれど問題がいくつかあって
  • -I の指定順とか結構謎。オプションの順番変えると動かないとかあったり。
  • .o がある .hs を ghci で読み込むと、そのファイルの関数に break point が付けられない
  • けど -boot file は .o が無いと参照できないので .o を作らないといけないソースもある
  • 実行するためには HscEnv とかが必要なのだけれどそれを作るのが大変
とか。追おうにも追いづらい。
test から見ようにもテスト単位がユニットごとじゃなくて全体用のテストのみで単体の動作を追うのも無理。
Haskeller の人達ってどうやってデバッグ やソースコードリーディングしているのだろう。
あと、小さい単位に分けたりしなくても大丈夫なのだろうか。テストとか。HscEnv とか。(値が20個とかある型だった)
型チェックとかでどうにかしてるのかなー。その辺りの情報が謎。
ghc の Travis とか見たら結構 build コケてたりしていて実際どうやってるのか不安。

最後には Parser や Lexer をソースから読むことに。
Alex とか Happy とか使いつつ。
Parser も実際に動かすことはできなくて、 Haskeller はどうやってデバッグしてるんだろうか、というところでタイムアップ。

結局 Haskeller はどんな風にデバッグしたりソース読んだりテストしたりするのだろう、という疑問が募っておしまい、という感じ。
Core の構造とかを知ることができたのが収穫かなー、といったところ。

2014/11/05

コーディングを支える技術 を読んだ

コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 を読みました。

プログラミングにおける機構の成り立ちとかを解説してくれる本でした。
if 文は何故あるの、関数は何故あるの、型は、スコープは、... みたいなことを「こういう経緯があって、この言語はこういうアプローチで解決した」という歴史を教えてくれる。なので、機構の名前と機能だけを解説するのではなく、むしろこういう経緯があったんだよー、って話の方がメイン。

取り上げられているトピックも多岐に渡ります。表紙に書かれている要素を列挙すると、演算子、繰り返し、関数、例外、スコープ、動的型付け、型推論、配列、辞書、スレッド、ロック、トランザクショナルメモリ、クラス、インターフェース、継承、委譲、C3線形化、Mix-in、トレイト となっています。かなりの範囲をカバーしてそう。

あと、複数の解決方法を知ることができるので、言語Aの機構Bは言語Cの機構Dと似ててここが違う、とかが分かるのも良いところ。例えば Ruby の Hash は、他の言語では Dictionary  だったり HashMap だったりとか。

さらにおもしろかったのは、同じ単語に対して異なる解釈があること。
私は Ruby をよく使っているので「オブジェクト指向」と言えば「オブジェクトにメッセージを送ることによってオブジェクトそのものに振る舞わせる」ことだと解釈するのですが、C++では「オブジェクト指向」と言えば「ユーザ定義型であるクラスによる処理の再利用」となっていたり。オブジェクト指向に限った話で言えば Perl での処理の共通化、 JavaScript での prototype など、言語による解釈や実装がいくつもあるのだなー、と。

読む前は「オブジェクト指向はクラスだ」という言葉は「なんでメッセージの話が出ないんだろう」と思いましたが、「(ある言語における)オブジェクト指向はクラスだ」みたいに主語が隠れてるんだろうなー、と。
そういう意味でも、自分の知ってる言語の機構名だけで考えるんじゃなくて成り立ちを知ることや他の言語を知ることには利点がありそうだなー、とか。

この本で機構そのものを学ぶというよりは、今までそんなに意識せずに使っていた機構にまつわる経緯は何なのか、とかを知る本です。
なので、ある程度プログラミング言語に触ってから読むと、おまじないにしていた謎が解けたりするかもしれません。
プログラミング言語の勉強の始めに読むのには向いてないけれど、言語の勉強に詰まった時や歴史を知りたい時とかに読むのが良さそう。

2014/10/25

Vimperator が Mac で素直に make できるようになった話

Vimperator を Mac で make する時は、GNU の sed とか使わないといけなかったので記事 を書いてたのだけれど、素直に make できるようになった。

手順

  • git clone git://github.com/vimperator/vimperator-labs.git
  • cd vimperator-labs
  • make
  • open -a 'firefox' downloads/vimperator*.xpi
前回の記事で紹介した時は Google Code の mercurial repository だったのだけれど、いつの間にか Github に移ってるので git で。
make するだけで downloads の下に vimperator の最新版が手に入るようになりました。便利。

経緯

前回 pull request を送った時に取り込んで貰ったけれど、最新版が make できなくなってました。
どうやら xargs と find を Make 時に使うようなったけれどそのオプションが GNU の find と xargs にしか付いてなくて、Mac の default のものだコケるみたい。

findutils とかを入れて対処しようにもコマンドがベタで書かれてるので、その部分を変数にして、せめて環境によってコマンド名変えさせてくれー、って言ってみた
そうしたら、GNU への依存を消してくれたので make が楽に。ありがたい。

2014/10/13

Vimperator in Mac で C-[ とかが効かなかくなっていたので修正してみた

普段のブラウジングは Vimperator を使っているのですが、いつからか C-[ で Escape できなくなってました。
なんか面倒臭いなー、と思ったらソースが Github で公開されているっぽいので修正して Pull Reqest を投げてみたら merge されたやったー、というお話。

環境

Mac OSX 10.9.5
Firefox 32.0.3
Vimperator(22faadf35b32fb7d31cac323a5206c104efc4b6f)

Vimperator の key handling

ソース読んでたら、打たれたキーは最終的に toSttring される みたいで、 ctrlKey は押されているかー、とかkeyCode は何かー、とかチェックしている様子。
それで整形されて String になって処理が続いていく様子。たぶん map とかを replce するために文字列化とかしているのかな。

それはさておき、Mac の Firefox にはバグがあるっぽくて、コントロールを押すと keyCode が変わってしまうので、その場で対処している、とのこと

Firefox in Mac での KeyCode 調べと修正

window.addEventListener('keypress', function(e) { window.hoge = e; }, false);
とかして今の Mac の keyCode を見るとこんなんだった。

] keypress Control { target: <body#gsr.hp>, key: "[", charCode: 0, keyCode: 219 }
- keypress Control { target: <body#gsr.hp>, key: "-", charCode: 0, keyCode: 173 }
_ keypress Control-Shift { target: <body#gsr.hp>, key: "_", charCode: 0, keyCode: 173 }
\ keypress Control-Shift { target: <body#gsr.hp>, key: "_", charCode: 0, keyCode: 173 }
^ keypress Control-Shift { target: <body#gsr.hp>, key: "^", charCode: 0, keyCode: 54 }
全然違ったのでそれぞれで動くように ad-hoc な if 修正やら switch を追加やら
んで C-[ でちゃんと insert も抜けるようになったし

inoremap <C-]> ]]]
inoremap <C--> ---
inoremap <C-_> ___
inoremap <C-\\> \\\
inoremap <C-^> ^^^
とかも動くようになたので、C- 付きの記号5つの対応はできたっぽい。

オチ

どうせなので Pull Reqest にすっかー、ってなことで投げたら merge された。やったー。

C-[ が使えなくて困ってる Mac User の方、直りましたよー、って言おうとしたけれど build がコケる。
一応それも原因は分かったのでまた Pull Reqest 投げてます。merge されたらまた記事を書くはずなので解説はその時

2014/10/04

Windows で管理していた mp3 を Mac の iTunes に import する時の文字化けへの対処

Windows で管理していた mp3 を Mac の iTunes に import する時の文字化けへの対処です。
タイトルからして長いけれど、紆余曲折して結構長い話。


そもそもの経緯

  • Windows で mp3 の音楽を管理していた
  • tag の encoding とかは気にしてなかった(というかたぶん当時知らなかった)
  • その Windows を数年くらい放置(なので Windows の iTunes はとても古いはず)
  • データだけ NAS に移してマシン放棄
  • NAS から mac に音楽を import すると文字化けしているさあ大変

問題と面倒な部分

  • mp3 の tag が SJIS
  • iTunes 11 on Mac は Latin1 と ASCII と UTF8 しか対応していないらしい
  • 文字化けをどうやって変換するか

先人達の対処方法


試した対処方法とその結果

  • iTunes によるタグ変換
    • どう変換かませても無理だった
    • UTF8 を修正だろうと latin1 -> ASCII だろうと化けてる
  • id3v2 による変換
    • シェルスクリプト書いて変換してみた
    • "TALB" "TIT2" "TPE1" を SJIS から UTF8 に変換
    • しても iTunes は認識せず
    • というか iTunes できちんと認識されている日本語のエンコーディングが謎
    • id3info を grep して nkg -g すると ASCII 扱いになってるので id3v2 じゃ無理っぽい
  • mac 上で SJIS サポートしてるソフトを使う
    • 有償だった
  • Win機で変換してから送ってくる
    • Win機が無い。

最終的な対処方法

  • Wine + SuperTagEditor
Win機無いならエミュレートすれば良いじゃない状態。というか Mac さんなんかその辺りの解決方とか用意ないのかなー。

環境


Super Tag Editor を起動するまで

  • brew install wine
  • wget https://gist.githubusercontent.com/mattintosh4/6591305/raw/b86e0a9b6132aaa8b6cb5febf7255d60f6c0375a/osx-wine.inf
  • wine osx-wine.inf
  • export LC_ALL=ja_JP.UTF-8
  • wine SuperTagEditor.exe
まず wine を入れます。参考にしたのはここ
設定ファイルを作ってくれた方がいらっしゃるようなので、 gist から落としてきて実行。
あと locale が ja_JP じゃないと豆腐が出てきたので export してから実行。別に LC_ALL=ja_JP.UTF-8 wine SuperTagEditor.exe とかでも良いんだけれど。
そして落としてきた SuperTagEditor を実行する、と。

Super Tag Editor で Tag Info を直す

  • ファイルを選択
  • 変換 > ID3v2 形式に変換
  • 変換 > ID3v2バージョン/文字エンコードの変換
  • v2.4/UTF-8 にする
どうやら手順としてはこんな感じらしい。一旦 v2.4/UTF16 してから v2.3 にするって謎の手順を推奨する方法もあるみたいだけれど。とりあえずこれでどうにかなった。

まとめ

  • SuperTagEditor で ID3v2 tag を 2.4/UTF-8 にすると良い
  • 正直 Win でやった方が楽そう
  • 最悪 wine でもどうにかなったけれど

結局の結論

  • Windows から Mac に音楽を移す時は Windows 側で id tag を v2.4 とかにしてから移しましょう
  • Mac 側でやる手段は割と無いっぽさげ?

おまけ

この記事を書いてる時に python で実行できそうな文字化け修正方法を見つけたりした。
というか参照記事とかの年とか、やってることが何年も前のことしてる気がした。

2014/09/22

Kernel/VM探検隊@沖縄 に行ってきた

2014/09/21(Sun) に Kernel/VM探検隊@沖縄 があったので行ってきました。

いわゆる低レイヤーとかておい人達の集まりらしい Kernel/VM が沖縄でもやるらしいやったー、てな感じで行ってきました。

とりとめもなく列挙していくと

過激に含まれる C++ 成分、interactive に plot される graph、発表中に消えるPC、 Terminal なのに出てくる画像、セキュリティポリシな上から目線(?)、Linux kernel reading by gbd + qemu-kvm、 セキュリティフィックスだけになっちゃった ELILO、突然のMonad、計算機(物理)、lisp祭りとツッコミ祭り、Kernel探検 to CPU Idle Time、とつぜんの 98 とか Windows NT

という流れ。発表聞いた身からするとだいたいあっているのだけれど列挙だけするとカオスっぽい。

個人的にておかったのは @fadis_ さんの LLVMで後からコンパイルするC++ ですかねー。
コンパイル時の型チェックをぶん投げて実行時型チェック+実行コード生成。
実行時にコンパイルするという謎の手法でした。
C++分からない+レイヤ低いの分かないので若干謎。
利点があるのかもしれないけれど型チェックぶん投げてるので何そのコンパイラ再実装ー、って感じでした。


懇親会ではぱいかじ。
懇親会で話を聞いてて思ったけれど kernel level のレイヤはそんなに触ってないので異文化っぽかったかなー、と。
Serial の話とかを当然のようにしたりするけれどあまり分からなかったりなので。
ボードとか触るぜー、みたいなことやってないなー。
何気に型の話が結構あって気になるんだけれど型なー、ってなったりした Kernel/VM でした。

2014/09/21

Slack + github + Travis CI で gem の開発環境を作ってみた話

noir って gem を作ってたりするのですが、テストは書いているけれど CI 回していなかったので Travis CI を導入してその通知を Slack で受け取る、みたいな環境にしてみた忘備録。


Slackの導入

Slack は開発用のチャットみたいなサービスらしいです。
各 room ごとにメンバーは招待制。
github や Travis CI といったサービスとの連携がデフォルトで結構できるようになってます。

まずは Slack からアカウントの作成。
company なんてものは無いので atton で作ってみる。
そうすると atton.slack.com とかでアクセスできるようになるみたいです。
そこから room の作成。 今回は noir にしてみました。
ちなみに公式のクライントが Mac, iOS, Android ともにあるみたいです。

github 通知の導入

room 名から Configure Integrations を押すと導入する一覧が出てくるので github を選択。 
github でサインインして通知する channel を選択。
通知用の notifications channel を作っておいたのでそこを選択。
すると push したりするとその channel に通知が流れてくるようになります。

Travis CI 通知の導入

また Configure Integrations を押して Travis CI を選択。
Travis CI の場合は .travis.yml に設定を書いてねー、と言われるのでそれに従う。
今回は notification channel に通知を送りたいので
$ bundle install travis
$ travis encrypt "company_name:token" --add notifications.slack
 を設定。そうするとテストの通知が流れてくるようになりました。便利。


Slack の notification 設定が細かくて結構便利なので暫く使ってみようかなー、ってしてます。
何気に Travis CI の設定ログとか書いてないのでそこもあとで書くかなー。

2014/07/29

Agda を HEAD から build する


brew で gcc と ghc の version を上げたら Agda が build できなくなったので repository から build したおはなし


環境

  • Mac OSX 10.9.4
  • Homebrew 0.9.5 (bd3217ea598e9ccf85bb5b1f5ac244f1641378f8)
  • gcc 4.9.1
  • ghc 7.6.3 (brew 的には 7.6.3_3)
  • cabal-install 1.20.0.2 (installed by homebrew)
  • cabal-install 1.20.0.3 (installed by cabal-install)


経緯

一旦 cabal を消して gcc と ghc の version を上げる
  • brew uninstall haskell-platform
  • brew upgrade gcc
  • brew upgrade ghc
  • rm -rf ~/.cabal ~/.ghc
  • brew install haskell-platform
そして cabal で agda を入れる
  • rehash
  • cabal update
  • cabal install cabal-install
  • rehash
  • cabal install agda
と、こんなエラーが。

src/full/Agda/Utils/Cluster.hs:50:10:
    Duplicate instance declarations:
      instance Monad m => Functor (EquivT s x y m)
        -- Defined at src/full/Agda/Utils/Cluster.hs:50:10
      instance Functor m => Functor (EquivT s c v m)
        -- Defined in ‘Data.Equivalence.Monad’
cabal: Error: some packages failed to install:
Agda-2.4.0.1 failed during the building phase. The exception was:
ExitFailure 1

調べてみると依存パッケージの equivalence に 0.2.4 から Agda と重複する内容が入ったらしいです

解決方法としては equivalence を downgrade するか Agda の該当部分を排除しろ、とのこと。


HEAD からの build と haskell-platform からの脱却

stack over flow に書かれてるっぽいのでおそらく HEAD では修正されてないかなー、ということで repository を落としてみる。
  • cabal info agda
の Source Repo に github があったのでそれを clone。

あと brew 側で haskell-platform ではなく cabal-install を使ってみたり。
何故か依存が自動インストールされなくて happy と alex を入れたりもした。
結果的に実行したコマンドは以下な流れ。

  • cabal install happy
  • cabal install alex
  • git clone https://github.com/agda/agda.git
  • cd agda
  • ./configure
  • make

make すると cabal install が走ってくれるみたいで結果的に実行ファイルがきちんと .cabal に入ってた。
ちなみに記事を書いた時点での HEAD は a11a5fb9fc8421747f50d0280c3afe650acd4f1b で Agda の versioning は 2.4.1 扱いになってました。


brew で gcc の install から実行するとなると
  • brew install gcc
  • brew install ghc
  • brew install cabal-install
  • rehash
  • cabal update
  • cabal install cabal-install
  • rehash
  • cabal install happy
  • cabal install alex
  • git clone https://github.com/agda/agda.git
  • cd agda
  • ./configure
  • make

ってな感じでしょうか。

とりあえず Agda 2.4.1 がリリースされれば問題無く build できるはずなので、それまでの間で発生しちゃう問題っぽさそうです。

2014/07/28

3Dプリンタを使ってHDD用のスタンドを作ってみた

縦置きのHDDを買ってみたは良いものの、スタンドがある訳でも無くて若干不安定っぽい。
専用スタンドがある訳でも無いのでどうせなら作ってみよう、ということで3Dプリンタで作ってみました。

3Dプリンタでは .stl というフォーマットのファイルをプリントできるっぽいです。
.stl は3つの座標を指定して作成できる三角系の組み合わせでモデルを構成しているらしいです。
その .stl を ruby で生成する コード を @tompng さんが作ってくれていたので、本人に許可を取って拝借して HDDスタンドを生成するスクリプトを作ってみました。ありがとうございます。

3Dプリンタは某工学部にあるものをお願いして使わせてもらいました。ありがとうございます。

こんな感じ





「無いなら作れば良いじゃない」感あって便利。

2014/07/20

オープンキャンパス2014

2014/07/19 に オープンキャンパスがありました。

今回は

  • Programming3 で作品3つ
    • OpenCV で光を認識してレーザーポインタで絵が書ける
    • 丸を認識してダンボーを表示するAR
    • Kinect でお絵描き
  • IGDA琉球大学からゲームとかの紹介
  • 研究室より分散ネットワークフレームワーク Alice
を展示してました。


参加者は午前が多め。午後は少なめでした。

午前は人が多かったので、ポスターなりなんなりがあると良さげかなー、とかやってました。
  • デモが見られない人用にディスプレイの横にポスター置くとか
  • あとディスプレイはミラーリングして横に置いてるだけでも見える人増えそう
実際見てる側がどうだったのかはちょっと分からないけれど。

あとは午後は人少なめだったので、テンプレみたいなのができあがってた
あっち行ってー、次はあっちでー、みたいな
私としてはブースの配置とか説明して好きなところ行けー、みたいなことをしたかったれどコントロール大変そう。どっちが良いんだろうなー。



今回は「はーい実行委員通りまーす。はーい実行委員でーす」ってな感じで連絡とかそういったことがメインで発表とかは無しでした。
みなさん協力的だったのでありがたかったです。

さて来年は誰が来ますかねー。あと programming 3 の作品もどうなることかな。期待ですね。

2014/07/14

ポインタの話をしていたらいつの間にか 配列の初期化 とか glibc の printf とかを読んでいた話

2014/07/13 にとつぜん @y0t4 さんと「ポインタを一年生にどう解説するか」みたいな話をしてたと思ったら想定外に長話 + 長旅になったのでつらつらと。


char* の初期化の話

C で char* を初期化する時に

とかするじゃん、という話になって、これはどう動いているかというと
  • (char *) の hoge が作られる
  • "" なのリテラルがメモリに展開される
  • その先頭アドレスが hoge に代入される
という話になって、それじゃ実証しよう、ということで 
  • a.out を objdump -d
  • main とか探すと
    •   4004cc:       48 c7 45 f8 e8 05 40    movq   $0x4005e8,-0x8(%rbp)
  • とかしてるので、 0x4005e8 くらいが怪しいだろう、と
  • objdump -D して  0x4005e8  を見ると
    • 4005e8:       66                      data16
    • 4005e9:       75 67                   jne    400652 <__dso_handle+0x72>
    • 4005eb:       61                      (bad)  
  • となっているので "fuga" っぽい。
    • [2] pry(main)> 'fuga'.chars.map{|c| c.ord.to_s(16)}
    • => ["66", "75", "67", "61"]
  • ちなみにこのアドレスは .rodata っぽいっすね。
  • ということで、 "" は一旦どこぞに展開されてからその先頭アドレスが返る、という認識であってるやー、という一段落


char[] の初期化の話

とまでなったところで、じゃあいわゆる「ポインタなんて配列とほとんど同じだよー」なんて発言に対抗することに。
char[] の初期化だと

とかするじゃん、ということで char* の初期化との違いは?ってなことに。
実行すると fuga が出ることは同じなんだけれど。
  • a.out を objdump -d してみると
    • 4004c8:       48 83 ec 10             sub    $0x10,%rsp
    • 4004cc:       c6 45 f0 66             movb   $0x66,-0x10(%rbp)
    • 4004d0:       c6 45 f1 75             movb   $0x75,-0xf(%rbp)
    • 4004d4:       c6 45 f2 67             movb   $0x67,-0xe(%rbp)
    • 4004d8:       c6 45 f3 61             movb   $0x61,-0xd(%rbp)
    • 4004dc:       c6 45 f4 00             movb   $0x0,-0xc(%rbp)
  • こっちは "fuga" を register に入れてってる
  • ということで配列の初期化は要素が1個1個入れられていってる
  • "" みたいに data として確保されるわけじゃなくて、各要素ごとに処理をしている
ということに。
なので char* はあくまで変数は char* のみで、そこに rodata にある "" のアドレスが入ってる。
char[] は array として確保されてる領域に 1つ1つ入れてる。

ちなみに私は C に string って無いから "" の syntax 自体無いものだと思い込んでいて、内部的に char[] に変換されるような拡張が gcc とかにあるようだと思ってたけれどオプションでは見つけられなかった。
どうなってるかは C99 の仕様とかを読んだ方が良いのかも。


printf の呼び方

ということで、 "" は実際は先頭アドレスとして扱える、というところまで来て、 printf に渡す "" はどうなってるの、ということに。
結局 "" で渡しているので、の中身本体は rodata にあるのだけれど、printf 関数に渡してるのは pointer だから、pointer 渡せるのでは、ということでやってみる。

動く上に当然ながら第一引数の中に %p とかが入っていても展開される。
となった時に、第二引数消したらどうなるの、ということに。
-Wall すると「printf に引数足りないよ」って言われるけれど、ポインタで渡してるからそんなのチェックしてないだろうし、ということでこんなコード。

そして実行。すると毎回違う値が出てくる。
指定してる先が無いはずなのに nil とかじゃなくて違う値が出てくるのはどうして、ということになった。


そして glibc へ

じゃあ printf 読もうぜ、ということになって glibc を読むことに。
yota さんが「最近 glibc make した」とのことで手元にソースが。
printf は stdio.c の中にあると思ったらそうでもなく、  stdio-common にありました。

  • ptintf.c がある
    • vfptinrf に stdout を渡してる
    • たぶん va_start が可変長引数なんだろうなー
  • vfprintf.c に vfprintf がある
    • このあたりから大量のマクロが
      • vim の syntax highlighter の色が変
      • 何気に tabstop=8 の世界
      • あとマクロなので設定上1行
      • これメンテ大変なのでは
    • そして読んでると jump_table ってものが
    • 見るとこれが %s とかの分岐先らしい
    • つまり jump_table にあるのが printf の format option だということっぽい
    • ちなみに JUMP_TABLE_TYPE に飛び先があるっぽいですね
      • これによると REF form_pointer へ jump するっぽい
  • LABEL (form_pointer): から奥
    • fspec の値によって va_arg から取ってくるか args_value から取ってきて ptr に入れる
      • va_arg の方は読んでない
      • たぶん args_value から取ってくるだろう、と
        • args_value は strcut printf_arg
        • これが pa_pointer を持ってる
        • ってことでこいつがポインタっぽいなー
        • void * だし
    • ちなみに ptr が null だったら (nil) って表示するっぽくて
      • ptinrf("%p", NULL);
      • ってやると (nil) って出てきた
      • やったね
    • ptr が NULL じゃなかったら 0x ... って出力してる
      • ちなみに full width character とのかねあいなのか、 is_long とかってオプションが
      • glibc 2.19 だと is_long = 0 だった
      • HEAD だとちゃんと処理が書かれてた
      • blame すると 1995年とかのもある
      • 2014年現在メンテされてるのすごい
    • fspec のはなし
      • prosess_arg って macro の引数
      • 呼んでるのは vfprintf.c の
      • 1635:          process_arg (((struct printf_spec *) NULL));
      • 2004:            process_arg ((&specs[nspecs_done]));  
      • とか
        • たぶん NULL のやつが一番最初の実行。
        • nspecs_done のやつは続いてく処理っぽい。
        • つまり1引数処理が終わると ++nspecs_done されていく
      • specs ってのが struct printf_spec
        • それが nspecs 分ある
        • その n は割と適当で、32とか決め打ちされてた
        • 領域足りなかったらもう一回 alloca とかしてるっぽい
  • つまりどういうことだってばよ
    • fspecs に alloca して printf_arg が入っていく
    • 引数を処理していくと nspecs_done が増えていく
ということで、毎回出力が違うのは alloca したメモリ領域の zero fill されていないゴミの値だろう、という結論に。
つまり前の値が書き変わってなければ同じものが出るんじゃないか、ということで %p を多くしてみる。

そうすると毎回同じ値が出力されるようになりました。
やっぱり確保した領域のゴミっぽいですね

つまり、可変長引数を扱うためにメモリはとりあえず確保しとかないといけなくて、処理した値はそこに入れられる、と。
メモリの値は0にする保証とかは無いので、処理が無ければメモリに入ってた値がそのまま出ちゃう、ということっぽいですね。

書いちゃえばそりゃーそーか、ってなる話なのだけれど、引数があることを想定した段階で関数はその処理を書かざるを得なくて、その処理の副産物みたいなのが垣間見えました。


glibc 読んでてな小ネタ

  • リアル : 「ここを消すと動かなくなる」
    • printf_arg が、マクロの中で宣言されていなくて外で宣言されていて
    •       union printf_arg *args_value;>/* This is not used here but ... */
    • とか書かれてました。
  • do { ... } while(0)
    • なんでこれ括られてるのー、ってなってた
    • たぶんスコープが欲しかったんだろう
    • でも後から { ... } だけの部分とかあった
    • たぶん昔は do 書かないと怒られたんだろう
  • バッファが溢れないようにするには
    • ポインタを説明する時に size 調べて malloc するか、 char hoge[256] とかやった方が良いのか、って話してた最中
    • サイズが足りてなかったら 2倍 alloca する、みたいなルーチンが fspecs のところに
    • とりあえず適当に確保して足りなかったら増やせばええんやー、って
  • 関数だと思ったらマクロだった
    • process_arg ((&specs[nspecs_done]));  
    • prosess_arg って関数が無い
    • マ、マクロだー
    • マクロのメンテって大変なのでは
  • printf とかがあるからそりゃ glibc の依存度ヤバいのでは
    • というか printf がエンバグしたら全部アカンのでは
    • でもメンテしてるのすごい

そんなこんなで気付いたら

3時間ぐらい glibc とかと戦ってました。
このブログも書くのに3時間ぐらい。
いやでもなんだかんだ読んでてこうなるんじゃね、ってのを予想して実行してそれが出た時にはうおーってなりましたまる

最初のポインタについて話をしていは部分は yota さんがまとめてくれたっぽいのであうとそーしんぐ

2014/07/13

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

2014/07/12 にあった ハッカーズチャンプルー2014 に行ってきました。
2013も行ってきたので2回目。今回もカンファレンス + ビーチパーティー 参加でした。

例のごとくとりとめもなく感想を書き続ける。


カンファレンス

全体のプログラムはここなんだけれど、トップなので年ごとに変わってそう。
書いてる段階では無いけれど URL は予想でこうなるんじゃないかなー、とか。

OpenStack なおはなし
OpenStack の詳細分かってないのでなんとなーく聞いてた。
DevOps 的な話なのかもしれないけれど、インフラと開発の狭間って結構大きくなってきたかなー、とか。
Developer は OpenStack 環境があればインフラをぽんぽん立てられそうだけれど、 OpenStack を構築するのは大変そう。その間には大きな狭間がありそうだなー、とか。別に根拠は無くてありそうってイメージ、くらいなのだれど。
あと公式ドキュメントにバグあるとか考えたこと無かったなー、とか。
それを「俺達が踏み抜いてって直してきます」って姿勢すごい。


ウェブ解析士 なおはなし
ウェブ解析士知らなかった。
サービスとかする上でログ解析とかそういったことはやっぱりするのねー、とか。
解析ってどういう手法使ってるのだろう、とか思ったり。何か名前付きで手法化されてりしないのかなー、とか。
コストに見あった成果がありますか、ってのはビジネスでは重要なポイントとかうるさく言われそうだよなー、とかとか。


Data Scientist なおはなし
!= データサイエンティスト。
バズワードっぽいアレでも中の人が詳しく解説してくれるとうれしいなって。
というかデータサイエンティストがアカン感じになったのは組織のマーケティングとか、イメージとかのせいなのかなー、とか。実際何やってるかとかじゃなくて周りがどう見るか的な問題。面倒。
データサイエンティストは、データに携わる人の称号じゃなくて、サイエンティストがなるもんなんですよー、ってのは言われるまで分かんなかった。後者の方が妥当だけれど前者のイメージが多そうだよなー、って。私もそうだったし。
解析にも種類がある、ってのはちょっと乗っかりたい案。厳密なアルゴリズム系のやつと、アドホックな機械学習のやつ。
個人的に機械学習はランダム要素とか入ってくるプログラムなのでなんか趣味が合わないとか思ってて、解析にもそういうランダム要素が無い世界もある、とか言われると少し気になる。いやスパムフィルタとかにも関係あるのかもだけれど。


PostgreSQL なおはなし
PosstgreSQL は拡張しやすいよー、ってところはここまで拡張するのか、とか思った。
データ型定義とか外部言語用のインターフェースが用意されてるとか。
でもDBは標準的な機能しか使ったことが無い(各DB独自機能を使ってない)身からするとDBでそこまでやるのかー、とか。
DBでやった方がパフォーマンスチューニングとかの恩恵があるのかな。
あと、開発コミュニティが盛んっぽい。forkも大量らしい。
そういう意味でも拡張しやすいのかなー、とか。
本家の開発は patch 方式らしくて、 pull request お待ちしてます、とかでは無いみたい。
OSS ごとに文化があるからそれを調べないと、とか誰かがつぶやいてた。Github 使えば良いや、って訳でも無いらしい。これは naoya さんの話にも繋がりそう。


Web の変遷なおはなし
Web の歴史の話から入ったけれど Linux Kernel 2.4 の時代とか分からなかったので、 LAMP 前は分からず。LAMP がギリギリ分かるかどうか、くらいなのでふーむ、とかって聞いてた。
これからの時代はクラウドの外部サービスに委託できるところはしておいた方が自分達のやりたいことできるよー、と。これは次の話にも繋がってそう。
というか紹介している外部サービスめっちゃ多かった。あれってどこで見つけてるんだろう。
とにかく外部サービス入れたら良いわけではなくて、必要な部分入れましょうねー、と。
これは PostgreSQL の話にも繋がってるっぽいなー、とか。自分達のスタイルを見つけましょう的な。 無理して流行りに乗らなくても良いんじゃね的な。
結局バランスっぽい。むずかしい。


これからのエンジニアなおはなし
枯れた技術の水平思考っぽい話なのかな。
4K なんてユーザはうれしいのかー、みたいな。
ユーザ視点で考えてビジネスしようぜー、みたいな。
あと視野狭いとやばいよー、とか。
少子高齢化なんて日本だけだぜー、とか。
感想書いてて思ったけれど割とバッドノウハウから学ぼう、って感じなのかも。


Azure なおはなし
「とつぜんのくらうでぃあさん」
Azure こんなだぜー、って感じ。対比はやっぱり某密林社なのか。
そのあたり使ってないので差分が分かんなかった。
あと開発プラットフォームのサポートとか言語サポートとかが当然のごとくついてるのはすごいよなー、とか。その情報源はタイムラインだけれど。
100万台仮想マシンがー、とか規模がー、とか。


ものづくりマインド + 女性エンジニア なおはなし
ゲームな業界から参戦なさってた。女性エンジニア率が低いのは同じらしくて、継続率も低い。結婚とか出産とかのイベントがあると続けづらいよ、とのこと。その辺りは周りの理解だよなー、とかつくづく。
Jenkins さんはゲーム業界でも仕事してるらしい。やっぱり適材適所で入れてくのが良いっぽいかー。
あとエンジニアのマインドの話。
「泣くな。いやたまに泣いちゃいそうになるの見たことあるけれど。というか泣くならトイレで泣け。」
とのこと。つよい。「母は強し」感ある。
技術についてけないよー、とかもついてけば良いし、ヤバいってなったら会社やめたら良いし、世の中案外そんな感じなのかもしれない。とか言えたら大丈夫なのだろうけれど。

あと学生特権でお弁当頂きました。ごちそうさまです。


ビーチパーティー

学生料金でタダ飯でした。こちらもごちそうさまです。
結構書いたのでこの辺りからアバウトで。
仕事は東京でするか沖縄でするかー、とかリモートワークーがー、とかとか。仕事っぽい話は割と実感なさげ。
あとは英語喋れると外国人エンジニアからしょーもない話からここだけの話まで聞けます、とか。


話は聞けるわ飯は食えるわのイベントでした。
というかみんなこようよ、とかどことなくつぶやく。

台風などありましたが運営の方々お疲れ様でした + ありがとうございました。

2014/06/10

Agda を 2.4.0 にする

2014/06/05 に Agda 2.4.0 が Release されたみたいです。

けれど、Standard Library 0.7 の Release Note を見ると
2013–01–29: Version 0.7. README. Tested with Agda 2.3.2, Agda 2.3.2.1 and Agda 2.3.2.2. 
とのこと。Agda2.4 に対応してない。
ということで Standard Library を使うコードを実行してみると途中でエラー吐かれました。

なのでとりあえず Repository を直接もってくる。
$ git clone https://github.com/agda/agda-stdlib.git
それで agda2-include-dirs が通ってるところに配置。

私は
(setq agda2-include-dirs (mapcar (lambda (path) (expand-file-name path)) (file-expand-wildcards "~/Library/Agda2/*")))
とか設定していて、 ~/Library/Agda2 の下を全部 import できるようにしてます。

なので
$ cd ~/Library/Agda2
$ ln -s $HOME/files/build/agda/agda-stdlib/src `pwd`/agda-stdlib
とかしておしまい。

そして Standard Library なコードを実行すると通りました。めでたしめでたし。

2014/05/24

Open Source Conference 2014 Okinawa に行ってきた

オープンソースカンファレンス に行ってきました。

今年は沖縄が10回目らしいのだったり、最近100回達成したり、10年目だったりの記念会だたっぽいです。

参加者的には、噂の Eject コマンドユーザ会 を見られたりとか、トートバッグが当たったりとかな感じでした。


ちなみにあんまり参加者側の印象が無いのはブースで参加していたりセミナーで発表していたりしたからで。

ブースでは研究室の成果物である TreeVNC と ie-virsh を展示。
TreeVNC は大量のユーザが繋がっても重くなりづらく、画面配信する画面切り替えを接続を切ることなくできる、というもの。
ie-virsh は学生が自分のアカウントのみで自分の VM を起動したり操作できる、という学科向けマルチユーザ virsh です。
詳しくはきっと中の人達がどこかにまとめてくれているでしょう。


セミナーでは Agda入門 ということで Agda という言語の入門をしてきました。
加法の交換法則の x + y == y + x を証明してきました。
入門というのには大変なレベルでいろいろな要素が入っていて

  • Curry-Howard Isomorphism
    • プログラムで証明を扱う上でこういう理論をベースにしてます、と言わなきゃ
  • Peano Arithmetic
    • 加法するから自然数定義しなきゃ
  • Equivalence
    • 等価性証明するから定義しなきゃ
  • Reasoning
    • 式変形に使うし説明しなきゃ
とかとかで割と聞いたこと無いようなもの大盛りでお送りしました。


発表の感想としては割と反応難しいよなー、といった感じ。というか私も難しいよなーとか思っていながら。

目に見えて分かるくらい貢献するようなこういうことができます、ってくらい言えた方がやっぱり見た目的にも分かりやすさ的にも良いはず。
ただそういうネタが見つかんなかったのとそれが書けるかなー、とかやってる流れでとりあえず 1 + 1 = 2 な路線で行ってみようか、という感じでした。
うーん。どうしていこうかなー。

2014/05/12

rbenv と readline でゴニョゴニョした話

Ruby 2.1.1 を rbenv で入れようとするとビルドがコケる。

brew な readline が 6.3.3 にいつの間にか上がってて、それだとマズいらしい

6.2.4 とかだと大丈夫らしいので、一旦  checkout してインストールして brew switch とか。
$ brew versions readline
$ pushd /usrl/local
$ git checkout 0181c8a Library/Formula/readline.rb
$ brew install readline
$ brew switch readline 6.2.4
$ git checkout master
$ RUBY_CONFIGURE_OPTS="--enable-shared" rbenv install 2.1.1
そうすれば2.1.1が入りました。

と思ったら brew 側の readline が 6.3.5 に上がってた。
のと、Rubyも2.1.2 が出てた
ということで試してみる
$ brew install readline
$ brew switch readline 6.3.5
$ RUBY_CONFIGURE_OPTS="--enable-shared" rbenv install 2.1.1
$ RUBY_CONFIGURE_OPTS="--enable-shared" rbenv install 2.1.2
なんか素直に2.1.1も2.1.2も入った。
brew な readline 入ってるとその辺気にしないといけなさそうなのかな。

とりあえず 6.3.5 だと何ら問題は無いらしい。

2014/04/27

gcc-4.8 な感じで Agda を入れる

brew で haskell-platform を入れて、その cabal 経由で Agda を入れてたんですが、いつかの update で apple-gcc42 が formula から消えてしまった様子。

ghc は apple-gcc42 に依存してたみたいだけれど、いつの間にか依存が
mpfr libmpc isl cloog gcc
になってる。

なので apple-gcc42 を消して gcc とかを入れる。

ghcを入れて、 haskell-platform を入れようとすると怒られる。
解決法は
https://github.com/Homebrew/homebrew/issues/28654
らしい。

ってなわけで
$ brew install ghc
$ brew install haskell-platform --cc=/usr/local/bin/gcc-4.8
とかで haskell-platform が入りました。


あとは PATH に $HOME/.cabal を追加して
$ cabal update
$ cabal install cabal-install
$ cabal install agda
とかすれば素直に Agda まで入りました。

2014/04/26

新入生歓迎LT祭り 2014 へ行ってきた

新入生歓迎LT祭り 2014 へ行ってきました。

今回の発表者は26人とのことで結構多い感。とはいえ過去も20数人くらいは発表していた様子。
さすがに見知った顔が個人の趣味なりなんなりを発表するとなるとバリエーションも多いなー、とか。
知ってる身内だけー、みたいな雰囲気はあるかもしれないけれど、こういう学科なんだよー、ってことを感じとってもらえたのなら幸いかも?
逆に、既にある程度の人達がオーラ作っちゃってる感もあるので新入生側からは入りづらいとかになってないかは気になるんだけれど、その辺はどうだったのだろう。
まーお祭りだし良いか。


今回は たまにはどこかへ。 (リンク先pdf) ということでイベントや勉強会へのお誘いをLTで。

話で出した okrk01 とかはとても規模が大きくて、内容もさることながら、その後の打ち上げではruby会議を開催するような人達がでごろごろいたりしたのが印象的。
なんというかそういうところでも「学生が少ない」とかって言ってたりするので、きっと大歓迎されますよー、とか。

ともあれ、こういうイベントは沖縄にもあって、参加してみるのも良いんじゃないか、というお誘いでした。
近場だと ie-developers として勉強会とかやる予定ですし。次はVimかなー。
誰かの選択肢を増やすことになれば幸い。


んで、関連するLTと言えば Yutaka_Kinjyoさん意識の高い内容 でしょうか。
このLTを聞いてわくわくしてどこかへ行きたくなったらどっか行っちゃうのも手です。
んで、好きなことをしたい、勉強したい、って時にそういうことが言えたりとか聞けたりとかする場もあるんですよー、とかって流れでイベント行って欲しいかもですね。

さらに関連と言えば yotaさん のLT。
「いきなりどこか行けとかって酷じゃない?」というのは割と言いえて妙。
たしかに知らん者とか人ばかりのところに突っこんでいけ、ってのも鬼だよなー、とか。
そういう意味でも私の発表は、やりたいことの選択肢の1つにしてみたらどうだろう、くらいの主張が良いのかもしれない。
あーしろこうしろ、だと結構しんどいかもなので。

今日の沢山のLTを聞いて、あ、これ気になる、とかでやってみるくらいで良いんじゃないかと。

あと私のところに殴り込んでくるなら TaPL とかで殴り合えば良いのかな。別に Haskell とか Category とかでも良いですけれど。その辺まだ良く分かってませんし。
あと、これらの単語良く分かんなかったら Ruby なり Vim なり git なりを布教くらいはするかもしれません。

ちなみに、私にリプライを送ってきた
@masamasa_massa さん, @rumagishi さん, @mitsumitsu10 さん, @MOSSEA_Re さん, @EIJU1o1 さん, @rumagishi さん, @kie_Udongein さん, @zirmele さん, @_simanman さん, @nekonekomeiko さん, @japan12345 さん, @kemikaruB1 さん, @ONAGA_tattsu さん, @Momo060849 さん, @fgpglv0816ss さん, @OZmku さん, @jzmob4 さん, @e125710 さん, @yshtk_ さん, @innparusu さん, @yu12com さん, @utah_pcxgs さん, @_simanman さん, @sister_clown さん, @kkz_interface さん
はたぶんVim勉強会するときにメッセージぶん投げます。
これで人数20は確保かなー。


ともあれ入学おめでとうございます + 良い大学生活を、ということで。

2014/04/04

自分用な gem を作ってリリースしてみた

自分用のちょっとしたスクリプトをまとめる gem を作ってみました。

noir ってやつです。

もともとスクリプトは このへん に作ってまとめていて、 /usr/local/bin に symlink して使ってました。
それがだんだん増えてきて、どうしようかなー、となっていたところに zsh な補完は自分で定義できる ことが分かったのでどうせなので gem にしてしまおう、ということで作ってみました。

作った class に従ってコマンドを作れば zsh で補完が効く、って物体です。
例えば Noir::Base::Command にはサブコマンドがあるコマンドで、 Noir::Base::TerminalCommand はそれが終端のコマンドなので実行されるやつ、とかです。

書いてて思いましたが、こういう抽象的なやつは若干書きづらい感が。
例えば、補完する Command のリストを取るために文字列から Class の constants を取ってくる時に文字列でクラス名を作って eval して class にして、とかやってたりして、突然コードの中に eval が出てくる、みたいな。

ただ、ここまで書いちゃえば後は追加していくだけかなー、とか思ってます。
なので、 note を 作る command しか無いですが、 v0.0.1 をリリース してみました。

あと、他にも RSpec にも手を出してみたりとか、実は gem 名が最初の案の時には被っててこれは二代目の名前だったりとかありますが、その辺はあとで。

2014/04/01

Haskell 勉強会をやってみた

2014/03/26(Wed) - 2014/03/28(Fri) に Haskell 勉強会 in ie なるイベントをやってみました。
資料とかはこの辺

Haskell 気になっている人達ですごいH本を読んでみよう、というイベントです。
Haskell は個性的っぽいので、どんな言語なのか知ってみよう、という趣旨でした。
加えて、 Haskell って何、勉強会って何するの、って人達もターゲットにしていて、勉強会とか良く分からなくても良いから来よう、というスタンスで人を集めてたりもしました。

参加者側の話


参加者は基本的にすごいH本を読んでもらって、分からないところを相談するなり、尋ねてもらうなり、というスタイルでした。

Haskell についてとか思ったこととか、参加者の感想とか
  • Haskell すごい、って感想は来る
    • 短かくかけるとか
    • 綺麗とか
  • でもHaskell何に使うの、という質問も飛んでくる
    • 便利なのは分かった
    • が、何に使うの
    • IO が遠いとか(8章で Hello World だから)
  • 型が便利
    • 質問されたら「まず型を見よう」って言ってた
    • で、だいたいはそれで説明可能だった
    • 型便利

 

主催側の話


進め方としては、割といろいろやっている人とか上級生な人を上級者、Haskell に触ったことが無いとか下級生な人を初心者にして、ペアプロチックなペア読みをしてみよう、ってなアイディアを実行してみました。


実際やってみたペア読みについて
  • 本が読める人どうしをペアにするともくもくになる
  • まったく分かんない、って人をペアにすると良いのかも
  • ペアによって進め方を自由にしていたので、進める速度も進め方も違う
  • 他人がいる感はあるので、強制的に読むことができる
といった感じ。
なので新入生とかに向けてやると良いのかもしれない。

あと主催側で思ったこととか
  • 時間の枠は割と可変にしてたのは良かった
    • 遅刻対策とか
    • 人によって来る時間が違うとか
  • でも、時間長すぎるの結構きつい
    • 10:00 - 18:00 を3日は結構しんどかった
    • 午後だけとかにした方が良いのかな
    • でも3日かけて8章読むのも結構厳しめだったし、勉強会でやることを考えた方が良いのかも。
      • 短かいスパンでだーっとやる方向と、長いスパンで続ける方向な勉強会があるしなー、すごいH本はどっち向きかなー、とか
      • 本を読むのは長い方が良いんかな、とか。

感想

Haskell おもしろいなー、って言ってくれてる人もいたのでそれで良いかな、と。
元々、初心者な人達の興味を広げるために、って趣旨だったので。
ただ、上級者の人達はもっと具体的に何ができるの、とかの話も気になると思うので、そこの解答は必要そう。

2014/03/18

新しい MacBookPro が届いた

新しい MacBook Pro が届いたのでいろいろと設定するなど。

/usr/local と OS 再インストール

一時期から brew の permission が若干変で、 update だけ sudo 必要な状態になってました。 なので /usr/local をこの際吹き飛ばしてしまって、 brew を再構築でもしようかな、とか考えてたり。
ってな訳で migraion assitant で /Application と home と network settings & computer settings のみ migrate したのだけれど、 /usr/local が移行先に残ってる。
しゃーなしってことで OS を ReInstall しても残ってる。
一旦 permission の中身を erase してから ReInstall しなおして、 migration assitant を使わずにファイルを Time Machine から手で移してどうにか /usr/local が消える。というか基本的に全部消えてる。
 /Application とかはちょっと残っていて欲しかったけれど、この際、ということで割と吹き飛ばす。 ちなみにこれが後から若干後悔の元になったりもする。 さらにちなみに、データ移動は rsync めっちゃ速かった。

そういえば OS ReInstall 時の Recovery HD で boot されてるやつの network は DHCP な前提になっているみたい。
私の network は static IP にしてるので、 IP が無いから繋ってないとか怒られた。
なんとGUIだと設定することもできないっぽくて、Terminal から
  • networksetup -setmanual "Thunderbolt Ethernet"  <ip> <mask> <gateway>
  • networksetup -setdnsservers 'Thunderbolt Ethernet' <dns-ip>
とかして事無きを得た。
あと、OS のダウンロードが 99% で止まってるっぽいけれど状態が分からない時があって、その時は Log を表示させたら進んでるのが分かったり。
OS ReInstall の時にはそういったこともあったりしたなー、とか今更。


brew と brew cask

Application まで消したので何も入ってない状態。それらをいちいちダウンロードするのも面倒なので brew-cask に手を出す。
とりあえず brew を入れて
  • ruby -e “$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)
brew cask を入れる
  • brew tap phinze/homebrew-cask
  • brew install brew-cask
ちなみに command line tools の install も brew を入れるときにやってくれた。便利。

 

 

Install by brew cask

とりあえずめぼしいものを cask で入れていく。
  • brew cask install appcleaner dropbox evernote firefox flash google-chrome java netnewswire skype the-unarchiver xquartz
くらいかな。 あと、 AquaSKK はデフォルトで cask が無いけれど、作ってくれた人がいるようなので
  • brew tap aereal/homebrew-aereal_casks
  • brew cask install aquaskk
これで入ったは良いんだけれど変換が効かなくなってる。
どうやら ~/Library/Application Support/AquaSKK に何も無いみたい。
ということで古いPCからそこをサルベージ。 同じ場所に移しておしまい。

 

 

Install by brew

こっちもめぼしいものを入れてく。
  • brew install brew-cask coreutils fontforge ghc git gnu-sed haskell-platform lua mercurial nkf rbenv ruby-build tig tree wget zsh
とか。

Ruby は rbenv で管理してるので
  • $ RUBY_CONFIGURE_OPTS=”–enable-shared” rbenv install 2.0.0-p0
  • rbenv global 2.1.1
とか。 RUBY_CONFIGURE_OPTS は Vim 用に enable-shared な library を作りたかったので

あと、Vim は HEAD + with lua で入れてるので、
  • brew install –HEAD –with-lua vim
と。

加えて Agda を動くように。設定は残ってたので
  • cabal update
  • cabal install cabal-install
  • cabal install agda
くらいであっさり動いてくれた。

あとは必要になり次第入れていこう。

 

 

設定の移行と iCloud

んで、Mailとかの設定が非常に面倒だった。 migrate したら一発なんだけれど、初期から設定するので非常に面倒。
何か他に良い方法あるのかもしれないけれど、PC2台とにらめっこしながら移す。
この辺からゲンナリしてきて、iCloud を今更有効化。 Mail はともかく、 Calender と Reminder を同期させる。

あと RSS の NetNewsWire とかは 設定を export して Dropbox で同期させて import して、とかやってた。

さらに Firefox は Vimperator とか TabMixPlus とか About MyBookmarks とかなんとかアドオンが沢山あって、これもにらめっこでどうにか。

もうここまでくるとかなりゲンナリしてて、次から移行を意識した構成にしようかな、とか、何かスクリプト化でもするか、とか考え始めたり。 とかなんとかしつつどうにか普段使いする分には問題無いくらいにはなった。
あとは勢いで導入した iCloud と cask をどう扱うか、とかなんだろうけれどなー。

ということでいろいろ格闘しつつも

['Retina', '15 inch', 'SSD', 'US Keyborad', 'Marvericks'].each{|elem| puts "Hello, #{elem} world."}

2014/03/16

unicode の east asian ambiguous 文字 : その3

¬の見た目がおかしい、ということでゴニョゴニョ設定したのですが、古いバージョンの Ricty のバグだったみたいです。

-a したので ×  も半角化しちゃって、折衷案を取れないか思い立つ。
てなわけで fontforge で Rictyのフォントを眺めていたり。
それで Migu 1M の NOT SIGN な 00ac を見たらなんと半角。どのタイミングで全角に変わったんだ、とか思ってソースを見ると該当部分は見当たらず。

もしやと思って -a 無しの 3.2.2 で、¬は半角、×は全角のRictyに。
ってことは 3.1.3 から 3.2.2 の間で修正されたのかな。
もしくは Migu 1M が修正されたのかもしれない。

ともかくこれで ¬ が直った。フォント周りの道は険しいっぽい。
ga で文字コード検証からの fontforge で width 確認して修正、がフォント周りの対処法になりそう。

ちなみにソース眺めてると特定の文字を replace するスクリプトが misc の下にあったりしたので、それでいじることもできそう。

ってな訳でアップデートしたら直りました、という感じでしたまる。

unicode の east asian ambiguous 文字 : その2

East Asian Ambiguous な設定をして一段落、と思っていた矢先、¬ の記号が「全角で表示されるのに半角扱いの移動」になる。
さて、今回は Vim でも Emacs でも再現するので設定の問題じゃなさそう。

ということで ¬ が East Asian Ambiguous なのか、ということから調べてみる。
vim で ga すると 00ac らしい。
その辺りを調べてみる と、00ac は NOT SIGN で、それとは別に ffe2 に FULLWIDTH NOT SIGN があるらしい。むむ。
not sign なのに full width になってるのでこれはフォント側の問題っぽい。

ということで Ricty を再生成することに。最新 stable は 3.2.2 なので
$ git clone https://github.com/yascentur/Ricty.git
$ cd Ricty
$ git checkout -b 3.2.2
$ ./ricty_generator.sh  -a -n "3.2.2-half" auto
くらいで。

フォントは InconsolataMigu 1M が必要。あと依存で fontforge。 brew にあった。
-a は full width を無効化するオプション。なのでこれで予想外の全角化は消えるはず。
-n はフォント名に追加で string を足すオプション。 Ricty 3.2.2-half くらいになる。
Ricty 3.2.2 half にしたかったんだけれど、内部処理でスペースを消してるらしくて-にする。

フォントを変えたらどうにか ¬ が半角化した。
フォントを変えただけで、VimとかEmacsとかの設定は基本的に前回から変えてない。

あと、emacs の設定が 22 と23以降で別々な文字テーブルを参照していたのでどうにかこうにか統一する。コピペ用 gist は一番下。
emacs 22 の utf-translate-cjk-set-unicode-range は要素に #x00A1 とかがあるとダメで、(#x00A1 . #x00A1) にしないといけないらしい。なんでだろ。
とりあえず emacs 23 用の設定の方が大量に書かれていたので、それをベースにまとめる。
これでどうにか同一テーブルを参照するようになった。

あとこの辺
FFE0;F # FULLWIDTH CENT SIGN
FFE1;F # FULLWIDTH POUND SIGN
FFE2;F # FULLWIDTH NOT SIGN
FFE3;F # FULLWIDTH MACRON
FFE4;F # FULLWIDTH BROKEN BAR
FFE5;F # FULLWIDTH YEN SIGN
FFE6;F # FULLWIDTH WON SIGN
とかが全角化対象じゃなかったので追加。A幅じゃなくてF幅なので East Asian Ambiguous とはまた別の問題なのかもしれないけれど。

A とか F とかは Unicode が持ってる property らしい。
A は Ambiguous で、 F は Full width とかいろいろある。
詳しいのはこの辺。というか本家っぽい。
おかしい文字があったら文字コード調べてみて、ここでUnicodeの設定的にどうなっているかとか確認しないと、フォントの問題なのかとかの切り分けができなさそう。

というかこういう風にいろんなところでズレてたりすると結構面倒感。
対症療法を取っているけれど、どこが問題でどっちを直すべきなのかとか結構厄介だなー、とか。

ということで記号周り厄介だなー。また何か発生しそう。
emacs 側なら Unicode 指定で width 指定してしまえばどうにでもなってしまいそう。
Vim は ambiwidth の対象かそうじゃないかでまた一悶着ありそう。

まー、 ¬ の問題は乗り切った、ということにしたい。

コピペ用設定gistはこんな感じ。

2014/03/11

unicode の east asian ambiguous 文字

最近、 Agda を使ったりしているので agda-mode な emacs にちょっと手を出していたりします。

Agda は π やら ∀ やらの記号を容赦なく使うので、iTerm2 では agda-mode 時に emacs の表示がおかしくなることがありました。
iTerm2 の問題かと思って Terminal に戻ってきたは良いものの、今度は ∀ とかが一文字幅になってしまって表示がおかしい。

Terminal の
Preferences -> Advanced -> Unicode East Asian Ambiguous character are wide
のチェックを入れると解決はするんだけれど、iTerm2と同じ状況になる。

どうやら Unicode East Asian Ambiguous とやらが問題らしい。

調べてみると、∀ とかが全角なのは国によるっぽい。
特に日本は全角だけれど、アメリカだと半角らしい。
国によるので幅が曖昧な文字がUnicodeにあるとか。 
それが Unicode East Asian Ambiguous みたい。

なので、Inconsolata とかの英字フォントにすると問題の記号が全部半角になって表示が正しくなる。
が、そうすると日本語がヤバそう。
私が使っているフォントは Ricty なので、日本語や記号は Migu に依存してる。
Migu は日本語フォントなので、とりあえず全てを全角に統一することにしました。

環境

  • Mac OSX Mountain Lion
  • Terminal : Version 2.3 (309)
  • iTerm2 : Build 1.0.0.20140112
  • Vim 7.4.192
  • Emacs 22.1.1 / 24.3
  • Font : Ricty

対策


iTerm2 / Terminal

East Asian Ambiguous を wide にする。

Terminal だと
Preferences -> Advanced -> Unicode East Asian Ambiguous character are wide
をチェック。

iTerm2 だと
Preferences -> Profiles -> Text -> Double-width Characters -> Treat ambiguous-width character as double width
にチェック。

Vim

set ambiwidth=double
する。というか既にしてた。

Emacs

なんか22と23で違うらしい。
emacs 22 では utf-translate-cjk-set-unicode-range を使う と良いっぽい。
23 以降では cjk が消えたらしく、別の方法があるっぽい。

んで、問題はこれら2つは完全に互換が無いこと。
22 の設定方法を 23 以降に適用すると cjk が消えちゃってる。
23 以降の設定を 22 に適用すると、 char-width-table が無いとか言われる。

加えて Mountain Lion とか Marvericks とかの emacs が 22 なのと、brew で入れられる emacs が 24 だったりでちょっとアレしたので両方に対応できる設定にしてみるなど。

設定はこんな感じ。単に emacs-major-version で場合分けしているだけだけれど。
下にコピペで使える状態な gist を置いておきます。
とりあえず 22.1.1 と 24.3 で表示の問題が無いことは確認できた。
elisp 書いたこと無いのでどこか変かもしれない。

とりあえずはこれで良いかなー、とか。
英語フォントにするなら width を single に統一すればたぶん問題無いはず。
 
ただ、iTerm2 に乗り換えた後に勘違いで Terminal に返ってきて、ちゃんと設定した結果どっちでも良いことが確認できたんだけれど、これどっち使おうかなー、ってなってたりもする。どーするかな。

んで設定コピペ用 gist は以下。

2014/03/02

沖縄Ruby会議01 へ行ってきた

沖縄Ruby会議01 へ行ってきました。

地域 Ruby 会議 in Okinawa な感じで、沖縄での初Ruby会議っぽいです。
まつもとさんご本人も呼んでわいわいやってた感じ。

実は運営陣営に地味に紛れ込んでいて、ゲストネットワークとかの設定をしていたりしました。
とかしていたらなんと開始1時間ぐらいにネットワーク全断。
まつもとさんの発表を途中で抜け出してあわあわしながら障害切り分けとかしてました。
結果的には大学全体の障害だったので、復旧を待つのみ。
待機中は割と気が気じゃない状態だった記憶が。いやある意味すげー経験なのかなこれ。

最終的には2時間ほどで復旧してもらってどうにか。どうにか……?
これってネットワーク担当だった以上はごめんなさいするのが正しいのだろうか。
ネットワーク切れちゃってごめんなさい。

障害後は、もう発表を聞くどころじゃなかったのでサテライト会場で通信状況をプチ監視してたりしました。
あとはサテライトらしくもくもくしよう、ということで作りかけの gem をいきなり公開してたりとか。
公開時は、なにやっているか分からないレベルなのでコメントしづらかっただろうなー、とか思いつつも。
やっぱりもうちょっと作り込んでから公開すると良かったかな。
けれど、バグを見つけてもらったりとかコメント貰えたりしたので良かった。
タイミングはともかく公開するべきなのだろーな、とか。
コメントくれるのありがたい。

という感じで本編は怒涛の記憶でそれしか残ってない状態。ある意味忘れられないイベントになりそう。
本編なのに割と Ruby 成分摂取量低めかもしれない。



して懇親会へ。
私が参加した中で一番賑やかな懇親会だったように思えました。
規模が大きいからなのか、Rubyな人達だからなのかは分かりませんけれど。
なんか褒められたり、シリアスなアドバイスを貰ったり、なんか業界っぽい話を聞いたり、社会人の闇っぽい話ったり、まつもとさんと写真取ったりとかわいわいしていた。

ブログを書いていて思ったのだけれど、今回のイベントだけでたくさんの人にお世話になったなー、とか思う。良い人ばかりだー。ありがとうございます。

というかもっと学生来たら良いのになー。もったいない気がする。良い人ばっかりやで。

そういえばちょっと違う話だけれど、学生が来なさすぎて ryudai.rb の残り一人になりそうなんだった。みんな来ようよ。
勉強会とかコミュニティな件でも思うところはあるなー。これから ryudai.rb どうするかとか、人をどうするかとか。とりあえず考えとこう。



とかとかいろいろな内容が混ざりながらもなんだかんだ楽しめたと思います。
#okrk01 な皆様方、ありがとうございましたー。

2014/02/21

zsh のタブ補完を定義してみる

zsh のタブ補完ってどうやってるのかなー、と思って調べてみたら思ったよりあっさり作れる様子。

発端は、rbenv は補完できるのに、 rails 補完できないなー、と思ったこと。
ということで zsh -v とかして rbenv - init の中身を見るとなんか書かれてる。
ソースの中を探せばここらへんな様子。

どうやら compctl -K ってものを使えば良いっぽい。
man zshcompctl があるので詳細はそちらで。
-K で function を指定して、それを使う command を指定すれば良いみたい。

ということで、 hoge command に対してタブ補完をする設定を書いてみたら意外とあっさり。こんな感じ。
補完用の _hoge に渡されている words の最後を look に食わせることで hoge command with 簡易スペルチェッカー のできあがり。

2014/02/16

Vimperator の hint のサイズを大きくする

Vimperator の f で出てくる hint のフォントが小さいので大きくする方法とか。

:highlight Hint
すると、Hint 関連の css っぽいものが表示されます。
コピペして、font-size を大きくして .vimperatorrc に書いておしまい。

私の設定はこんな感じ。基本的にデフォルトの値で font-size だけを 16pt に変更。

highlight Hint font-family: monospace; font-size: 16px; font-weight: bold; text-transform: uppercase; color: white; background-color: red; border-color: ButtonShadow; border-width: 0px; border-style: solid; padding: 0px 1px 0px 1px;

highlight の設定方法は
:highlight Hint font-family...
みたいに command-line menu からやっても良いので、調整しながら決まった後に .vimperatorrc に書いても良いかもしれない。:highlight Hint するとプレビューも見られるし。

2014/02/13

楽々ERDレッスン を読んだ

楽々ERDレッスン を読むなど。

DB分からないー、とか言っていたら貸してもらっていました。
借りたのは良いけれど積んでいたので、この機会に若干飛ばしながらも読み切る。

おおざっぱな感想としては
  • 業務向けっぽい
  • データベースってデータ管理フレームワークなのだな
  • どっちかというと読み物
といった感じ。

どうして業務向けかというと、データベースについての話はするのだれど、業務にとって重要かそうでないかとか、自身の経験に基づいているっぽい意見とかが多かったのでそう感じた。おそらく苦労があったのだろうな、とか。

データベースってデータ管理フレームワークなのだな、というのは当然っちゃ当然の話。だけれど、多数の言語から統一インターフェース(SQL)でアクセスできるもので、中身は高速化だのトランザクションだのって実装されている、という点からなんかフレームワークっぽいなー、とか。それを言えばファイルという存在自体フレームワークか、とか書いてて思わなくも無い。

どっちかと言うと読み物、というのは歴史とか経験とかそういった部分も解説されているから。あと、正規化手法とかそういったものは省略されていて、現場ではどうするか、という部分に重きを置いている感じがあったので。あと、2005年な本だったりするので、若干気になるところもあるけれど読み物チックなので良いかな、とか。

とゆーことで読んでて思ったことの列挙とか。若干眠いお時間なので列挙するだけで。

第1部 : DB設計総論
  • いろいろ変更とかありえるデータを想定したい、というのが念頭にあるみたい。
    • 単価が顧客によって変わるとか
    • 内部外部で呼び方が違うとか
    • そういう意味では負の遺産っぽいな、とか
      • 仕様変更や想定外の要素などが過去にあって大変だったのだろうな、とか
      • そういう意味では経験を語っている本っぽい
    • 解決手法として、リソースには unique id を振って、属性とか関連とかを柔軟に追加できるようにしようよ、って感じだったよーな
  • あとツッコミとして、コードって何やねん、ってなった
    • なんかこう、顧客コードとかっていう物体。idとは別らしい。
    • code も identifier っぽくてユニークじゃないのか、ってツッコミたかった。
    • unique でない「コード」というもの存在している、ってことなのかもしれない
第2部 : RDBMS総論
  • そもそもDBとはレポート生成システムであるとのこと
  • DBってデータマネージメントフレームワークぽいな、とか
    • データに関する処理を一元実装してしまったもの
    • 利用するための共通インターフェースがSQL
    • ストアドプロシージャ便利そう
      • プログラミング言語側でSQL組み立てがいらないので、処理もRDBMSに投げられる
      • でも使われているのか、とかって思案が。面倒そうだし。
      • ActiveRecord とか内部でSQL組みたててそうだよなー
  • RDBMSの特性を理解しようね、とか言ってるような
    • ハードウェアスペックに依存した部分もあるよ、とか
      • 正規化の遅さ速さとかって話以前にね
    • sql は batch であるとか
      • 何をするにもデータを読むためにselectしちゃうよね、とか
      • これを知らないでやるととんでも無い処理を書いちゃって遅くなるよ、とか
第3部 : 楽々ERDレッスン
  • イベント/リソース でのデータベース設計
    • イベントは 「* する」のように言えるもの
    • リソースは 5W1H的なもの
    • みたいな視点でテーブルを作ってみよう、って感じだった 

あとはなんか名言っぽかったの。
  • 「One fact in one place」 
  • 「データは蓄積することのみに意味は無く、それを元にアウトプットするための資産である」 
  • 「プログラムそのものには価値は無く、どのようにデータを扱うかが重要なのである」

2014/01/26

Global Game Jam 2014 University of The Ryukyus に参加してきた

Global Game Jam 2014 University of The Ryukyus に参加してきました。

Global Game Jam は初参加だったりするのですが、オーガナイザーやったりでいろいろしてました。

参加者として

アナログゲームなチームで「バブバブブー」なる赤ちゃんなゲームを作りました。
ゲームな内容の解説はここでは一旦省略。
アナログゲーム作成も初でいろいろありました。とりあえず箇条書きで挙げてみる。
  • スケジューリングは大事。集合時間とかは決めていた方が良い。
  • 時間が無いので時間は気にする必要がある。1時間刻みでやるとか単位化すると見えやすいっぽい。
  • 定期的にミーティングとか進捗確認とかある方が良い。それを単位ごとに作業が動いてるかとかを見ることができる。
  • 切ると判断したものは容赦無く切る。時間は少ない。切ったものも紙とかに残しておくと後で使えるかも。というか全部紙で書いてて良い気がする。
  • みんなでやるとたくさんアイディア出てくる。意外と被らない。
  • みんなで(できる|やるべき)作業と個人単位でやる(並列可能|その人しかできない)作業がある。可能な限り並列でやりたいし、必要があれば全員は収集する。
  • 作業の流れも考えてスケジューリングすると良さげ。(マイルストーン|〆切)からの逆算して考えるとか、並列に実行するにはこれを解決する必要があるとか。
  • 紙に書くのは分かりやすい。とりあえず書いとこう、とか。ログに残るし共有もできる。マインドマップ、ポストイット、etc‥…
  • ゲームは目的とか手段とか資源とか手番とかの視点で分解したりできる。(この分け方は一例らしいけれど)
  • そういった視点を縦軸にして要素を貼っていくとこれはあれと対応する、というのが分かる。
  • ゲーム的に目的重要。決めないとこれが何なのか分からないし進まない。
  • 目的とか手段とかの要素が決まればルールが考えられる。
  • ルールを考える上で、そのうちテストプレイが必要になる。
  • プレイしてみないと分からない状態にもなるから。あとこの詳細はどう詰めるべきかの択が出てきたりするので。
  • テストプレイは回数が重要。その都度フィードバックしながらテストプレイを回していく必要がある。
  • やっぱり詳しい人いると捗る。
  • みんなでやるといろいろできる。
まとめとしてはみんなでやると良い感じのできるんだなー 、って感じでいかがでせう。

オーガナイザーとして

イベント運営は経験少なめで、特にこれが運営した中で一番大きなイベントかもしれない。ということであわあわしたりしたのだけれど思ったこととか。
  • 人の協力重要。特に今回は登録方法や運営方法を知ってる人とか、会場周りの話とかもしてくれる人がいたので非常に助かりました。ありがとうございます。
  • 人がいない部分(ネットで連絡が回ってきて自分でやってね、みたいなもの)は結構検証必要。特にそれだけの情報で重要なことをする時。例としてはテーマ発表の方法は聞いていたけれど実際にリハーサルしてなくて、本番の時に若干焦ることになった。たぶん事前に一回やっておいた方が良かったのだと思う。
  • アンケートとか意外と反応無かったりする。アンケートに限らず、参加者が想定外の行動をした時の予防線とかはあった方が良いのかもしれない。
  • バックアップ大事。人間的な意味。重要な情報を持ってる人間が一人だとその人がいない時に何もできなくなりかねない。
  • バックアップ大事。ログ的な意味。フィードバック必要だし、重要な情報の共有とかの意味合いでもログをちゃんと書いて公開すると良さげかもしれない。
  • ある程度先は野となれ山となれ。なんかトラブル含めて Game Jam らしいです。
とかとか。

なんだかんだ会場では2チームでゲームは2つできましたし、深刻なトラブルも無かったと思ってるので良かったのかなー、とかとか。そんなこと無いよ、とか良くも悪くもフィードバックお待ちしております。

参加してくれたみなさん、協力してくれたみなさん、改めてありがとうござました。