Introduction

ブログ内検索

  • このサイトの記事を検索 by Google

おすすめの一冊!

無料ブログはココログ

« 2010年4月 | トップページ | 2010年6月 »

2010年5月

2010-05-19

KlogShow を完全透過に


昨日、UTF8 対応に改造した KlowShow ですが、
背景の 100% 透過ができないのがおしいかんじ。
(透明度を 0% にすると文字も読めなくなる)

というわけで、透明度を 0% に設定したときに
背景のみ完全透過(文字は 100% 不透明でくっきり)
になるように、ちょろっと改造してみました。


  ⇒ Download  ※ 55MB あります


このアーカイブファイルを展開してできたファイルを全部
C:\Program Files\klogshow\ に置けば OK です(上書きコピー)。

Configure メニューで「Opacity」を "0" にしない限り、オリジナルと変わりません。
「Opacity」を "0" にすると、背景が消えて、文字だけ浮いた状態になります。
ちなみに、この状態ではウインドウの移動ができないので、移動したいときは
Opacity を 50% とかにして移動させてください。


以下、詳細。

====================

mainWindow.cpp を改造します。

% diff ../../org/src/mainWindow.cpp .
150c150,155
< 	setWindowOpacity ( ( double ) ( settings.value ( "opacity", DEFAULT_OPACITY ).toInt() ) / 100 );
---
> 	const int opacity = settings.value ( "opacity", DEFAULT_OPACITY ).toInt();
> 	if (opacity > 0) {
> 		setWindowOpacity ( (double)opacity / 100 );
>     }
> 	this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint);
> 	this->setAttribute(Qt::WA_TranslucentBackground, true);
166c171,176
< 	palette.setColor ( QPalette::Window, colorBaseDefault );
---
> 	if (opacity > 0) {
> 		palette.setColor ( QPalette::Window, colorBaseDefault );
> 	} else {
> 		colorBaseDefault.setAlphaF((double)opacity/100);
> 		palette.setColor ( this->backgroundRole(), colorBaseDefault );
> 	}
265c275
< 	pal.setBrush ( QPalette::Window, QBrush ( gradient ) );
---
> //	pal.setBrush ( QPalette::Window, QBrush ( gradient ) );
% 
% vi Makefile.Release
% 
% mingw32-make release
% 
% mingw32-make release-install
% 
Makefile.Release はちょっと手直ししないと動きません。 "-lQtGui4 -lQtCore4" を "-lQtGuid4 -lQtCored4" に変えたりとか。 そうしないと make に成功しても実行時にエラーになっちゃいます。 あと、"release-install" で以下のファイルもコピーしてあげる必要があります。
c:\Qt\2010.02.1\qt\bin\QtCored4.dll
c:\Qt\2010.02.1\qt\bin\QtGuid4.dll
c:\Qt\2010.02.1\qt\bin\libgcc_s_dw2-1.dll
==================== とりあえず Seaoak の環境で動いているだけなので、 うまく動かなかったらあきらめてください・・・。 もちろん無保証です。あしからず。

xyzzy で XML を解析


TL を眺めていたら、xyzzy で XML を処理しようとしているひとがいたので、
前に自分の書いたコードを発掘してきました。

xml-parser-modoki というライブラリを使います。

  ⇒ http://www7a.biglobe.ne.jp/~hat/xyzzy/dl.html#xml-parser-modoki

アーカイブに含まれている xml-parse-modoki.l を site-lisp/ の下に置いて、
バイトコンパイルしておきます(念のため)。

あとは、以下のようなコードで利用できます。

(defun xmlpm-parse-with-input-buffer (target)
  (save-excursion
    (switch-to-buffer target)
    (xmlpm-parse)))

(defun xmlpm-parse-string (s)
  (save-excursion
    (let ((tbuf (create-new-buffer "*xmlpm*")))
      (switch-to-buffer tbuf)
      (with-output-to-selected-buffer
        (format t "~A" s))
      (let ((result (xmlpm-parse)))
        (delete-buffer tbuf)
        result))))

;;====================

(defun www-get (url query)
  (let ((res (xhr-get url :query query)))
    (let ((status (xhr-status res)))
      (case status
        (200 (let ((xml (xhr-response-text res)))
               (output-to-buffer "*response*" xml) ; for debug
               (let ((lst (xmlpm-parse-string xml)))
                 (unless lst
                   (output-to-buffer "*xml*" xml)
                   (error "ERROR: invalid response for GET"))
                 lst)))
        (t   (error "ERROR: unexpected response"))))))


(labels ((rec (url user cursor acc)
           (let ((query (list :cursor cursor)))
             (when user
               (if (string-match "^[0-9]+$" user)
                   (setf query (nconc query (list :user_id user)))
                   (setf query (nconc query (list :screen_name user)))))
             (let ((lst (www-get url query)))
               (if (not lst)
                   nil
                   (let ((users (cddr (nth 2 (car lst))))
                         (next (third (nth 3 (car lst)))))
                     (if (equal next "0")
                         (nconc acc users)
                         (rec url user next (nconc acc users)))))))))
  (defun api-friends (&optional user)
    (let ((url (concat *base-url* "statuses/friends.xml")))
      (rec url user -1 nil)))
  (defun api-followers (&optional user)
    (let ((url (concat *base-url* "statuses/followers.xml")))
      (rec url user -1 nil))))
XML と S 式は親和性が高くて、リスト操作関数を使えば 各要素に簡単にアクセスできます。とっても便利。 ちなみに、上記コードは Twitter API を叩くプログラム (「いつふぉろ」のクローラ)の一部です。 今のクローラは Perl なんですけどねー

2010-05-18

KlogShow を日本語対応に


デスクトップにメモを貼り付けているのですが、付箋紙ソフトの使い勝手がイマイチ
(背景透過にしているのにメモを編集すると透過じゃなくなっちゃったりとか)
なので、いいソフトがないか探してみました。

で、「KlogShow」というソフトを発見。

    ⇒ デスクトップにテキストファイルの内容を表示する「Klogshow」  --  MOONGIFT

他の付箋ソフトと違ってテキスト編集に好きなエディタを使えるのが魅力的です。



しかし、インストールしてみたところ、日本語を含むファイルが表示できないことが判明。
Shift-JIS でも EUC-JP でも UTF-8 でも化けてしまいます。とっても残念。

そこで、ちょっとソースコードを見て改造してみたところ、
Unicode (UTF-8) を読み込めるようになっちゃいました♪

  ⇒ Download  ※ 60MB あります

手元で make してみたら追加の DLL が必要になってしまったので、
一緒に固めてあります。改造したソースファイルも (mainWindow.cpp)。

このアーカイブファイルを展開してできたファイルを全部
C:\Program Files\klogshow\ に置けば OK です(上書きコピー)。

たまたま動いただけなので、うまく動かなかったらあきらめてください
(この記事にコメントをいただければ調べるかも?)



以下、メモです。

====================
■ How to make

KlogShow 1.0.4 のソース一式をダウンロードして展開しておきます。

    http://sourceforge.net/projects/klogshow/
    http://sourceforge.jp/projects/sfnet_klogshow/

で、まず、MinGW をインストールします。

  ⇒ MinGW-5.1.6.exe をインストール

次に、Qt をインストールします。

  ⇒ http://qt.nokia.com/downloads-jp
    ※「Qt SDK for Windows のダウンロード」を選択

んで、Qt Command Prompt で make する。

C:\Temp\klogshow-1.0.4\src>qmake
C:\Temp\klogshow-1.0.4\src>mingw32-make debug
C:\Temp\klogshow-1.0.4\src>mingw32-make install
これで、C:\Program Files\klogshow\klogshow.exe ができるハズ。 ただし、これを実行しても DLL が無いと言われるので、 Qt のディレクトリからコピーしてあげる。
c:/Qt/2010.02.1/qt/bin/QtCored4.dll
c:/Qt/2010.02.1/qt/bin/libgcc_s_dw2-1.dll
c:/Qt/2010.02.1/qt/bin/QtGuid4.dll
以上で公式版と同じ動作をする klogshow.exe ができます。 ==================== ■ 改造 続けて、UTF-8 対応にします。 と言っても、1行追加して、1行書き換えるだけです。
% diff ../../org/src/mainWindows.cpp mainWindow.cpp
211d210
> 	QTextCodec * codec = QTextCodec::codecForName("UTF-8");
222c221
< 				temp.append ( buf );
---
> 				temp.append ( codec->toUnicode(buf) );
% 
変更したら上と同様に "make debug" して "make install" してあげれば OK。 これで、UTF-8 のテキストファイルを表示できる klogshow.exe ができます。 ==================== とりあえず Seaoak の手元の Windows XP SP3 では動いていますが、 もちろん無保証なので、動かなかったら試行錯誤してみてください。 Happy Hacking !

2010-05-13

「いつふぉろ」のクロスブラウザ化


「このひと、いつからフォローしてるんだっけ?」という疑問を解消してくれる
Twitter ユーザ向けサービス「いつふぉろ」を、本日更新しました。

これまで Firefox でしか使えなかったのですが、
Google Chrome と Opera でも使えるようになりました!


    ⇒ 最新バージョンを userscripts.org でインストール


技術的にはクロスドメイン通信をするのに GM 独自関数をやめて
先日の記事に書いた JSONP を使うようにしたものです。
サーバ側でも CGI で JSONP データを生成するようにしました。

クロスブラウザ対応になっただけでなく、JavaScript のコード自体が
かなりすっきりしました(もともとのコードが汚かっただけ???

Google Chrome と Opera をお使いのみなさま、
どうぞ「いつふぉろ」を使ってみてください!


  ⇒ 「いつふぉろ」ホームページ


そして、感想やアドバイスをいただけるとうれしいです。

この記事にコメントしていただくか、または Twitter 上で @seaoak2003 まで♪

ぐりもん for みゃくらったー

「みゃくらったー」へのリンクを自動的に埋め込むグリモンを作りました。

  ⇒ http://userscripts.org/scripts/show/76646


以下のページを開くと、「みゃくらったー」のアイコンを自動的に埋め込みます。

  ・Twitter の個別ツイートのページ
  ・ふぁぼったーのホームページ
  ・ふぁぼったーのユーザ検索結果のページ
  ・ふぁぼったーの個別ツイートのページ


  スクリーンショット


まぁ、「リンクをコピーして、みゃくらったーのページを開いて、
右上のフォームに URL を貼り付けて、エンターキーを押す」
という手順を省いてくれるだけのモノです。でも便利♪


いちおう、以下のブラウザで動作確認済みです。

  ・Firefox 3.5.9 + GreaseMonkey 0.8.20100408.6 
  ・Google Chrome 5.0.375.38 beta 
  ・Opera 10.53 
  ・Sleipnir 2.9.3 + SeaHorse 1.1.2 

  (いずれも Windows XP SP3 にて)


どうぞご利用くださいませ。

2010-05-12

デザインを変えてみました

このブログに Opera でアクセスすると表示がおかしくなる、
という問題に気がついたので、これを機会にデザインを一新しました。

新デザインのコンセプトは「シンプル&パステル」。

ついつい濃い見た目になってしまうのを抑えて、
できるだけ明るいイメージにしてみました。

いままでずっと3カラム(両サイドバー)のデザインだったので、
妙に右側がスカスカしてる感じもしますが、2カラムになったことで
長いコードを載せてもちゃんと読めるようになりましたw

ちなみに、画像の作成&加工には、フリーソフトの GIMP を使っています。
背景などは純粋に GIMP だけで作っています。とっても便利♪

とりあえず各ブラウザで表示を確認したので、たぶん表示が化けて
読めなくなることは無いと思うのですが、もしあればご連絡ください。
この記事にコメントいただくか、または Twitter 上で @seaoak2003 まで!

p.s. ココログのテンプレートは、JavaScript が OFF のときに
   余計な p 要素を生成してくれるみたいで、表示がズレました。
   いちおう対策しましたが、ホント、勘弁してほしいです・・・

2010-05-10

「みゃくらったー」を公開します


この GW をほぼぜんぶ費やして開発した Web サービス「みゃくらったー」を
本日公開することにしました。

    ⇒ 「みゃくらったー」ホームページ icon

    ※独自ドメインに移行しました(元のURLでもアクセスできます) (2010/May/15)


「みゃくらったー」は、Twitter ユーザ向けの新たな Web サービスです。

  ・任意のツイートの前後の文脈(みゃくらく)をたどることができます。
  ・前後のツイートを含めた画面へのパーマリンク(固定リンク)を提供します。


  スクリーンショット



一般に、ブログなどで Twitter 上の発言を引用したい場合、
Twitter のツイート単体のページ(⇒例)へのリンクが使われています。
しかし、このページでは単一の発言しか見られないため、
その発言の前後の話の流れを把握することができません。
結果として、もともとの発言の意図が正しく伝わらないことがままあります。

現在の Twitter の Web サイトでは、あるツイートの前後のツイートを
簡単にたどる方法が提供されていません(発言したユーザの最近のツイートは
プロフィールページで見られますが、過去の任意の時点を指定してさかのぼる
ことはできません)。前後のツイートを取得する User Script (ぐりもん)は
いくつか公開されているようですが、残念ながら IE ユーザには使えません。

というわけで、ツイートの ID や URL を指定すると、その前後のツイートを
好きなだけたどれる、という Web サービス「みゃくらったー」を作ってみました。

ついでに、前後のツイートを含めたカタチで引用したい、という需要を見込んで、
「現在の画面を再現できる URL」を提供するようにしました。




使い方は簡単で、ページの右上の入力欄に以下のいずれかを入力します。

  ・Twitter 上で個々のツイートを特定できる ID (Status ID) 

     例: 13491926416


  ・Twitter のツイート単体のページの URL

     例: http://twitter.com/seaoak2003/status/13491926416


  ・ふぁぼったーの発言単体のページの URL

     例: http://www.favotter.net/status.php?id=13234427165


入力してエンターキーを押すと、指定した発言がページ中央に表示されます。

発言の上にある「more newer tweet」というボタンを押すと、
直後の発言が表示されます。繰り返し押すと、押した回数だけ
いもづる式に発言がたどれます。

逆に、「more older tweet」というボタンを押すと、
指定した発言の直前の発言が表示されます。
繰り返し押せば、押した回数だけさかのぼれます。

「shrink」というボタンを押せば、好きなだけ巻き戻せます。

ボタンを押すたびに表示されるツイート列は変化しますが、
現時点での画面を再現させるための URL がページ右上にある
「URL for current view」というリンクです。
このリンクはボタンを押すたびに自動的に変化します。
ブログなどで発言を引用する際には、この URL を指定すれば OK です。

動作確認は以下のブラウザで行っています。

  ・Internet Explorer 7
  ・Sleipnir 2.9.3
  ・Firefox 3.5.9
  ・Google Chrome 5.0.375.29 beta
  ・Opera 10.53

  ※ すべて Windows XP SP3

CSS3 の機能 (text-shadow や box-shadow)を使っているので、
IE で見ると見た目がちょっとショボいですが、見逃してください(⇒例)。
ちなみに、Firefox/Chrome/Opera ではよりキレイに表示されます(⇒例)。

JavaScript で Twitter API を叩いているので、API を消費します。
OAuth (xAuth) 対応の Twitter クライアントまたは公式 Web サイトを
使っている人にはまず影響ないと思いますが、念のため。




ご意見、ご感想、ご要望、その他なんでもいただけるとうれしいです。

この記事にコメントしていただくか、Twitter 上で @seaoak2003 まで!

2010-05-06

Firefox の button の点線囲い

GW はあっというまに終わってしまいましたね。

趣味で「みゃくらったー」という Web サービスを作っているのですが、
時間の過ぎるのが早いこと早いこと。朝からプログラミングしていて
気がつけば日付が変わっていた、なんてことも・・・・




で、Web サイトを作成するのに普段は Google Chrome を愛用しているのですが、
気まぐれに Firefox で動作確認してみたところ、button 要素をクリックしたときに
点線囲いが表示されてしまって、ちょっとカッコ悪い・・・↓


    SS


さっそくググってみると、CSS で "outline: none" を指定すればよい、
という話がたくさんヒットしました。しかし、試してみると、効果ナシ・・・

さらにググってみると、Firefox 独自の妙な指定があることが判明。
試してみると点線囲いがあっさり消えてくれました♪


button::-moz-focus-inner {
	border-style:		none;
}
ちなみに、outline 指定は要らないみたいです。 こんな謎な指定が必要というのも、ちょっと困りますねー

2010-05-01

ぐりもんのクロスドメイン JSONP

GW の初日は、ぐりもん (UserScript) のコーディングを満喫しました♪

ふぁぼったーの censored をかいくぐるスクリプト「uncensored_favotter」で
懸案だったクロスブラウザ対応をついに実現しました!

    ⇒ ダウンロードはこちら

いままでは GreaseMonkey 独自関数 GM_XMLHttpRequest() を使っていたので
Firefox でしか動かなかったのですが、今日、うまい方法を思いついて、
Chrome/Opera でも動くようになったというわけです。

    ⇒ Opera での UserScript の使い方は Opera wiki を参照





思いついたアイディアは、スクリプト全体を function で wrap して、
それを丸ごと toString() して script タグに流し込む、というものです。

実際のコードで示すと、次の2行でスクリプト全体を囲むことになります。

(function(e){e.text='(function(){var f='+(function(){
}).toString()+';with(f){f()}})()';document.body.appendChild(e)})(document.createElement('script'));
こうすると、スクリプト全体が通常の window (unsafeWindow) のコンテキストで 動くようになるため、JSONP のコールバック関数から直接処理を戻すことが可能になります。 JSONP なら GM 独自関数を使う必要が無いので、Chrome/Opera でも動くようになります。 逆に言うと、GM_* 系の独自関数は使えなくなってしまいますが・・・。 (HTML5 の WebStorage を使えば独自関数はなくても大丈夫なことが多いかも?) まぁ、ざっくり言えば、クロスドメイン通信をする UserScript を作りたいとき、 サーバ側が JSONP に対応しているなら今回の方法を使う(Chrome/Opera でも動く)、 そうでないなら GM 独自関数でやる、というのがいいと思います。 今日わかったノウハウは以下の通り: ・JSONP のコールバック関数はグローバルに可視でなければならないが、  window オブジェクトのプロパティにしてあげれば OK。
function loadUrl(url, callback) {
	var fname = (function(s){do{var x=Math.floor(Math.random()*0x1fffffffffffff)}while(window[s+x]);return s+x})('hogehoge_callback');

	window[fname] = function(json){delete window[fname];callback(json)};

	if (url.indexOf('?') == -1) {
		url += '?';
	}
	if (url.indexOf('=') != -1) {
		url += '&';
	}
	url += 'callback=' + fname;

	var elem = document.createElement('script');
	elem.setAttribute('type', 'text/javascript');
	elem.setAttribute('src', url);
	document.body.appendChild(elem);
}
・script タグを動的に生成して文字列としてスクリプトを流し込むときは、  innerHTML 属性じゃなくて text 属性に代入する。innerHTML に代入すると  Opera が不等号記号に反応してしまって動作しないことがある。  これは UserScript に限らず、通常の JavaScript でも同様。 ・Opera で innerHTML を読むとタグ名が大文字になってるので注意。 今日のアイディアをひらめいたときは、思わず自分が天才じゃないかと 錯覚してしまいました。クロスブラウザ対応をこんなシンプルな方法で (ブラウザごとの分岐コード無しに)実現できて、すごくうれしいです♪ Chrome/Opera ユーザの皆さん、ぜひご利用ください!

« 2010年4月 | トップページ | 2010年6月 »