はてぶホッテントリーダーをはてなブラックスターに対応してみた

id:Hamachiya2 さんが作られた「はてなブラックスター」/ はてなブラックスターが変わります! - ぼくはまちちゃん!(Hatena) これを Hatebu HotentReader(はてぶホッテントリーダー) のブックマークコメントでも表示できるようにしてみました。 最初、ブラックスターの実装ははてなスターとは全く別のサービスで構築されたのかと勝手に思っていたんですが、そうではなくスター対象の URI に 「_HatenaBlackStar」を追加する方法で行っていることがわかりました。ということでこれなら簡単に実装を追加できそうなので対応してみました。コメントとブラックスターが区別できるように色などのスタイルの仕様も変えています。 Greasemonkey 等による対応ではないので、アドオン不要です。もちろん IE からでも見られます。

2008年7月7日 · Toshimitsu Takahashi

Microsoft Remote Desktop Connection Client for Mac 2 がリリースされている

http://www.microsoft.com/mac/products/remote-desktop/default.mspx ダウンロードは http://www.microsoft.com/mac/downloads.mspx?pid=Mactopia_RDC&fid=803F9438-8DF3-490F-92C6-0E0F92787DB8 から。 新機能については Microsoft Office for Mac | Office For Mac を参照。 ※ mactopiaのサイトかっこいいなぁ

2008年7月5日 · Toshimitsu Takahashi

Linux がインストールされている PC に Windows を上書きインストールするときの注意

普通に Windows XP のインストール CD 入れて起動したら、Hardware Inspecting みたいなテキストが出た後、ディスプレイが真っ黒状態になってしまった。 どうも Linux のパーティションを予め消しておかなければならないらしい。 一旦、Cent OS を再び起動して root でログインし、 # fdisk /dev/hda で fdisk からパーティションを削除して(d > 1 でOK)、やり直したら進んだ。最初、CD-ROM ドライブが逝ったかと思った。 ネットが無い(複数コンピュータがない)状態で OS インストールするのはかなり危険だと改めて実感した。

2008年7月5日 · Toshimitsu Takahashi

Mac OS X から Windows Vista の共有フォルダに接続するには

Windows Vista で共有フォルダを設定する エクスプローラで共有したいフォルダを右クリック。 コンテキストメニューから[共有(H)…]をクリック。 [共有(H)]ボタンをクリック。 そのまま続けてウィザードを終了する。 Mac OS X から接続 Finder を開く。 メニューの [移動] → [サーバへ接続…] を選択する。 Windows で共有フォルダのパスが「\\winhost\Temp」であるときに [サーバアドレス:]に「cifs://winhost/Temp」と入力する。 [接続]ボタンをクリック。 ダイアログでユーザの種類: 登録ユーザを選択する。 [名前:]と[パスワード:]に Windows のユーザアカウントの[アカウント名]と[パスワード]をそれぞれ入力する。 [接続]ボタンをクリック。 ※ Windows 側で Everyone を追加するだけでは、Mac 側からゲストで接続できなかった。パスワード保護共有を無効にしないといけないのかもしれない。

2008年7月4日 · Toshimitsu Takahashi

Google AdSense の紹介プログラムが終了へ

今日、上記の件でメールが来ていました。また、Inside Adsense でも Inside AdSense : AdSense紹介プログラム終了に関する重要なお知らせ として記事が掲載されています。 この手のサービスは Firefox と Google パックのインストールの広告をよく目にしていました。成約報酬型プログラムからは撤退することにしたのでしょうか。 紹介プログラムに関するすべてのレポートは10月以降消去するとのことらしいです。Google がデータを削除するというのが意外でした。具体的に成約した広告主を特定する情報はレポートにないと思うので、プログラムが終了するといっても早々に消去する必要があるとは思えません。 ということは、その時期に Google Adsense に何かしらの変更があるのでしょうか。

2008年7月1日 · Toshimitsu Takahashi

Eclipse(Ganymede) に Subversion プラグイン Subversive をインストールする

今まで Eclipse の Subversion プラグインは Subsclipse を使っていた。 だが、現在 Eclipse Foundation に公認された Subversive を使う方が良さそうだ。 Eclipse Subversive - Subversion (SVN) Team Provider Eclipse のソフトウエアアップデートからインストールする手順は下記のとおり メニュー Help → Software Updates… を選択 [Available Software] をクリック [type filter text] テキストボックスに「subversive」と入力 表示されたプラグイン Subversive Integration for the Mylyn Project を選択 [type filter text] テキストボックスに「svn」と入力 表示されたプラグイン SVN Team Provider を選択 ダイアログに従ってインストール 上記だけではリポジトリに接続するコネクタが入らなかった。下記も必要。 メニュー Help → Software Updates… を選択 [Available Software] をクリック [Add Site]をクリック、URL に http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/ を入力して追加。 表示されたプラグイン Subversive Integration for the Mylyn Project を選択 [type filter text] テキストボックスに「svn」と入力 表示されたプラグイン Subversive SVN Connectors, SVNKit を選択 ダイアログに従ってインストール

2008年6月27日 · Toshimitsu Takahashi

Eclipse 3.4 Ganymede リリース

Macbook Air に Eclipse 入れようと http://www.eclipse.org/ に行ってみたら、新バージョンがリリースされていた。 全然知らなかったと思って調べたところ、 http://journal.mycom.co.jp/news/2008/06/27/002/index.html とタイムリーな話題だったらしい。 ちなみにコードネーム Ganymede (「ガニメデ」と読む)は、木星の衛星に由来するみたいです。

2008年6月27日 · Toshimitsu Takahashi

モバイルサイト用のヘッダ出力を Python で書いてみた

モバイルサイトを3キャリアでほぼ共通化して作りたい - http://d.hatena.ne.jp/tilfin/20080530/1212376626 上記のエントリで DoCoMo, au, SoftBank 用のモバイルサイトを XHTML で作成する場合のそれぞれの書き方を調べた。 その書き方に従って HTTP ヘッダと XHTML 宣言部分を出力する CGI サンプルを Python で書いてみた。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #!/usr/bin/env python \# -*- coding: utf-8 -*- import os import codecs class UserAgent: def \_\_init\_\_(self, ua): if ua.startswith("DoCoMo"): self.kind = 1 elif ua.startswith("KDDI"): self.kind = 2 elif ua.startswith("SoftBank") or ua.startswith("Vodafone") or ua.startswith("MOT"): self.kind = 3 else: self.kind = 0 def is_mobile(self): return self.kind > 0 def is_docomo(self): return self.kind == 1 def is_au(self): return self.kind == 2 def is_softbank(self): return self.kind == 3 def get\_content\_type(self): if self.kind > 0: return "Content-Type:application/xhtml+xml; charset=Shift_JIS" else: return "Content-Type:text/html; charset=UTF-8" def get_declare(self): if self.kind == 1: return """<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.0) 1.0//EN" "i-xhtml\_4ja\_10.dtd">""" elif self.kind == 2: return """<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN" "http://www.openwave.com/DTD/xhtml-basic.dtd">""" elif self.kind == 3: return """<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//J-PHONE//DTD XHTML Basic 1.0 Plus//EN" "xhtml-basic10-plus.dtd">""" else: return """<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">""" agent = UserAgent(os.environ.get("HTTP\_USER\_AGENT", "N/A")) print agent.get\_content\_type() + "\\r\\n\\r\\n" + agent.get_declare() print '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">' print "<body>" file = "content.html" if agent.is_mobile(): f = codecs.open(file, "r", "utf-8") s = f.read() print s.encode('cp932') f.close() else: f = open(file, "r") print f.read() f.close() print "</body></html>" クラス UserAgent のコンストラクタには、クライアントのユーザーエージェント値を渡す。文字エンコーディングは、モバイルでは Shift_JIS 、通常は UTF-8 とした。 サンプルの最後のところで body 内のコンテンツを別ファイルから読み込んで書き出している。Shift_JIS へのエンコーディングを shift_jis と指定したところエラーになり、cp932 としたら成功した(この件については後で調べてみることにする)。 get_content_type() で Content-Type 部分が取れる。ケータイ以外のときが、Content-Type:text/html; となっているのは IE では MIME Type 判別がうまくいかないためか、ファイルのダウンロードしよう(保存するかどうかのダイアログが阿上がった)とするのでこうした。get_declare() ではそれぞれのキャリアに対応した XHTML 宣言部を返す。

2008年6月26日 · Toshimitsu Takahashi

jQuery の $(selector, context) な書き方は context.find(selector) を使うべきだった件について

先日、404 Not Found に参加しました。 #1 は未参加だったので、 jQuery.fn.init() について後から読んでいたのですが、あまり Travesing API を見ていなかったので、あるノード以下から選択するときは、 $(".classname", context) みたいに書いてました。 jquery-1.2.6.js / Line 73 - 76 // HANDLE: $(expr, \[context\]) // (which is just equivalent to: $(content).find(expr) } else return jQuery( context ).find( selector ); とあるとおり完全にオーバーヘッドでした。 上記の抜粋部分に辿りつくには、正義表現で expr を解析するステップ(下記の部分)が発生していて、find 呼び出しのブロックに流れるとその結果を捨てています。この解析では expr が生成用の HTML 文字列もしくは ID セレクトかを判別しているからです。どちらでもない場合は、find となります。よって $("#id", context) というセレクタが ID 指定の場合には今回の話は当てはまりません。 jquery-1.2.6.js / Line 47 - 50 // Are we dealing with HTML string or an ID? var match = quickExpr.exec( selector ); // Verify a match, and that no context was specified for #id if ( match && (match\[1\] || !context) ) { 最初に『あるエレメント下のものを対象にしたい』と調べていたら、まず jQuery( expression, [context] )に辿りついたので、何も考えずにこの書き方をしてました。これからは context.find(selector) を使うようにします。 ...

2008年6月19日 · Toshimitsu Takahashi

jQuery UI の Dialog を使って確認用モーダルダイアログを実装するには

jQuery UI (http://ui.jquery.com/) には便利なコンポーネントがある。このダイアログを使ってユーザーへの確認に使うモーダルダイアログを作りたい。 設定仕様に幅がある分、わかりずらいところがある。ということで下記のように手軽に使える用に関数を作ってみた。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 /* * 確認ダイアログ * * message : ダイアログのメッセージ本文 * title : ダイアログのタイトル * buttonok : OKボタンのテキスト * buttoncancel : キャンセルボタンのテキスト * response : コールバック関数を指定する。引数 cancel にボタン選択の結果が入る。 * OK ならば false キャンセルならば true となる。 */ function confirmDialog(message, title, buttonok, buttoncancel, response){ var _dlg = $('<div>'+message+'</div>'); var _buttons = {}; _buttons[buttonok] = function(){$(this).dialog('close');response(false)}; _buttons[buttoncancel] = function(){$(this).dialog('close');response(true)}; _dlg.dialog({ modal:true, draggable:false, title:title, height:130, width:320, buttons:_buttons, overlay:{ opacity:0.3, background:'#225B7F' } }); } /* Sample */ confirmDialog('この処理を続行しますか?', '確認', 'OK', 'キャンセル', function(cancel){ if (cancel) return; /*------------ 処理を書く ------------*/ }); ダイアログのベースとなる div は Document DOM ツリーに存在していなくてもいいので生成して、dialog() を呼び出すだけで動く。これは便利だ。dialog の引数で様々な設定が可能である。上記の例では見た目を一つのアプリで統一するので幅、高さなど固定で定義している。あとは modal 化と背景がクリックできないことを明示するために overlay を設定している。 ちょっとわかりづらいのは、buttons で表示ボタンがという設定できるのだが、ボタンのラベル値がキーであり、対となる値が選択時に走る関数の定義となるところだ。定義の例では、ボタン名としてキーを変数値にしたいために map[key] = func としてセットしている。

2008年6月16日 · Toshimitsu Takahashi