KLab の社内勉強会 ALM で LT をしました。
内容としては、もう2回くらいLTをしている、immutable list gem についての話をしました。
前回からの違いとしては、クイックソートのベンチマーク結果を盛り込んで、実用性をアピールした内容にしました。
KLab の社内勉強会 ALM で LT をしました。
内容としては、もう2回くらいLTをしている、immutable list gem についての話をしました。
前回からの違いとしては、クイックソートのベンチマーク結果を盛り込んで、実用性をアピールした内容にしました。
Ruby 2.1.0 がついにリリースされましたね!!!
なんと嬉しいクリスマスプレゼントなんでしょう!
Java
if(!treat) trick();
C#
if(!Treat) Trick();
Python
if not treat:
self.trick();
Ruby
trick unless treat?
結論: Ruby が一番シンプル
Immutable な LinkedList を Ruby で使うためのライブラリです。
C-Extension なので、Rubyで実装したものに比べて動作が高速です。
Ruby の Array
は 配列で実装されているため、
長いリストでの先頭への要素を追加(cons
)や連結(append
)が
とても遅いという問題を解決しようと思って作りました。
用途としては、Rubyで再帰を使って関数型言語風にプログラムを組むことを想定しています。
RubyGems で公開したので、次のようにターミナルで入力するだけで導入できます。
$ gem install immutable_list
先日、immutable_list というgemを公開したのですが、 思っていたよりも簡単に rubygems.org に登録することができて感動しました。
gemを作るには、色々な方法があるようですが、最近だとBundler を使う方法が一番シンプルで良さそうです。
RubyGems に gem を登録するためには、gitのリモートリポジトリが必要ですが、ここでは GitHub を利用します。
あと、よく質問されるのですが、RubyGems に登録するために審査は一切ありません。
本題とはズレますが、gemの命名にはルールがあるので軽く紹介します。
gemname には、小文字のアルファベット、数字、ハイフン、アンダースコア、ドットが使用可能のようです。
ハイフンとアンダースコアは次のように使い分けることが推奨されています。
Getting Started with Railsを参考にして Rails4 のプロジェクトを作りました。
念の為にバージョンもメモしておきます。
Mac OS X でやりました。
関連記事
ActiveRecord をCGIで単体で使おうとしたのですが、ActiveRecord の初期化に数秒かかってしまい、 レスポンスが遅すぎて使い物になりませんでした。
結局、ActiveRecord の部分を生のSQLite3で再実装しました。
Rails のようにサーバが起動したらずっと同じプロセスで動作するようなものであれは、初期化が遅くても問題にはならないのですが、 CGI のように、appache が毎回プロセスを起動するようなものだと、ActiveRecord を使うのは諦めたほうがいいようです。
ActiveRecord の悪口になってしまいましたが、ActiveRecord そのものは本当に便利でした。
テーブルの作成のために ActiveRecord を使うのはいいかもしれないと思いました。
SQLite3(というか、ActiveRecordの問題なのだろうか。要検証。) を CGI から使うときは、パーミッションに注意しないと、ハマります。
以下のような例外が起きることが有りました。
SQLite3::CantOpenException: unable to open database file
SQLite3::ReadOnlyException: attempt to write a readonly database
上のような例外が発生した場合、次のことを確認して下さい。
www-data
で、データベースのファイル名が db/db.sqlite3
なら、以下のように変更する。chown www-data.www-data db/db.sqlite3
db/db.sqlite3
なら、ディレクトリdb
のパーミッションは 777 である必要があるようです。
参考Ruby で sqlite3 gem
を使ってtableにプレースホルダを使ってinsert
した時、
can't prepare Time
とかいうエラーが発生するときは、値を文字列に変換してやると解消するかもしれません。
# Timeクラスを直接渡すと、can't prepare Time とか言われる例
h = {:time => Time.now, :data = "なんとかかんとか"}
db.execute("insert into table(time, data) values (:time, :data)", h)
次のように、Time クラスを直接渡さずに、明示的に文字列に変換してから渡すと解消するかもしれません。
# Timeクラスを文字列に変換して渡すと解消するかも
h = {:time => Time.now.to_s, :data = "なんとかかんとか"}
db.execute("insert into table(time, data) values (:time, :data)", h)