「push」を含む日記 RSS

はてなキーワード: pushとは

2010-05-15

起業するなら心に留めておきたい5つの秘訣

1. ビジネスを立ち上げる日を設定する。BeckySheila場合は、5月会社をその年の9月に設立すると決めた。最初は「どんなにか大変だろう」と思ったのだが、それほどでもないことに気づいたが、日付にはこだわった。信念を持って計画を達成しよう。

2. 自分たちに完璧を求めないこと。努力するのはよいことだけど、顧客のための自分のドアを開く方法を見つけた方がよい。

3. テスト期間中に収益をあげよう。ビジネスを立ち上げ、ビジネスを始めるときには、すでに顧客からのフィードバック、何を売るのか、何に優れているのか、何が収益が高いのか、自分が何がしたいのか、ということが土台になっているように。

4. 狭いターゲットに絞ろう。これは非常に難しいことだ。なぜなら、人間の傾向として、巨大な市場の後についていって成長するほうが簡単だと、考えがちだからだ。小さな市場サービス提供するという信念は、最もよいチャンスに注力することや、とてもよい製品ソリューションを作るときに役立つはずだ。そうすれば顧客クチコミによってそれを広め売上がついてくるだろう。

5. 顧客課題を解決するために自分たちのツールを売り込むことよりも、顧客課題自体に集中しよう。この心構えは、ビジネスプランを練ったり、製品顧客ニーズに合わせることに役立つはずだ。これは、異なる製品サービスビジネスを成長させるためのソリューションになるかもしれないということを気づかせるかもしれない。

http://d.hatena.ne.jp/momoco-f/20100507/1273163950

5 Secrets from a Profitable Start-Up business

 A year ago, Becky McCray and Sheila Scarborough were entrepreneurs with their own businesses who attended the SOBCon conference and decided to partner to start a business. By September 2009, they had launched Tourism Currents to teach tourism professionals how to use social media. In their first month, they generated a profit. Today, they came back to SOBCon and shared the secrets of their success, with the caveat ? these are not rules, the path has not been perfect, but it worked for them, so it could work for you too:

 

 1.Set a deadline to launch your business. They decided in May that they would launch in September, and stuck to the deadline even as they learned their initial expectations of “How hard could it be?” were inaccurate. Push forward and…

 2.Don’t expect perfection of yourself. It is good to strive for this, but is better to find a way to open your doors to customers so you can…

 3.Generate revenue while you test. Launch and iterate on your business based on feedback from your customers, what sells, what you’re good at, what is profitable, what you want to do.

 4.Solve for a narrow target. This is very difficult because our natural tendency is to think it is easier to grow by going after a big market. Trust that solving for a narrow market helps you focus on the best opportunities and will help you create great products and solutions that your customers help you sell through word of mouth.

 5.Focus on your customer’s problems rather than the tools you’re selling to solve them. Having this mindset allows you to evolve both your business plan and products to meet their needs. This allows you to see that a different tool (your product or service), rather than a better one, might be the solution that helps you grow your business.

 http://blog.quickbooksonline.com/2010/05/01/5-secrets-from-a-profitable-start-up-business/

2010-02-25

これだったら、迷わず購入します。 auスマートフォン

スマートフォンが欲しい大学生です。

ガラパゴス携帯になれてしまったため、踏み足すことができません。

先日、6月以降にauandroid携帯出すというニュースを見ました。

そこで、この機能があったら迷わず買うというのをまとめてみた。

1.必ず欲しい

ガラパゴス携帯のような制限(自由にアプリインストールできない など)がない。

ezwebアドレスが欲しい。そして、push対応

赤外線通信 ← 大学生は、アドレス交換が多くてないと不便

2.あったらうれしい

android 2.x系に対応

・常にandroidバージョンが最新に

携帯サイトを見れるようにしてほしい (携帯専用クーポンなどが使えるように)

・基本料を安く

 

この機能がついたauスマートフォンが出たら迷わず買います。

auさん、期待しています。

2010-02-22

http://d.hatena.ne.jp/faith_and_brave/20100220/1266673222

C++0x 読んだが ダメっぽいな。

まず第一にエンタープライズでの開発が考慮されていない。エンタープライズの開発だと100人200人 マスタークラスから ジュニアーまで様々なレベル開発者が携わる。

その中で重要になってくるのは可読性。

はっきり言って、歴史的な可読性を犠牲にして効率が上がるならともかく、気持ちの問題程度の効率では意味がない。

第2に

スレッドファイバーの違いぐらいわかれ、わざわざスレッド起こしたらコンテキストスイッチにどれだけコスト食うんだよ。

関数コールするとレジスタとかが、スタックPUSHされるんだよってわからん奴が、IF書くなと同じで、スレッドってコンテキストスイッチの塊なんだよってのがわかんないのに下手にスレッド書かせるな。

3にラムダ式・・・いらん・・・必要なのは曲芸じゃない、可読性。可読性を犠牲にして早くなるならともかく・・・

4にforeachではlastを変数に取るな。途中でReallocしたり、eraseしたりしたときに余計なバグを生んで面倒だ。レビューの時も邪魔。速度?速度が必要な背景でSTLVector使うな。配列使うかポインタ使え。

なんつーか、トータルで見て、次はC++と各種OpenCLとかGLとかのライブラリの集合だな。C++0xはまともに使う人もいなさそう。正規表現とかもライブラリ使えば良いし、そもそもC系列ならBisonとかLRとかだろうと。C系列の使い手ならBNFを使え。正規表現使いたければそれこそ、Perl使え。

2010-01-13

http://okajima.air-nifty.com/b/2010/01/post-abc6.html

少し遅れた感があるけど、解いてみた。

出力がテキストでないけど・・・。

仕事の合間を使ってやったものの、昼前に始めたのが5時頃にようやくできる程度。

これを25分とは尋常じゃないな、大口叩くだけあってよっぽど優秀なんだろう。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;

<html&gt;

<head&gt;
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis"&gt;
<meta http-equiv="Content-Language" content="ja"&gt;
<meta http-equiv="Content-Script-Type" content="text/javascript"&gt;
<meta http-equiv="Content-Style-Type" content="text/css"&gt;
<style type="text/css"&gt;
<!--

pre {
  font-family: monospace;
}

--&gt;
</style&gt;
<script type="text/javascript"&gt;
<!--

window.onload = function() {

  var q = new Map();
  q.load("maptest.txt");
  q.search();

  var answer = document.getElementsByTagName("pre").item(0);
  var answerText = "\r\n";
  for(var ix = 0; ix < q.route.length; ix++) {
    answerText += q.route[ix].join("") + "\r\n";
  }
  answer.firstChild.data = answerText;

  alert("終了しました。");
};

/** マップオブジェクト
 */
function Map() {
  this.ymap = [];
  this.route = [];
}

//マップの読み込み
Map.prototype.load = function(filePath) {
 //ファイルシステム
  var fileSystem = new ActiveXObject("Scripting.FileSystemObject");

 //ファイル読み込み
  var file = fileSystem.OpenTextFile(filePath);
  while(!file.AtEndOfLine) {
    var fileBuffer = file.ReadLine();
    this.ymap.push(fileBuffer.split(""));
  }
  file.Close();

  fileSystem = null;
};

//マップの探索
Map.prototype.search = function() {

  var that = this;

 //マップコピー
  var ymap = this.ymap.concat();
  for(var y = 0; y < ymap.length; y++) {
    ymap[y] = ymap[y].concat();
    for(var x = 0; x < ymap[y].length; x++) {
      if(ymap[y][x] == "S")
        var start = new MapNode(y, x);
      if(ymap[y][x] == "G")
        var goal = new MapNode(y, x);
    }
  }

  var openList = [];
  var closeList = [];

  start.costf = start.distance(goal);
  openList.push(start);

 //経路探索
  while(openList.length &gt; 0) {
    var node = openList.shift();
   //探索終了
    if(goal.equal(node)) {
      createRoute(node);
      break;
    }
    closeList.push(node);

   //隣接ノードの作成
    var tonari = [];
    if( ymap[node.positionY][node.positionX - 1] == " "
     || ymap[node.positionY][node.positionX - 1] == "G" )
      tonari.push(new MapNode(node.positionY, node.positionX - 1, node));
    if( ymap[node.positionY - 1][node.positionX] == " "
     || ymap[node.positionY - 1][node.positionX] == "G" )
      tonari.push(new MapNode(node.positionY - 1, node.positionX, node));
    if( ymap[node.positionY][node.positionX + 1] == " "
     || ymap[node.positionY][node.positionX + 1] == "G" )
      tonari.push(new MapNode(node.positionY, node.positionX + 1, node));
    if( ymap[node.positionY + 1][node.positionX] == " "
     || ymap[node.positionY + 1][node.positionX] == "G" )
      tonari.push(new MapNode(node.positionY + 1, node.positionX, node));

   //隣接ノード検索
    for(var tx = 0; tx < tonari.length; tx++) {
      var openIn = false;
      var closeIn = false;
      tonari[tx].cost = node.cost + 1;
      var costf = tonari[tx].cost + tonari[tx].distance(goal);
      tonari[tx].costf = costf;

     //オープンリストから検索し入れ替える。
      for(var ox = 0; ox < openList.length; ox++) {
        if(tonari[tx].equal(openList[ox])) {
          openIn = true;
          if(costf < openList[ox].costf) {
            openList.splice(ox, 1);
            push(openList, tonari[tx]);
          }
          break;
        }
      }
     //クローズリストから検索し、オープンリストへ移す。
      for(var cx = 0; cx < closeList.length; cx++) {
        if(tonari[tx].equal(closeList[cx])) {
          closeIn = true;
          if(costf < closeList[cx].costf) {
            closeList.splice(cx, 1);
            push(openList, tonari[tx]);
          }
          break;
        }
      }
     //どちらにもない場合、オープンリストへ追加する。
      if(!openIn &amp;amp;&amp;amp; !closeIn)
        push(openList, tonari[tx]);
    }
  }

 //適切な位置に追加する。
  function push(array, item) {
    for(var ix = 0; ix < array.length; ix++) {
      if(item.costf < array[ix].costf) {
        array.splice(ix, 0, item);
        return;
      }
    }
    array.push(item);
  }

 //ルートマップの作成
  function createRoute(lastNode) {
    var node = lastNode.parent;
    while(node.parent) {
      ymap[node.positionY][node.positionX] = "$";
      node = node.parent;
    }
    that.route = ymap;
  }
};

/** マップノード
 */
function MapNode(y, x, parentNode) {
  this.positionY = y;
  this.positionX = x;
  this.parent = parentNode;
  this.cost = 0;
  this.costf = 0;
}

//同一ノードかチェックする。
MapNode.prototype.equal = function(targetNode) {
  if( this.positionY == targetNode.positionY
   &amp;amp;&amp;amp; this.positionX == targetNode.positionX )
    return true;
  return false;
};

//直線距離を求める。
MapNode.prototype.distance = function(targetNode) {
  sabunY = this.positionY - targetNode.positionY;
  sabunX = this.positionX - targetNode.positionX;
  return sabunY ^ 2 + sabunX ^ 2;
};

// --&gt;
</script&gt;
<title&gt;経路探索:A*</title&gt;
</head&gt;
<body&gt;

<pre&gt;&amp;nbsp;</pre&gt;

</body&gt;
</html&gt;

2009-12-10

PHPのあの関数Perlでやるには?

元ネタ http://phpspot.org/blog/archives/2009/12/phpjavascriptph_1.html

面白そうだと思ったので僕もやってみた。モジュールPerl5.8系の標準モジュールのみ利用可という制限。

全部はキツイので関数処理関係の関数(http://php.benscom.com/manual/ja/ref.funchand.php)だけ実装してみた。

use strict;
use warnings;

=head2 call_user_func

 $ret = call_user_func($function,@param);
 $ret = call_user_func([$class,$method],@param);

example1

 sub plus { $_[0] + $_[1] }
 print call_user_func('plus',10,20); # 30

example2

 package Foo;
 sub plus { $_[1] + $_[2] }
 package main;
 print call_user_func(['Foo','plus'],10,20); # 30

=cut

sub call_user_func {
    my $proto = shift;
    if ( ref $proto eq 'ARRAY' ) {
        return $$proto[0]->${\$$proto[1]}(@_);
    }
    else {
        require Pod::Functions;
        if ( $Pod::Functions::Flavor{$proto} ) {
            return eval qq{$proto(\@_)};
        }
        else {
            no strict 'refs';
            return $proto->(@_);
        }
    }
}

=head2 call_user_func_array

 $ret = call_user_func_array($function,\@param);
 $ret = call_user_func_array([$class,$method],\@param);

example

 sub plus { $_[0] + $_[1] }
 print call_user_func_array('plus',[10,20]); # 30

=cut

sub call_user_func_array {
    return call_user_func(shift,@{+shift});
}

=head2 create_function

 $code = create_function($args_str,$code_str);

example

 $code = create_function('$c,$d=1','print $c+$d');
 $code->(10); # 11

=cut

sub create_function {
    my $args = shift;
    my $code = shift;
    my $default = 0;
    my @args = split /,/,$args;
    my $code_str = 'sub {';
    for my $arg (@args) {
        if ( $arg =~ /^\s*(\$[a-zA-Z][\w]*)\s*(?:=\s*(.+))?\s*$/ ) {
            my $val = $1;
            my $def = $2;
            if ( defined $def ) {
                $default = 1;
                $code_str .= qq{my $val = \@_ ? shift : $def;\n};
            }
            else {
                die 'parse error' if $default;
                $code_str .= qq{my $val = shift;\n};
            }
        }
    }
    $code_str .= $code . '}';
    my $sub = eval $code_str;
    die $@ if $@;
    return $sub;
}

=head2 forward_static_call

 $ret = forward_static_call($function,@param);
 $ret = forward_static_call([$class,$method],@param);

=cut

sub forward_static_call {
    call_user_func(@_);
}

=head2 forward_static_call_array

 $ret = forward_static_call_array($function,\@param);
 $ret = forward_static_call_array([$class,$method],\@param);

=cut

sub forward_static_call_array {
    call_user_func_array(@_);
}

=head2 func_get_arg

 $arg = func_get_arg($no)

example

 sub foo { print func_get_arg(1) }
 foo(100,200); # 200

=cut

sub func_get_arg {
    my $n = shift;
    package DB;
    @DB::args = ();
    () = caller(1);
    return defined $DB::args[$n] ? $DB::args[$n] : undef;
}

=head2 func_get_args

 @args = func_get_args()

example

 sub foo { print join ':', func_get_args() }
 foo(11,22,33); # 11:22:33

=cut

sub func_get_args {
    my $n = shift;
    package DB;
    @DB::args = ();
    () = caller(1);
    return @DB::args;
}

=head2 func_num_args

 $arg_count = func_num_args()

example

 sub foo { print func_num_args() }
 foo(11,22,33); # 3

=cut

sub func_num_args {
    my $n = shift;
    package DB;
    @DB::args = ();
    () = caller(1);
    return scalar @DB::args;
}

=head2 function_exists

 $bool = function_exists($func)

example

 sub foo {}
 print function_exists('foo');  # 1
 print function_exists('bar');  # 0
 print function_exists('rand'); # 1

=cut

sub function_exists {
    my $func = shift;
    return 1 if exists &$func;
    require Pod::Functions;
    return $Pod::Functions::Flavor{$func} ? 1 : 0;
}

=head2 get_defined_functions

 $funcs = get_defined_functions()

=cut

sub get_defined_functions {
    require Pod::Functions;
    return {
        internal => [ keys %Pod::Functions::Flavor ],
        user     => [ grep { exists &$_ } keys %:: ],
    };
}

=head2 register_shutdown_function

 register_shutdown_function($func,@param);
 register_shutdown_function([$class,$method],@param);

=cut

{
    my $REGISTER_SHUTDOWN_FUNCTION = [];
    sub register_shutdown_function {
        my $proto = shift;
        push @$REGISTER_SHUTDOWN_FUNCTION, [
            do {
                if ( ref $proto eq 'ARRAY' ) {
                    $$proto[0]->can($$proto[1]);
                }
                else {
                    require Pod::Functions;
                    if ( $Pod::Functions::Flavor{$proto} ) {
                        sub { eval qq{$proto(\@_)} };
                    }
                    else {
                        no strict 'refs';
                        \&$proto;
                    }
                }
            },
            [@_]
        ]
    }
    END {
        $_->[0]->(@{$_->[1]}) for @$REGISTER_SHUTDOWN_FUNCTION;
    }
}

思ったよりも難しかった。標準関数一覧を取る手段がなかったので標準モジュールを利用して標準関数の一覧を取得した。

あと文字列から標準関数を呼び出すスマートな手段が思いつかなかったのでeval便りに。

create_functionはかなりゴリ押し。myを勝手に付けたりデフォルト引数にも対応してたり細かい芸が光る(自分で言うな)

forward_static_callはぶっちゃけPerl的にcall_user_funcと殆ど処理が変わらないのでそのまま利用。

func_get_arg系は結構クリティカルだなー。@DB::argsをリアルに使ったの初めてだよ。

register_shutdown_functionはちょっとねー。ENDブロックを利用してるわけなんだけど当然mod_perlとかではうまく動かない。あとシグナルとか使った方が良いのかもしれない。

ヒマがあったら他の関数とかも実装してみたいかも。

プログラ増田のあなぐら

2009-08-10

iPhone 3Gダメダメなところまとめ改訂しろよ

iPhone 3Gダメダメなところまとめ

http://www.omoshiro-news.net/memo/iPhone3G.html

このサイトアンチっぷりが頭来るので訂正しておく。3GSの事も混ざってるので注意。

つーか意味のない質問大杉

Q.iPhone本体に、メールは保存できますか?
A.30日で自動的に削除されない仕様改善されたとのこと。
  なお、保存容量が200MB以上になったり、
  5000件を超えたメールは、古いものから削除されるとのこと。
	
Q.iPhone は、携帯専用サイトは見れますか?
A.無料アプリで見れます。AppStoreやiTunesStoreで事足りるけどな

Q.iPhone は、FLASHJAVA が含まれている WEB サイトは見れますか?
A.見れません。ガラケーでも見れるのはFlash liteだからフルFlashサイトはみれねぇよ。

Q.iPhone は、絵文字は使えますか?
A.使えます。

Q.iPhone は、デコメールは使えますか?
A.ドコモサービスなんか使えるわけねーだろ。ガラケーでiTunesStore見れるのかよ。

Q.iPhone は、着メロ着うたは使えますか?
A.自分で作れる。

Q.iPhone に、ストラップをつけれますか?
A.つけれません。ストラップホール付きのケースカバーを使って下さい。

Q.iPhone で、ドコモAU の友達と携帯メールやりとり普通にできますか?
A.出来ます。softbank.ne.jpでもi.softbank.jpでもどちらでも可能です。

Q.iPhone で、メールの返信の際、返信文が必ず引用されてしまうみたいですが?
A.MMS(携帯メール)はそんなもの付きません。

Q.iPhone は、メールは手動操作しないと15分おきにしか端末に来ませんが?
A.MMSとi.softbank.jppushで来ます。i.softbank.jpを通知専用として使えばGMailだって疑似pushに出来ます。

Q.iPhone は、受信メール一覧の差出人表示が、メールアドレス表示になっていて、誰からのメールかわかりにくいのですが?
A.MMS(携帯メール)はそんなではないです。普通電話帳の登録名で表示されます。

Q.iPhone は、単語登録や定型文登録できますか?
A.アプリで出来ます。電話帳を整理して使うので汚れません。

Q.iPhone は、漢字変換の文節の区切りを変更できますか?
A.出来ます。

Q.iPhone は、公衆電話や非通知拒否等の設定はできますか?
A.できません。 どうしてもやりたかったらJB

Q.iPhone は、電話の音量設定を記憶しておけないのですか?
A.記憶されています。

Q.iPhone は、メール着信(受信通知)を知らせるランプやイルミネーションはありますか?
A.ありません。画面にはメールの着信のおしらせが表示されますので見おとすことはありません。

Q.iPhone は、不在着信でランプやイルミネーションはありますか?
A.ありません。不在着信があったこと自体は表示されているので分かります。

Q.iPhone は、ワンセグ機能は付いてますか?
A.ついてません。 外付けのワンセグチューナはあります。もしくはOrbliveというソフト回線使ってみるかです。

Q.iPhone は、赤外線通信機能はありますか?
A.ありません。自分アドレスQRコードを使ったアプリで送れますが、相手のアドレスメールで送ってもらうなり自分で書き写すなりしなければ行けません。

Q.iPhone は、QRコードは読み取れますか?
A.アプリで読めます。小さいのは厳しかったりします。

Q.iPhone は、モバイルスイカとかお財布機能ありますか?
A.ありません。

Q.iPhone の電池交換は自分でできますか?
A.できません。有料で交換になります。

Q.iPhone は、メール作成中に受信したメールを見れますか?
A.MMSは送られてきた相手のメールチャット状に見えている状態で書けます。

Q.iPhone は、S!メールには対応してますか?
A.softbank.ne.jpアドレスMMSで使えます。というかS!メール=MMSです。

Q.iPhone は、電話メールともに、発着信履歴の選択削除ができますか?
A.電話履歴の選択削除が出来ません。メールは出来ます。

Q.iPhone は、オフライン状態でメールを読むことはできますか?
A.出来ます。

Q.iPhoneカメラにはオートフォーカスや手ぶれ補正ありますか?
A.3GSで画面上の指定位置をタップすることで場所指定を出来るオートフォーカスが付きました。手ぶれの補正はありません。一部アプリで疑似手ぶれ補正があります。

Q.iPhoneカメラ動画撮れますか?
A.3GSで対応されました。

Q.iPhone は、メモリカードを使えますか?
A.最低モデルで8GB、最高モデルで32GBが選べるしUSBケーブルでPC接続できるんだけどメモリーカードが何のために必要なの?メモリーカードがないとろくに記録出来ないガラケーとは違います。

Q.iPhone で、音楽を聴きながら、safariブラウジングしていると頻繁に固まりますが?
A.そんな固まらねーよ。訳の分からない質問するな。どんなマシンだって過剰な動かしかたすれば止まる。

Q.メールボックスを開くたびに通信が発生しているみたいですが?
A.MMSではそんなことしてません。

Q.iPhone は、ブルートゥースが付いているそうですが、無線音楽を聴けますか?
A.聴けます。

Q.iPhone無線 LAN を使う場合、どこかの無線 LAN サービスに加入する必要はありますか?
A.iPhoneユーザならば無料で使えるスポットが多くあります。むしろiPhone以外の携帯では有料の契約をする必要があります。

Q.iPhone 3Gで通信中、登録していない無線(Wi-Fi)電波を
A.拾わない設定にすればいいだけです。この質問なんか意味あるのですか?

Q.iPhone は、ノートパソコンモデムとして利用できますか?
A.普通はできません。この質問にも意味があるのでしょうか?

Q.iPhone は、マルチタスク処理ですか?
A.音楽再生以外は同時にアプリを立ち上げることは出来ません。メモリが貧弱な携帯端末ではむしろ自動タスクを切る機能が付いている事の方が有用です。

Q.iPhone に、勝手アプリを入れられますか?
A.入れられません。アップルの許可したアプリのみですが、そこにあるアプリを使うだけのユーザには何の問題もありません。

Q.iPhoneアプリは誰でも作れますか?
A.Intel Mac を所有している方なら誰でも作れます。ウィンドウズでは無理です。
	
Q.iPhone は、片手で操作できますか?
A.手の小さなお子様以外は片手で問題ありません。相当手の小さい人以外は片手で十分です。両手じゃないとダメなんて都市伝説みたいなもん。

Q.iPhone は、他の携帯SIMを共用して使えますか?
A.専用だから使えません。普通機種変更すればいいだけの話ですが。

Q.iPhone 3G液晶って、昔の iPhone液晶と比べて黄色くないですか?
A.ロットによる差です。

2009-08-07

2択系

http://anond.hatelabo.jp/20090807091544

2. Which is worse, failing or never trying?

* (失敗するのと、やらないの。ダメなのはどっち?)

3. If life is so short, why do we do so many things we don’t like and like so many things we don’t do?

* (人生がそんなに短いんだとしたら、やりたくないことばかりして、やりたいのにやらないことがこんなに多い必要ってあると思う?)

4. When it’s all said and done, will you have said more than you’ve done?

* (すべて終えて振り返ったときに、やったことよりも、言ったことのほうが多くなってるって思う?)

7. Are you doing what you believe in, or are you settling for what you are doing?

* (あなたは今本当にやりたいことをしてる?それとも、今やっていることに落ち着いてるだけ?)

10. Are you more worried about doing things right, or doing the right things?

* (物事をちゃんとやるのと、正しいことをするのと、あなたにとってどっちがより大切?)

13. Would you break the law to save a loved one?

* (あなたは愛する人を救うために法律を犯すと思う?)

14. Have you ever seen insanity where you later saw creativity?

* (最初に見たときはクレイジーだ!と思ったことが、後になってみたらクリエイティブだ!と思うようなことってない?)

18. Are you holding onto something you need to let go of?

* (忘れないといけないもの、手放さないといけないものなのに、いつまでも持ってるものってない?)

20. Do you push the elevator button more than once? Do you really believe it makes the elevator faster?

* (エレベーターボタンを一回以上押すことある?それでエレベーターが早くなると思う?)

21. Would you rather be a worried genius or a joyful simpleton?

* (悩み多き天才と、単純でハッピーな人。どっちになりたい?)

23. Have you been the kind of friend you want as a friend?

* (あなたが友達になりたいような友達に、あなた自身がなったことある?)

24. Which is worse, when a good friend moves away, or losing touch with a good friend who lives right near you?

* (仲の良い友人が遠くへ行ってしまうのと、仲の良い友人が近くにいるのに疎遠になるのと、どっちが悲しい?)

26. Would you rather lose all of your old memories, or never be able to make new ones?

* (昔の記憶の全部が無くなってしまうのと、新しい思い出が作れないのと、どっちを選ぶ?)

27. Is it possible to know the truth without challenging it first?

* (やってみもしないで、ホントはどうかなんて、わからなくない?)

28. Has your greatest fear ever come true?

* (最も恐れていることが、ほんとに起こってしまったことってある?)

29. Do you remember that time 5 years ago when you were extremely upset? Does it really matter now?

* (5年前とかに、ものすごく腹が立ったことって何か覚えてる?それって、今も大切なこと?)

34. Have you ever been with someone, said nothing, and walked away feeling like you just had the best conversation ever?

* (かつて出会った人で、言葉を交わす機会はなかったけど、最高の会話をしたみたいに感じた人っていなかった?)

36. Is it possible to know, without a doubt, what is good and what is evil?

* (一片の迷いもなく、善悪を判断することってできる?)

37. If you just won a million dollars, would you quit your job?

* (一億円の宝くじが当たったら、仕事をやめたいと思う?)

38. Would you rather have less work to do, or more work you actually enjoy doing?

* (仕事の量を減らすのと、楽しい仕事をもっとやるのと、どっちを選ぶ?)

39. Do you feel like you’ve lived this day a hundred times before?

* (今日という日を、もう何回も繰り返してるみたく感じたことってない?)

42. Would you be willing to reduce your life expectancy by 10 years to become extremely attractive or famous?

* (ものすごく有名か、ものすごく魅力的な人になれるとしたら、寿命を10年縮めてでもなりたいと思う?)

ややこしい答えが必要なのは除いた。「何?」とか「いつ?」ってのは答えづらいけど「どっち?」なら即断可能かな?って。

翻訳ちょっと違和感あった。

思考の自由度チェック

心に自由を与える50の質問 - Free Your Mind! | 口コミ発信!モノ人

http://monojin.com/50-questions-that-will-free-your-mind/

思考の束縛を解く50の質問 - finalvent日記

http://d.hatena.ne.jp/finalvent/20090806/1249525203

考え方って、案外、型にはまってしまいがちなんだよね。だから、あなたはきっとこんな風に答えるだろうなって、何となく想像できる気がした。それに対して、僕はこんな風に反応するよ。でもまずは、下の質問を読んで答えてみてね。ここはまるまるhttp://monojin.com/50-questions-that-will-free-your-mind/からのコピペだよ。

  1. How old would you be if you didn’t know how old you are?
    • 自分の年齢を知らないとしたら、何歳でいたい?)
  2. Which is worse, failing or never trying?
    • (失敗するのと、やらないの。ダメなのはどっち?)
  3. If life is so short, why do we do so many things we don’t like and like so many things we don’t do?
    • 人生がそんなに短いんだとしたら、やりたくないことばかりして、やりたいのにやらないことがこんなに多い必要ってあると思う?)
  4. When it’s all said and done, will you have said more than you’ve done?
    • (すべて終えて振り返ったときに、やったことよりも、言ったことのほうが多くなってるって思う?)
  5. What is the one thing you’d most like to change about the world?
    • (世の中でたった一つだけ変えられるとしたら、何を変えたい?)
  6. If happiness was the national currency, what kind of work would make you rich?
  7. Are you doing what you believe in, or are you settling for what you are doing?
    • (あなたは今本当にやりたいことをしてる?それとも、今やっていることに落ち着いてるだけ?)
  8. If the average human life span was 40 years, how would you live your life differently?
    • (もしも、人間寿命が40年だとしたら、どんな人生を生きたい?)
  9. To what degree have you actually controlled the course your life has taken?
  10. Are you more worried about doing things right, or doing the right things?
    • (物事をちゃんとやるのと、正しいことをするのと、あなたにとってどっちがより大切?)
  11. You’re having lunch with three people you respect and admire. They all start criticizing a close friend of yours, not knowing she is your friend. The criticism is distasteful and unjustified. What do you do?
    • (あなたは尊敬する3人のひとたちとランチを食べている。その3人が一斉にあなたのとても身近な友人を批判し始めた。その3人はあなたとその人が友人であることを知らない。批判は品がなく、不当なもの。どう反応する?)
  12. If you could offer a newborn child only one piece of advice, what would it be?
    • (新たに生まれてくる子供にひとつだけアドバイスを上げられるとしたら、何て言ってあげたい?)
  13. Would you break the law to save a loved one?
    • (あなたは愛する人を救うために法律を犯すと思う?)
  14. Have you ever seen insanity where you later saw creativity?
  15. What’s something you know you do differently than most people?
    • (他の多くの人とくらべてみて、自分なら違うふうにやれると思うものって何?)
  16. How come the things that make you happy don’t make everyone happy?
    • (なんであなたが幸せだと思うことを、みんな幸せだと思わないんだろう?)
  17. What one thing have you not done that you really want to do? What’s holding you back?
    • (本当はやりたいけどまだやってないことってある?それをやってない理由は?)
  18. Are you holding onto something you need to let go of?
    • (忘れないといけないもの、手放さないといけないものなのに、いつまでも持ってるものってない?)
  19. If you had to move to a state or country besides the one you currently live in, where would you move and why?
    • (もしどこにでも引っ越せるとしたら、どこに行きたい?それはなぜ?)
  20. Do you push the elevator button more than once? Do you really believe it makes the elevator faster?
  21. Would you rather be a worried genius or a joyful simpleton?
  22. Why are you, you?
    • (なんで、あなたはあなたなの?)
  23. Have you been the kind of friend you want as a friend?
    • (あなたが友達になりたいような友達に、あなた自身がなったことある?)
  24. Which is worse, when a good friend moves away, or losing touch with a good friend who lives right near you?
    • (仲の良い友人が遠くへ行ってしまうのと、仲の良い友人が近くにいるのに疎遠になるのと、どっちが悲しい?)
  25. What are you most grateful for?
    • (あなたが最も感謝するものって何?)
  26. Would you rather lose all of your old memories, or never be able to make new ones?
    • (昔の記憶の全部が無くなってしまうのと、新しい思い出が作れないのと、どっちを選ぶ?)
  27. Is it possible to know the truth without challenging it first?
    • (やってみもしないで、ホントはどうかなんて、わからなくない?)
  28. Has your greatest fear ever come true?
    • (最も恐れていることが、ほんとに起こってしまったことってある?)
  29. Do you remember that time 5 years ago when you were extremely upset? Does it really matter now?
    • (5年前とかに、ものすごく腹が立ったことって何か覚えてる?それって、今も大切なこと?)
  30. What is your happiest childhood memory? What makes it so special?
    • 子供の頃の思い出で一番幸せだったのは?その思い出が特別なのはなんで?)
  31. At what time in your recent past have you felt most passionate and alive?
    • 最近、一番やる気が湧いてきて、やるぞっ!って感じたことはなに?)
  32. If not now, then when?
    • (今じゃないとしたら、いつ?)
  33. If you haven’t achieved it yet, what do you have to lose?
    • (まだ手に入れてないんだとしたら、失うものってないんじゃない?)
  34. Have you ever been with someone, said nothing, and walked away feeling like you just had the best conversation ever?
    • (かつて出会った人で、言葉を交わす機会はなかったけど、最高の会話をしたみたいに感じた人っていなかった?)
  35. Why do religions that support love cause so many wars?
    • (愛を訴えているはずの宗教が、いつも戦争の原因になるのはなんでだと思う?)
  36. Is it possible to know, without a doubt, what is good and what is evil?
    • (一片の迷いもなく、善悪を判断することってできる?)
  37. If you just won a million dollars, would you quit your job?
    • (一億円の宝くじが当たったら、仕事をやめたいと思う?)
  38. Would you rather have less work to do, or more work you actually enjoy doing?
  39. Do you feel like you’ve lived this day a hundred times before?
    • 今日という日を、もう何回も繰り返してるみたく感じたことってない?)
  40. When was the last time you marched into the dark with only the soft glow of an idea you strongly believed in?
    • (強く信じるかすかな明かりだけを頼りに、暗闇に踏み込んでいくようなことを最後にしたのはいつ?)
  41. If you knew that everyone you know was going to die tomorrow, who would you visit today?
    • (もし、あなたの知ってる人全員が明日死んでしまうとしたら、今日あなたは誰に会いに行く?)
  42. Would you be willing to reduce your life expectancy by 10 years to become extremely attractive or famous?
    • (ものすごく有名か、ものすごく魅力的な人になれるとしたら、寿命を10年縮めてでもなりたいと思う?)
  43. What is the difference between being alive and truly living?
    • (命があるだけなのと、本当に生きているのの違いって何?)
  44. When is it time to stop calculating risk and rewards, and just go ahead and do what you know is right?
    • リスクと見返りを天秤にかけるのをやめて、自分が正しいと思うことをとにかくやってみる、っていうような時はいつ来るの?)
  45. If we learn from our mistakes, why are we always so afraid to make a mistake?
    • (失敗から学ぶことができるんだとしたら、なんでいつもそんなに失敗することを怖がるの?)
  46. What would you do differently if you knew nobody would judge you?
    • (だれにも批評されないって知ってたらもっと違うやり方したのに、っていうことある?)
  47. When was the last time you noticed the sound of your own breathing?
    • (一番最近自分の吐息を聞いたのを覚えてるのっていつ?)
  48. What do you love? Have any of your recent actions openly expressed this love?
    • (あなたが大好きなことって何?最近あなたがとった行動であなたがそれを大好きだって、誰の目から見てもわかるようなことってあった?)
  49. In 5 years from now, will you remember what you did yesterday? What about the day before that? Or the day before that?
    • (今から5年後、あなたは昨日したことを覚えていると思う?一昨日のことは?その前の日は?)
  50. Decisions are being made right now. The question is: Are you making them for yourself, or are you letting others make them for you?
    • 決断はたった今下された。問題は、その決断をあなたが自分で下したのか、誰か他の人が下したのかってこと。)
  1. 「○○歳」と答えてたら、思考がかなり固定化されているかも。年齢なんて便宜的なもの。体力なのか、精神面なのか、はたま社会的な立場だとか、何とリンクさせて考えるのかも自由だからね。
  2. 「どっち?」って問いに、提示された選択肢の中からしか選べなかったなら、かなり頭が固くなっている可能性があるよ。ついでに言うと、本当にダメなのかどうかも疑ってみてね。
  3. 主客転倒というか、やりたくないことばかりして、やりたいのにやらないことが多いから、人生が短く感じられれるのかもしれないね。ところで、あなたのやりたいこととやりたくないことってそんなにはっきりわけられるもの?やりたいことの中にやりたくないことが混じっていたり、やりたくないことだって、実はほんの一部が面倒なだけだったりしない?
  4. やろうと思ったことを一つ残さず叶えている人なんているのかな。それって自然なことかな。確実にできることしか発言しなくていいのかな。誰かの力を借りる必要があるときってどんなときだろうね。
  5. 提示された条件の中でしか……(以下略)。変えたいという願望、本当はとっくに変える力を持っていたりするんじゃない?
  6. 名前のついた職業ばかりが「仕事」じゃないからね。そして、どんな通貨であれ、誰かのところに沢山集まってくることが理想的な状態かどうかってことも考えておきたいよね。
  7. 立ち止まって見えるか、前に進んで見えるのか、捉え方次第だよね。いろんなスパン自分の変化を見てみると面白いよね。
  8. 提示された条件の……(以下略)。残りが後これくらいしかなかったら、っていうことだけじゃないよ。自分に使える時間が分かっている場合と分からない場合で行動が変わるの?という問いかけだよ。
  9. 思った通りになることが唯一の正解だと考える性格だから、かなり低い値をだしてるでしょ。結果をきちんと受け止めてみると、自分コントロールしてきた割合って多分もっと大きくなるはずだよ。 自分人生の判断は自分で下すという覚悟の度合いでもあるよね。謙虚になりすぎるのも、結果から目を反らしている気持ちの現れかもしれないよ。
  10. 提示された……(以下略)。物事をちゃんとやるのと、正しいことをするのと、そこに違いがある世の中って不条理だよね。どちらを優先するかが大事なんじゃなくて、そう考える理由があなたの世の中の捉え方を反映しているかもねっていう話ね。
  11. 品がなくて不当な批判(誹謗中傷ってことだよね)をするような「尊敬できる」人を想像できたなら、あなたにとって「尊敬」という言葉定義を再確認してみる必要がありそう。逆に、想像できなかったなら、身近な人と意見が食い違ったときにどう振る舞う?って考えてみるとどうだろう。いろんなケースを想定して、自分の心に負担にならない考え方を見つけておくと、実際の場面で楽になるよ。
  12. たった一つだけ(しかできないの)?」と思うのも、「たった一つだけ(で全てを伝えたい)!」と考えるのも自由だよね。
  13. 法律ではなく、法、あるいは真理であったらどう?正しいと信じてきたものと戦ってみる覚悟はある?ねじ曲げてやる度胸はある?
  14. 「ある」からといって、おかしいと感じる直感を鈍らせてはいない?批判は否定じゃないので、遠慮しないでどんどん伝えて良いと思うよ。
  15. 自分が他人と違うと気付くっていう話じゃないよ。ただやり方が異なっているという事実と、それに伴う変化を見比べてみようね、というだけの話。自分の行動に理屈が伴っているかどうかの確認作業だね。
  16. 昔のあなたはそれを不満に感じていたよね。今のあなたは、もっと純粋な興味で見ているような気がするよ。どうしてそれを疑問に感じたんだろうね、どうしてそれを考えるんだろうね。
  17. 理由なんて本当にあったのかな。むりやり理由をつけてない?なりたい自分がたくさんあって、手が回らないってだけでもいいんだよ。
  18. 気付いているのなら、じきに卒業する時が来るよ。でもきっとまだ気付いていないだろうね。離れられたときに、しがみついたままでは見えなかったいろんな姿が見えてくるものだよ。
  19. 特定の地名じゃなくて、気候や近所の雰囲気や便利さや快適さで答えても良いんだよ。どうしても引っ越さなきゃいけない場面、必要は無いけど引っ越したくなる場面、思い描く行き先は同じかな。
  20. あなたは押さない人でしょ。なんでも無理に教訓を得なくてもいいんだよ。
  21. どっちかに偏らなきゃだめかな。あなたなら、どれくらいの割合で混ぜ合わせてみたい?
  22. 「なぜ?」って聞かれると、動揺しちゃうのはなぜなんだろうね。Whyって何?areってどういうこと?youって誰?わからないことは逆に聞き返してみるのもありだよ。
  23. その友達と同じような自分がいたとして、その自分とあなたは友達になりたいと思う?
  24. 悲しくなる気持ちはあなたの優しさの現れだと思うよ。でも友人はあなただけのものじゃないよね。変わっていくことは悲しいこと?そうなるべくしてそうなった人たちの門出をこれからもまた笑顔で見送ってあげようね。
  25. 誰に感謝するのかではなくて、どういう状況に対して感謝するのか、だよ。本当に尊敬に値する相手は、感謝の表し方や対象にはこだわらないものだと思うよ。
  26. そうなった時にどう振る舞うかを決めてしまえば、どっちでも価値のあるものにしてしまえるよね。
  27. 誰もがやらなかったことにも理由はあると思うんだ。やってみもしないのにわかっちゃうっていう体験もあるでしょ?そうなるように考えるトレーニングも大切だと思うんだ。
  28. 人一倍怖がりのあなたには、逆に、恐れていたけれど起こらなかったことが、世の中にどれほどたくさんあるのかも、数えてみて欲しいと思う。
  29. 多分それは腹が立ったことじゃなくて、自分の中で消化できなかった出来事だよね。時間をかけて結論を出していくこともあれば、あるときふいにすっきりすることもあるんじゃないかな。あなたは忘れたと言ってたけれど、僕は5年前にあなたを怒らせてしまったこと、いまでも覚えているし、あなたを理解する上で、それは大切なことだと感じてる。
  30. 幸せで特別な思い出、その出来事と理由が、もしいつまでも変わらずにあるとしたら、僕らは本当に成長しているのかなあ。
  31. やる気の形は一種類じゃないよね。どんな種類のやる気を持ってる?どんなふうに使い分けてる?周りの人をちゃんと利用してる?
  32. 焦らなくていいよ。そのときが来たら、あなたは考える前にもう始めているよ。大丈夫
  33. 「減るもんじゃないんだから、見せてよ」っていうのと同じでさ、失うものを怖れているなら、何か大事なものを既に手に入れているってことかもしれないね。それを手放してでも手に入れたいものは何?って考えるべきかもね。
  34. 願わくば、それが自分であって欲しいな、なんて。といいつつ、自分だって、すごくたくさんのそういった人たちがいるからなあ。
  35. 自分達だけは違うって、きっと誰もがそう主張していると思うよ。確かにみんなそれぞれ違っているんだろうね。でも、もしそうならさ、尊敬する対象完璧でなくちゃいけないかな。一人一人が完成された世界を目指す必要はあるのかな。みんなで力を合わせて、老若男女、入れ替わり立ち替わり補い合うのでは幸せにはできないかな。思った通りにならない状況は、そんなに受け入れがたいことかな。
  36. 「できない。けどやってしまう」って言わされちゃうよね。でも、できないからやらなくていいのかな。多分、そうではないと思うんだよね。結果を受け入れる覚悟のありかたじゃないかな、やっぱり。
  37. 一億円の価値をどんなふうにみたのかな。自分が生活するお金として見たのかな、それとも何かに使うお金として見たのかな。あなたのことだから、きっと自分のものにはしないだろうね。でも、自分の判断で最大限に有効に運用してやろうという考え方からも逃げていたりはしないかな。
  38. 選択肢を提示されたら……(以下略)。自分に見合った配分を知りたいよね。
  39. 感じるかどうかを問うているだけですよ。それが正しいとか正しくないとか考えてなかった?あなたのそのジャッジは必要だったかな?
  40. 世の中、タイミングでことが運ぶってこと、よくあるよね。自分の意志だけでそれができていたのかどうか、うまいこと誰かに背中を押されたのかもしれないし、違ったタイミングで振り返ると、また違ったものが見えてくるかもしれないね。
  41. 誰かに会いにいく以外のアクションも可能ですよ。今日と明日の区切りなんて便宜的なものですよ。
  42. 有名、魅力的、寿命。これらの言葉を、どんなふうにイメージ定義)した?言葉ってとってもカラフルだよ。一つの言葉にいろんなイメージを添えてみたいものだよね。
  43. この質問にみじんも疑問を抱かなかったなら、「〜の違いは何?」と尋ねられることで、違っていることを前提として刷り込まれているかもしれないね。
  44. これもまた「いつやるの?」と問うことでやることを前提に考えさせるトリックだよね。
  45. これも同様に。この手の質問を重ねることで、無意識のうちに、まるで自分が、どんな失敗をも怖がっているものと思い込まれされていたりしない?平気な顔で失敗していること、身近に意外とあるのでは?
  46. 「ある」と答えることに躊躇いを覚えたのは、自分の意志がない人だって指摘されたと脅えているからじゃない?誰にだって重みの違う用件があるものだから、ルーズ決断っていうものもあってもいいと思うんです。じゃないとくつろげないよね。逆にまるっきり「ない」のであれば、ひとりよがりすぎるかも。第三者視点を活用するということを意識してみようか。
  47. 尋ねられた瞬間に、反射的に意識してしまうよね、こういうことって。尋ねることで無意識顕在化させるのは相手をコントロールする手段としてはポピュラーなんですよ。とはいえ、我に返る方法を各々が独自に見つけ出すと役立つから、自分なりに探してみると良いかも。
  48. 四六時中、大好きなことを持っていなくちゃ充実していないとか、気持ちを素直に表現しなくちゃいけないだとか、そういったきまりはないと思うな、ねんのため。なかったなら「ない」でいいんだよ。とはいえ、大好きとかloveってどういうことなのかを考えるのもまた楽しいよね。
  49. Can you?じゃなくてwill you?と尋ねているということは、「覚えていられる?」ではなくて「覚えていようと思う?」という意志の問いかけなんだろうね、多分。ひょっと「覚えていられる?」と問われていたとしても、「覚えていたいと思う」ではなくて、「覚えていられる」と答えたのであれば、質問に対して受け身になり過ぎているかもしれないね。
  50. 決断の最終段階でそれを問うようなら、その決断自分で下したものではなくなるのでしょうね。で、それがどれほど大事なの?とさらに問うてみましょうか。結果よりもプロセスを重視する思考の偏りがみつかるかもしれないよ。頑張ったら必ず報われるのは公平なのかなとか、努力の方向はそれでいいのかなっていうことは、折に触れて考えていきたいね。

そもそも、この質問の一つ一つに律儀に反応している時間が勿体ないと思えるくらい、目の前にやりたいことが待ち構えているようになるのが理想なんだろうけど。そういう意味では、あなたのように、途中で飽きてここまで読み飛ばしてくるようなずぼらさも、自由な思考の一つの形なのかもね。

2009-08-01

http://anond.hatelabo.jp/20090801073824

うん、まぁここであえて言わせてもらうが、じゃあ俺はpull型マンセーかというと別にそこまででもないんだけどね。

google先生を駆使して興味を持った分野だけ調べ続けて、できあがるのはいわゆるヲタクネガティブ意味で、偏った人間)だろう。

社会常識とか、話題とか、なんだかんだ人間はある程度共有しないとやっていけない。

まぁだから、push型のメディアをかじるということも、ある程度までなら意義のあることだとは思っている。

いわゆる「社会義務教育」みたいなもんっていうのかなぁ、そういうベース的なものをpushメディアを通して

最低限は築きつづけた上で、かと言ってそれらに流され続けて自分を見失うようなことはない程度のリテラシーは持つ。

その上で先に述べたように情報をうまくpullし、興味のあること・必要なことを伸ばしていく…ってのが理想

2009-06-18

GitHubにあるプロジェクトをいじりたい

という場合、どーゆーブランチを切って普段どういう pull や commit をすればいいの?

ブランチよくわからなかったから全部 master にして自分のスペースに push したら変な履歴ごと公開されて寝込みそうなんだけど

2009-04-14

アジア21世紀の成長センター

 アジアの成長を日本の成長につなげる為に、アジア総合開発計画の策定や、アジアの広域インフラ整備への支援などをぶち上げたらしい。

 アジアが成長するならば、それを世界にとって望ましい方向に誘導する為に関わるべきであろう。しかし、成長しない物を成長させる為に、日本国民血税を他国に注ぎ込むODAのばら撒きや工場の移設、技術供与は、必要ない。当然、仮にアジアが成長するとしても、世界にとって望ましい方向に誘導する為の発言力は、資金や技術の提供で得るべきではない。

 アジアには、経済を成長させる前に、民度を成長させなければならない国家が多すぎる。そして、民度を上げるには、政治体制が障害になっている場合が多い。

 政治体制放置たま経済を成長させたり、生活水準を快適化したりすると、好ましくない政治体制を延命させる事に繋がる。好ましくない政治体制をとっている国家には、民度を引き上げる為の方策が必要になる。内政干渉にならずに、政治体制の欠陥を自覚させるには、国境の無いメディアであり、しかも、閲覧者の閲覧行為が無ければ見れないwebが望ましい。これは、pushメディアでない事が有利になる使い方となる。

 web上のコンテンツを充実させる事と、コンテンツクリエイターを増やし、その活動を秋葉原等に集約して観光資源とする事は、つまるところ、お金の問題でしかなく、新しいスポンサーを作り出す事は不可能であるから、既存のお金の流れを、権利を独占してピンはねしている既得権者から実際に物作りをしている人へと渡るように調整する事が手段となる。

 ド田舎温泉地を観光資源化しても、一度行けばそれで終わりであり、パリロンドンNYのような、リピーターが確保できる観光地にするには、毎日進化し、変化する芸術や学術を、観光資源としなければならない。ハコ物を作ればそれでおしまいという考え方とは正反対であるし、何が支持されるかわからないので、税金でやらせるようなやり方は、失敗しか生み出さない。

 低炭素革命については、低炭素化の為に買い換えるのでは、逆効果である。需要を生み出す為の手段としては、確実に間違っている。使える物は最後まで使いきるという考え方こそが、低炭素な考え方であり、これは、需要活性化とは、正反対になる。すくなくとも、需要を生み出せるような話では無い。なんでこの話が出てくるのか、理解しがたい。燃費の良い自動車に買い換えるならば25万円を税金から補助するという話みたいな物で、自動車を買い替えた時にかかる費用と、節約できるガソリン代から算出できるメリットとを比べれば、タクシー業者並に走り回らないと元が取れないという間抜けな話になる。自動車を処分して、必要な時にレンタカーを借りるというやり方の方が、駐車場代の高い都会ではコスト的に有利になってしまうし、自動車製造する時に発生する炭素を排除できる。一人だけの移動手段としては、バイクの方が安いし燃費も良いとなる。

 あとは、健康長寿社会という話であるが、健康に気を使う人を増やすには、まず、企業従業員使い捨てにしない事である。また、健康に気を使いたくとも、代わりは幾らでも居るという雇用側の態度では、まともな労働者は居なくなる。外国人労働者を使わなければならないほど国民に嫌われている企業は、日本から出て行くか、行動を改めるかの二者択一をせまるべきである。

 公害を撒き散らし、従業員使い捨てにして国際競争に勝つのならば、経営者は誰でも良いとなる。公害を防ぎ、多くの人が従業員になりたがる雇用環境を維持しつつ、国際競争に勝ってこそ、高額の役員報酬を受け取れる人材となる。同様に、財政赤字を撒き散らし、賄賂とりまくって政権を取り、維持するのであれば、政治家地域にばら撒きを持ってきてくれる人ならば誰でも良いとなる。財政を黒字に保ち、身辺に一片の曇りも無い状態を維持しつつ、国益を増進させてこそ、高額の歳費を受け取れる人材となる。

 目的を達成する手段の選択や、役職や地位にふさわしい行動を取っているかどうかを、客観的にわきまえられる能力は、民度の基礎である。

2009-03-24

http://anond.hatelabo.jp/20090323132410

できた。

def every_case(arr, *args)
  if(arr.length&gt;1)
    arr.each do |elm| #


  

2009-03-18

公明党都議選重視?

コピーして、test.htaのような拡張子HTAで保存

HTAプログラム

 ↓

<html&gt;

<head&gt;

<style type="text/css"&gt;dt{float:left;clear:left;width:10em;}</style&gt;

<meta content="charset=Shift_JIS"/&gt;

</head&gt;

<body&gt;

<script type="text/javascript"&gt;</p&gt; <p&gt;window.onload = init;</p&gt; <p&gt;var url = [</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/h19sangiin/san_kekka/h19san_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm"&gt;http://www.senkyo.metro.tokyo.jp/h17shugiin/sokuhou/7kaijyo_s.htm</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm"&gt;http://www.senkyo.metro.tokyo.jp/h17togisen/sokuhou/2kaijyo_s.htm</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/data/h16san_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html"&gt;http://www.senkyo.metro.tokyo.jp/data/h15shu_hkai.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_01_03.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_02_05.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data03_04.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data03_04.html</a&gt;",</p&gt; <p&gt; "<a href="http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html"&gt;http://www.senkyo.metro.tokyo.jp/data/data01_05_05.html</a&gt;"</p&gt; <p&gt;];</p&gt; <p&gt;var base = "<a href="http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/"&gt;http://www.senkyo.metro.tokyo.jp/data/tokuhyo_23ku/</a&gt;";</p&gt; <p&gt;var file = ["chiyoda","chuou","minato","shinjyuku","bunkyo",</p&gt; <p&gt; "taitho","sumida","koutho","sinagawa","meguro",</p&gt; <p&gt; "ohta","setagaya","shibuya","nakaono","suginami",</p&gt; <p&gt; "toshima","kita","arakawa","itabashi","nerima",</p&gt; <p&gt; "adachi","katushika","edogawa"];</p&gt; <p&gt;for(var i=0; i<23; i++){</p&gt; <p&gt; url.push(base + file[i] + "\.html");</p&gt; <p&gt;}</p&gt; <p&gt;var id = [</p&gt; <p&gt; "2007 参院比", "2005 衆院比", "2005 都議会", "2004 参院比", "2003 衆院比",</p&gt; <p&gt; "2001 参院比", "2001 都議会", "2000 衆院比", "1998 参院比", "1997 都議会"</p&gt; <p&gt;];</p&gt; <p&gt;var ku = [</p&gt; <p&gt; "千代田","中央","港","新宿","文京",</p&gt; <p&gt; "台東","墨田","江東","品川","目黒",</p&gt; <p&gt; "大田","世田谷","渋谷","中野","杉並",</p&gt; <p&gt; "豊島","北","荒川","板橋","練馬",</p&gt; <p&gt; "足立","葛飾","江戸川"</p&gt; <p&gt;];</p&gt; <p&gt;var regexku = new RegExp("(" + ku.join("|") + ")区");</p&gt; <p&gt;var iframe = [];</p&gt; <p&gt;var data = {};</p&gt; <p&gt;var parse = [ function(){</p&gt; <p&gt; var d = iframe[0].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<10; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "0"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[1].contentWindow.document;</p&gt; <p&gt; var nobr = d.getElementsByTagName("nobr");</p&gt; <p&gt; for(var i=0, l=nobr.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(nobr[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=nobr[i].parentNode; j<4; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "1"] = e.firstChild.nodeValue;</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[2].contentWindow.document;</p&gt; <p&gt; var nobr = d.getElementsByTagName("nobr");</p&gt; <p&gt; for(var i=0, l=nobr.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(nobr[i].firstChild.nodeValue) &amp;&amp; nobr[i].parentNode.tagName == "SPAN"){</p&gt; <p&gt; for(var j=0, e=nobr[i]; j<6; j++){</p&gt; <p&gt; e = e.parentNode;</p&gt; <p&gt; }</p&gt; <p&gt; var e2 = e.nextSibling.nextSibling.firstChild.childNodes[2].firstChild;</p&gt; <p&gt; var k = 0;</p&gt; <p&gt; data[RegExp.$1 + "2"] = 0;</p&gt; <p&gt; while(e2){</p&gt; <p&gt; if(e2.firstChild.firstChild.nodeValue.indexOf("公明党") != -1){</p&gt; <p&gt; data[RegExp.$1 + "2"] += parseInt(e2.parentNode.nextSibling.childNodes[k+2].firstChild.nodeValue.replace(",",""), 10);</p&gt; <p&gt; }</p&gt; <p&gt; e2 = e2.nextSibling;</p&gt; <p&gt; k++;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "2"] = int2str(data[RegExp.$1 + "2"]);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[3].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<19; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "3"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[4].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; var regexku2 = /(大田|世田谷|練馬|足立|江戸川)/;</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "4"] = td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; continue;</p&gt; <p&gt; }</p&gt; <p&gt; if(regexku2.test(td[i].firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "4"] = (data[RegExp.$1 + "4"] || 0) </p&gt; <p&gt; + parseInt(td[i].nextSibling.nextSibling.firstChild.nodeValue.replace(",","").replace(/\.\d+/,""));</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; for(var j=0; j<5; j++){</p&gt; <p&gt; data[ku[[10,11,19,20,22][j]]+"4"] = int2str(data[ku[[10,11,19,20,22][j]]+"4"]);</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[5].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<10; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "5"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[6].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<7; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "6"] = e.firstChild.firstChild.nodeValue.replace(/\.\d+/,"").replace("-","0");</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[7].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; for(var j=0, e=td[i]; j<9; j++){</p&gt; <p&gt; e = e.nextSibling;</p&gt; <p&gt; }</p&gt; <p&gt; data[RegExp.$1 + "7"] = e.firstChild.firstChild.nodeValue;</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(){</p&gt; <p&gt; var d = iframe[8].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if(regexku.test(td[i].firstChild.firstChild.nodeValue)){</p&gt; <p&gt; data[RegExp.$1 + "8"] = int2str(td[i].nextSibling.firstChild.firstChild.firstChild.nodeValue);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; show();</p&gt; <p&gt;}, function(n){ return function(){</p&gt; <p&gt; var d = iframe[n+9].contentWindow.document;</p&gt; <p&gt; var td = d.getElementsByTagName("td");</p&gt; <p&gt; data[ku[n]+"9"] = 0;</p&gt; <p&gt; for(var i=0, l=td.length; i<l; i++){</p&gt; <p&gt; if((((td[i].firstChild || 0).firstChild || 0).nodeValue || "").indexOf("公明") == 0){</p&gt; <p&gt; data[ku[n]+"9"] += parseInt(td[i].parentNode.lastChild.firstChild.firstChild.nodeValue.replace(",",""));</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt; data[ku[n]+"9"] = int2str(data[ku[n]+"9"]);</p&gt; <p&gt; show();</p&gt; <p&gt;}}];</p&gt; <p&gt;function init(){</p&gt; <p&gt; for(var i=0; i<23; i++){</p&gt; <p&gt; var dl = document.createElement("dl");</p&gt; <p&gt; dl.appendChild(document.createTextNode("\n【" + ku[i] + "区における公明票】\n"));</p&gt; <p&gt; for(var j=0; j<10; j++){</p&gt; <p&gt; var dt = document.createElement("dt");</p&gt; <p&gt; var dd = document.createElement("dd");</p&gt; <p&gt; dt.innerText = id[j];</p&gt; <p&gt; dl.appendChild(dt);</p&gt; <p&gt; dl.appendChild(dd);</p&gt; <p&gt; }</p&gt; <p&gt; document.body.firstChild.appendChild(dl);</p&gt; <p&gt; }</p&gt; <p&gt; for(var i=0; i<32; i++){</p&gt; <p&gt; var e = document.createElement("iframe");</p&gt; <p&gt; iframe[i] = e;</p&gt; <p&gt; e.style.display = "none";</p&gt; <p&gt; if(i<9) var f = parse[i];</p&gt; <p&gt; else var f = parse[9](i-9);</p&gt; <p&gt; e.attachEvent("onload", f);</p&gt; <p&gt; e.src = url[i];</p&gt; <p&gt; document.body.appendChild(e);</p&gt; <p&gt; }</p&gt; <p&gt;}</p&gt; <p&gt;function show(){</p&gt; <p&gt; for(var i=0; i<23; i++){</p&gt; <p&gt; var dl = document.body.firstChild.childNodes[i];</p&gt; <p&gt; for(var j=0; j<10; j++){</p&gt; <p&gt; var dt = dl.childNodes[j*2+1];</p&gt; <p&gt; dt.innerText = id[j] + " " + (data[ku[i]+j] || "");</p&gt; <p&gt; dt.nextSibling.innerText = bar(data[ku[i]+j], j);</p&gt; <p&gt; }</p&gt; <p&gt; }</p&gt; <p&gt;}</p&gt; <p&gt;function int2str(num){</p&gt; <p&gt; return new String(num).split("").reverse().join("").replace(/(\d{3})/g,"$1,").split("").reverse().join("");</p&gt; <p&gt;}</p&gt; <p&gt;function bar(str, flag){</p&gt; <p&gt; str = str || "";</p&gt; <p&gt; if(str == "" || str.length < 5) return "";</p&gt; <p&gt; var num = parseInt(str.match(/\d+/)) + 1;</p&gt; <p&gt; var arrow = (flag == 2 || flag == 6 || flag == 9) ? " ←" : "";</p&gt; <p&gt; var _bar = new Array(num).join("|") + arrow;</p&gt; <p&gt; return _bar;</p&gt; <p&gt;}</p&gt; <p&gt;</script&gt;

</body&gt;

</html&gt;

2009-03-11

[][][][][][]

Deploy Merb, Sinatra, or any Rack App to Heroku

http://blog.heroku.com/archives/2009/3/5/32_deploy_merb_sinatra_or_any_rack_app_to_heroku/

http://heroku.com/pages/quickstart

http://heroku.com/docs

http://heroku.com/

HerokuをGit経由で使ってみる

http://d.hatena.ne.jp/aki-s-119/20081110/1226335713

http://github.com/guides/using-git-and-github-for-the-windows-for-newbies

Windows から Git を使う方法

http://d.hatena.ne.jp/kusakari/20080715/1216091060

msysgit - Google Code

http://code.google.com/p/msysgit/

PuTTYssh2プロトコルを使ってssh接続

http://net-newbie.com/putty.html

&gt;heroku help
=== General Commands

 help                         # show this usage

 list                         # list your apps
 create [<name&gt;]              # create a new app

 keys                         # show your user's public keys
 keys:add [<path to keyfile&gt;] # add a public key
 keys:remove <keyname&gt;        # remove a key by name (user@host)
 keys:clear                   # remove all keys

=== App Commands (execute inside a checkout directory)

 info                         # show app info, like web url and git repo
 open                         # open the app in a web browser
 rename <newname&gt;             # rename the app

 sharing:add <email&gt;          # add a collaborator
 sharing:remove <email&gt;       # remove a collaborator

 domains:add <domain&gt;         # add a custom domain name
 domains:remove <domain&gt;      # remove a custom domain name
 domains:clear                # remove all custom domains

 rake <command&gt;               # remotely execute a rake command
 console <command&gt;            # remotely execute a single console command
 console                      # start an interactive console to the remote

 restart                      # restart app servers
 logs                         # fetch recent log output for debugging
 logs:cron                    # fetch cron log output

 bundles                      # list bundles for the app
 bundles:capture [<bundle&gt;]   # capture a bundle of the app's code and dat
 bundles:download             # download most recent app bundle as a tarba
 bundles:download <bundle&gt;    # download the named bundle
 bundles:animate <bundle&gt;     # animate a bundle into a new app
 bundles:destroy <bundle&gt;     # destroy the named bundle

 destroy                      # destroy the app permanently

=== Example story:

 rails myapp
 cd myapp
 (...make edits...)
 git init
 git add .
 git commit -m "my new app"
 heroku create myapp
 git remote add heroku git@heroku.com:myapp.git
 git push heroku master

2009-01-16

面倒くさくなった

// ==UserScript==
// @name           anond
// @namespace      http://anond.hatelabo.jp/
// @include        http://anond.hatelabo.jp/?page=*
// ==/UserScript==
function anond(doc) {
    $X(".//div[@class='section'][.//h3/a[2][starts-with(@href, 'http://anond.hatelabo.jp')]]", doc, Array).forEach(function(node){
        node.style.display = "none";
    });
    $X(".//h3/a[1]", doc, Array).forEach(function(node){
        var a = document.createElement("a");
        a.name = node.pathname;
        a.href = "#" + node.pathname + "/footer";
        a.innerHTML = "V";
        node.parentNode.insertBefore(a, node);
    });
    $X(".//p[@class = 'sectionfooter']/a[1]", doc, Array).forEach(function(node){
        var a = document.createElement("a");
        a.name = node.pathname + "/footer";
        a.href = "#" + node.pathname;
        a.innerHTML = "^";
        node.parentNode.insertBefore(a, node);
        node.parentNode.insertBefore(document.createTextNode(" | "), node);
    });
}

anond(document);
if (AutoPagerize.addDocumentFilter)
    AutoPagerize.addDocumentFilter(anond);


// by http://lowreal.net/blog/2007/11/17/1
// $X(exp);
// $X(exp, context);
// $X(exp, type);
// $X(exp, context, type);
function $X (exp, context, type /* want type */) {
    if (typeof context == "function") {
        type    = context;
        context = null;
    }
    if (!context) context = document;
    var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) {
        var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
        if (o) return o;
        return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : "";
    });

    switch (type) {
        case String:
            return exp.evaluate(
                context,
                XPathResult.STRING_TYPE,
                null
            ).stringValue;
        case Number:
            return exp.evaluate(
                context,
                XPathResult.NUMBER_TYPE,
                null
            ).numberValue;
        case Boolean:
            return exp.evaluate(
                context,
                XPathResult.BOOLEAN_TYPE,
                null
            ).booleanValue;
        case Array:
            var result = exp.evaluate(
                context,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                null
            );
            var ret = [];
            for (var i = 0, len = result.snapshotLength; i < len; i++) {
                ret.push(result.snapshotItem(i));
            }
            return ret;
        case undefined:
            var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
            switch (result.resultType) {
                case XPathResult.STRING_TYPE : return result.stringValue;
                case XPathResult.NUMBER_TYPE : return result.numberValue;
                case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
                case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
                    // not ensure the order.
                    var ret = [];
                    var i = null;
                    while (i = result.iterateNext()) {
                        ret.push(i);
                    }
                    return ret;
                }
            }
            return null;
        default:
            throw(TypeError("$X: specified type is not valid type."));
    }
}

2008-12-26

[]Hatena::Bookmark::24H::Chart

修正:いい加減&が変換されるのを何とかしてほしい

解説:Hatena::Bookmark::24H(http://hatebu24h.ashitano.in/)に、トップエントリの獲得したブックマーク数の推移のチャートを加えます。

// ==UserScript==
// @name           chart of Hatena::Bookmark::24H
// @namespace      http://anond.hatelabo.jp/
// @include        http://hatebu24h.ashitano.in/*
// ==/UserScript==

var url = unescape("http://chart.apis.google.com/chart?chs=160x60%26cht=ls%26chd=t:");
url = url + $X("//div[@class='clocktxt']", Array).map(function(s){return s.firstChild.nodeValue}).join(",");
//var id = $X("//h3/a/@href")[0].nodeValue;
//url = url + $X("//div[@class='entrytitle' or @class='entrytitle2'][.//a[@href='"+id+"']]/../preceding-sibling::div[1]", Array).map(function(s){return s.textContent.match(/\d+/)}).join(",");
var before = makeElements({
    nodeName: "div",
    className: "sidebox",
    childNodes: [{
        nodeName: "div",
        className: "sidetitle",
        innerHTML: "Recent top entry chart"
      },{
        nodeName: "div",
        className: "sidetitle",
        childNodes: {
            nodeName: "img",
            src: url
        }
    }]
});
var after = $X("//div[@class='sidebox']", Array)[0];
after.parentNode.insertBefore(before, after);

// util

// var 0.01
function makeElements(obj) {
    if (typeof obj != "object")
        return document.createTextNode(obj);
    if (obj instanceof Array)
        return obj.map(makeElements);
    var node = document.createElement(obj.nodeName);
    delete obj.nodeName;
    if (obj.childNodes) {
        [].concat(makeElements(obj.childNodes)).forEach(node.appendChild, node);
        delete obj.childNodes;
    }
    function extend(dst, src) {
        for (var i in src) {
            if (typeof src[i] == "object" &amp;&amp; dst[i] &amp;&amp; typeof dst[i] == "object")
                extend(dst[i], src[i]);
            else
                node[i]=obj[i];
        }
    }
    extend(node, obj);
    return node;
}

// by http://lowreal.net/blog/2007/11/17/1
// $X(exp);
// $X(exp, context);
// $X(exp, type);
// $X(exp, context, type);
function $X (exp, context, type /* want type */) {
    if (typeof context == "function") {
        type    = context;
        context = null;
    }
    if (!context) context = document;
    var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) {
        var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
        if (o) return o;
        return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : "";
    });

    switch (type) {
        case String:
            return exp.evaluate(
                context,
                XPathResult.STRING_TYPE,
                null
            ).stringValue;
        case Number:
            return exp.evaluate(
                context,
                XPathResult.NUMBER_TYPE,
                null
            ).numberValue;
        case Boolean:
            return exp.evaluate(
                context,
                XPathResult.BOOLEAN_TYPE,
                null
            ).booleanValue;
        case Array:
            var result = exp.evaluate(
                context,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                null
            );
            var ret = [];
            for (var i = 0, len = result.snapshotLength; i < len; i++) {
                ret.push(result.snapshotItem(i));
            }
            return ret;
        case undefined:
            var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
            switch (result.resultType) {
                case XPathResult.STRING_TYPE : return result.stringValue;
                case XPathResult.NUMBER_TYPE : return result.numberValue;
                case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
                case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
                    // not ensure the order.
                    var ret = [];
                    var i = null;
                    while (i = result.iterateNext()) {
                        ret.push(i);
                    }
                    return ret;
                }
            }
            return null;
        default:
            throw(TypeError("$X: specified type is not valid type."));
    }
}

2008-12-15

mixi ホーム画面のマイミク一覧をログイン時間順で表示するグリモン

ふと思い立って昼休みに作った。経過時間別に背景色もつきます。

グループ分けとかしてるとうまく動かないかも。

order_home_mymixi.user.js

// ==UserScript==
// @name          order_home_mymixi
// @namespace     http://anond.hatelabo.jp/
// @include       http://mixi.jp/
// @include       http://mixi.jp/home.pl
// ==/UserScript==

(function() {
    if (window != window.parent) return;

    var homeTds = document.evaluate('//div[@id="mymixiList"]//td', document.body, null, 7, null);
    for (var i = 0; i < homeTds.snapshotLength; i++) homeTds.snapshotItem(i).innerHTML = 'loading...';

    GM_xmlhttpRequest({
        method: 'GET',
        url: 'http://mixi.jp/list_friend_simple.pl',
        onload: function(res) {
            var friends = [];
            var bgColor = {
                '01': '#ffffff',
                '02': '#fee7c6',
                '03': '#ffd8a7'
            };

            var div = document.createElement('div');
            div.innerHTML = res.responseText;
            var tds = document.evaluate('//div[@id="friendList"]//td', div, null, 7, null);
            for (var i = 0; i < tds.snapshotLength; i++) {
                var td = tds.snapshotItem(i);
                var klass = td.getAttribute('class');
                if (!klass || klass.search(/^iconState(01|02|03)/) == -1) continue;
                friends.push({
                    color: bgColor[RegExp.$1],
                    anchor: td.getElementsByTagName('a')[0],
                    name: td.getElementsByTagName('p')[0].innerHTML.replace(/^(.+)\(/, '$1 (')
                });
            }

            for (var i = 0; i < homeTds.snapshotLength; i++) {
                var td = homeTds.snapshotItem(i);
                td.innerHTML = '';
                td.style.background = friends[i].color;
                td.appendChild(friends[i].anchor);
                var span = document.createElement('span');
                span.innerHTML = friends[i].name;
                td.appendChild(span);
            }
        }
    });
})();

2008-07-07

もん毛スター for firefox

動作未確認。すんげー冗談半分。

// Hatena Monge Star user script
// 2008-07-07
// by masda. (http://anond.hatelabo.jp/20080707043247)

// ==UserScript==
// @name           Hatena Monge Star
// @namespace      http://anond.hatelabo.jp/20080707043247
// @description    Hatena Monge Star
// @include        http://b.hatena.ne.jp/entry/*
// @version        0.3.1
// ==/UserScript==

// deriving from [http://d.hatena.ne.jp/Hamachiya2/20080707/HatenaBlackStar2] ver Firefox
//               [http://f.hatena.ne.jp/hatenacinnamon/20070109001332]
// Thx! and CUTE!


location.href = 'javascript:(' + function() { (function (w) {

	if (typeof(w.Ten) == 'undefined') {
		return;
	}

	HatenaBookmarkMongeStar = new Ten.Class({
		initialize: function(li, entryTitle) {
			var comment = '';
			var tags    = '';
			var commentSpans = Ten.DOM.getElementsByTagAndClassName('span', 'comment', li);
			if (commentSpans.length > 0) {
				comment = Ten.DOM.scrapeText(commentSpans[0]);
			}

	        var tagsSpans = Ten.DOM.getElementsByTagAndClassName('span', 'user-tag', li);
			if (tagsSpans.length > 0) {
				$A(tagsSpans[0].getElementsByTagName('a')).each(function(a) {
					tags += '[' + Ten.DOM.scrapeText(a)+ ']';
				});
			}

			var title = tags + comment;
			if (title.length == 0) {
				var name = Ten.DOM.scrapeText(li.getElementsByTagName('a')[1]);
				title = name + 'のブックマーク';
	        }

			// this.uri   = 'http://b.hatena.ne.jp/keyword/' + li.getElementsByTagName('a')[1].href;
			var u = li.getElementsByTagName('a')[1].href;

			if (u.indexOf('#') == -1) {
				this.uri = u + '#_HatenaMongeStar';
			} else {
				this.uri = u + '_HatenaMongeStar';
			}

			this.title = title + ' - ' + entryTitle;

			this.comment_container = Hatena.Star.EntryLoader.createCommentContainer();
			var target = commentSpans[0] || li;
			target.appendChild(this.comment_container);

			this.star_container = Hatena.Star.EntryLoader.createStarContainer();
			this.star_container.className = 'hatena-star-star-container MongeStarContainer';
			target.appendChild(this.star_container);
		}
	});


	var tryCount = 0;
	var tryMax = 300;
	function waitForHatenaStar() {
//		if (Hatena.Star.EntryLoader.loaded) {
//			Hatena.Star.EntryLoader.loaded = false;
		var s = document.getElementsByClassName('hatena-star-add-button');
		if (s.length) {

			Hatena.Star.EntryLoader.loaded = false;

			Hatena.Star.EntryLoader.loadEntries = function() {
				var entries = [];
				var title = Ten.DOM.scrapeText(Ten.DOM.getElementsByTagAndClassName('span', 'title', document.body)[0]);
				var ul = document.getElementById('bookmarked_user');
				if (ul) {
					$A(ul.getElementsByTagName('li')).each(function(li) {
						if (li.className != 'more') {
							entries.push(new HatenaBookmarkMongeStar(li, title));
						}
					});
				}
				return entries;
			}
			new Hatena.Star.EntryLoader();

		} else {
			if (++tryCount > tryMax) {
				setTimeout(waitForHatenaStar, 400);
			}
		}
	}

	setTimeout(waitForHatenaStar, 500);

})(window); }.toString() + ')()';



GM_addStyle(<><![CDATA[

	.MongeStarContainer {
		margin-left: 4px;
	}

	.MongeStarContainer .hatena-star-add-button {
		background-color: #fc6 ! important;
	}

	.MongeStarContainer a {
		text-decoration: none ! important;
		color: #f80 ! important;
		font-size: 10px;
		position: relative;
	}

	.MongeStarContainer a:before {
		content: '毛';
		font-size:small;
	}

	.MongeStarContainer a .hatena-star-star {
		filter: alpha(opacity=00);
		-moz-opacity:0.00;
		opacity:0.00;

		position: absolute;
		top: 0;
		left: 0;
	}

	.MongeStarContainer .hatena-star-inner-count {
		color: #f90 ! important;
	}

]]></>);

動いたらいいな-

2008-06-05

Amazon商品ページから広島市図書館を検索するブックマークレット

地域ばれするので増田メモ

ブックマーク登録用(1行)

javascript:var li = document.evaluate('//table/tbody/tr/td/div/ul/li/text()', document, null, 6, null); var isbn = []; for (var x = 0; x < li.snapshotLength; x++) { if (li.snapshotItem(x).nodeValue.match(/[0-9]{10}/)){isbn.push(li.snapshotItem(x));} }; document.location.href=('http://www.library.city.hiroshima.jp/cgi-bin/Sopcsken.sh?p_mode=1&g_mode=0&ryno=c_key=&c_date=&list_cnt=10&mad_list_cnt=&brws=ncdet&ktyp9=shk|atk|spk|kek&itfg9=c&ser_type=1&stkb=&srsl1=1&srsl2=2&srsl3=3-0&srkbs=00|10|01|11|02|12|13|21|20|30|40&lckns=01|02|03|04|05|06|07|08|09|10|11|12&tgid=tyo:010A&tkey=' + isbn[0].nodeValue);

編集用(元のコード

var li = document.evaluate('//table/tbody/tr/td/div/ul/li/text()', document, null, 6, null);
var isbn = [];
for (var x = 0; x < li.snapshotLength; x++) {
  if (li.snapshotItem(x).nodeValue.match(/[0-9]{10}/)) {
    isbn.push(li.snapshotItem(x));
  }
}; isbn[0];
document.location.href=('http://www.library.city.hiroshima.jp/cgi-bin/Sopcsken.sh?p_mode=1&g_mode=0&ryno=c_key=&c_date=&list_cnt=10&mad_list_cnt=&brws=ncdet&ktyp9=shk|atk|spk|kek&itfg9=c&ser_type=1&stkb=&srsl1=1&srsl2=2&srsl3=3-0&srkbs=00|10|01|11|02|12|13|21|20|30|40&lckns=01|02|03|04|05|06|07|08|09|10|11|12&tgid=tyo:010A&tkey=' + isbn[0]);

2008-05-05

Push型とかPull型とかでチャットシステムを作ることのバカバカしさ

Push型のチャット

クライアントが書き込む→サーバから他のクライアントに通知→クライアントメッセージを受信

Pull型のチャット

クライアントが書き込む→クライアントが定期的にリロードする→メッセージが反映される

確かにチャットとしてはPush型の方が綺麗だけど、クライアントの数が少ない時ってクライアントが1秒に1回ぐらいでリロードしても全然問題ない。

問題はクライアントの数が多くなった時だけど、チャットっていうシステムクライアントが多くなるほど書き込む人が増える。

だからPushだろうとPullだろうと区別はなくなってしまうわけで。

Push型の通知の間隔を決めるようなことをするぐらいなら、Pull型でリロードの間隔決めてるのと同じわけだし。

結局のところ、PushだPullだで騒いでるくせにいざアプリケーション作らせるとチャットを作っちゃうような人って、Technology Drivenの塊みたいな人なんだろうな。

2008-02-23

id:sakuratei

id:kira_club

You are one of the best contributors to push the quantity of Hatena Diary up.

Thank you!

2008-01-02

はてブメタブックマークがうざすぎる

なのでJavaSciptの勉強がてら、メタブックマークを見えなくするユーザースクリプトを作った。DOMがよくわからないので変なところがあるかも。スコープノードリストなんかもよくわかってないので、無駄なところもあるかも。

以下ソース

Opera用
// ==UserScript==
// @name      Metabu Eraser
// @include   http://b.hatena.ne.jp/entrylist*
// @author    Hatena Anonymous User MASUDA
// @version   0.0.1
// ==/UserScript==
(function(){
    document.onload = main;
    
    
    function main(){
        var entryList = filterByTagAndClass("div", "entry");
        
        checkAndErase(entryList);
    }
    
    
    function filterByTagAndClass(tag, name){
        var list = document.getElementsByTagName(tag);
        var newList = [];
        
        for(var i = 0; i < list.length; i++){
            if(list[i].className == name){
                newList.push(list[i]);
            }
        }
        
        return newList;
    }
    
    
    function checkAndErase(nodeList){
        for(var i=0; i < nodeList.length; i++){
            var elem = nodeList[i].getElementsByTagName("a")[0];
            
            if(elem.href.substring(0,50) == "http://b.hatena.ne.jp/entry/http://b.hatena.ne.jp/"){
                nodeList[i].parentNode.removeChild(nodeList[i]);
            }
            
        }
    }
})();
Firefox(Greasemonkey)
// ==UserScript==
// @name          Metabu Eraser
// @include       http://b.hatena.ne.jp/entrylist*
// @description   version:0.0.1
// ==/UserScript==

main();

function main(){
    var entryList = filterByTagAndClass("div", "entry");
    
    checkAndErase(entryList);
}

function filterByTagAndClass(tag, name){
    var list = document.getElementsByTagName(tag);
    var newList = [];
    
    for(var i = 0; i < list.length; i++){
        if(list[i].className == name){
            newList.push(list[i]);
        }
    }
    
    return newList;
}


function checkAndErase(nodeList){
    for(var i=0; i < nodeList.length; i++){
        var elem = nodeList[i].getElementsByTagName("a")[0];
        
        if(elem.href.substring(0,50) == "http://b.hatena.ne.jp/entry/http://b.hatena.ne.jp/"){
            nodeList[i].parentNode.removeChild(nodeList[i]);
        }
    }
}

2008-01-01

はてブニコニコ動画へのブックマークがうざすぎる

アイドルマスターとか初音ミクとか。

なのでJavaSciptの勉強がてら、ニコニコ動画関連のブックマークを見えなくするユーザースクリプトを作った。DOMがよくわからないので変なところがあるかも。スコープノードリストなんかもよくわかってないので、無駄なところもあるかも。

以下ソース

Opera
// ==UserScript==
// @name      NicoNico Eraser
// @include   http://b.hatena.ne.jp/entrylist*
// @author    Hatena Anonymous User MASUDA
// @version   0.0.1
// ==/UserScript==
(function(){
    document.onload = main;
    
    
    function main(){
        var entryList = filterByTagAndClass("div", "entry");
        
        checkAndErase(entryList);
    }
    
    
    function filterByTagAndClass(tag, name){
        var list = document.getElementsByTagName(tag);
        var newList = [];
        
        for(var i = 0; i < list.length; i++){
            if(list[i].className == name){
                newList.push(list[i]);
            }
        }
        
        return newList;
    }
    
    
    function checkAndErase(nodeList){
        for(var i=0; i < nodeList.length; i++){
            var elem = nodeList[i].getElementsByTagName("a")[0];
            
            if(elem.href.substring(0,30) == "http://www.nicovideo.jp/watch/"){
                nodeList[i].parentNode.removeChild(nodeList[i]);
            }
            
        }
    }
})();

Firefox(Greasemonkey)
// ==UserScript==
// @name          NicoNico Eraser
// @include       http://b.hatena.ne.jp/entrylist*
// @description   version:0.0.1
// ==/UserScript==

main();

function main(){
    var entryList = filterByTagAndClass("div", "entry");
    
    checkAndErase(entryList);
}

function filterByTagAndClass(tag, name){
    var list = document.getElementsByTagName(tag);
    var newList = [];
    
    for(var i = 0; i < list.length; i++){
        if(list[i].className == name){
            newList.push(list[i]);
        }
    }
    
    return newList;
}


function checkAndErase(nodeList){
    for(var i=0; i < nodeList.length; i++){
        var elem = nodeList[i].getElementsByTagName("a")[0];
        
        if(elem.href.substring(0,30) == "http://www.nicovideo.jp/watch/"){
            nodeList[i].parentNode.removeChild(nodeList[i]);
        }
    }
}

まぁ、これだと初音ミクアイドルマスター以外の動画も見えなくなるんだけどね。

つーかJavaScriptだとPythonみたいなfor文使えないの?

2007-07-19

/* Ten */
if (typeof(Ten) == 'undefined') {
    Ten = {};
}
Ten.NAME = 'Ten';
Ten.VERSION = 0.06;

/* Ten.Class */
Ten.Class = function(klass, prototype) {
    if (klass && klass.initialize) {
	var c = klass.initialize;
    } else if(klass && klass.base) {
        var c = function() { return klass.base[0].apply(this, arguments) };
    } else {
	var c = function() {};
    }
    c.prototype = prototype || {};
    c.prototype.constructor = c;
    Ten.Class.inherit(c, klass);
    if (klass && klass.base) {
        for (var i = 0;  i < klass.base.length; i++) {
	    var parent = klass.base[i];
            if (i == 0) {
                c.SUPER = parent;
                c.prototype.SUPER = parent.prototype;
            }
            Ten.Class.inherit(c, parent);
            Ten.Class.inherit(c.prototype, parent.prototype);
        }
    }
    return c;
}
Ten.Class.inherit = function(child,parent) {
    for (var prop in parent) {
        if (typeof(child[prop]) != 'undefined' || prop == 'initialize') continue;
        child[prop] = parent[prop];
    }
}

/*
// Basic Ten Classes
**/

/* Ten.JSONP */
Ten.JSONP = new Ten.Class({
    initialize: function(uri,obj,method) {
        if (Ten.JSONP.Callbacks.length) {
            setTimeout(function() {new Ten.JSONP(uri,obj,method)}, 500);
            return;
        }
        var del = uri.match(/\?/) ? '&' : '?';
        uri += del + 'callback=Ten.JSONP.callback';
        if (!uri.match(/timestamp=/)) {
            uri += '&' + encodeURI(new Date());
        }
        if (obj && method) Ten.JSONP.addCallback(obj,method);
        this.script = document.createElement('script');
        this.script.src = uri;
        this.script.type = 'text/javascript';
        document.getElementsByTagName('head')[0].appendChild(this.script);
    },
    addCallback: function(obj,method) {
        Ten.JSONP.Callbacks.push({object: obj, method: method});
    },
    callback: function(args) {
        // alert('callback called');
        var cbs = Ten.JSONP.Callbacks;
        for (var i = 0; i < cbs.length; i++) {
            var cb = cbs[i];
            cb.object[cb.method].call(cb.object, args);
        }
        Ten.JSONP.Callbacks = [];
    },
    MaxBytes: 8000,
    Callbacks: []
});

/* Ten.XHR */
Ten.XHR = new Ten.Class({
    initialize: function(uri,opts,obj,method) {
        if (!uri) return;
        this.request = Ten.XHR.getXMLHttpRequest();
        this.callback = {object: obj, method: method};
        var xhr = this;
        var prc = this.processReqChange;
        this.request.onreadystatechange = function() {
            prc.apply(xhr, arguments);
        }
        var method = opts.method || 'GET';
        this.request.open(method, uri, true);
        if (method == 'POST') {
            this.request.setRequestHeader('Content-Type',
                                          'application/x-www-form-urlencoded');
        }
        var data = opts.data ? Ten.XHR.makePostData(opts.data) : null;
        this.request.send(data);
    },
    getXMLHttpRequest: function() {
        var xhr;
        var tryThese = [
            function () { return new XMLHttpRequest(); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
            function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
            function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
        ];
        for (var i = 0; i < tryThese.length; i++) {
            var func = tryThese[i];
            try {
                xhr = func;
                return func();
            } catch (e) {
                //alert(e);
            }
        }
        return xhr;
    },
    makePostData: function(data) {
        var pairs = [];
        var regexp = /%20/g;
        for (var k in data) {
            var v = data[k].toString();
            var pair = encodeURIComponent(k).replace(regexp,'+') + '=' +
                encodeURIComponent(v).replace(regexp,'+');
            pairs.push(pair);
        }
        return pairs.join('&');
    }
},{
    processReqChange: function() {
        var req = this.request;
        if (req.readyState == 4) {
            if (req.status == 200) {
                var cb = this.callback;
                cb.object[cb.method].call(cb.object, req);
            } else {
                alert("There was a problem retrieving the XML data:\n" +
                      req.statusText);
            }
        }
    }
});

/* Ten.Observer */
Ten.Observer = new Ten.Class({
    initialize: function(element,event,obj,method) {
        var func = obj;
        if (typeof(method) == 'string') {
            func = obj[method];
        }
        this.element = element;
        this.event = event;
        this.listener = function(event) {
            return func.call(obj, new Ten.Event(event || window.event));
        }
        if (this.element.addEventListener) {
            if (this.event.match(/^on(.+)$/)) {
                this.event = RegExp.$1;
            }
            this.element.addEventListener(this.event, this.listener, false);
        } else if (this.element.attachEvent) {
            this.element.attachEvent(this.event, this.listener);
        }
    }
},{
    stop: function() {
        if (this.element.removeEventListener) {
            this.element.removeEventListener(this.event,this.listener,false);
        } else if (this.element.detachEvent) {
            this.element.detachEvent(this.event,this.listener);
        }
    }
});

/* Ten.Event */
Ten.Event = new Ten.Class({
    initialize: function(event) {
        this.event = event;
    },
    keyMap: {
        8:"backspace", 9:"tab", 13:"enter", 19:"pause", 27:"escape", 32:"space",
        33:"pageup", 34:"pagedown", 35:"end", 36:"home", 37:"left", 38:"up",
        39:"right", 40:"down", 44:"printscreen", 45:"insert", 46:"delete",
        112:"f1", 113:"f2", 114:"f3", 115:"f4", 116:"f5", 117:"f6", 118:"f7",
        119:"f8", 120:"f9", 121:"f10", 122:"f11", 123:"f12",
        144:"numlock", 145:"scrolllock"
    }
},{
    mousePosition: function() {
        if (!this.event.clientX) return;
        return Ten.Geometry.getMousePosition(this.event);
    },
    isKey: function(name) {
        var ecode = this.event.keyCode;
        if (!ecode) return;
        var ename = Ten.Event.keyMap[ecode];
        if (!ename) return;
        return (ename == name);
    },
    targetIsFormElements: function() {
        var target = this.event.target;
        if (!target) return;
        var T = (target.tagName || '').toUpperCase();
        return (T == 'INPUT' || T == 'SELECT' || T == 'OPTION' ||
                T == 'BUTTON' || T == 'TEXTAREA');
    },
    stop: function() {
        var e = this.event;
        if (e.stopPropagation) {
            e.stopPropagation();
            e.preventDefault();
        } else {
            e.cancelBubble = true;
            e.returnValue = false;
        }
    }
});

/* Ten.DOM */
Ten.DOM = new Ten.Class({
    getElementsByTagAndClassName: function(tagName, className, parent) {
        if (typeof(parent) == 'undefined') {
            parent = document;
        }
        var children = parent.getElementsByTagName(tagName);
        if (className) { 
            var elements = [];
            for (var i = 0; i < children.length; i++) {
                var child = children[i];
                var cls = child.className;
                if (!cls) {
                    continue;
                }
                var classNames = cls.split(' ');
                for (var j = 0; j < classNames.length; j++) {
                    if (classNames[j] == className) {
                        elements.push(child);
                        break;
                    }
                }
            }
            return elements;
        } else {
            return children;
        }
    },
    removeEmptyTextNodes: function(element) {
        var nodes = element.childNodes;
        for (var i = 0; i < nodes.length; i++) {
            var node = nodes[i];
            if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
                node.parentNode.removeChild(node);
            }
        }
    },
    nextElement: function(elem) {
        do {
            elem = elem.nextSibling;
        } while (elem && elem.nodeType != 1);
        return elem;
    },
    prevElement: function(elem) {
        do {
            elem = elem.previousSibling;
        } while (elem && elem.nodeType != 1);
        return elem;
    },
    scrapeText: function(node) {
        var rval = [];
        (function (node) {
            var cn = node.childNodes;
            if (cn) {
                for (var i = 0; i < cn.length; i++) {
                    arguments.callee.call(this, cn[i]);
                }
            }
            var nodeValue = node.nodeValue;
            if (typeof(nodeValue) == 'string') {
                rval.push(nodeValue);
            }
        })(node);
        return rval.join('');
    },
    onLoadFunctions: [],
    loaded: false,
    timer: null,
    addEventListener: function(event,func) {
        if (event != 'load') return;
        Ten.DOM.onLoadFunctions.push(func);
        Ten.DOM.checkLoaded();
    },
    checkLoaded: function() {
        var c = Ten.DOM;
        if (c.loaded) return true;
        if (document && document.getElementsByTagName &&
            document.getElementById && document.body) {
            if (c.timer) {
                clearInterval(c.timer);
                c.timer = null;
            }
            for (var i = 0; i < c.onLoadFunctions.length; i++) {
                    c.onLoadFunctions[i]();
            }
            c.onLoadFunctions = [];
            c.loaded = true;
        } else {
            c.timer = setInterval(c.checkLoaded, 13);
        }
    }
});

/* Ten.Style */
Ten.Style = new Ten.Class({
    applyStyle: function(elem, style) {
        for (prop in style) {
            elem.style[prop] = style[prop];
        }
    }
});

/* Ten.Geometry */
Ten.Geometry = new Ten.Class({
    initialize: function() {
        if (Ten.Geometry._initialized) return;
        var func = Ten.Geometry._functions;
        var de = document.documentElement;
        if (window.innerWidth) {
            func.getWindowWidth = function() { return window.innerWidth; }
            func.getWindowHeight = function() { return window.innerHeight; }
            func.getXScroll = function() { return window.pageXOffset; }
            func.getYScroll = function() { return window.pageYOffset; }
        } else if (de && de.clientWidth) {
            func.getWindowWidth = function() { return de.clientWidth; }
            func.getWindowHeight = function() { return de.clientHeight; }
            func.getXScroll = function() { return de.scrollLeft; }
            func.getYScroll = function() { return de.scrollTop; }
        } else if (document.body.clientWidth) {
            func.getWindowWidth = function() { return document.body.clientWidth; }
            func.getWindowHeight = function() { return document.body.clientHeight; }
            func.getXScroll = function() { return document.body.scrollLeft; }
            func.getYScroll = function() { return document.body.scrollTop; }
        }
        Ten.Geometry._initialized = true;
    },
    _initialized: false,
    _functions: {},
    getScroll: function() {
        if (!Ten.Geometry._initialized) new Ten.Geometry;
        return {
            x: Ten.Geometry._functions.getXScroll(),
            y: Ten.Geometry._functions.getYScroll()
        };
    },
    getMousePosition: function(pos) {
        // pos should have clientX, clientY same as mouse event
        if ((navigator.userAgent.indexOf('Safari') > -1) &&
            (navigator.userAgent.indexOf('Version/') < 0)) {
            return {
                x: pos.clientX,
                y: pos.clientY
            };
        } else {
            var scroll = Ten.Geometry.getScroll();
            return {
                x: pos.clientX + scroll.x,
                y: pos.clientY + scroll.y
            };
        }
    },
    getElementPosition: function(e) {
        return {
            x: e.offsetLeft,
            y: e.offsetTop
        };
    },
    getWindowSize: function() {
        if (!Ten.Geometry._initialized) new Ten.Geometry;
        return {
            w: Ten.Geometry._functions.getWindowWidth(),
            h: Ten.Geometry._functions.getWindowHeight()
        };
    }
});

/* Ten.Position */
Ten.Position = new Ten.Class({
    initialize: function(x,y) {
        this.x = x;
        this.y = y;
    },
    subtract: function(a,b) {
        return new Ten.Position(a.x - b.x, a.y - b.y);
    }
});

/*
// require Ten.js
**/

/* Ten.SubWindow */
Ten.SubWindow = new Ten.Class({
    initialize: function() {
        var c = this.constructor;
        if (c.singleton && c._cache) {
            return c._cache;
        }
        var div = document.createElement('div');
        Ten.Style.applyStyle(div, Ten.SubWindow._baseStyle);
        Ten.Style.applyStyle(div, c.style);
        this.window = div;
        this.addContainerAndCloseButton();
        document.body.appendChild(div);
        if (c.draggable) {
            this._draggable = new Ten.Draggable(div, this.handle);
        }
        if (c.singleton) c._cache = this;
        return this;
    },
    _baseStyle: {
        color: '#000',
        position: 'absolute',
        display: 'none',
        zIndex: 2,
        left: 0,
        top: 0,
        backgroundColor: '#fff',
        border: '1px solid #bbb'
    },
    style: {
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px',
        width: '100px',
        height: '100px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px'
    },
    containerStyle: {
        margin: '32px 0 0 0',
        padding: '0 10px'
    },
    // closeButton: 'close.gif',
    closeButton: 'http://s.hatena.com/images/close.gif',
    closeButtonStyle: {
        position: 'absolute',
        top: '8px',
        right: '10px',
        cursor: 'pointer'
    },
    _baseScreenStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        display: 'none',
        zIndex: 1,
        overflow: 'hidden',
        width: '100%',
        height: '100%'
    },
    screenStyle: {},
    showScreen: true,
    singleton: true,
    draggable: true,
    _cache: null
},{
    screen: null,
    windowObserver: null,
    visible: false,
    addContainerAndCloseButton: function() {
        var win = this.window;
        var c = this.constructor;
        var div = document.createElement('div');
        win.appendChild(div);
        Ten.Style.applyStyle(div, c.containerStyle);
        this.container = div;
        if (c.handleStyle) {
            var handle = document.createElement('div');
            Ten.Style.applyStyle(handle, c.handleStyle);
            win.appendChild(handle);
            this.handle = handle;
        }
        if (c.closeButton) {
	    var btn = document.createElement('img');
            btn.src = c.closeButton;
            btn.alt = 'close';
            Ten.Style.applyStyle(btn, c.closeButtonStyle);
            win.appendChild(btn);
            new Ten.Observer(btn, 'onclick', this, 'hide');
            this.closeButton = btn;
        }
        if (c.showScreen) {
            var screen = document.createElement('div');
            Ten.Style.applyStyle(screen, Ten.SubWindow._baseScreenStyle);
            Ten.Style.applyStyle(screen, c.screenStyle);
            document.body.appendChild(screen);
            this.screen = screen;
            new Ten.Observer(screen, 'onclick', this, 'hide');
        }
    },
    show: function(pos) {
        pos = (pos.x && pos.y) ? pos : {x:0, y:0};
        with (this.window.style) {
            display = 'block';
            left = pos.x + 'px';
            top = pos.y + 'px';
        }
        if (this.screen) {
            with (this.screen.style) {
                display = 'block';
                left = Ten.Geometry.getScroll().x + 'px';
                top = Ten.Geometry.getScroll().y + 'px';
            }
        }
        this.windowObserver = new Ten.Observer(document.body, 'onkeypress', this, 'handleEscape');
        this.visible = true;
    },
    handleEscape: function(e) {
        if (!e.isKey('escape')) return;
        this.hide();
    },
    hide: function() {
        if (this._draggable) this._draggable.endDrag();
        this.window.style.display = 'none';
        if (this.screen) this.screen.style.display = 'none';
        if (this.windowObserver) this.windowObserver.stop();
        this.visible = false;
    }
});

/* Ten.Draggable */
Ten.Draggable = new Ten.Class({
    initialize: function(element,handle) {
        this.element = element;
        this.handle = handle || element;
        this.startObserver = new Ten.Observer(this.handle, 'onmousedown', this, 'startDrag');
        this.handlers = [];
    }
},{
    startDrag: function(e) {
        if (e.targetIsFormElements()) return;
        this.delta = Ten.Position.subtract(
            e.mousePosition(),
            Ten.Geometry.getElementPosition(this.element)
        );
        this.handlers = [
            new Ten.Observer(document, 'onmousemove', this, 'drag'),
            new Ten.Observer(document, 'onmouseup', this, 'endDrag'),
            new Ten.Observer(this.element, 'onlosecapture', this, 'endDrag')
        ];
        e.stop();
    },
    drag: function(e) {
        var pos = Ten.Position.subtract(e.mousePosition(), this.delta);
        Ten.Style.applyStyle(this.element, {
            left: pos.x + 'px',
            top: pos.y + 'px'
        });
        e.stop();
    },
    endDrag: function(e) {
        for (var i = 0; i < this.handlers.length; i++) {
            this.handlers[i].stop();
        }
        if(e) e.stop();
    }
});

/* Hatena */
if (typeof(Hatena) == 'undefined') {
    Hatena = {};
}

/* Hatena.User */
Hatena.User = new Ten.Class({
    initialize: function(name) {
        this.name = name;
    },
    getProfileIcon: function(name) {
        if (!name) name = 'user';
        var pre = name.match(/^[\w-]{2}/)[0];
        var img = document.createElement('img');
        img.src = 'http://www.hatena.ne.jp/users/' + pre + '/' + name + '/profile_s.gif';
        img.alt = name;
        img.setAttribute('class', 'profile-icon');
        img.setAttribute('width','16px');
        img.setAttribute('height','16px');
        with (img.style) {
            margin = '0 3px';
            border = 'none';
            verticalAlign = 'middle';
        }
        return img;
    }
}, {
    profileIcon: function() {
        return Hatena.User.getProfileIcon(this.name);
    }
});

/* Hatena.Star */
if (typeof(Hatena.Star) == 'undefined') {
    Hatena.Star = {};
}

/*
// Hatena.Star.* classes //
**/
if (window.location && window.location.host.match(/hatena\.com/)) {
    Hatena.Star.BaseURL = 'http://s.hatena.com/';
} else {
    Hatena.Star.BaseURL = 'http://s.hatena.ne.jp/';
}
Hatena.Star.Token = null;

/* Hatena.Star.User */
Hatena.Star.User = new Ten.Class({
    base: [Hatena.User],
    initialize: function(name) {
        if (Hatena.Star.User._cache[name]) {
            return Hatena.Star.User._cache[name];
        } else {
            this.name = name;
            Hatena.Star.User._cache[name] = this;
            return this;
        }
    },
    _cache: {}
},{
    userPage: function() {
        return Hatena.Star.BaseURL + this.name + '/';
    }
});

/* Hatena.Star.Entry */
Hatena.Star.Entry = new Ten.Class({
    initialize: function(e) {
        this.entry = e;
        this.uri = e.uri;
        this.title = e.title;
        this.star_container = e.star_container;
        this.comment_container = e.comment_container;
        this.stars = [];
        this.comments = [];
    },
    maxStarCount: 11
},{
    flushStars: function() {
        this.stars = [];
        this.star_container.innerHTML = '';
    },
    bindStarEntry: function(se) {
        this.starEntry = se;
        for (var i = 0; i < se.stars.length; i++) {
            if (typeof(se.stars[i]) == 'number') {
                this.stars.push(new Hatena.Star.InnerCount(se.stars[i],this));
            } else {
                this.stars.push(new Hatena.Star.Star(se.stars[i]));
            }
        }
        if (se.comments && !this.comments.length) {
            for (var i = 0; i < se.comments.length; i++) {
                this.comments.push(new Hatena.Star.Comment(se.comments[i]));
            }
        }
        this.can_comment = se.can_comment;
    },
    setCanComment: function(v) {
        this.can_comment = v;
    },
    showButtons: function() {
        this.addAddButton();
        this.addCommentButton();
    },
    addAddButton: function() {
        if (this.star_container) {
            this.addButton = new Hatena.Star.AddButton(this);
            this.star_container.appendChild(this.addButton);
        }
    },
    addCommentButton: function() {
        if (this.comment_container) {
            this.commentButton = new Hatena.Star.CommentButton(this);
            this.comment_container.appendChild(this.commentButton.img);
        }
    },
    showStars: function() {
        var klass = this.constructor;
        // if (this.stars.length > klass.maxStarCount) {
        //     var ic = new Hatena.Star.InnerCount(this.stars.slice(1,this.stars.length));
        //     this.star_container.appendChild(this.stars[0]);
        //     this.star_container.appendChild(ic);
        //     this.star_container.appendChild(this.stars[this.stars.length - 1]);
        // } else {
        for (var i = 0; i < this.stars.length; i++) {
            this.star_container.appendChild(this.stars[i]);
        }
    },
    showCommentButton: function() {
        if (this.can_comment) {
            this.commentButton.show();
            if (this.comments.length) this.commentButton.activate();
        } else {
            // this.commentButton.hide();
        }
    },
    addStar: function(star) {
        this.stars.push(star);
        this.star_container.appendChild(star);
    },
    addComment: function(com) {
        if (!this.comments) this.comments = [];
        if (this.comments.length == 0) {
            this.commentButton.activate();
        }
        this.comments.push(com);
    },
    showCommentCount: function() {
        this.comment_container.innerHTML += this.comments.length;
    }
});

/* Hatena.Star.Button */
Hatena.Star.Button = new Ten.Class({
    createButton: function(args) {
        var img = document.createElement('img');
        img.src = args.src;
        img.alt = img.title = args.alt;
        with (img.style) {
	    cursor = 'pointer';
	    margin = '0 3px';
            padding = '0';
            border = 'none';
            verticalAlign = 'middle';
        }
        return img;
    }
});

/* Hatena.Star.AddButton */
Hatena.Star.AddButton = new Ten.Class({
    base: ['Hatena.Star.Button'],
    initialize: function(entry) {
        this.entry = entry;
        this.lastPosition = null;
        var img = Hatena.Star.Button.createButton({
            src: Hatena.Star.AddButton.ImgSrc,
            alt: 'Add Star'
        });
        this.observer = new Ten.Observer(img,'onclick',this,'addStar');
        this.img = img;
        return img;
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/add.gif'
},{
    addStar: function(e) {
        this.lastPosition = e.mousePosition();
        var uri = Hatena.Star.BaseURL + 'star.add.json?uri=' + encodeURIComponent(this.entry.uri) +
            '&title=' + encodeURIComponent(this.entry.title);
        if (Hatena.Star.Token) {
            uri += '&token=' + Hatena.Star.Token;
        }
        new Ten.JSONP(uri, this, 'receiveResult');
    },
    receiveResult: function(args) {
        var name = args ? args.name : null;
        if (name) {
            this.entry.addStar(new Hatena.Star.Star({name: name}));
            //alert('Succeeded in Adding Star ' + args);
        } else if (args.errors) {
            var pos = this.lastPosition;
            pos.x -= 10;
            pos.y += 25;
            var scroll = Ten.Geometry.getScroll();
            var scr = new Hatena.Star.AlertScreen();
            var alert = args.errors[0];
            scr.showAlert(alert, pos);
        }
    }
});

/* Hatena.Star.CommentButton */
Hatena.Star.CommentButton = new Ten.Class({
    base: ['Hatena.Star.Button'],
    initialize: function(entry) {
        this.entry = entry;
        this.lastPosition = null;
        var img = Hatena.Star.Button.createButton({
            src: Hatena.Star.CommentButton.ImgSrc,
            alt: 'Comments'
        });
        img.style.display = 'none';
        this.observer = new Ten.Observer(img,'onclick',this,'showComments');
        this.img = img;
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/comment.gif',
    ImgSrcActive: Hatena.Star.BaseURL + 'images/comment_active.gif'
},{
    showComments: function(e) {
        if (!this.screen) this.screen = new Hatena.Star.CommentScreen();
        this.screen.bindEntry(this.entry);
        var pos = e.mousePosition();
        pos.y += 25;
        this.screen.showComments(this.entry, pos);
    },
    hide: function() {
        this.img.style.display = 'none';
    },
    show: function() {
        this.img.style.display = 'inline';
    },
    activate: function() {
        this.show();
        this.img.src = Hatena.Star.CommentButton.ImgSrcActive;
    }
});

/* Hatena.Star.Star */
Hatena.Star.Star = new Ten.Class({
    initialize: function(args) {
        if (args.img) {
            this.img = args.img;
            this.name = this.img.getAttribute('alt');
        } else {
            this.name = args.name;
            var img = document.createElement('img');
            img.src = Hatena.Star.Star.ImgSrc;
            img.alt = this.name;
            with (img.style) {
                padding = '0';
                border = 'none';
            }
            this.img = img;
        }
	new Ten.Observer(this.img,'onmouseover',this,'showName');
	new Ten.Observer(this.img,'onmouseout',this,'hideName');
	if (this.name) {
            this.user = new Hatena.Star.User(this.name);
            this.img.style.cursor = 'pointer';
            new Ten.Observer(this.img,'onclick',this,'goToUserPage');
        }
        if (args.count && args.count > 1) {
            var c = document.createElement('span');
            c.setAttribute('class', 'hatena-star-inner-count');
            Ten.Style.applyStyle(c, Hatena.Star.InnerCount.style);
            c.innerHTML = args.count;
            var s = document.createElement('span');
            s.appendChild(img);
            s.appendChild(c);
            return s;
        } else {
            return this.img;
        }
    },
    ImgSrc: Hatena.Star.BaseURL + 'images/star.gif'
},{
    showName: function(e) {
        if (!this.screen) this.screen = new Hatena.Star.NameScreen();
        var pos = e.mousePosition();
        pos.x += 10;
        pos.y += 25;
        this.screen.showName(this.name, pos);
    },
    hideName: function() {
        if (!this.screen) return;
        this.screen.hide();
    },
    goToUserPage: function() {
        window.location = this.user.userPage();
    }
});

/* Hatena.Star.InnerCount */
Hatena.Star.InnerCount = new Ten.Class({
    initialize: function(count, e) {
        this.count = count;
        this.entry = e;
        var c = document.createElement('span');
        c.setAttribute('class', 'hatena-star-inner-count');
        Ten.Style.applyStyle(c, Hatena.Star.InnerCount.style);
        c.style.cursor = 'pointer';
        c.innerHTML = count;
        new Ten.Observer(c,'onclick',this,'showInnerStars');
        this.container = c;
        return c;
    },
    style: {
        color: '#f4b128',
        fontWeight: 'bold',
        fontSize: '80%',
        fontFamily: '"arial", sans-serif',
        margin: '0 2px'
    }
},{
    showInnerStars: function() {
        var url = Hatena.Star.BaseURL + 'entry.json?uri=' +
        encodeURIComponent(this.entry.uri);
        new Ten.JSONP(url, this, 'receiveStarEntry');
    },
    receiveStarEntry: function(res) {
        var se = res.entries[0];
        var e = this.entry;
        if (encodeURIComponent(se.uri) != encodeURIComponent(e.uri)) return;
        e.flushStars();
        e.bindStarEntry(se);
        e.addAddButton();
        e.showStars();
    }
});

/* Hatena.Star.Comment */
Hatena.Star.Comment = new Ten.Class({
    initialize: function(args) {
        this.name = args.name;
        this.body = args.body;
    }
},{
    asElement: function() {
        var div = document.createElement('div');
        with (div.style) {
            margin = '0px 0';
            padding = '5px 0';
            borderBottom = '1px solid #ddd';
        }
        var ico = Hatena.User.getProfileIcon(this.name);
        div.appendChild(ico);
        var span = document.createElement('span');
        with(span.style) {
            fontSize = '90%';
        }
        span.innerHTML = this.body;
        div.appendChild(span);
        return div;
    }
});

/* Hatena.Star.NameScreen */
Hatena.Star.NameScreen = new Ten.Class({
    base: [Ten.SubWindow],
    style: {
        padding: '2px',
        textAlign: 'center'
    },
    containerStyle: {
        margin: 0,
        padding: 0
    },
    handleStyle: null,
    showScreen: false,
    closeButton: null,
    draggable: false
},{
    showName: function(name, pos) {
        this.container.innerHTML = '';
        this.container.appendChild(Hatena.User.getProfileIcon(name));
        this.container.appendChild(document.createTextNode(name));
        this.show(pos);
    }
});

/* Hatena.Star.AlertScreen */
Hatena.Star.AlertScreen = new Ten.Class({
    base: [Ten.SubWindow],
    style: {
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px',
        width: '240px',
        height: '120px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px',
        borderRadius: '6px 6px 0 0',
        MozBorderRadius: '6px 6px 0 0'
    }
},{
    showAlert: function(msg, pos) {
        this.container.innerHTML = msg;
        var win = Ten.Geometry.getWindowSize();
        var scr = Ten.Geometry.getScroll();
        var w = parseInt(this.constructor.style.width) + 20;
        if (pos.x + w > scr.x + win.w) pos.x = win.w + scr.x - w;
        this.show(pos);
    }
});

/* Hatena.Star.CommentScreen */
Hatena.Star.CommentScreen = new Ten.Class({
    base: [Ten.SubWindow],
    initialize: function() {
        var self = this.constructor.SUPER.call(this);
        if (!self.commentsContainer) self.addCommentsContainer();
        return self;
    },
    style: {
        width: '280px',
        height: '280px',
        overflowY: 'auto',
        padding: '2px',
        textAlign: 'center',
        borderRadius: '6px',
        MozBorderRadius: '6px'
    },
    handleStyle: {
        position: 'absolute',
        top: '0px',
        left: '0px',
        backgroundColor: '#f3f3f3',
        borderBottom: '1px solid #bbb',
        width: '100%',
        height: '30px',
        borderRadius: '6px 6px 0 0',
        MozBorderRadius: '6px 6px 0 0'
    },
    containerStyle: {
        margin: '32px 0 0 0',
        textAlign: 'left',
        padding: '0 10px'
    },
    getLoadImage: function() {
        var img = document.createElement('img');
        img.src = Hatena.Star.BaseURL + 'images/load.gif';
        img.setAttribute('alt', 'Loading');
        with (img.style) {
            verticalAlign = 'middle';
            margin = '0 2px';
        }
        return img;
    }
},{
    addCommentsContainer: function() {
        var div = document.createElement('div');
        with (div.style) {
            marginTop = '-3px';
        }
        this.container.appendChild(div);
        this.commentsContainer = div;
    },
    showComments: function(e, pos) {
        var comments = e.comments;
        if (!comments) comments = [];
        this.commentsContainer.innerHTML = '';
        for (var i=0; i<comments.length; i++) {
            this.commentsContainer.appendChild(comments[i].asElement());
        }
        if (e.starEntry && !e.can_comment) {
            this.hideCommentForm();
        } else {
            this.addCommentForm();
        }
        var win = Ten.Geometry.getWindowSize();
        var scr = Ten.Geometry.getScroll();
        var w = parseInt(this.constructor.style.width) + 20;
        if (pos.x + w > scr.x + win.w) pos.x = win.w + scr.x - w;
        this.show(pos);
    },
    bindEntry: function(e) {
        this.entry = e;
    },
    sendComment: function(e) {
        if (!e.isKey('enter')) return;
        var body = this.commentInput.value;
        if (!body) return;
        this.commentInput.disabled = 'true';
        this.showLoadImage();
        var url = Hatena.Star.BaseURL + 'comment.add.json?body=' + encodeURIComponent(body) +
            '&uri=' + encodeURIComponent(this.entry.uri) +
            '&title=' + encodeURIComponent(this.entry.title);
        new Ten.JSONP(url, this, 'receiveResult');
    },
    receiveResult: function(args) {
        if (!args.name || !args.body) return;
        this.commentInput.value = ''; 
        this.commentInput.disabled = '';
        this.hideLoadImage();
        var com = new Hatena.Star.Comment(args);
        this.entry.addComment(com);
        this.commentsContainer.appendChild(com.asElement());
    },
    showLoadImage: function() {
        if (!this.loadImage) return; 
        this.loadImage.style.display = 'inline';
    },
    hideLoadImage: function() {
        if (!this.loadImage) return; 
        this.loadImage.style.display = 'none';
    },
    hideCommentForm: function() {
        if (!this.commentForm) return;
        this.commentForm.style.display = 'none';
    },
    addCommentForm: function() {
        if (this.commentForm) {
            this.commentForm.style.display = 'block';
            return;
        }
        var form = document.createElement('div');
        this.container.appendChild(form);
        this.commentForm = form;
        with (form.style) {
            margin = '0px 0';
            padding = '5px 0';
            // borderTop = '1px solid #ddd';
        }
        //if (Hatena.Visitor) {
        //    form.appendChild(Hatena.Visitor.profileIcon());
        //} else {
        //    form.appendChild(Hatena.User.getProfileIcon());
        //}
        var input = document.createElement('input');
        input.type = 'text';
        with (input.style) {
            width = '215px';
	    border = '1px solid #bbb';
            padding = '3px';
        }
        form.appendChild(input);
        this.commentInput = input;
        var img = this.constructor.getLoadImage();
        this.loadImage = img;
        this.hideLoadImage();
        form.appendChild(img);
        new Ten.Observer(input,'onkeypress',this,'sendComment');
    }
});

/* Hatena.Star.EntryLoader */
Hatena.Star.EntryLoader = new Ten.Class({
    initialize: function() {
        var entries = Hatena.Star.EntryLoader.loadEntries();
        this.entries = [];
        for (var i = 0; i < entries.length; i++) {
            var e = new Hatena.Star.Entry(entries[i]);
            e.showButtons();
            this.entries.push(e);
        }
        this.getStarEntries();
    },
    createStarContainer: function() {
        var sc = document.createElement('span');
        sc.setAttribute('class', 'hatena-star-star-container');
        sc.style.marginLeft = '1px';
        return sc;
    },
    createCommentContainer: function() {
        var cc = document.createElement('span');
        cc.setAttribute('class', 'hatena-star-comment-container');
        cc.style.marginLeft = '1px';
        return cc;
    },
    scrapeTitle: function(node) {
        var rval = [];
        (function (node) {
            if (node.tagName == 'SPAN' &&
                (node.className == 'sanchor' ||
                 node.className == 'timestamp')) {
                     return;
            } else if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
                return;
            }
            var cn = node.childNodes;
            if (cn) {
                for (var i = 0; i < cn.length; i++) {
                    arguments.callee.call(this, cn[i]);
                }
            }
            var nodeValue = node.nodeValue;
            if (typeof(nodeValue) == 'string') {
                rval.push(nodeValue);
            }
        })(node);
        return rval.join('');
    },
    headerTagAndClassName: ['h3',null],
    getHeaders: function() {
        var t = Hatena.Star.EntryLoader.headerTagAndClassName;
        return Ten.DOM.getElementsByTagAndClassName(t[0],t[1],document);
    },
    loadEntries: function() {
        var entries = [];
        //var headers = document.getElementsByTagName('h3');
        var c = Hatena.Star.EntryLoader;
        var headers = c.getHeaders();
        for (var i = 0; i < headers.length; i++) {
            var header = headers[i];
            var a = header.getElementsByTagName('a')[0];
            if (!a) continue;
            var uri = a.href;
            var title = '';
            // Ten.DOM.removeEmptyTextNodes(header);
            var cns = header.childNodes;
            title = c.scrapeTitle(header);
            var cc = c.createCommentContainer();
            header.appendChild(cc);
            var sc = c.createStarContainer();
            header.appendChild(sc);
            entries.push({
                uri: uri,
                title: title,
                star_container: sc,
                comment_container: cc
            });
        }
        return entries;
    }
},{
    getStarEntries: function() {
        var url = Hatena.Star.BaseURL + 'entries.json?';
        for (var i = 0; i < this.entries.length; i++) {
            if (url.length > Ten.JSONP.MaxBytes) {
                new Ten.JSONP(url, this, 'receiveStarEntries');
                url = Hatena.Star.BaseURL + 'entries.json?';
            }
            url += 'uri=' + encodeURIComponent(this.entries[i].uri) + '&';
        }
        new Ten.JSONP(url, this, 'receiveStarEntries');
    },
    receiveStarEntries: function(res) {
        var entries = res.entries;
        if (!entries) entries = [];
        for (var i = 0; i < this.entries.length; i++) {
            var e = this.entries[i];
            for (var j = 0; j < entries.length; j++) {
                var se = entries[j];
                if (!se.uri) continue;
                if (encodeURIComponent(se.uri) == encodeURIComponent(e.uri)) {
                    e.bindStarEntry(se);
                    entries.splice(j,1);
                    break;
                }
            }
            if (typeof(e.can_comment) == 'undefined') {
                e.setCanComment(res.can_comment);
            }
            e.showStars();
            e.showCommentButton();
        }
    }
});

/* Hatena.Star.WindowObserver */
Hatena.Star.WindowObserver = new Ten.Class({
    initialize: funct


  

2006-11-21

anond pickup of the day

以下の二つに留意、つまり乱用禁止。

取説未満

// ==UserScript==
// @name	anond pickup of the day
// @namespace	http://anond.hatelabo.jp/
// @description	pickup section of the day at Hatelabo::AnonymousDiary
// @include	http://anond.hatelabo.jp/2*
// ==/UserScript==
(function(){
	var trackbackThreshold = 10;
	var ignoreList = {
		"/20070801172335": 33,
		"/20070806163721": 10,
	};

	// only section of the day
	if (! location.pathname.match(/^\/\d{8}$/)) {
		return;
	}

	// regist ancher that kick main routine
	var a = document.createElement("a");
	a.href = "#";
	a.innerHTML = "pickup of the day";
	a.addEventListener("click", grab, false);
	var firstPager_l = document.evaluate("//div[@class='pager-l']",document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;
	firstPager_l.appendChild(a);

	function Outline() {
		this.outline = document.createElement("ul");
		this.text = document.createElement("textarea");
		this.text.style.overflow = "auto";
		this.text.style.width = "100%";
		this.text.style.height = "15em";
		this.text.innerHTML = "</ul><\n><ul>\n";
		this.list = new Array();
	}
	Outline.prototype.setup = function() {
		var parent = document.getElementById("body");
		parent.insertBefore(this.outline, parent.firstChild);
		parent.insertBefore(this.text, parent.firstChild);
	}
	Outline.prototype.append = function(section) {
		var h3 = section.getElementsByTagName("h3")[0];
		var sectionName = h3.firstChild.pathname.replace(/\//,"");
		var sectionText = h3.textContent.replace(/\s*$/,"");
		if (sectionText == "\u25a0") {
			sectionText = sectionName;
		}
		this.text.innerHTML +=
			'<h2>[http://anond.hatelabo.jp/'+sectionName+
			":title="+sectionText.replace(/^\u25a0/,"").replace(/]/g,"&amp;#93;")+"] "+
			'<a href="http://b.hatena.ne.jp/entry/http://anond.hatelabo.jp/'+sectionName+'">'+
			'<img src="http://b.hatena.ne.jp/entry/image/http://anond.hatelabo.jp/'+sectionName+'">'+
			"</a></h2>\n";
		h3.firstChild.name = sectionName;
		var li = document.createElement("li");
		li.innerHTML =
			'<a href="#'+sectionName+'">' +
			sectionText.replace(/&amp;/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") +
			"</a>";
		var nextSibling = 0;
		for (var i in this.list) {
			if (nextSibling < i &amp;&amp; i < sectionName) {
				nextSibling = i;
			}
		}
		if (nextSibling) {
			this.outline.insertBefore(li, this.list[nextSibling]);
		} else {
			this.outline.appendChild(li);
		}
		this.list[sectionName] = li;
	}
	var outline = new Outline();

	function CC(day) {
		this.li = document.createElement("li");
		this.li.innerHTML = '<a href="/'+day+'" target="_blank">' + day + "</a>";
		this.day = day;
		this.n = new Array();
	}
	CC.prototype.pp = function(id) {
		this.n.push(id);
		if (this.n.length > 10) {
			this.li.innerHTML = '<a href="/'+this.day+'" target="_blank">' + this.day + "</a> " + this.n.length;
		} else {
			this.li.innerHTML += ' <a href="/'+id+'" target="_blank">*</a>';
		}
	}

	function Count() {
		this.count = document.createElement("ul");
		this.list = new Array();
	}
	Count.prototype.setup = function() {
		var parent = document.getElementById("body");
		parent.insertBefore(this.count, parent.firstChild);
	}
	Count.prototype.append = function(day, id) {
		var nextSibling = 0;
		for (var i in this.list) {
			if (nextSibling < i &amp;&amp; i <= day) {
				nextSibling = i;
			}
		}
		if (nextSibling == day) {
			this.list[nextSibling].pp(id);
		} else {
			var cc = new CC(day);
			if (nextSibling) {
				this.count.insertBefore(cc.li, this.list[nextSibling].li);
			} else {
				this.count.appendChild(cc.li);
			}
			this.list[day] = cc;
			cc.pp(id);
		}
	}
	Count.prototype.appendSection = function(section) {
		var id = section.getElementsByTagName("h3")[0].firstChild.pathname.replace(/\//,"");
		var today = id.match(/\d{8}/)[0];
		var anchors = section.getElementsByTagName("a");
		for (var i=0; i<anchors.length; i++) {
			if (anchors[i].href &amp;&amp; anchors[i].host == "anond.hatelabo.jp" &amp;&amp; anchors[i].pathname.match(/\/(\d{8})\d{6}/) &amp;&amp; RegExp.$1 != today) {
				this.append(RegExp.$1, id);
			}
		}
	}
	var count = new Count();

	function Hide(){}
	Hide.prototype.setup = function() {
		this.style = document.createElement("style");
		this.style.id = "hide";
		this.style.type = "text/css";
		document.getElementsByTagName("head")[0].appendChild(this.style);
		var self = this;
		this.a = new Object();
		this.a.visible = document.createElement("a");
		this.a.visible.id = "visible";
		this.a.visible.href = "#";
		this.a.visible.innerHTML = "visible hide section";
//		this.a.visible.setAttribute("onclick","document.getElementById('hide').innerHTML = 'div.hide {display: block}';document.getElementById('visible').style.display = 'none';document.getElementById('unvisible').style.display = 'inline';");
		this.a.visible.addEventListener("click", function(){self.visible()}, false);
		firstPager_l.parentNode.insertBefore(this.a.visible, firstPager_l);
		this.a.unvisible = document.createElement("a");
		this.a.unvisible.id = "unvisible";
		this.a.unvisible.href = "#";
		this.a.unvisible.innerHTML = "unvisible hide section";
//		this.a.visible.setAttribute("onclick","document.getElementById('hide').innerHTML = 'div.hide {display: none}';document.getElementById('visible').style.display = 'inline';document.getElementById('unvisible').style.display = 'none';");
		this.a.unvisible.addEventListener("click", function(){self.unvisible()}, false);
		firstPager_l.parentNode.insertBefore(this.a.unvisible, firstPager_l);
		this.unvisible();
	}
	Hide.prototype.visible = function() {
		this.style.innerHTML = "div.hide {display: block}";
		this.a.visible.style.display = "none";
		this.a.unvisible.style.display = "inline";
	}
	Hide.prototype.unvisible = function() {
		this.style.innerHTML = "div.hide {display: none}";
		this.a.visible.style.display = "inline";
		this.a.unvisible.style.display = "none";
	}
	Hide.prototype.append = function(section) {
		if (section.className.match(/hide/)) {
			return;
		}
		section.className += " hide";
		count.appendSection(section);
	}
	Hide.prototype.is = function(section) {
		return section.className.match(/hide/);
	}
	var hide = new Hide();

	// main routine
	function grab(){
		if (! document.body.innerHTML.match(/<div class="pager-r">(\d+)/)) {
			return;
		}
		var pages = RegExp.$1 -0;
		if (pages <= 0 || pages > 40) { // check error and limit 1000 entry
			return;
		}
//pages = 2;

		firstPager_l.style.display = "none";
		outline.setup();
		hide.setup();
		count.setup();

		var mainbody = document.evaluate("//div[@class='body']", document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;
		mainbody.innerHTML = "\n";
		for (var i=1; i<=pages; i++) {
			cat(mainbody, i);
		}
	}

	// page load and concatenate
	function cat(container, page) {
		container.innerHTML += "<!-- page " + page + " -->\n";
		GM_xmlhttpRequest({
			method: "GET",
			url: "http://anond.hatelabo.jp" + location.pathname + "?page=" + page,
			onload: function(result) {
				result.responseText.match(/<div class="body">((.|\s)*?)\s*<\/div>\s*<\/div>\s*<div class="pager-l">/);
				container.innerHTML = container.innerHTML.replace("<!-- page " + page + " -->", RegExp.$1);
				if (! container.innerHTML.match(/<!-- page \d+ -->/)) {
//					document.documentElement.innerHTML = document.documentElement.innerHTML.replace(/(src|href)=\"\//mg, "$1=\"http://anond.hatelabo.jp/");
					pickup();
				}
			}
		});
	}

	// pickup section at last cat() concatenate after
	function pickup() {
		var target = document.evaluate(
			"//div[@class='section' and child::*[not(@class='sectionfooter') and descendant::a[starts-with(@href,'http://anond.hatelabo.jp/2') or starts-with(@href,'/2') and not(child::span[@class='sanchor'])]]]",
			document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
		for (var i=0; i<target.snapshotLength; i++) {
			hide.append(target.snapshotItem(i));
		}

		var tbs = document.evaluate(
			"//p[@class='sectionfooter']/a[2]",
			document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
		for (var i=0; i<tbs.snapshotLength; i++) {
			var tb = tbs.snapshotItem(i);
			if (tb.innerHTML == "\u30c8\u30e9\u30c3\u30af\u30d0\u30c3\u30af(0)") {
				hide.append(tb.parentNode.parentNode);
			} else if (! hide.is(tb.parentNode.parentNode)) {
				trackback(tb);
			}
		}
	}

	// count trackbacks
	function trackback(tb) {
		GM_xmlhttpRequest({
			method: "GET",
			url: "http://anond.hatelabo.jp/" + tb.pathname.match(/\d{14}/),
			onload: function(result) {
				var link = result.responseText.match(/<a name="tb">(.|\s)*/)[0].match(/<li>\s*<a href="http:\/\/anond.hatelabo.jp\/\d{14}"/g);
				var n = link.length;
				for (var l in link) {
					var m = "/" + link[l].match(/\d{14}/);
					if (m in ignoreList) {
						n -= ignoreList[m];
					}
				}
				if (n < trackbackThreshold) {
					hide.append(tb.parentNode.parentNode);
				} else {
					tb.innerHTML = tb.innerHTML.replace(/\)$/, "/"+n+")");
					outline.append(tb.parentNode.parentNode);
				}
			}
		});
	}

})();

ログイン ユーザー登録
ようこそ ゲスト さん