bit sized

Just another WordPress.com weblog

Ubiquityを使って英単語を調べる – smart.fm (iknow)経由

1件のコメント

以前、ubiquityを使って英単語を調べるというエントリを書きましたが、mozilla labの開発スピードに負けて使えなくなっていた事を発見。新しいUbiquityのapiにアップデートしてみました。

ついでに、フォントの色も変えたら少し見やすくなった気がします。

ubiquity smart.fm

ubiquity smart.fm

Ubiquityのコマンドエディターに”共有”というのがあったので、クリックするとGitHubのGist(コード共有サービス)にアップロードされました。多分Firefoxの人なら http://gist.github.com/170912 に行くとインストールできると思います。楽ちんでいいですね

UbiquityのAPIについては、 Parser 2 API Conversion Tutorial に解説があるので、それに従って変更しました。関連があったのは、CmdUtilsの使い方で下記の二点。

  • 2行目 – コマンドの名前の指定(以前はnameというキーに対応する文字列だったが、現在はnamesというキー対応する文字列の配列に変更された。つまりコマンド名が複数持てる。またコマンドの名前に空白が入れれるようになった。)
  • 9行目,その他 – previewおよびexecuteの引数の指定(今まではtakesやmodifiersだったが、argumentsというキーで指定する。

2番目の変更はちょっとむずかしいですが、引数と動詞(コマンド)の関係を指定するSemantic Roleというのが導入されたようです。たとえば”A地点からB地点まで〜を移動させる”というようなコマンドでは、”移動させる”がコマンド(動詞) で、”〜を”は直接目的語です。ただ、この文には”A地点から”や”B地点まで”という修飾語もあり、それらがコマンドの引数として渡される場合もある訳 です。なので、Parser 2では引数が動詞に対して、どのような役割を果たすかを示すために、roleというパラメーターをargumentsに指定し、goal(目的地)や source(出発点)など引数として渡す値とコマンドの関係性を指定できるらしいです。言語間でのこうした関係性の表現の違い(日本語は”〜から”とい う後置詞、英語の場合は”from”という前置詞)を吸収するためにsemantic roleを導入しているようです。

このコマンドは引数に動詞(コマンド)の目的語(つまり検索する文字列)しかとらないので、roleは そのまま(direct) objectです。

  1. CmdUtils.CreateCommand({
  2.   names: [‘iknow search’],
  3.   icon: "http://example.com/example.png",
  4.   homepage: "http://bitsized.wordpress.com/",
  5.   author: { name: "Taku Okawa", email: "xxxxx@gmail.com"},
  6.   license: "GPL",
  7.   description: "search words or pharase in iknow",
  8.   help: "iknow",
  9.   arguments: [{role: "object",nountype: noun_arb_text}],
  10.   preview: function( pblock, arguments ) {
  11.    
  12.     var baseUrl = "http://api.iknow.co.jp/items/matching/${word}.${format}";
  13.     var tempUrl = {"word":arguments.object.text,"format":"json"}
  14.     var params = {include_sentences:"true"};
  15.     pblock.innerHTML = "requesting … " + CmdUtils.renderTemplate(baseUrl,tempUrl) + "<br/>";
  16.    
  17.     jQuery.getJSON(CmdUtils.renderTemplate(baseUrl,tempUrl),params,function(resp){
  18.       pblock.innerHTML = "";
  19.       jQuery.each(resp,function(i){
  20.         pblock.innerHTML += "<span style=’color:#ff0000′>" + this.responses[0].text + "</span>" + "<br/>";
  21.         pblock.innerHTML += "[例文] " + "<span style=’color:#0066ff’>" + this.sentences[0].text + "</span>" + "<br/>";
  22.         pblock.innerHTML += "[和訳] " + this.sentences[0].translations[0].text + "<br/>";
  23.       });
  24.     });
  25.    
  26.   },
  27.   execute: function(arguments) {
  28.     var baseUrl ="http://www.iknow.co.jp/items/search?keyword=${QUERY}";
  29.     var tempUrl = {"QUERY":arguments.object.text};
  30.     var urlString = CmdUtils.renderTemplate(baseUrl, tempUrl);
  31.     Utils.openUrlInBrowser(urlString);
  32.   }
  33. });

投稿者: t4ku

8月 20, 2009 9:21 am

Programming への投稿

銀行口座をVisualize

コメントする »

ビジュアライジング・データ —Processingによる情報視覚化手法 (大型本)

ビジュアライジング・データ

ビジュアライジング・データ ―Processingによる情報視覚化手法

を読んで「何か身近に数字を絵にして試せるものはないかなー」と思っていたのですが、自分が使用しているオンラインバンクでCSVで取引履歴が取得できたので、Processingで試してみました。











とりあえず、入金/出金(振込とか)を色分けして正方形の面積で金額の大きさを表しているだけなのですが、正方形どうしが重なり合わないようにしたり、以外と面倒な事をやっています。作ってみると、何をしたいのか若干分からなくなってますね。。。コード書く前にもうちょっと考えときゃよかった。次は時系列表示にしてみよかな。。

Visual Account

Visual Account

投稿者: t4ku

4月 29, 2009 8:45 am

Uncategorized への投稿

Ubiquityを使って英単語を調べる

2件のコメント

FireFoxのプラグインでUbiquityというのがあります。他のWebサイトの機能をコマンドとして登録して使用できる、User MashUpを可能にするFirefox上の環境です。将来的にはFirefoxのURLバーに実装されるかも知れません(URLをWebのドキュメントがある場所であると考えるのではなく、Web上のリソースに対するリクエストような考えると割と自然な進歩?)。

ブラウザの新境地? Ubiquityが変える衝撃のブラウザ体験 (1/2):
http://www.itmedia.co.jp/enterprise/articles/0808/31/news003.html

まあ、そういうわけでどういうものかちょっと気になって見てみて、最近APIが公開されたiknowという英語学習SNSの単語検索を呼び出すコマンドを作成してみました。

iknow-search

iknow-search

コード

CmdUtils.CreateCommand({
  name: "iknow_search",
  icon: "http://example.com/example.png",
  homepage: "http://example.com/",
  author: { name: "xxxx", email: "xxxxx@gmail.com"},
  license: "GPL",
  description: "search words or pharase in iknow",
  help: "iknow",
  takes: {"input": noun_arb_text},
  preview: function( pblock, input ) {

    var baseUrl = "http://api.iknow.co.jp/items/matching/${word}.${format}";
    var tempUrl = {"word":input.text,"format":"json"}
    var params = {include_sentences:"true"};

    pblock.innerHTML = "";

    jQuery.getJSON(CmdUtils.renderTemplate(baseUrl,tempUrl),params,function(resp){
      jQuery.each(resp,function(i){
        pblock.innerHTML += this.responses[0].text + "<br/>";
        pblock.innerHTML += this.sentences[0].text + "<br/>";
        pblock.innerHTML += this.sentences[0].translations[0].text + "<br/>";
      });
    });

  },
  execute: function(input) {
    var baseUrl ="http://www.iknow.co.jp/items/search?keyword=${QUERY}";
    var tempUrl = {"QUERY":input.text};
    var urlString = CmdUtils.renderTemplate(baseUrl, tempUrl);
    Utils.openUrlInBrowser(urlString);
  }
});

Ubiquityコマンドの作成
Ubiquityコマンド作成の情報は、現状下記のリンクかソースを見るしかないくらい少なく、しかも上記のコマンドはまだプレビューで訳を表示しEnterキーでiKnowのサイトで該当のアイテム検索結果を表示するのみですが、行数の割には用を足しているかと思います。Ubiquity導入後、Command Editorを使用して上記のコードを貼付ければ使用できます。

Labs/Ubiquity/Ubiquity 0.1 Author Tutorial
https://wiki.mozilla.org/Labs/Ubiquity/Ubiquity_0.1_Author_Tutorial

上のチュートリアルに載っている事ですが簡単に作り方を説明したいと思います。

CmdUtils.CreateCommand({
  name: "hello-world",
  execute: function() {
    displayMessage( "Hello, World!" );
  }
})

ubiquityコマンドは、cmd_<コマンド名>というfunctionがあればそれを参照するのですが、普通はCmdUtils.CreateCommand()というユーティリティ関数を使用して作成します。上記のコードはその最も単純な例です。

CreateCommandに渡すオブジェクトのnameとexecuteというプロパティに、それぞれコマンド名の文字列と実行する関数を指定します。execute(コマンドの実行)はUbiquityのコンソールにコマンド名を入力しEnterを押した時点で実行されます。displayMessage()を実行すると、MacならGrowl,WindowsならUbiquityのコマンドの下に引数に与えた文字列が表示されます。

Hello-worlddisplay hello world

CmdUtilsにはコマンド作成以外にも、ユーザーがブラウザで選択中の箇所にテキストやHTMLを挿入(setSelection),IPから位置情報を取得(getGeoLocation),文字列のテンプレート処理(renderTemplate)などコマンド作成を楽にする関数が用意されており、これまたドキュメントは少ないのですが、ソースはこちらで見る事ができます。

プレビューの表示
Ubiquityではユーザーの入力に応じて出力されるプレビューウインドウがあり、こちらはCreateCommandに渡すオブジェクトのpreviewプロパティに、HTML文字列か関数を指定する事で実現できます。下記は冒頭のコマンドでのpreview部分です。

preview: function( pblock, input ) {

    var baseUrl = "http://api.iknow.co.jp/items/matching/${word}.${format}";
    var tempUrl = {"word":input.text,"format":"json"}
    var params = {include_sentences:"true"};

    pblock.innerHTML = "";

    jQuery.getJSON(CmdUtils.renderTemplate(baseUrl,tempUrl),params,function(resp){
      jQuery.each(resp,function(i){
        pblock.innerHTML += this.responses[0].text + "<br/>";
        pblock.innerHTML += this.sentences[0].text + "<br/>";
        pblock.innerHTML += this.sentences[0].translations[0].text + "<br/>";
      });
    });

  },.....

previewは第一引数にpreviewエリアに表示するDOM要素を、第二引数にユーザーから渡されるコマンドの引数をとっています。コマンドの引数はtakeプロパティで、どのnoun_typeで取得するか指定できます。

  takes: {"input": noun_arb_text},

引数データの扱い
noun_typeは引数の制約や、コマンドの補完機能(例えば日付データが入力されたら、日付データを引数にとるコマンドをUbiquityがサジェストする)に使用され、下記のようなnoun_typeがあります。また、CmdUtilsを使用してカスタムのnoun_typeを作成する事ができます。

  • noun_type_arb_text
  • noun_type_date
  • noun_type_language
  • noun_type_people
  • noun_type_place
  • noun_type_tab

noun_typeのソースは下記で確認する事ができます
nountypes.js

一方、コマンドの引数としてpreviewやexecute(の第二引数)に渡されるオブジェクトは、下記のようなプロパティを持ちます。

  • inputObject.text // 文字列
  • inputObject.html //タグを含む整形されたHTML
  • inputObject.data // 文字列以外のnoun_typeのデータ
  • inputObject.summary // 長い文字列の要約版

iknow-searchのpreviewで行っているのは、コマンドの引数から(テンプレート機能を使用して)URL文字列を組み立て、JSONでリクエストを取得、preview用のDOMに結果を反映するという一連の処理ですが、uqibuityではjQueryが使用できるため簡単に実装できます。

また同様に、コマンド入力後Enterを押した時に実行されるexecuteでは、Utils.openUrlInBrowser()を使用してブラウザで該当のURL(検索結果ページ)を開くようになっています。

まだまだ発展途上(というかできたばかり)のコンセプトですが、Webの機能をお手軽にコマンドにできるのはこれから重宝しそうです。

追記:Ubiquity のアップデートに合わせて、コードも少し書き換えました

投稿者: t4ku

2月 8, 2009 3:05 pm

Programming, Technology への投稿

Processingでグラフ

コメントする »

前から少し気になっていたProcessingという言語について、ちょうど本屋におもしろそうなオライリー本が出ていたので買ってみました。

ビジュアライジング・データ ―Processingによる情報視覚化手法

簡単な例としてグラフの作成があったので、自分でも日本の人口統計を使ってグラフを書いてみました。

Population growth in Japan

Population growth in Japan

  1. FloatTable data;
  2. PFont plotFont;
  3. float plotX1,plotY1;
  4. float plotX2,plotY2;
  5. float labelX,labelY;
  6. float dataAreaWidth;
  7. float dataAreaHeight;
  8. final float dataOffsetY = 30;
  9. float volumnInterval = 10000;
  10. float dataCeil;
  11. int []years;
  12. int yearMin;
  13. int yearMax;
  14. int yearInterval;
  15. float dataMin;
  16. float dataMax;

  17. void setup(){
  18. plotFont = createFont(“SansSerif”,20);
  19. textFont(plotFont);
  20. //load csv file
  21. data = new FloatTable(“ppl1920-1990-grs-t.csv”);
  22. years = int(data.getRowNames());
  23. yearMin = years[0];
  24. yearMax = years[years.length -1];
  25. yearInterval = 10;
  26. dataMin = data.getColumnMin(0);
  27. dataMax = data.getColumnMax(0);
  28. println(ceil(dataMax/volumnInterval));
  29. dataCeil = ceil(dataMax/volumnInterval) * volumnInterval;
  30. size(600,400);
  31. smooth();
  32. plotX1 = 160;
  33. plotY1 = 80;
  34. plotX2 = width - plotX1/2;
  35. plotY2 = height - plotY1;
  36. labelX = plotX1 -110;
  37. labelY = plotY2 +40;

  38. dataAreaWidth = plotX2 - plotX1;
  39. dataAreaHeight = plotY2- plotY1;
  40. }
  41. void draw(){
  42. background(022); // (1)background color
  43. fill(044);
  44. rectMode(CORNERS);
  45. noStroke();
  46. rect(plotX1,plotY1,plotX2,plotY2);
  47. strokeWeight(0.4);
  48. stroke(254);
  49. drawDataArea();
  50. stroke(112);
  51. strokeWeight(0.1);
  52. drawLabels();
  53. }

  54. void drawLabels(){
  55. drawTitleLabel();
  56. drawAxisLabels();
  57. drawYearLabels();
  58. drawYearGrid();
  59. drawVolumnLabels();
  60. }
  61. void drawTitleLabel( ) {
  62. fill(112);
  63. textSize(15);
  64. textAlign(CENTER,CENTER);
  65. text(“Population growth in Japan\n 1920 to 2000″,(plotX1+plotX2)/2,plotY1 - 40);
  66. }
  67. void drawAxisLabels( ) {
  68. fill(112);
  69. textSize(13);
  70. textLeading(15);
  71. textAlign(CENTER, CENTER);
  72. text(“Total \npopulation\n(Thousand)”, labelX, (plotY1+plotY2)/2);
  73. textAlign(CENTER);
  74. text(“Year”, (plotX1+plotX2)/2, labelY);
  75. }

  76. void drawYearLabels(){
  77. fill(112);
  78. textSize(12);
  79. textAlign(LEFT);
  80. int rowCount = data.getRowCount();
  81. for(int i=0;i < rowCount;i++){
  82. if(years[i] % yearInterval ==0){
  83. String yearText = data.getRowName(i);
  84. float x = map(int(yearText),yearMin,yearMax,plotX1,plotX2);
  85. text(yearText,x,plotY2+12);
  86. }
  87. }
  88. }

  89. void drawYearGrid(){
  90. int rowCount = data.getRowCount();
  91. for(int i=0;i < rowCount;i++){
  92. if(years[i] % yearInterval ==0){
  93. float x = float(data.getRowName(i));
  94. x = map(x,yearMin,yearMax,plotX1,plotX2);
  95. line(x,plotY2,x,plotY1);
  96. }
  97. }
  98. }

  99. void drawVolumnLabels(){
  100. fill(112);
  101. textSize(10);
  102. textAlign(RIGHT);
  103. float x = plotX1;
  104. float y;
  105. for(float v = floor(dataMin/volumnInterval)*volumnInterval;v <= dataCeil;v+= volumnInterval){
  106. y = map(v,floor(dataMin/volumnInterval)*volumnInterval,dataCeil,plotY2,plotY1);
  107. line(x-10,y,x,y);
  108. //println(v);
  109. text(floor(v),x-20,y+4);
  110. }
  111. }

  112. void drawDataArea(){
  113. beginShape();
  114. int rowCount = data.getRowCount();
  115. for(int i=0;i < rowCount;i++){
  116. float value = data.getFloat(i,0);
  117. float x = map(years[i],yearMin,yearMax,plotX1,plotX2);
  118. float y = map(value,floor(dataMin/volumnInterval)*volumnInterval,dataCeil,plotY2,plotY1);
  119. vertex(x,y);
  120. }
  121. endShape();
  122. }

  123. void keyPressed( ) {
  124. saveFrame(“japan_pl_##.png”);
  125. }

processing実行後に何かキーを押すと、連番で”japan_pl_01.png”という画像が保存されます。FloatTableというクラスは本のサンプルコードに含まれているものですが、http://benfry.com/writing/archives/3 からダウンロードできます。人口のCSVは統計局からダウンロードしたものをタブ区切りのcsvにしてます。

こんな感じで

  1. Year    Total
  2. 1920 55963
  3. 1921 56666
  4. 1922 57390
  5. 1923 58119
  6. 1924 58876
  7. 1925 59737
  8. 1926 60740.9
  9. 1927 61659.3
  10. 1928 62595.3
  11. 1929 63460.6
  12. 1930 64450
  13. 1931 65457
  14. 1932 66434
  15. 1933 67432
  16. 1934 68309
  17. 1935 69254
  18. 1936 70114
  19. 1937 70630
  20. 1938 71013
  21. 1939 71380
  22. 1940 71933
  23. 1941 71933
  24. 1942 71933
  25. 1943 71933
  26. 1944 73064
  27. 1945 71998
  28. 1946 73114
  29. 1947 78101
  30. 1948 80002
  31. 1949 81773
  32. 1950 83200
  33. 1951 84573
  34. 1952 85852
  35. 1953 87033
  36. 1954 88293
  37. 1955 89276
  38. 1956 90259
  39. 1957 91088
  40. 1958 92010
  41. 1959 92973
  42. 1960 93419
  43. 1961 94285
  44. 1962 95178
  45. 1963 96156
  46. 1964 97186
  47. 1965 98275
  48. 1966 99054
  49. 1967 100243
  50. 1968 101408
  51. 1969 102648
  52. 1970 103720
  53. 1971 105014
  54. 1972 107332
  55. 1973 108710
  56. 1974 110049
  57. 1975 111940
  58. 1976 110089
  59. 1977 114154
  60. 1978 115174
  61. 1979 116133
  62. 1980 117060
  63. 1981 117884
  64. 1982 118693
  65. 1983 119483
  66. 1984 120235
  67. 1985 121049
  68. 1986 121672
  69. 1987 122264
  70. 1988 122783
  71. 1989 123255
  72. 1990 123611
  73. 1991 124043
  74. 1992 124452
  75. 1993 124764
  76. 1994 125034
  77. 1995 125570
  78. 1996 125864
  79. 1997 126166
  80. 1998 126486
  81. 1999 126686
  82. 2000 126926

Processingを一言で説明しようとすると、Javaの描写機能を使用しやすいインタフェースで提供する言語環境(なのかな?)でしょうが、なんでProcessingに興味をもっていたかというと、これを使用した作品(っていうのがいいですね)に興味深いというか斬新なものが多かったからな訳です。

MusicBox: a truly powerful visualization of your music library:http://www.crunchgear.com/2008/12/15/musicbox-a-truly-powerful-visualization-of-your-music-library/
音楽のライブラリを可視化するソフト。ファイルのメタデータ(作者やジャンルなど)のみではなく、実際の音声データをスキャンしてマッピングする。

Aligning humans and mammals:http://benfry.com/infoseed/
人間とほ乳類の遺伝子配列をならべて描写した画像

Base26:http://toxi.co.uk/p5/base26/
英語の言葉同士の慣例性を表現した図。

仕事ではほとんどCRUDなWEBアプリケーションしか見ないのですが、こういうデータの重要性もさることながらどう見せるかでどれだけ印象や理解度が変わるかという事を考えるとおもしろい。色々遊んでみようと思います。

投稿者: t4ku

2月 3, 2009 3:44 am

Programming, Technology への投稿

タグ:

2月の読書リスト

コメントする »

三月に入ってしまったが、気になった本のレビューは後でするとして、二月分の読書リストをとりあえずあげてみる。

リスク〈上〉―神々への反逆 (日経ビジネス人文庫)
本を読む本 (講談社学術文庫)
図解! あなたもいままでの10倍速く本が読める
Ruby by Example: Concepts and Codeオン・ザ・ロード (世界文学全集 1-1) (世界文学全集 1-1) (世界文学全集 1-1)
モテたい理由 (講談社現代新書 1921)
上達の法則―効率のよい努力を科学する (PHP新書)
ウェブを変える10の破壊的トレンド
人々はなぜグローバル経済の本質を見誤るのか使える!確率的思考 (ちくま新書)明日の広告 変化した消費者とコミュニケーションする方法 (アスキー新書 045) (アスキー新書 45)
コンテナ物語ーー世界を変えたのは「箱」の発明だった
最短で結果が出る超仕事術 (講談社BIZ)
数学入門〈上〉 (岩波新書)
ブランド・エンジニアリング

Icon: Steve Jobs, The Greatest Second Act in the History of Business
スティーブ・ジョブズ-偶像復活
学校がアホらしいキミへ
「へんな会社」のつくり方 (NT2X)
決算書の暗号を解け! ダメ株を見破る投資のルール
「1秒!」で財務諸表を読む方法―仕事に使える会計知識が身につく本
貧乏人のデイトレ 金持ちのインベストメント―ノーベル賞学者とスイス人富豪に学ぶ智恵
RESTful Webサービス
JavaScript 第5版
勝間和代のインディペンデントな生き方 実践ガイド

投稿者: t4ku

3月 17, 2008 4:33 pm

Life への投稿

タグ:

なぜRSSリーダーは使われないのか?

コメントする »

定期的にチェックするサイトについて、

もっとも多かったのは「4~5」で33.8%(112人)、それに次ぐのは「2~3」で32.6%(108人)と、2~5で6割以上という結果であった。11以上のサイトをチェックする回答者は、12.1%(40人)であった。

さらにそのチェックの仕方であるが、「お気に入り」からサイトチェック9割以上、RSS リーダー派は0.6%らしい。

なぜRSSリーダーは使われないか?

こうした結果について、30秒くらい考えた。なぜRSSリーダーは使われないのか?

  1. 閲覧するサイトの量が少ない
  2. 質的に目新しいものではない

閲覧するサイトの量が少ない

現時点で、何かしら動機や興味によって一日100を超えるようなサイトをチェックする人は少ないだろう。仕事で猛烈に情報収集をする必要があるなど、なにかブートストラップ的なものがなければ、RSSリーダーを使用しようとはしないのではないのか?

質的に目新しいものではない

RSSリーダーの恩恵を受けている人にとっては、膨大なサイトをフォルダやタグを用いて整理できたり、新しい情報を順に(リニアに)消化できるという機能は、それなしではネットサーフィン(という言葉はあんまり好きではないが)が苦痛になってしまうだろう。

が、

多くの人にとっては、Webサービスを必要とするのは、「新しい機能」や「新しいコンテンツ(デザインも含めて)」 である。典型例で言えば、オンラインショッピングや動画配信、また有名人のブログやSNSなどだろう。

RSSリーダーはこうした機能やコンテンツベースのソリューションではなく、膨大な「量」をこなすためのソリューションだ。

別に全ての人が毎日膨大な情報を吸収する必要があるとは思えないが、すごくメタ(ボリックではない)なレベルでは、量から質への転化というか、多くの情報を吸収するということは新しい時代の価値観の形成するベースであるような気がする(それを共有することも)。

RSSリーダーの使用率が低いのは前々から知っていたが、社内での会話からIT業界の中でも使っている人が少ないことに愕然とした今日このごろでした。

投稿者: t4ku

3月 7, 2008 2:36 pm

Uncategorized への投稿

投信の自動積立 – 最適な日付は?(国内株式Index型)

3件のコメント

素人の投資信託で書いたように、先月から4分散で投信の自動積立を始めたのだが、

「自動積立日って何日にすればよいのだろう?」 と思っていたら、

金融の世紀というブログで、投資信託の積立日というというエントリがあった。

上記で使っているデータが2003年からのものだったので、投信の設定日から今月までもうちょっと詳しく調べてみた。(ちなみに自分がkabu.comで買っているトピックスオープンで調べた)

具体的な期間は、投信の設定日の1990年3月-2008年2月

トピックスオープン

これを見ると、

  • 11-14日あたり
  • 22-25日 あたり

が積立日としてねらい目のように思える。

もっと確実に言えそうなのは、「月初と月末は(比較的)高い」

まあ安い高いといっても、最大0.7-0.8%の差をどう見るかという事でしょうが、この差が信託報酬より大きくなっているのも事実…

ちなみに、なぜか知らないけど自分は13日に設定していた(まぐれ?)

投稿者: t4ku

2月 26, 2008 2:25 pm

Uncategorized への投稿

タグ:

キーワードで検索した時のgoogleランキングを調べるrubyスクリプト

コメントする »

「SEO対策の有無をチェックするために、あるキーワードで検索して対象のWebサイトが何位くらいか調べる 」 という事をちょっと前仕事でやっていたのだが、数をこなさなければならないのと、対象のWebサイトが多かったのでバッチコマンドっぽく書いてみた

使い方

google_rank.rb  [-l | --limit 検索数 ] 検索文字列

例えば、”bit sized”という文字列で30位までのURLを取得しようとすると

google_rank.rb  -l 30 bit sized

とすればよい、結果は下記のようになる

google_rank.rb  -l 30 bit sized

1,bitsized.wordpress.com/
2,bitsized.wordpress.com/.../
3,en.wikipedia.org/wiki/Drill_bit_sizes
4,www.madison.k12.wi.us/toki/teched/codrills.htm
5,www.imao.us/archives/000960.html
6,www.theoriginalbitfit.com/
7,bitesizestandards.com/
8,www.bitesizebonus.com/
9,www.japaninc.com/article.php?articleID=521
10,www.crypto.rub.de/imperia/md/content/
11,home-and-garden.become.com/
12,www.springerlink.com/index/74HV57D1UH95PHHL.pdf
13,www.hardforum.com/showthread.php?t=967973
14,www.hydracore.com/drill_bit_sizes.htm
15,dic.yahoo.co.jp/dsearch?enc=UTF-8&p=bit&
16,atlaspen.com/search/?item=503438&pv=1
17,www.goodexperience.com/blog/archives/000633.php
18,www.wired.com/wired/archive/15.03/snackminifesto.html
19,search.luky.org/linux-kernel.2001/msg05005.html
20,www.modulaware.com/mdlt76.htm
21,www.patentstorm.us/patents/5501020-description.html
22,answers.yahoo.com/question/
23,www.hechinger.com/hardware/tools/
24,www.gfl-hand-tools.com/product-word/209/Bit-Sets.doc
25,bobmay.astronomy.net/misc/drillchart.htm
26,www.theoriginalbitfit.com/v4/go.gnf?s=bitfit&
27,thatgrrlca.blogspot.com/2007/
28,www.dri.co.jp/auto/report/wf/wfmts340mb07.htm
29,www.ttora.com/forum/showthread.php?t=29091
30,docs.sun.com/app/docs/doc/

準備

HTMLのパースにhpricotというライブラリを使用しているため、あらかじめ準備しておく必要がある。”gem  install  hpricot”でインストールできる

ソースコード

google_rank.rb

require 'rubygems'
require 'optparse'
require 'hpricot'
require 'open-uri'
require 'cgi'   
# class definition
class GoogleRank
    def initialize
      @str_query = ""
      @base_url = "http://www.google.co.jp/search?hl=ja&q="
      @suffix_url = "&lr="
      @srch_url = ""
      @srch_limit = 20
      @current_number = 0
    end

    def encode_query
      @str_query = CGI.escape(@str_query)
    end

    def cat_query
      if @current_number == 0
         @srch_url = @base_url + @str_query + @suffix_url
      else
         @srch_url = @base_url + @str_query + @suffix_url + "&start=" + @current_number.to_s + "&sa=N"
      end
    end

   def get_rank
      doc = Hpricot(open(@srch_url))
      # get the <div> that contains search result
      res = doc.search("//div[@id='res']")
      # <span class="a">hoge.com/target.html</a>
      spans = res.search("//span[@class='a']")

      spans.each_with_index{ |span,i|
         page_info =  CGI.unescape(span.inner_html)
         #puts "page_info:" + page_info
         page_url = page_info.split(/ /)

         # trims html tags
         item_url = page_url[0].gsub(/<[\/]*[a-z]+[\/]*>/,"")
         puts (@current_number + i + 1).to_s + ","+ item_url
      }
    end
    def search_rank
      self.encode_query
      while  @current_number <  @srch_limit
        self.cat_query
        self.get_rank
        @current_number += 10
        #puts "current_number=" + @current_number.to_s
      end
    end
    attr_accessor :str_query
    attr_accessor :srch_limit
end

# bat command process

rank = GoogleRank.new
opt = OptionParser.new

opt.on('-l VAL','--limit VAL'){ |v| rank.srch_limit = v.to_i }

opt.parse!(ARGV)

ARGV.each {|i|

  if rank.str_query == ""
    rank.str_query = i.to_s
  else
    rank.str_query = rank.str_query + " " + i.to_s
  end
}

rank.search_rank

投稿者: t4ku

2月 3, 2008 3:17 pm

素人の投資信託

1件のコメント

一月に読んだ本に影響され、ボーナスも余っているので、投信でもはじめようと思いたった

ウォール街のランダム・ウォーカー 株式投資の不滅の真理
お金は銀行に預けるな 金融リテラシーの基本と実践 (光文社新書)
マネーと常識 投資信託で勝ち残る道

上記の本を租借すると、「金融サービスのコスト」という一つのメッセージが伝わってくる。

つまり、

  • 銀行に預ける -> 潜在的にインターバンクとの利ざやを銀行に取られる
  • アクティブ運用 ->  信託報酬、アクティブ運用に関わるコストが受取り利率に跳ね返ってくる

という。

実際の運用方針は

お金は銀行に預けるな 金融リテラシーの基本と実践 (光文社新書)

に習って、

  1. 国内株式のインデックスファンド
  2. 海外株式のインデックスファンド
  3. 国内債券のインデクスファンド
  4. 海外債券のインデックスファンド

を1万円づつノーロードの毎月積み立て型で購入し、追加で相対的に割安になっていると思われるファンドを毎月選んで増額する。

まあ、

  1. 経済・金融の知識がない素人が「相対的に割安になっていると思われるファンド」 を選べるか?
  2. 自社株も毎月引き落とし(3万くらい)なので、上記の毎月5万って結構痛い

という問題点は残るものの、

  1. 「金融の知識と経済状況に対して興味を持ち続ける 」モチベーションとなる事を期待しよう。
  2. ボーナスの時に一気につぎ込むのではなく、同じつぎ込むにしても毎月の投資額を増やす(ドルコスト均衡法?)

という事にしよう。

半年後くらいに結果を一回レポートします。

投稿者: t4ku

1月 23, 2008 1:04 pm

Life への投稿

タグ: ,

1月の読書リスト

1件のコメント

2008年から月10冊くらい読書をしようかなと思う。

というわけで一月分のリストですと

別エントリでレビューしてるので、そちらを参照

以前、仮説思考という本を読んだのだが、実際の仕事で仮説思考をどのように生かすのかがずっと課題だった(今でも悶々と悩んでいる時間はあるが)。B型の凝り性の人に、A型の細かい人に、CAPS分析のAnalyzer型の人におすすめ

これはMUSTだと思う。著者(勝間和代)のファンになってしまった

一つ上の本つながり

これまた、勝間和代つながり。PCを使ったHack集かなと思いきや、もうちょっと本質的な話で、膨大な情報があふれる中で、どう向き合って、情報の量を質に添加していくかという感じ

小林秀雄は頭と心にくる

アップルはすごいすごいというだけでなく、結構冷静にどこが違うのか、日本のメーカーはなぜiPhoneのような魅力的な製品をなぜ作れないのか語っている。ひと味違うサービスや、ビジネスモデルを考える時に参考になるかも


投稿者: t4ku

1月 23, 2008 12:44 pm

Life への投稿

タグ: , ,