Typusのcsv downloadがセミコロン区切りな件

以前も紹介した Typus は 3.0.3 相当のバージョン以降1 CSV で DB の内容を download する機能が動いているんだけど、これがなぜかセミコロン区切りになっている。

lib/typus/controller/format.rb
    def generate_csv
       fields = @resource.typus_fields_for(:csv)

       filename = Rails.
                    root.
                    join("tmp",
                         "export-#{@resource.to_resource}-#{Time.zone.now.to_s(:number)}.csv")

       options = { :conditions => @conditions, :batch_size => 1000 }

       ::FasterCSV.open(filename, 'w', :col_sep => ';') do |csv|
   ...

(v. 3.0.6 で確認)

こ、これは。完全に決め打ちじゃないか。

セミコロン区切りの CSV なんて聞いたことねーよ、と思ったけど、これ OOo では正常に開くことができる。というかむしろ OOo 的にはデフォルトがセミコロンらしいという話も。

どっちでもいいけど field separator くらいは指定させてほしいなぁ。

[2011-01-20 追記] typus を gem 版 3.0.2 から github 版に置き換えたらせっかく用意してあった _t() って I18n 関係の便利メソッドがなくなった。便利だったんだけどな。

  1. 3.0.3 の release はない 

作業の自動化の次は作業の記録

とりあえず思いつきのメモ。

rake, capistrano を知って以来、単なるスクリプト化よりも分かりやすく扱いやすい作業の定型化、自動化を意識してきたんだけど、次はこれの記録かなと思っている。まぁ、現状はそれほどタスクの shlauncher 化が進んでいるわけじゃないんだけど、それはまた別な問題。

記録ということはログなんだけど、どこに記録するかというと、やっぱ一つHTTPサーバを用意して投げつけるのが楽ちんかなとか妄想している。Sinatra 辺りでフロントを用意して、実際にはほとんどログの蓄積とその検索以外に仕事のないアプリがあると便利なんじゃないかと思う。

問題はこのログの形式で、前々から全文検索に興味がありつつ手が動かせていないので、何か適当な全文検索エンジンを使いたいな、くらいの軽い気持ちでいる。以前なら HyperEstraier 一択くらいの気持ちだったけど、今はフォーマットを自由に決められそうな Ferret がいいのかなと思っている。

RDBMS と連携するツールでもいいんだけど、個人的にはログと RDBMS は相性が良くないと思っているので、ログはプレーンに用意してインデックスを別に用意する方法を採用したいかな。いざとなったらとりあえず grep だけでも使えるしね :-P

記録の部分を分離してあれば GUI アプリでも CLI アプリでも楽に記録をとれるんだけど、基本的には shlauncher ベースで考えたいと思っている。

以上。まだ何も書いてないよ!

URI ベース pear パッケージの操作

インストール

pear install URI

アップグレード

pear upgrade URI

ダウングレード

pear upgrade --force URI

アンインストール

pear uninstall __uri/PACKAGE

インストール状況の確認

pear list -a        (全channel)
pear list -c __uri  (URIベースのパッケージのみ)

インストール済みファイル群の確認

pear list-files __uri/PACKAGE

cf.

PEAR_PackageFileManager_Cli で pear パッケージを作る

prototype.js 1.5 and prototypejs.org

Prototype Javascript Library Prototype 1.5 and the Documentation is Here

すっかり忘れていたけどしっかり進んでたんですな。

pear ってなんでミラーがないの

また使えないじゃないか。

え。おれミラーを作れ?

そんな「勤勉」なことができるか!

ありゃーやられましたね

説教講座に設置してた PukiWiki をチェックしてみたらごっそり消されてますなぁ。しかもバックアップも何もかもない状態らしいけど、これはなんだろう。

あとで詳しく見てみよう。

あれー? なんかおかしなことになってんなぁ。ページは存在しているけど、アクセスすると空っぽの textarea が現れる。この段階でおかしな話なんだけど、実際のデータは存在してる。んー。

さらにあれれ。ローカルではちゃんと見ることができる。んー。今ちょっと気力ねーよ。

PHP では DBMS を使うアプリばっかなわけ

ファイルベースでデータの読み書きを行うものを書いていて、こりゃ大変だなぁとつくづく思った。

  • 変更がわずかしかなくてもそのわずかをファイルに書き出すのは考えるだけで面倒
    • → 富豪的にガバっと丸ごと読み書きすることで対処
  • いちいちロック処理から書くの面倒
    • → 問答無用で1データファイル:1ロックファイルで自動的に処理するものを書いて、配列とファイル名だけで処理できるようにして対処
    • ファイルが増えるとロックファイルが増えるけど気にしちゃダメってことに1
    • PHP 4 は例外処理もなく、ちょこちょこと if を挟みながら書いていくのが超面倒
  • そうだ、DBM を使えばある程度は面倒さが軽減されるかも?
    • → PHP の DBM 関係の関数は貧弱すぎてとても使いものにならない。Pear を探しても DBM は相手にされてなさげ。

そうか、だから PHP は SQL系の DB を使うものばっかなのか、と今さらながらに納得。

しかしこの辺は Ruby を使うとずいぶん楽だなぁと感じた。IO オブジェクトにブロックを渡せばかなりすっきり書けるし、DBM もハッシュとほぼ同じように使えるので値の検索とか便利な機能が充実してる。いいなぁ。

  1. 書き込みの失敗を考えなければロックファイルは用意しなくてもいいんだけど、そうもいかないかなぁと思ってロックファイルを利用して、現在のデータをバックアップしてから書き込みを始めることにした。ディスクがパンクしてデータぶっ壊した経験があるので、ちょっとナーバス。粒度の大きなロックは自分で書け。 

どうして中山文科相なのだろう

中山成彬文科相の教育観と文教政策を問う

衆議院議員「中山 成彬ホームページ」へようこそ! からプロフィールを見てもどこにも教育の話って出てこないわけで。こういう人がそう簡単に「方針転換」を決めちゃうのってあぶないと思うんだけどなぁ。発言を見聞きしても「これまでの経緯」を軽視してる感じアリアリだし。最近の調査が自分の中では完全に追い風として吹いちゃってるんだろうな。。。

ぎゃー

コメントキーフィルタ&プラグイン

もう完成度の高いやつあんじゃんorz ばかすぎ。

しかもここの日記によるとすでに破られているらしいじゃないかorz

sheepman 方式ツッコミ spam 対策を採用やめた

一度載っけたんだけどうまく動かなくてすぐに削除していたエントリ。原因は初期化ミスと断定してよさそうなので再公開。

【警告】以下を適用すると TrackBack を受け付けられなくなります。tDiary は TrackBack もツッコミの一種として扱っていて、なおかつこれを書いた時点(2005-02-03)で TrackBack とツッコミをフィルタプログラムから判別する方法が分からなかったためです。ハハハハさんの コメントキーフィルタ&プラグイン では回避できていますのでそちらをどうぞ。これ書いた私はもう使ってません。

羊堂本舗の コメントスパム 方式を tDiary 2 の filter 形式で実装することにした。とりあえず動いているみたいだけどなんだか分かっていないので tDiary ハカーの方々に直してもらいたいです。

プラグイン(misc/plugin/comment_key.rb)

require 'digest/md5'
alias :orig_comment_name_label :comment_name_label

def comment_name_label
  @conf.options['comment_key'] ||= ""
  v = Digest::MD5.hexdigest( @conf.options['comment_key'] + @date.strftime( '%Y%m%d' ))
  %Q!<input type="hidden" name="key" value="#{v}">\n! + orig_comment_name_label()
end

置くと設定画面でプラグインを有効にしようが無効にしようが問答無用で効きます。

フィルタ(tdiary/filter/sheepman.rb)

require 'digest/md5'
module TDiary
  module Filter
    class SheepmanFilter < Filter
      def comment_filter( diary, comment )
        @conf.options['comment_key'] ||= ''
        v = Digest::MD5.hexdigest( @conf.options['comment_key'] + @cgi.params['date'][0])
        v == @cgi.params['key'][0]
      end
    end
  end
end

で、tdiary.conf に

@options['comment_key'] = '秘密の文字列'

を追加。たぶん真面目に form から spam を送りつけてくるプログラムが現れたら無力化してしまうんだけど、かっこよさげという言葉を信じて採用。

以下、たったこれだけを作るのにめっちゃ苦労した感想。

  • 渡ってくる comment でどうにかなるものと思い込んで tdiary.rb も読まずに悪戦苦闘
  • もともと tDiary の中身が全然分かっていないんだけど、@options で値が取れると思い込んで悪戦苦闘(plugin では取れるけど filter では取れない)
  • tDiary に RDoc コメント埋め込みまくってくれるスーパーマンが現れたらいいなー
  • tDiary 関係のものをいじるときはまず expand -2 してからだ

tDiary はトランザクションの処理が入ってるみたいで、一度失敗するとその原因を取り除くだけでなくトランザクションをなかったことにする必要があるみたい。いやーハマったハマった。

つーかほんとは

spam なツッコミをスマートに削除したうえで makerss.rb にうまくそれが伝わるような方法がほしかったり。

やっぱ日本人が大人しいだけか?

tDiary むずいな

コメント spam 対策をしようとして sheepman 方式 を 2.0 の filter の形で実装してみたんだけど、手元では動いたのにどうもこのサーバでは動かないらしく、諦めて外した。

ここで問題発生。具体的には td2 のファイルがあると tDiary が返ってこなくなる。しょうがないからこれも削除して、バックアップしておいたデータに戻した。これで元通りかと思ったらまだ。コメントが反映されない。データとしては存在しているんだけど反映されない。referer はちゃんと出るんだけどコメントは出ない。

残念ながらこれの回復方法が分からない。まいったなぁ。

しかし今回の動きって、filter プラグラムを失敗するとデータが壊れる可能性があるってことなのかなぁ。なんかこえーな。

ちなみに「filter の動作に失敗して td2 がある限り返ってこない」という状況は手元のテスト環境(Debian woody Ruby 1.6.7)でも再現している。Ruby 1.8 な環境では試していない。

[追記] ツッコミが追加されたら過去のツッコミも復活した。

About

例によって個人のなんちゃらです