すがブロ

sugamasaoのhatenablogだよ

mecabにwikipediaとhatenaキーワードのユーザ辞書を適用する(ついでに、辞書にない場合はそれもわかるようにするオプション付き)

mecabのインストール

$ brew install mecab
$ brew install mecab-ipadic

wikipediaとhatenaのキーワードファイルの取得

$ curl -L http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv | iconv -f euc-jp -t utf-8 > keywordlist_furigana.csv
$ curl -L http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz | gunzip > jawiki-latest-all-titles-in-ns0

辞書作成コードを用意する(make_dict.rb)

gist88bfb2936690d5508a8c

$ ruby make_dict.rb

辞書を作成する

$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic -u onomasticon.dic -f utf-8 -t utf-8 onomasticon.csv

試してみる

作成したユーザ辞書を -u で指定すると、有効になる。ちなみに、 --unk-feature を指定すると、判定できなかった言葉に対して指定した文言を割り付けることができる

$ echo 'レーベンシュタイン距離' | mecab --unk-feature "未知語"
レーベンシュタイン      未知語
距離    名詞,一般,*,*,*,*,距離,キョリ,キョリ
EOS
$ echo 'レーベンシュタイン距離' | mecab -u onomasticon.dic --unk-feature "未知語"
レーベンシュタイン距離  名詞,一般,*,*,*,*,レーベンシュタイン距離,*,*,wikipedia
EOS

前者では レーベンシュタイン を未知語として判定しているのに対し、後者では レーベンシュタイン距離 で一語として判定していて、かつwikipediaに登録されているデータということもわかる。

パーフェクトシリーズが電子書籍になりました

11/1より発売

完全に出遅れましたが、パーフェクトシリーズが電子書籍化されました。

シリーズと書いてるくらいで、RubyRailsだけではなく、PythonPHP等も一挙同時リリースです。

Amazonでは、以下のkindle版が購入できます。

パーフェクトRuby

パーフェクトRuby

パーフェクトRuby on Rails

パーフェクトRuby on Rails

また、技術評論社さんの電子書籍ストアからはEPUB形式が購入できます。

なお、技評さんのEPUB版の書籍の詳細画面に行くとアナウンスがありますが、現時点ではソースコード内のインデントに問題があるそうなので、その点だけご留意いただければと思います(修正されたらそのバージョンが取得できるそうです)。

補足

現在、パーフェクトRubyは3刷目が、パーフェクトRuby on Railsは2刷目が出版されています*1。これらは増刷がはいるタイミングで誤字脱字など*2の修正を行っています。

そして、電子書籍はそれらの最新版相当(Rubyなら3刷、Railsなら2刷)の内容になっていますので、よろしくお願い致しますですぞ〜〜。

*1:いわゆる増刷というやつです

*2:修正する必要がなければそれに越したことはないですが、、、

Yosemiteでgit pullすると git-sh-setup: No such file or directory って言われてしまった

どうもiTerm2のバージョンによって(古いと)遭遇するっぽい。 git側にパッチ当てたりする方法もあるらしいけど、iTerm2のバージョンを上げるのが正しい方法っぽいかな?

アップデート前のバージョンをメモするの忘れたけど、 Buiild 2.0.0.20141022 で解消していることを確認できた。

f:id:seiunsky:20141029234245p:plain

rack-lineprofをSinatraアプリに使う

ISUCONでたぶん使うであろう自分の作業メモです。

サンプルアプリとして sugamasao/Shiori · GitHub を使ってみるよ。

気になった人はこの本を買ってね!!!!1

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

それでは実際の作業をしていくよ。

% git clone git@github.com:sugamasao/Shiori.git

ディレクトリを移動する

% cd Shiori

Gemfileに rack-lineprof を入れる。

 group :development do
+  gem 'rack-lineprof'
   gem 'pry'
 end

bundle installする。

% bundle install --without production

SQLite3にスキーマを作る

% cd db
% sqlite3 sqlite.db < schema.sqlite3.sql

上位ディレクトリに移動してbundle exec rackupする。 これで通常の動きを確認できる。

次に、rack-lineprofを導入する。

+require 'rack-lineprof'
 require 'rack/protection'
 require './app/shiori'
 
+use Rack::Lineprof

これで http://localhost:9292/?lineprof=shiori.rb にアクセスすると、ターミナルに以下のように出力される。

app/shiori.rb
               |  29  
               |  30    get '/' do
   0.4ms     3 |  31      @bookmarks = Bookmark.order('id DESC').page(params[:page])
   5.4ms     1 |  32      erb :index
               |  33    end
               |  34  

127.0.0.1 - - [28/Sep/2014 00:21:17] "GET /?lineprof=shiori.rb HTTP/1.1" 200 1079 0.0089

なお、パラメータで shiori.rb と指定しているが、app/shiori.rb としても大丈夫。なので、複数で同じ名前のファイル名があったりする場合はディレクトリ名を含めたパスを指定すれば良さそう。 同じように、パラメータ部分をindex.erbにすると以下のように、viewファイルのプロファイルも取れる

[Rack::Lineprof] ===============================================================

app/views/index.erb
               |   1  <h1>登録したURL一覧</h1>
   1.0ms     3 |   2  <%= will_paginate @bookmarks %>
               |   3  <div>
               |   4    <a href='/new'>新規登録</a>
              .......
               |  13    </thead>
               |  14    <tbody>
   1.1ms     4 |  15      <% @bookmarks.each do |bookmark| %>
               |  16        <tr>
               |  17          <td><%= h bookmark.id %></td>

127.0.0.1 - - [28/Sep/2014 00:21:26] "GET /?lineprof=index.erb HTTP/1.1" 200 1079 0.0084

ちなみに、これはrack-lineprofの問題ではないけれど、unicornをインストールする際に利用される wsylvest/kgio · GitHub が2.2.0-preview1でビルドでエラーになってしまう……。

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/sugamasao/.rbenv/versions/2.2.0-preview1/bin/ruby -r ./siteconf20140928-35901-blyemq.rb extconf.rb 
checking for CLOCK_MONOTONIC in time.h... no
checking for CLOCK_MONOTONIC() in time.h... no
checking for clockid_t in time.h... no
checking for clock_gettime() in -lrt... no
checking for t_open() in -lnsl... no
checking for socket() in -lsocket... no
checking for poll() in poll.h... yes
checking for getaddrinfo() in sys/types.h,sys/socket.h,netdb.h... yes
checking for getnameinfo() in sys/types.h,sys/socket.h,netdb.h... yes
checking for struct sockaddr_storage in sys/types.h,sys/socket.h... yes
checking for accept4() in sys/socket.h... no
checking for sys/select.h... yes
checking for writev() in sys/uio.h... yes
checking for ruby/io.h... yes
checking for rb_io_t.fd in ruby.h,ruby/io.h... yes
checking for rb_io_t.mode in ruby.h,ruby/io.h... yes
checking for rb_io_t.pathv in ruby.h,ruby/io.h... yes
checking for struct RFile in ruby.h,ruby/io.h... yes
checking size of struct RFile in ruby.h,ruby/io.h... 24
checking for struct RObject... yes
checking size of struct RObject... 40
checking size of int... 4
checking for rb_io_ascii8bit_binmode()... yes
checking for rb_update_max_fd()... yes
checking for rb_fd_fix_cloexec()... yes
checking for rb_cloexec_open()... yes
checking for rb_thread_blocking_region()... no
checking for rb_thread_io_blocking_region()... yes
checking for rb_str_set_len()... yes
checking for rb_time_interval()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_str_subseq()... yes
checking for rb_ary_subseq()... yes
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling accept.c
In file included from accept.c:90:
/Users/sugamasao/.rbenv/versions/2.2.0-preview1/include/ruby-2.2.0/ruby/backward/rubysig.h:14:2: warning: rubysig.h is obsolete [-W#warnings]
#warning rubysig.h is obsolete
 ^
accept.c:101:2: error: use of undeclared identifier 'TRAP_BEG'
        TRAP_BEG;
        ^
accept.c:103:2: error: use of undeclared identifier 'TRAP_END'
        TRAP_END;
        ^
1 warning and 2 errors generated.
make: *** [accept.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/sugamasao/.rbenv/versions/2.2.0-preview1/lib/ruby/gems/2.2.0/gems/kgio-2.8.1 for inspection.
Results logged to /Users/sugamasao/.rbenv/versions/2.2.0-preview1/lib/ruby/gems/2.2.0/extensions/x86_64-darwin-13/2.2.0-static/kgio-2.8.1/gem_make.out
An error occurred while installing kgio (2.8.1), and Bundler cannot continue.
Make sure that `gem install kgio -v '2.8.1'` succeeds before bundling.

基本的には以下のブログをなぞるだけで大丈夫でした。ありがとうございます〜。

RubyKaigi 2014 で出会った神ツールのメモ

RubyKaigi 2014、楽しかったし、学びがあって行って良かったなぁと思いました(小並感すぎる)。

淡々とメモしておくよ

YAPC::Asia Tokyo 2014 に参加しました

初めてのYAPC

他言語のカンファレンスはいくつか行ったことあったのだけど、Perlの……つまり、YAPCは今年が初めてでしたが、結論から言えばめちゃめちゃ楽しかったし、がんばってこ!っていう気持ちになった。

参加するモチベーションとしては、タイムテーブルを見るとわかりますがPerlに限らず、運用や設計(色んな意味でね)に関することが多かったので、非Perlプログラマーでもきっと楽しめるかなという点と、何より知り合いが運営や登壇するイベントというのはやっぱり参加してみたいなって思ったのでした。

1日目

ことごとく乗り換えを失敗して開会の言葉を聞けなくて残念過ぎた。。。

インフラエンジニア(狭義)は死んだ - YAPC::Asia Tokyo 2014

めっちゃ人多くてスライドをあまり見れなかったのが残念でしたが、とにかく「インフラ(あるいはプログラマー)」だから「XXXは自分のやることじゃない」みたいのは良くないよねっていう話が印象にのこった。

完成されたシステムなどない。完成された人間もいない。あるのは成長し続ける未完成なシステムと、それを支える未完成な人間だけだ - YAPC::Asia Tokyo 2014

けんじおじさんの話だったので聞きに行ったのですが、なんというか、非常に言いたいことは伝わるんだけど、スピリチュアルだった(良くも悪くも……)w あとは質疑応答が結構面白かった。

その後

イベントホールでは無限コーヒーがあったので無限コーヒーやランチセッションで薄毛の話を聞きながらコード書いたりしていた。

あとは コマンドラインツールについて語るときに僕の語ること - YAPC::Asia Tokyo 2014 を聞きたかったんだけど完全に出遅れてまたスライド見れなそうだったのでソンムーさんのライブコーディングを見たりしていた(ライブコーディング、ショーとしての楽しさがあるので見ていて面白かった)。

WHERE狙いのキー、ORDER BY狙いのキー - YAPC::Asia Tokyo 2014

order by時のINDEX、いまいち使いこなせなかったので非常にためになった……と言いたいところだけど、後半、ちょっとコードが読めなくて理解しきれなかったので後で資料を見直そうと思う。でも考えるヒントは得た気がする。あと、自分はメガネの度数調整したほうが良いですね。

その後

ホールでコードでも書くかと思ってフラフラしてら @do_aki と遭遇して話していたら何人か集まってきて、真のREPL( XcodeのREPLや The IPython Notebook — IPython )についてとか、書籍の執筆でPDFになると辛いよね話とかをしていたらいつの間にか一日目が終わってしまった。

2日目

突然ITインフラを任された人のための…監視設計入門 - YAPC::Asia Tokyo 2014

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

の共著者の一人、@koemuさんの話。すごく地に足の着いた話で、具体的にどうするんだろっていうところを話してもらえて良かった。イマイチ土台がしっかりしないままやってる部分ではあるので、こういう話を聞けたのは良かった。

半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情(5.6対応) - YAPC::Asia Tokyo 2014

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

の共著者の一人、@uzullaさんの話。そして今回のベストトーク賞。PHPはぶっちゃけ全然書いたことないけど、面白かった。というか、なんだかんだ、PHPへの愛がすごい。

その他

イベントホールでコード書いたりあやかNowしたりして過ごした。最後にライトニングトークを聞いた。最近、あまり大きなイベントでLTを見るのなかった気がしたので、ああいう勢いとか楽しむ、みたいな空気はなんか良かった。

キーノート - YAPC::Asia Tokyo 2014

直接面識はないのだけど、同じ会社のイングレスおじさんの知り合いなのでお名前はよく見ていた。なんというか、簡単に言えば生き様の話をしていたのだけど、ぼくもがんばって生きていこうと思った。

クロージング

ベストトーク賞、PHPコールが起きてカオスでしたがおめでとうございます!!!!!1 あと @yusukebe の話し方がすごくいい感じで、なんというか形式張ったカッチリした雰囲気にならないで進められていたの良いなと思った(1日目のオープニング聞けなくて残念だ)。これは人柄とかもあるんでしょうけど、この規模でも、良い意味で手作りな感じが出てる会っていうのは良かったなぁ。

その他、きになったコト

多目的教室はちょいと人が集まると立ち見になってしまってかなりキャパシティが厳しそうな気がした。立ちっぱなしてスライド見続けるのも難しいけど、それよりも、投影が白っぽくなってしまう(照明の問題かな)ので、ちょっとみにくいなーと思った。

Fast-fowordでgit mergeしちゃったけどやっぱ--no-ffでmergeしたかった

ついうっかりマージするときに--no-ff付けずにマージしちゃったときにどうするか

reflog見て何個前のcommitか確認する

git reflog | head
   : 
xxx HEAD@{1}: merge hoge-branch: Fast-forward
   :

{1}らしい。そしたらresetしてもう一回マージしなおす

git reset --hard HEAD@{1}
git merge --no-ff hoge-branch
git push origin master

やったね

resetの綴り間違えている所があったから直しておいたよ