monthly gimite

試験運用中。

[css] CSSのmax-widthを指定しつつ中央寄せする方法のメモ

.hoge {
  width: 80%;
  max-width: 800px;
  margin-left: auto;
  margin-right: auto;
}

  • 幅をウィンドウの80%に
  • ただしそれが800pxを越える場合は800pxに
  • 余った余白は左右均等に(中央寄せ)

max-widthはIE6だと使えないらしい。IE7以降と他の最近のブラウザなら大丈夫そうです。

margin-left: auto, margin-right: 0pxで右寄せ。

Amazon EC2の無料ティアを試す

Amazon EC2が1年間無料というので、試してみました。とりあえずUnbuntuが立ち上がってSSHでログインできるようになりました。

セットアップの仕方はしげふみメモ : 無料でAWS(Amazon EC2,S3等)を使ってみたとかに説明があります。

なんか時々罠があって、うっかりしてるとすぐに課金されますね…。自分が不注意なだけのような気もしますが。今のところ

  • Instance Typeにlargeを選んだら$0.75取られる。無料なのはmicroだけでした…。
  • インスタンスをStopしておけば課金されなくなるだろうと思って、Stopして会社に行って帰って来たら普通に課金され続けていて、追加で$4.25ほど取られる。Terminateしないと駄目なようです。
  • regional data transferという名目で$0.02取られる。これがなんで発生したのかはっきりしないのですが、どうもapt-getの時に発生している気がします。sources.listにデフォルトでhttp://us-east-1.ec2.archive.ubuntu.com/ubuntu/と書いてあるので、これがEC2内の別のゾーンにあるということかもしれません。*1
  • Ubuntuを入れる場合はalestic.comに書いてあるイメージを使うのが普通っぽいのですが、ここでEBS boot*2を選ぶと15GBのEBSができます。しかし無料なのは10GBまでなので、このままだと課金されます。10GB*月を超えると課金なので、これはまだ課金されてないですが…。

という感じで合計$5ほど課金されました :)App Engineみたいに、自動では課金されない(無料quotaを超えたらサービスが止まる)オプションがほしいですね…。

適当に使い方をググッたときは、管理ツールとしてコマンドライン版とかFirefoxアドオンを使う説明が多かったんですが、今はAWS Management ConsoleというWebインタフェースがあるので、これを使っています。

Ubuntuについては10GB EBS版のイメージを作ってくれた人がいるので、これを指定すれば課金されずに済みます。インスタンスを作るときに、AMIを選ぶところでCommunity AMIsでami-c2a255abを検索して選べばOK。ただし、US Eastにしか置いてないので、RegionをUS Eastにする必要があります。このへんの説明に従ってAMIを自作すればいAsiaでもできそうなんですが、面倒そうなのでやめました。

2010/11/6追記: regional data transferについて追記。

*1:インターネットでの通信が(一定量まで)無料で、EC2内の通信が有料なのはちょっと妙な気がしますが、1GB $0.01とかなので気にしなくていいかも。

*2:ディスクとしてEBSを使うバージョン。instance-storeの方だとマシンを再起動するとディスクが初期化されてしまうが、EBSなら普通に保存される、らしい。

[ruby][sinatra] Sinatraのハンドラ内でem-http-requestを使う

Sinatra+Thinで、どこかからHTTPで取得した結果を加工して出力したい、という場合、

require "open-uri"

get("/") do
  open("http://example.com/"){ |f| f.read() }
end

でもいいのですが、これだとexample.comからの返答待ちの間、EventMachineが完全に止まってしまうのがいまいちです。そこでem-http-requestを使おうとしたのですが、それにはハンドラのレスポンスを非同期に返す必要があります。どうするんだろうと思ったのですが、async_sinatraというものがあるようです。

$ sudo gem install async_sinatra em-http-request
require "sinatra/async"
require "em-http"
register(Sinatra::Async)

aget("/") do
  http = EventMachine::HttpRequest.new("http://example.com/").get()
  http.callback() do
    body(http.response)
  end
  http.errback() do
    status(500)
    body("error")
  end
end

[tss][ruby] Tweet Search Streamの実装をem-websocketとem-http-requestに

Tweet Search StreamTwitter Streaming APIの結果をWebSocketに流す部分は、元々web-socket-rubyとnet/httpを使って1コネクション1スレッドという実装だったのですが、em-websocketem-http-requestを使うように変更しました。Webサーバもthinなので、これで全てEventMachineの上に乗って、ほぼ1スレッドで全部動くようになりました。余計な排他処理が要らなくなったのはいいですね。パフォーマンスも良くなったことに期待ですが、測ってはいないです。まあ元々今ぐらいのアクセス数だと負荷は問題なかったんですが。

実装にはkennさんの記事が参考になりました。1点変更が必要だったのが

http = EM::HttpRequest.new(STREAMING_URL).get :head => { 'Authorization' => [ 'USERNAME', 'PASSWORD' ] }

という部分で、

http = EM::HttpRequest.new(STREAMING_URL).get :head => { 'Authorization' => [ 'USERNAME', 'PASSWORD' ] }, :timeout => 0

としないと、ストリームが10秒以上止まるとそこで接続が切れてしまいます(:timeoutのデフォルトが10なので)。この記事が書かれた当時は要らなかったのかもしれませんが。

ちなみにtwitter-streamというのも見つけたのですが、なぜかOAuthの認証に失敗します。OAuthを深追いするのが面倒だったので、使うのを諦めました。

ソースはこちらです。

[tss][twitter] Tweet Search StreamがTwitterからアクセス禁止された経緯と復活した経緯

10/3-10/5ぐらいにかけてTweet Search Streamが落ちていたのですが、これはTwitterからアクセス禁止をくらってました :) その後Twitter Streaming APIの使い方を変えることで制限に引っかからないようにして復活しました。以下はその経緯です。

まずアクセス禁止を食らった理由ですが、たぶんこれです。

Access and Rate Limiting - Streaming API: Concepts

Excessive connection attempts, regardless of success, will result in an automatic ban of the client's IP address.

元の実装ではTweet Search Streamを開いているユーザの数だけStreaming APIのコネクションを張っていました。最初の頃は平気だったのですが、徐々にユーザが増えて、同時接続数がしょっちゅう20以上、ピーク時は50〜80ぐらいになったところでIPアドレス単位のアクセス禁止を食らいました。

当初からこれには引っかかるかも、と思っていました。ただ、excessive connection attemptsというのが一体10なのか100なのか1000なのか分からなかったので、見切り発車していたのです。

で、これはもうTweet Search Stream終了のお知らせかな、と思ったのですが、APIのドキュメントをよく見ると検索キーワードはORで400個まで同時に指定できると書いてあります。Tweet Search Streamは同じキーワードにアクセスが集中する傾向にあるので、キーワードの数は接続者数よりかなり少なくなります。なのでStreaming APIの接続を全体で1本にして、接続中の全ユーザのキーワードをOR(Streaming APIでは",")でつないで投げれば、今ぐらいのアクセス数なら余裕なのでは、ということに気づきました。で、そのように実装しなおして10/5に投入しました。

が、実はその後1度問題が起きました。10/8にちょっとしたバグ修正のためにTweet Search Streamのサーバを再起動したのですが…。再起動によってWebSocketの接続が切れると、Tweet Search Streamのページには"Disconnected. Retry"とか表示されるので、当然みなさんすぐにそれをクリックします。そうすると再起動直後にアクセスが集中することになります。新しい実装ではキーワードが増えるたびにStreaming APIのコネクションを切断→新しいキーワードを追加して接続しなおし、ということをやります。なので再起動直後は短期間でこの切断→接続が繰り返されることになり、Twitter側から「おちつけ」というエラーをもらって繋がらなくなってしまいました。そこで短期間で切断→接続を繰り返そうとしたときは、ちょっと待つ、という仕組みを入れて回避しました。

もうちょっと様子を見ないと分からないですが、これで今のところは安定しているようです。

ちなみに新方式ではさりげなくTwitterアカウントでのログインが不要になっています。これはコネクションが1本しかないので、僕のアカウントで認証すれば済むからです。*1

新しい実装はGuthubに上がってるので、興味のある人はどうぞ。Guthubのバージョンはさらにem-http-requestとem-websocketを使って完全にEM化されています。これについては後述。

*1:Streaming APIのコネクションは1ユーザ1本しか張れないので、旧方式では各ユーザに認証してもらう必要がありました。

Devas, G Launchなど開発終了のお知らせ

namespace gimiteVectorなどで公開している、以下のソフトの開発を終了します。

  • Devas
  • G Launch
  • 助さん
  • G Check
  • 大貧民
  • Guppy
  • Pound X

今後のバージョンアップはおそらくないですが、どれも(記憶によれば)致命的なバグは見つかっていないと思うので、今のバージョンを使い続ける&ダウンロードして使う分には問題ありません。ものによってはWindows Vista/7でうまく動かないかもしれませんが…。DevasはWindows 7でも動作します*1

今後も「エラーが出る」とか「こういう事をする方法がわからない」とかは掲示板などで訊いて下さい。今のバージョンの使い方次第でどうにかなる場合は、教えます。ただ、「こうして欲しい」という要望には、残念ながら応えられません。

どれも数年以上放置されているもので、非常に今更なのですが…。特にDevasは最近でも掲示板で時々要望をくれる人がいて、「あーそれは確かにそうですねぇ。今後バージョンアップすることがあれば入れるかも」みたいな曖昧なことを毎回書いて結局放置してるのも申し訳なかったので、きちんと宣言しておこうと思った次第です。

Devasについては最後にVer.3.5βをそのままVer.3.5としておきました。経験上少なくとも3.4と同程度には安定していたので。インストールすると3.5βと表示されるのがあれですが…。*2

あとDevasのページでは微妙にバージョンが古いのですがソースコードも公開されています。BCB(有料)が必要(しかも最新のBCBで動くのかは不明)だしとてもソースが汚いのでかなり敷居が高いですが、どうしてもいじりたいという人はどうぞ。

*1:動かないという報告もあったのですが、少なくとも自分の環境では動いています。

*2:そこを直すだけでも開発環境のセットアップから始めないといけないのでかなり面倒なのです…。