標準ライブラリのDateで月の加減計算が出来るって知ってました?

Ruby、3年以上はやってるはずなのに知りませんでした…orz

+, -で日の加減が出来るのは直感的にわかるけど、月に対しても出来るとはびっくりしました。

% irb -r date
>> (Date.today).to_s
=> "2010-08-15"
>> (Date.today << 2).to_s
=> "2010-06-15"
>> (Date.today >> 5).to_s
=> "2011-01-15"

サブクラスのDateTimeでもモチロン出来ます。

オーマイガッ!

とりあえずHerokuで動かしてみた。

Test Site

Herokuのbundlerが1.0.0.rc.2に上がってて糞ハマる。

CMS本体のコードよりも、テーマ作成者向けのAPIを慎重に吟味する。

テーマファイルは下記のような構成にした。

  • posts.erb --- 複数の投稿を表示するページ。(トップページ、アーカイブ、検索結果など)
  • post.erb --- ひとつの投稿を表示するページ。(個別ページ)
  • index.erb(必須でない)--- トップページ。このファイルが無い場合はposts.erbが使われる。
  • layout.erb(必須でない)--- レイアウトファイル。このファイルが無い場合はレイアウト機能は使われない。
  • style.css(必須でない)--- CSS。

本棚戦略

僕は「読んだ本全ては売る」という本棚戦略を取っている。(ブックオフの宅本便に送る)

この戦略で盲点だったのは、家に残るのは「超分厚い本」や「難解な本」ばかりになってしまうことだ。

本棚のタネンバウムのオペレーティングシステムを苦々しい思いで睨みつけていた。

そこで本を裁断してPDF化してくれるサービスを利用することにした。

読書観

読めれば良い。最悪真っ白なPDFが送られてきてもネタになる。それよりも狭い部屋を圧迫する本棚が問題だ。

スキャポンの対応

裁断サービスは軒並み申し込みが殺到していたので、複数申し込み、最初に使えるようになったスキャポンに申し込んだ。めったに頼まないだろうし、値段は1冊100円だろうが200円だろうがどうでもいい。面倒が少ないサービスを使いたいと思っていました。

6月21日:

PayPalで66冊分の料金を支払った。本を送ってから2〜3週間でPDFが送られてくるらしい。本が詰まったダンボール数箱は運ぶのが大変なのでヤマト運輸の集配サービスを使った。便利。

8月3日:

本を郵送してから1ヶ月以上経つのに何の音沙汰も無い。PayPal前払いのみなので詐欺だとしても何の不思議も無いのでメールで問い合わせた。

駒形様

スキャポン運営事務局です。
このたびは弊社サービスの遅れ誠に申し訳ございません。

駒形様の書籍は、昨日データ化をおこないまして、本日から明日にかけて
検品とOCRを予定しております。

今しばらくお待ちいただけますよう何卒よろしくお願い申し上げます。

1ヶ月以上経つのにちょうど今日やってたってそれ、蕎麦屋の「今出ました」的な?

8月4日:

次の日あっさり納品された。DropBoxが遅いため、指定のURLからダウンロードして欲しいとのこと。フリーのDynamicDNSサービスのドメインでBasic認証フォルダ直置きかあ・・・。

PDFをダウンロードしてみると、読めない部分はまず無いという品質でとても満足。オプションで頼んだOCRも良好なようだった。しかし明らかにファイル数が少ない。簡単なコマンドでファイル数を調べると39冊しかない。66冊頼んだのに半分強しかない。メールで問い合わせると、

駒形様

スキャポン運営事務局です。
下記の件、大変失礼いたしました。

只今、残りのデータをアップロードしておりますので、8分ほどお待ちいただけますよう
なにとぞよろしくお願い申し上げます。

とのこと。

その後、無事69冊のPDFがダウンロードできた。冊数は少ない方でも多い方でもいい加減なのね…。

ファイル名を本のタイトルにするという有料オプションを申し込んでいたが、何冊かは間違っていた。

感想

PDFの品質やOCRの精度にはとても満足しています。でもそれって全部SnapScanの性能なんじゃ…。応募が殺到して忙しいのは理解できますが、SnapScanの性能以外のサービスはとても低いように思いました。

次頼む時は他のサービスの体験談も出揃ってると思うのでそれを参考に決めたいと思います。

関連:本棚オーバーフロー問題 - komagata [p0t]

RubyでJavaScriptみたいにアクセサが自動定義されてるHashみたいのって何を使えばいいのかなと思ってたんですが、標準ライブラリにOpenStructなんてのがあるんですね。

% irb -r ostruct
>> hash = {:foo => 1, :bar => 2}
=> {:foo=>1, :bar=>2}
>> hash.foo
NoMethodError: undefined method `foo' for {:foo=>1, :bar=>2}:Hash
        from (irb):2
>> ostruct = OpenStruct.new(hash)
=> #<OpenStruct foo=1, bar=2>
>> ostruct.foo
=> 1

便利ー!

参照:ostruct - Rubyリファレンスマニュアル

DataMapperに手こずってあんまり進みませんでした。今のとこ、テーマディレクトリのインデックスページが表示できたってだけです・・・。

管理画面とテーマでviewsのディレクトリを変える必要があるのをどうしようかなというとこで今日はタイムアップ。

http://localhost:9393/

リポジトリは下記。名前はPyha(ピュハ)FJORD絡みで北欧の方の湖の名前です。特に意味は無いです。

komagata's pyha at master - GitHub

一人合宿1日目。CMS、とにかく作り始めました。

目標はデザイナーの方でも使える、クラウド環境対応(要はGAEとHeroku)のCMSです。

要はWordPressです。WordPressをクラウド対応(要はRDB、KVS、noSQL他DB対応)するのは相当難しい(出来てもデザイナーが使えるようなものにならなさそう)という結論からRubyで作ることにしました。

ツール自体はほぼ使ったことあるのを使うので技術的なチャレンジはしない予定です。Sinatra, DataMapperとかを使って、テーマ・プラグイン機構のあるCMSを地味に作る感じ。Windowsでの動作も必須で行きたい。

僕個人の趣味はなるべく我慢して、面倒な機能も頑張って実装しようと思います。

明日11日から15日まで5日間の夏休みに入ります。

しかし、僕は夏休みを全て投げ売って一人合宿をすることにしました。(自宅で)

Herokuでも動くRubyのCMSを作りたいと思います。一人合宿ですが、毎日経過報告をブログに書こうと思います。

こういうことをブログに書くことで自らを追い込みたいと思います。

ハッシュタグ:#1mancamp

インストール

% gem install sqlite3-ruby rails --pre
% rails new foo
% cd foo
% rails generate scaffold Club name:string exclusive:boolean
% rake db:migrate
% rails server

何でCMS作りたいかというと、WordPressが凄い便利だなーと思うからです。

デザイナー(@machidaさん)とプログラマー(俺)で会社をやってますが、デザインがメインの会社なので当然デザインの案件が多いです。そうすると、WordPressがあればプログラマーは何もしなくていいという案件がとても多いんです。

@machidaさんがWordPressを使い込んでるということもあるんですが、プログラマー無しでまともなWebサイトが作れるとかWordPress凄いなー。嫌だなー 怖いなー 怖いなー って思ってたんです。(褒め言葉)

でもまあ、時々はそのサイト向けに特化した機能や動きが必要になって、既存のプラグインでは対応出来ない時、プログラマー(俺)がプラグインをPHPで書くんですが、これが辛い・・・。

また、既存のプラグインで対応できるかの調査でそのプラグインのコードを全部読んだりするんですが、これもシンドイ・・・。(プラグインの作者がヘボイとかそういうわけでは全然無く、PHPとWordPressのルールと流儀をしっかり守ると逆にシンドイコードになるのです・・・)

それは我慢しろって話ですが、PaaS環境(GAE, Heroku)で動かないのがかなりダルイ。

WordPress用にさくらインターネットの500円の共有レンタルサーバーを借りるのがお決まりのコースなんですが、WordPress以外は全部Herokuに置くようになってから、@machidaさんが、

「何でWordPress、Herokuで動かないんですかねえ」

と、キレそうになっているのでHerokuで動くWordPress的な物が欲しいのでCMSを作ります。

.gvimrc

if has('gui_macvim')
    set imdisable " IMを無効化
    set antialias 
    set nobackup
    set guifont=Monaco:h14
    colorscheme darkblue

    " ヤンクをクリップボードへ送り込む
    set clipboard+=unnamed

    " ルーラーを表示
    set ruler
    set title

    " メニューバー無し
    set guioptions-=T

    " フルスクリーン時画面いっぱい
    set fuoptions=maxvert,maxhorz
endif