「F3」を含む日記 RSS

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

2017-10-18

anond:20171018093404

かつてマンコネンっていうレーシングドライバー日本F3に出ていたんだがそれじゃヤバいだろってことで「マンコーネン」っていう何の解決にもなっていない名前に変えられつつ数戦で消えていったのは遠い思い出の話。

2017-09-05

カメラ」好きによる、フィルムカメラ購入のススメ

増田です。写真も好きですがカメラの方が好きだと思います

撮影頻度は月にフィルム5本程度。カメラを触りながらウイスキーが飲める程度に好きです。

Nikon F4を使っているニコン党です。

0.前提条件

  1. フィルムカメラが欲しい人
  2. 35mmカメラのみ、予算レンズ込で1~3万前後、入手性・経済性もある程度考慮
  3. 主に1眼レフを紹介

0.1 御託は置いて実用おすすめフィルムカメラ

NikonF3,F4
CanonNewF-1,EOS-1N,EOS-5QD,EOS-Kissシリーズ
MinoltaXD,α7
OLYMPUSOM-2SP,OM-4

0.2 最初に買うレンズ

スマホ感覚で撮るなら28mmか24mmだけど、おすすめできません。ズームは気が向いたら買えばいいでしょう。

0.3 フィルム

最近は涼しくなってきましたが、冷蔵庫保管。結露に注意。

0.4 電源

但し水銀電池に関しては現在販売していないため、工夫が必要(LR44ゴムパッキンをはめる等)

1.好み別

■古い、いわゆるクラシックスタイル
Nikon*F,F2
PENTAXSP,SL
OLYMPUSOM-1 ~ OM-4
デジタルカメラと併用したい
NikonAIニッコールが装着前提のカメラ(例:FM2,FE2,F4,F100,F6)
CANONEFマウントカメラ(例:EOS-1N,EOS-5QD,EOS-3)
MinoltaAマウントカメラ(例:α7,αSweetシリーズ)
■軽いほうがいい
NikonU,U2,EM
CANONEOS-5QD,EOS-Kissシリーズ
MinoltaαSweetシリーズ
OLYMPUSコンパクトカメラ(例:ミュー、XA)
■安い方がいい
NikonF-**,F-***等の二ケタ三ケタ機(例:F-90X,F-801,F-501)
MinoltaXG-S,X700,SRT101
PENTAXSP,MZ-5
OLYMPUSOM-1

2.メーカ

Nikon

レンズ、ボディ高め、無難オブ無難

ニッコール千夜一夜物語なるWebページは必見。

Canon
■Minolta
PENTAX
OLYMPUS

レンズ、ボディ共に若干安、小型かつシャッター音が小さく軽やか。

個人的にはOM-4は欲しい。

3.よくあると思う質問

■1眼レフ重くない?

構造上重くなります最近ミラーレスのような軽さはないでしょう。

レンズ交換が不要であれば、35mm単焦点コンパクトカメラおすすめです。

レンジファインダー型は極端に古いか価格が高いためおすすめできません。

メーカが少なくない?

メジャーどころの全てのフィルムカメラでも、実用においては事足ります

Leicaはどう?

経済的余裕があり、Leica萌えでなければ最初に買うべきではないでしょう。

私もLeica M5が欲しいですが、レンズとセットでは手が出ません。悲しい。

■中判は?

最初の1台としては、あんまりおすすめできません。重い。ただただ重い。

どうせ買うならHolga等のトイカメラでなく、マミヤのRZ67等がおすすめです。

ランニングコストを除けば、35mmカメラを買うのと値段はそこまで変わりません。

おすすめフィルムは?

KodakのGold400は使いやすいと思います。あとEktarも結構好き。モノクロならAcros使ってみるとよし。高感度はnatura

かわうそ商店さんのWebページを見て、色々なフィルムがある事を見ればいいと思います

以上初投稿増田でした。誰かのフィルムカメラ購入きっかけになれば幸いです。

2017-05-05

ゲーム史を振り返りつつ○○向け企画について考える

平成になりもうすぐ30年を迎えようとしている。

特定の年齢層をターゲットにした製品企画に携わる機会があり、

想定ユーザーのズレがひどいなあと閉口した。

昭和からまるで変化していない。

ゲーム史を振り返りつつ、当時のユーザーたちの現在の年齢を書く。

ハードには [ ] を付けた。

1975 テレビテニス

1978 スペースインベーダー

電波規制が緩い時代に家庭向けとして登場したテレビテニスポンテニス)は、

映像出力としてU波を使うため、近所への電波障害が酷かった。

スペースインベーダーの登場により、喫茶店がめまぐるしく様変わりをはじめた。

ここからゲームの普及はじまったといっていい。

※当時20才=1958年(昭和33年)生まれ現在59~60才

1979 ギャラクシアン

1980 [ゲームウオッチ]、パックマン

1981 ジャンピュータードンキーコング、[IBM PC 5150]

1982 倉庫番、[PC-9801]

第2次オイルショック後、ギャラクシアンパックマンが立て続けにヒット。

ゲームウォッチ床屋等の待合所にもよく見かけるようになった。

PC-9801シリーズの発売が開始され、1990年代前半まで栄華を極めることになる。

※当時20才=1962年(昭和37年)生まれ現在54~55才

1983 ゼビウスドアドア、[ファミリーコンピュータ]

1985 グラディウスドルアーガの塔スーパーマリオブラザーズボンバーマン

ファミリーコンピュータ発売。

スーパーマリオブラザーズというソフトが登場により、一般家庭にテレビゲームが普及。

タイトル誕生し、ヒットを重ねていく。

※当時20才=1965年(昭和40年)生まれ現在51~52才

1986 [ディスクシステム]、ドラゴンクエスト

1987 ドラゴンクエストII、[PCエンジン]、ファイナルファンタジー

1988 ドラゴンクエストIIIスーパーマリオブラザーズ3、[メガドライブ]、テトリス

ファミコン周辺機器として、ディスクシステム発売。

スーパーマリオブラザーズ2ゼルダの伝説メトロイドを引っ提げて。

PCエンジンメガドライブ等、家庭向けハードが次々と発売される。

ドラゴンクエストIII社会現象になった。

※当時20才=1969(昭和45年)生まれ=47~48才

デジタル放送に切り替わるあたりからテレビリモコンに大量のボタンが増え、

新しいモノにはついていけない……とボヤきつつも、

地上波データ放送ミニゲーム操作できる世代が60才を迎えようとしている。

いまのF3/M3層は、昭和の老人とは違う。

余談ではあるが、つい先日C層向けケータイを選ぶことになったのだが、

ハードも、ソフトも、明らかな子供向けデザインだった。

厚ぼったいくせに、衝撃に弱い。子供だましにしても、雑だ。

まだまだテレビ生活の中心にあった時代は、茶の間テレビを使うファミコン時間が限られていた。

1989年にはゲームボーイが登場し、家庭の生活様式にも影響を与え始めた。

現在、多くの子供たちは、DSを持ち、Wi-Fi接続してYoutube等を見る。

ここでその賛否を論じるつもりはない。それが現実なのだ

2017-04-24

http://anond.hatelabo.jp/20170423213123

a-zと0-9とその他記号系は普通に文字入力

Space/Enter/Backspace/Delete文字入力

Ctrl/Shift/Alt/Winは各種ショートカット

F1ヘルプ

F2名前変更。エクセルセル編集とかも

F3検索

F4 はAltと押してウィンドウ閉じる。単体は個人的には独自ショートカットに割り当ててるから使ったこと無い。

F5 はリロード

F6IMEひらがな

F7 はIMEカタカナ

F8IMEで半角カタカナ

F9 はIMEで全角アルファベット

F10 はIMEで半角アルファベット

F11 は全画面

F12 はブラウザ開発者ツール出す

ESC はいろいろなキャンセルっぽいときに使える。一番使うのはタスクマネージャにCtrl-Shift-ESC。ChromeだとShift-ESC

PrtScr はスクショ。Altと押すことが多め。

ScrollLock はエクセルスクロールのしかた変えるとき

PauseBreak はコマンドプロンプトの流れていくのを一時的に止めるとき

Insert は上書きモードにしたいとき。あと、ShiftやCtrlと組み合わせてカットコピーになるソフトがある

PgUp/PgDn はネットみてるときエディタで一気にスクロールしたいとき

Home/End もブラウザ最初最後に飛んだり、エディタで行もしくは全体の最初最後に飛ぶ時

Tabフォーカス切り替え。あとプログラムとか書くならインデント

CapsLock はShiftと押して大文字固定にしたり、単体で押してアルファベット入力だけどIME使いたいときの切り替えとか

半角全角はIMEの切り替え

NumLock はテンキー付きなら常時ONでいいんだけど、テンキー無しのキーボードテンキー配列入力したいときに押す

無変換はひらがなカタカナ・半角カタカナに切り替えるときに。F6/F7/F8でもいい。個人的にはAHKで修飾キーにもしてる

変換は入力確定したのをIMEで再編集するとき。稀にスペースキーバグって変換できないときにスペース代わりに押したこともある

右側Ctrl/Alt/Shiftはめったに使わないけど、片手で操作したいときVirtualBox特殊キーに使う(安いキーボードだとたまにない)

アプリケーションキー?は右クリック代わり。webページで右クリック禁止されてるときにこっち押したりする

ひらがなカタカナローマ字は使ったこと無い。

Fnキーキーが足りないキーボードについててWi-Fiや画面表示や外部接続の切り替えとかPCキーボード)ごとにいろいろできる。

余り使わないのはあっても、全く使わないはほとんどなかった。

2017-01-18

http://anond.hatelabo.jp/20170118183427

tracert www.apahotel.com

e9548.g.akamaiedge.net [184.31.38.126] へのルートトレースしています
経由するホップ数は最大 30 です:

  1     1 ms     1 ms     1 ms  aterm.me [192.168.10.1]
  2     2 ms     1 ms     1 ms  aterm.me [192.168.179.1]
  3    41 ms    38 ms    39 ms  xxxx
  4    46 ms     *       48 ms  i218-47-160-153.s99.a049.ap.plala.or.jp [218.47.160.153]
  5    44 ms    38 ms    39 ms  i118-21-197-149.s99.a049.ap.plala.or.jp [118.21.197.149]
  6    57 ms    40 ms    39 ms  i118-21-197-33.s99.a049.ap.plala.or.jp [118.21.197.33]
  7    55 ms    38 ms     *     211.0.195.241
  8    55 ms    35 ms    39 ms  122.1.245.69
  9   103 ms     *       39 ms  122.1.245.118
 10    57 ms    38 ms    38 ms  210.163.230.74
 11    56 ms    43 ms    35 ms  ae-15.r27.tokyjp05.jp.bb.gin.ntt.net [61.213.162.173]
 12     *      119 ms    36 ms  ae-0.r30.tokyjp05.jp.bb.gin.ntt.net [129.250.2.11]
 13    54 ms     *        *     ae-17.r01.tokyjp03.jp.bb.gin.ntt.net [129.250.6.117]
 14     *      134 ms    57 ms  ae-0.akamai.tokyjp03.jp.bb.gin.ntt.net [61.120.145.122]
 15    39 ms    40 ms    38 ms  a184-31-38-126.deploy.static.akamaitechnologies.com [184.31.38.126]

 

 

tracert www.google.co.jp

www.google.co.jp [216.58.197.3] へのルートトレースしています
経由するホップ数は最大 30 です:

  1    <1 ms     3 ms    <1 ms  aterm.me [192.168.10.1]
  2     3 ms     1 ms     1 ms  aterm.me [192.168.179.1]
  3   113 ms    37 ms    37 ms  xxxx
  4    50 ms    50 ms    38 ms  i218-47-160-153.s99.a049.ap.plala.or.jp [218.47.160.153]
  5    45 ms   132 ms    46 ms  i118-21-197-149.s99.a049.ap.plala.or.jp [118.21.197.149]
  6    57 ms    38 ms   191 ms  i118-21-197-33.s99.a049.ap.plala.or.jp [118.21.197.33]
  7     *      128 ms   113 ms  211.0.195.245
  8     *        *       56 ms  211.0.193.30
  9     *        *       50 ms  108.170.242.98
 10    51 ms    59 ms    58 ms  216.58.215.254
 11    63 ms    46 ms    51 ms  108.170.243.33
 12    80 ms    64 ms    62 ms  108.170.238.101
 13    62 ms    57 ms     *     kix06s02-in-f3.1e100.net [216.58.197.3]
 14    63 ms    57 ms     *     kix06s02-in-f3.1e100.net [216.58.197.3]
 15   127 ms    50 ms    59 ms  kix06s02-in-f3.1e100.net [216.58.197.3]

 

∴わかんね

2016-11-15

恣意的誤用

追記

誤用ではありませんでした

恣意的誤用」という記事は誤りです

http://anond.hatelabo.jp/20161119102702

謹んでお詫び申し上げます

本文

最近恣意的」の本当の意味を知りました

恣意的 誤用」で検索すると非常に沢山の記事が出て来ます、もう何年も前から有名な話なんですね

こんな有名な誤用も知らずに自分は今の今まで、ドヤ顔で「恣意的に~」とか使っていたわけです

正しい意味を知っている人たちは誤用を見るたびに内心笑っていたことでしょう

本当に恥ずかしい……

以下正しい使用例です

はてなキーワード - 恣意

恣意的であるとは一貫した思想に基づかずその場限りの考えに基づいている点で、明確な目的をもった「意図的」とは区別されるべきである

ttp://d.hatena.ne.jp/keyword/%D7%F3%B0%D5

ニコニコ大百科 - 恣意的

恣意的』という言葉は、文中での登場の仕方が似ているせいか意図的作為的故意とという意味で使われることがあるが、恣意的には、無作為や定まった意図がないというニュアンスがあり、正しくない

http://dic.nicovideo.jp/a/%E6%81%A3%E6%84%8F%E7%9A%84

▼「恣意的」を「意図的」と同じ意味で使ってる人は低学歴 「恣意的」は「偶然に」という意味ですよ

http://engawa.2ch.net/test/read.cgi/poverty/1343400752/

▼「意図的」と「恣意的(しいてき)」の正しい使い分け方

自分や誰かの行動の理由説明できない(と思われる)ときに使います

https://nanapi.com/ja/105751

恣意的の読み方は?皆が誤用しているその意味とは?反対語は?

ランダム」と言い換えることもできます

http://rubeusu-trend.com/1709/

▼どうして意図的って書かないの?

勝手気ままに」「任意に」「ランダムに」「自分勝手に」「無作為に」「その場その場の思いつきで」

http://blogs.yahoo.co.jp/delightful_mikan/60763792.html

▼【誤字等の雑記帳 3】

深く考えず、でたらめに行動している様子

http://www.tt.rim.or.jp/~rudyard/misc003.html

解釈記事によって少し揺れています

分かりやすく2点書き出すとすると

ということらしいです

まり意図的」という言葉に置き換えてもニュアンスこそ違えど意味が十分に伝わる文章や、"偶然に"といった意味が含意されていない文章誤用ということですね

ではここから誤用だということも知らずにドヤ顔で「恣意的に~」とか言ってる日本語の下手くそ馬鹿達を見ていきましょう

▼****さんのツイート

NHK恣意的編集にはうんざり

まずは個人です、まあ可哀想なので晒さないであますが、NHK批判の前に自分言葉を直してほしいですね、思いっき誤用しています

政府年金運用情報を開示へ…懸念払拭の狙い : 政治 : 読売新聞

運用信託銀行などに委託しているが、情報公開には恣意(しい)的な運用への懸念などを払拭する狙いがある。

http://www.yomiuri.co.jp/politics/20160307-OYT1T50167.html

次は世界最多の発行部数を誇る読売新聞、なんと振り仮名まで振って誤用しています、これは恥ずかしいですね、情報公開で偶然性を廃するなんて意味不明ですからこれは言い逃れできません

フェイスブックニュース表示 恣意的と指摘で調査 | NHKニュース

フェイスブック利用者の画面に表示するニュースについて共和党政治家話題を避けるなど恣意的(しいてき)に選ばれているとアメリカの一部のメディアが伝え、内部で調査が進められることになりました

http://www3.nhk.or.jp/news/html/20160514/k10010520761000.html

言葉遣いには厳しいはずのNHK、なんと表題誤用してます、相当恥ずかしいですね、しかもこれは"偶然に"という意味だったとは絶対言い逃れできない誤用です、NHKしっかりw

▼「哲學研究入門」小石川書房 - 1949(昭和24)年9月30日発行

併しこういう歴史的現實の把握は全く恣意的な直觀に訴えるわけにはいかないから、そこに類型了解ということが必要になって來る

京大名誉教授矢田部達郎先生1949年上梓した本の一節です、旧字体でカッコつけてる割には普通に誤用してます

場当たり的な直感っておかしいですし、明らかに「作為的な」という意味で使っています先生どんまい

▼「文芸」1940(昭和15)年1月

今度の問題は、素子がそれほど恣意的に振舞う筈のものだろうか。

宮本百合子という文壇の元天才少女小説家先生です

全文読めばわかりますが、明らかに偶然性など含んでいませんし、自分の思うままに~という典型的誤用例と同じ形で使っています

▼「文藝春秋 第二八巻第一号」 1950(昭和25)年1月1日発行

まことに二つながら恣意的で、こうワガママでは、どこまで行っても、同じくりかえしにすぎない。

皆さんご存知、坂口安吾文章です、文意にはまったくもって「ランダム性」など含まれていません、典型的誤用ですね

油脂の浪費は法度監視制を創設 : 帝国油糧重点統制要綱決る : 化学 日本産業経済新聞 1943.4.14

地方割当民需(雑工業油、食料油等)の割当を、地方官吏の低度観点、古めかしい実績主義業者請託による虞あるが如き恣意的割当等に委せない制度確立

戦中の新聞記事です、こんな古くから誤用してます

▼日支政府呼応す : 社説 - 大阪朝日新聞 1940.3.31

思うに、今般反共和平建国親日政府樹立の挙たるや、他国家のロボット政権として恣意的に駆使するていの意図によるものでもなくてさりとて戦争相手政府として講和談判の衝に当っているわけでもない

少し遡って戦前朝日新聞の社説です、誤用してます

政党ファッショ大阪時事新報 1933.1.1-1933.1.7

かれらは所謂議院内閣主義否認し、国王恣意的に任命した官僚内閣組織し、議会対立したのである

更に遡って昭和一桁の頃の新聞記事です、誤用してます

▼減債基金存廃問題 大阪朝日新聞 1916.11.22(大正5)

経常費とす可しというにあり、乍併這は既にシェフレーの言えるが如く国債償還費は恣意的に定む可き最可動的の臨時費として各年の予算状態に応じ国家余裕を考察し大小有無伸縮的に定めらる可く

大正新聞記事です、「ほしいままに~」という意味で使っています、偶然やランダム性などという意味は含まれていません誤用ですね

ちなみにこの大正5年の使用例が調べる限りでは最も古い「恣意的」の使用例となっています

まり恣意的」という言葉は一番最初に使われた時、生まれた瞬間から誤用されていたんですね

そしてこの大正5年から2000年頃まで、1世紀近くの間、ほぼ全ての使用例が誤用となっています

酷いですね

正しい使い方、本来意味で使われるのは2000年以降、ネットが普及してからになります

特に最近は親切な人達ネット上で

とか

とか言って正しい使い方を普及してくれています

ありがたいですね

皆さんも誤用には気を付けましょう

2015-11-30

オカマキモいんじゃなくてオカマ消費を煽る制作消費者キモい

テレビオカマホモ芸人は見かけても

女性のおなべだレズだってのがテレビに出るとき

性同一性障害だ、LGBT文脈シリアスに取り扱われ

オカマ芸人のような雑に扱いをされるのを見たことがない

テレビを見ているF2F3オカマが受けが良い

穿った見方をすると、オカマは女になりたくてなれないので

生物的に女である視聴者はその時点で優越感がある

汚いオカマ下品な話で盛り上がれば

自分はそれよりマシだという慰めにもなる

アイドル女優イケメン性的アプローチをするのが許されるのはドラマの中だけ

ドラマなら視聴者アイドル女優感情移入できるが、これがバラエティだと途端にカドが立つ

ここでオカマ登場。オカマならバラエティイケメンいくら色目を使っても

分不相応なと嘲笑されるだけで済む

それどころか、バラエティの中でジャニタレ半笑いされているオカマの姿は

それはそれで一般視聴者たる自分が、もしアイドルと会話できたらという

妄想を膨らませるオカズにもできる

と、アニメヒロイン性的消費するオタクへの批判をひっくり返した

オカマ消費するテレビ好き女性像をゲスパー忖度してみた

このゲスパーの妥当性はどうでもよくって

オタクにとって都合の良いアニメヒロインの歪なキャラクター造形が

それを消費するアニオタ批判へと繋がるように

メディアに出るオカマ気持ち悪さのかなりの部分は

それを消費するテレビ好き、少し矛先を変えると

こういうのがウケるんでしょと作ってる制作側にあるということ

あと、政治家ホモで繋がりでかろうじて思い出したけど

滋賀4区自民党議員だって未公開株がどうこうって時点では

メディアもちょこちょこ取り上げてたけど、

若い男囲って議員会館でどうこうとか文春がすっぱ抜いたら

メディアドン引きしちゃってトーンダウンする程度には

メディア倫理観があるよなあとは思う

http://anond.hatelabo.jp/20151129175725

2015-11-17

http://anond.hatelabo.jp/20151117081518

いや、そういう話もないわけではないですが、そういう「F3層は広告ターゲットとして美味いかどうか」の話以前に、

受け手F3層に偏ると、F3層向け以外の商品広告費が他媒体に流れてしまう」っていうのが大きいはずです。

ちな余談気味ですが「ターゲットとしての美味しさ」ってのは必ずしも購買力だけで決まるもんじゃないです。

例えば「(他世代含めた)流行の発信源となりやすい」という分析を元にかつてはF1層が非常に重視されたりしていました。

ちなみにF2層やF3層も捨てたもんではなくて「家計の財布」はたいてこの層が握っているので、自分用の可処分所得

低くても、食品日用品CMが狙うのはまずこの層です。

ただこの層向けの商品だけだと収入源減りますよね…という話ですね。

2015-10-13

まだ楽天商品ページでPageDown連発して消耗してるの?

楽天商品ページ、長いですよね。価格在庫調べたいだけなのに「どんだけスクロールさせんだよ」って。

楽天事業モデル上、買い物客よりショップの優先度が高いから仕方ないんですけどね。

からといって短絡的に楽天を嫌いになる前に、以下を試してみて。

■初回

1.Ctrl + F

2.”商品番号”で検索

■2回目以降(ページ検索に”商品番号”が残っている状態

1.F3

ね?これだけで相当捗るでしょ。

2014-06-19

http://anond.hatelabo.jp/20140619010953

forループは全部再帰に直せるので再帰を使う。

f(a, b, total)みたいな関数を考える。

aはまだ読んでない値のリスト、bは既に読んだ値のリストtotalは読んだ値の総和を意味している。

まり、aの先頭をx、残りをxsとしたとき

f(xs, b+x, total+x)と再帰的にa,b,total更新していけば、一個ずつリストを読んでいくことができる。

後はf(randoms, [], 0)を呼んで、totalが50を超えたらbを返すようにすればいい。

まあこんなん実質変数使ってるみたいなもんじゃねえか、というハナシではあるけど。

関数型のメリットはパーツの再利用がやりやすいというところにつきると個人的には思う。

たとえばこれの応用として、総和が50を超えたらじゃなくて総和が素数になったら総和を返すような関数f2を作れと言われたら?

コピペしてif文の中だけ変える?

……手続き型の発想だけだとそうするしかないかもしれないけど、

関数型言語なら、fにcheckという引数を追加して、check(total)がtrueならbを返すようにすれば簡単にf2f3を作ることができる。

ラムダ式を使って、条件を判定する関数をその場でポンと作ってfに与えることもできる。(今はJavaとかC++ラムダ式使えるね)

再帰があんまり深くなりすぎるとStack Overflowになってしまったり、速度がどうしても犠牲になりがちだったり、

もちろん向き不向きはあると思うけど、関数型便利ですよと、そういう話でよかった?

2009-07-26

http://anond.hatelabo.jp/20090725183306

おはようございます、元増田です。

 

思うに、「こどものじかん」は背伸びする子供に対するクズの大人達という構図が主題のひとつで、そこにリアリティを出すよう工夫するのは当然じゃないかな。

嫌な構図だからといって面白くない訳じゃないし、それを否定することは作品自体を拒絶することと同義では。

 

うーん、そうですね。

「背伸びする子供に対するクズの大人達という構図が主題のひとつ」、そのとおりなんだと思います。

どれくらいクズなのか嫌な構図なのか、これはやっぱりwikipediaの項目を読んでブルーになるだけじゃなく、実際に2巻以降も読んで、確かめてみよう、とおもいました。

 

yahoo コミック こどものじかん

ttp://comics.yahoo.co.jp/bin/search?p=%A4%B3%A4%C9%A4%E2%A4%CE%A4%B8%A4%AB%A4%F3

 

そう思い立って、いま先頭の無料ページだけを読んだんですが、2巻のあたまで、青木くんが「小学生のh画像」というタイトルメールを、開きもせずに削除した描写で、さらになんだか読む勢いがでました。

2009-01-23

ブラウザの乗換えが面倒くさいってのもあるけど

スレイプニルってなにがいいの?

http://anond.hatelabo.jp/20090121180451

使い慣れた機能がないってのが一番きついかな。

SleipnirFireFox両方あり】

  • タブの状態を記憶しておける
  • 閉じたタブの履歴が残っている
    • 間違って閉じてしまったタブでも安心
  • タブ一覧からワンクリック目的の場所へアクセス

Sleipnir特有】

まー、Sleipnir歴5年、FireFox歴半年なんで、FireFoxのことはあんまりわかってませんが。

Sleipnir特有」の部分が全部FireFoxでできるなら、完全にFireFoxに乗り換えてもいいかも。

2009-01-20

窓使いの憂鬱HHKB

だいぶ前のことなので結構忘れてるけど。

買ったのはHHKBPro2。OSはWindowsVista

買ってまずしたこと

背面のスイッチをいじってキーを変える。

http://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html

左◇Fn
右◇Win
DeleteBackspace

左◇あたりにFnを割り振らないと右小指でしかFnを押せなくて面倒。

DeleteよりBackspaceの方が使用頻度が高いので変更。(Fn+DeleteでDeleteを押したことになります)

パソコン側の設定

ノートPC(日本語Windows)で英語配列HHKBを使う時はUSJPを入れるのが限りなく正解に近い。

http://www.trinityworks.co.jp/software/USJPPro/index.php

デスクトップPCではドライバ英語キーボードに設定すればいい。

ノートPCでUSJPを入れていて、USJPにはおまけ機能でいくらかのキーの組み合わせを設定できるので

デスクトップPCでも同じにするためにとりあえず窓使いの憂鬱を入れた。

Vista対応版

http://slashdot.jp/~kazu2/journal/411746

設定はこんな感じにした。

include "104.mayu"

key C-D = Delete
key C-H = BackSpace
key C-M = Enter
key C-Space = $ToggleIME

逆に普通日本語配列キーボードを似非HHKBにする設定。

どこかで見た設定をベースにいじったような気がしますがどこのがベースか忘れた。

自分は左◇キーをFnキーに設定して使っているので無変換キーをFnキーにするとちょうどよくなる。

include "104.mayu"

mod control += CapsLock
def subst *CapsLock = *LControl
key S-Pause = CapsLock

def key 無変換 = 0x7b
mod mod0 = 無変換
key *S-M0-K = *S-Home
key *S-M0-Comma = *S-End
key *S-M0-Apostrophe = Right 
key *S-M0-Semicolon = Left
key *S-M0-LeftSquareBracket = Up
key *S-M0-Solidus = Down
key *S-M0-L = *S-PageUp
key *S-M0-FullStop = *S-PageDown
key M0-R = F5
key C-D = Delete
key C-H = BackSpace
key C-M = Enter
key *S-M0-_1 = F1
key *S-M0-_2 = F2
key *S-M0-_3 = F3
key *S-M0-_4 = F4
key *S-M0-_5 = F5
key *S-M0-_6 = F6
key *S-M0-_7 = F7
key *S-M0-_8 = F8
key *S-M0-_9 = F9
key *S-M0-_0 = F10
key *S-M0-HyphenMinus = F11
key *S-M0-EqualsSign = F12

def key JisBackslash = 0x7d
key JisBackslash = Backslash
key S-JisBackslash = $VERTICAL_LINE

key C-Space = $ToggleIME

HHKBを繋いだ時は上の設定、普通キーボードを繋いだ時は下の設定に切り替えてやってます。

どうでもいいこと

2つあるUSBポートが結構便利。

無線マウスレシーバをここに挿してます。

USBメモリを挿したい時もここ。

重量が結構ある。

レッツノート(1.5kg)とこれを一緒に持ち歩くととても重いのと体積が増えるので最近は置きっぱなしなことが多い。

2008-12-17

SP

javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.sp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.sp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[0]+"|"+m.music_list[i].diff[1]+"|"+m.music_list[i].diff[2]+"],"+x.level[0]+","+x.score[0]+","+t[x.flag[0]]+","+x.level[1]+","+x.score[1]+","+t[x.flag[1]]+","+x.level[2]+","+x.score[2]+","+t[x.flag[2]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();

(たぶん)DP用

javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.dp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.dp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[3]+"|"+m.music_list[i].diff[4]+"|"+m.music_list[i].diff[5]+"],"+x.level[3]+","+x.score[3]+","+t[x.flag[3]]+","+x.level[4]+","+x.score[4]+","+t[x.flag[4]]+","+x.level[5]+","+x.score[5]+","+t[x.flag[5]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();

2008-05-15

http://anond.hatelabo.jp/20080515095722

マウスゼスチャ便利だろ!

ショートカット左手でつかうもの。

マウスは右手でつかうもの。

たとえば窓を閉じるとき左手だとctrl+w右手だとマウス↓→

どっちがかけてもだめだこりゃ

窓移動はF2、F3マウス↑←↓、↑→↓(独自設定だけどね…)

マウスゼスチャを封じられるのはショートカットを封じられるぐらい不便だよ。

全然十分なんかじゃないよ!!

2008-03-03

Shift_JISにおける危険な文字まとめ

今時Shift_JISプログラミングするバカな奴はいないだろうけど折角まとめたので公開

2バイト目がアスキーコードど丸被りしているものを列挙する

@[\]^_`{|}~
405B5C5D5E5F607B7C7D7E
81 ????±×
82
83
84АЪЫЬЭЮЯклмн
85
86
87??????????????
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97輿
98
99
9A
9B
9C忿
9D
9E
9F
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED????
EE??
EF
F0??????????????????????
F1??????????????????????
F2??????????????????????
F3??????????????????????
F4??????????????????????
F5??????????????????????
F6??????????????????????
F7??????????????????????
F8??????????????????????
F9??????????????????????
FA????
FB????????
FC
405B5C5D5E5F607B7C7D7E
@[\]^_`{|}~

縦軸が1バイト目で、範囲は81ー9F、E0ーFC

横軸が2バイト目で、アスキーコードを含むもの。

# ちなみに「??」って表示されてるのはまー外字部分だしそんなに気にしなくていいかと

これらの文字コードには気をつけること。

特に2バイト目が5C(\)ものは要注意。

"や'と引っ付くのでまともにプログラミングできない。


 print '予定表';
 print "無能";

上記コードPerlでもPHPでもエラーとなる。

特にPerlの場合は文字列中に展開できる構文が多いのもあり、色々なエラーを出せるので注意が必要だ。


 print qq[夕焼け小焼け]; # 「夕」の2バイト目でエラー
 print "警察24時!";     # @24という変数とみなされる

また、正規表現でも厄介な問題が起きまくるので注意すべし。


my $str = 'ダ';
print 'match' if $str =~ /_/; # マッチしちゃう

こういう様々な理由からShift_JISプログラミングをしてはいけないわけだ。

だからUTF8を使うべきだ。UTF8が無理でもせめてEUC-JPのどちらかでプログラミングすることをオススメする。

まーEUC-JPEUC-JPShift_JISと一部文字コードが重なっているので正直扱いにくいのでやっぱりUTF8を強く推奨する。

プログラ増田のあなぐら

2008-01-08

驚愕の新事実発覚!鏡音リングーグル八分にされていた!

鏡音リングーグルヤフーイメージ検索ではほとんど表示されない。

しかしMSNだときちんと表示される(MSNの結果)。鏡音リングーグル八分にされているのだ!「初音ミクのときと同じだ。やっぱ技術的な理由なんだ。」なんて考えちゃいけません!理由はないけど!電通の圧力(笑)に違いない!根拠はないけど!「技術的な理由だ」なんて考えるのは電通の思う壺。すべてのボーカロイドファンは断固としてこの電通陰謀に屈してはならないのです!これからはMSNを利用し、同時にグーグルヤフーに抗議することでこの陰謀に立ち向かっていかなければならないのです!

まぁ、普通に考えればやっぱり技術的な理由だけど、ボーカロイドオタさんは今回もがんばって空回りしてほしいのです。

しかしまじめな話、MSNイメージ検索で鏡音リンエロ画像が一つ目にでるのはどうなんだろう。今検索すると

http://shop.melonbooks.co.jp/img/212001011182.gif

18禁につき注意)

が出てくる。大本も

http://shop.melonbooks.co.jp/tsuhan/system/list.php?RATED=18&MAKER_FULL=%A4%D1%A4%A4%A4%F3%A4%C8%A4%B5%A4%A4%A4%BA

できちんと18禁とわかる内容だろうに。機械的には無理なのか?いいのか、マイクロソフト

2007-08-27

素人探訪今日の素敵 java1.1

http://anond.hatelabo.jp/20070825192435

参照渡しがしたかった。

ないんだって。

クラスにしてメソッド呼び出しにしなきゃいけないの??

再帰的な簡単な処理をさせたいだけなのに…。

多重継承をしたかった。ないの?よくわからなかった。

型の違う多次元配列を使いたかった。

構造体は使えるみたいだけど、あれ、

構造体はないなんて書いているサイトもあるな・・・。

よくわからん。

Serializable ってわからないで使ってたけど、これが構造体に相当するの??

ほんとよくわからん・・・。

F3で次の候補に行きたい。行きたいだけなのに・・・。

ついうっかり振り出しにもどってしまう。

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



  
  

2007-05-11

http://anond.hatelabo.jp/20070511021557

剰余不可より100回ループ不可、てほうが制限としては面白いかもね。

まあそれは再帰するだけの話で

$arr = [nil,"Fizz","Buzz","FizzBuzz"]
def fzbz(i)
	f = ((i%3) == 0) ? 1 : 0
	f |= ((i%5) == 0) ? 2 : 0
	$arr[0]=i
	puts $arr[f]
	fzbz(i+1) if i<100
end

fzbz(1)

これを変形すると、条件判断&ループ禁止が書けるな。

$arr = [nil,"Fizz","Buzz","FizzBuzz"]
$f3 = [1,0,0]
$f5 = [2,0,0,0,0]
def fzbz(i)
	f = $f3[i%3]
	f |= $f5[i%5]
	$arr[0]=i
	puts $arr[f]
	([lambda{|i| fzbz(i+1)}, lambda{}])[i/100][i]
end

fzbz(1)

C言語でも関数ポインタで書けるので、Rubyの特権ではない。

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん