Hatena::ブログ(Diary)

Yet Another Hackadelic

2008-02-08 お腹すいてきた

FirefoxがOpenIDにネイティブサポート?

via: ブログが見つかりません

どうも現在はBugzillaで投票受付中って所みたいです。

このBugzillaでの投票結果がどれほどの効果があるのか分からないので実現可能性は何とも言えないんですが、将来的にはそうなっていくんでしょうね。

Yes their are AddOns already available but why an extra AddOn Now after MS is in the boat ... what will happen with IE 8/Vista? Native support of OpenID in Firefox

IE8でそうした機能を組み込んで来たら、、、って危惧があるんですかね。

本家Bugzillaでは、

Steps to Reproduce: 1. sure on a site with OpenID login support. Actual Results: No automatic login. Expected Results: automatic login. Bug 416359 – Native support of OpenID in Firefox

OpenIDでログイン出来るかどうか程度の機能じゃ、現在出回ってる拡張の足元にも及ばないんだけどなぁ。

既に信頼できないサイトの統計とかあるだろうに、それらを利用してそもそも危険なサイトへのアクセスその物に対してキャンセル出来たりだとかって機能が欲しい。

後は最近話題に出てた気がするけど、エンドユーザーから見たOpenID認証での最も怖い部分って恐らくリダイレクションだと思うんですよね。

フィッシングとかスプーフィングの手段もそこにあたかも本当かのように仕込む手法が存在してるから、その辺りをブラウザネイティブの機能で意図したリダイレクションとなってるかどうか確認してキャンセル出来るようにするとかがいいんじゃないすかねー。


ともあれ、ブラウザネイティブでサポートってのは相当現実味を帯びてきた話なんだと思います。

2007-12-26 サイボウズ・ラヴァー

Japanese Mozilla HackersなブログのフィードをOPML化

実は、ニッチJavaScriptブログと言う位置づけで、Ci.nsIZIGOROu - Mozilla 拡張機能勉強会と言うブログもやってる訳ですが、

最近こんなエントリを書きました。

で見かけたブクマコメントですが、id:tokuhiromさんが、

OPMLにしてほしい tokuhiromのクリップ - livedoor クリップ

と申していたのでOPML化してみました。

ご自由にお使い下さい。

でOPML化したときのスクリプト

なんかちまちま作るのはバカらしいので、こういうときはPerlで書かないと。

元の記事から本文っぽぃ部分にあるアンカーをモリっとXPathで取って来て、Feed Discoveryかけて〜ってな感じです。


#!/usr/bin/perl

use strict;
use warnings;

use DateTime;
use DateTime::Format::HTTP;
use URI;
use URI::Match;
use LWP::UserAgent;
use HTML::TreeBuilder::XPath;
use XML::Atom;
use XML::Feed;
use XML::Feed::RSS;
use XML::OPML;
use XML::Liberal;
use Encode;

$XML::Feed::RSS::PREFERRED_PARSER = "XML::RSS::LibXML";
$XML::Atom::ForceUnicode = 1;

my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://moz-addon.g.hatena.ne.jp/ZIGOROu/20071223/1198434207");
die unless ($res->is_success);

my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse_content($res->content);

my $nodes = $tree->findnodes('/descendant::div[@class="section"]/descendant::a[@target="_blank"]');
die if ($nodes->size == 0);

my $opml = XML::OPML->new(version => "1.1");
$opml->head(
    title => 'Mozilla Japanese Hackers OPML',
    dateCreated => 'Wed, 26 Dec 2007 06:25:38 GMT',
    dateModified => DateTime::Format::HTTP->format_datetime(DateTime->now),
    ownerEmail => "zigorou\x40cpan.org",
);

my %seen = ();

XML::Liberal->globally_override('LibXML');

for (my $i = 0; $i < $nodes->size; $i++) {
    my $node = $nodes->get_node($i);
    my $uri = URI->new($node->attr("href"));
    next if (exists $seen{$uri->as_string});
    $seen{$uri->as_string} = 1;

    next if ($uri->match_parts(host => qr/^(b\.hatena\.ne\.jp|twitter\.com)/));

    my @feeds = XML::Feed->find_feeds($uri);

    for my $feed_url (grep { $_->match_parts(scheme => qr/^https?$/) } map { URI->new($_) } @feeds) {
        next if ($feed_url->match_parts(path => qr/rss2$/));

        my $res = $ua->get($feed_url->as_string);
        next unless ($res->is_success);

        my $content = $res->content;

        my $feed = XML::Feed->parse(\$content);
        if (XML::Feed->errstr) {
            XML::Feed->error("");
            next;
        }

        $opml->add_outline(type => 'rss', version => 'RSS', title => $feed->title, description => $feed->description, htmlUrl => $feed->link, xmlUrl => $feed_url);
        last;
    }
}

print Encode::encode("utf-8", $opml->as_string);

多分にPlagger::FeedParserのソースを参考にしました。

と言うかもの凄くパクった。


あとURI::Match便利だゎー。dmaki++

駄文

最近Perl界隈ではNEXT問題が取りざたされてるけど、Mozilla界隈もblog間でそういう技術的な意見交換とかあっていいと思った。とか思ってめぼしいMozillaな人々のブログを抽出してまずは日の目に当たる状況に〜なんて言うのがバックエンドにあったりなかったり。

やっぱり技術的な面であれこれ意見交換してかないとコミュニティ全体のレベルが上がらないんじゃないかとか思ってみたりみなかったり。

ちなみに僕はNEXTもC3も嫌いです。でCatalystやDBICのプラグイン機構で継承順意識するなんてバカらし過ぎる。

2007-09-01 感動した

だいぶ遅くなったけどMozReplについてのプレゼン資料を今更公開してみる

そういえば前にSoozy Conference #2でやったプレゼン資料を公開してなかったので、今日リクエストもあったので公開してみるです。

資料

MozReplの実際の拡張例

ここら辺から漁ってくだしあ。

とにかくMozReplはむちゃくちゃ便利。拡張作る人は知らないとダメだお。

あとnsIInterfaceInfo辺りから、オンラインドキュメント漁らなくてもAPIの概観だけは掴むみたいな処理をいつか書きたいんだけど、チャレンジしてくれる人が居たらそれはそれで嬉しいです。

ご一報下さい。(ぇ

第六回Mozilla拡張機能勉強会まとめ

と言う訳で

本日、第六回Mozilla拡張機能勉強会が行われたので、折角メモを取ったので書いてみるです。

ちなみに寝坊しましたので、メインの話は半分くらいしか聞けてないですw

あと、割と飲んでたのでその辺りを勘案して巧みにスルー力を発揮して読んでいただけると幸いです。

Web系の人はみんな遅刻したです。

遅刻者一覧

特にながやまんの遅刻は本当に酷かった。

題目

http://wiki.mozilla.gr.jp/wiki.cgi?page=%C2%E8%CF%BB%B2%F3Mozilla%B3%C8%C4%A5%B5%A1%C7%BD%CA%D9%B6%AF%B2%F1

Firemacs (山本さん)

grep, find, Google

基本はMozillaのソースをgrep, findしまくって、後はググって作った。

うん、素晴らしい。

C-sの検索

Firefoxの左下に検索のエリアが出るけど、その検索をC-sでやりたい。

その検索に入る際にstatusに文言を出したい。(I-searchみたいなの)

普通なら、

window.status = "I-search";

みたいに出来るけど拡張の世界じゃ出来ないので、代替手段として、

document.getElementById("statusbar-display").label = "I-search";

こんな感じでやる。

とりあえず、デフォのFirefoxでid属性がついてる主要な要素のまとめとか多分どこかにあると思うけど、どう考えてもBK以外の何者でもない。

commandに対する引数の話

commandってのがあるんだけど、これって引数が渡せない。

そこで、nsICommandController, nsICommandParamsを使う。

isCommandEnable()で指定したコマンドが実行可能かどうかが分かる。

検索の部分

gFindBarで取れる。ってかgなんちゃらって大杉無いか?w

repl> repl.search(/^g[A-Z]/, window);                                                                                                  
gNavigatorBundle
gCZPanMouseY
gCZPanMouseX
gCZStatusBarFormat
gCZEyedropperLaunchTimerID
gCZSavedStatus
gShorcutKeyName
gCZPrevSelectedY
gCZPrevSelectedX
gCZSelectedElementBackupStyle
gCZSelectedClientY
gCZSelectedClientX
gCZSelectedElement
gCZSelectedY
gCZSelectedX
gCZLastStatusValue
gCZSelectedColor
gCZComponent
gCZIOUtils
gCZCustomPaletteUI
gCZClickListener
gCZPref
gCZPrefService
gYBLoginWindow
gYBObservService
gYB_loadFavIconOld
gYB_loadFavIconNew
gYB_saveIcon
gYB_getMimeType
gYB_b64
gYB_rscIcon
gYB_rdfs
gYB_bms
gYBXUL_NS
gYBrscBundleRoot
gYBrscBundleValue
gYBrscBundle
gYBrscLastVisitDate
gYBrscVisitCount
gYBrscTag
gYBrscTagValue
gYBrscUrl
gYBrscGenTitle
gYBrscName
gYBRdfService
gJavaConsole1_6_0_02
gOrigName
gCancelLabel
gSavedName
gHideElmParam
gThisWinClosedtabs
gThisWinTabs
gThisWin
gSessionPath
gRDFRoot
gBackupLabel
gTab
gFirefox2DefaultTheme
gSingleWindowMode
gTabbarPosition
gObserver
gURIFixer
gWindowManager
gIOService
gAutoReloadDialogAccepted
gChromeDir
gIsPlaces
gIsFirefox2
gIsOldBrowser
gPref
gViewSourceUtils
gMissingPluginInstaller
gWebPanelURI
gHomeButton
gXPInstallObserver
gPopupBlockerObserver
gSessionHistoryObserver
gGoButtonPrefListener
gAutoHideTabbarPrefListener
gURLBarAutoFillPrefListener
gSanitizeListener
gChromeState
gContextMenu
gSidebarCommand
gBrowser
gPrefService
gProgressCollapseTimer
gProgressMeterPanel
gMustLoadSidebar
gClickSelectsAll
gHaveUpdatedToolbarState
gLastValidURL
gLastValidURLStr
gIsLoadingBlank
gProxyDeck
gProxyFavIcon
gProxyButton
gURLBarContainer
gURLBar
gPrevCharset
gLastBrowserCharset
gCharsetMenu
gPageStyleButton
gURIFixup
gGlobalHistory
gRDF
gBrowserGlue
gBkmkTxnSvc
gBmProperties
gNC_NS_CMD
gXUL_NS
gRDF_NS
gWEB_NS
gNC_NS
gBidiUI
gSavePrintSettings
gPrintSettingsAreGlobal
gFindBar
gTraceOnAssert

とりあえず僕の実行結果。

あと検索フィールド自体は、

document.getElementById("find-field");

って事でid属性としてfind-fieldを指定すれば取れる。

キーイベントの奪い方

Firemacsで一番面白い話。

eventの奪い方

captureフェーズで奪って、stopPropergation(), preventDefatult()でOK

accesskeyで割り当てられてる場合

accesskey属性を持っている要素からaccesskey属性を消せばOKかと思いきやそれでは駄目。

要素ごと差し替えが必要なので、

  • accesskey属性を持つ要素を抽出
  • removeAttribute("accessskey")
  • cloneNode()して、親からreplaceChild()すると指し換わる

と言う手段をとる。

キー割り当てとpreference

この辺りはPiroたんが詳しく解説してくれる予定。

nsIPrefBranch辺りを上手く使えばスマートに書ける。

XULRunner - WidgetRunnerの紹介 (id:smellman)

組長の発表。20after4って人がWidgetRunnerってのを作ってる件。

多分ここらへん。

  • Extension Managerを再利用してる
  • まだ不安定

なんだけど、ガジェットのランタイムのようにして使えるところは凄い注目。

XULRunner系だとSSB(Site Specific Browser)としてWebRunnerが最も注目されてる。

設定ファイルは標準で入ってて、.webappって拡張子である。

大体内容はiniファイルっぽぃ感じ。

Google Calendarとかの設定ファイルとかあるんで、内容見てとりあえず感覚は掴むべし。

でダウンロード出来るお。

XUL preLoader (by mar’s)

overlayするときにid属性が振られていない要素があったらどうする?と言う話。

普通ならchrome.manifestで指定したxulでoverlayしたい要素をつらつら書くんだけど、

そうじゃない場合はjsで制御する。

でもjsで書いた途端、イリーガルな処理になって萎える。

それpreLoaderで出来るよ。

ざっくり言えばchrome.manifestで指定するファイルをpreLoader.xulにして、

その中でoverlayしたい要素とか一切書かずに、jsだけ書く。

そこで本来overlayしたい要素にidつけてから、jsでloadOverlay()して、本来chrome.manifestからoverlayしたいxulを指定して終了。

って説明で大体分かる?w

  • Flash Trace
  • Inspector Widget
  • Help Viewer

辺りの話も興味深かった。

後で調べる。

まとめ

凄い面白かった。特にFiremacsの内容はとても初心者向けだったし、

山本さんの苦心の程は伺い知れて良かったです。

あとid:nagayamaがMozillaの何かで協力してくれるらしい。

もっとノウハウは共有しなきゃですな。

あと飲み会も面白かったし、会いたい人にも会えた。

飲み会で周りがドン引きするぐらい、Piroたんと話したんだけど、その内容は濃かった。

成果は追々出る予定でございます。

まったくまとまってないけど気にしない。

2007-08-02

新しいMozilla拡張機能勉強会に参加しよー!

ちょっと前に色々あって、仕切りなおし中のもじら組主催の拡張機能勉強会ですが、組長(id:smellman)主導で少しずつオープンな場で新しい勉強会の形を模索していらっしゃいます。

自分自身そうだったんですが、やる前はMozillaの拡張って難しいんじゃないのーみたいな感じだし、情報は実は結構あるはあるんだけどなかなかその情報を見つけるのが大変だったり、残念ながらブラウザのソース嫁くらいの勢いだったりして敷居が高い事もあるはあるんだけど、やってみると楽しいし、普段使ってるFirefoxを舞台にあれこれ出来るし、まぁ調べていけば分かると思うけど全然違う事も出来たりする訳ですわ。

(中略)

で、Mozilla拡張機能勉強会は今後下記のリンク辺り*1でお話が進んで行くんで、みんなもっと参加するといいんじゃないかなーって思います。

ML
http://www.mozilla.gr.jp/info/ml/
wiki
http://wiki.mozilla.gr.jp/wiki.cgi?page=Mozilla%B3%C8%C4%A5%B5%A1%C7%BD%CA%D9%B6%AF%B2%F1
blogとかスケジュールとか
http://moz-addon.g.hatena.ne.jp/
mixiのコミュ
http://mixi.jp/view_community.pl?id=1924389

個人的には今までShibuya系のイベントに出る事が多かったけど、技術を熱心にやってらっしゃるってのはMozilla系の人も本当に凄いなって思います。

実際、良くはてブで挙がってくるCSS絡みとかAjaxで云々とか、Mozilla系の人ってとうの昔からやってた人が多いから、最初の敷居は高いかもですが、参加してメリットはあると思います。

*1:組長が書いた奴、もろパクリです。すみませんw

2007-07-30 食生活を改善したい!

mozIJSSubScriptLoaderを使って現在の実行コンテキストに外部ファイルを読み込ませる

まぁこれ、識者の間ではどうも当たり前の模様です。

mozIJSSubScriptLoaderを使う

var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader);
loader.loadSubScript(url, ctx);

とするとctxオブジェクトにwithした状態と同等で外部のソースを引っ張る事が出来ます。

ctxを省略すると、現在のコンテキストになります。

サンプル

/home/zigorou/Foo.jsなどに、

var Foo = function() {};
Foo.prototype = {
  name: function() { alert("ZIGOROu"); }
};

/home/zigorou/FooSubScript.jsなどに

function url() {
  alert("http://d.hatena.ne.jp/ZIGOROu/");
}

などとして、

loader.loadSubScript("file:///home/zigorou/Foo.js");
loader.loadSubScript("file:///home/zigorou/FooSubScript.js", Foo.prototype);

なんてやるとprototype拡張を行う事が出来ます。Foo.prototype.toSource()などで確認してみて下さい。prototypeにurlと言うfunctionが追加されているはずです。

何がメリットか

  • XPCOMをJSで作る際のデバッグのしやすさ(単発で記述して単発でテストとか出来そう)
  • ファイルの肥大化を防ぐ

とかですかね。

参考リンク