Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

Vimを変態にしてみた

このエントリは、変態アドベントカレンダー2012の4日目です。一日目は@backpaper0さんの「ノムリッシュJavaで厨二プログラミング」でした。

いよいよ12月になりアドベントカレンダーシーズンに入りましたが、みなさんブログ書いてますか?
まだアドベントカレンダーに参加していない方は、是非参加しましょう。
自分の持ってる暗黙的なノウハウを外化する絶好の機会です。

とはいえ、ブログ記事を書くのって結構大変ですよね。
しかし、我々ITエンジニアは日々ソースコードを書きまくっている経験から、「記述を効率化する術」を持っているはずです。
そう、コード補完です!
今回は、協力な補完機能を提供してくれるvimプラグインのNeoCompleCacheとNeoSnippetを紹介しつつ、さらに変態アドベントカレンダー向けに補完設定を作ってみます。
Vimmerな変態の方も、変態なVimmerの方も、Vimmerでない変態の方も、ぜひご活用ください。

下準備

NeoCompleCacheとNeoSnippetはプレフィクスにNeoとついている事からわかるように、どちらもShougoさんによるVimプラグインです。
非常に強力な補完機能でvimによる作業を支援してくれます。
もともとはNeoCompleCacheだけだったのですが、バージョンを重ねるごとに機能が追加されていき、NeoCompleCacheのバージョン7からそれぞれ別のPluginに分割されました。
国産プラグインなので日本語のインストール手順はそろっているだろうと思ったら、あらまぁ無いじゃないですか!しかも、NeoCompleCacheとNeoSnippetでGitHubに書いてあるインストール手順がズレてる。もういっそ全部まとめてまるっと手順を書いちゃいます。

プラグインの取得

とりあえず、NeoSnippet公式のインストール方法に従って、NeoBundleをインストールして、NeoBundle経由でNeoCompleCacheとNeoSnippetをインストールします。
NeoBundleのインストール方法については、こちらにまとめました。

で、NeoBundleがインストールできてさえしまえば後は簡単です。
.vimrcに以下を追記して、

NeoBundle 'Shougo/neocomplcache.git'
NeoBundle 'Shougo/neosnippet.git'

vimを立ち上げて次のコマンドを実行するだけ

:NeoBundleInstall

これで、NeoCompleCacheとNeoSnippetがインストールできます。
お手軽ですね。

設定

インストールできたら、それぞれの設定です。
次の内容を.vimrcに追記したらOKです。
本当はいろいろ設定できるのですが、とりあえず最低限の設定だけ。

"--------------------------------------------------------------------------
" neocomplcache
let g:neocomplcache_enable_at_startup = 1

" Enable omni completion. Not required if they are already set elsewhere in .vimrc
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
"--------------------------------------------------------------------------
" neosnippet

" Plugin key-mappings.
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)

" SuperTab like snippets behavior.
imap <expr><TAB> neosnippet#expandable() ? "\<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "\<C-n>" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"

" For snippet_complete marker.
if has('conceal')
  set conceallevel=2 concealcursor=i
endif

いよいよvimを変態にする

VimにHentaiファイルタイプを認識させる

では、ブログ記事作成を便利にするsnipet作成に入りましょう。
今回は、textファイルを補完するために、.txtの拡張子のファイルをhentaiファイルタイプとして扱います。

ファイルタイプをvimに登録するには、.vim以下にftdetectフォルダを作り、そこにファイルタイプ判別のvimスクリプトを追加します。
今回は、下記のファイルを追加しました。

これで、vimは.txtを拡張子に持つファイルを開いたときにファイルタイプをhentaiファイルタイプとして認識してくれます。

vimにHentai辞書を追加する

NeoCompleCacheは、ユーザ定義の辞書ファイルを追加する事ができ、追加した辞書ファイルを元に単語補完を行う事が出来ます。
今回は、適当に変態アドベントカレンダーに登場しそうな単語と変態アドベントカレンダー参加者の名前を登録したhentai.dictを作りました。
辞書ファイルのパスは自由に設定出来るので、今回はとりあえず.vim以下にdictフォルダを作成し、その中に保存しました。

僕がatndから抜き出すタイミングで名前が載ってない人がいるかもしれません。
別に、変態認定してないわけではないです。

この変態辞書を NeoCompleCache に読み込ませるために.vimrcに下記を追記します。

"辞書の登録
let g:neocomplcache_dictionary_filetype_lists = {
  \ 'default' : '',
  \ 'hentai' : $HOME.'/.vim/dict/hentai.dict',
  \ }

これでvimを起動すると、変態辞書による補完が有効になります。
hを入力して+n を押すと、入力候補が表示されます。

vimに変態Snippetを登録する

さらに、vimを変態アドベントカレンダー向けにカスタマイズしていきましょう。
NeoSnippet を利用する事で、スニペット補完が出来るようになります。
スニペット補完とは、よく書く定型文のひな形を用意しておいて、その一部だけを書き換える事で記述効率をあげる補完手法です。
Snippetについてはこちらの記事が詳しいです。
Vimのsnippetについてあまり知らなかったので設定してみたら便利過ぎてつらい

今回は、変態アドベントカレンダーのテンプレートを登録するために、hentai.snipファイルを作成します。

.vimフォルダ以下にsnippetsフォルダを作って、このhentai.snipファイルを保存します。
このファイルを読み込むための.vimrcの設定はこちら

" スニペットファイルの保存ディレクトリのパスを登録
let g:neosnippet#snippets_directory='~/.vim/bundle/snipmate-snippets/snippets'

これで、変態アドベントカレンダーのひな形が登録出来ました。
haと入力して+kを打ち込むと、記事のひな形が出来上がります。

更に、で入力が必要な箇所に移動して書き換える事が出来ます。

まとめ

これで変態アドベントカレンダーの記事作成が大幅に効率化されました。
もちろん、この設定は工夫次第で普段のコーディングにも適用出来ます。
みなさんも、NeoCompleCacheとNeoSnippetを用いてより快適なvimライフを送ってください。
今回作成した、hentai.vim、hentai.dict、hentai.snipについてはgistに挙げているのでよろしければ参考にしてください。

Gist - vimを変態にするための設定ファイル群

明日ははがねのつるぎさんです。

DevLove関西はいかにして私を駆動したか

 気がつけばDevLove関西が終わってもう1週間経ちました。
なのに、未だブログを書かず、会社に何かを持ち帰ったわけでもなく、なにもアウトプットが無いままの1週間でした。
 これは、「ブログを書くまでが勉強会」や「自分の周りを変えるまでが勉強会」という言葉に照らし合わせると「kuchitamaのDevLove関西は終わっていない」という事になります。
 というのも、DevLove関西の懇親会の後からずっと自分の中にもやもやしたものがわだかまっていてそれをどこか納得のいくカタチに落とし込むまではアウトプットのしようがなかったのです。まだ、まとまりきらない部分もありますが、とりあえず思いついた事を思いついたままに書いてみます。

もやもやの正体

 先に言ってしまうと、もやもやの正体は自分とDevLoveのスタンスの違いでした。
 DevLove関西の直後はこのもやもやしたものが、きっと懇親会LTでどんずべりした恥ずかしさやふがいなさだと思っていました。でも、よくよく考えるとスベる事には慣れているし、今更そんなことを気にしていたら今の会社にいられるはずも無いので、何かが違うと思いました。何が違うのかな〜っと考えているとふと、目に入ったのが、@yohhatuさんのプレゼンタイトル「開発現場を駆動せよ -DevLOVE関西Driveがもたらすもの-」でした。
 DevLoveは全体的な雰囲気として「現場」を改善しようとしていました。
 それに対して僕は現場の変更に対して全く興味がなく、「自分」のスキルをのばすことに意識が集中していました。今回の会では、主催者の@yohhatuさん@papandaさんのセッションを始め、スクラムなどチームの改善が念頭にあったように感じます。
 このスタンスの差がもやもやの根源でした。

なんで興味が無かったのか

 現場を変える事になぜ興味が無かったか。
1つには、アジャイルを学ぶ必要性を感じていなかったというのがあります。
 現在の弊社のチームマネジメントにそこまで不満が無かったというのがあります。改善も意見を挙げれば、検討された上で取り入れてもらえるので、改めてアジャイルスクラムを取り上げる必要性も感じていません。
 また、弊社ではアジャイルを崩して取り組んでいることもあります。フリューなりに崩して、やりやすく改めたアジャイルプロセスを実施しているので、あらためて原型を学ぶ必要性をあまり感じてもいませんでした。
 もう一つには、自分の器用貧乏っぷりが我慢出来ず、なにか得意分野といえるようなものを探している最中ということが挙げられます。
 そのため、焦点が自分が身につける技術、考え方に向いていて、周囲を変える事に向かなかったのだと思います。

そして駆動へ

 結局、DevLove関西に参加してもやもやが残ったという事は、発表者の方々や周りの人の熱量に感化されたという事なんだと思います。
 感化された以上は、なにかしないといつまでも胃のあたりが落ち着きません。幸い、興味ないといいつつやたらと本を集める癖があるので、部屋にはアジャイルな見積もりと計画作りや、アジャイルソフトウェア開発奥義などの本が積んであります。まずはこの辺りの本を読み込んでみるところから初めてみようと思います。
 自分も開発現場の一部であると考えれば、自分一人の取り組みでも、DevLoveは開発現場を駆動させたということになると思います。
 というわけで、DevLove関西2012は熱いイベントだった!

変態アドベントカレンダーinSummerを振り返る

この記事は、変態アドベントカレンダーinSummer えっと…最終日!の記事です。

前回は、dproject21さんの、「フィボナッチ数は変態です」でした。

今日のお題

気がつけば変態アドベントカレンダーも最終日。
夏コミも今日で終わりです。

という事なので、この唐突に始まった変態アドベントカレンダーという謎の変態イベントについて振り返ってみようと思います。

今更変態を定義する

今回、変態アドベントカレンダーをやってみて、参加者のみなさんが直面した問題があったように思います。

それは、

変態とは何か

これは、ひょっとすると我々自称変態の永遠の命題かもしれません。

辞書に載っている「変態」という言葉は、どうやら我々がこのアドベントカレンダーの文脈で使っている「変態」とはどうもしっくり来ないように感じます。

そう、我々は新しい変態の定義を求めているのです。

いわば、変態ニュージェネレーションです

さて、この変態ニュージェネレーションですが、僕は次のように定義します。

「変態とは、ものごとを自分に都合良く楽しむこと、またはそのような人」

このアドベントカレンダー、主催者の僕がすっかり忘れてたのに、意識高い参加者の皆さんのご厚意で勝手に始まってました。

やっぱ、こういう主体性ってやる人が楽しんでないと生まれないと思うんです。

それに、記事の中には、割とえげつないしんどい体験談もありました。
しかし、そんな話題ですらおもしろおかしくネタにしちゃう。
そんなバイタリティが見え隠れしていました。


なので、永遠の命題とか言っときながら、一旦区切りのためにこの楽しむというキーワードで変態ニュージェネレーションを定義したいと思います。

変態とは何でも楽しんじゃうイカしたやつらだ!

まとめ

  • 変態アドベントカレンダーinSummerおつかれさまでした
  • 俺たちゃ変態ニュージェネレーション
  • 変態は楽しみ続ける
  • ところで、連載とか言ってたのどこいった?
  • 最後の最後で全くIT感がないze

ゆるふわなClojure勉強会をやってみた-変態アドベントカレンダー(17 あるいは 21かもしれない 日目)

この記事は変態アドベントカレンダー in Summerの (えっと多分)17日目とい(というは、実はスタートから21日目)の記事です。

前回は、@dproject21さんのTitanium mobile の Alloyでエロい(?)アプリをつくる。でした。

今日のお題

今日は、先日主催させていただいたClojureProgrammingお菓子会のレポート記事を書きたいと思います。

え?ジャッジメントはどこに行ったか?
実は飽き…いや、Clojureお菓子会が予想以上に変態的な催しになったので、これは報告せねばだと思ったので予定変更してお送りしております。

What is ClojureProgrammingお菓子会

ClojureProgrammingという本がオライリーから出版されており、前回のKyoto.cljで、これが良書だと紹介して頂きました。
そこで早速会社でも買ってもらったのですが、これが英語なんですね。
しかも、分厚いんですね。
なので、読むの大変なんです。
そこで、まぁ、一人だと心が折れそうなので仲間を集めたくて読書会を開催しました
ただ、なるべくゆったりやりたいので、お菓子会っていうゆるふわな名前にしました。
内容は、単にお菓子食いながら本を読もうってだけです。

なぜ、この会が変態的なのか

それは…

真夏

男ども

汗だく

ハァハァとしていた

異様な勉強会だったからです。

まぁ、それは会場を用意した僕が、空調にまで気が回らず、暑い中ノークーラーで半日過ごすはめになっただけですが…

しかし、内容は思ったよりも濃い内容になりました。

僕は、13章Testについて発表
当日までに資料が準備出来ず、不格好なライブコーディングを行うという、なんともゆるい発表になりましたが、
その他にも、Clojrueのベースになる知識やREPLについてのお話がありました。

ClojureProgramming / Chap.13 Testing

僕は、先述の通りTestingについて話しました。
とはいえ、前半のところだけしかまとまってませんが・・・
どうもTestの章はサンプルコードが少ないように感じたので、
ちょっと自分なりに考えたサンプルをスライドに まとめているので、
ClojureProgrammingを読まれる方は、一緒に見て頂くとちょっと読解のお役に立てるかもしれません。

↓スライドはこちら

まとめ

  1. 連載形式など無かった
  2. ClojureProgrammingは良書ですよ
  3. 英語に疲れたらお菓子を食べよう
  4. またやるので興味ある人は次は来てね
  5. kyoto.cljはどこに行ったのか…

ジャッジメントですの変換を作ってみる

この記事は変態アドベントカレンダー in Summer 9日目の記事です。

昨日の記事は@tango238さんの、

java.lang.Stringのメソッドをむりやり書き換える」でした。

今回のおだい

ただの悪ノリだけで始まった変態アドベントカレンダーinSummerですが、
なぜか参加者が2桁になってしまったので、僕も書きます。

今回は、確実に3週はしそうなので、連載形式で書いてみようと思います。
ゴールである夏コミまでお付き合いいただければ幸いです。

と、いうことでお題を「ジャッジメントですの 変換」の実装にしました。
これをパクる感じで、
入力された文字列の語尾を「ですの」に変換してtwitter投稿するアプリを作ってみようと思います。
atndの画像や注意文とも相まって良い感じです。

ちなみに、ありえないと思いますが、「ジャッジメントですの」って何ってかたは、この辺で勉強しとくといいと思います。

連載の予定

来週のサ○エさんは

とりあえずClojureでなっ

  • xmlを操作してみる。

ただしClojureでなっ

もちろんClojureでなっ

の、3本です。

Clojrue使っているのは、100%趣味です。

形態素解析してみる

とりあえず、今回は、適当な文章を形態素解析して助動詞を抜き出すところまでやろうと思います。

本題に入る前にちょっとだけ、用語について

ということで、最低限必要な知識はバッチリですね。

形態素解析というと、MeCabとかIgoとかあります。
ありますが今回は、関○電力のお達しにより、省エネモードで進めていこうと思います。

なので、今回はYahoo!日本語形態素解析APIを使おうと思います。

このAPIに、解析したい日本語文章を渡すと、解析結果のXMLが帰ってきます。
「この記事は変態アドベントカレンダー in Summer 9日目の記事です。」という文章を解析した結果を、このエントリの一番最後に載せておきます。

ClojureAPIをたたいてみる

さて、このAPIClojureから叩きたいのですが、
わざわざPureJavaを読み出すのも面白く無いので、今回は、
clj-httpというラッパーライブラリを使います。
https://github.com/dakrone/clj-http/

こいつは、Apache HttpComponentsをClojureでラップしていて、さくっとClojureからHttp-Get/Postのアクセスを行うことができます。
省エネだぜぇ

ということで、サンプルコード

(ns judgement.core
  (:require [clj-http.client :as client]))

(def yahoo-url
  ;yahoo形態素解析APIのURL
  "http://jlp.yahooapis.jp/MAService/V1/parse?appid={あなたのappId}&results=ma&response=surface,pos&sentence=")

(defn enc [in-str]
  ;;与えられた文字列をURLEncodeして返す
  (. java.net.URLEncoder encode in-str "utf8"))

(defn access-yahoo-api [src-str]
  ;;yahoo形態素解析APIにアクセスする
  (client/get 
    (str yahoo-url 
	  (enc src-str))))

はい、これだけです。
これで、Yahooの形態素解析APIを叩けます。
省エネだろぅ?

まとめ

というわけで、今日の記事のまとめはこんな感じ

明日は、@megascusさんの記事です。
よろしくお願いします。

おまけ

<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:jp:jlp" xsi:schemaLocation="urn:yahoo:jp:jlp http://jlp.yahooapis.jp/MAService/V1/parseResponse.xsd">
<ma_result>
<total_count>19</total_count>
<filtered_count>19</filtered_count>
<word_list>
<word>
<surface>この</surface>
<pos>連体詞</pos>
</word>
<word>
<surface>記事</surface>
<pos>名詞</pos>
</word>
<word>
<surface></surface>
<pos>助詞</pos>
</word>
<word>
<surface>変態</surface>
<pos>名詞</pos>
</word>
<word>
<surface>アド</surface>
<pos>名詞</pos>
</word>
<word>
<surface>ベント</surface>
<pos>名詞</pos>
</word>
<word>
<surface>カレンダー</surface>
<pos>名詞</pos>
</word>
<word>
<surface></surface>
<pos>特殊</pos>
</word>
<word>
<surface>in</surface>
<pos>名詞</pos>
</word>
<word>
<surface></surface>
<pos>特殊</pos>
</word>
<word>
<surface>Summer</surface>
<pos>名詞</pos>
</word>
<word>
<surface></surface>
<pos>特殊</pos>
</word>
<word>
<surface>9</surface>
<pos>名詞</pos>
</word>
<word>
<surface></surface>
<pos>接尾辞</pos>
</word>
<word>
<surface></surface>
<pos>名詞</pos>
</word>
<word>
<surface></surface>
<pos>助詞</pos>
</word>
<word>
<surface>記事</surface>
<pos>名詞</pos>
</word>
<word>
<surface>です</surface>
<pos>助動詞</pos>
</word>
<word>
<surface></surface>
<pos>特殊</pos>
</word>
</word_list>
</ma_result>
</ResultSet>

Ubuntu10.10にruby1.9.2インストール

なんとなく、Twitterを眺めていたらfluentdをいじってみたくなったのでインストールを始めると、結構手間取ったのでメモメモφ(。_。)

fluentd http://fluentd.org/

rvmインストールと設定

とりあえず、fluentdにはruby1.9.2が必要らしいのでインストール

rvmのインストール

sudo apt-get install rvm

rvm を最新バージョンに更新

rvm get head
rvm reload

利用できるrubyのバージョンの確認

rvm list known

rubyのインストール

rvm install (インストールするruby)

利用するrubyの決定(--defaultでデフォルトに設定)

rvm use (インストールするruby) [--default]

利用するgemの切り替えは、.bashrcに以下を追記

if [[ -s $HOME/.rvm/scripts/rvm ]] ; then
  source $HOME/.rvm/scripts/rvm
fi

以上で、インストールするrubyは1.9.2を選べばOKのはず

aptitudeインストール

これでfluentdが使える
そう思ったけど、gem install fluentd するとmkmfが無いとか怒られる
理由は、ruby-devがないから…
ruby-devの1.9系はapt-getで入れられないっぽいのでやむを得ずaptitudeから入れる

>>|
apt-get install aptitude

<<

ruby1.9.1-devインストール

aptitudeが入ったら今度こそruby-devを入れてやる
まずは、aptitudeで入れられるバージョンの確認

次のコマンドで"ruby"の文字が入ったインストール可能なパッケージを確認

aptitude search ruby

で、ruby1.9.1-devがあるのを確認(1.9.2-devはなかった)

ruby1.9.1-devのインストール

aptitude install ruby1.9.1-dev

fluentdインストール

やっとこ、ココまできた

gem install fluentd

オマケ

ubuntuのバージョンを確認する方法

lsb_release  -a

追記(2012/1/23)

rvmでruby1.9.2をインストールする前に、libruby-1.9.2とruby1.9.2-devをインストールしたほうがいいっぽい?

libruby http://www.ubuntuupdates.org/packages/show/256747
ruby1.9.2-dev http://www.ubuntuupdates.org/packages/show/256743

debパッケージをインストールするには↓

sudo dpkg -i (debファイル名)

ディレクトリのファイルの有無をしらべるシェルスクリプト

ちょっと、シェルスクリプトを弄る機会があって、
ディレクトリ内のファイルの有無での処理分けを書いてみた

実は、シェルスクリプトは初めてだったりします

要するに

 ls | wc -l 

の結果が0かどうかを見てるだけなんですが、
もっとスマートな実装があれば誰か教えてください

#!/bin/sh

if [ $# == 0 ]
then
	DIR="./"
else
	DIR=$1
fi

FCOUNT=(`ls $DIR | wc -l`)

if [ $FCOUNT == 0 ]
then
	echo "File not exist."
else
	echo "$FCOUNT Files here."
fi

追記

@kiy0takaさんから、ファイルの有無だけなら

if [ -z "`ls $DIR`" ] 

で取れると教えて頂きました。

lsコマンドの結果文字列が0かどうかを -zで検査してるんですね。
なるほど〜

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界