たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
Second Search更新した。Firefox 3(Beta3)とThunderbird 2に対応。
Thunderbird対応にあたって、全体的にコードに手を入れた。Firefoxだけでしか使わない部分とThunderbirdでしか使わない部分と両方で使う部分の3つにファイルを分割している。似たような構造の物に対してはこれで比較的楽に対応できるようになったんじゃないかと思う。
Firefox 3については、Placesへの対応がメイン。キーワードを設定されたブックマークを検索エンジンと同等に扱うという機能がSecond Searchにはあるんだけど、僕以外にどれだけの人が使ってるんだろう。
あと、「他の検索エンジン」サブメニューのあたりのコードもだいぶ書き直した。この辺はほんとは特に触る予定はなかったんだけど、Organize Search Enginesとの競合の解消も兼ねて、なるべく汎用的になるように変更している。っていうかテストしててなーんかうまく動かないなーと思って不思議だったんだけど、よく調べてみたらOSEの側にSecond Search用のハックが入っててそれが干渉していた。僕のアドオンのためにわざわざハック用のコードを書いてくれるなんて……よくあんなスパゲッティもスパゲッティなコードを解読してくれたもんだなぁ……と嬉しく思ったりもしたけど、このままだとせっかく修正したのがきちんと動いてくれないので、動くようにするパッチを作者の人に送りつけてみたり。
NSISは調べてみると結構色んな事ができそうではあるんだけど、日本語で解説された資料ってのが全然見つからないし、機能の詳しい使い方の説明も不足してたりして、マジ困る。仕方ないからFirefoxのインストーラで実際に使われてる物のソースを見たりなんかして。
いや、ロジックを丸パクリしたかったんじゃなくて、もっとささやかな話で、MUI(Modern User Interface、インストーラのウィザード形式の画面を提供するライブラリ)でMUI_PAGE_CUSTOMFUNCTION_PREを使って特定のページを条件次第でスキップするにあたって、ヘルプには「そういうこともできる」としか書かれてなくて実際のやり方が載ってなかったから、それを調べたかったんですよ。
Railsの案件で、Rails自体の詳細な挙動が分からなくて困ってた時も結局須藤さんには「Railsのソースを読め」と言われてしまったし。ドキュメントが不足してて困るって話と、ソースが読めれば資料になるからオープンソース万歳!って話と、そんなだからドキュメントを敢えて作る気にならなくてドキュメント不足が余計に加速されちゃうんだよって話と、色々混ざっててスッキリしない。
ちなみに調査結果としては、MUI_PAGE_CUSTOMFUNCTION_PREで指定したコールバック関数でAbortすればそのページはスキップされるようになる、ということだった。
NSIS(Nullsoft Scriptable Install System)というものがあって、元々はWinampのインストーラを作るために使われてたらしいんだけど、これを使うとCとかVBとかDelphiとか分からなくても(簡単なものなら)Windows用のネイティブアプリケーションを作れる。まあ元々インストーラ作成用に作られたものだから、インストーラじゃないものを作るのは大変なんだけど。有名どころではPortable Firefoxの正体がNSISだったりする(大まかな処理の流れを紐解くと、USBメモリに置いたFirefoxの実行ファイル群とプロファイルをテンポラリフォルダにコピーして、起動オプション付きで起動することで強制的にそのプロファイルで起動し、Firefoxが終了したらプロファイルに行われた変更をUSBメモリに書き戻す、という感じ)。あとFirefoxのWindows版インストーラもNSIS製。
しかし厄介なことに制御構文がGoToっぽいものばっかりで、if/then/elseで複数行のブロックに分岐するといったことすらできないから、とかちょっと凝ったことをしようとすると、いつの時代のプログラムだよ!!と言いたくなるようなワケの分からん読みにくいスクリプトになってしまう。
Var MYVAR
StrCpy $MYVAR "ほげほげ"
; 第1引数が第2引数と等しければ第3引数で示された行へ、異なれば第4引数で示された行へ。
StrCmp "$MYVAR" "" "" NOT_BLANK
StrCpy $MYVAR "空ですよ"
GoTo EXIT
NOT_BLANK:
StrCpy $MYVAR "空じゃないですよ"
EXIT:
これはマジで死ねる。
……と思ってたんだけど、ヘルプをよくよく読むと、LogicLibという標準ライブラリを使えばもーちょっとマシな制御ができるようになるとあったので早速試してみた。
!include 'LogicLib.nsh'
...
StrCpy $MYVAR "ほげほげ"
${If} "$MYVAR" == ""
StrCpy $MYVAR "空ですよ"
${Else}
StrCpy $MYVAR "空じゃないですよ"
${EndIf}
うわ、これ超便利。NSISが一気に実用的になった!!! ちなみにswitch/caseとかwhile/for/do系のループとかもあります。
ということに感動して昨日はウッカリ深夜までNSIS漬けになってしまいました。
nsIMsgDBHdrとnsIMsgFolderからメールの本文を文字列として取得する方法をあれこれ試してみてこんな感じのところに辿り着きましたとさ。
あのBug 322367「Bring back the Firefox Plush Toy(Firefoxぬいぐるみ復活希望)」が、ついにFIXEDになりました!!! コメントによると、北米専用ショップではすでに購入可能で、海外発送可能なインターナショナルショップの方でもじきに注文できるようになるんだそーです。
イギリスから個人輸入したり、哀さんに協力してもらって共同購入したりと色々ありましたが、これで誰でも気軽に手に入れられるようになる……のかな?
mozIStorageConnectionのcreateFunctionメソッドを使うとユーザ定義関数を作れるそうなんだけど、Firefox 2だとユーザ定義関数から値を返せない(返り値が常にNULLになる)。値を返せるようになるのはFirefox 3からだそうな。
const DirectoryService = Components
.classes['@mozilla.org/file/directory_service;1']
.getService(Components.interfaces.nsIProperties);
var file = DirectoryService.get('ProfD', Components.interfaces.nsIFile);
file.append('mydatabase.sqlite');
var storageService = Components
.classes['@mozilla.org/storage/service;1']
.getService(Components.interfaces.mozIStorageService);
var dbcon = storageService.openDatabase(file);
// mozIStorageFunctionインターフェースを備えたオブジェクト
var func = {
onFunctionCall : function(aArgs) {
// 渡ってくるのはmozIStorageValueArrayのオブジェクト
var data = aArgs.getString(0);
var pattern = aArgs.getString(1);
return data.match(new RegExp(pattern)) ? true : false ;
}
};
// 引数の個数を「-1」にすると可変長引数の関数になる
dbcon.createFunction('match', -1, func);
var extracted = [];
var statement = dbcon.createStatement(
'SELECT * FROM mytable WHERE match(data_column, ?1)'
);
statement.bindStringParameter(0, '^foobar');
try {
while (statement.executeStep())
{
extracted.push(statement.getString(0));
}
}
catch(e) {
}
statement.reset();
alert(extracted.length); // 0
こんなの何に使えばいいんだ?
まあどうせPlacesはFirefox 3からだし、正規表現でのマッチングをやる必要が出てくるのはそれからだと思うんだけど。でもこのコードのようにJavaScript製ユーザ定義関数でマッチングするんだったら、結局は全ての行に対して処理が行われるわけで、それだったら先に全ての行を取り出してからループ回してマッチングするのと、処理速度的には全然変わらないよね……ほんと無意味。標準の関数で正規表現が使えればいいのになあ。
農家で食べてるホウレン草のおひたしはゆで時間20秒……ていうか普通でも1分とかそれくらいなんですか。こんなにゆで時間短くてよいとは知らなかった こっちに来てすぐの頃にやってみたときは何も分からず適当に5分とか茹でてホウレン草ペーストになってしまったんだけど、そりゃペーストにもなるわ。それ以来同じ失敗をするのが怖くて一度もやらなかった。
20秒は怖かったので1分近くやってみたところ十分へなへなになった。次は20秒でやってみようか。幸い削り節はまだまだあるし……
というわけで、独り暮らしを始めてもう2年が過ぎようとした頃にようやくホウレン草のおひたしの作り方を覚えましたとさ。
検索を開始したタイミングでヘッダ情報を一気に収集するという現状の仕様だと、フォルダ内に数千件とかメールが溜まってる人はまず間違いなく死亡するので、フォルダの内容を表示したタイミングでバックグラウンドでちまちまとヘッダ情報を収集するようにして、ついでに、その収集結果をMozStorageで保存するようにしてみてるんだけど。
今の所、一つのフォルダにつき一つのレコードとして、「Subjectだけ集めたもの」「Toだけ集めたもの」のような文字列をそれぞれフィールドに保存してるんだけど、これもあんまりでっかくなりすぎるとまずいですよねえ多分。仮にSubjectが10文字のメールが1000件あったとすると、20~40KBとかそれくらいになるのかな? 3000件もあれば100KBはいってもおかしくない。これって大丈夫なんだろうか。
えーと。SQLiteの制限事項によると、SQLiteデフォルトでの文字列の最大長は1ビリオン(1000000000)バイト……えーと、だいたい1GBくらい? Firefoxのソースツリーを検索してもSQLITE_MAX_LENGTHという文字列は登場しないようなので(というのは全然根拠にならんのだけど)、このデフォルト値のまんまなんだとしたら、パフォーマンスはさておきとりあえずこのままでも動くことは動くのかな?
というか別にSQLite使う必要は必ずしもないんですけどね。なんとなく最近無駄に多用する癖が……
Hello, thank you for your mail.
The only problem now is the new version, the old one for Firefox 1.5 is a lot better and right now I prefer having Firefox 1.5 with your old extension instead of using the new one.
Have you thought of making the same as for 1.5? If not, will you do it?
Currently I have no plan to develop an extension same as TBE on Fx 1.5. I suffered from too many bugs which are from options I didn't use, so, I decided to keep developing "TBE3" only on features I really need.
Because I was a student and I had a lot of off-time, I could develop huge software like old TBE. But now I'm one of working people. There is less time and motivation.
Now there are nice projects, Tab Mix Plus and Tab Kit, suites of tabbed browsing features. And, userChrome.js is also available to make people's small requirements reality. Lots of people develop user-scripts for the extension on MozillaZine forum. I hope communities of those extensions help you.
regards,
先日買った鴉のサントラには第1話エンディングのセレナイト(ルルティア)が収録されてなかったので、これだけiTunes Storeで買ってみたんだけど。
「ルルティア」で検索した後「このアーティストの曲を全て見る」で全曲一覧を表示したら「セレナイト」がアルバム「ミーム」収録版とシングル「プライマリーEP」収録版の2つあって、再生時間も同じだしどっち買っても同じだと思ってなにげなくアルバムの方を買ったんだけど、後からなにげなくそれぞれのアルバムの情報を見てみたら、アルバム版の方は普通の楽曲データなんだけど、シングル版の方はiTunes Plus(DRMかかってなくてコピー数などの制限がなく、ビットレートも通常の128kbpsに比べて256kbpsで高音質)だった……決済まで済ませた後で気がついたからもう手遅れだよ
とぴあさん曰く「ちゃんと表示されるよ?」とのことだったので検証してみた所、どうやら一部のアーティストでだけこの現象が起こっているようだ。全曲がiTunes Plusの人(「宇多田ヒカル」など)も、Plusとそうでない曲が混ざってる人(「John Coltrane」など)も、ちゃんと表示されるものはされてるようだし。
こういう苦情ってどこに言えばいいんでしょう。