hack my life: 2007年7月アーカイブ

2007年7月アーカイブ

最近話題の「はてなスター」を入れてみました。

ついさっき設置完了しました。
この発想はひじょーに面白いですね。

昔ははてなは技術者嗜好なアプリケーションを作っていたイメージで、ちょっと一般人には敷居が高いイメージでしたけど、Rimoといい、このはてなスターといい、一般ユーザーフレンドリーな感じがします。

設置も、Javascriptをblogに加えるだけとお手軽なのも良い感じ。

条件はブログのエントリタイトルに<h3>で囲っている事と、タイトルにパーマリンク(記事単体への固定のリンク)があることです。多くのblogがタイトルは<h3>で、パーマリンクがついていると思うのですが、もしついていなかった場合は、パーマリンクって言葉が一般ユーザーにわかるのでしょうか??ちょっと気になります。

とはいえ、その辺りは段々Hackされてくるんでしょうけどね。

ちなみにid:naoyaさんのblogによると、id:jkondoさんの発案みたいです。とても「らしい」サービスな感じがしています。

ちょっと本棚を片付けようと思ったら、2時間かかってしまいました。

ちょっと前みたいにさらしてみる。

今回は雑誌をメインに削除!削除!削除!!

book1

結構なボリュームがあります。
ひぃ、ふぅ、みぃ・・・・とにかく沢山捨てました!

で、メインの本棚はというと・・・

book2

カオスだった状態からちょっと綺麗になりました!!
まだちょっと入りきれていないけど、どうせもう少ししたら引っ越すからいいか。

一応ジャンル別に纏めたつもり。一部良く使う本は、すぐ取り出せる位置(本棚中央)に。
だいたいRubyとRailsの本、あとは、Emacsとか、正規表現とか、シェルスクリプトの本。
デザパタGoF本は迷ったけど、そんなにしょっちゅう見ないから端に。

さて、あとは・・・・・

pandorabox

このパンドラボックスをどうするかだ・・・

全然片付けてないじゃん!!とかいわないよーに。

なんと、大好きだったスカイ・クロラシリーズの続編が!!

スカイ・クロラシリーズって、てっきりフラッタ・リンツ・ライフで終わりだと思っていたので、本屋で驚喜。
このシリーズは最終刊のスカイ・クロラから発売されているので、何処が終わり(始まり?)か解らないんです。
スカイ・クロラから段々さかのぼって書かれているんです。
メインの登場人物は必ず繋がっているんですけど、ちゃんと一冊一冊が独立した作品になっているのです。

この書き方は上手いなぁ・・・といったところ。

来年にはアニメ化されるそうですね。草薙の声優が誰になるのか楽しみ♪

クレィドゥ・ザ・スカイ
『クレィドゥ・ザ・スカイ 』
森 博嗣  著
中央公論新社 ¥ 1,890 (税込)

これからサーバー構築する友人へ

サービスを公開するLinuxサーバーを構築するときに何点か意識をしておかないと後で面倒な事になります。
運用に一度乗ってしまうと、そう易々と設定を変えられないことに起因するんですが、実際にサーバー構築して、運用に乗っけてから失敗したなぁ・・・って事が在ったので、書いておきます。


サーバーのディレクトリやアプリの構成は統一すべし

Linuxをインストールする際に、出来るだけサーバー構成を統一しましょう。
ディレクトリ構成だけでなく、アプリケーションのインストール先や、設定ファイルの置き場等は絶対同じにしていた方がいいです。

何故かと言うと、トラフィックが増大してきた時に、一台ではまかないきれなくなってきます。
そうすると、MPP環境を構築する事になると思うのですが、MPP環境を構築するとき、サーバーの構成が違っていると、か・な・り面倒です。

並列化するソフトウェアを使う場合、サーバー構成が同じであることが条件であるソフトが結構在ります。
大体台数が増えてくると、いちいちサーバーの違いなんて覚えていられません。

アプリを稼働させる前にバックアップ計画を

特にDBにかんしてですが、バックアップ計画を先に立てておかないと、非常に困ります。
一度運用始まると、アプリケーションの再起動すらなかなか出来ません。
特にDBによっては、バックアップ時にロックをかける事があるので、多少なりとも停止してしまう時間が出来てしまいます。

メンテナンスウィンド(システム停止時間)を何処に置くかをちゃんと考えておかないと、すぐにメンテナンス出来なくなってしまいます。

365日24時間稼働の無停止システムとなると、その難易度は更に増大します。ってか基本的に止められないので、バックアップやバージョンアップが出来ません。初めからHA構成にしておかないと、痛い目見ます。
HAにしたところで、切り替えの時は一時的に停止してしまうと思うので、更に冗長化する必要が在ります。
激しく気を遣ってください。

運用はshellで

どんなに運用計画をシッカリ立てても、人手を介す限りミスは発生してしまいます。
そこで、出来るだけshellスクリプトで自動化しておきましょう。

リリース、バージョンアップ、サーバーのヘルスチェック、設定変更etc...各種shellを用意しておくと便利です。

パスワード認証は破られる

パスワード認証危ないです。ウチのサーバーも一日3000件以上不正アクセスを受けています。
辞書攻撃をくらったりするので、最低でもsshの公開鍵認証は設定しましょう。

それでもセキュリティホールはあるので、Logwatchなどで、ログのサマリーを取得してメールで送るようにしておくと便利。

Ruby覚える上で最初に覚えておくべき組み込みクラス/モジュールってのが在るらしい。


が良く使われるクラス/モジュール。

他には、Date辺りも良く使いそうな気がするけど、Dataクラスって大体同じような実装している。
Fileも使うとき多そうだけど、その辺りは使うとき調べれば覚えられる気がする。

Rubyを勉強していて知った事の私的メモ。

最近Rubyの本読んでいて知ったTips

Rubyコマンドに "-r profile"オプション渡してプログラム実行すると、各メソッドのコール回数や実行時間のプロファイリングが出来るんですね。

$ ruby -r profile test_helper.rb
 %   cumulative   self              self    total
time   seconds   seconds  calls  ms/call  ms/call  name
22.00    1.91      1.91      697     2.74    44.16  Kernel.require__ 
17.28    3.41      1.50     6426     0.23     0.28  Object#method_added
7.37     4.05      0.64      576     1.11    27.53  Array#each  
2.65     4.28      0.23     6435     0.04     0.04  Module#blank_slate_method_added
2.30     4.48      0.20      730     0.27    63.27  Kernel.require
1.73     4.63      0.15      966     0.16     0.37  Class#inherited
1.61     4.77      0.14        1   140.00   160.00  ObjectSpace.each_object
1.38     4.89      0.12      122     0.98     1.64  RubyToken.def_token
1.27     5.00      0.11     2100     0.05     0.05  Symbol#to_s
1.27     5.11      0.11      392     0.28     0.64  Gem::Specification#copy_of
1.27     5.22      0.11     6492     0.02     0.02  Module#==
1.27     5.33      0.11      113     0.97     0.97  Gem::Specification#installation_path
1.04     5.42      0.09      340     0.26     0.26  Kernel.nil?
1.04     5.51      0.09      249     0.36     0.36  String#to_sym
1.04     5.60      0.09      519     0.17     0.19  Set#add
1.04     5.69      0.09      377     0.24     0.24  Hash#default

てな具合に。
丁度良い実験体が無かったので、Railsのtest_helper.rb使いました。
実際はもっと長く出力されるので、一端ファイルに落とそうとリダイレクトしてみたんですが、
コレ標準出力では無くて、標準エラー出力に出されるんですねぇ。一度誤爆しました。

Safari3をMac Book Proに入れてみました。

・・・が、動作が不安定。

ブックマークからWebサイトを表示しようとしても、表示されていない時が多々。
アドレスから更新すると、表示はされるのですが・・・あれ?

ブックマークの一覧を開く本のアイコンクリックすると・・・落ちる。

error

ま、まてぇぇぇい!
そりゃ無いでしょ。

オープンベータ版な上、まだ英語版なので、その辺りが原因なのか???
らちが空かないので、基に戻します。
とほほ・・・

一応このblogがちゃんと表紙されることは確認したので、まいいか。

ActiveRecordで取得したテーブルのデータから選択リスト(プルダウン)を作成したいと思ったんです。

出張費精算のアプリを作っていて、"http://localhost/home/list/200707"というURLにアクセスすると、2007年7月のリストを出力する仕様になっています。これにプルダウンで月の選択をすると、リストが切り替わる様にしたいんです。

テーブルは月別の出張費精算テーブルで、こんな構成。

      create_table(:monthly_expenses, options) {|table|
        table.column :employee_id,        :integer
        table.column :appropriate_month,  :date
        table.column :period_from,        :date
        table.column :period_to,          :date
        table.column :total_amount,       :integer
        table.column :prepayment,         :integer
        table.column :report_date,        :date
        table.column :status,             :integer
        table.column :time_stamp,         :datetime
      }

選択リストはこの月別のリストを切り替える為に使いたいので、欲しいのは、" appropriate_month"だけだったりします。
ずいぶんと余分なモノが混じってしまっています。それだけならまだしも、URLとして使う都合上、"yyyy-MM-dd"形式ではなくて、"yyyyMM"を取得したい。選択リストのテキストには"yyyy年MM月"としてあげたい。

どうやっても変換をかける必要があるんですが、出来ればSQLを書かずにすませたい(単なるこだわりです)。

ActiveRecordに取得カラムを指定は出来ない様子。オブジェクト化するから、当然なんですけど。
取得結果をブロックで処理して、mapしてあげることにしました。

@monthly_list =
   MonthlyExpense.find(:all,
                :conditions => ["employee_id = ?", employee_id],
                :order => "appropriate_month"
                ).map { |m| [m.appropriate_month.strftime("%Y年%m月"),
                               m.appropriate_month.strftime("%Y%m")] }

あとは、rhtml側で、ActionHelperを使って、

<%= select(:month, :value, @monthly_list) %></pre>

としてあげれば、OK。

ではなくて、初期値を設定してあげないといけない。
selectの場合は、@month.valueに入っている値がリストにあれば、それを選択状態にしてくれるのですが・・・
monthオブジェクトはselectタグ内部で作成されていので、コントローラー側でセットしようにもオブジェクトが存在しない。

動的にオブジェクトを作成するほうほうが思い浮かばなかったので、クラス定義をしてまいました。

class Month 
  attr_accessor :value
end
@month = Month.new @month.value = @monthly_expense.appropriate_month.strftime("%Y%m")

すっごく強引な気がするけど、後で思いついたら直すことに。

最後にonChangeのイベントをとってリクエストを投げて挙げるように修正。
prototype.jsのEvent.observeを使う。

Event.observe($('month_value'), 
   "change", 
   function(){
    document.location.href = "/home/list/" + escape($F('month_value'));
   });

これで一応動作を確認。なんかもっと上手くできる気がするんですけどね。
とりあえず動けば官軍って言うんでこれで我慢します。

Movable Type 4のBeta3を試しに自宅サーバーに入れてみた。
Publishing Platformのデザインが大分変わっていて、普通に迷子になりそう。

mt4adm

結局は慣れだと思うのですが、使い心地は良いです。
まだちょっとしか触っていないんですが、ブログのエントリがWYSWYGなエディタで出来る点と(ちょっと前に仕事で触っていた3.3にも有った気がしますけど)、ファイルアップロードインターフェースと、管理インターフェースが使いやすくなりました。

デフォルトのblog画面も相変わらずカッコイイ。

mt4blog

インストールは3の時と結構変わっていて、ほとんどウィザードで設定します。

  1. movabletype.orgからダウンロード
  2. ファイルをサーバーの公開ディレクトリにアップロード
  3. MySQLのデータベースとユーザーを作成
  4. アップロードしたディレクトリへのurl/mt-wizard.cfgへアクセス
  5. 画面の指示に従い設定

だけでOKでした。mt-config.cgiはウィザードが勝手に作ってくれるので、MT3の時の様に書かなくて大丈夫です。
というか、前の癖でごちゃごちゃ書こうとするとはまる。

設定は後でmt-config.cgiを編集すればいいので、DB辺りだけ接続確認すればあとは適当で可。
Beta3から多国語対応と聞いていたので、mt-config.cgiを直接編集する必要が有るかと思いきや、ちゃんとウィザードで言語選択があるので、特別な事をしなくて大丈夫でした。

今このblogがMT3.1なのですが、問題なくバージョンアップできるか試してみようかと思っています。

アドセンス

MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore
MoMAstore
MoMAstore
MoMAstore