KLab株式会社主催のプロトタイピングラボ2013というイベントの第2回に参加してきました。

プロトタイピングラボとは、思いついたアイデアのプロトタイプを3日間で開発するというハッカソン型のイベントでした。

私の参加した第2回の開催日とテーマは次のようになっていました。

開催日
9/10〜9/12 の3日間
テーマ
自由

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名刺ジェネレータを作るにあたって、 Canvas を使ったので、勉強になったことを適当にメモします。

関連記事

canvas#toDataURL() の注意点

canvas#toDataURL() の注意点なのですが、 一度でもクロスドメインで読み込んだファイルを描画した canvas に対して使うと、 Uncaught SecurityError: An attempt was made to break through the security policy of the user agent. というエラーがでます。

クロスドメインで取得したImageを引数にしても、context#drawImage()は成功するので、すこし気が付きにくいと思いました。

Chrome バージョン 29.0.1547.65 で確認しました。

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


Uva Online Judgeで解いた問題を適当に解説します。

3ということで、前回前々回の続きです。

10018 Reverse and Add

10018 - Reverse and Add

$n = 入力 + reverse(入力)$ を計算、回文だったらその値を返す。 回分でなければ、$ 入力 = n $ として回文になるまえ繰り返す問題だった。

ここで言う回分というのは、12321のような整数のこと。

問題文に "palindrome that is not greater than 4,294,967,295. " とあったので、BigNumber を使う必要は特に無く、unsigned long long int で対応できた。

ごく普通に、回文を返す関数回分かどうかを判定する関数を実装して、問題を解いた。

Read more


OCamlの匿名関数とカリー化について記事を書こうと想ったのですが、 そのままの記事が既に存在したのでリンクを貼っておきます。

OCaml入門(2)

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


ぼっちupcamp #upcamp に参加しようと思ったのですが、 諸事情により行けなくなったので、一人で何か作ってました。 Ruby の 処理系の動作の改良(改悪)をしていました。 Ruby は git clone https://github.com/ruby/ruby.git で落としたものを使いました。 Thread#join で タイムアウトしたときに例外を発生させる Thread#joinは、 スレッド self の実行が終了するまで、カレントスレッドを停止させるメソッドです。 limit を指定して、limit 秒過ぎても自身が終了しない場合、nil を返します。 今回は、limit 秒を過ぎてタイムアウトした場合、 例外Timeout を発生させるように改造しました。 正直、自分でもネタをミスった感がありますが、 すこしはタイムアウトした場合の処理が楽に書けるようになる気がします。 従来のRubyの Thread#join でタイムアウトを処理する まず、従来のRubyの Thread#join でタイムアウトを処理する場合のコード例を示します。 Thread#joinの返り値が nilのときにタイムアウトしたと分かるので、 このように書けると思います。 begin t = Thread.start { # 1秒で終わらない処理 while true 1 end } isTimeout = (t.join(1) == nil) rescue ThreadError puts "theread error" ensure puts "timeout error" if isTimeout t.kill end # => "timeout error" 改造したRubyの Thread#join でタイムアウトを処理する 今回の改造によって、次のようにRubyのコードをスッキリさせることができます。

Read more


某OJTXcodeからopenCVを使う機会があったので、その方法をメモします。

バージョンは次の通りです。

Xcode
4.6.3
openCV
2.4.5

openCVをインストールする

まず、普通にhomebrewでopenCVを入れます。

brew tap homebrew/science
brew install opencv

XcodeでopenCVを使えるようにプロジェクトを設定する

次のページ通りに設定したら、うまくできました。

XCode 4.5.2 でOpenCV 2.4.2 を使う

Read more


RubyってSubversionで開発してるというイメージしか無かったのですが、GitHubでも最新のソースコードをCloneできました。

git clone https://github.com/ruby/ruby.git

公式にリポジトリガイドなるページがあるので、最新のRubyのソースコードを読んでみたい人は参考にしたらいいと思います。

レポジトリガイド

Read more