el-get on Debian

投稿者 okkez 2011-11-12 07:54:00 GMT

Debian GNU/Linux の sid で el-get と使ってみたのでそのまとめ。

あ、emacs23 を使っています。

$ sudo apt-get install el-get

標準のレシピは /usr/share/el-get/recipes/ 以下にあります。 今、数えたら420個くらいレシピがありました。

レシピの書き方は、それらのレシピを見たりすればなんとなくわかるんじゃな いかと思いますが、実際に一からレシピを書くことはそんなにありません。 既存のレシピがダメな場合にちょっと変更したりするくらいです。

自分の .emacs は https://github.com/okkez/dotfiles で公開しています。

https://github.com/okkez/dotfiles/blob/master/emacs-config/config-el-get.el にコメント入りで書いているのでよかったら参考にしてください。

自分の用途では既存のレシピでダメだったのは、依存関係が壊れてる (haml-mode, sass-mode)、アップストリームのリポジトリが移動しているのに 追従していない(yasnippet)、余計なことをしている(ruby-electric) でした。

el-get のいいところは、

  • いろいろな配布形式に対応している
  • レシピを書いて sync するようにしておけば、初回起動時に自動でインストールできる
  • 無理にレシピに設定を書かなくてもいい
    • 既存の資産を活かすことができる

でしょうか。 起動時に入ってなかったら自動でインストールしてくれる点が気にいってます。

el-get を使う前後で ELPA も検討してみたのですが、el-get が ELPA に対応 しているので emacs24 になっても el-get を使うようにしておけば、emacs24 になっても特に問題ないかなーと考えています。

カテゴリ ,  | タグ  | コメントなし | トラックバックなし

Trying to upgrade rurema-search

投稿者 okkez 2011-07-20 16:21:00 GMT

[ruby-list:48219] から始まるスレッドを見て久しぶりに更新してみることにしたら、まだできない。

今晩は諦めて寝てしまうかもしれないので doc.okkez.net/search/ のは止まるかもしれません。

okkez.net が止まっている間は以下のどちらかを利用してください。

  • http://doc.ruby-lang.org/ja/search/
  • http://rurema.clear-code.com/

doc.okkez.net は更新できたっぽいです。(追記)

カテゴリ ,  | タグ  | コメントなし | トラックバックなし

rabbit を新しいノートPCに入れてみた

投稿者 okkez 2011-07-14 15:09:00 GMT

RubyKaigi2011 に合わせて新しいノートPCを買ったので rabbit を入れてみた。 Debian sid に入れたんだけど、動くようになるまでちょっと苦労した。 インストールは gem i rabbit で出力されたエラーを解消するようにパッケージをひたすら入れるだけだった。

rabbit を起動しようとすると LoadError: can’t find theme: rabbit-images. が出力されてちゃんと動かなかった。 rvm を使っているのでたぶん $LOAD_PATH の設定が合わないんだと思った。

なのでコマンドのオプションに -I ~/.rvm/gems/ruby-1.9.2-p180/gems/rabbit-0.9.3/data/ を追加すればいい。

書いてから気付いたけど、普通に gem で入れたときでも同じなんじゃないかと思った。

一応、ちゃんと動いたので発表ができる。

カテゴリ ,  | コメントなし | トラックバックなし

久し振りに本を買った

投稿者 okkez 2011-06-02 15:33:00 GMT

あんまり技術よりじゃない気もするけど、なんか読みたくなったので買ってみた。

カテゴリ  | コメントなし | トラックバックなし

2011-03-11 の帰宅まで

投稿者 okkez 2011-03-12 17:56:00 GMT

記憶をもとにざっくり書いてます。

2011-03-11 は栃木県小山市のオフィスに出社してた。

14:46 地震発生。 まわりに落下してくるものもなかったので、目の前にあったでっかい液晶ディスプレイをささえてた。

弊社では、水道橋のオフィスと Skype で常時つながっているのですが、小山で揺れはじめて数秒後には 東京のオフィスでも揺れはじめていました。 両方で揺れているのがわかるようになってから、十数秒後には停電してしまって Skype による接続は切れてしまいました。

WiMAX のモバイルルータを持っていたのでそれを試してみましたが、つながらず、3G はつながったので twitter 経由で無事をつぶやきつつ、ワンセグで状況確認。一緒にいた人が持っていた b-mobile もつながってたみたい。

近所のコンビニもまどから見ると停電していました。

あとはノートPCのバッテリがなくなるまで仕事してました。

17:00 過ぎに、さいたま方面に帰る同僚の車に乗せてもらいました。

栃木では塀が倒れている家があったり、信号がついていたり、ついていなかったりして危なかったですが、交通事故はありませんでした。 ところどころ、大きな交差点には警察官が立って交通整理をしていました。 停電していない地域では、割と普通にいろいろな店が営業していましたが、24h 営業のコンビニやマクドナルドは閉店してるところもありました。

途中のコンビニはおにぎりやパンは売り切れだったので、どらやきとチップスターを買って食べたり。

23:10 くらいに家に到着。 帰宅する前は、本棚などが倒壊していることを心配していましたが、全くそんなことはなくて綺麗なままでした。 電気、ガス、水道も通じていました。

大阪の実家には翌朝連絡しました。

カテゴリ  | コメントなし | トラックバックなし

Try ActiveGroonga!

投稿者 okkez 2010-12-05 07:04:00 GMT

(この記事は Ruby Advent Calendar jp: 2010 : ATND の 5日目です。前日はauthorNariさんでした。)

buzztter - Twitter のイマを切り取ったー☆Rubyリファレンスマニュアル全文検索 | るりまサーチ で使われている groonga - an open-source fulltext search engine and column store. をご存知でしょうか。groonga 自体の説明は公式サイトを見てください。

groonga には Ruby バインディングの rroonga があります。 さらにその rroonga を ActiveRecord っぽいインターフェイスで使える ActiveGroonga があります。

ところで、先日 2010-11-29 に 全文検索エンジンgroongaを囲む夕べ #1 : ATND がありました。 その中で Ruby 枠の話もありました。

Ruby 枠の最後の方で Rails3 と ActiveGroonga を使ったデモがあったのです が、それを自分なりに再構成してみたいと思います。

開発環境は groonga が 64bit 前提で、rroonga が Ruby1.9.2 必須です。

テーマは某ミニブログのクローンです。 名前は groonga を使っているのでちょっと長いですが groongatter にしましょう。 まずは、新しいプロジェクトを作成します。ActiveRecord と prototype.js は使わないので、このプロジェクトには組み込みません。

  $ rails new groongatter -O -J

Gemfile を編集して ActiveGroonga を使うようにします。

source 'http://rubygems.org'

gem 'rails', '3.0.3'

gem 'activegroonga'

編集したら以下のコマンドを実行します。

  $ bundle install --path vendor/bundle

rroonga のインストール時に groonga の適切なバージョンが見つからない場 合は groonga もビルドするので時間がかかります。rroonga や groonga のビ ルドに失敗したときは groonga のビルド環境を整えてからやってみてくださ い。Debian や CentOS のパッケージは用意されているのでそちらをインストー ルしてからやってみるのもいいでしょう。

次に config/application.rb を編集しておきましょう。

diff --git a/config/application.rb b/config/application.rb
index 1c1e1aa..296a1d5 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -7,6 +7,8 @@ require "action_mailer/railtie"
require "active_resource/railtie" require "rails/test_unit/railtie"
+require "active_groonga/railtie"
+
# If you have a Gemfile, require the gems listed there, including any gems # you've limited to :test, :development, or :production. Bundler.require(:default, Rails.env) if defined?(Bundler)

これで開発準備が整いました。

まずは、ユーザモデルを作ってみましょう。

  $ rails generate scaffold user name:short_text
  $ rake groonga:migrate
  $ rails server

ウェブブラウザで http://localhost:3000/users にアクセスすると、いつもの scaffold な画面が表示されるので適当に何人かユーザを作成しておく。

次につぶやきモデルを作ります。

  $ rails generate scaffold tweet content:short_text user:reference

http://localhost:3000/tweets から適当につぶやいてみてください。 このとき User には既に存在する User の id を指定してください。

このままだと、表示が #<User:0x00000003bd9388> のようになってしまうので view を修正します。とりあえず、 views/tweets/{index,show}.html.erb あ たりを修正しておきましょう。

<h1>Listing tweets</h1>

<table>
  <tr>
    <th>User</th>
    <th>Content</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @tweets.each do |tweet| %>
  <tr>
    <td><%= tweet.user.name %></td>
    <td><%= tweet.content %></td>
    <td><%= link_to 'Show', tweet %></td>
    <td><%= link_to 'Edit', edit_tweet_path(tweet) %></td>
    <td><%= link_to 'Destroy', tweet, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New Tweet', new_tweet_path %>
<p id="notice"><%= notice %></p>

<p>
  <b>User:</b>
  <%= @tweet.user.name %>
</p>

<p>
  <b>Content:</b>
  <%= @tweet.content %>
</p>

<%= link_to 'Edit', edit_tweet_path(@tweet) %> |
<%= link_to 'Back', tweets_path %>

やっと全文検索用のインデックスを作ります。

  $ rails generate migration create_full_text_search_index 

こんな感じでインデックスを定義します。 オプション説明は groonga のドキュメントなどを見るといいと思います。

class CreateFullTextSearchIndex < ActiveGroonga::Migration
  def up
    create_table("bigram",
                 :type => :patricia_trie,
                 :key_type => "ShortText",
                 :default_tokenizer => "TokenBigram",
                 :key_normalize => true) do |table|
      table.index("tweets.content")
    end
  end

  def down
    remove_table("bigram")
  end
end
  $ rake groonga:migrate

とりあえず、コンソールで試してみましょう。

  $ rails console
  >> result_set = Tweet.select(:content => "こん")
  >> pp retult_set.first
  => #<Tweet id: 1,
  user: #<User id: 1, updated_at: 1970-01-01 09:00:00 +0900, name:
  "okkez", created_at: 2010-12-05 15:13:55 +0900>,
  updated_at: 2010-12-05 15:14:58 +0900, created_at: 2010-12-05 15:14:44 +0900, content: "こんにちは!">

うまく検索出来ているみたいですね!

最後に検索用の UI を作っておきましょう。

  $ rails generate controller search index

config/routes.rb はこんな感じにしておきます。

Groongatter::Application.routes.draw do
  match "search", :to => "search#index", :as => "search"

  resources :tweets

  resources :users
end

app/controllers/search_controller.rb はこんな感じです。

class SearchController < ApplicationController
  def index
    @query = params[:query]
    if @query.blank?
      @result_set = []
    else
      @result_set = Tweet.select do |entry|
        entry.content =~ @query
      end
    end
  end
end

app/views/search/{index,_form}.html.erb はそれぞれこんな感じです。

<h1>Search</h1>

<%= render :partial => "form" %>

<%- unless @query.blank? -%>
<p>"<%= @query %>" で検索した結果は <%= @result_set.count %> 件です。</p>
<%- end -%>

<%- unless @result_set.blank? -%>
  <ul>
    <%- @result_set.each do |entry |-%>
      <li><%= entry.user.name %>: <%= entry.content %></li>
    <%- end -%>
  </ul>
<%- end -%>
<typo:code>

<typo:code lang="html">
<%= form_tag(search_path) do %>
  <p>
    <%= text_field_tag(:query, "", :size => 25) %>
    <%= submit_tag("検索") %>
  </p>
<%- end -%>

あとはスペース区切りでの AND 検索くらいに対応したいところですが、それ は自分で試してみてください。

カテゴリ  | タグ  | コメントなし | トラックバックなし

git pre commit hook

投稿者 okkez 2010-10-07 08:36:00 GMT

以下のようなコードを .git/hooks/pre-commit として保存し、実行できるようにしておくと、 コミット前にコミットしようとしているファイルの文字コードをチェックできる。

これは、るりまでときどき UTF-8 なファイルをコミットしてしまうので作った。

#!/bin/sh
flag=0
for f in $(git diff --cached --name-only);do
    if [[ `nkf -g ${f}` = 'UTF-8' ]];then
        flag=1
        echo "${f} is UTF-8"
    fi
done
if [ $flag -eq 1 ];then
    exit 1
fi
exit 0

追記

バズ経由で @no6v にコメントもらった。 曰く「nkf 呼びすぎだぉ」

#!/bin/sh
if nkf -g $(git diff --cached --name-only) /dev/null | grep :UTF-8$; then exit 1; fi

カテゴリ  | タグ  | コメントなし | トラックバックなし

raise NoMethodError from locale_rails

投稿者 okkez 2010-07-15 15:44:00 GMT

最近、Rails2.3.8 に上げたり上げなかったりしたら以下のようなエラーが大量に出るようになった。

NoMethodError in 'BatchController POST create by login user when posted data was valid should create valid subject (end_date)'
undefined method `clear' for I18n::Locale:Module

ちょっと調べてみたら、locale_rails/lib/locale_rails/i18n.rb の中で Locale モジュールを参照している部分でエラーになっていた。 そこを ::Locale とトップレベルから参照するようにしたら動くようになった。

http://github.com/mutoh/locale_rails も調べてみたら、リポジトリ上では既に直っていた。

コメントなし | トラックバックなし

Read "Source code reading technic for programmers"

投稿者 okkez 2010-07-15 15:33:00 GMT

「プログラマーのためのソースコードを読む技術」という本をジュンク堂で見かけたので、買って読んでみた。

わかっている人にとってはものすごく普通の内容でした。 それでも、後半のコードリーディング実践の部分は実際に使われているソースコードを全文掲載していて、 移動中でも読めそうな感じだったのは良いと思いました。実際に、自分も移動中に読んでいました。

個人的にはあまり合わなかったけど、これからプログラマや SE として働く人や、新人教育担当になる予定の人や 来年から後輩ができる人なんかは読んでみると参考になると思います。

カテゴリ  | タグ  | コメントなし | トラックバックなし

Reading "Refactoring Ruby Edition" #2

投稿者 okkez 2010-07-12 12:43:00 GMT

日曜日に「リファクタリング Ruby エディション」読書会の第二回に行ってきた。 二章から六章の途中まで読んだ。

二章から五障まではオリジナルのリファクタリングとあまり違いが無かった。 六章からリファクタリングのカタログが始まる。まだいくつかの節しか読んでいないが、参考になることも多いけど、 知っていることの方が多い。

でも、間違ったことも色々と書いてあるので、読みこなすには中級以上の知識が必要だと思った。

カテゴリ  | タグ  | コメントなし | トラックバックなし