daemonfreaks.com

Google App EngineでPyBlosxomを動かす

posted by jun-g at 日, 11 5月 2008 06:20 JST

遅まきながら、Google App EngineのSDKで遊んでいます。入門記事を読みながらHello worldをこなし、次にPyBlosxomを動かしてみる事にしました。

まずはアプリケーションを配置するディレクトリを作成。

$ mkdir -p ~/gae/pb

次にPyBlosxomをダウンロードして展開し、先ほど作ったディレクトリの下に配置。

$ cd /tmp
$ fetch http://jaist.dl.sourceforge.net/sourceforge/pyblosxom/pyblosxom-1.4.3.tar.gz
$ tar zxvf pyblosxom-1.4.3.tar.gz
$ cp -R pyblosxom-1.4.3/Pyblosxom ~/gae/pb/.

データ用のディレクトリを作る。

$ mkdir -p ~/gae/pb/data/entries

config.pyを環境に合わせて書き換える。

$ cp /tmp/pyblosxom-1.4.3/web/config.py ~/gae/pb/.
$ vim config.py

datadirは"data/entries"と相対パスで指定。他はお好みで適当に。

次に~/gae/pbの直下にメインとなるモジュールpb.pyを作成。

import wsgiref.handlers

import Pyblosxom.pyblosxom
from google.appengine.ext import webapp

def main():
    application = Pyblosxom.pyblosxom.PyBlosxomWSGIApp()
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
    main()

同じく~/gae/pbの直下にapp.yamlを作成。

application: hello

version: 1

runtime: python

api_version: 1

handlers:

- url: /.*
  script: pb.py

これで準備完了。~/gae/pb/data/entriesの下に適当に書いたエントリのファイルを置いて起動。

$ dev_appserver.py ~/gae/pb  
INFO     2008-05-11 05:55:30,453 appcfg.py] Checking for updates to the SDK.
WARNING  2008-05-11 05:55:30,949 datastore_file_stub.py] Could not read datastore data from /tmp/dev_appserver.datastore
WARNING  2008-05-11 05:55:30,949 datastore_file_stub.py] Could not read datastore data from /tmp/dev_appserver.datastore.history
INFO     2008-05-11 05:55:30,954 dev_appserver_main.py] Running application hello on port 8080: http://localhost:8080

よし、ブラウザからアクセス!するとエラーが出る…。

...snip...
 /home/jun-g/gae/pb/Pyblosxom/tools.py in ()
 1282     __overlapped = pywintypes.OVERLAPPED()
 1283 elif os.name == 'posix':
 1284     import fcntl
 1285     LOCK_EX = fcntl.LOCK_EX
 1286     LOCK_SH = fcntl.LOCK_SH
fcntl undefined

: No module named fcntl
      args = ('No module named fcntl',)
      message = 'No module named fcntl'

fcntlというモジュールが使えないみたいなので、tools.pyを適当に書き換えてfcntlを使わないようにしてみる。

$ diff -u tools.py.orig tools.py
--- tools.py.orig	2008-05-11 05:59:14.000000000 +0900
+++ tools.py	2008-05-11 06:00:06.000000000 +0900
@@ -1281,10 +1281,9 @@
     # is there any reason not to reuse the following structure?
     __overlapped = pywintypes.OVERLAPPED()
 elif os.name == 'posix':
-    import fcntl
-    LOCK_EX = fcntl.LOCK_EX
-    LOCK_SH = fcntl.LOCK_SH
-    LOCK_NB = fcntl.LOCK_NB
+    LOCK_EX = None
+    LOCK_SH = None
+    LOCK_NB = None
 else:
     raise RuntimeError("PortaLocker only defined for nt and posix platforms")
 
@@ -1299,10 +1298,10 @@
 
 elif os.name =='posix':
     def lock(f, flags):
-        fcntl.flock(f.fileno(), flags)
+        pass
 
     def unlock(f):
-        fcntl.flock(f.fileno(), fcntl.LOCK_UN)
+        pass
 
 # END portalocking block from Python Cookbook.
 # %<-------------------------

でもってブラウザからアクセスすると、

PyBlosxom on Google App Engine SDK

動いた!という事で、今日はここまで。

GEOMでRAID構築

posted by jun-g at 水, 07 5月 2008 00:04 JST

手元にHDDが沢山余っていたので、FreeBSD-7Rで構築した自宅のファイルサーバにRAIDを構築してみました。

最初、ストライプしてからミラーするべきか、ミラーしてからストライプするべきか、という素朴な疑問で悩んだのですが、RAID01とRAID10の違い:佐野裕のサーバ管理者日記:ITproという記事を読んで、RAID01とRAID10は別モノで、ストライピンググループをミラーしたRAID01よりも、ミラーしたグループをストライピングしたRAID10のほうが可用性が上である、ということがわかったので、RAID10を構築することにしました。

HDDの構成は、マザーボード上のATAセカンダリに160GBx2、増設ATAカードに120GBx4で、デバイス名はそれぞれad2~7になりました。

まずはgmirrorでRAID1のグループを3つ作ります。

# gmirror label gm0 /dev/ad2 /dev/ad3
# gmirror label gm1 /dev/ad4 /dev/ad5
# gmirror label gm2 /dev/ad6 /dev/ad7

問題なく構築できているか確認。

# gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  ad2
                      ad3
mirror/gm1  COMPLETE  ad4
                      ad5
mirror/gm2  COMPLETE  ad6
                      ad7

問題なくできているようです。次にこのRAID1アレイを束ねてgstripeでRAID0を構築します。

# gstripe create -s 131072 gs0 mirror/gm0 mirror/gm1 mirror/gm2

問題なく構築できた?

# gstripe status
      Name  Status  Components
stripe/gs0      UP  mirror/gm0
                    mirror/gm1
                    mirror/gm2

問題なし!newfsしてマウントします。

# newfs /dev/stripe/gs0
...snip...
# mount /dev/stripe/gs0 /mnt
# df -h /mnt
Filesystem         Size    Used   Avail Capacity  Mounted on
/dev/stripe/gs0    334G    4.0K    333G     0%    /mnt

できた!160+120+120=400GBなのに334GBになっているけど、細かいことは気にしません。

ということで、無事RAID環境が構築できました。この環境なら突然HDDが1本死んでも大丈夫だし、RAID10なので単純なRAID1よりもパフォーマンスも良いはず(ベンチマークは取っていませんが…)。手元に予備の160/120GBのHDDもあるので安心です。ただ、6本もHDDを使っていながらたった334GBしか容量が確保できてないというのが、電気の無駄遣いに感じてしまいますが…。最近HDD安いですもんね。

以下、今回参考にしたサイト。

ルータが壊れた?

posted by jun-g at 火, 06 5月 2008 01:01 JST

昨日、突然インターネットに繋がらなくなって、原因を色々探ってみると、どうやらルータが壊れているようでした。使っていたルータは4年程前に購入したマイクロリサーチのNetGenesis SuperOPT-GFiveです。

とりあえず、代替機として保管してあったNetGenesis SuperOPT50を投入してインターネット環境は復旧できたのですが、やっぱりローカル側だけでもギガビットなルータが欲しいなーと思ったので色々物色していたのですが、どうも気に入る機種がなくて、もう一度SuperOPT-GFiveを買いなおすべきかを迷っていました。で、何気なくkakaku.comのクチコミ掲示板を見ていたところ、僕と同じような故障状況の書き込みがあり、それによると、故障の原因はルータ本体ではなく、電源アダプタの故障であるということがわかりました。

そうとわかれば!ということで、早速マイクロリサーチのオンラインショップで電源アダプタを注文してみました。週末には届くみたいです。これで直れば良いなぁ。

エマ完結

posted by jun-g at 土, 26 4月 2008 03:30 JST

ついに完結しちゃいましたねぇ。

エマ 10巻 (BEAM COMIX)
エマ 10巻 (BEAM COMIX)
posted with amazlet at 08.04.26
森 薫
エンターブレイン

6巻あたりからのドラマチックな展開にかなりドキドキしたものの、なんだかあんまりスッキリしないまま本編が終了して番外編に進んでしまったのでう~んと思っていたんですが、最後はちゃんとハッピーエンドで良かったです。

C言語の勉強

posted by jun-g at 月, 14 4月 2008 02:59 JST

先月から、C言語の勉強を始めました。勉強の動機とC言語を選んだ理由は

  • そろそろPython以外の言語を覚えたい
  • せっかくなのでもうちょっと低レベルな言語を使えるようになりたい
  • 普段FreeBSD使ってるんだし、C言語使えた方が何かと便利じゃね?

という単純なものです。あと、個人的にC言語は「知ってて当たり前な言語」という印象があるので、知らない自分を恥ずかしいと思っている、というのも理由の一つです。

実はこれまでも何度か本を読んだりしてC言語を覚えようと試みたことがあるのですが、読んだ時に解った気になっただけで、数日経てばすっかり忘れている、といった感じでまったく覚えられませんでした。当然です。手も動かさずに本を読んだだけでプログラム言語を覚えられるわけがないのです。

という事で、今回はとにかく「手を動かす」事にしようと決めました。

教科書として、積読のC言語の入門書の中から以下の本を選びました。

C言語プログラミングレッスン 入門編―ANSI対応 (SOFTBANK BOOKS)
結城 浩
ソフトバンククリエイティブ
売り上げランキング: 327232

積読だけあって古いです。この本、今は改訂版が出ているようです。

新版C言語プログラミングレッスン 入門編
結城浩
ソフトバンク クリエイティブ
売り上げランキング: 13180

この本に決めた理由は、パラパラと見た時に、プログラム初心者向けに解説がとても丁寧に書かれているな、と思ったからです。僕はC言語の初心者であってプログラムの初心者ではないので、丁寧すぎる説明は少し冗長に感じたりもしましたが、「知ったかぶりせずに初心者の気持ちで勉強するべし!」と自分にいい聞かせて、出てくるコードを実際に入力、コンパイル、実行しながら読みすすめました。

で、ぐうたらな性格なので途中かなりダラダラしてしまったんですが、だいたい1ヶ月ぐらいかかって、昨日ようやく読み終わりました。途中、ポインタの章を勉強している時に、C/C++のポインタの機能--変数の場所(アドレス) - builder by ZDNet Japanの記事がアップされ、ちょうど勉強してるところだからツッコミどころが少し解った事が嬉しかったです。

ひとまず最後まで読み終わって、書かれている事に対して理解できなかった点こそ無かったものの、解説されていない部分に対する疑問もあるし、まだC言語の理解にはほど遠い状態なので、引き続き勉強を続けようと思います。具体的には、

  • より詳しい解説書を読む
  • 実際にプログラムを書いてみる

という2点を続ければ、手に馴染んで理解も深まるかなぁと考えています。

より詳しい解説書として、同じく積読の中に眠っていた以下の本を読もうと思います。

プログラミング言語C ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 10987

この本は2年ほど前に途中まで読んだ事があるのですが、その時は読むだけだったので途中で理解できなくなって挫折しました。今回は実際に手を動かしながら読み進めたいと思います。

で、実際に書いてみるプログラムは、今はお題が思い浮かばないので、また後日ということで。

余談ですが、今回からブログの文体を「ですます調」に変えました。理由は、細かい発言はTwitterに投げる事が多いので、ブログは文体を含めてもうすこし丁寧に書こうかな、と思ったからです。本当は、書く頻度ももう少し多くしたいところですが…。

<<  Page 99 of 127  >>