2008年6月30日月曜日

Rocket-starterの0.0.3をリリースしました

ニコニコ動画で取り上げられて、やべぇ早くしなきゃと、急いで直しました。

てか、デバックちゃんとしてないの、モロバレですね。

バージョンアップ内容 0.0.2 -> 0.0.3

  • Sqld4rのコードが混じっている→修正
  • プラグイン関連ファイルのコミットし忘れ→どう対処するのが良い?→:skip_commit_for_pluginsオプションを追加
  • svn rmの絡みで変なオプションが入っていた致命的バグを修正(Thank you Mr.Kamagata)
  • プラグインリストのでフォルトファイル名を変更。useful_pluginsから.rocket_starter_pluginlistになります。--initした時のファイル名も変更になります。.を付けたので隠しファイルになりますが、設定ファイルが作ってある方は、そちらの設定(プラグインリストへのパス)が優先されます。

簡単ですが、こんな感じー

(いい加減テスト書かなきゃ)

この楽しい企画を立ち上げてくれた方のブログはこちら

GemCasts.1 Rocketstarterを使ってみる

Rocket-starterがニコ動で紹介されていました

朝起きてメールチェックしたら、Rocket-Starterのフォーラムからメールが届いていて、Rocket-starterがニコニコ動画で紹介されている事を知りました。

【ニコニコ動画】GemCast.1 Rocketstarterを使ってみる

インストールから実際に使っているところが紹介されているんですが、途中でバグったりして、ちゃんとテストしてないのがモロバレでした。近日中にアッブデート出します。

でも、いやー、こういうの、嬉しいですね。モチベーションがあがります。

このビデオの意義

このビデオの投稿者の意図とも被るかもしれませんが、以下のような事を感じました。

  • いやぁ、やっぱりビデオはわかりやすい。取っ掛かりとしては最高のメディアなんじゃないでしょうか。自分もビデオ録画&公開したいなぁ。(MacOSXでスクリーンと音声を録画できる便利なソフトを知っている方はコメント入れてください)
  • このビデオを公開した動機にも絡むんだけど、現在日本人にやさしいgemを紹介しているサイトって無い(少なくとも知らない)んだけど、実際には有用なgemもたくさんある。でも、どんな機能を持っているgemがあるのかがRubyForgeだけではわかりずらく、効果的に告知する土壌も無い。…ので、この投稿者はニコニコ動画を選んだんじゃないかな、と。
  • RubyとかRails絡みって、ちょっとした事でトラブルに遭いやすく、コツを知らないと乗り越えられない。こういう意味では、このビデオは地雷原突破精神(w)を持って(おそらく練習する事無く)初めてのgemインストールをありのまま伝えた、という意味は大きいんじゃないかな。たぶん、こういうエラーが出たら、ここを見る(ファイルや行数を頼りに、とりあえずソースを開いてみる)とか、ニコ動のコメントにも入っていたけど、「こんな事ってよくあるよねー」みたいなことって、慣れてない人には伝えにくくて、書籍やWebにも載ってない情報なんじゃないかな、って思った。
  • でも、この投稿者って自分で原因調べて、突破できてるよね。これをビデオに残しておくのって、会社とかで、詳しい人の仕事の仕方を後ろで見学しているのに似ていて、学習効果も高いんじゃないかな。てか、もっと言うと、XPのペアプログラミングみたいなもんかなと思った。適切な場所にコメントで突っ込み入れているってのがその証拠。
  • 開発者(おいらなど)にとって、エンドユーザ(この投稿者)がどんな風に思っていて、どういう風に使うのかっていうフィードバックが、直接くる分イメージが伝わりやすい。特に、初めて使うときに、どこで引っかかるかとか、ここが良いけどここが悪いみたいなのがニュアンスとして伝わってくるのは、文字にはできない事であり、大きいと思う。
  • MacOSX10.5しかテストしてないけど、debianでも動くんだね、へー、良かった。(おい

なので、おいら的にこの企画大賛成です。次回作期待しています。

てか、録画さえ出来れば、自分もやりたいです。

ビデオを見て、「あ、いいなー」と思えば、本家行って詳細を調べれば良い話だと思うので、取っ掛かりを作りたいです。

gemの評価サイトを作りましょうプロジェクト

で、上記にも書いたんですが、gemの代表的な解説サイトが無いんです。

でも、たとえばRocket-starterと同じような事ができるgemが複数あるにも関わらず、それが知られていないために使われていないというのは、かなりもったいないんです。 (複数あるという事実は、1つ1つそれらしいカテゴリのgemを調べる事で得ましたし、実際にも使ってみました。結構時間もかかりましたので、普通の利用者はここまでしないと思うんです)

RubyForge自体はすばらしいサービスなんですが、検索機能が(特に日本人にとって)使いづらい。属性でのフィルタリングも無い(あるのかもしれないけど知らない。気づかない)し、キーワード検索の対象になっているのって一部の項目だけだし、どうせ全部テキストなんだから、ソースも含めて全文検索する機能をつけても良いと思うんです。日本語のキーワード打っても引っかからないしね。

gemをリリースするような段階で知ったんですが、レスポンスが無いとか、用途が被ってしまうgemを作ってしまったために開発意欲を失った開発者が結構居るようで、α版のまま止まっているようなgemも多い(これはこれで邪魔)。gemの数自体は去年よりかなり多くなったように感じていますが、使われていないにもかかわらず、リストには残っているので、gem listを目で追うだけで結構な労力です。

あと、Rails系で特に痛いのが、バージョン間の互換性問題ですが、これもブログなどにちょこちょこ載っているだけで、集約されているサイトなどが無い。おいらはRailsのプラグイン向けのWikiもやってますが、特定バージョンを入れていちいちテストなんてしないし、(仕事以外で)する人も居ないでしょうから、「このバージョンでこのバージョンは動いたよ」という情報(動いた時のgem listの内容を集計とか)がコマンド一発で送信できるのが最良だと思うんです。(あ、これはまた新しいプロジェクトの予感)

長くなりましたが、gemの評価・集約サイトを作ろうかなと思っています。

仕組み的なものは大体見えてるんだけど、問題はサーバかな。

  • gem list -rからgem名を取得し、gem specification gem名から概要を取得して、DBに突っ込み、解説ページに使う
  • 過去バージョンもそれぞれにコメントが付くようにする(過去バージョンってどうやって拾うんだ?今のgemって)
  • 集約システムをオーブンソースにして、外国にもクローンを置いてもらう。データは自動で定期的にマージする(のがいいなぁという理想)
  • レーティング欲しいよね
  • 上記のような「動いたgemの組み合わせ事例」の集計
  • ソースも含めた全文検索
  • gemの状態を定期的に更新
  • 日本人に優しい検索。具体的には日本語でキーワードを入れてもちゃんと引っかかるように。w
  • 属性とかでちゃんと検索できるように。
  • ブログとかニコ動へのリンク

あー、結構大変かも。段階リリースが必要ですね。

賛同者募集中です。賛同いただける方はコメントに「勢い」を書いてくださいw


2008年6月27日金曜日

PostgreSQL CE 8 Silverの受験勉強をしてみる

試験勉強なんて何年ぶりだよ。

プーの特権を利用して、昼夜通しで受験勉強してるけど…眠い。

でも、いつもはMySQLしか使ってこなかったからPostgreSQLってあまり知らなかったんだけど、最近8.3がリリースされてちょっとPostgreSQL周りが熱いし、こうやって改めて勉強してみると、「PostgreSQLってこんなことできるんだ」って発見がたくさんあるね。

特に、業務に直接関係ないところなんて、長くPostgreSQL使っている人でも知らない事が多いだろうし、トリガーとかユーザ定義関数とかSQL99との差なんて、こういう機会じゃないと覚えないと思う。

そういう意味で、今回の受験の機会を与えてくれたOSC2008Hokkaidoのスタッフ及びPostgreSQLユーザ会の方々に感謝。

で、受験勉強って何やってるの?

紀伊国屋に行って、在庫のあったPostgreSQL関係の本を片っ端から開いて、受験に使えそうなものとしてこの本を買ってきた。


"PC UNIXユーザのためのPostgreSQL完全攻略ガイド―豊富な機能と高い信頼性を誇るオープンソースデータベース" (石井 達夫)

この本は発行日の関係からPostgreSQL8.1を主体に扱っているので、一部出題範囲から外れちゃってるんだけど、逆に8.3用の本は本当の初心者向けで、受験勉強って用途にはちょっと向かなそうだった。

で、何も勉強してないところで、かつあまり時間をかけずにPostgreSQL CE 8.0 Silverの練習問題をやってみたら、40%ぐらい行けたので、受験範囲を確認しながらこの本でPostgreSQL独特な部分を詰めて行こうかなってとこ。

と行っても、500ページぐらいある本なので、時間的にも多分読んで終わりになると思うけど。(まぁそれでも多分受かるレベルにはなると思うけど)

本屋には他にもこんなのがあったけど、PostgreSQL7系の問題集らしいので見送った。8用出ないのかなぁ。無いよりはかなりイイとは思うけど。


"絶対合格!PostgreSQL CE認定試験(Silver)" (宮原 徹)

ちなみに、Goldの練習問題もやってみたんだけど、これは無理。全然わからん。

マニュアルをしっかり読まなきゃダメっぽいから、もしGoldを受ける機会があるなら、本は買わずにマニュアルをしっかり読もうと思った。

さーて、気分転換もしたし、続きやろっかー。

…ぐー

2008年6月26日木曜日

FireFox3に乗り換えた

いいよ。早い。快適。

自分的にはFireFoxに無きゃ困るっていうアドインは

  • FireBug(定番)
  • S3Organizer(Amazon S3用クライアント)
  • Elastricfox(Amazon E2用クライアント)
  • SeleniumIDE(ブラウザサイドテストツールのレコーダ)
  • GoogleToolBar(ブックマークに使う)
  • なんでいいからXPathをテストできるアドイン

ぐらいがあれば十分。(てか、開発するだけならFireBugさえあれば基本的には良い)

上記はFireFox3対応版が出てたので、隙を見つけてバージョンアップしちゃいました。

FlashSwitcherがまだFireFox3対応していないので、Flashアプリの開発はちょっと手こずるかもね。

新しいFireFoxのいいところ。

  • おいらはいつも、ニュースサイトの気になるページを新しいタブとしてバカスカ開くんだけど、FireFox2では、ちょっと間を空けちゃって見たいページが溜まっちゃうと、とても動作が遅くなり、たまに落ちたりした。FireFox3にしてからは早くなったなぁ。
  • 同じく、ページを開いた時のスクロールが早く、かつスムーズになった。これはメモリの使い方がうまくなったからかな?
  • タブのスクロール(たくさんタブを開いて1画面に収まらなくなった時の、タブのスクロール)がスムーズになった。いままでは、ガクガクしていたので、時々どこまでスクロールしたのか見失った。(特に、今はMacBookのタッチパットを使っているので、操作が大雑把だから)
  • Gmailとかが早くなった気がする。
  • FireFox3にまだ対応できてないアドインなども、定期的にチェックして、対応版がリリースされたら普通のアドインのバージョンアップと同じように通知されるみたい。お目当てのアドインが未対応なときにも、FireFox3に切り替えやすい。

こんなもんかなー。なんせ、早くて落ちないのが良い。


2008年6月25日水曜日

rocketstarterとsqld4rが共に0.0.2にバージョンアップしました

バージョンは0.0.2ですが、とりあえず自分のやりたい事は実装できたので、今後はメンテナンスに移ります。(と言っても、まともにテストしてないので、バグバグになりそうですが…)

現バージョンで実現可能となった運用スタイル

というか、これがやりたいための両プロジェクトだったわけで。

  1. 先にrocketstarter --initとsqld4r --initを使って、設定ファイルとプラグインリスト、コマンドリストをまとめておく。これにはちょっと時間がかかるかも。(自分の中のベストを探すのに時間がかかる)
  2. どんなものを作ろうかアイデアをまとめる。頭の中でまとめてもいいけど、複雑なものならテキストファイルやマインドマップでもいいよね。
  3. ある程度アイデアがまとまったら、SQLDesignerを使ってデータ構造を考える
  4. 考えに詰まったり、飽きたりしたら、Rocket-starterを使ってプロジェクトを起こす。この時はgitを使う。
  5. そのままSqld4rにSQLDesignerのXMLを食わせて、modelとmigrationファイルを生成。そのままMySQLの中にデータベースとテーブルも作っちゃう。
  6. 細かいバリデートとか、チェック関係はとりあえず置いておいて、やりたいことだけは動作するアプリケーションを作っちゃう(自分的には、ここに勢いが必要。特にプライベートプロジェクトの場合) デザイン性なんてデザインもオープンソース化「Open Designs」とか管理画面用のフリーテンプレートが公開されているあたりでいいじゃん。
  7. とりあえず、α版として公開しちゃう。
  8. 身内以外からはあまり反応がないだろうから、バリデートとか見た目を直す。(やる気があれば)
  9. 反応が良ければ、より洗練された構造に作り替える。

今までもSQLDesignerとか他の同様なツールとか頭の中で、データ構造(ひいてはデータベースの構造)をまとめるという行程はあったと思うんだけど、実はこの時点で、modelとかmigrationファイルの内容はまとまっているはずで、modelファイルとかmigrationファイルにその構造を「書き写す」というのは、面倒な作業以外の何者でもなかった。(必要な作業ではあるんだけど)

あと、subversionなどでRailsのファイルを管理する場合、リポジトリを作ったり、いらないファイルを消したりするのも、コツを掴むまでは面倒な作業だった。

Rocket-starterとSqld4rを使うと、この作業が(SQLDesignerのXMLファイルと設定ファイル類が揃っていれば)2コマンド、3分程度で完了する。プラグインを入れないなら、数十秒で終わる。

結局Rocket-starterとSqld4rの存在意義は、実際に動くまでのものがどこまで早くできるかに集約できると思う。

動かないと評価もされないし、自分的には興味が他に移っちゃって、完成もしない。

自分の話だけをすれば、アイデアはそこそこ持っていて、そのうち何個かはSQLDesigner上でデータ構造まではある程度できている。でも、「とりあえず動くものを作った」まで行けるのはかなり少ない。てか、ほとんど無い。

なんで動くものが少ないのか、というと、masuidriveさんもアジャイルな環境作り - そんなに急いでどこへ行く で言ってるけど、コーディングにかかるまでがメンドクサイからだと思う。

rocketstarterとsqld4r、それとgit(失敗した時のリスク回避用)を使うと、コーディングに着手するまでが劇的に早くなるので、熱が冷める前に動くものが作れるんじゃないかなぁと、自分に期待しています。(がんばれオレ)

あとやりたいのは、(多分個人の趣味も絡んできそうですが)最初からインストールしておいて定型作業を行うだけで、作業効率がアップする(またはしそうな)gemなりプラグインを、有識者から意見頂いてまとめてしまえば、アイデアを形にするまでが非常に短くなるのではないかなぁと思っておりますです。

たとえば、anntate_modelsとかgettext関係とか。

Rocket-starterのバージョンアップ内容

  • よく使うプラグインの自動インストールプ用ラグインリストについて、フォーマットなどを示したテンプレートファイルを用意しました(--init)
  • config/database.yml内のデータベース用パスワードの上書きするオプションを付けました(--dbpassword)
  • 最後にrake db:create:allを実行し、(主にMySQL内などに)config/database.yml内で使われるdeveropment/test/productionの3つのデータベースを作るためのオプションを付けました(--createdb)

Sqld4rのバージョンアップ内容

  • SQLDesigner上でPKもしくはリレーションを貼っているFKカラムについては、デーダベース上にインデックスを張るためのmigrationファイルを自動生成するようにしました。これはテーブル定義のmigrationファイルとは別に生成します。(--skip-indexだが、0.0.1で実装し忘れていたもの)
  • 最後に任意のシェルコマンド(rakeなどを想定)を実行できるように、ファイルにコマンドを書いておけば実行できるようにしました(--command_list及び--skip_command_list)
  • 最後に実行されるシェルコマンドのリストについて、フォーマットなどを示したテンプレートファイルを用意しました。(--init)
  • modelファイルやmigrationファイルの生成元となったSQLDesignerのXMLファイルを、特定パスにコピーして保存できるオプションを付けました(--save)
Rocket-starter/Sqld4r共にテストファイルが無いので、(もはやBDDでも無いですが)rspecの勉強がてらにテストを書くかもしれません。

あーそういえば、SQLDesigner上のカラムに長さ(VCHAR(20)とか)を付けても、sqld4r側ではキレイに無視してますな。これも付けるかも。(でも、ちょと面倒)

あと、NOT NULLや文字の長さ、ユニークな値かどうかも、SQLDesignerを元にある程度modelファイルを生成できるかなぁと思ったり。

2008年6月23日月曜日

Gitを使ってみよう

Rails界隈がgit対応してきたので、どんなもんかインストールして使ってみた。

Git周辺状況

色々調べてみたら、結構rails界隈はgit対応が進んでいるみたい。

  • MacOSXならMacPortsでGitをインストールできるよ
  • railsの-gオプション(2.1.0で確認)
  • RubyForgeのGitリポジトリ提供
  • newgemにもGit関連の記述がっ!!

そもそも、Gitを使うと何が嬉しいのか、個人レベルでまとめてみる。

  • ネットワークの無いところでコミットできる。「これ試しに作ってみたいけど、ハマると痛いんだよなぁ」と思って躊躇している時なんかに最高。
  • git initで簡単に使えるようになるので、元々バージョン管理なんかするつもりが無かったアプリへの導入障壁が低い。subversionならサーバ側でリポジトリ作らないといけないし、簡単だけどちょっと躊躇するよね。面倒だからいっかーみたいな。(結構コレ大きい)
  • コミットさくさく。
  • ローカルでの作業はGitを使ってこまめにコミットし、要所要所でgit svnを使ってsubversionにコミットをするようにするのが、現状では理想なのかも。特にローカルで動作検証できないシステムで、修正するたびにサーバにデプロイする必要がある環境では、subversionのリビジョンが無駄に多くなりがちだけど、gitを使えばキレイに収まるのかもね。

逆にsubversionと比べて悪いところは、

  • 構造的に複雑になるので、わかりづらい。プログラマなら覚えようと思えば理解できるけど、デザイナに理解させるのは無理無理。あきらめよう。
  • 現状、windowsネイティブのクライアントが無い。これは痛い。
  • 便利で泣けるほどのGUIが無い。やっぱりGUIが無いと、履歴追っかけるときとか、デザイナに奨めたりするときに痛い。
  • てかGUIなフロントエンドが無いと、リポジトリがあちこちにできたときに、gitの複雑(になる可能性を秘めている)リビジョンを追っかけるのなんて、プログラマでも無理無理。求む超絶便利フロントエンド。
  • ブランチはsubversionのように「特定ディレクトリだけ」としてではなく、全体として切り替わる。これは良くも、悪くもあるかな。
  • 現状、rails界隈しか使えない。まだ一般的とは言えない。
  • NetBeansIDEでGitサポートしてくれないかなぁ。

まぁ、ノートを開発の基本としている人にとって、gitは結構便利なものだと思う。

自分用はgitで、みんな用はsvnという使い分けで。

ベストプラクティス

で、subversionは使えるけど、gitは使った事が無いという人は、以下の流れで覚えるといいよ。

1.動作原理の把握

こちらのサイトが詳しい。

Git/分散レポジトリって何が嬉しいの

2.チュートリアルで流れを把握

一個目のチュートリアルは流しでも読んでおくと、理解が早いと思う。

Git入門

3.SubversionとGitのコマンド比較

日本語なら

Git/Subversionコマンド対応表

もうちょっと詳しいけど英語のやつは

Git - SVN Crash Course

4.大体わかったらマニュアルを読もう

Git ユーザマニュアル (バージョン 1.5.3 以降用)

5.あとはRubyに特化した便利ツールとかまとめとか

Git and Ruby: Git tutorials, articles and links for Rubyists

s21g :: Hello, world!さんのgit検索結果

6.理解できたら実際に使ってみて、リポジトリを公開しよう

まぁ、GitHubが王道だけどね。フリーで容量制限緩くてプライベートリポジトリを持てるところはないのかなぁ。自宅サーバとかに持つしか無いかな。

あ、GitHubのリポジトリブラウザは、現在最強です。

GitHub

Gitorious

repo.or.cz

2008年6月22日日曜日

RubyGemでSqld4rをリリースしました

Sqld4rとは何の事かというと、SQLDesignerのデータ保存用XMLファイルから、Railsのマイグレートファイルとモデルファイルを生成してくれるgemの事です。

以前からrailsアプリケーションのコーディング前に、データベースの構造を決めるんですが、その時に使うツールとしてSQLDesignerを使っていました。

他にも色々DBの設計ツールはあるんですが、SQLDesignerを好んでいるのは以下の理由です。

  • 特定データベース専用ということではなく、幅広く対応している
  • ActiveRecordの設計をする場合、(単数形テーブル名)_idという表現をよく使うが、このサポート機能がある
  • Web上で設計できるので、クライアントOSに依存しない。(実際にはブラウザ依存はしますが。汗)
  • データがXMLなので、応用できそう
  • データがXMLなので、SubversionやGitでの管理がスムーズ(変更点が管理しやすいなど)
  • 自分でセットアップしなくても、上記デモで十分実用的じゃん(ネットワークが無い時用にローカルにもあるけど)

まぁ、 SQLDesigner上で直接データが保存できない(正確には、できるけど微妙)とか、特定ブラウザで使い物にならないとか、Ver1とVer2(現行)で、データ互換性が無いとか、色々不平不満はありますが、他の設計ツールと比較してみても、やっぱりSQLDesignerに戻ってきたので、これが一番なのかなと。

で、今まではSQLDesigner上でカラムの型や名前を見ながら、script/generatorやmigrationファイルに打ち込んでいたんですが、せっかくXMLなんだから、これを流し込むだけでSQLDesigner上に作った構造を、そのままRailsに流し込む事は出来ないかなぁと思って、作ってみたものがコレです。

Sqld4rの対象としている環境

現状としてはMaxOSX 10.5かLinux系やBSD系です。

ただ、Windows系でダメな事はしてない気がする(設定ファイルのデフォルトパスぐらい?)なので、そのまま動くのかもしれません。正確には試していません。(もしかしたら、フォルダの区切りがスラッシュでダメな部分があるかも)

あ、そうそう。Rails 2.1.0以降で動作確認しています。実際にはRails 2.0から動くのかもしれないです。ライブラリとしてはActivezSupportが必要で、一応2.1.0に依存させています。(必要な方は再ビルドしてください)

ちなみに、Sqld4rではなく、Sqld4ARだったかなと、今後悔しています。(名前変えれないよね?)

Sqld4rの使い方

一応RubyForge上にプロジェクトのサイトも作ったんだけど、かなりいいかげんなので、こちらちゃんとしたものを書いておきます。

Rocketstarterと基本構造は変わってないので、このマニュアルもかなりパクリです。

1.gemをインストールします

これは簡単ですね。

gem install sqld4r

2.設定ファイルのパスを環境変数にセット

設定ファイル自体はひな形を作ってくれる機能があるので、設定ファイルを保存するパスのみ指定しておく必要があります。

export SQLD4R_CONF=~/.sqld4rr

とかでいいと思います。今回からデフォルトで自分のホームディレクトリを指しているようにしましたので、この環境変数が必要ない方も居るかもしれません。。

3.設定ファイルのひな形を作ります

sqld4rに設定ファイルのひな形を吐くようにオプションを付けます。

sqld4r --init

4.設定ファイルをエディタなどで編集します

vi ~/.sqld4r

など。

--conf=/path/to/conffile

sqld4rの設定値を保存しておくファイルのパスです。パラメータを指定すれば、無くても動きます。デフォルトの$HOME/.sqld4r < 設定ファイル < コマンドラインからのパラメータという順で優先されます。

--svn

--git

--skip-timestamps

--skip-migration

--skip-fixture

上記は、script/generate modelまたはrspec_modelに渡すためのパラメータです。意味もそのままです。

--rspec

このオプションを付けると、script/generate rspec_modelとして使われ、rspecのひな形が生成されます。デフォルトはオフです。

--skip-relation

このオプションを付けると、app/models内の各モデルファイルに関連(belongs_toとかhas_manyとか)を追加しません。デフォルトはオフです。

--skip-index

このオプションを付けると、マイグレーションファイル内のPKとFKにインデックスを付けません。デフォルトはオフです。※未実装

--verbose

動作内容の詳細を表示します。デフォルトはオフです。

--sudo

実行にsudoなどが必要な環境の場合、このオプションを指定すれば、各コマンドの頭にsudoを付けます。デフォルトはオフです。

--log

このオプションを指定すれば、verboseに指定したものと同様の出力を--logfileで指定したパスのファイルに書き出します。デフォルトはオフです。

--logfile=/path/to/logfile

ログファイルへのパスです。

--emulate

デバック/テスト用として、各コマンドを実行しないエミュレーションモードです。デフォルトはオフです。

5.設定ファイルやパラメータのチェック

sqld4r --check

で現在の設定値をチェックできます。

設定ファイルで指定した値を、コマンドラインのオプションで上書きできているかもチェックできます。

sqld4r --check --conf=/path/to/another

など。


6.いよいよ実行

各設定値は既に設定ファイルに書かれてあるはずなので、ここで指定すべきはSQLDesignerのXMLファイルへのパスです。

sqld4r /path/to/database.xml

エラーが無ければ作られているはずです。

例によって、テストが書いてなかったり、インデックス絡みが未実装だったりしています。

バグ、要望などはフォーラム(英語)またはフォーラム(日本語)またはRubyForgeのプロジェクトページへどうぞ。

あー、完全パクリだなぁ。

2008年6月20日金曜日

RubyGemでRocket-starterをリリースしました

途中でソースを失ったり、初めてのRubyForge/RubyGem/Gitでスケジュールが遅れましたが、やっとリリースできました。

Rocket-starterとは何かというと、思い立ったときに簡単にrailsアプリを作り始めれるように、定型手段をまとめたもので、具体的には

  • subversionを使うならtrunkとbranchesとtagsフォルダを作る
  • railsコマンドでrailsアプリを作る
  • railsアプリの要らないファイルを削除する
  • railsアプリのtmpとかlogなどのようなものをignoreに指定する
  • 適切なタイミング(数回)でsubversionまたはgitにコミットする
  • いつもインストールするようなプラグインをテキストファイルにまとめておくと、一気にインストールしてくれる
  • RaPTというgemを入れておくと、railsプラグインをそれで管理してくれる このへん参照
  • なるべく楽をするため、configのひな形を編集する事で、設定値を保存しておける

目指したものは、masuidriveさんの言うrails-create-svnなどのスクリプトです。

rails-create-svn自体はmasuidriveさんの個人的なスクリプトで、公開はされていないのですが、考え方的なものにはすごく共感できまして、RubyForgeで似たようなものを探してみました。Railsプロジェクトの初期配置とかデプロイとかがそうですが、開発が止まっていたり、イマイチ求めているものと違ったりして、結局自分で作っちゃった方が早いや、という結論に至りました。

ぶっちゃけ、勢いで作ったのでアラアラですが、せっかく作ったんだから公開しようと思った次第です。

※何を考えていたか最近興味を持っている事 とかRailsプロジェクトの初期配置とかデプロイとか あたりを参照

※詳しくはこちら そんなに急いでどこへ行く

なお、rails-create-dbは、「DB作成はRails 1.2以降、「rake db:create:all」で同じ事ができる」とmasuidriveさんから教えてもらいました。

Rocket-starterの対象としている環境

現状としてはMaxOSX 10.5かLinux系やBSD系です。

svnやgitをコマンドラインから使える必要があります。(逆に、これがないとこのgemはあまり便利ではないと思います)

また、現状、フォルダの区切りをスラッシュとしてハードコードしています。(これは直そうと思えば直せる)

Rocket-starterの使い方

一応RubyForge上にプロジェクトのサイトも作ったんだけど、かなりいいかげんなので、こちらちゃんとしたものを書いておきます。

1.gemをインストールします

これは簡単ですね。

gem install rocketstarter

2.設定ファイルのパスを環境変数にセット

設定ファイル自体はひな形を作ってくれる機能があるので、設定ファイルを保存するパスのみ指定しておく必要があります。

export ROCKET_STARTER_CONF=~/.rocket_starter

とかでいいと思います。

3.設定ファイルのひな形を作ります

rocketstarterに設定ファイルのひな形を吐くようにオプションを付けます。

rocketstarter --init

4.設定ファイルをエディタなどで編集します

vi ~/.rocket_starter

など。

なお、詳しい意味は

--conf=/path/to/conffile

設定ファイルの位置を指定します

--scmtype=[svn|git]

svnかgitかを指定します

--scmuri=URI

svnのリポジトリURIを指定します。ログインが必要であれば頭に"username@"を付けます

--scmpassword=PASSWORD

svnのリポジトリアクセス用のパスワードを指定します

--database=name

railsコマンドへ渡すためのdatabaseパラメータ(mysqlとかsqlite3とか)です

--ignoredatabase

database.ymlをignoreに指定するかどうか。これをセットすればdatabase.yml.originなどと名前を変えてからignoreに指定します。デフォルトはオフです。

--verbose

動作内容の詳細を表示します。デフォルトはオフです。

--sudo

実行にsudoなどが必要な環境の場合、このオプションを指定すれば、各コマンドの頭にsudoを付けます。デフォルトはオフです。

--log

このオプションを指定すれば、verboseに指定したものと同様の出力を--logfileで指定したパスのファイルに書き出します。デフォルトはオフです。

--logfile=/path/to/logfile

ログファイルへのパスです。

--skip-netbeans

このオプションを指定すれば、NetBeansIDEのプロジェクト情報管理用ディレクトリであるnetbeansディレクトリをignoreに指定します。デフォルトはオフ(netbeansディレクトリをignoreに指定する)です。

--listpath=/path/to/listfile

このパスに指定されたファイルの中に、1行につき1プラグインのURLとして、プラグインのリストを作っておけば、rocketstarter実行時の最後にまとめてインストールしてくれます。

--skip-plugins

このオプションを指定すれば、プラグインをインストールしません。デフォルトはオフ(プラグインをインストールする)です。

--rapt

このオプションを指定すれば、プラグインのインストール時にRaPTを使います。もし指定されなければ、script/plugin install を使います。デフォルトはオフ(script/pluginを使う)です。

--externals

このオプションを指定すれば、プラグインのインストール時に-xオプションを付けます。RaPTを使う場合はこのオプションを使わない方が良いでしょう。デフォルトはオフ(-xを付けない)です。

--emulate

デバック/テスト用として、各コマンドを実行しないエミュレーションモードです。デフォルトはオフです。

5.設定ファイルやパラメータのチェック

rocketstarter --check

で現在の設定値をチェックできます。

設定ファイルで指定した値を、コマンドラインのオプションで上書きできているかもチェックできます。

rocketstarter --check --listpath=/path/to/another

など。


6.いよいよ実行

各設定値は既に設定ファイルに書かれてあるはずなので、ここで指定すべきはリポジトリURIやパスワード程度でしょう。

rocketstart project-name --scmuri=svn://example.com/svn/path/to/your/repos --scmpassword=yourpass

エラーが無ければ作られているはずです。

バグ、要望などはフォーラム(英語)またはフォーラム(日本語)またはRubyForgeのプロジェクトページへどうぞ。

RubyGemの作り方

参考になるかどうかわからないけど、(自分用に)Gemを作った仮定をメモしておきます。

かなーり適当な事を書いてますので、突っ込みよろしくです。

まず、GemとPluginの使い分けから。

  • Gemはシステムに入れるもので、複数のRailsアプリや、Railsを前提としない環境で使う
  • PluginはRailsアプリに入れるもので、特定のアプリのみで使う。複数のアプリで使い方ったら、それぞれに入れる。

今回は、Rails環境を簡単に作るためのGemを作っていますので、これを題材にします。

よく調べてないけど、関連状況はこんな感じ。

  • gemの配布はRubyForgeにgemを登録する事で行う。ユーザ登録やgem登録などは無料。
  • RubyForgeへのgem登録は、昔は.gemと.tarを手動でアップロードしてたけど、今はrakeタスクがある。(hoe)
  • gemのひな形としてnewgemを使う。これはhoeを含む。
  • hoeはgemの作成・登録を便利にするためのgem。newgemに含まれる。
  • このチュートリアルでのパッケージ名はrocketstarterにするよ。

参考

RubyGems パッケージの作り方 - rubyforge 登録まで ※さすがにちょと古い。概念押さえるべし

RubyGemsパッケージを作る  ※新しい。基本はコレ

rubyforgeがとても便利  ※新しい。ノウハウはコレ


手順としては、

  1. RubyForge上に自分のアカウントを作る
  2. RubyForge上で新規プロジェクトを登録する
  3. newgemのインストールとRubyForgeの設定
  4. newgemを使ってひな形を展開する
  5. ひな形をベースに管理情報やライセンスなどを書き込んで、公開したいプログラムを配置する
  6. testまたはrspecを書いておく
  7. rakeタスク(hoe)を使って、gemをビルド&インストールしてみて、動作を確認
  8. rakeタスク(hoe)を使って、RubyForgeに登録する
  9. RubyForgeへのアナウンス

1.RubyForge上に自分のアカウントを作る

無料なのでさっさと作ってしまうのが吉。

本名曝す事になるのは、しょうがないのかな?

SSHの公開鍵なんかもさっさと登録!!

2.RubyForge上で新規プロジェクトを登録する

プロジェクト登録は最大48時間かかるって書いてあるので、登録待ちでしょんぼりしないように、先に作っておくと良い。

申請内容を微調整される事もあるので、newgemに手を出す前に登録できた事を確認した方がいいよ。

あと、プロジェクト登録前にプログラム作っちゃうと、新規プロジェクト登録時に他のプロジェクトと名前が被っていて、そのままでは登録できないって罠にハマる可能性があるよ。<ハマったやつ

3.newgemのインストールとRubyForgeの設定

gem install newgem

でgemをインストールしておき、

rubyforge setup

で設定ファイルを作ったら、

rubyforge config

でRubyForgeからプロジェクトIDを取得しておく。

※先にRubyForgeで新規プロジェクトの申請をしておき、登録済みになってないとプロジェクトIDは取得できない。

2008/6/20 12:00追記

なんかgem list -rに出てこないなぁと思ったら、rake releaseに失敗してたみたい。対処法としては上記rubyforge setupとconfigを終えてから、

rubyforge login

として、エラーが無い事を確認。(エラーがある場合は、ブラウザからRubyForgeにログインして、言語をEnglishにしておく。rubyforge loginでは、ログインできた事の判定にtitleタグを使っているらしく、これは言語設定により異なるため)

あと、後々rake deployやrake releaseの時に

no <processor_id> configured for <Any>

などのエラーが出る場合は、rubyforge configに失敗していて、一部データが取得できてないので、以下のyamlデータを~/.rubyforge/auto-config.ymlに貼っておく。参考 Building a Ruby Gem

processor_ids:

IA64: 6000

AMD-64: 1500

Any: 8000

Sparc: 4000

PPC: 2000

Other: 9999

Alpha: 7000

i386: 1000

UltraSparc: 5000

MIPS: 3000


4.newgemを使ってひな形を展開する

newgem rocketstarter [options]

でひな形を展開する。

この時点でオプションを指定しておけば、のちのち楽になるものがたくさんある。

$ newgem --help
Take any library or Rails plugin or command line application, gemify it, and easily share it with the Ruby world.

Usage: newgem /path/to/your/app [options]

Options:
-b=BIN_NAME[,BIN_NAME2] Sets up executable scripts in the bin folder.
--bin-name Default: none
-e, --email=PATH Your email to be inserted into generated files.
Default: ~/.rubyforge/user-config.yml[email]
-j, --jruby Use if gem is for jruby.
-a, --author=PATH Your name to be inserted into generated files.
Default: ~/.rubyforge/user-config.yml[user_name]
-p, --project=PROJECT Rubyforge project name for the gem you are creating.
Default: same as gem name
-r, --ruby=path Path to the Ruby binary of your choice (otherwise scripts use env, dispatchers current path).
Default: /opt/local/bin/ruby
-T, --test-with=TEST_FRAMEWORK Select your preferred testing framework.
Options: test::unit (default), rspec.
-v, --version Show the newgem version number and quit.
-V, --set-version=YOUR_VERSION Version of the gem you are creating.
Default: 0.0.1
-W, --website-disable Disables the generation of the website for your RubyGem.
--simple Creates a simple RubyGems scaffold.
General Options:
-h, --help Show this help message and quit.
--pretend Run but do not make any changes.
-f, --force Overwrite files that already exist.
-s, --skip Skip files that already exist.
-q, --quiet Suppress normal output.
-t, --backtrace Debugging: show backtrace on errors.
-c, --svn Modify files with subversion. (Note: svn must be in path)

とりあえず

newgem rocketstarter --bin-name rocketstarter --test-with=rspec -e "myaddress@example.com" -a "maimuzo"

あたりで作るかな。

5.ひな形をベースに管理情報やライセンスなどを書き込んで、公開したいプログラムを配置する

config/hoe.rbあたりをいじった後にgrep -r "FIX" ./*して引っかかったところをすべてチェック。

上記-aと-eを付けておくと、この作業が楽になるよ。

あとは、適当に。

プログラムの配置は、binの中の実行ファイルと、libの中のrocketstarter.rbを変更して、実態はlib/rocketstarter/の中に入れた。

あと、サポートフォーラムとして、google groupsに部屋作れって書いてあるね。(一応素直に作った)

6.testまたはrspecを書いておく

今回は動作環境がよくわかってないので、後付けにするよー

7.rakeタスク(hoe)を使って、gemをビルド&インストールしてみて、動作を確認

ちなみに、--simpleオプションをつけると、この機能は使えない。

まず、公開用のRSA公開/秘密鍵を作る

rake generate_key

マニフェストファイル(パッケージに含めるファイル?)を最新状態で作り直す

rake manifest:refresh

現在の設定でgemを作って、ローカルにインストールしてみる。

rake local_deploy

だめぽだったら

sudo gem uninstall rocketstarter

して、変なところを直してからまたrake local_deployする。

8.rakeタスク(hoe)を使って、RubyForgeに登録する&告知する

rake check_manifest

でファイルの整合性が崩れてないか念のためチェック

rake deploy VERSION=0.0.1

でリリース。しばらく待つべし。

9.RubyForgeへのアナウンス

rake announce

でいいみたい。

gemの配布が始まってからの方がいいかもねー

2008年6月17日火曜日

攻殻機動隊のリニューアルを札幌から応援する

まぁ見てよ。

なんで今更リメイクなのかよくわかんないけど、問題はそんなところではなくて、問題としたいのは、みんなが忘れかけていた攻殻機動隊という作品を、また全面に持ってきてくれた事だと思う。

Webプログラマの視点から見て思うのは、よくよく考えてみると、この作品って数年後レベルのサービスレベルを予見させてくれるような題材が非常に多いんだ。

たしかOVAだったと思うけど、VR上で討論会してるシーンでは、脇にチャットの文字が流れてる(2chとかニコ動?)し、笑い男が自分の顔を隠すために取った画像書き換えも、画像さえあればできちゃった(動いていたシステムはドメイン切れみたい)よね。

Webシステムのアイデアになることも多い。今でも、たまにコミックとかビデオを見たりしてる。

その他はトーキョーNOVAとかね。(マニア過ぎ)

劇場限定なのに札幌では上映されるようなので、お好きな方は攻殻機動隊1と2のコミックを徹夜して読み直してから、劇場に足を運ぶように!! おいらはきっと見に行くよ。

はいはい。マニアな話でした。

関係ないけど、ことえりが「こうかくきどうたい」を一発で正確に変換できた事に非常に驚いた。

Vistaでは変換できないよねぇ。

2008年6月15日日曜日

間違ってMacOSX10.5(leopard)上で必要なファイルをrmコマンドで消してしまい ました

本当は「消しちゃったけど、こうやったらうまくいったよー」という記事にしたかったのですが、うまくいかなかったのでバッドノウハウ的にしょぼーんな記事にします。

実は今、rubyでrails向けのgemを作っているんですが、この中でrmコマンドを使うところがあったんですよ。

で、一通りコーディングを終えて、さあ動くかなーと走らせた瞬間に、(おそらくバグに起因して)他の自作アプリを含むソースコードディレクトリすべてをきれいに消してくれたんですね。(汗

まぁ、バグとかシュミレーションモード付けなかった自分が悪いんで、しょうがなくファイル復旧を試みてみました。

取り戻したいもの

  • Ruby on Railsのディレクトリ構成およびその中のファイル一式
  • Ruby on Railsではないrubyのスクリプト
  • ただし、ほとんどのものはsubversionで管理してあるので、commit前の最新状態のみ欲しい
  • 最新状態かどうかの判断に人的時間がかかるのであれば、復旧する必要は無い(もう一度作った方が早い)
  • 本当はアプリケーションのリソースとしての画像とか音声などもあったけど、プログラマとしてはあまり重要視してない。(無いならまた作ればいいやー。どうせ適当に作ったデモ用のものだし)

以下は自分が行った作業です。

1.とりあえず、wikipediaでMacOSX10.5のファイルシステムを調べてみました

Mac OS X v10.5

なんかよくわからん。

HFS Plus

流れは忘れたけど、MaxOSX 10.5で採用しているのはこれらしい。

2.google先生に、HFS+のファイル復旧の手段を聞いてみました

まとめると

  • HFS+? 知らないねぇ。
  • rmで消したら復旧は無理じゃね? ファイルシステムによるけど、一般的にwindowsと違って、Unix/Linux系でファイルを消した場合は、ディレクトリツリーやファイル名などの管理情報はその場で消してしまうから戻らないし。
  • ファイルシステムとしての管理情報が無い(壊れた|消した)場合は、ハードディスク全体をスキャンして、ファイルのフォーマットとかシグネチャからファイルの種類を予想して復旧するような方法は取れるけど、確実な方法ではないよね。(たとえばJpegならファイルのヘッダーはこういう構造になっているはずだから、このファイルはJpegだとか、Jpegではないとかが判断できる)
  • Ext2ならmcやdebugfsで復旧できる事もあるよ。→HFS+にはこのコマンドはありませんでした
  • フリーソフトの類ではあまり復旧ソフトは聞かないね。
  • PhotoRecというオープンソースの復旧ソフトはあるよ。
  • 製品版ならDataRescue2というのがMacと相性がいいよ。
  • ゴミ箱使えばいいのに…

みたいな感じでした。

たしかに、クライアントPCとしてのMacなんだから、ゴミ箱使えが正論な気がする。でも、GUIじゃなくCUI上の話だから、そう簡単な話ではないんだけど。

一瞬/bin/rmをエイリアスに変えて、ゴミ箱っぽい動作をするように変更しようかと思いましたが、ここまで低レベルなコマンドを変更すると、他の部分に影響が出そうなのでやめました。

3.PhotoRecを試してみました

まぁ、とりあえず試すのはこれでいいかな。

このソフト、名前が示す通り、元々は画像を復旧させるソフトみたい。(画像などは復旧させやすい)

さくっとインストールして、起動もすぐに出来たけど、スキャンが長い…。

250GBのHDDで8時間ぐらいかかりました。

しかも、復旧できたのはテキストファイル1つだけで、そのファイルは不要なものでした。

るるるー

4.google先生に、一般的なLinux上などでのファイル復旧の手段を聞いてみました

Linuxファイルとファイルシステムのリカバリ あたりの記事に、grepを使ってユニークなキー(特定の関数名とか)を元にディスク全体をスキャンして、引っかかった前後数行をテキストファイルにリダイレクトし、エディタを使って必要な部分だけを残して後は消す、という流れの復旧方法が載っていました。

具体的には、

grep -a -C 300 --line-buffered 'keyword' /dev/disk0 > /Volumes/USBHDD/rescue.txt

とかってやるんですけど、これも250GBのHDDをスキャンするのに3時間ぐらいかかって、しかもキーワードの選定が甘いとたくさん引っかかって、あとでチェックするのが大変+テキスト以外の制御コードが多くて編集も大変てな感じで、しかも欲しいファイルが見つからなかった(欲しくないファイルはテキストとして取り出せたので、方法としては正しいけど、キーワードの選定が甘かった?)ので、やはりしょぼーん。

あ、でも、コマンドラインから起動するものであれば、終了後にメールを送信して知らせてくれるように出来るので、別の事(読書とかWebで調査)ができて作業としては助かるなぁ。

# very-long-command[enter]

echo 'finished' | mail -s 'from your PC' your-mobile-address@example.com[enter]

date[enter]

とかね。コマンドプロンプトが帰ってきてないときに、先行入力しておくと、時間のかかるコマンドが終わった後に実行してくれるので、メールを送信したりとか、dateってやれば終了時刻(起動した時間を覚えておけば、かかった時間)がわかる。

5.DataRescue2を試してみました

DataRescue2ってデモ版(というかシリアル入れれば正規になるもの)がダウンロードできるんですね。

で、さすがに製品らしく、メニューもスキャンオプションも充実していて、今回のようにディスクは正常だけど、間違ってファイルを消した場合用のスキャン方法(空き領域のみスキャンしてくれる)があるので、それで試してみました。

ちなみに、250GBのHDDの内、空き容量は60GB程度。

で、デフォルトのスキャン設定のままだと、テキストモノは復旧してくれないようなので、設定メニューからテキスト系の復旧を有効にしてからスキャンする事2時間くらい。

さすがに商用ソフト、ちゃんとファイルを見つけてきてくれます。

これらからgrepでキーワード検索して、欲しいファイルのリスト(同じファイルでも上書き回数分すべて復旧される)を作り、どれが一番新しいのか開いて確認するのですが、これがなかなか見つからない。全容量で800MB弱あるので、1つ1つ見て回るのは現実的ではないし、一番欲しいファイル(ruby単体のスクリプトファイル)はgrepで引っかからなかったので惜しいところまで来たけど、これもダメ。

ちなみに、erbとかrailsのコントローラーやモデルは復旧できるみたいですが、ディレクトリ構造やファイル名を失っているのと、どれが最新のファイルかが判断付きにくいので、よほど根気よくやらないと、きちんとは直せないような感じでした。

6.あきらめてsubversionから戻したのものを再修正する

結局コレかよ、と。

いつもそうだけど、同じ修正を2度すると、コードとしてはよりきれいに書けるんだけど、テンションは下がるよね。特に、作業にかかるまでのテンションが。(作業にかかってしまうと、リファクタリングみたいな感じてやる気は出るんだけど)

で、教訓。

  • windowsと違って、Macのファイル復旧は難しい
  • プログラマならsubversionなりのソースコード管理システムを全案件で使って、細かく保存しよう
  • MacOSX10.5以降なら、ちょっとメンドクサでもTimeMachineを使おう。(近日中にハードディスクケース買ってくるかな)
  • お金をかけても取り戻したいデータがあるなら、100万円ぐらい握ってサルベージ屋さんにGo!(前の会社で「これは無理だろ」的なものでも、使い物になる程度まで直してくれました。お値段100万超えでしたが)

2008年6月12日木曜日

hatena-bookmark-anywhere-0-1-each-articles.jsを公開しました

有益なコメントが多いはてなブックークのコメントを、1ページに複数のコメントのリストを表示できるように改造した、hatena-bookmark-anywhere-0-1-each-articles.jsを公開しました。

この版は、元々masuidriveさんが作られたhatena_bookmark_anywhere.js(今開いているページのコメントのリストを1つ表示)を改造したもので、ソースレベルでの互換性がないことから、別の版としてリリースする事になったものです。(基本的な流れは同じです)

基本的に先日の「調子に乗ってbloggerにhatena_bookmark_anywhere.jsを組み込んでみました 」から変わってはいません。

masuidriveさんと相談して、別々のファイルとして公開して行こうという流れになったので、公開記事としてまとめ直しただけのものです。

設置方法

1.zipファイルからJavaScriptファイルを取り出す

ここからzipファイルをダウンロードし、解凍してhatena-bookmark-anywhere-0-1-each-articles.jsを取り出し、hatena-bookmark-anywhere-each-articles.jsと名前を変えておく。

2.JavaScriptを設置したいページに設置する

これは2つ方法があり、

2-A.JavaScriptファイルを別途用意できる場合(キャッシュ効くのでおすすめ)

<script src="[設置パス]hatena-bookmark-anywhere-each-articles.js" type="text/javascript" charset="utf-8"></script>

として読み込む。

2-B.hatena-bookmark-anywhere-each-articles.jsの内容をHTMLのHEADに設置する(Bloggerなどはこちらでも良い)

HTMLやテンプレートファイルの適当な場所に、以下のようにScriptを仕込む

<!-- start of Hatena bookmark anywhere -->

<script type='text/javascript'>

/*<![CDATA[*/

(ここにhatena-bookmark-anywhere-each-articles.jsの内容をコピペする)

/*]]>*/

</script>

<!-- end of Hatena bookmark anywhere -->

3.はてなブックマークのコメントリスト表示エリアとパーマネントリンクを指定する

<div class='hatena_bookmark_anywhere' target_url='http://example.com/path/to/yourblog'/>

  • divタグじゃなきゃいやん。ハードコーディングしちゃってるしー。
  • classプロパティは 'hatena_bookmark_anywhere'とする。もしコレ以外だったら何もしない。もしクラス名を変えたかったらライブラリの__hatena_bookmark_anywhere_special_class_nameを変更する事。
  • target_urlプロパティは該当ブログのパーマネントリンクを入れること。空だったら何もしない。もしイヤンならライブラリの__hatena_bookmark_anywhere_target_url_prop_nameを変更する事。
  • idプロパティなんてデザイン要素としては使う必要ないのかもしれないけど、ライブラリの内部で動的にidを付けちゃってるので、指定しても無駄無駄。クラス当てようね。
  • なにかと被ったらごめんなさい。
  • Firefox2 on MacOSX10.5とsafari3.0 on MacOSX10.5しかテストしてませんです。
  • あとは基本的にhatena_bookmark_anywhere.jsと同じ

もし、Blogger用に使いたければ以下のようにすれば良い。

Bloggerの管理画面から、レイアウト→HTMLの編集→ウィジットのテンプレートを展開にチェック→以下のタグを探す

<div class='post-footer-line post-footer-line-3' />

これを以下のように変更

<div class='post-footer-line post-footer-line-3'>

<div class='hatena_bookmark_anywhere' expr:target_url='data:post.url'/>

</div>

2008年6月11日水曜日

Amazon EC2とS3を使ってみる(その3 EC2onRailsセットアップ編)

EC2上でRailsを便利に扱うためのEC2onRailsというプラグインがあるみたい。

でも、日本語でのEC2onRailsの情報は少ないので、以下で解説しちゃいます。

まず、このプラグインはEC2のAMI+Capistranoの拡張プラグインとして配布されているもので、インスタンスへのデプロイや、インスタンス上のMySQLやログについて、S3にバックアップなどを自動的に行ってくれるみたい。

配布されているEC2onRailsのAMIはほとんどまっさら状態なので、このまっさらの状態のサーバから、必要なパッケージやgemをインストールし、必要なサービスを起動するところまでやってくれる。

その分、deploy.rbが複雑になっているので、日本からの初期設定として使いやすい(と思われる)設定とコメントの日本語化を行ったので、置いておきます。(暇があったらパッチを作者に送っておきます)

EC2onRails本家に習ったセットアップ手順(基本的にちょーショートカット意訳)

前準備

  • 動作可能なRailsアプリケーションが準備できている事。EC2onRailsではrails 1.2.6と2.0.2が準備されています。(もちろんgemを追加すれば好きなバージョンが利用できます)
  • capistranoがインストールされている事。これはgem install capistranoでインストールできます。
  • capistranoの設定に対して、ある程度の知識を有すること。capistranoの設定はちょっと特殊っぽいので、うまく動くまで何度かトライすることになると思います。各タスクの実行結果を見ながら、deploy.rbを微調整できる程度の知識が必要となります。ある程度のノウハウはこちらのwikiにまとめてあります。
  • capify .して置く事
  • deploy.rbの:server_config_files_rootに指定したディレクトリ(例えば "../server_config")に、インスタンスに配置したいファイルやディレクトリを入れておく事。これは/etc/hostsなど、サーバ上のファイルを置き換えるためにあるんだと思う。(この場合は"../server_config/etc/hosts"という風に配置する)

1.gemのインストール

EC2onRailsはgemとAMIがセットで動きます。バージョンも合わせておく必要があります。

sudo gem install ec2onrails

2.設定ファイルの配置

以下の3ファイルをダウンロードして配置し、s3.ymlとdeploy.rbについては、ある程度設定を埋めておく必要があります。(インスタンスを起動しないと設定をすべて埋める事は出来ません)

  • EC2onRailsはcapistranoの拡張として動くのですが、インクルードするファイルを切り替えているようなので、こちらのCapfile(本家と同じもの。ver0.9.8.1用)に差し替えておく必要があります。
  • S3へのアクセス用に、railsアプリケーションのconfigディレクトリ以下にs3.yml(本家と同じもの。ver0.9.8.1用)を配置しておく必要があります。
  • capistranoからのデプロイ用に、railsアプリケーションのconfigディレクトリ以下にdeploy.rb(本家と同じもの。コメントを日本語に意訳したものを下に貼っておきます。ver0.9.8.1用)を配置しておく必要があります。



# EC2 on Rails用Capistranoサンプルconfigファイル ver 0.9.8.1用

set :application, "yourapp" # 自分のアプリケーション名に変えておく

#set :deploy_via, :copy # オプション, 詳しくはCapistrano docsを見るべし

#set :copy_strategy, :export # オプション, 詳しくはCapistrano docsを見るべし

# ec2インスタンスからアクセス可能なsubversionリポジトリを指定する

# もしsubversionなどへのアクセスにユーザ名が必要であれば、以下のようにします

# set :repository, "--username your_user_name --password your_password http://svnservers.example.com/path/to/repos"

set :repository, "http://svn.foo.com/svn/#{application}/trunk"

# Capistranoでは公開鍵と秘密鍵を同じフォルダに格納しておく必要があります。

# 公開鍵の拡張子は".pub"である必要があります。

# この鍵は、前もってec2-add-keypairコマンドで作成しておいたもので、

# 通常であれば秘密鍵はあなたの手元にあるはずですが、公開鍵はamazon側で管理しており、

# 手元には無いはずです。これはインスタンス起動時にサーバにコピーされますので、

# インスタンスを先に起動して、サーバから公開鍵をコピーしてくることで取得できます。

# EC2 on Railsでは、/root/.ssh/authorized_keysから、あなたのPCにコピーしてくるための

# 専用タスク

# cap ec2onrails:get_public_key_from_server

# が用意されています。

# 下記では、ec2-add-keypairコマンドで作成しておいた秘密鍵へのパスを指定します。

# cap ec2onrails:get_public_key_from_serverタスク実行後に、秘密鍵名.pubという

# 名前で公開鍵が保存され、以後秘密鍵と共にcapistranoによって使われます。

ssh_options[:keys] = ["#{ENV['HOME']}/ec2-keys/id_#{application}"]

# EC2インスタンス情報

# インスタンス起動後にPublicDNS側をコピーして貼ってください

# 一括指定用

set :masterdomain, "ec2-12-xx-xx-xx.z-1.compute-1.amazonaws.com"

role :web, masterdomain

role :app, masterdomain

role :db, masterdomain, :primary => true

role :memcache, masterdomain

# もしくは、文字列で指定する

#role :db, "ec2-21-xx-xx-xx.z-1.compute-1.amazonaws.com", :primary => true

# 起動させる環境

set :rails_env, "production"

# EC2 on Rails config

set :ec2onrails_config, {

# ec2onrails:db:restoreタスク(バックアップからのリストア)用のS3ブラケット名とサブフォルダ名

# 通常サブフォルダ名は"database"でいいはずです

:restore_from_bucket => "your_app_bucket",

:restore_from_bucket_subdir => "database",

# ec2onrails:db:archiveタスク(バックアップ)用のS3ブラケット名

:archive_to_bucket => "your-other-bucket",

# MySQLユーザのrootのパスワード。

# デフォルトではパスワードは設定されていないため、そのまま公開するのは危険です。

# EC2 on Railsでは

# cap ec2onrails:db:set_root_password

# タスクにより、MySQLのrootユーザのパスワードを設定できます。

# database.ymlの設定と合わせてrootのパスワードを指定してください。

# (パスワードが空のままではうまくセットアップできないようです)

:mysql_root_password => "your-mysql-root-password",

# 必要であれば以下のUbuntuのパッケージをインストールすることができます

:packages => ["logwatch", "imagemagick", "libmagick9-dev"],

# 必要であれば以下のRubyGemsをインストールすることができます

# "gemname"または"gemname -v 1.0.1"と指定してください

:rubygems => ["gettext", "rmagick -v 1.15.13", "rfacebook -v 0.9.7"],

# サーバで使用するタイムゾーンを指定します

# "cap -e ec2onrails:server:set_timezone"を起動してください

:timezone => "Asia/Tokyo",

# 所有者rootとしてサーバに配備するファイル群。

# 下記ディレクトリ以下に配置されたサブディレクトリやファイルは

# ec2onrails:server:install_packages

# タスクなどによって、サーバの/(ルートディレクトリ)にroot:root 644として配置されます。

# なお、標準では/mnt/appにrailsアプリケーションが配置されます。

:server_config_files_root => "../server_config",

# もしconfigファイルが配置された時、サービスを再起動する必要があるかもしれないデーモン

:services_to_restart => %w(apache2 postfix sysklogd),

# adminユーザからの転送メールアドレスを指定します

:admin_mail_forward_address => "you@yourdomain.com",

# このサーバでSSLを有効化するときはtrueを指定します。

# SSLサーバ証明書は

# /etc/ssl/certs/default.pem

# 秘密鍵は

# /etc/ssl/private/default.key

# に保存されている必要があります

:enable_ssl => true

}



※Bloggerでテキストをアップロードする方法ってないんでしょうかね?

3.インスタンスの起動

起動すべき(railsプラグインと同じバージョンの)AMIのIDは

cap ec2onrails:ami_ids

で確認できます。

このあたりはまとめサイト参照。

4.公開鍵の取得

Amazon EC2とS3を使ってみる(その2)でも振れているが、

cap ec2onrails:get_public_key_from_server

でサーバから公開鍵をローカルPCにコピーしてきてくれる。コピーした公開鍵と、対になっている秘密鍵を使ってcapistranoが動いてくれるみたい。

5.デプロイ

いよいよデプロイ。なので、ここまでにs3.ymlとdeploy.rbを埋めておく事。

cap ec2onrails:setup

ec2onrails:setupタスクは色々してくれます。
  • インスタンスへの秘密鍵を使ったログイン
  • deploy.rbで指定されたubuntuのパッケージのインストール
  • deploy.rbで指定されたGemのインストール
  • deploy.rbのserver_config_files_rootで指定されたファイルをインスタンスに転送して/(ルートディレクトリ)に被せる。たぶん/etc/hostsとか/etc/aliasesなんかを変更したい人用なんだろうねぇ
  • /mntの中にmysqlとrailsアプリのためのディレクトリを作る(本来のcapistranoのタスク)

すばらすぃ

cap deploy:cold

deploy:coldタスクも色々してくれます

  • deploy.rbで指定されたsubversionなどのリポジトリから、最新のソース一式をインスタンスに配置する( 本来のcapnistranoタスク)
  • インスタンス上のapacheやMySQLなどを起動してくれる(このタスクが実行されるまでは起動していない)
  • インスタンス上のMySQLのrootユーザにパスワードを付けてくれる(デフォルトではパスワードは無い)
  • インスタンス上のMySQLにdeploy.rbで指定された(productionなどの)環境用のデータベース(hoge_productionなど)を作ってくれる
  • Railsアプリを起動するためのapacheのconfとか、リバースプロキシ絡みの設定ファイルを自動生成してくれる
これもすんばらすぃ

あーでも、Railsの実行はapache+mod_proxy_balancer+mongrel_clusterになっていて、1インスタンス1Railsアプリケーションという考えなので、1インスタンスで複数のRailsアプリケーションを動かしたい場合は、改造が必要みたい。

cap deploy

普通のcapistranoタスク。以後ソースのアップデートにはこちらのタスクを使います。

参考

Amazon EC2でRailsを使いたい方は「EC2 on Rails」

EC2 on Railsが採用しているubuntu-gustyのパッケージ一覧


なんか、リバースプロキシの設定ファイルを作るあたりを、passengerに置き換えると、複数ドメインの対応も楽になる気がするんだよなぁ、ってところで、自分が作っていたRailsアプリのgemが衝突して動かなくなってしまったので、検証できず…

rails ver 2.1.0で作り直して再チャレンジした結果をその4あたりにまとめます。


調子に乗ってbloggerにhatena_bookmark_anywhere.jsを組み込んでみました

何の事かというと、ブログなどパーマリンクが付くものに対して、はてなブックマークのコメントを一覧表示するためのJavaScriptライブラリです。作者はmasuidriveさん。

このへん参照

ブログにはてブのコメントを表示するhatana_bookmark_anywhere.js

hatana_bookmark_anywhere.jsの設置方法とカスタマイズ

hatana_bookmark_anywhere.jsに重大バグ? & おまけ


Bloggerの場合、画像ファイル以外はBloggerのサーバに置けない(はず)ので、テンプレートHTMLのHeaderにhatana_bookmark_anywhere.jsと同様のJavaScriptコードを書いておくのですが、

<script type='text/javascript'>

/*<![CDATA[*/

(コピペでhatana_bookmark_anywhere.jsの中のコードを貼る)

/*]]>*/

</script>

のように、CDATAで囲んでおかないと、色々エラーが出てしまいます。

参考

Bloggerでも、はてブのコメントを表示する


あと、Bloggerのデフォルト表示だと最新の数個の記事が表示されますが、このライブラリでは各記事単位でコメントを拾ってくるのではなく、現在のURLに対して拾ってくるので、1ページに複数の記事があるとコメントがちょっと変な事になります。

記事のリンクをクリックして記事を指定すれば問題ないのですが(その方がごちゃごちゃしないで済むという意見もあるでしょうし)、個人的には一覧ページにも記事毎にはてブコメントが欲しかったので、hatana_bookmark_anywhere.jsを改造して複数記事対応版を作りました。

使い方

1.ライブラリの保存

このブログのヘッダー部分の

<!-- start of Hatena bookmark anywhere -->

<script id='hatena_bookmark_anywhere_script_inline_edition' type='text/javascript'>

/*<![CDATA[*/

から

/*]]>*/

</script>

<!-- end of Hatena bookmark anywhere -->

の間のコードを別ファイルに保存する。(改造元hatana_bookmark_anywhere.js見合いの部分です)


2.ライブラリのリンク

以下のようにライブラリをロードする。ファイル名は適当に付けてなー。

<script src="[設置パス]hatena-bookmark-anywhere-each-articles.js" type="text/javascript" charset="utf-8"></script>

※おいらのように、外部にソースを置けない(or 置くのがメンドサ or S3貧乏はゴメン)な人は、scriptタグごとヘッダーに貼っちゃえば良いです。

※このブログのソース参考にしてね


3.はてなブックマークのコメント表示エリアを確保

表示したいところに以下のようなdivタグを置く。

<div class='hatena_bookmark_anywhere' target_url='http://example.com/path/to/yourblog'/>

ここに

  • divタグじゃなきゃいやん。ハードコーディングしちゃってるしー。
  • classプロパティは 'hatena_bookmark_anywhere'とする。もしコレ以外だったら何もしない。もしクラス名を変えたかったらライブラリの__hatena_bookmark_anywhere_special_class_nameを変更する事。
  • target_urlプロパティは該当ブログのパーマネントリンクを入れること。空だったら何もしない。もしイヤンならライブラリの__hatena_bookmark_anywhere_target_url_prop_nameを変更する事。
  • idプロパティなんてデザイン要素としては使う必要ないのかもしれないけど、ライブラリの内部で動的にidを付けちゃってるので、指定しても無駄無駄。クラス当てようね。
  • なにかと被ったらごめんなさい。
  • Firefox2 on MacOSX10.5とsafari3.0 on MacOSX10.5しかテストしてませんです。
  • MITライセンスなので改造したものを公開しようと思うんですが、構造を結構変えちゃってるんですよね。しかも、互換性無いし、使い方によっては改造前の方を好む人も居るでしょうし。公開方法はどうしたらいいでしょうか? googleあたりにリポジトリ作ります?(私はあまりメンテする気もないのですが)>masuidriveさん

もし、Blogger用に使いたければ以下のようにすれば良い。

<div class='hatena_bookmark_anywhere' expr:target_url='data:post.url'/>


※hatana_bookmark_anywhere.jsなのかhatena_bookmark_anywhere.jsなのかイマイチ不明ですが、一応検索キーワード的に両方書いておきます。

2008年6月8日日曜日

Amazon EC2とS3を使ってみる(その2 基本操作編)

まず、EC2で何がしたいのかをまとめてみる。

  1. 「システムとしてはサーバスペック(単体性能やスケールアウトによる負荷分散)やバックアップ設備やストレージなどが大量に必要なシステムなんだけど、まじめにやると初期投資が大きすぎて大変。かつ、コスト的に採算が合うのは、サービスとしてうまく軌道に乗って、ユーザやコンテンツが集まってしばらくしてからで、サービス開始当初はかなりのマイナス位置からのスタートとなる」ような場合に、将来的な拡張性と初期投資を押さえるという両面を満足させたい。
  2. Ruby on Railsを動かしたい。
  3. メールフォームとかにRuby on Railsは大げさだから、PHPも動かしたい。
  4. DBはMySQLかSQLiteでいい。
  5. 普通は流行るシステムなんて一握りなんだから、1つのインスタンス上で複数のドメイン(システム)を扱いたい。ただし、負荷的に厳しくなってきたときに、他のインスタンスへの移動もスムーズに行いたい。
  6. バックアップはきちんと取りたい。リストアも簡単に行いたい。
  7. デプロイを簡単にしたい。具体的にはCapistranoを使えればいい。

で、これを実現しうるものは、EC2onRailsかなと。

負荷が高くなってきたら、自動的にスケールアウトしてくれるようなRight ScaleScalrみたいなサービスも出てきているみたいだね。(有料だけど)

参考

実際にアマゾンが使っているのと同じ仮想サーバを無料で試せる「Right Scale」を使ってみた

ステップとしては、

  1. まずはまとめサイトなどを見て、AWSへの登録を行う
  2. すべての基本となるS3の使い方を押さえる
  3. EC2で実際にインスタンスをたてて、なにか適当に動かした後、イメージも作って、終了させてみる。
  4. EC2onRailsを使ってみる。
  5. EC2onRailsで不満な所を直して、イメージ(AMI)を作ってみる。

みたいな感じになるかな。

基本的に、まとめサイトを見て、その通りにやってみれば、おおよその流れは掴めると思う。

はまりそうなところを列記すると、

AWSへの登録

  • 英語読めれば楽かもね。
  • クレジットカードは必要だよ。
  • Getting Started GuideDeveloper Guide はさらっと読んでおくべし。特にデベロッパーガイドにはコマンドラインツールのリファレンスが付いてる。

S3の使い方

EC2の使い方

  • EC2の管理は、ElasticFoxを使うと楽。コマンド覚えなくていいしね。
  • Amazon EC2/S3を使ってみた - 6.EC2をGUIで操作するあたりを参考
  • SSHでのログイン用のRSA認証鍵としてec2-add-keypairで鍵を作るんだけど、作った公開鍵は自動的にamazon側に保存されるので、テストでばしばし変な鍵を作ると、後で困る事になるかも。(まぁ、消せるけど)
  • ec2-add-keypairで作った鍵は、chmod 400にして~/ec2-keysというディレクトリの中にid_(keyname)として保存しておくと、ElasticFoxとの相性がいいかも。(まぁ、ElasticFoxの右上のtoolsから設定変更できるけど。てかあー、おいらMacだからこのパスでいいけど、Windowsだったらパス決め打ちするしかないかもなー)
  • $ ec2-add-keypair testmachine | sed -e "1d" > ~/ec2-keys/id_testmachineみたいな感じ。
  • この設定は、のちほどEC2onRailsにも出てくるので、こだわりが無いなら、上記に統一するのが吉。

EC2onRailがらみが思ったより長くなりそうなので、その3に続く。

調子に乗ってbloggerにoutbrainを組み込んでみました

人様のブログを見ていたら、面白いレーティングの仕組みがあって、なんか無料で使えるようなので、勢いで入れてみました。

outbrain.com でアカウントを取得して、そのまま自分のブログ(blogger)のURLを入れると、blogger側の管理画面にページ要素としてoutbrainが表示されるみたい。別にタグを埋める必要も無いし、楽々。


bloggerのページ要素としてはRatings by outbrainってのが表示されてるんだけど、おそらく中身はJavaScriptのコードだけで、実際にブログには表示されない。


代わりに、outbrain側の管理画面から、表示内容や表示位置などを選択できるみたい。


既に「はてなスター」はあるんだけど、これってはてなにアカウント持ってないと使えないでしょ?

その点、outbrainはアカウント必要ないし、見た目も良いしで、オススメです。


2008年6月6日金曜日

オープンソースカンファレンス2008 HokkaidoのPostgreSQLイベントがヤバい

私は北海道の札幌市に住んでいるんだけど、オープンソースのお祭りというか、勉強会というか、いろんなイベントが同時に開催されるオープンソースカンファレンス2008 Hokkaidoというものが、2008/6/28(土)にあります。

既に過去2回参加していて、毎回その内容が充実してきているので、今年も参加するつもりで居ました。

さっきメールを確認したら、OSC2008の案内メールが来ていたので、イベント内容を確認したんだけど、今年のPostgreSQLイベントはヤバいね。

まぁ、これ見てよ。

PostgreSQLの認定試験があるのは知ってたけど、なんとこの試験をイベント会場でやっちゃうんだって。しかも3段ぶち抜き。

しかも、通常13,650円のところ、なんと無料なんだって。もちろん、受かったら普通に認定してくれるみたい。

ほらほら、これみて。

PostgreSQL CE試験 直前対策講座

PostgreSQL CE 8 Silver 無料特別受験!

参加は20人までで、現状どれだけ申し込みがあるのかわからないけど、早い者勝ち。

おいら早速申し込んだけど、これ、絶対早く申し込まないと定員になるよ。

申し込みはこちらから

http://www.ospn.jp/osc2008-do/

ちょっとまじめに受験してみようかな。公式マニュアルをちゃんと読もう。 試験範囲はこちら

ちなみに、午前中はRuby札幌のコミュニティブースで店番してるかもしれません。

お暇なら声かけてくださいね。

bloggerに「はてなスター」と「はてなブックマーク」を埋めてみました

他のブログをみて、いいなぁと思ったのでこのブログにも入れてみました。

個人のブログにはてなのサービスを仕込む事によるメリット

  • アクセスカウンタの一種として、被ブックマーク数やスターの数により、記事がどれくらい注目されている/露出しているかの判断材料となる(ブログオーナー視点)
  • はてなのユーザにとって、はてなブックマークへの追加が楽になる
  • はてなブックマークに飛ぶ事によって、関連情報が集約されるので探しやすい
  • 記事を読む前に被ブックマーク数やはてなスターの数を見る事により、記事の質が事前にわかる(検索エンジン経由で来た人にとっては重要かもね)
  • なんとなくカコイイ
  • ブログオーナーのモチベーションアップ?
  • んー、昔流行ったトップページにアクセスカウンタを仕込んで、アクセス数を見せて|見ているのと、基本的には意味が同じなのかな。

個人のブログにはてなのサービスを仕込む事によるデメリット

  • 既に設置されている「何か」とJavaScriptのコードが衝突するかもね(自分でいじってなければ大丈夫だとは思うけど)
  • 表示がちょっと遅くなるよね。すべてのコンテンツを表示「しきる」のが遅くなるって意味だけど。
  • いろいろごちゃごちゃ付いていて見づらいと思う人は居るはず。(ブログ側の配置センスにもよる)。
  • いろいろごちゃごちゃ付いていて怖い(下手に触ると壊れるとか)思う人も少なからず居るはず。
  • 要はホントのPC初心者には優しくないと思う。はてなサービスに対応して嬉しいのは中・上級者(特にIT系エンジニア)であって、初心者には逆効果だよね。(普及率がずば抜ければ状況も変わるんだろうけど)
  • あと、オーナーが書きたい事以外のコンテンツを増やす事って、いいことなのかな?という疑問もあるなぁ。広告があちこちにあるようなサイトはイメージ悪いよね。

コーポレートサイトにはてなのサービスを仕込む事によるメリット

  • 上記と同じ
  • 比較的先進的+社会貢献性の高い企業であるはてなのサービスを使う事によるイメージアップ
  • はてな信者が多いITエンジニア層へのアピール(イメージアップ)
  • いろいろなものが着いていて、ちょっとコンテンツが知的に見える?

あーまー、適当に書く分にはこんなもんかな。


設置作業

bloggerにはてなスターやはてなブックマークを仕込むだけなら、実はすごく簡単。はてなの公式コンテンツにチュートリアルがあるから。(blogger側の進化によりちょっと内容が変わってきているので、新Blogger対応版タグを下記にまとめました)

そうだなぁ、自分はプログラマだから余裕だけど、JavaScriptがわからなくても、はてな側で生成されたコードをぺたっと張って、あとはちょちょいと表示するタグを埋めるだけだから、HTML+CSSをちょっとかじっていれば可能だと思う。たぶん、デザイナーでもできるレベル。

上記メリットを享受できるようなサイトであれば、仕事で使うのもありかなぁと思った。

参考

はてなスターをブログに設置するには※新Blogger対応コード

はてなブックマークカウンターを自分のサイトに貼り付ける  ※ウェブサイト全体の被ブックマーク数を表示

自分のブログに被ブックマーク数を表示する  ※特定エントリーの被ブックマーク数を表示

あなたのブログに「このエントリーを含むはてなブックマーク」ボタンを表示させる

※上記は「高機能版」「低機能版」という関係ではなく、使い分けの関係にある


注意

上記リンクにあるチュートリアルは、旧Blogger向けに書かれたものなので、新Blogger(現デフォルト)では正しく動作しません。以下の通りに試してみてください。


ウェブサイト全体の被ブックマーク数

  1. はてなブックマークカウンターを自分のサイトに貼り付けるを読んで、設置する(ブログによって変わる部分は無いです)

特定エントリーの被ブックマーク数
  1. 特定エントリーの被ブックマーク数を表示したいところに以下のコードを埋める。

<a expr:href='&quot;http://b.hatena.ne.jp/entry/&quot; + data:post.url'>

<img expr:src='&quot;http://b.hatena.ne.jp/entry/image/&quot; + data:post.url' />

</a>


このエントリーを含むはてなブックマークボタン

  1. このリンク先を自分のPCに保存
  2. Bloggerに保存した画像をアップロードするため、仮の投稿を作って画像をアップロードし、公開する
  3. 公開された記事の画像から、そのURLを得る(管理画面から得た画像のURLとはパスが違うので注意。管理画面からのURLではうまく表示されません)
  4. 必要ないなら、仮の投稿を削除または下書きに戻す。(公開しないようにする)
  5. 「このエントリーを含むはてなブックマークボタン」を表示したいところに、以下のコードを埋める。自分的には</h3>直前で良いかと。

<a expr:href='&quot;http://b.hatena.ne.jp/entry/&quot; + data:post.url'>

<img alt='このエントリーを含むはてなブックマーク' height='12' src='上記3で取得した画像のURLをここに書く' style='border: none;' title='このエントリーを含むはてなブックマーク' width='16'/>

</a>


※要は、「expr:なにがし」とすると、Bloggerが勝手に内容(data:post.urlなど)を展開してくれるみたい。JavaScriptのコードとして評価してるのかな?(未確認)※あと、ちゃんとスラッシュを使ってタグを閉じてなかったら怒られる

2008年6月5日木曜日

無料で使える個人プロジェクト用のsubversionリポジトリ

普段はMacで思いつくままにコーディングしてるんですが、やはり何かあったときにヤバい(ちょっと前もチビに水かけられたしね)ので、なにかいい方法は無いかなぁと探していました。

Mac的にはタイムマシーンなんだろうけど、ある程度の容量のハードディスク用意しなきゃいけないし、そもそもプログラマがバックアップすべきものって、ソースコードぐらいじゃない? 知識は頭の中に入っているべきだしさ。

で、無料で使えるSubversionホスティングサービス を使って以下の条件で探してみました。

  • 無料が大前提。無料じゃないなら自宅サーバで立てるし。(電気代とか騒音とかメンテとか、なるべく自宅サーバは使わない方が楽)
  • SCMはsubversionがいい。使い慣れてるし。
  • subversion以外のサービス(wikiとかバグトラッカーとか)はあってもなくてもいい。チームではないのでどうせ使わない。(チームでもあまり使わない)
  • ユーザは自分一人。増やさない。(増やすなら自宅サーバ?)
  • プロジェクトのソースコードは公開しない。(公開するならsourceforgeとかgoogleでいいよね)
  • 無料のやつはリポジトリが壊れても文句を言えないので重要なプロジェクトには使わない。(まぁ、個人で重要なプロジェクトをやらないだろうし、やるならそれなりにお金かけないとね)
  • 複数のプロジェクト(リポジトリ)を使える。(思い立ったらすぐリポジトリを作るので、個数制限は緩い方がいい)

で、ぱっと見はDevjaVuが容量無制限でよさそうだったんだけど、無料で使うには招待される必要があるみたい。

OpenSVNは学生が運営してるんだって。容量的には良さそうなんだけど、なんかバックアップが飛んだみたいなアナウンスがされてるんですけど…(2008/6/5現在)

んで、結局Assemblaにしました。容量は200MBと紹介ページに書いてあったけど、よくみると500MBに増えていたみたい。とりあえずサインアップしたけど、まだ使い初めなので、使い勝手はよくわからない。とりあえず、サインアップしたところまでは良さげな感じ。


良いとか悪いとかわかったら、追記するよー。


2008年6月3日火曜日

Amazon EC2とS3を使ってみる(その1 費用比較検討編)

現時点で、ちゃんとしたサービスをちゃんとした体制(回線とかバックアップとか負荷対策とか)でやるなら、EC2がやっぱり使いやすいと思う。個人で委託を請け負う場合、正直機器選定から契約・設置・各種機器やソフトのセットアップまでやりたくないもんねぇ。

問題は、委託を受けて作った場合、発注者がメンテする事はできないだうなぁと言う事。どこで線引きすべきかねぇ。

以下、自分が使い始めるために調べた事です。

ちょーざっくりの費用まとめ(サービス稼働直後の最低スペックを想定)

項目 単価 想定される最低月額費用 その他
EC2 (インスタンスと固定IPは時間従量制、Up/Down転送料は転送量従量制)
インスタンス稼働料金 $0.1/時間 $72/月 ※リバースプロキシ構成にするなら、最低2台($144/月)からかな。
固定IP $0.01/時間 $7.2/月 ※インスタンスを起動してなくても課金される
アップロード転送料 $0.10/GB $0.1/1GB・月 ※リクエスト分? 1GBの根拠は無い。バックアップの転送分は無料
ダウンロード転送料 $0.18/GB $1.8/10GB・月 ※コンテンツ分? 10GBの根拠は無い
S3 (システムを構成する静的ファイルはインスタンスに直接毎回配置するとして、3Sに置くのはユーザからアップロードされるファイルとバックアップ)
保存容量 $0.15/GB・月 $15/100GB・月 ※100GBの根拠はAMIイメージによるバックアップ2回(かなりいいかげん。てかAMIイメージって何GB?)+動的データ分
アップロードリクエスト $0.01/1000回 $0.1/1万回・月 ※1万回の根拠は無い
ダウンロードリクエスト $0.01/10000回 $1/100万回・月 ※100万回の根拠は無い

まぁ、$100弱/月ぐらいか。

ベンチャービジネスを主眼に置いた場合のコスト計算(上記よりちょっと詳しい概算)

Amazon ec2のエコノミー、月72ドルでレンタルするのと、999ドルのマシンを買うのはどちらが得か?

※システムの設計や鯖管をやってきた自分の個人的見解から言うと、RAIDとかバックアップを言い出した時点で、EC2の方が絶対的に安いと思う。TB級のストレージが必要なシステムとかは特にね。

実際の料金シュミレーション

SIMPLE MONTHLY CALCULATOR

まとめ

Amazon EC2/S3を使ってみた - まとめ

EC2&3SのHowTo記事(WEB+DB PRESS Vol.43と同内容。紙面よりリンクがついている分いいかも)

はじめてのAmazon EC2&S3 ~これからの新サービスの公開の形~

現時点での課題

  • バックアップを取るためのスナップショット作成って可能なのかな? Linuxのセットアップからできるなら、LVMとかで可能だけど、EC2の場合はOSはセットアップしないよね?(OSのセットアップが可能かどうかさえ今はわからない)
  • ec2-bundle-volとかで実行中インスタンスのイメージファイルを作るときって、しばらく時間がかかるんだろうけど、この時スナップショットなんか取ってくれてないよね…。システム全体としてのファイルの整合性なんかは、どうやって取るんだろう…。サービスを止めるしか無いのかな。
  • MySQLなどのバックアップって、mysqldump使ってロックかけて取るしか無いのかな。負荷が高い時は怖いよね。まー、負荷が高いんなら、レプリケーション構造とかにするのがいいんだろうけど。

と、ここで手持ちのクレジットカードの有効期限が切れている事が発覚。タイミング悪く退職したばっかりだしなぁ。とりあえずカミさんの許可取って家計用のクレジットカード使うかなぁ。(で、その2へ続く)

2008年6月2日月曜日

会社を辞めました

色々ありまして。

とりあえず、フリーのプログラマとして生きるか、派遣を経て次の会社に籍を置くか選択の時ではある。(営業は向いていないと自分を理解しているので、フリーのプログラマを続けるつもりはない)

いいタイミングなので、色々溜まったものをやっつけてしまおう。

  • 今まで作りたくても時間がなかった(というか興味が次に移ってしまい、リリースタイミングを逃した)ものがいくつかあるので、履歴書代わりに仕上げてしまいたい。メール駆動のポストエージェントだとか、外国人向け日本語学習ソフト(iknowの逆版)だとか。
  • AIRの勉強
  • 携帯用FlashLight(良い資料がない)またはアンドロイドなど。携帯用は資料が少ないのが痛いなぁ。まともに勉強したければ、それなりの実績がある企業に入って吸収するしかないかな。
  • EC2の運用ノウハウ。フリーのプログラマまたは個人制作物発表の場としては、EC2は良い選択肢かもしれない。
  • 自宅サーバの構築。VMWareのイメージを持ってるので、マシンを1つ電源付けっぱなしにするだけだけど。subversionサーバ兼テストサーバとして使うつもり。

まだ、身の振り方を決めた訳ではないけど、あまり悠長に構えてると、生活リズムを崩す(昼まで寝てる)のと、家族の視線が痛いので、9時〜18時は別室に籠って上記を進めるか、外出しよう。

てか、初日に娘(2歳)に麦茶をこのMacbookにかけられてしまった。幸い起動するけど、ディスプレイに斑点が…。しかも、時間が経つにつれ、増殖…。