いまさら感ばっちりですが CocProxy を使ってみました。 一応名前は知っていてブクマまでさせてもらっていたのですが試していませんでした。
ブラウザに単純にプロキシーを設定するとすべてキャッシュさせてしまうので FoxyProxy と組み合わせるとかなり効率がよくなると思います。 FoxyProxy はルールによってプロキシー、直接接続を振り分けられるので、テスト開発の localhost のみを CocProxy に誘導できます。
実際に CocProxy を使ってみると Ajax のレスポンスもキャッシュしてくれました。いったんキャッシュさせれば開発サーバーを止めても css/js をいじって確認できます。ファイルを置いて Ruby プログラムをローカルで起動するだけなので敷居もすごく低いです。
ローカルだけでなく外部サーバーの Web アプリケーションをキャッシュさせていじったりと色々使い道がありそうです。
Flash を数年ぶりに触った。 ActionScript といった方が正しいのかも。
ボタンをクリックしたところで、 HTML の input 要素に入っている文字列をクリップボードにコピーさせたいので Flash を触ってみる。
クリップボードにコピーするには ActionScript の ExternalInterface.call から JavaScript の関数を呼び出し、 document.getElementById して value の文字列を返したものを ActionScript の System.setClipboard に設定してあげるだけ。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="creationCompleteHandler(event)" layout="absolute">
<mx:Script>
<![CDATA[
import flash.events.Event;
import flash.external.ExternalInterface;
private function creationCompleteHandler(e:Event) :void {
copy.label = Application.application.parameters.label || "copy";
}
private function buttonClickHandler(e:Event) :void {
var callback:String = Application.application.parameters.callback;
var value:String = ExternalInterface.call(callback);
System.setClipboard(value);
}
]]>
</mx:Script>
<mx:Button id="copy" click="buttonClickHandler(event)" />
</mx:Application>
<input id="text" value="hoge" />
<div id="copy" />
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
function getText() {
return document.getElementById('text').value;
}
swfobject.embedSWF("clipboard.swf", "copy", "100%", "100%", "9.0.0", "expressInstall.swf", {"callback": "getText", "label": "コピー"}, {}, {});
</script>
うまく動くと思ったけど Flash 10 で swfobject を使う、かつ ExternalInterface を利用する場合は trunk から 2.2 を持ってこないといけないことが分からなくて時間を無駄に過ごしました。
なお IDE には FlashDevelop を利用させてもらいました。
5 月の GW は学生時代の友人たちと 2 泊 3 日の旅行に行くことに。旅行は去年の京都以来。
学生時代に友人たちと旅行をしなかったし、みんなそれなりの年齢になって収入もある。ぼちぼち誰か結婚もするだろうし、今が最適な時期じゃないかなということで 3 月中旬に行こうよと前振りなく言ってみたところ、助けもあって 4 人集まった。
ぐだぐだになりながらも、東京、名古屋と離れた友人たちとチャットでわいわい決められたのは面白かった。あとは旅行を楽しむだけ!大宴会!!!
しかし最初ケチろうと思って 1 泊 2 日なんてよくやろうとしたなあ。どうみても無理。それからお金は来年から本気出して貯める。
お金の出費を少しは抑えたい。旅行なんだしゆったり行ってもいいんじゃない?ということで、ぷらっとこだま。
東京・品川発|ぷらっとこだまエコノミープラン|京都 旅行をはじめ新幹線のお得なツアーはJR東海ツアーズ
※ 途中乗降不可/乗降できる駅は券面記載された駅のみとなります。券面記載駅以外で乗降する場合、別途出発地からの乗車券、特急券が必要となります。この場合ぷらっとこだまエコノミープランの払い戻しはありません。
途中下車無理っぽいなあ。一応明日予約ついでに駅員さんに聞いてみよう。
自分のところの日本語 Gmail の設定画面に Labs が追加されてたのでいくつか有効にしてみた。
常に全員に返信はキーボード操作していればいらない気もする。
添付忘れチェッカーなんてあったのか。まだ日本語は対応していないのかな。
取扱い商品のご案内とまで書いてあった。
オンライン購入は無料会員登録だけでなくチケットの取得が面倒そうなので止め、 JR 東海でないと受付してくれなかったので東京駅まで行った。購入手続きに大体 20 分ぐらいかかったかな。
先日推測したとおり指定した駅で降りる必要があって、途中下車した場合は乗車券、特急券を支払う必要が出る。また乗り遅れた場合には単なる紙切れになるので、指定席に予約したけど別便で自由席というわけにもいかず寝坊厳禁。早朝出発なので心配。
InfoQ: Silverlight Has Lost an Important Customer
今年の MLB のサイトが Silverlight から Flash に戻った話みたいです。管理者権限なしでインストールできないことが最も問題になったよ、みたいな話でしょうか。
インストールできないってこともあるけど、 Flash が先に大きなシェアを獲得していて、今では HD 画質でストリーミングできるってことも差し戻された要因のひとつなんだろうなあ。一度取り逃した信頼を取り戻すのは大変です。
簡単に書き換えられてはしまいますけど navigator.userAgent みたいにさっくり取れる方法があればいいのですが、 Ubiquity で OS の情報を簡単に取る方法が分からなかったので xpcom 経由で取得する方法にしました。
teramako : XPCOM OS のシステム情報を得る
function getLineSeprator() {
var sysInfo = Components.classes["@mozilla.org/system-info;1"].getService(Components.interfaces.nsIPropertyBag2);
var platform = sysInfo.getProperty("name");
if (platform.indexOf("Windows") >= 0) {
return "\r\n";
} else {
return "\n";
}
}
Mac OS X より前はスルーしています。それからよく使うのであればキャッシュさせたほうがいいと思います。
タイトルと URL をコピーする Ubiquity コマンドは改行文字を \n としていて、 Windows のアプリケーションによっては直接貼り付けると改行できないことがあったので調べてみました。スクリプトも修正済みです。
Google App Engine Java でアプリをつくってみようかなと。つくってみたいアプリケーションも思い浮かんだので早速 Application Identifier を登録しに行き、これだと決めていた ID を入力。
時既に遅し。登録されていた。よくあること。
ID はどれも取り合いになるなあ。 RPG の主人公の名前付けでその後のやる気が大きく変わるタイプなので名前は重要です。
適当に to, subject, sender, body に入れてみたところ
Uncaught exception from servlet java.lang.IllegalArgumentException: Unauthorized Sender:
というエラーメッセージがログに。
Message の sender に設定するメールアドレスは認証済みのアカウントでないとエラーになるようです。当たり前といえば当たり前ですね。
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user == null) {
resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
return;
}
Message m = new Message();
m.setTo("hoge@example.com");
m.setSubject("Hello");
m.setSender(user.getEmail());
m.setTextBody("てすと");
MailService mailService = MailServiceFactory.getMailService();
mailService.send(m);
}
デプロイして実際にメールを送信してみたところ日本語も化けず 、エンコーディングも ISO-2022-JP で送れていました。
久しぶりに Ruby を触り始めたのでリハビリ中です。標準にはディレクトリ一覧を取得するメソッドが用意されていないと思ったためつくってみました。
def directories(path = Dir.pwd)
Dir.entries(path).map do |f|
expand_path = File.expand_path(f, path)
expand_path if File.directory?(expand_path)
end[2..-1].delete_if {|v| v.nil?}
end
カレントディレクトリと親ディレクトリは使うことがないため除いています。さらに再帰的に辿れば指定したディレクトリ以下の一覧も取れると思います。 Find モジュールを使えば再帰にしなくてよさそうです。
map の結果に格納されるリストに対しては compact メソッドで directory にマッチしなかった nil を消していましたが、すべてディレクトリの場合は削除する対象がないため self を返さず nil を返すので見事にバグっていました。 delete_if は常に self を返すのでこちらを使うように修正しました。
無理矢理くっつけると分からなくなるなあ。普通にマッチしたものだけをリストに追加したほうがいいのかも。チェインはさじ加減が難しい。
Git で SSH アクセスする際にパスワードを毎回聞かれるのがうざかったので ssh-agent に登録してみました。
$ eval `ssh-agent` $ ssh-add ~/.ssh/id_rsa
Git 使ってるけど merge をほとんどしていないのであまり意味がない気がしますが、個人向けに Subversion より気軽にリポジトリがつくれるので良しとします。
と言い始めたので、すでに射程範囲内に捉えています。
バックアップ用途をメインに考えていますが、プリンタを繋げてワイヤレス化にすることができる、無線 LAN のネットワークになる、といったあたりのメリットも外せません。導入すれば今使っている有線ルーターと無線ルーターもいらなくなるでしょう。
ここ最近はノートマシンで必要なところで、さっと開いてネットワークに繋げ、いつでも自分の環境で作業できればいいかなと思うようになりました。 EMOBILE によってできる環境にもなりました。自分はある程度のスペックで快適にブラウジングや作業をしたいので興味はありませんが、これが今のネットブック躍進の秘訣なんでしょうね。
デスクトップも排除してケーブルも最低限ですむ生活空間にしていきたいものです。そして気がつけば Apple 製品に囲まれているという。
通勤時間のみで少しずつ読み始めてようやく一通り読み終えることができた。アジャイルといえることはこれまでやったことがないし、チーム開発といえるものもここしばらく行っていない人が思ったこと。
本書を読むとチームで一丸となって開発していくことが大事であることが伝わってくる。誰が実際に担当するかは分からない、つまり誰が担当になってもいいようにする。
開発担当は A さんだからといった感じで割り振ると、その人はその担当に関してはスペシャリストにはなるだろう。だけど A さんはプロジェクトで得た業務知識をチームに還元できるだろうか。プロジェクトで得た技術的知識を還元できるだろうか。トラブルが発生したときにその人以外で解決できるだろうか。みんなで助け合っていき、一緒に学んでいくことが大事なのではないかと思う。特定の人に任せて最速でできなくたっていいじゃない。これは請負で出向しているとなかなかできないことだったりすると思う。ノウハウを take できることを期待するのでなく give (というとなんだか偉そうだけど)して share していける環境がいい。これは今の職場で学んでいることでもある。これを一人で行うのでなく、周りも意識できないといけない。でも高望みしすぎてもいけない。
やり方のひとつの案として開発時はボードにタスクをぺたぺたと貼り付けて今日は僕これやります。前回楽しい仕事もらったので、今回はこれでいいですよ。この作業つまらないから誰々とやります。みたいな感じで自分だけでなくチームとしてモチベーションをあげていければ面白い気がする。ペアプログラミングなどは手法であって、こういった考えの延長線上にたまたまあるんだろうなあ。だから強要すべきものでもない。やってみてダメならダメな理由を考えて別のやり方をすればいい。
それから考え方としてただただしさんが言っていたように正直になること。自分も甘えた人間なので、ときにずるして多めの見積もりを言ってしまうこともある。お客さんに接する人なんかはもっと大変そう。
実際にやったことないから今はこんな漠然とした考えにしかまとまらないけど、そんなことを考えさせてくれた本。量も多く理解できていないので、しばらく経ってから読む機会をつくりたい。
まだ途中までしか読んでないですが
開発以外のことを知ろうとしないのはダメだよなあと分かっている部分を指摘され改めて反省です。
インデックスの概念がとてもわかりやすかったです。知らないオプションもあったり役立ちそうな、かゆいところが書かれていました。恐れ多くも、さすがプロジェクトリーダーの方が書いているなあと。本当使いこなせていないなあ。
業務開発では Subversion がしばらくメインになると思います。でも個人で Git は開発で使っていきたいです。ある機能(タスク)を実装するごとにブランチをローカルリポジトリにつくってコミットをかけられるのは大きなメリットです。
家のデスクトップ PC のハードウェアをごっそり売ることにしました。配送するため段ボールに詰めないといけなくなったわけですが、50x50x20 という大きさのケースを入れる段ボールが 1 つだけ欲しい。ネットで軽く調べてみるとセットで売られていたり、クロネコヤマトは単品では 60x40x40 と微妙にスペック不足。
購入するのももったいないし譲り受けに歩いて街へ繰り出すことに。コンビニ、スーパー、薬局に行ってみるものの該当のものがなく、気づけば片手に中華鍋が購入済み。用事が変わってる!
いったん家に戻り別の街へ出向きダイソー発見。ダメもとで店員の女の子に聞いてみると探しに行ってくれ、 10 分後段ボールを持ってきてくれました。 50x50 を目の前でメジャーを出して、大きさが合っていることを見せてくれる親切ぶり。無事段ボールを譲り受けることができました。
ダイソー++
そして可愛い店員さんありがとう!
sqlite ファイルがいくつかあり手動で vacuum と reindex を実行すること、拡張によって動的に sqlite ファイルが増えることから、スクリプトにガリガリ手動で登録することが面倒なのですべての sqlite ファイルに対して vacuum と reindex をするシェルスクリプトを書きました。
PROFILE_DIR には自分のプロファイルディレクトリのパスが入ります。また Firefox が起動中の場合、 Firefox が使用している一部の sqlite ファイルにはロックがかかっているためエラーになります。
#!/bin/sh PROFILE_DIR="/Users/xxxxxxxx/Library/Application Support/Firefox/Profiles/xxxxxxxx.default" files=`find "$PROFILE_DIR" -name '*.sqlite'` IFS=' ' for file in $files;do echo "execute $file" sqlite3 $file vacuum && sqlite3 $file reindex done
始めは find xargs のワンライナーで決めようと思ったのですが、 && のところをどう書けばいいのか分からなかったのでスクリプトに逃げました。 Mac もパスにスペースが見事に入っているためシェルの for のところで苦労しましたが、おかげで IFS 変数を理解しました。
[追記]
Firefox 終了時に最適化を実行する拡張がありました。
# 雷悶 [つ usssy ussssy]
# Ussy [RPG を途中で止めるパターンですね。分かります。 ところがどっこい ussy は私のものなのですよw Pytho..]