KLab の社内勉強会 ALM で LT をしました。

Immutable List Gem (KLab ALM版) from Sho Hosoda

内容としては、もう2回くらいLTをしている、immutable list gem についての話をしました。

前回からの違いとしては、クイックソートのベンチマーク結果を盛り込んで、実用性をアピールした内容にしました。

Read more


はじめに Ruby 2.0では、Enumerable#lazy というメソッドと、その返り値である Enumerator::Lazy が導入されました。 この記事では、Enumerable#lazy と Enumerator::Lazy によって無限リストをmapできることを紹介します。 また、Enumerator と Enumerator::Lazy の本質的な違いを説明します。 遅延リストとは 遅延リストですが、Haskell などの一部の関数型言語では一般的に使われているもので、 遅延評価といって、値が必要になるまで計算しないことによって、無限に続くリストも扱うことができるというものです。 無限リストをmapする 普通にやってみるとダメ 次のような無限リスト(無限の長さを持つ Range オブジェクト )を map する式[1]を考えてみます。 この式は実行が終わりません。 [1] pry(main)> (1..Float::INFINITY).map{|n| n*2}.first(5) # => (実行が終わらない…) [1]の式のmap では、Enumerable#map が呼ばれます。 Enumerable#map は配列Arrayを返り値とするメソッドなので、無限の長さの配列を作ろうとして、処理が終わらなくなります。 lazy を付けてみると動く Enumerable#lazy を使って、次の式[2]ように無限リストを map によって処理することができます。 [2] pry(main)> (1..Float::INFINITY).lazy.map{|n| n*2}.first(5) # => [2, 4, 6, 8, 10] [2]の式のmap では、Enumerator::Lazy#map が呼ばれます。 Enumerable#lazy は リスト(Array,Rangeなど)を 遅延リスト Enumerator::Lazy に変換するメソッドです。 Enumerator::Lazy#map も Enumerator::Lazy を返すメソッドです。

Read more


Ruby 2.1.0 がリリース

Ruby 2.1.0 がついにリリースされましたね!!!

なんと嬉しいクリスマスプレゼントなんでしょう!

Read more


gem関連に関してメモを残します。 .gem ファイルを展開してパッケージの中身を見る .gem ファイルを展開してパッケージの中身を見る方法を紹介します。 gem unpackはgemをインストールしたくないけど、単に中身を見たいときなどに役に立ちます。 gem unpack xxx.gem のように使います。 [~/Downloads]$ gem unpack unicode_math-1.2.0.gem Unpacked gem: ‘/Users/gam0022/Downloads/unicode_math-1.2.0’ [~/Downloads]$ [~/Downloads]$ tree unicode_math-1.2.0 unicode_math-1.2.0 ├── Gemfile ├── LICENSE.txt ├── README.md ├── Rakefile ├── lib │ ├── unicode_math │ │ ├── constants.rb │ │ ├── division.rb │ │ ├── exponents.rb │ │ ├── fractions.rb │ │ ├── multiplication.rb │ │ ├── roots.rb │ │ ├── set.rb │ │ ├── sigma.rb │ │ └── trigonometry.

Read more


いろんな言語で Trick or Treat してみました。

Java

if(!treat) trick();

C#

if(!Treat) Trick();

Python

if not treat:
    self.trick();

Ruby

trick unless treat?

結論: Ruby が一番シンプル

Read more


ImmutableList gem とは

Immutable な LinkedList を Ruby で使うためのライブラリです。

C-Extension なので、Rubyで実装したものに比べて動作が高速です。

Ruby の Array は 配列で実装されているため、 長いリストでの先頭への要素を追加(cons)や連結(append)が とても遅いという問題を解決しようと思って作りました。

用途としては、Rubyで再帰を使って関数型言語風にプログラムを組むことを想定しています。

Immutable List Gem (KLab ALM版) from Sho Hosoda

導入方法

RubyGems で公開したので、次のようにターミナルで入力するだけで導入できます。

$ gem install immutable_list

Read more


はじめに

先日、immutable_list というgemを公開したのですが、 思っていたよりも簡単に rubygems.org に登録することができて感動しました。

gemを作るには、色々な方法があるようですが、最近だとBundler を使う方法が一番シンプルで良さそうです。

RubyGems に gem を登録するためには、gitのリモートリポジトリが必要ですが、ここでは GitHub を利用します。

あと、よく質問されるのですが、RubyGems に登録するために審査は一切ありません。

Tips: gemの命名方法

本題とはズレますが、gemの命名にはルールがあるので軽く紹介します。

gemname には、小文字のアルファベット、数字、ハイフン、アンダースコア、ドットが使用可能のようです。

ハイフンとアンダースコアは次のように使い分けることが推奨されています。

  • - (ハイフン) : パスの区切り
  • _ (アンダースコア) : 単語の区切り

Read more


Rails4のアプリをHerokuで動かすまでにしたことをメモします。

1. Rails4 のプロジェクトを作る

Getting Started with Railsを参考にして Rails4 のプロジェクトを作りました。

念の為にバージョンもメモしておきます。

ruby
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
rails
Rails 4.0.0

Mac OS X でやりました。

Read more


Twitter名刺ジェネレータを作るにあたって、 ActiveRecord と SQLite3 を使ったので、勉強になったことを適当にメモします。

関連記事

ActiveRecord は initialize が遅すぎて CGI には使えない

ActiveRecord をCGIで単体で使おうとしたのですが、ActiveRecord の初期化に数秒かかってしまい、 レスポンスが遅すぎて使い物になりませんでした。

結局、ActiveRecord の部分を生のSQLite3で再実装しました。

Rails のようにサーバが起動したらずっと同じプロセスで動作するようなものであれは、初期化が遅くても問題にはならないのですが、 CGI のように、appache が毎回プロセスを起動するようなものだと、ActiveRecord を使うのは諦めたほうがいいようです。

ActiveRecord の悪口になってしまいましたが、ActiveRecord そのものは本当に便利でした。

テーブルの作成のために ActiveRecord を使うのはいいかもしれないと思いました。

SQLite3 を CGI で使うときはパーミッション注意

SQLite3(というか、ActiveRecordの問題なのだろうか。要検証。) を CGI から使うときは、パーミッションに注意しないと、ハマります。

以下のような例外が起きることが有りました。

  • SQLite3::CantOpenException: unable to open database file
  • SQLite3::ReadOnlyException: attempt to write a readonly database

上のような例外が発生した場合、次のことを確認して下さい。

  • データベースファイルのオーナーが appache のユーザになっているか?
    • appache のユーザとグループが www-data で、データベースのファイル名が db/db.sqlite3 なら、以下のように変更する。
    • chown www-data.www-data db/db.sqlite3
  • データベースファイルを置くディレクトリのパーミッションが 777 になっているか?
    • 例えば、データベースのファイル名が db/db.sqlite3 なら、ディレクトリdbのパーミッションは 777 である必要があるようです。 参考

SQLite3で、Time を渡す時には文字列にしないとダメ

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)

Read more


追記 10⁄7 RubyGemsとして公開。クラス名はImmutableListに変更。 RubyGems.org README(GitHub) 10⁄22 クラス名が変わったり、この記事では説明不足の部分があったので、記事を書き直しました。 Rubyで関数型プログラミングをするための ImmutableList Gem を公開 はじめに RubyのC拡張として LinkedList (連結リスト) を実装しました。 Ruby の Array は 配列で実装されているため、長いリストでの先頭への要素を追加(cons)や連結(append)が非常に遅いのをなんとかしたいと思いました。 用途としては、Rubyで再帰を使って関数型言語風にプログラムを組むことを想定しています。 ソースコードはGitHubに置きました。 gam0022/linkedlist (GitHub) 車輪の再発明じゃないの? gem search linked_list で調べてみたところ、次の2つのgemが見つかりました。 circular_linked_list (0.0.1) linked_list (1.0.0) しかし、どちらも Ruby で実装されていたので、Cの拡張として実装し直す意味はあるのではないかと思います。 使用例 OCaml の List に影響を受けて実装したので、次のようなメソッドがあります。 cons head tail rev_append rev append length nth また、Ruby風の名前の文字列や配列への変換、空リストの判定をするメソッドもあります。 inspect(to_s) to_a empty? 動作確認 以下のような動作をします。 require ‘linkedlist’ p LinkedList.

Read more