「WIN」を含む日記 RSS

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

2007-10-29

http://anond.hatelabo.jp/20071029203628

OS9の将来性がないことだけはハッキリしているが、本当のところOSXに移行して実際に効率化できるかどうかは怪しい。つうか効率はあがらんだろう。

なにしろルーチンワークだ。OS9の作業に慣れていればシステム最適化は済んでるし手動ながらメモリ割当てから起動順まで決まってる。Webは別のWindowsPCで見るしデータの受け渡しもそっちからする。OSXだから安定するなんて素人だけだし、新たな制限やら環境の混在やらでコストは増えるだろう。

何をもって未だに更新できないような制作事務所の効率がOS更新したぐらいで上がると信じているのかむしろ聞きたい。

経営者側としては時代への追従とコストの問題で何かしら移行したいとは思っている。まず寄らば大樹のWindowsでは印刷に限っては面倒で深刻な問題が残ってしまう。かといってOSXに移行するのはコストがそれなりにかかるのにもかかわらず将来のリスクが残るし制作上のメリットも期待するほど無い。

Macに限らず環境の移行は混在による管理負荷増や教育コストがかかる。その谷を越えたところにメリットがあるから移行する。現状そのままのお仕事ぶりではそんなメリットはないので面倒ばかりなのだ。

ソフトも新環境に合わせて入れ替えないといけないが、未だにIllustratorの8なんか使ってる日にゃアップデートの期限過ぎてるしでもう死ぬまでこの環境で乗り切るかって気にもなるってもんだ。

多分自力で環境移行できる資金力と能力のある事業所は乗換え先がWinだろうがOSXだろうがもうとっくに済ませている。

あとの「残された者たち - the rest of us -」は移行コストリスクも最初から必要のないIntelMacやWindows制作している若い会社によって“更新”されるだろう。それは日本会社じゃないかも知れんがな。

2007-10-21

http://anond.hatelabo.jp/20071021104203

SynapticとかあるけどaptではWindowsでいうVectorの代わりにはならないと思う。

ベンダーが提供するものは無名なソフトであればあるほど更新が遅いのが常なので。

今回の雰囲気だとオリジナルapt-lineは初心者にはまず無縁だろうし。

あといろんな意味での統一感のなさもLinuxの問題。

GNOMEKDEが出してるソフトにすらUI(の操作)に統一感がない。

ましてや(Winでも使われてるけど)GIMPとかAudacityみたいなソフト微妙な使いにくさ。

それにバイナリの互換性がないとか設定ファイルディストリ間の相違とか言い出せばきりがない。

Windowsならプラグインの追加はDLLドラックアンドドロップで完了するし……。

結局Linuxデスクトップ環境の標準にはなりえないと思います。まだMacの方が向いてるかと思う。

http://anond.hatelabo.jp/20071021084957

家庭用なんてもう全然無理。何がどうひっくり返ってもありえない。

macは昔使ってたし、winより優れた面もあるだろうけれど、

あえてmacを選ぶのは、デザイナープログラマくらいだよね。

2007-10-04

http://anond.hatelabo.jp/20071004160252

ごめんWindowsWinにもスティッキーズとまったく同じような付箋が標準装備されると良いんだけどね。

2007-09-30

http://anond.hatelabo.jp/20070930223945

んんー?

//anond.hatelabo.jp/ を開いたときリーダーの画面になるけど、その中のリンククリックすると増田本体のインターフェイスなっちゃって、見本Flashみたいにリーダーの中で切り替わっていかないよ。当方WinFirefox

2007-09-27

[]11日目

前回までのあらすじ

[Ruby]10日目

http://anond.hatelabo.jp/20070925223241

id/passの再発行を申請したら届いたのはなんとブログid/passだった!!

はたして締め切りに間に合うのか!!


はい、間に合うはずもありませんね。

夏休み宿題夏休みがおわってからやる主義の増田ですこんにちは

一応エントリーだけはしておきました。

サービス開始できてないけどな!


今日Ruby(正確には24時間ぐらいまえの)

next if  :nextcontinueみたいな感じ。この表記に違和感

unless  :こんな書き方にはなにかなじめない。

一行if文が嫌いな増田には余計耐えられない。

@user = params[:id].nil? ? @myuser : User.find(params[:id])

こういう書き方が嫌い。意味わからん。

画像DB格納で苦戦

正直嵌った。

win環境がどうのがいけなかったのかと、

あれこれいじってみたのだけど、そうではなかったようだ。

start_form_tagに :multipart => true がぬけていた。

あと、{}で引数位置指定しないといけないんだと…。

http://techno.hippy.jp/rorwiki/?HowtoUploadFiles
http://www.fdiary.net/ml/rails/msg/1375/0/
start_form_tag({:action => 'create'}, :multipart => true)

これは結構やりがちなミスかもしれない。

ちなみに、本のサンプルも間違っていたので余計嵌った。

image_tagで拡張子なしのファイルを読み込むと勝手png拡張子がついてくる。

おかげさまで表示されない。

http://mumrik.air-nifty.com/blog/2007/05/16_r185r186_6.html

どうやら画像ファイル拡張子が指定されていない URL だと自動的に png として扱うよ、ということらしいので、image_tag のところで url_for( ) した部分に追加修正をしてみる。

url_for(:action => 'xx', :id => 'xx', :extension => '.jpg')

対処療法でしかない。これだとjpgしかできないので正直どうしたものか。

:content_typeを一応保存しているので後から拡張子をつくることもできるが、

きっとなにかいいものがそのうちできるはず!!というかあるはず!!

→時間がなかったのでうっちゃった

redirect_back_or_defaultの使いどころに悩む。

ruby画像を描画させているばあい、画像にもどってしまうからだ。

この挙動は最初意味わからなかったぜ。

→時間がなかったので最初の画面に飛ばして誤魔化した

テーブルでjoinで名前だけでももってきたいとき、元のテーブルにはどうやって別名つけたらいいんだろう??

例えば、user名をuserテーブルからくっつけてもってきたい場合rubyは次みたいな

感じになるんだけど、正直気持ち悪い。

@catchcopy_pages, @catchcopy = paginate :catchcopies,

:conditions => contitions_str,

:select => 'catchcopies.id,user_id,users.login,catchcopies.catchcopy,catchcopies.created_at,vote,catchcopies.updated_at,item_id',

:joins => 'left outer join users on user_id = users.id ',

:order => 'created_at DESC' ,

:per_page => 10

ところでSchema.rbとかみるかぎりFKにも指定されていないんだが、大丈夫なのだろうか。

belongs_toとかではそこまでやってくれないものなのか。

ちなみにmigrateファイルでのalterとかの書き方はまだわかっていない。できるのかもしらない。

大会サーバアクセスできた

パスワードメールで送ってもらってアクセスできるようになった!

ftpは公開してないのね…? FTPあけてくれよ!!!

しかたないのでSSHアクセス

われながら情けないが、SSH越しのファイル転送のしかたがわからなかった。

rcpもscpもうまくできない。

これが環境の問題なのか、自分が悪いのか、やりかたが悪いのか、

問題の切り分けがそもそもできないので諦めた。

SSHで向こうのコマンドからrcpを蹴ってるってことはこっちが開けてないとダメってことだよね?

こっち閉じてるもの…。

wgetは生きていたので他のレンタルサーバー経由ファイルを取得。

ちなみにrcpができないのであげっぱなしさ!

が、しかし。unzipがはいってない。

tarで圧縮して、

tar xvf xxxx.tar

unzipがないのでzがつかえない。

フォルダの権限設定などをして、ローカライズ

せっかく

ENV['RAILS_ENV'] ||= 'production'

みたいなymlがあるのに、

dispatch.cgi

dispatch.fcgi

に書かれた

#!c:/ruby/bin/ruby

#!/usr/bin/ruby

に変更しなきゃいけないのは、何かあれだなと思った。

これかえてまわってたら本番とローカルで世代が分岐しちゃうじゃないか…。

ちなみにmysqlのソケットの位置も違うようなので、

/tmp/mysql.sock

socket: /var/run/mysqld/mysqld.sock

をymlに設定。

できればconfファイルフラグの書き換えだけで乗り換えしたかった。

最近linuxとかにもめっきり触っていなかったのでコマンド表を一生懸命見た。

witch ruby でインストールフォルダを割り出したり、

・・・findというコマンドが思い出せないときは情けなかった。

viコマンドも同様。

そうこうしながら設定完了

本番環境テスト動作

あれ、動かない・・・500エラーが出てる。

wget経由でdispatch.cgiをそのまま配置したのが原因でした。

中身みたらcgiエラー出力が書いてあった。

中継サーバで動いちゃったみたい。tarで固めてからわたしなおしましたとさ。

うごいたーー!!

でも、登録すると文字化けしている。

SQLで中身をみる。中身も文字化けしている。

おかしいなぁ……。

SQL>status

DBがlatin1になっていた…。

CREATE DATABASEも権限ないし…。

my.cnfも読み込み専用だった。

alter database XXXX DEFAULT CHARACTER SET utf8;

alter table XXXX DEFAULT CHARACTER SET utf8;

みたいな悪あがきもしてみたけど適わぬ夢。

SET NAMES utf8;

でもコネクションのところあたりでやってあげたいのだけど、

こういうときにRailsみたいなのは何がどこにあるのかわからない。

しょうがないので運営に問合わせしてみました。

ratin1は正直太刀できるきがあまりしない。

感想

unixとかlinuxとかそこらへん全然わからん…。

8日(のんびり)の勉強と2日(ほぼ徹夜)と1日(半日)のサーバー設定で、

アプリっぽいのはできあがった。

が、どうなのさ・・・。RonR

また今度Ruby感想でもくっちゃべるよ。

[Ruby]タグでもひいておくれ。

なんていうか消化不良。

もっとちゃんとしたものつくりたいな……。

2007-09-19

[]4日目

Eclipse経由を諦めてAptana IDEをそのまま使うようにした。

なんかこれは、まんまEclioseなのかもしれない。同じコードから作られてるのかな?

使いやすいよ。

昨日の続き

昨日の続きでこれをやった。

Windowsで簡単にRuby on Rails:Instant RailsAptana

http://japan.zdnet.com/sp/report/story/0,2000056431,20352478-3,00.htm

まずは、図11のようにテーブル名の単数形である「category」、「recipe」でそれぞれモデルを作成する。「GO」ボタンクリックするだけだ。

まったくもって何を言っているのかわからない。

そして図11なる画面をどこで呼び出すのかもわからない。

「みちこさん?パソコンを立ち上げるっていうのは縦に置けばいいのかいのぉ・・・?」

つまりはそういう感じだ。

うりうり探してたら、初期表示画面の画面下部のタグにGenerators画面があった。

scaffoldを実行とか書いてある。何これ趣味悪い。

scaffoldって絞首とか処刑とかそういう意味じゃなかったっけ?

足場っていう意味もあるのか。なんか違和感

で、なんなんだ!?

なんだかよくわからないまま連載終了。・・・くっ。

Aptana Eclipseプラグインで始めるRuby on Rails

Aptana Eclipseプラグインで始めるRuby on Rails

http://blog.codezine.jp/editor/2007/06/aptana_eclipseruby_on_rails_1.php

前にも見たことがあるこれにもどってきた。

現段階の環境構成でAptana IDE経由でRubyHello Worldを試す。さくさく。

おー。

この一連のコラムが、いままでの中で一番わかりやすかった。(目次はわかり難い)

ちなみにscaffoldの回のurlはここ。

http://blog.codezine.jp/editor/2007/08/ruby_on_railsscaffold_1.php

上のコラムをやって疑問点、へーっと思ったこと

Aptana IDEブラウザ内臓ってどこから呼び出すんだろ?

→下部WindowにあるServerタグのところにアイコンでLunchBrowserというのがあった。

ウインドウ:設定のところでFireFoxにも変更できる。

設定ついでにワークスペースエンコードの設定の欄を発見utf-8に変換した。

エンコードの状態をステータスバーなどに表示させておく方法はないのだろうか?探したが見つけられなかった。)

Generatorsタグが消えてしまった。

パースペクティブRubyになってた。これをRuby on Railsに。

Rake tasksを実行したりするとGeneratorsのプルダウンが出なくなる。なんでだろう?

ウインドウで新規ウインドウを開いたりして誤魔化している。

なんとかならないものか。

http://blog.codezine.jp/editor/2007/06/ruby_on_rails_migration1.php

RailsではmodelファイルDBのテーブルと対になります。

いわゆるO/Rマッピングというやつです。

へーーー!!そういう意味だったのか。

今日感想

今年買ったメーカー製のほとんど素のマシン

メモリを512MBしか積んでないのでページングしまくり

しかたがないのでこまめにテストサーバーを止めて対応。

IDE系統でメモリ食ってるのかな?落とすと300MB近くあく…。

1Gまでもっていかれちゃうと終了もままならなくなるので注意が必要そう。

Hello worldレベルでこんなんなってちゃ世話ない。

win系がダメなだけかな?

  • テーブル単体のI/Oはできるようになった。

複数を組込むにはどうしたらいいのだろうか。

さすがにheader/detailでDB参照したい。

追記:なんか少し調べたけどもしかしてRuby on RailsってO/Rマッピングオンリー…?

そんなまさか…。いや、いくらなんでも…。

http://www.web-career.com/seminar/ruby_on_rails.html

  • 今週中に予定していたアプリを作りこむのはムリ。

作る内容をもっとシンプルアイディア勝負なヤツに変えようとおもう。

[Ruby]3日目

http://anond.hatelabo.jp/20070918200857

2007-09-11

エロ動画ファイル名にタグを付けて管理している俺の話

洋物オンリーなんだ。すまない。

しかもyopzaとか海外エロ動画紹介サイト経由で落としたサンプル動画がほとんどなんだ。すまない。

本題に入ろう。

そのファイル名なんだが、例えば、

「AshleyLong01-se-ds.mpeg

という感じ。

解説すると、

  1. 女優名が分かる場合は最初に書く。分からない場合はフィーリング(足が細いからashihoso、とか)。
  2. 大抵サンプルは3動画くらいある。そのため、デフォルトファイル名としては、↑のファイル名のケツに01、02と連番を振ったものを使用する。
  3. 「-(ハイフン)」を頭に付けることでタグを表す。連番の後に追加していく。

そして肝心のタグだが、私は主にこのように管理している。

  1. 体位se=正常位、ba=バック、em=M字開脚で下からズコバコ など)
  2. 体系(mp=むちむちぷりんslスレンダー など)
  3. イベント3p3Pファ●ク、nd中田氏、sofa=ソファーでプレイ など)
  4. その他(zr=好きな男優のイニシャル、ks=これもイニシャル。近所のゲームショップの可愛いお姉さんに似ている)

など。合理的変態だろ?

余談だがそのzrという男優(おそらくイタリア人)はチ●ポが死ぬほどでかく、

彼の繰り出す容赦ないピストン運動はまさに圧巻の一言に尽きる。


・・・こうして、私の所持する400近いエロ動画にこれらのタグを付ける。

そしてタグで検索(win標準の検索)する。検索結果のファイルを全て選択し、

そのショートカットをあらかじめ作成したフォルダに作成。

こうして、フォルダse」には正常位でズコバコやってる動画のみが集まる。

他の検索でも同じようにショートカットを作る。

こうして種類ごとに別れたフォルダができるわけだ。

ショートカットでも縮小版が表示できる。似たようなエロ動画が集まった様を見るのは快感だ!

(もっと合理的に↑の一連のことが出来るソフトってないですかね・・)

ちなみに、サンプル動画自体は女優ごとにフォルダ分けしている。

女優名不明はまとめて専用のフォルダに保存。

これである程度は整理できるようになった。

増田のみなさん、私のように素敵なエロ動画ライフを満喫しませんか?

2007-09-05

Re: Web2.0系サイトのサーバシグニチャの設定を調べてみた

重要なのは、シグニチャを見るのが人間ではないって点だろう。

通常、自動化されたスキャナにより抽出する。したがって、シグニチャを隠せば攻撃は防げる。

たしかに、人力スキャンでは防げないが、人力スキャンは数が少ないので確立が低い。

ちょうど、winよりmac感染しにくいのと同じだ。

2007-09-02

あまり知られていないTips[Win]

フォルダを「詳細表示」で開いてる時に、Ctrl+プラステンキーの"+")を押してみろ。

ヘッダーバーの列が最適化されるんだ。地味に便利だぞ。

2007-09-01

http://anond.hatelabo.jp/20070901013918

懐かしい匂いがするね。

iisやActiveDirectoryで戦ってた日々がなつかしい。

Winの世界でjavapythonなんかがバカにされるのはしかたがないこと。

クライアントの殆どがwindowsで動いてるネットワーク

unixサーバを乗っけてネットワーク管理しようとしてもやくにたたないもの。

unixサーバなんて出入口だけでいい。

LAN内のぶら下がりクライアントlinuxで動くようになれば話しは違うだろうが、

これだけ追い風があっても一般企業でのlinuxシェアが増えないことを考えると、

LLってコンシューマー以外ビジネスの目はないよな。

しいて言うなら、BtoGの分野をLLな人達に今開拓しといてやるから、しばらくまっとけ。

んー。

いまからプログラムとかを仕事にしようとしている人は、

言語プラットフォームはなんでもいいからDB系に強くなっておけ。

仕事でやるならDBを噛まない仕事はない。

逆にそこだけしっかりわかってりゃ他はなんの言語つかっても一緒だ。

2007-08-11

http://headlines.yahoo.co.jp/hl?a=20070811-00000907-san-bus_all

WIN携帯いまいちだった感は否めないけど、基本的には使いやすい(ユーザビリティ面で)携帯作ってたと思った。

2007-08-10

マークアップエンジニアの終焉/Web製作

id:amachangCSS Niteでなんか言われて怒った(そのときの状況とか、そもそも何を言われたのかはちゃんと知らない)

中略

第?次 デザイナー vs. プログラマー戦争勃発

中略

デザイナーのターン! パス

プログラマーのターン! 時間を5つ墓地に捨て、飲み会発動! 「マークアップエンジニアって何?」

デザイナーのターン! パス

プログラマーのターン! malaカードオープン! 「マークアップエンジニアが刺身にタンポポ乗せる仕事と区別つきません

ずっとプログラマのターン! ←いまここ

 

といった理解しかしてないので、デザイナーの人の意見をいろいろ見てみたいと思った。CSS Niteとその周辺には興味ないです。

 

とりあえずWeb製作業界顧客レベルが呆れるほど低いのがすべての元凶なんだなと思った。各ブラウザ(たまにMac IEも含む)での表示はもちろん1pxたりともズレてはいけないし、場合によっては印刷すらどうにかしろと言うらしい(俺「フリーソフトか最悪PrintScreen+MS Paint使えよ。馬鹿じゃねえの」友人「馬鹿じゃなくて無知なんだよ……」俺「Alt+PrintScreen,Win+R,mspaint Enter,Ctrl+V,Ctrl+Sだよ」友人「わざと言ってるよね」)。この実例は聞いたことないけど、marqueeなんて使ったら顧客大喜びしそうだ。10年ほど前の個人サイトブーム初期を脳内リストアするといいのかもしれない。低度のテクノロジーでも素人には魔法と区別が付かない。魔法は派手なほうがいい。

まあ、Web製作なんてのがそういった初心者を食うビジネスなのでこれは宿命といえど、そんな無様な作業して金もらうくらいならとっとと廃業しろよ、って意見には賛同する。そこに需要がある限り商売を開始する人間が居るので、根絶が無理なのはわかってるけどね。

刺身タンポポ乗せるのと比べてどうかは知らないし、マークアップエンジニアが何を指すのかもよくわからないけど、少なくともすごいことはしていない。Web製作なんてのは、幸か不幸か残念ながらまったくもってすごくない。

「この顧客サイト、n日で全部作り上げました!」といったタイムアタック的要素や、「この顧客サイトソース、この前会ったW3Cの人に絶賛されました!」といったハイスコア的要素をもってして「すごい」というのは、まあ、その、あれだ。すごいですね。そもそもの仕事がすごくないので、付加的な部分を追求して少しでも充実感を得ようとするのは人間として仕方ないと思う。ブログでも、「こんだけの人数にはてなブックマークされました!」とか、よくあるよね。プログラマでも、クソつまらない仕事をやらされ続けたら、何をするプログラムかは二の次にして、コードのエレガントさやら設計やらを自慢し始めると思う。

プログラマというのは問題を解決する人々で、問題を解決するのが使命だ。問題ですらないただのマッチ棒パズル知恵の輪ばっかやらされたって仕方ない。マークアップエンジニアは、俺にも出来るようなことをやってるのなら興味ないし、先述のようなハイスコアを競う職種ならなおさら興味ない。デザイナーの使命が何かはよく知らないけど、本道を踏み外したり忘れたり見て見ぬふりしたりはしないようにお願いしたい。個人的には、俺が不得手とするデザインデザイナーは素晴らしく成し遂げるってだけで尊敬に値するので(そんなデザイナーが実在するかはともかく)、Web製作なんて毒でスポイルされるのを見るのは忍びない。

じゃあどうしたらいいんだよってのは、知ったこっちゃないけどな。

2007-08-01

http://anond.hatelabo.jp/20070801021140

iTunesiPhotoファイルを保存している場所を認識している人がどれだけいるのだろう。

winの「マイドキュメント」と同じく、システム内にあるユーザー名のフォルダの中にPicturesやらMusicやらがあるよ。

なにも変えてないならそこだろうが・・・

Mac5年使っている人間がそばにいるんだからそこを探してないはずもないか。

パソコンなんて何だろうと「これなら安心」というものはないのに、Macにどんな幻想を抱いてるんだろう。

OS9だって爆弾は出たし、Winだって熱暴走する。

それは使い勝手とは別の話。

2007-07-24

http://anond.hatelabo.jp/20070723092409

WinMac両刀使いだが、メッセージのセンスとして見るとMacのほうが面白かったりする。

ディスクの容量が少なくなると...

「お使いの起動ディスクはほとんど一杯です」

差し迫ったところにも笑いを忘れない翻訳者が好き。

他にあったらよろしく。

2007-07-23

http://anond.hatelabo.jp/20070723003333

新しく既製のWindows PC買うんでなければVista不要だしね。

別にVistaでしか出来ない重大なことがあるわけでもなく(Vistaで使えなくなったサードパーティアプリは多いけれどね)、劇的にユーザビリティが向上したわけでも画質が向上したわけでもないのに無駄に重くなり(意味の無いごてごてしさはXPの五割増しだけどね)、DRMだの何だのの向こうの都合のために変な制限が増え、そして高い(Leopardは全て「Ultimate」なのにね。UltimateどころかShorthornとLonghornの差って気もするけど)。

もうこうなってくると、XPから換える理由など何一つ無いし、過去の遺産捨てるのと商用ゲームしないの覚悟ならデスクトップでもLinuxの方が上に思えてくる。取っ付きにくいけれどめっさ安定してるしねLinux最近はかなり美麗だし、OSSも優秀なものが揃ってきてるしね。つかVistaパフォーマンスやらユーザビリティやら無視で外面ばかりMacの尻追っかけてるみたいな感じで、2kとXPとの比較とかしたことのある人、WinだけでなくMacLinuxにも触れたことある人なら、Vistaはこれまでで最も魅力のないバージョンの一つに数え上げること請け合いだと思う。

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-07-11

gtkmmのチュートリアルを訳してみた(半分ほど)

http://book.geocities.jp/gtkmm_ja/docs/tutorial/html/index.html

Gtk+C++バインディングチュートリアルを訳してみた。まだ、全部じゃないけど。

まあ、最初だけあれば、あとは本家の英語にあたれば十分だしね。残りはまた今度やります。

無料Visual Studio 2005 EEでgtkmmを使うところは結構、役に立つ人多いんじゃないかな。まあ、Winで使うとわりかしもっさりしてるんだけどね。

そいじゃ。

2007-06-27

Safari

MacWinSafariを使い比べてみたけれど、フォントって大事だねってことがわかった。同じSafariでも、Mac版のほうが表示が綺麗だわ。

あと、Winユーザアンチエイリアスがかかったフォントを毛嫌いする理由もわかった。Macアンチエイリアスと比べるとWinアンチエイリアスは文字がにじんで凄く読みにくい。どうやらWinではSafari最大の武器であるPDFのように綺麗な表示が生かされなさそうだから、IEFirefoxシェアを奪うのは苦労するだろうなぁ。

2007-06-22

http://anond.hatelabo.jp/20070622182612

まぁ悲しいといえば悲しいけど、個人で使われるようなUnix系の大半はフリーだしね。

ゲームを楽しむ層が取り込めないと開発に影響が出るWinMacと違って、そういう層以外にうけてるOSって事でいいかと。

もちろんゲームも楽しめるようなOSならもっとユーザー層が広がるし、技術的な壁は無いってのは同意だから是非そうなって欲しいとは思うけど。

UnixOS専用の物凄い面白いゲームとか出てゲームユーザー層を取り込めば需要も増えるだろうし、そうなれば作る側もその気になるかもしれないね。

と、思った所で、winとかへの移植が簡単そうだなぁと思ってゲーム層の取り込みはちょっと難しそうな気がした。

2007-06-12

http://anond.hatelabo.jp/20070612172039

Winなら、ムービーメーカーがお手軽じゃね?

こんなソフトWindowsに入ってるの知らなかった・・・

編集できるんじゃん。

あ、ちょっと試してみようー。

http://anond.hatelabo.jp/20070612172039

うわ! つかったことなかったよ。

winフォルダのなかをまじまじ探してしまった。

ゆーりーどやら、なんか知らんフリーソフトをてんこ盛りインストールしないとできないんだとおもってた。

2007-06-10

[][][]Ubuntuインストールしてみた。

[Linux][日記]Ubuntuインストールしてみた。

ちょっと前に大学麻疹休講だったので前から気になっていた&最近Windows重いよバカーってことでLinuxインストールしてみました。

選んだディストリビューション最近話題のUbuntu Linux

インストール手順は WinXPとUbuntuのデュアルブート まったり東京+を見ると幸せになれるはずです。

今回はそれに自分が困ったところを補足。

Ubuntuイメージファイルダウンロード

まずはUbuntuサイト

日本語ローカライズ版Desktop CDのダウンロード | Ubuntu Japanese Team

から必要なisoファイルダウンロード

バージョンによってサポートされている期間が違うので好きな方を選んでください。

isoファイルダウンロードしたら、それをCD-Rに焼きます。isoファイルを焼けるソフトを持っていない方は

かんべ(Windows95/98/Me / ユーティリティ)から「かんべ」というソフトダウンロードしてください。

このソフトを使用することでisoファイルCD-Rに焼くことができます。

UbuntuCD-Rから起動してみる

焼くことができたらまずは試しに焼いたCD-Rを入れたままパソコン再起動してみてください。すると今まで見たこと無い画面が出てきたと思います。

そこでUbuntuの起動とインストールを選択。するとCDをがりがり読み込んで起動してくれます。

しばらくすると起動するはずです。これでUbuntuが起動できました。でも、これだと毎回CDが必要&デスクトップに保存しても電源を切るとアウトなのであくまでもお試しor他人のPCを借りているなどの状況に限られるかと思います。それでも、起動してすぐにOpenOfficeFirefoxメッセンジャーメールクライアントが入っているので大体の作業ってかほとんどの作業ができます。

ちなみに、インターネットはこのままでもLANケーブルが刺さっていればできると思います。無線は、画面上部のシステムシステム管理>ネットワークからできます。設定方法は「無線LAN接続」を選択して右のプロパティ(P)をクリック。そこで、無線LANアクセスポイントとWEPキーを入力(WEPキーはパスワードみたいな物で、それを設定していない人はもちろん入れなくてかまいません。)

Ubuntuインストール

まぁ、これを使ってUbuntuいいんじゃね?インストールしてみようかな・・・とか思ったらインストールをどうぞ。

ただし、以下のことに気を付けてください。

インストール前に必ずPCリカバリディスクを作成しておく。

最近パソコンは購入時の状態に戻すプログラムパソコンに内蔵されていますが、万が一の際はそのプログラムが作動しないことがあります。特に、Ubuntu Linuxインストールする際など、システムに手を入れる場合はなおさらです(これはUbuntuLinuxに限ったことではありませんが。)。なので、PCリカバリディスクを必ず作成してから以下の作業に取りかかってください。

リカバリディスクの作成方法はソニーVAIO typeGの場合、スタート>全てのプログラムVAIOリカバリユーティリティーを実行してください。

後はそのプログラムの流れに沿ってリカバリディスクを作成してください。

LinuxWindows xp標準のファイルシステム(コンピュータデータを記録する方法)であるNTFSで書き込むことができない

タイトルのまんまです。つまり、今使っているパソコンハードディスクWindowsでは書き込みができるけど、新しく入れようとしているUbuntuでは書き込みができないのです。つまり、Ubuntuに入っているワープロソフトで保存しても記録できないのです。また、Ubuntuで書き込みができるファイルシステムにしても今度はWindowsでは標準ではそのファイルシステムで読み書きができないという問題が発生します。

FAT32でならWindowsでもUbuntuでも読み書きできる

これを解決するのが、WindowsLinuxどちらでも読み書きできるようにするファイルシステムを使うって手です。んで、そのファイルシステム音楽やMy Documentsをおけば良いって話です。

NTFSからFAT32にファイルシステムを変更する

・・・することはファイルを全部消さずにはできません・・・。なので、今使われている領域を一部まっさらにして、そこをNTFSからFAT32にします。

なので、必要なデータをなんらかの方法でバックアップしてください。外付けHDDを買ってそこにまとめてコピーが理想的。

ファイルバックアップしたら、まずデフラグをします。デフラグとは、HDDの中を整理することです。例えると本棚の中にある本がバラバラだったのを巻数順に並べてとりやすくするって感じです。

ちなみに、このデフラグがきちんとできていないと大変まずいことになります。下手するとWindowsが起動しなくなります。僕はこれをする前にPCリカバリ(買ったときの状態にデータを戻す作業)をしたのであまり心配ではありませんでした。まぁ、参照元BlogではきちんとデフラグすればOKみたいなことは書いてありましたが。

ファイルシステムを実際に変更する。

ここからはわたしのVAIO(Vaio type G VGN-G1KAP)を例に説明します。このパソコンにはHDDドライブは1つしか付いていないので、その中で

(PCリカバリ領域)

Windows xpシステム用(NTFS)

Ubuntu Linuxシステム(ext3)

Ubuntu Linuxスワップ(swap)

WindowsUbuntuの共有ドライブ(FAT32)

という風に分割して使用します。なお、PCリカバリ領域はリカバリディスクを作成した方は削除してもかまいませんが、リカバリの早さを考えるとHDD上にある方が便利&リカバリディスク持っていない出先でも直せる可能性があるなどというメリットもあるので僕は消していません。まぁ、お好きにどうぞ。

さて、そのようにしたいのですが、わたしのパソコンは、

(PCリカバリ領域)

Windows xpシステム用(NTFS)

Windows xpデータ用(NTFS)

で既に場所が埋まっているので、それを変更します。具体的には、Windows xpデータ用の部分をまっさらにして、それで空いた部分に

Ubuntu Linuxシステム(ext3)

Ubuntu Linuxスワップ(swap)

WindowsUbuntuの共有ドライブ(FAT32)

を割り当てるわけです。

割り当て方は、Ubuntu LinuxCDから起動したときに入っているプログラムであるG Partedを使用します。

G Partedは、画面上部のシステムシステム>設定かシステム管理のどちらかの中。あれ・・・、名前違ったっけ・・・とにかくパーティーションとか書いてあったらそれを起動。

パーティーションをいじってください・・・。

あ、でもおそらくその画面を見てもさっぱりだと思うので解説しておきます。(本当はこの部分だけBlogに書こうと思ってた。)

Linuxパーティーションの概念。つーかパーティーションの説明

言葉の説明はe-wordsでも見てもらえばいいので割愛。

で、いいたいのは、sda1 とか何かってことです。

sd  a 1

┃ ┃ ┗1番目の分割部分

┃ ┗1番目のハードディスクドライブ

sdならSCSI接続hdならIDE接続となるが、今回のようにHDDが一つしか付いていない場合は気にしないで良い。

そして、1などの分割部分なのですが、これがまた厄介です。

分割の方法には、いくつかありますが、今回のように5つ以上に分割するときは、

┏━━━┳━━━┳━━━┳━━━━━━━━━━━━━━━━┓
┃   ┃   ┃   ┃hda3                      ┃
┃      ┃      ┃      ┃┏━━━━━━━┓┏━━━━━┓┃
┃ hda1 ┃ hda2 ┃ hda4 ┃┃hda5      ┃┃hda6    ┃┃
┃   ┃   ┃   ┃┃        ┃┃     ┃┃
┃リカ ┃Win xp┃ 共有 ┃┃ /  Linuxの  ┃┃スワップ ┃┃
┃ バリ┃   ┃   ┃┃インストール先┃┃     ┃┃
┃ NTFS ┃ NTFS ┃FAT 32┃┃   ext3   ┃┃  swap  ┃┃
┃   ┃   ┃   ┃┗━━━━━━━┛┗━━━━━┛┃
┗━━━┻━━━┻━━━┻━━━━━━━━━━━━━━━━┛

としないといけません。なんか入れ子状になっていますが。入れ子状を使わずに仕切りを入れられるのは4分割までという決まりがあるためです。

なので、5つ作りたいときは分割しましょう。

とりあえず疲れたからひとまず終了・・・だれか代わりに続き書いて・・。

Linux感動したから少しでも多くの人に感動してもらいたいって気持ちで書いた。

わたしは参考にしてインストールしただけなのでほぼそのままです。

http://mtokyo.blog9.fc2.com/tb.php/90-5efd25ea

2007-05-29

悩むより作ってみるのも吉

恐らくwin使いだろうし、win2k or winXP辺りだと思うので、JavaVC辺りで作るといいと思う。

言語間の壁はそれほど厚くもないので、駄目なら言語移植すれば言いだけの話。

初めてのゲームという事で、根本的な構造が把握できずに理解し辛いんだと思う。

作ってきたサンプルプログラムは「こうしたらこうなる」みたいな1動作1画面的な物が多いけど、

ゲームは基本的に何かあるごとに別画面。言ってみれば別のプログラムみたいな感じ。

1.ベース部分に現在どんな画面(タイトルゲーム本体、ゲームオーバー画面など)を表示しているかの振り分け処理を置く。この処理がゲーム中ずっと2と3の処理を呼び出し続ける。(2で終了処理をするか、ウインドウを閉じたら終了)

2.それぞれの画面内の動作(タイトルならモードセレクト、本体ならブロックを動かす処理など)を処理する関数に飛ばして処理。

3.それぞれの画面の表示処理(タイトルなら背景とモードの一覧とカーソル)を行う。

とにかく、ユーザからの処理を待っている間も常にプログラムが動きつづけていると言う感覚を理解しないと、ゲームプログラムは理解し辛い。

ゲームの基本構造がわかるサンプル(1000行以下位)をまずどこかから持ってきて、印刷して全部読む。

で、まずはタイトルとそこでスタートを押すと、キャラが動くだけのプログラムとかを作ってみるといいと思う。

目標は高くていいけど、作るのは段階的に進めた方が、勉強しながら進められるからいいよ。

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