ANSI Common Lispの演習、2、3章に続いて、4章をこなしました。
セクション4
問題4-5は、著者本人のページで、「本に掲載されているコードそのままで、題意を満たしている」となっているので省略です。
2014/01/28
2014/01/09
Lisp再入門
「ANSI Common Lisp(ピアソン・エデュケーション)」と、「On Lisp(オーム社)」を読書中です。いずれもポール・グラハム著です。
学生のころに「プログラムの構造と解釈(Structure and Interpretation of Computer Programs、SICP)」はひと通り読んで、Lisp/Scheme系のひと通りの教養(閉包とか継続とか末尾再帰)は知っているつもりでしたが、Lispの良さ、真髄はそのあたりだけではなくマクロにあるようなので、そこを習得してみようと思ったのでした。
とりあえず、Lisp系は久しぶりなのと基本的にずっとScheme派(Schemeの方がシンプルで良いと思っていたのでした)だったので、リハビリと基礎づくりを兼ねて、ANSI Common Lispの演習をやってみることにしました。
セクション2から真面目に始めてみました。
セクション3は、3-7の最短経路、最長経路を求める問題が面白かったです。
実装は、著者のものと少し違うものにしてみました。
キューの最後にappendするのが遅そうだったのでループ版も書いてみましたが、あまり綺麗になりませんでした。無理やりループ化するのではなくFIFO(リストの先頭と末尾を押さえる)をこしらえて、それで後にエンキューしてやるのが良さそうですね。
3-6の「リストの先頭要素をcdrで、後続要素をcarにする」という問題も面白いですね。最初は題意が取れませんでしたが、(a b c)を(((nil .c) . b) . a)と表現すればよいのだと理解。
2013/12/23
QNAPでdnsmasq
dnsmasqのインストールですが、ipkgで
# ipkg install dnsmasq
Installing dnsmasq (2.62-1) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/dnsmasq_2.62-1_arm.ipk
Configuring dnsmasq
To complete the installation, you should check /opt/etc/dnsmasq.conf,
and then run /opt/etc/init.d/S56dnsmasq to start dnsmasq.
Successfully terminated.
あとは、/opt/etc/dnsmasq.confをいじって、/opt/etc/init.d/S56dnsmasqを実行してやれば起動されます。S56dnsmasqは、autorun.shから起動するようにしておきます。
設定ファイルも簡単で、ちゃちゃっと作れます。
今回はこんなふうに設定ファイルを作って、MAC/IPを対応付けるようにしてみました。
設定ファイルも簡単で、ちゃちゃっと作れます。
今回はこんなふうに設定ファイルを作って、MAC/IPを対応付けるようにしてみました。
# 実行時のユーザ、グループを指定。user、groupは、変えておかないとnobodyで実行しようとして警告が出ます。
user=admin
group=administrators
# ドメインを指定。
domain=example.org,192.168.1.0/24
# DHCP設定。IPアドレス範囲とリース時間。とりあえず12時間(デフォルト)に。
dhcp-range=192.168.1.xx,192.168.1.yy,255.255.255.0,12h
# DHCPで引き渡す情報(今回は、デフォルトルートとDNSサーバ)
dhcp-option=option:router,192.168.1.zz
dhcp-option=option:dns-server,192.168.1.ww
# 以下、ホストの数だけ、MAC/ホスト名/割り当てるIPを並べる。
dhcp-host=XX:XX:XX:XX:XX:XX,hostname,192.168.1.mm,infinite
:
これだといちいちMACアドレスを調べて、その数だけdhcp-host行を書かないといけないので、面倒といえば面倒です(色んなモノがはっきり固定されるのでわかりやすくて良いのですが)。
dnsmasqには、クライアントから申告される名前ベースで(MAC無関係に、あるいはIPアドレスもフローティングにして)管理することもできるようなので、そのほうが楽なのかもしれません。
2013/12/21
QNAPでDHCP
家庭内LANにはいくつかマシンがいて(Windows、Raspberry Pi、ノートPCなどなど)、いままではブロードバンドルータからDHCPで割り当てたアドレスをじかに叩いていたのですが、さすがにダサいし、たまにIPが変わってしまってあれっとなることもあったので、名前引きできるようにすることにしました。
ブロードバンドルータにはIPを割り当てるだけの簡単なDHCPしかなくてDNSもないので、QNAPにやってもらうことにします。
QNAPのDHCPは、ウェブ画面のネットワーク→TCP/IPタブから、編集ボタンを押すと設定できます。
ダイアログが表示されるので、適当に入力して「適用」ボタンを押すと動きます。
ただ、この状態の/etc/dhcpd.confは、
今回、fixed-addressを指定してMACでIPを固定したいのですが、ウェブ画面上にはインターフェースがないようなので、dhcpd.confを直に書き換えないといけません。
しかし、書き換えただけではだめです。何故かと言うと起動スクリプト/etc/init.d/dhcpd.shでrestart/startする際に、内部で/usr/sbin/create_dhcpd_confというバイナリが動いて、dhcpd.confをQNAPのオリジナルで上書きしてしまうというクソ仕様となっているからです。
いろいろ調べると、ダミーのパッケージ(QPKG)をこしらえて、そのOS起動時の実行スクリプト(autorun.sh)で置換をすればよい、という情報が出てくるのですが、これがまた動きません。厳密に言うとautorun.shは動くのですが、最後にdhcpdにHUPシグナルを送信したところでdhcpdが消滅して居なくなってしまいます。
しかたがないので、/etc/init.d/dhcpd.shを書き換えて対応。
dnsmasqに続く。
ブロードバンドルータにはIPを割り当てるだけの簡単なDHCPしかなくてDNSもないので、QNAPにやってもらうことにします。
QNAPのDHCPは、ウェブ画面のネットワーク→TCP/IPタブから、編集ボタンを押すと設定できます。
ダイアログが表示されるので、適当に入力して「適用」ボタンを押すと動きます。
ただ、この状態の/etc/dhcpd.confは、
max-lease-time 86400;となっています。
default-lease-time 86400;
ddns-update-style ad-hoc;
allow booting;
allow bootp;
class "pxeclients" {
match if substring(option vendor-class-identifier,0,9)="PXEClient";
next-server 0.0.0.0;
filename "pxelinux.0";
}
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.xx 192.168.1.yy;
option routers 192.168.1.1;
option domain-name "xxx";
option netbios-name-servers 0.0.0.0;
option domain-name-servers aa.bb.cc.dd;
}
host myclient {
hardware ethernet XX:XX:XX:XX:XX:XX;
deny booting;
}
今回、fixed-addressを指定してMACでIPを固定したいのですが、ウェブ画面上にはインターフェースがないようなので、dhcpd.confを直に書き換えないといけません。
しかし、書き換えただけではだめです。何故かと言うと起動スクリプト/etc/init.d/dhcpd.shでrestart/startする際に、内部で/usr/sbin/create_dhcpd_confというバイナリが動いて、dhcpd.confをQNAPのオリジナルで上書きしてしまうというクソ仕様となっているからです。
いろいろ調べると、ダミーのパッケージ(QPKG)をこしらえて、そのOS起動時の実行スクリプト(autorun.sh)で置換をすればよい、という情報が出てくるのですが、これがまた動きません。厳密に言うとautorun.shは動くのですが、最後にdhcpdにHUPシグナルを送信したところでdhcpdが消滅して居なくなってしまいます。
しかたがないので、/etc/init.d/dhcpd.shを書き換えて対応。
@@ -13,6 +13,10 @@dhcpd.confをコピーするスクリプト。
/bin/kill -HUP `/bin/pidof dhcpd`
# Start daemons
/usr/sbin/create_dhcpd_conf > /dev/null
+
+ echo "fixup dhcpd.conf... "
+ /share/administ/fixup-dhcpd-conf
echo -n "Starting dhcpd: "
if [ `/sbin/getcfg "DHCP Server" "Enable" -u -d "FALSE"` = FALSE ]
#!/bin/sh新しいdhcpd.confには、QNAPの生成するオリジナルのファイルに以下を追記してIPとMACを固定するようにしました(特定MACアドレスに指定IPが払い出されるようになります)。
# copy dhcpd.conf
cp /etc/dhcpd.conf /etc/dhcpd.conf.qnaporg
cp /share/mydoc/dhcpd.conf /etc/dhcpd.conf
host rasp {さて、次はdnsmasqでDNSを立てようと思ったところで、dnsmaqにはDHCPが内蔵されていることが判明…。
hardware ethernet xx:xx:xx:xx:xx:xx;
fixed-address 192.168.xx.xx;
option host-name "rasp";
}
dnsmasqに続く。
2013/04/13
chromeの描画の高速化
chromeで以下のフラグをオンにしてみたら少し描画が早くなったような気が。
chrome://flags
以上、バグをふんだりしたら思い出して真っ先にオフにしないといけないので、メモ :-)
chrome://flags
- すべてのページで GPU 合成を行う
- スレッド合成
- 高速オーバーフロースクロール
以上、バグをふんだりしたら思い出して真っ先にオフにしないといけないので、メモ :-)
2012/12/24
bash built-in test([)コマンドと、/usr/bin/test (/usr/bin/[)の挙動違い
bash built-in test([)コマンドと、/usr/bin/test (/usr/bin/[)の挙動違いでハマってしまいました。
x -ot y でファイルの新旧を調べようとして、
x -ot y でファイルの新旧を調べようとして、
- bashビルトインのtest/[は、 xが存在しないとFalse
- /usr/bin/test、/usr/bin/[は、xが存在しないとTrue
#!/bin/sh
rm a
touch b
if /usr/bin/test ./a -ot ./b; then echo "T"; else echo "F"; fi
if /usr/bin/[ ./a -ot ./b ]; then echo "T"; else echo "F"; fi
if test ./a -ot ./b; then echo "T"; else echo "F"; fi
if [ ./a -ot ./b ] ; then echo "T"; else echo "F"; fi
で、実行結果は
$ ./testtest.sh
T
T
F
F
ふむ。そーゆーものであるのか。
2011/12/04
pyserialとリードタイムアウト
さて、ガイガーカウンター(V1)も一区切りついたので、簡単なロガーを作成するのですが、普通はLinux上でちょろっと書くのですが、最近はLinuxは仮想環境にしかないので、仕方なくWindows上で物色してみました。
とりあえず、「シリアルから読んでファイルにロギングしつつ、もしその気になればちょっとグラフを出す」程度のものにしようと思っています。
さすがにWindowsのネイティブアプリをVC++ Express Editionでシコシコ作る、というのも馬鹿馬鹿しいのでpythonを使うことにして、シリアルライブラリとしてはpyserialというのがあるようです。
プログラム構造としては、
- シリアルがオープンできたらシコシコ読みだしてファイルに書く。
- オープン失敗やリードエラー時はオープンをリトライする
といった作りにしたいのですが、
- USB抜線によるリードエラーは、エラーや例外でなく無応答タイムアウトになる
- リードのタイムアウト時には、例外でもNoneやNUL文字('\x00')でもなくて、空文字("")が返る
というところで若干ハマりました。
まあ、前者はUSBでないシリアルだとそうなのでしょうか?(RTS/CTSを効かせてもダメでしたが)。後者はなんだかやや微妙。
2010/10/18
Band in a Box の古いの買っちゃった~(がーん)
ちょっと色々とあって、気分転換に作曲ソフト Band in a Box 17 を買いました。店頭(ビックカメラなんば店)でソフトを買ったのはひさしぶりです。13,800円なり。
って、、、家に帰ってふと気づきました。もう Band in a Box 18 が出てるやんか~。
いや、18の存在は知ってました。店頭で慌てて買ったtaipapaが全部悪いんですよ。でもね、ビックカメラの店員さんも、それぐらいは注意してくれないかな~と思うわけですよ。「Windows版でよろしいですか」とは聞かれたけどさ~。まあ店員の立場としてはちょっとでも在庫処分したいのはわかる。わかるけど、知らんぷりは商売仁義上どうなんだろう。18にアップグレードで7,000円って悲しすぎる。
大体、「Mega Pak は好評につき売り切れ中」って札が貼ってあったけど、それもおかしいだろ。「型落ち品につき売り切れ御礼」って書くべきだよね!
もう二度とビックカメラでは大きな買い物はしない。アマゾンかヨドバシで買うもんね。
って、、、家に帰ってふと気づきました。もう Band in a Box 18 が出てるやんか~。
いや、18の存在は知ってました。店頭で慌てて買ったtaipapaが全部悪いんですよ。でもね、ビックカメラの店員さんも、それぐらいは注意してくれないかな~と思うわけですよ。「Windows版でよろしいですか」とは聞かれたけどさ~。まあ店員の立場としてはちょっとでも在庫処分したいのはわかる。わかるけど、知らんぷりは商売仁義上どうなんだろう。18にアップグレードで7,000円って悲しすぎる。
大体、「Mega Pak は好評につき売り切れ中」って札が貼ってあったけど、それもおかしいだろ。「型落ち品につき売り切れ御礼」って書くべきだよね!
もう二度とビックカメラでは大きな買い物はしない。アマゾンかヨドバシで買うもんね。
2009/02/18
avast!安定中
先日導入したウィルス対策ソフトavast!ですが、安定して動いています。
Windows7にも入れていますが、特に悪さはしていないようです。
まあ、検知率とか本当は気にしないといけないファクターはあるのでしょうけど、所詮は非機能要件なので、パーソナルユースだとほとんど気にしなくなってしまいますね。そういう状態で一人がタダと言い出すと厳しい。マスマーケットは厳しそうですね。バグだし用か宣伝用にしかなりませんね。
Windows7にも入れていますが、特に悪さはしていないようです。
まあ、検知率とか本当は気にしないといけないファクターはあるのでしょうけど、所詮は非機能要件なので、パーソナルユースだとほとんど気にしなくなってしまいますね。そういう状態で一人がタダと言い出すと厳しい。マスマーケットは厳しそうですね。バグだし用か宣伝用にしかなりませんね。
2009/02/11
ウィルス対策ソフト
関わっているプロジェクトが火を吹いていて、中々時間が取れません。
大体、S-inしてからこんな状態で本当に大丈夫だろうかと心配です。
さて、これまでトレンドマイクロのウィルスバスターを使っていたのですが、今月、ライセンスが失効するのを契機にフリーのアンチウィルスソフトに乗り換えることにしました。
乗り換え先はAvast!というソフトで、個人用途であれば無償で使用できます。
無償のウィルスソフトというと機能制限が多そうですが、ざっと使った限りだとオンラインスキャンや定期スキャンなど一通りの機能はあるようです。そもそもあまりウィルスソフトの機能を使い倒そうという気はないので、無償版で十分です。
個人に対してはプロモーションとバグチェッカーも兼ねてタダで出す、という戦略なのでしょうね。
大体、S-inしてからこんな状態で本当に大丈夫だろうかと心配です。
さて、これまでトレンドマイクロのウィルスバスターを使っていたのですが、今月、ライセンスが失効するのを契機にフリーのアンチウィルスソフトに乗り換えることにしました。
乗り換え先はAvast!というソフトで、個人用途であれば無償で使用できます。
無償のウィルスソフトというと機能制限が多そうですが、ざっと使った限りだとオンラインスキャンや定期スキャンなど一通りの機能はあるようです。そもそもあまりウィルスソフトの機能を使い倒そうという気はないので、無償版で十分です。
個人に対してはプロモーションとバグチェッカーも兼ねてタダで出す、という戦略なのでしょうね。
2008/12/23
picasa3とQuickTime Movie
Picasaを3にアップデートしたら、QuickTime Movieが表示できなくなりました。
Webアルバムにはアップロードできるので、それほど大きな問題ではありませんが。
Webアルバムにはアップロードできるので、それほど大きな問題ではありませんが。
2008/10/25
Amazon S3 を使ったオンラインストレージ(バックアップ)
これまで、Gmail用のストレージプラグイン(GSpace)を使っていたのですが、どうも最新のFirefoxではうまく動かないようです。
それで、無料のオンラインストレージを探してみたのですが、結論から言うと、どれもこれも帯に短し襷に流しということが判りました。私の要件としては、
そんなこんなで、結局有償になっちゃうのであればおんなじだろということで、Amazon S3 (Simple Storage Service)をオンラインストレージとして使うことにしました。
ツールとしては、Windows用からLinux/UNIX用まで、色々出ているようですが、まずはAmazon AWSのリソースセンターで紹介されているawsを使ってみることにします。
インストールは簡単で、まずは~/.awssecretファイルにAWSのアクセス鍵と秘密鍵を一行づつ書いておきます。
% perl aws --install
を実行すると、カレントディレクトリ配下(一般ユーザの場合)、もしくは/usr/bin/(rootの場合)にインストールが行われます。私は実行形式は ~/bin/に配置したかったので、~/bin/にawsを置いてインストールしました。
インストールが終了すると、いくつかのコマンド(ec2XXXとかs3XXXという名前になります)が使えるようになります。
次にS3/awsの使い方ですが、
それで、無料のオンラインストレージを探してみたのですが、結論から言うと、どれもこれも帯に短し襷に流しということが判りました。私の要件としては、
- 最大ストレージ容量が大きい
- 1ファイルにサイズ制限がないこと(500MB以上)
- 特定の環境に縛られず、アクセシビリティが高いこと
- 期間限定保存は×
そんなこんなで、結局有償になっちゃうのであればおんなじだろということで、Amazon S3 (Simple Storage Service)をオンラインストレージとして使うことにしました。
ツールとしては、Windows用からLinux/UNIX用まで、色々出ているようですが、まずはAmazon AWSのリソースセンターで紹介されているawsを使ってみることにします。
インストールは簡単で、まずは~/.awssecretファイルにAWSのアクセス鍵と秘密鍵を一行づつ書いておきます。
1B5JYHP24PS13GWKFGAG2次に、awsサイトからawsファイルをダウンロードします。ダウンロードしたファイルを適切なディレクトリに置き、
2GAPQFG3+1wxc4sj52bFgqc0AQxj21FMkipjfz
% perl aws --install
を実行すると、カレントディレクトリ配下(一般ユーザの場合)、もしくは/usr/bin/(rootの場合)にインストールが行われます。私は実行形式は ~/bin/に配置したかったので、~/bin/にawsを置いてインストールしました。
インストールが終了すると、いくつかのコマンド(ec2XXXとかs3XXXという名前になります)が使えるようになります。
次にS3/awsの使い方ですが、
- バケットの作成
S3には、バケットという概念があって、簡単にいうとストレージ領域の区分けのようなもので、トップディレクトリをイメージすると良いかもしれません。
すなわち、あるファイルXは、バケットAの中にある、といった意配置イメージとなります。
aws では、
% s3mkdir バケット名
でバケットを作成することが出来ます。
一点注意が必要なのはバケット名がシステム全体でひとつの名前空間を構成しており、ユーザ全体で共有されるということです。既に取られてしまったキーワードは使えません(backupとか一般的な名詞は使えないようです)。 - ファイルのput/get
バケットを作成したら、そこにアイテム(ファイル)をputしたりgetすることが出来ます。
% s3put BUCKET/ file
% s3get BUCKET/file
なお、putに際して、55MBのファイルで約3分、550MBのファイルで約23分でしたから、大体300Kbps出ている勘定になりますが、これは回線速度に拠るところが大きいでしょう。 - ファイルの一覧
s3lsコマンドを使います。
引数にバケットを指定するとそのバケット内のファイル一覧が、指定をしないと自分の持っているバケットの一覧が得られます。 - ファイルのコピー
s3cpコマンドを使用します。引数の方向が標準的なUNIXとは異なり右から左なので注意してください。
% s3copy bucket2/ bucket1/xxx
(bucket1のアイテムxxxをbucket2へコピーする)
なお、S3内のストレージは重複排除されてカウントされているな気がします(気のせいかもしれません)。 - アイテムの削除、バケットの削除
s3rm、s3rmdirコマンドでアイテム、バケットを削除します。

2008/10/24
Big Day for Amazon EC2
丁度遊んでいたところで、Amazon EC2のブログに、"Big Day for Amazon EC2: Production, SLA, Windows, and 4 New Capabilities"という記事が載っていました。
- Amazon EC2 is now in full production. The beta label is gone.
- There's now an SLA (Service Level Agreement) for EC2.
- Microsoft Windows is now available in beta form on EC2.
- Microsoft SQL Server is now available in beta form on EC2.
- We plan to release an interactive AWS management console.
- We plan to release new load balancing, automatic scaling, and cloud monitoring services.
2008/10/22
Amazon EC2とGoogle App Engine(GAE)の違い
Amazon EC2と、Google App Engine(GAE)の違いを考えてみたところ、(まだあまり整理できていませんが)以下の表のようになりました(赤がProsで、青がConsのつもりです)。
結局のところ、
もうちょっと言うと(AmazonとGoogleのスタンス、ビジネスモデルの違いを考えれば当たり前ですが)、
ここで、両陣営の大きな違いになるのが、管理コストの問題じゃないかと思います。EC2は便利で敷居が低く移行しやすい作りですが、それが先々システムの複雑さや見通しの悪さの原因となるような気がしています。うまいこと押さえ込めればいいのですが、この手の話はすぐに増殖するので、行きはよいよい帰りは怖いということになり兼ねません。
また、EC2上で稼動するOS/ISVインスタンス(FedoraやCentOSはともかく、WindowsやOracle)に対して、ベンダーがどのくらいの値札を付けてくるのかも気になります(Windows EC2については未発表のようですが)。ベンダは、立場上あんまり安売りもできない(パッケージが売れなくなっちゃう)けれども、あんまりご無体な値札も付けられないので、何かと引き換えで値引きとか、ぎりぎりのところで色々交渉が行われているものと推測します。駆け引きの結果、EC2の費用構造がどのあたりに落ち着くのかは、大変興味深いところでしょう。
マイクロソフトのスティーブ・バルマーが「皆GAEは良いというけど、実際に使っている人は見たことがない」と言ったそうですが、上のような意味では、Googleとしては「ウチは程々に使ってもらえればいいんだよ」なのかもしれません(まったく見向きもされないのも困るでしょうけど)
何となくの予感として、Amazonモデルは持続的技術、GAEは破壊的技術だというのはGoogleに贔屓し過ぎかな。
観点 | Amazon EC2 | Google App Engine |
実行環境のバリエーション | 豊富(Linux、Windows、OpenSolaris...) で、利用者の馴染んでいる環境を選んで使える | Python限定 |
OSイメージのメンテが必要。単なるバージョンアップから、セキュリティホール対応まできちんと対応する必要がある (今でもかなりの数のイメージが乱立しているが、これからどのように制御して行くのだろう。ユーザ任せ?) | 単一実行環境なので、バージョンアップやセキュリティ対策の見通しはよく、メンテナンスコストは集中化できると思われる | |
OSイメージのコスト | OSイメージのコストは掛からない | |
実行環境の能力 | 低レベルのサービス(ファイルIOなど)を使える。何でもあり。 | 高レベルAPIに限られる。自由度低い |
仮想化環境の上、OS毎の特性も異なると思われるので、安定化や特に性能面のSLA制御は大変だろうと思われる | 挙動のバリエーションが限られるので見通しはよく、安定化させやすい。性能見積もりなども究極的には楽になるはず | |
実行環境モデル | バッチ処理や計算処理など、Webサービス以外にも使える | Webサービスに特化 |
OSが生で見えていて判りやすい分、どうしても単一ノードに特化したサービス実装になりがち。単一ノード以上にスケールアウトさせるには道具立て(Hadoopなど)が必要。 | フレームワークに則って作れば(究極的には)スケールしやすい。逆に言うとスケールしやすいものしか作れない | |
性能についても(有償で課金しているから良いようなものの)制御しづらい | 負荷プランニングし易い | |
移行 | 他のホスティングサービスからの乗り換えが容易 | APをほぼ新規に書き起こすことが前提。 特に、ISV/LAMPなどに依存する場合には、直接的な移行は難しい。 |
アプリケーション | 一般的なISV(Oracleとか)を使える | 性質上、一般的なOS上のISVは動作しない |
ISVメンテが必要。OSイメージとの組み合わせ爆発が起きないか? | メンテナンスは不要 |
結局のところ、
- Amazon EC2 はユーザの利便性を気にしている。使ってもらってナンボ。
- Google App Engineは、システムのシンプルさや既存システムとの整合性・流用性に重点を置いている。ユーザの利便性ははっきり言って二の次、三の次。
もうちょっと言うと(AmazonとGoogleのスタンス、ビジネスモデルの違いを考えれば当たり前ですが)、
- Amazon EC2は近々の利益を考えている
端的にはマシンパワーを売るビジネスモデルで、客への訴求性の代償として管理コストを支払っている
- Google App Engineはそれ自身で利益を上げるつもりが(あまり)ない
余ったマシンタイムで面白いサービスが出てきて、結果的に広告露出が増えればよいと割り切っていて、マシンパワーを売ろうとは思っていない。なので投資(管理コスト)も少なめで、ユーザ数に比例しない範囲に留めたい。今後出来るという有償サービスも多分おまけのサービスでしょう。
ここで、両陣営の大きな違いになるのが、管理コストの問題じゃないかと思います。EC2は便利で敷居が低く移行しやすい作りですが、それが先々システムの複雑さや見通しの悪さの原因となるような気がしています。うまいこと押さえ込めればいいのですが、この手の話はすぐに増殖するので、行きはよいよい帰りは怖いということになり兼ねません。
また、EC2上で稼動するOS/ISVインスタンス(FedoraやCentOSはともかく、WindowsやOracle)に対して、ベンダーがどのくらいの値札を付けてくるのかも気になります(Windows EC2については未発表のようですが)。ベンダは、立場上あんまり安売りもできない(パッケージが売れなくなっちゃう)けれども、あんまりご無体な値札も付けられないので、何かと引き換えで値引きとか、ぎりぎりのところで色々交渉が行われているものと推測します。駆け引きの結果、EC2の費用構造がどのあたりに落ち着くのかは、大変興味深いところでしょう。
マイクロソフトのスティーブ・バルマーが「皆GAEは良いというけど、実際に使っている人は見たことがない」と言ったそうですが、上のような意味では、Googleとしては「ウチは程々に使ってもらえればいいんだよ」なのかもしれません(まったく見向きもされないのも困るでしょうけど)
何となくの予感として、Amazonモデルは持続的技術、GAEは破壊的技術だというのはGoogleに贔屓し過ぎかな。
2008/10/20
Amazon EC2 (2)
さて、EC2のFedoraインスタンスにログインできるようになったので、httpdを起動してみることにします。
- httpdをインストールする
起動したばかりのインスタンスにはhttpdが入っていないので、yumでインストールする必要があります。
[root@ip-12-345-67-89 ~]# yum -y install httpd
Loading "fastestmirror" plugin
Determining fastest mirrors
:
Installing: apr-util ######################### [2/4]
Installing: httpd-tools ######################### [3/4]
Installing: httpd ######################### [4/4]
Installed: httpd.x86_64 0:2.2.6-3
Dependency Installed: apr.x86_64 0:1.2.11-2 apr-util.x86_64 0:1.2.10-2.fc8 httpd-tools.x86_64 0:2.2.6-3
Complete!
[root@ip-12-345-67-89 ~]# - httpdを起動します。
[root@ip-12-345-67-89 ~]# /sbin/service httpd start
Starting httpd: [ OK ]
[root@ip-12-345-67-89 ~]# - Webページを作成する
/var/www/html/index.htmlを編集して、Webページを作ってみます。
[root@ip-12-345-67-89 ~]# cat /var/www/html/index.html<html>
ここで、外からブラウザでhttp://ec2-01-234-567-89.compute-1.amazonaws.comを参照すると、確かに作ったばかりのページを見ることが出来ます。
<title>EC2 test web page</title>
<body>
This is EC2 test web page!!!
</body>
</html> - インスタンスのシャットダウン
一通り動作を確認したら、インスタンスをシャットダウンしておきましょう(何もしていなくて無負荷空転状態でも、インスタンスが生きていれば課金されてしまいます)。
[root@ip-12-345-67-89 ~]# shutdown -h now
Broadcast message from root (pts/0) (Mon Oct 20 11:12:21 2008):
The system is going down for system halt NOW!
あるいは、ec2-terminate-instancesコマンドを使って、外から強制的にインスタンスを停止させることも出来ます。
EC2の課金は1時間単位です。たとえ1分しか使っていなくても1時間分まるまる課金されます。そのためか判りませんが、インスタンスの停止後も、約1時間はそのままインスタンスがterminate状態で残るようです(最初は、インスタンスの削除が出来ないのではないかとちょっとあせりました)。
2008/10/18
Amazon EC2 (1)
Amazon EC2を使ってみました。
AWS(Amazon Web Service)のサイトにGettingStartedがあるので、それを見ながらやればOKと思いますが、簡単にポイントを説明しておきます。
AWS(Amazon Web Service)のサイトにGettingStartedがあるので、それを見ながらやればOKと思いますが、簡単にポイントを説明しておきます。
- サインアップ
まずはAmazon.com(co.jpではなく)へのサインアップが必要です。
以前、米アマゾンのアカウントを持っていたこともあって、それをそのまま使いました。普通にサインアップすると、日本のアマゾンと同様に、クレジットカードや住所等の個人情報の入力を求められると思いますので(有料サービスなので当然ですが)、無料サービスに慣れている人は若干抵抗があるかもしれません。
サインアップはすんだとして、気になるのはお値段です。
こんな感じになってます。ざっくり、1インスタンス10~80円/一時間なので、一ヶ月動かしっぱなしだと7000円から、ということになります。 - X.509の証明書の作成
Your AccountメニューのAccess Identifiersメニューから、X.509の証明書を作成してダウンロードします。
cert-MJBIQXYA2SIACBDSSVTBVB9RXQFTSLWT.pem
pk-MJBIQYI3S2SIACBDSSVT44UVRXQVCLWT.pem
というような二つのファイルが出来るので、~/.ec2というディレクトリを作成してその中にコピーしておきます。 - ツールのインストール
AWS(Amazon Web Service)は、クラウドを制御するためのツールを用意していてくれています。Javaとスクリプトで書かれていて、Windows/Linux等で動きます。今回は、Ubuntuの上で動かしています。
ツールは、zipをダウンロードして展開するだけでインストール完了です。私は、~/EC2というディレクトリを作成して、その中にzipを展開しました。ec2-api-tools-1.3-24159という名前で展開されるのでec2-api-toolsというシンボリックリンクを作成。
その上で、いくつか環境変数の設定が必要です。EC2_HOMEには~EC2/ec2-api-tools/を設定し、PATHにEC2_HOME/binを追加。
EC2_CERT、EC2_PRIVATE_KEYの両環境変数には、.ec2配下に置いた各X.509証明書を設定しておきます。
export EC2_HOME=~/EC2/ec2-api-tools/
export PATH=$PATH:"$EC2_HOME/bin"
export EC2_PRIVATE_KEY=~/.ec2/pk-Javaが動くことが前提なので、入っていなければインストール要です。私のUbuntuにはSun Java が入っていなかったので、改めてsun-java5-jdkを入れました(何もしないとGNU Javaになってしまうので注意が必要です)。MJBIQYI3S2SISSVT44UVRXQVCL WT.pem
export EC2_CERT=~/.ec2/cert-MJBIQYI3S2SIACBDSSVT44UVRXQVCL WT.pem - ツールを試してみる
% ec2-describe-images -o amazon
と入力して、AMI(Amazon Machine Image)がぞろぞろと出てくれば、とりあえずここまではOKと思われます(オーナがamazonのイメージのリストを取得したことになります)。
% ec2-describe-images -o amazon
IMAGE ami-2c5fba45 ec2-public-images/demo-paid-AMI-v1.07.manifest.xml amazon available public A79EC0DB i386 machine
IMAGE ami-bd9d78d4 ec2-public-images/demo-paid-AMI.manifest.xml amazon available public A79EC0DB i386 machine
IMAGE ami-2f5fba46 ec2-public-images/developer-image-i386-v1.07.manifest.xml amazon available publici386 machine
IMAGE ami-26b6534f ec2-public-images/developer-image.manifest.xml amazon available public i386 machine
:
IMAGE ari-a23adfcb ec2-public-images/initrd-2.6.20-1.3002.fc6xen.ari.manifest. xml amazon available publicx86_64 ramdisk
IMAGE aki-9b00e5f2 ec2-public-images/vmlinuz-2.6.18-xenU-ec2-v1.0.i386.aki. manifest.xml amazon available public i386 kernel
IMAGE aki-9800e5f1 ec2-public-images/vmlinuz-2.6.18-xenU-ec2-v1.0.x86_64.aki. manifest.xml amazon available public x86_64 kernel
IMAGE aki-a53adfcc ec2-public-images/vmlinuz-2.6.20-1.3002.fc6xen.aki.manifest. xml amazon available publicx86_64 kernel
このひとつひとつが仮想マシンの雛形になります。 - sshの設定をする
%ec2-add-keypair gsg-keypair
これによってssh接続用のキーが標準出力に出力されます。「----- BEGIN RSA PRIVATE KEY -----」から、「----- END RSA PRIVATE KEY -----」までの行を、適当なファイルに格納してください。私は、~/EC2/id_rsa-gsg-keypairというファイルを作ってそこに置きました。 - Fedora8の64bitイメージを立ち上げてみる
まず、立ち上げるイメージ名を調べます。今回は、Fedora 8のx86_64版ということにします。
% ec2-describe-images -o amazon|grep -i fedora-8-x86_64-base-v1.07
IMAGE ami-2a5fba43 ec2-public-images/fedora-8-この2カラム目の「ami-2a5fba43」がイメージ名になりますので、それを引数にして ec2-run-instancesコマンドを実行します。x86_64-base-v1.07.manifest.xml amazon available public x86_64 machine aki-b51cf9dc ari-b31cf9da
% ec2-run-instances ami-2a5fba43 -t m1.large -k gsg-keypair
でインスタンスの生成が行われます。m1.large というのはインスタンスの型で、他にもm1.small(32bit、小規模)、c1.large(CPUインテンシブなジョブ向け、64bit)など何種類かあります。詳細はここ。
生成したインスタンスの情報は、ec2-describe-instancesコマンドで参照・確認することができます。早速生成されたインスタンスを確認すると以下のようになっていました。「 i-fcb85296 」がインスタンスのIDになります。
% ec2-describe-instances
RESERVATION r-376bb45e 573465381650 default
INSTANCE i-fcb85296 ami-2a5fba43 ec2-01-234-567-89.compute-1.amazonaws.com domU-12-34-56-78-90-12.compute-1.internal running gsg-keypair 0 m1.large 2008-10-19T13:16:32+0000 us-east-1c aki-bcf529dc ari-b31cf53
以下、このインスタンスIDを使って操作を行うことになります。 - sshとhttpのポートを開放する
インスタンスの起動を待ちつつ、あらかじめsshのポートを開けておきます。ついでにhttpも開けておくことにします。
% ec2-authorize default -p 22
% ec2-authorize default -p 80 - インスタンスの正当性の確認
しばらくするとインスタンスが起動完了します(ec2-describe-imageでステータスがrunningになります)。コンソール出力を取得して、生成されたインスタンスのフィンガープリントを調べます(下記のボールド部分)。
% ec2-get-console i-fcb85296
Linux version 2.6.21.7-2.fc8xen (mockbuild@xenbuilder4.fedora.phx.redhat.com) (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #1 SMP Fri Feb 15 12:34:28 EST 2008
Command line: root=/dev/sda1 ro 4
:
ec2: ec2-ami-tools already up to date
ec2: -----BEGIN SSH HOST KEY FINGERPRINTS-----
ec2: 2048 da:63:be:67:aa:30:72:df:c1:c4:10:fb:a8:27:9a:0f /etc/ssh/ssh_host_key.pub
ec2: 2048 c5:61:78:38:c5:20:5b:82:37:58:07:ba:ab:eb:75:54 /etc/ssh/ssh_host_rsa_key.pub
ec2: 1024 a8:5a:67:e0:32:a6:59:c3:34:52:9f:f7:e8:c0:52:ee /etc/ssh/ssh_host_dsa_key.pub
ec2: -----END SSH HOST KEY FINGERPRINTS-----
: - sshでログインする
インスタンスにrootでログインします。-iオプションで、上で作成したキーファイル(~EC2/id_rsa-gsg-keypair)を指定します。
インスタンスの外向きのホスト名は、ec2-describe-instancesで調べることが出来ます。
私の場合には、ec2-75-101-227-236.compute-1.amazonaws.comでした。
% ssh -i ~/EC2/id_rsa-gsg-keypair root@ec2-75-101-227-236.compute-1.amazonaws.com
The authenticity of host 'ec2-01-234-567-89.compute-1.amazonaws.com (12.345.678.901)' can't be established.
RSA key fingerprint is c5:61:78:38:c5:20:5b:82:37:58:07:ba:ab:eb:75:54.
Are you sure you want to continue connecting (yes/no)?
__| __|_ ) Fedora 8
_| ( / 64-bit
___|\___|___|
Welcome to an EC2 Public Image
:-)
Base
--[ see /etc/ec2/release-notes ]--
[root@ip-12-345-67-89 ~]#
これでログイン完了です。ログイン時に出力されるフィンガープリントを、事前にコンソールで確認したフィンガープリントと比較して、man-in-the-middle攻撃にさらされていないことを確認してください。
以降、一般的なLinuxのコマンドを自由に使うことが出来ます。
[root@ip-12-345-67-89 ~]# uname -a
Linux ip-12-345-67-89 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:34:28 EST 2008 x86_64 x86_64 x86_64 GNU/Linux
2008/07/19
YMZ294ボード続き
とりあえず、きらきら星と我が子のテーマ(というのがあるのです我が家には)は鳴るようになったのですが、一音だけでさびしいので、奥さんに伴奏をつけさせることにしました。
奥さん的には五線譜の方が入力しやすそうで、その手のツールは大体が独自フォーマット+MIDI出力なのと、他のネット上に落ちている曲も(可能なら)手を出したいということもあって、あらためてMIDIフォーマットを少し調べてみました。
学生時代にサークルの先輩達が「SC-88のオケヒットがエクスクルーシブで~云々」とか何とか色々と言っていたことを思い出して、機能盛り沢山、音源依存機能沢山でオーバスペックではとちょっと恐れていましたが、意外と基本構造は簡単で、
とりあえず、各トラックとその中のMIDIメッセージを取り出して、YMZ294に合わせて出力するようなものを、簡単なCのプログラムで拵えてみました。
これで、レジスタに設定する周波数パラメータと音の継続時間を16進数でしこしこ配列化するという作業からは開放されました。
奥さん的には五線譜の方が入力しやすそうで、その手のツールは大体が独自フォーマット+MIDI出力なのと、他のネット上に落ちている曲も(可能なら)手を出したいということもあって、あらためてMIDIフォーマットを少し調べてみました。
学生時代にサークルの先輩達が「SC-88のオケヒットがエクスクルーシブで~云々」とか何とか色々と言っていたことを思い出して、機能盛り沢山、音源依存機能沢山でオーバスペックではとちょっと恐れていましたが、意外と基本構造は簡単で、
- ノートオン・オフ
- テンポ
とりあえず、各トラックとその中のMIDIメッセージを取り出して、YMZ294に合わせて出力するようなものを、簡単なCのプログラムで拵えてみました。
これで、レジスタに設定する周波数パラメータと音の継続時間を16進数でしこしこ配列化するという作業からは開放されました。
Google App Engineで遊んでみる(3) Mail API
前回、ようやくアプリが作れるようになったGoogleAppEngine(以下GAE)ですが、サンプルアプリケーションとして、helloworldを書いてみたり、DataStoreに画像を登録するようにして、画像掲示板もどきを作ったりとちょこちょこ遊んでしていました。
それで、GAEには現状
Mail APIは文字通りGAEからメールを送るためのAPIで、メールというと認証とかうるさそうなイメージがあるのですが、使い方はすごく簡単で
それで、GAEには現状
- Datastore API
- Images API
- Mail API
- Memcache API
- URL Fetch API
- Users API
Mail APIは文字通りGAEからメールを送るためのAPIで、メールというと認証とかうるさそうなイメージがあるのですが、使い方はすごく簡単で
from google.appengine.api import mailでmailをインポートしておいて、
user_address = "送り先のアドレス"というのを、画像投稿時などのイベントで実行してやればメール送信が可能ということになります。簡単です。
if not mail.is_email_valid(user_address):
# アドレスがおかしいよといって再入力を促す
else:
sender_address = "送信者アドレス"
subject = "Photo registered"
body = "Photo is registered"
mail.send_mail(sender_address, user_address, subject, body)
2008/07/13
Google App Engine で遊んでみる(2)
前回、ローカル環境で実験した Google App Engineですが、Web上に公開するためには携帯のSMSを使った本人認証が必要で、一部で報じられているとおりKDDI/DoCoMoが海外からのSMSに対応していないため、認証待ちになっていました。
障害自体は直った(SMSじゃなくてEZwebのメールで送れるようになったみたい)ようなのですが、最初に何度も送信してしまったためか、「Verification 送りすぎ」と言われて出入り禁止を食らっていました。
同じような境遇の人は何人かいるようで、どうすればいいんだーといったメッセージをちらほら見かけましたが、どこも放置状態だったようです。
しょうがない、別アカウントでも取るかと思っていたところ、先週、Google App Engineチームからメールが来ていて、「SMSでトラぶったみたいね。アカウントを再イネーブルしました」とのことです。
早速使ってみましょう。
障害自体は直った(SMSじゃなくてEZwebのメールで送れるようになったみたい)ようなのですが、最初に何度も送信してしまったためか、「Verification 送りすぎ」と言われて出入り禁止を食らっていました。
同じような境遇の人は何人かいるようで、どうすればいいんだーといったメッセージをちらほら見かけましたが、どこも放置状態だったようです。
しょうがない、別アカウントでも取るかと思っていたところ、先週、Google App Engineチームからメールが来ていて、「SMSでトラぶったみたいね。アカウントを再イネーブルしました」とのことです。
早速使ってみましょう。
登録:
投稿 (Atom)