« 2008年1月 | トップページ | 2008年3月 »

2008年2月の10件の投稿

2008/02/26

Google Ajax Feed API の代わりに Yahoo!Pipesを使ってみた

Google Ajax Feed API はまだ不安定?』で記事にした問題をなんとかしたいとちょっと調べてみたところ、どうやら『Yahoo!Pipes』なるサービスを使えば打開出来そうに思えたので、試してみました。
指定したURLに関するソーシャルブックマークのコメントをまとめて取得するAPIをYahoo! Pipesで作った(管理人日記) - むぅもぉ.jp
という、はてブぽっぷはてブニコすの要求にぴったり合った記事を見つけたので、ほぼそのまんま参考にさせていただいて、適当にフィルタ作成&JSONPでコールバック指定して……あら、見よう見まねでもちゃんと動くものができちゃいましたよ。
はてブぽっぷはver.0.01f、はてブニコすはver.0.0.2fでそれぞれ対応。
Google Ajax Feed APIのときはダメだった、はてなやGoogleのトップページでも問題無く取得出来ているようです。すばらしい!>Yahoo!Pipes。
ちなみに、一番時間がかかったのは(米国の)Yahoo!ID取得だったり(苦笑)。いや、Sign Upしようとしても、なぜか米Yahoo!のトップページに飛んでしまう、という謎の現象にしばらく悩まされ……ふと思いついて、Norton Internet Securityを一時的に切ったら出来たのでした orz。

2008/02/24

Google Ajax Feed API はまだ不安定?

最近になってGoogle Ajax Feed APIを使ったツールをいくつか作ってみて気がついたのですが、どうも取得される結果が不安定な気がしています。
取得出来る最大エントリ数が250というのはしょうがないとして、例えば、Feed URIとして
http://b.hatena.ne.jp/entry/rss/http://www.google.co.jp/
を指定した場合には、『400(Feed could not be loaded.)』エラーが発生してしまいますし、また、
http://b.hatena.ne.jp/entry/rss/http://www.hatena.ne.jp/
を指定すると、エラーは発生しないのですが、得られるエントリー数が0になってしまいます。
それに、同一のFeedであっても、正常に結果が取得出来るときもあればエラーとなったりエントリ数が正常にとれない(0が返る)こともあったりして、その面でも安定性がイマイチのような(サーバやネットワーク負荷とかの関係もあるのかな?)。
まだ改善の余地が有るってことなんですかね?
もっとも、はてなが吐くFeed自体に問題がある可能性等もないではないですが。そこまで詳細には調査出来ていません。
とりあえず、
はてブコメントが飛び出す!『はてブぽっぷ』(ブックマークレット/Greasemonkey/SeaHorse)
では、はてブコメントがあるにも関らず何も表示されないという状態を避けるため、明らかに↑に書いたような不具合と思われる現象が発生した場合、"Error"を表示するように細工しておきました(ver.0.01e)。

2008/02/23

『はてブフィルタ』-Googleの検索結果をはてブでフィルタリングする(ブックマークレット/Greasemonkey/SeaHorse)

Googleの検索結果のうち、はてなブックマークされているものだけをフィルタリングするブックマークレット/Greasemonkey/SeaHorseを作成してみました。
■実行イメージ
  • フィルタオフ

    Hbfilteroff

  • フィルタオン

    Hbfilteron

■ブックマークレット
ブックマークレットの登録方法等はこちら→【Web】ブックマークレットのブラウザ毎の登録方法
■Greasemonkey&SeaHorse
Seahorseの使い方については、例えばこちらとかこちら。 Greasemonkeyの使い方については、例えばこちら
上部に表示される[HatenaBookmark::Filter ... ]部分をクリックすることでフィルタのオン/オフ切替が出来ます。
Cookieが有効であれば、フィルタのオン/オフを記憶し、次回検索時には記憶したモードがデフォルトになります。
元ネタは、
はてなブックマークがヤフーやGoogleと戦う日?
 ところが、今更ながらに気づいたのですが、はてなブックマークで検索すれば、そもそも誰かがブックマークした記事しかデータベースに存在しないわけで。  最初から、誰かが価値があると認めた記事、ある程度価値のある可能性の高い記事が必ず検索でひっかかることになります。
 そう考えると、日本のソーシャルブックマークのデフォルトになりつつあるはてなブックマークが、将来GoogleやYahoo!などの検索エンジンと競合するのを想像しても、おかしくないような気がしてくるのは私だけでしょうか?
ですが、戦うのではなく、協力させてみたわけです(笑)。
ただ、いかんせん、はてなブックマークがあるかどうかを画像を取得して(ブックマーク数を画像で取得するAPI参照)、その横幅が1より大きいかどうかで判別しているため、ブックマーク数順に並べ替えたりとか閾値を設定したりとかの細かい制御が出来ない点が問題です(画像の横幅である程度は出来るかもですが)。
【追記】
35ピクセル→1 user
41ピクセル→2 users~9 users
48ピクセル→10 users~99 users
55ピクセル→100 users~999 users
なのかな?→とりあえず、1 user は表示対象から外してみました(ver.0.01c)。
はてなブックマーク件数取得APIはてなexist API相当機能をJSONPで提供してくれたりしないかな……。

【2008/02/29追記】
とっくの昔に提供されていたようです(笑)。
はてなブックマークエントリー情報取得APIとは - はてなダイアリー

はてブコメントが飛び出す!『はてブぽっぷ』(ブックマークレット/Greasemonkey/SeaHorse)

ちょっと変わリ種のはてブコメントビューアを作成してみました。名付けて『はてブぽっぷ』。
GreasemonkeyかSeaHorseの導入、もしくはブックマークレットの実行で、現在みているページにはてブコメント(文字の入ったもの)が付いていれば、右下にカウンタ付きのはてなマークが現われます。
これをクリックするたび、最新のものから順に、コメントが飛び出します。
コメントが下まで落ちてきたら、小さなアイコン並びに変わります。
このアイコンは、マウスオーバで当該コメント表示、クリックでマークした人のはてブページを開きます。
先日の『はてブニコす』があまりにあれだったので(笑)、ちょっとは使えそうなのを、と思ったのですが……五十歩百歩?
■実行イメージ

Hbpopsample1

Hbpopsample2

■ブックマークレット
ブックマークレットの登録方法等はこちら→【Web】ブックマークレットのブラウザ毎の登録方法
■Greasemonkey&SeaHorse
Seahorseの使い方については、例えばこちらとかこちら。 Greasemonkeyの使い方については、例えばこちら

2008/02/19

はてブコメントをニコニコ動画っぽく表示する『はてブニコす』のマイナーアップデート

■実行イメージ

Nicosbmsample2

  1. アイコンを表示してみた。
  2. コメントの長さによって文字の大きさを変えてみた。
  3. カオス感はそのままに、なるべく視認&クリックも出来るように、ずらし方を変えてみた。
  4. 一度に表示するコメント数減らす代わり、スクロールで画面から消えたら入れ替えるように修正。
  5. (文付きの)コメント数も「[total]~comments」の形でスクロール表示するようにした。
    あ、そうそう、Google Ajax Feed APIって、最大250件までしか取れないんですね、setNumEntries()しても。ちょっと物足りないかな。
って、我ながらなにやってんだ orz。

2008/02/17

【JavaScript】外部スクリプト化<オブジェクトをキーに出来るハッシュのようなもの

風柳亭 - 別館:書庫のある庵 -: 【JavaScript】オブジェクトをキーに出来るハッシュのようなもの……って、これじゃだめ?のObject.associativeArrayを外部ファイル化して、↓に置いておきました。
Object.associativeArray
使用・改変等はご自由に。コメント等ありましたらお知らせください。
先の記事を書いた後で発見した、
404 Blog Not Found:perl|javascript - 文字列じゃないhash key
で書かれているテスト方法でのテスト結果は→こちら
わざわざ書くのは、このテストやっているとき、上書き時のバグを見つけたから(笑)。
ついでに、こちらベンチマークにも上記参照先の手法(リニアサーチ)を追加。

はてブコメントをニコニコ動画っぽく表示するブックマークレット/Greasemonkey/SeaHorse

見ているページにはてなブックマークのコメントがついていた場合、それをニコニコ動画風に表示してみるという(ある意味ネタ的な(^^;))ブックマークレット/Greasemonkey/SeaHorseスクリプトを作ってみました。
2008/02/19、『はてブニコす』と命名。……ベタベタだ。だが、それでいい。
■実行イメージ

Nicosbmsample

誰か既に作ってそうだなぁ……。
■ブックマークレット
ブックマークレットの登録方法等はこちら→【Web】ブックマークレットのブラウザ毎の登録方法
■Greasemonkey&SeaHorse
Seahorseの使い方については、例えばこちらとかこちら。 Greasemonkeyの使い方については、例えばこちら
表示を止めたい場合には、適当なコメントをクリックします。
また、"[Shift]+コメントのクリック"で、該当コメントを付けたユーザのブックマークページが開きます。
以下、個人的な覚書。
  • はてブコメントの取得には、Google AJAX Feed APIを使用。
  • スクロール表示には、最初は手を抜いてmarqueeを使おうとしたが、JavaScriptであとから作った要素の場合はFirefoxでは表示されない問題あり。仕方ないので、setInterval()使って適当にでっち上げ。
  • 【追記】付いているコメントを全部表示すると弾幕もいいところなので、
    • コメント本文(result.feed.entries[x].content)がないものはスキップ。
    • 最大50件まで(……まぁ、これでも充分弾幕という話も)。
  • 【追記】書き忘れてましたが、元ネタは『にっこにこAAツール』(『小粋空間: Amazon の画像リンクをニコニコ動画っぽく表示する「にっこにこAAツール」』経由)
  • 【追記】調べてみたら、『はてブTV』なるサービスもあるのですね。ふーむ、よくこんなの思いつくなぁ。
  • 【追記】その後さらに見つけたページ→『Big Sky :: はてブでアーーーーッ!!!』。やはり似たようなことを思いつく方はいらっしゃるようですね。

2008/02/15

【JavaScript】ベンチをとってみる<オブジェクトをキーに出来るハッシュのようなもの

ベンチマーク
var count=prompt('試行:キーの数は?',500);

(function(){

print('<a href="http://d.hatena.ne.jp/amachang/20080212/1202805356">すべてのオブジェクトをキーにできるハッシュの様なもの - IT戦記</a>の方法\n');

var dict = new Dictionary();

var keyno=0,keys=[],val;

print('SET '+count+' 回: '+bench(count,function(){
    keys[keyno]=new Function('print('+keyno+')');
    dict(keys[keyno],keyno++);
})+'ms<br />');

print('GET(0) '+count+' 回: '+bench(count,function(){
    val=dict(keys[0]);
})+'ms');
print('※dict('+keys[0].toString()+')='+val+'<br />');

var mid=~~(keyno/2)-1;
print('GET('+mid+') '+count+' 回: '+bench(count,function(){
    val=dict(keys[mid]);
})+'ms');
print('※dict('+keys[mid].toString()+')='+val+'<br />');

print('GET('+(keyno-1)+') '+count+' 回: '+bench(count,function(){
    val=dict(keys[keyno-1]);
})+'ms');
print('※dict('+keys[keyno-1].toString()+')='+val+'<br />');

})();

print('');

(function(){

print('<a href="https://furyu.tea-nifty.com/annex/2008/02/javascript_bc80.html">風柳亭 - 別館:書庫のある庵 -: 【JavaScript】オブジェクトをキーに出来るハッシュのようなもの……って、これじゃだめ?</a>の方法\n');

var assoca = new Object.associativeArray();

var keyno=0,keys=[],val;

print('SET '+count+' 回: '+bench(count,function(){
    keys[keyno]=new Function('print('+keyno+')');
    assoca.set(keys[keyno],keyno++);
})+'ms<br />');

print('GET(0) '+count+' 回: '+bench(count,function(){
    val=assoca.get(keys[0]);
})+'ms');
print('※assoca.get('+keys[0].toString()+')='+val+'<br />');

var mid=~~(keyno/2)-1;
print('GET('+mid+') '+count+' 回: '+bench(count,function(){
    val=assoca.get(keys[mid]);
})+'ms');
print('※assoca.get('+keys[mid].toString()+')='+val+'<br />');

print('GET('+(keyno-1)+') '+count+' 回: '+bench(count,function(){
    val=assoca.get(keys[keyno-1]);
})+'ms');
print('※assoca.get('+keys[keyno-1].toString()+')='+val+'<br />');

})();
■結果
すべてのオブジェクトをキーにできるハッシュの様なもの - IT戦記の方法
SET 500 回: 594ms

GET(0) 500 回: 1250ms
※dict(function anonymous() { print(0) })=0

GET(249) 500 回: 547ms
※dict(function anonymous() { print(249) })=249

GET(499) 500 回: 0ms
※dict(function anonymous() { print(499) })=499


風柳亭 - 別館:書庫のある庵 -: 【JavaScript】オブジェクトをキーに出来るハッシュのようなもの……って、これじゃだめ?の方法
SET 500 回: 47ms

GET(0) 500 回: 0ms
※assoca.get(function anonymous() { print(0) })=0

GET(249) 500 回: 16ms
※assoca.get(function anonymous() { print(249) })=249

GET(499) 500 回: 0ms
※assoca.get(function anonymous() { print(499) })=499

上記は、IE7での結果です。
ある意味、当たり前の結果に。
ちなみに amachang 氏の方だと、Firefox 2.0.0.12(+Firebug)で試行回数を1000にしたら"too much recursion"エラー発生。
999回だと発生しない……なに、この意図的な数字(苦笑)。

2008/02/13

【JavaScript】オブジェクトをキーに出来るハッシュのようなもの……って、これじゃだめ?

すべてのオブジェクトをキーにできるハッシュの様なもの - IT戦記を見て。
どうやったら効率的なものを書けるだろうか
単純に、こんなのじゃだめでしょうか?
キーになるオブジェクトを汚しているけど(w

■[2008/02/14]
for (name in key)とすると、想定外の余計なものまでとれてしまうのはやはりちとまずいように思えたので、keyの直下ではなく、key.toString下にvalueを生やす方向で修正。
もちろん、for (name in key.toString)ってやったり、key.toStringを途中で置換したりとかするとまずいわけですが(keyオブジェクトの生成直後に置換するぶんには問題無し)、まぁ、あんましやらないかと(^^;)。

ん~、toString()を置き換えると、DontEnum属性が外れて、for (name in key)でひっかかるようになっちゃうのか(IEを除く)……まぁ、仕方ないよね(ヲ。

■[2008/02/17]
上書き登録したときに、getKeys()の戻り値がおかしかったので修正。
#ついでに、getKeys()で戻すのはその時点のSnapshotにした。
■ソース(ライブラリファイル化したものはこちら)
Object.associativeArray=(function(){
    var count=0;
    return function(){
        var assocaObj=this;
        var keys=[];
        
        var assoca=[],assocastr='__associativeArray'+(count++)+'__';
        assoca.number=[]; assoca.string=[]; assoca.boolean=[];
        
        assocaObj.set=function(key,value){
            if (assoca[typeof key]) {
                if (assoca[typeof key][key]===undefined) keys[keys.length]=key;
                assoca[typeof key][key]=value;
            }
            else {
                if (!key.toString.__associativeFlag__) {
                    var orgToString=key.toString;
                    key.toString=function(){return orgToString.apply(key,arguments)};
                    key.toString.__associativeFlag__=true;
                }
                if (key.toString[assocastr]===undefined) keys[keys.length]=key;
                key.toString[assocastr]=value;
            }
            return value;
        };
        assocaObj.get=function(key){
            if (assoca[typeof key]) {
                return assoca[typeof key][key];
            }
            else {
                return key.toString[assocastr];
            }
        };
        assocaObj.remove=function(key){
            var value=assocaObj.get(key);
            var tmpKeys=[];
            for (var ci=0,len=keys.length; ci<len; ci++) {
                if (keys[ci]!==key) tmpKeys[tmpKeys.length]=keys[ci];
            }
            keys=tmpKeys;
            if (assoca[typeof key]) {
                assoca[typeof key][key]=undefined;
            }
            else {
                key.toString[assocastr]=undefined;
            }
            return value;
        };
        assocaObj.getKeys=function(){
            return keys.concat([]);
        };
        assocaObj.collect=function(keyList){
            var collection=[];
            if (!keyList) keyList=keys;
            for (var ci=0,len=keyList.length; ci<len; ci++) {
                collection[collection.length]=assocaObj.get(keyList[ci]);
            }
            return collection;
        };
    };
})();
実行例
// === ハッシュ用オブジェクト作成
var assoca1 = new Object.associativeArray();

// キーが数値の1
assoca1.set(1, 2);
// キーが文字の'1'
assoca1.set('1', 3);
// キーが関数
var f=function(){print('hoge')};
var g=function(){print('fuga')};
assoca1.set(f, 4);
assoca1.set(g, 5);
// キーが真偽値
assoca1.set(true,6);
assoca1.set(false,7);
// キーがDOMオブジェクト
var DOM=document.body.lastChild;
assoca1.set(DOM,8);

// それぞれ設定通りの値が得られる
print(" 1   → "+assoca1.get(1));     // → 2
print("'1'  → "+assoca1.get('1'));   // → 3
print(" f   → "+assoca1.get(f));     // → 4
print(" g   → "+assoca1.get(g));     // → 5
print("true → "+assoca1.get(true));  // → 6
print("false→ "+assoca1.get(false)); // → 7
print("DOM  → "+assoca1.get(DOM));   // → 8

// キーリスト取得
print("keys   → "+assoca1.getKeys().join(', ')); // → 1, 1, function(){print('hoge')}, function(){print('fuga')}, true, false, [object]

// 値リスト取得
print("values → "+assoca1.collect().join(', ')); // → 2, 3, 4, 5, 6, 7, 8

// キー削除
print("remove f → "+assoca1.remove(f)); // → 4

// 新たに正規表現オブジェクトをキーに
var r=/test/gi;
assoca1.set(r,9);
print(" r   → "+assoca1.get(r));     // → 9

// キーリスト取得
print("keys   → "+assoca1.getKeys().join(', ')); // → 1, 1, function(){print('fuga')}, true, false, [object], /test/ig
print("values → "+assoca1.collect().join(', ')); // → 2, 3, 5, 6, 7, 8, 9

// === 新規にハッシュ用オブジェクト作成
var assoca2 = new Object.associativeArray();

// キーが配列
var array=[1,2,3];
assoca2.set(array,'ARRAY');
print("assoca2.get(array)   → "+assoca2.get(array));   // → ARRAY
print("assoca2.get([1,2,3]) → "+assoca2.get([1,2,3])); // → undefined

// 先のハッシュ用オブジェクトに用いたキーを使用
assoca2.set(g,'TEST');
print("assoca1.get(g) → "+assoca1.get(g));  // → 5
print("assoca2.get(g) → "+assoca2.get(g));  // → TEST

2008/02/11

ECS 3.0サービス終了に伴う『蔵書リンクMAKER』の改修

先日、Amazonから、
■[Amazonアソシエイト] ECS 3.0 サービス終了のご案内
先般よりDeveloper Forumにおきましてもご案内しておりましたが、このたび、Amazon E-コマース Web サービス バージョン3.0のサービスのご提供を 2008年3月31日 をもちまして終了させていただくことになりましたことを、改めてご案内いたします。
というメールが届きました。
要は、『ECS 3.0サービスの提供が終わるから、さっさとAWS 4.0(*1)へ移行しなさいよ』ってことで……やばっ、すっかり忘れていましたよ……。
(*1) Amazon アソシエイト Webサービス4.0の略称として勝手に使用しています。正式な略称は知りません。旧称:Amazon ECS 4.0 のことです。
とりあえず、『蔵書リンクMAKER』(REST版)については対応してみたつもりです。
ほとんどテストしていないのできっと不具合ありまくり、かも。
CGI(SOAP)版はいいでしょ、別に(苦笑)。
きまぐれブックテーマは……まぁ、その名の通り、気が向いたらということで(苦笑)。
使っている人いないと思うし(w
それにしても、RESTエンドポイントとかパラメータの違いはともかくとして(*1)、XMLの構造がまるっきり違っていた(*2)のにはまいりました。
XSLTの書き方なんてすっかり忘れていましたし、Namespaceの設定が新たに必要になっていたりして、思わぬ苦労をしてしまいました。
(*1) それでも、機能が同じパラメータ名をわざわざ変えることもないと思うけれども。せめて旧パラメータも併用出来ればと思うのは私だけ?
(*2) ざっと見た感じでは、ECS3互換のXMLを出力するようなオプションもなさげ。もしあるようなら教えてくださいませ。

« 2008年1月 | トップページ | 2008年3月 »

戻るリンク追加

カレンダー

2025年5月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

ココログカレンダーPlus(旧2)

検索


    • Web全体 サイト内
    • 蔵書のISBNを入力して下さい
    • はじめる前
      初級者向け
      上級者向け
      ブログ紹介
      結果を表示

コメントリストツリー化

無料ブログはココログ