| @技術/プログラミング

80個近くある静的HTMLファイルをシステム化する必要が生じたので、HTMLをHpricotでスクレイピングしたあと、抽出したデータをSQLiteにぶっ込んだ。しかしSQLiteにぶっ込んだあとでデータの一部をいじりたくなった。そこでRailsのActiveRecordを単体で使ってみた。

なんでわざわざActiveRecordを使うのか

いやそりゃもちろんSQL書くのが怖いからですよ。というのは半分冗談なんですけど、CakePHPはSQLite 2にしか対応しておらず、SQLite 2は何かと制限が多い。replace関数が使えんとか。temp tableとか作るのかったるいし、フレームワークばっかり使っててSQLはあんまりよく分からないのでActiveRecordを使った次第です。

作業詳細

このシステム化するプロジェクト自体はCakePHPで動いており、DBはSQLite2。デフォの状態だとRailsは sqlite3-ruby しかインストールしないので、ActiveRecordからSQLite2なDBを操作することができず若干まいっちんぐだったんだけどなんとかでけた。ちなみにやったのはCRUDのReadとUpdateね。

やったこと

とりあえず以下のようなファイルを用意。各レコードの name フィールドの "hogehoge" という部分なのが邪魔なので削りたかった。

#!/usr/bin/env ruby

require "rubygems"
require "sqlite"
require "active_record"

ActiveRecord::Base.establish_connection(
  :adapter => "sqlite",
  :database => "path/to/db"
)

class Hoge < ActiveRecord::Base
end

hoges = Hoge.find(:all)
hoges.each do |hog|
  hog.name.gsub!(/hogehoge/, "")
  hoge.save
end

まず最初に、 no such file to load -- sqlite みたいなエラーが出た。要するに「お前SQLite 2のアダプター入れてねえだろ」というエラー。とりあえず sudo gem install sqlite-ruby したんだけど、それでも no such file to load — sqlite が出るのでMacを再起動したら「Rails 3ではSQLite 2はdeprecatedだからさっさとSQLite 3に移行しろや」みたいなメッセージは出るもののちゃんとDBの内容を読み込めた。CRUDのReadはでけた。

しかしUpdateの部分で失敗。Railsの感覚で hoge.save とかやったんだけどこれは意図したとおりに機能しなかった。しょうがないのでRailsのAPIリファレンスを見ながら、 update_attribute() というメソッドをぶちかましてやった。こんな感じ。

hoges.each do |hog|
  if hog.name =~ /hogehoge(.*)/
    hog.update_attribute("name", $1)
  end
end

これで狙ったことができました。

Rubyいいわー。ほんといいわー。

| @技術/プログラミング

Rubyいいっすわ。あんまり詳しいことは tech.portalshit.net に書きますけど、Rubyいいっすわ。Rubyの何が良いってオブジェクト指向なのがいいっすわ。あと無駄な括弧やセミコロンが必要ないのもいいっすわ。配列の操作、ブロックとかがいいっすわ。Procとかまだよく分かってないけど、とても便利っぽいものなにおいがぷんぷん漂ってくるのがいいっすわ。全般的に「こういうのPHPでやりたかった」っていうのがたくさんあってとても助かる感じです。

残念なのは、ターミナルの操作にある程度慣れてないと、最初の環境構築でつまずくところかな。RubyGemsインストールして、必要なGemをインストールして、ってやらないとなかなか使えるようにならない。あとレンタルサーバーで気軽に使えないのが痛いかな。PHPは大抵のサーバーに入ってるし、ターミナルの知識なくても、HTMLの拡張子をPHPに変えて、テキトーに <?php ?> で囲んで何か書いてサーバーにアップロードすればとりあえずスクリプトを動かすことができるので、簡単に始められるのが良いですよね。RubyはApacheで動かそうとするとhttpd.confいじる必要があるので、なかなか簡単には使い始められない。

というかですね、PHPは動的HTMLを生成するためのテンプレートエンジンなんだと思う。どっちかつったらプログラミング言語っつーよりもウェブアプリケーションフレームワークでいうならビューに特化したマークアップ言語なイメージ。だから小規模な動的WebサイトだったらPHPはとても良いと思う。DBとか使わなくて、MVCとか分ける必要のないサイトとか。

ただライブラリとか使って複雑なことやるんだったら他の言語の方が良いと思う。PEARとかPECLとか便利なのか不便なのかよく分かんないし。

以上、Ruby on Railsの手術を受けて洗脳されている最中のおっさんの戯れ言でした。

そういや、今月下旬に友達の結婚式で東京行くのでRubyKaigi行きます。もし会場で僕を見かけたら生卵とか投げつけないで一緒にご飯食べたりしてあげて下しあ。

| @技術/プログラミング

外タレのJekyllブログを見てると、シャレオツな感じでコードがシンタックスハイライトされてる。どうもPygmentsというやつを使うらしい。公式Wikiでも触れられていて、コードをハイライトさせたいときは jekyll --pygments しろや、みたいなことが書いてあるんだけど(Liquid Extensions - jekyll - GitHub)、そういうオプションつけてもコードは全然色つきにならず、「サギやんけ」とか思ってた。

しかしマニュアルをよく読むと、PygmentsってのはPython製のソフトで、こいつを別途インストールする必要があるらしい。なるほどそういうことだったのか。そういうわけで

$ port search pygments

してみたところ、MacPortsでは三つヒットした。

py-pygments @1.0 (python, devel)
    Python syntax highlighter

py25-pygments @1.0 (python, devel)
    Python syntax highlighter

py26-pygments @1.3.1 (python, devel)
    Python syntax highlighter

Found 3 ports.

しかしSnow LeopardにはPython 2.6.1が入ってるので、

$ easy_install Pygments

でもオッケーかも知れない。僕は職場に持ち込んでMacBookにはMacPortsから py26-pygments を入れた。そしたらdependencyが発動してPythonとかXorg何とかというもののダウンロードも始まり、 /opt/local/bin/python-2.6.5 が入ったが、長々と時間がかかった。※1

インストール完了後、これでシャレオツシンタックスハイライティングできるようになったと思い、意気揚々と

$ jekyll --pygments

してみたのだが、一向にハイライトされない。なんか「pygmentizeとか見つからないし」みたいなエラーが出る。なんでじゃ〜とイライラしながら公式Wikiを読んでると、次のような記述があった。

the pygmentize binary must be in your path

そうなのよ。 pygmentize-1.3.1 っていうバイナリファイルはあってパスは通ってるんだけど、 pygmentize そのものがないのよ。そういうわけで

$ sudo ln -s /opt/local/bin/pygmentize-1.3.1 /opt/local/bin/pygmentize

してやった。すると pygmentize というバイナリファイルにパスが通るので、めでたくシャレオツシンッタクスハイライティング環境が手に入った。ちなみにCSSはGithub互換のものを拾ってきて入れといた。

| @技術/プログラミング

AuthlogicとAuthlogic-OAuthでキメてやろうと思ってたのに全然うまくいかないし。Authlogic-OAuth、去年から全然更新されてないじゃん。Railsは便利なプラグインいっぱいあるけど、メンテが止まってることも多い。プラグインに頼りまくってサイト作ってると死ぬこともあるなーと思った。やりたいことは自分でもやれるようにしとく必要あるし、自分の手に余ることはやろうとしない方がいいと思った。できるところからコツコツと、と37シグナルズの本にも書いてあるし。

| @技術/プログラミング

@ningengasinu 様みたいに、自分で作ったボットに「日記書いた」ってしゃべらせようと思って、増田のRSSを使わせてもらおうと思ったんだけど、Rubyの RSS::Parser で読み込もうとすると 500 Internal Server Error が返ってきてしまう。ブラウザから読み込むときはエラーとか出ないんだけど。

しょうがないので open-uri を使って User-Agent を偽装してRSSを読みに行ったところ、正しくレスポンスが返された。しょうがないので RSS::Parser は使わず、 Hpricot を使った。

増田ってbotのアクセス弾いてるわけですね。これがネットの闇ですか……

| @技術/プログラミング

tilyさんのgistgist: 427398を使わせてもらってTwitterのボットを何個か作ってみた。結構楽しいですね。

しかしボットが短時間に何度も同じ発言を繰り返してフバいので、日付が変わるまでは重複発言をしないようにしてみようと思った。Rubyは 配列 - 配列 みたいなエロいことができるみたいなので、

new_tweets = neta_tweets - used_tweets

とかしてみようとした。

gist: 427398自体がTokyo Tyrantを使っているので、これでなんとか出来ないかなと思った。しかし rdb.put しようとすると、 ArgumentError というのが発生してしまう。ひょっとしたらTokyo Tyrantって配列とかを保存するもんじゃないのかな。

| @技術/プログラミング

OAuthを導入しようとした。Twitterのだけなら何とか拾ってきたコードで動くとこまで持ってけてたけど、どうせやるならいろんなOAuth Providerに対応したい。oauth-pluginってgemを使えば簡単に沢山のOAuth Providerに対応できるみたいなので導入しようとしたけど、これがくせ者だった。

まずoauthとoauth-pluginをただ入れるだけじゃ動かない。 acts_as_authenticated, restful_authentication or restful_openid_authentication というプラグインが入ってて、ユーザー認証をこれらのgemに任せてないとダメ。

作者がrestful_authenticationをすすめてたのでこれを導入した。(usersテーブルの構造自体が変わるので、ただ単にインストールするだけじゃなくて rake db:drop して古い db/migrate/(日付)_create_users.rb を削除し、もう一回 rake db:migrate しないといけない。さらにControllerとかViewとかもいじらなきゃいけないので地味に結構面倒くさい。

しかし何度やってもうまくいかない。「 login_required みたいなメソッドねーし」とかエラーが出る。どうやら昔の restful_authentication にはそういうメソッドがあったらしんだけど、現在の restful_authentication からは削除されてるらしい。他にも current_user っていうのも未定義で、この辺のエラーのおかげで完全に萎えた。

そういうわけで一週間くらいOAuth対応に向けて頑張ってたけど諦めました。TwitterだけOAuth認証に挑戦してみる。とってきたOAuth Tokenの扱いとかに若干不安があるけどうまくいくかしら。