PhotoShare にアップロードするだけのアプリ
PhotoShare は写真共有を軸にした SNS のようなサイトで結構好きなのですが。写真をアップロードしたいだけという状況で写真をアップロードしようと公式アプリを立ち上げると自分宛のコメントが来てないかとか、友達の写真が更新されてないかとかチェックするのですぐにアップロード画面にいけずイライラしたりします。
そんなわけでシンプルに PhotoShare にアップロードするだけなアプリを作りました。
先日のたこthon で適当に書き上げたアプリなので本当にアップロードする以外の機能がありませんが、使いながら欲しい物を加えていこうと思ってます。使い方見つつインタフェースも。
3GS 購入
アプリ開発で 3GS を借りたのが最後、もうどうしてもあの速さがうらやましくなってしまって結局買ってしまった。
今まで使用していた 3G の分割のこり10ヶ月分くらいは次の請求で一括で払うことに。そのまま分割したままでもよかったが割引きかなくなるから一括で払っても変わらないからそれなら払っちゃっておいた方が良いかなーと。なんかよくわからないけどホワイトWとかなんちゃらオプションとか加入させられたのでそれはわすれないうちにオフにした。
感想としてはいままで iPhone 使ってて一番不満だったメモリ足りなすぎて重いなーって言う感じがまったくしなくなってとても快適。これが本来イメージされてた iPhone かーという感じ。 3G ユーザーはみんな乗り換えたら感動すると思う。
でも液晶の色合いがなんか 3G と違って白っぽいのはきになるなー。液晶は前の方が好み。
本体の方の色は 3G が白つかってたので黒にしたが、白の方がよかったなーと若干後悔中。iPhone の黒はなんか下品な感じがする。まぁカバーつけるから関係ないんだけど。
無線APによって自動でhostsを変える方法
OSX の LaunchAgents には特定のパスを監視して更新があったらプログラムを起動すると言うことが出来ます。例えば以下のような設定を書いてみると:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.unknownplace.wifi_switch</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/zsh</string>
<string>-c</string>
<string>exec perl /Users/typester/dev/scratch/wifi_switch/switch.pl</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/dev/null</string><!-- <string>/tmp/error</string> -->
<key>StandardOutPath</key>
<string>/dev/null</string>
<key>WatchPaths</key>
<array>
<string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
</array>
</dict>
</plist>
/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist を監視しそれが更新されたら /Users/typester/dev/scratch/wifi_switch/switch.pl を実行する。と言うことが実現できます。
この監視先のファイルは OSX の無線ネットワーク設定なので、これが更新されると言うことは無線通信の状態が変わったときと言うことを意味します。
これを有効にするにはこのファイルを適当な名前 hoge.plist で /System/Library/LaunchDaemons/ 保存すれば次回起動から有効になります。すぐに有効にしたい場合は、
sudo launchctl load /System/Library/LaunchDaemons/hoge.plist
などとすればOKです。詳しくは launchctl や LaunchAgent/LaunchDaemon のドキュメントを参照のこと。システムレベルの LaunchDaemon を使用しているのは /etc/hosts を書き換えるのに root 権限が必要だからです。
あとはここで起動されるスクリプト中でからAPの情報を取得しそれをもとに hosts を書き換えればいいわけです。APの情報は
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I
と言うコマンドで取得可能なのでそれをパースすればオッケーです。
以下に僕が実際に使用しているスクリプトを貼っておきます。
このスクリプトと同じところに、default.mt と 特定のAPのSSID名.mt と言うファイルで hosts を書いておくと、通常は default.mt が /etc/hosts に書き出され、SSIDにマッチするファイルがある場合には SSID名.mt が /etc/hosts に書き出されるという感じです。
AP によって hosts を変えたいという状況がそんなにあるとは思いませんが、ネットワークの状態によっていろいろ設定を変えると言う目的では便利で使えますので覚えておいて損はないでしょう。
中里情報ソースに困る
巨人に移籍してしまったため現在まったく情報源がなくこまっている。巨人のサイトとかチェックしてねー。
たこthon
というのに参加してきた。
tomyhero さんの家なのでどんだけ奇天烈な家なんだろうと思ってワクワクして言ったら予想に反してまともな家でした。でもものすごく遠い。
たこ焼き食べたり鯛焼き食べたりタコライスたべたりしてあとはハックしたりゲームしたり漫画読んだりする会らしい。
予想に反して集中できたので
- オレオレlighttpdモジュールを本番投入したり
- 前から作ろうと思ってたiPhoneアプリをガリガリ実装したり
した。iPhoneアプリはほしい機能全部はつけてないけどとりあえずそれ削れば公開はできそうだったので公開してから帰るかとおもってリリース作業してたら最後の最後で謎エラーで手間取りだめだった。今日の夜にでもアップしよう。
たこ焼き器とPS3欲しくなった。
Kindleもちょっとだけ欲しくなった。
mod_accessvalve
lighttpd で一定時間におけるアクセス数をもとにアクセスを制限したいという用件があったのですが、それにマッチする良いモジュールがなかったので試しに書いてみた。
設定項目は
accessvalve.bucket-size:reset-intervalの時間内に許可するリクエスト数accessvalve.reset-interval: リクエスト数カウントをリセットする時間(秒) (デフォルト 60)accessvalve.ban-duration: リクエスト数がbucket-sizeを超えた場合にアクセスを拒否する時間(秒)(デフォルト 900)
という感じで。また bucket-size を指定しない、もしくは 0 に設定するとそのブロックではこの機能は無効になる。
このようなアクセス制限をあえて HTTPD でやる利点としては、Virtual Hostごとに設定を変えたり、特定のパスだけ制限したりと言うことができると言うことかなぁ。あとは 503 エラーとかかえせたりとかか。その分無駄なループが発生するのでオーバーヘッドになる。
最初 lighttpd のサイトを検索すると mod_throttle というのを誰かが書いているのが見つかってそれを使おうとしたのだけど、設定ファイルの patch 処理がされてなく、上記のような設定ファイルの場所によって設定を変えるということができなかったので採用を見送った。
また、単純なコネクションごとの帯域制限やコネクション数制限は lighttpd に付属の mod_evasive でできる。
なぜか X 関係でビルドできないとき
lighttpd 1.4.24 以降や現在の SVN head で autogen.sh を走らせてからビルドしようとするとなぜか X 関係のエラーが出て make が失敗するということがありますがそういうときは、
cp `which libtool` .
とかすると make とおるようになります。それ以上追ってないけど。なんでだろ?
リニューアル
clmemo を開始してから4年ほど、ずっと変えていなかったサイトをサーバーが死亡したのを機にリニューアル。
今年初めに作った nim をつかって全部静的ファイルな構成にしてみる。制限のきついレンタルサーバーならともかく、僕の環境ではまったく意味がない。最初は typester.github.com とかでやろうとおもったけど、その後移転したくなったときリダイレクトとかできないのはいやなのでやめた。
でも自鯖はめんどくさいので prgmr.com 借りた。なかなか良い。
nim なら clmemo 以外にもコンテンツを扱えるのでぼちぼち増やしていく予定。とりあえずブログかなぁ。
しかしやっぱりサイトをいじるのは楽しい。最近はブログサービスなどが普及してきてこういうことをやる人が少なくなってしまったけどもったいないなーとおもう。
AnyEventでirssiプラグインを書く
AnyEvent はその名の通りさまざまなイベントインタフェースに対応していて、その中に irssi が使用している Glib も含まれているため、irssiのプラグインの中で普通に AnyEvent を使用することができます。
キーワード反応を im.kayac.com で自分の IM に通知する higlith2im.pl プラグインを AnyEvent を使用するように書き換えたのが以下です。
use strict;
use warnings;
use Glib;
use Irssi;
use AnyEvent::HTTP;
use HTTP::Request::Common;
our $VERSION = '0.1';
our %IRSSI = (
name => 'hilight2im',
description => 'notify hilight message to IM via im.kayac.com api',
authors => 'Daisuke Murase',
);
sub sig_printtext {
my ($dest, $text, $stripped) = @_;
if ( $dest->{level} & MSGLEVEL_HILIGHT ) {
my $user = Irssi::settings_get_str('im_kayac_com_username') or return;
my $msg = sprintf('[irssi] %s', $stripped);
my $req = POST "http://im.kayac.com/api/post/$user", [ message => $msg ];
my %headers = map { $_ => $req->header($_), } $req->headers->header_field_names;
my $r;
$r = http_post $req->uri, $req->content, headers => \%headers, sub { undef $r };
}
}
Irssi::signal_add('print text' => \&sig_printtext);
Irssi::settings_add_str('im_kayac_com', 'im_kayac_com_username', '');
fork する必要がなくなってシンプルですね!
...とおもいきや現状の AnyEvent::HTTP はなんと HTTP::Request オブジェクトからのリクエスト送信に対応していないため、自分ですべてのリクエストを組み立てる必要があるようです。これは不便。。
ですが、irssi の中で普通に AnyEvent を使うことができるのはなかなか便利です。お試しあれ!
AnyEvent 版は github にあげた。