javascript:void(function(n){m=/profile_s\.gif$/;for(i=0;i<n.length;i++){if(m.test(n[i].src)){n[i].src='http://mattn.kaoriya.net/images/unk.gif'}}})(document.getElementsByTagName('img'))するんだ!
2008/03/31
タッパー
今すぐこのページで
あぶないコード
コンパイルは通るだろうけど、ちょっと本文から直してほしいですね。影響力のある場所でしかも「推薦する」なんてリンクが付いている状態で放置は間違いを広めてしまうよ。
てっきりUNIX版と同様、リンクすれば動くと思って色々試したけど、どうやらそうじゃないみたい。
mingw32ならば
あとmallocでなく
C/C++のポインタの機能--参照渡しのような処理 - builder by ZDNet Japanで、Electric Fenceの紹介につなげる記事にしようと思ったのですが
electric-fence-win32 - Google CodeElectric Fenceのwin32版なんてものを見つけてしまった。
てっきりUNIX版と同様、リンクすれば動くと思って色々試したけど、どうやらそうじゃないみたい。
//#include <efence.h>オーバーランを検知してくれなかった。README.win32によると
#include <stdio.h>
int main( void ) {
char *a = (char*)malloc(12);
a[ 0] = 'H';
a[ 1] = 'e';
a[ 2] = 'l';
a[ 3] = 'l';
a[ 4] = 'o';
a[ 5] = ',';
a[ 6] = ' ';
a[ 7] = 'W';
a[ 8] = 'o';
a[ 9] = 'r';
a[10] = 'l';
a[11] = 'd';
a[12] = '\0';
return 0;
}
と書いてありました。てっきりスタートアップルーチンを入れ替えてくれてくれる物かと思って少しだけ期待してしまいました。Since you need to modify your own project anyway, simply add efence.c, page-win32.c, and print.c to your project.
mingw32ならば
Index: Makefileこんな風に修正して
===================================================================
--- Makefile (revision 7)
+++ Makefile (working copy)
@@ -9,7 +9,7 @@
MAN_INSTALL_DIR= /usr/man/man3
PACKAGE_SOURCE= README libefence.3 Makefile efence.h \
- efence.c page.c print.c eftest.c tstheap.c CHANGES COPYING
+ efence.c page-win32.c print.c eftest.c tstheap.c CHANGES COPYING
# Un-comment the following if you are running HP/UX.
# CFLAGS= -Aa -g -D_HPUX_SOURCE -DPAGE_PROTECTION_VIOLATED_SIGNAL=SIGBUS
@@ -26,7 +26,7 @@
# as well if using Sun's compiler, -static if using GCC.
# CFLAGS= -g -Bstatic -DPAGE_PROTECTION_VIOLATED_SIGNAL=SIGBUS
-OBJECTS= efence.o page.o print.o
+OBJECTS= efence.o page-win32.o print.o
all: libefence.a tstheap eftest
@ echo
@@ -63,7 +63,7 @@
tstheap: libefence.a tstheap.o
- rm -f tstheap
- $(CC) $(CFLAGS) tstheap.o libefence.a -o tstheap -lpthread
+ $(CC) $(CFLAGS) tstheap.o libefence.a -o tstheap -lpthreadGC2
eftest: libefence.a eftest.o
- rm -f eftest
mingw32-make CC=gcc libefence.aでlibefence.aが出来上がり、上のソースの冒頭の「//」を外して
#include <efence.h>あぶないコードに修正した後
#include <stdio.h>
int main( void ) {
char *a = (char*)malloc(12);
a[ 0] = 'H';
a[ 1] = 'e';
a[ 2] = 'l';
a[ 3] = 'l';
a[ 4] = 'o';
a[ 5] = ',';
a[ 6] = ' ';
a[ 7] = 'W';
a[ 8] = 'o';
a[ 9] = 'r';
a[10] = 'l';
a[11] = 'd';
a[12] = '\0';
return 0;
}
gcc -g -o dame.exe dame.c -lefenceとすれば、efenceビルドされたdame.exeが出来上がり実行すると、正しくクラッシュしてくれる。gdbで確認すれば
C:¥temp¥electric-fence-win32>gdb dame.exeとクラッシュ場所も分かると。でもUNIX版みたくソースは修正したくないなぁ。
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-mingw32"...
(gdb) run
Starting program: C:¥temp¥electric-fence-win32/dame.exe
...
Program received signal SIGSEGV, Segmentation fault.
0x00401396 in main () at dame.c:17
17 a[12] = '\0';
(gdb)
あとmallocでなく
char a[12];とした場合にクラッシュしてくれないのならば、威力半減ってところか。
Posted at 19:04
in ソフトウェア::lang::c
| WriteBacks (0)
Tagged as: c
Bookmarks:
|
|
|
|
|
|
|
|
この記事へのリンク
Tagged as: c
Bookmarks:
意外と知られていないvimのtips(vimスクリプトを難読化)
嘘。難読化っていうか、これバグだな...
Vim script line continuation? - vim_dev | Google グループ検証コードWell, it seems the new line continuation can be placed weirdly, which will make the vim script syntax file even messy when considering the line continuation. Any comments?
e
\c
\h
\o
\ "
\そ
\れ
\P
\l
\a
\!"
それPla!
Posted at 12:31
in ソフトウェア::vim
| WriteBacks (0)
Tagged as: tips, vim
Bookmarks:
|
|
|
|
|
|
|
|
この記事へのリンク
Tagged as: tips, vim
Bookmarks:
2008/03/27
Internet Explorer 6で動作するAutoPagerize作った。
追記
os0xさんが、マルチプラットフォームで動くしかもブックマークレットで起動出来るAutoPagerize for IE6公開されておられます。
「できた!」とほぼ同時にtwitterに書き込んでたのが笑った。
確かに、iframeを使えばXHRを使った場合と違ってresponseTextからcreateContextualFragment等で苦労する事無く、同じドメイン内のiframeだからDOM操作が出来ると...
諦め所がXPath(responseTextからcreateDocumentが出来ないという意味で)でなく、XHRを諦めるべきだったかも。
でけれた。
AutoPagerizeとか、oAutoPagerizeとか、jAutoPagerizeとかをベースに改造しようかと思ったけど、結局XPathでつまづいた。
AutoPagerizeを実現するには、カレントのdocumentとは別のdocumentに読み込んだHTMLを入れてページ部を抽出する必要があるんだけど、IE6ではカレントdocumentにappencChildしないとXPathセレクタが動かない(amachangのJavaScript-XPathで検証)。また、createRange/createContextualFragmentも動かないだろうし、どちみち駄目。
つまり、XPathは実現出来ない事になる。
諦めて、mala氏が作ったオリジナル、「GoogleAutoPager」をベースに作り直した。
で、最初はGoogleだけでいいかと思ったけど、欲が出てtwitterやtumblr、d.hatena.ne.jp、b.hatena.ne.jpでも動かせるようにした。
但し、セレクタとしてはCSSセレクタを使ってるので、特殊な調べ方は出来ない。しかもIE6なのでCSSのバージョンが低い。
セレクタライブラリとしてはjQueryを使用しています。動かす為にはTrixieが必要です。Trixieをインストール後
ネーミングは、「OperaのがoAutoPagerize」なら「IEはiAutoPagerize?」くらいの思考能力で付けた名前です。
よろしかったらどうぞ。
os0xさんが、マルチプラットフォームで動くしかもブックマークレットで起動出来るAutoPagerize for IE6公開されておられます。
「できた!」とほぼ同時にtwitterに書き込んでたのが笑った。
確かに、iframeを使えばXHRを使った場合と違ってresponseTextからcreateContextualFragment等で苦労する事無く、同じドメイン内のiframeだからDOM操作が出来ると...
諦め所がXPath(responseTextからcreateDocumentが出来ないという意味で)でなく、XHRを諦めるべきだったかも。
でけれた。
AutoPagerizeとか、oAutoPagerizeとか、jAutoPagerizeとかをベースに改造しようかと思ったけど、結局XPathでつまづいた。
AutoPagerizeを実現するには、カレントのdocumentとは別のdocumentに読み込んだHTMLを入れてページ部を抽出する必要があるんだけど、IE6ではカレントdocumentにappencChildしないとXPathセレクタが動かない(amachangのJavaScript-XPathで検証)。また、createRange/createContextualFragmentも動かないだろうし、どちみち駄目。
つまり、XPathは実現出来ない事になる。
諦めて、mala氏が作ったオリジナル、「GoogleAutoPager」をベースに作り直した。
で、最初はGoogleだけでいいかと思ったけど、欲が出てtwitterやtumblr、d.hatena.ne.jp、b.hatena.ne.jpでも動かせるようにした。
アイコンとかはありません。ダブルクリックで起動です。![]()
但し、セレクタとしてはCSSセレクタを使ってるので、特殊な調べ方は出来ない。しかもIE6なのでCSSのバージョンが低い。
セレクタライブラリとしてはjQueryを使用しています。動かす為にはTrixieが必要です。Trixieをインストール後
C:¥Program Files¥Bhelpuri¥Trixie¥Scripts¥に以下のリンクにあるiAutoPagerize.user.jsを放り込めばインストールは完了。現状、SITEINFOはベタ打ちです。今後SITEINFOサーバを用意するつもりもありません。ただ、codereposに置いておくので誰でも修正出来る様にしておきます。
ネーミングは、「OperaのがoAutoPagerize」なら「IEはiAutoPagerize?」くらいの思考能力で付けた名前です。
よろしかったらどうぞ。
iAutoPagerize
Posted at 19:27
in ソフトウェア::lang::javascript
| WriteBacks (0)
Tagged as: autopagerize, ie6
Bookmarks:
|
|
|
|
|
|
|
|
この記事へのリンク
Tagged as: autopagerize, ie6
Bookmarks:
XPathのexprにはノードも書けるんだ
またまた知らなかった。勉強不足。
例えば
で、今日知ったのですが、expr部には「@xxx="yyy"」といったexprだけでなくパスも書けるのを知った。
上の例だとtitle1の下のliと、title2の下のliがマッチする。
ところで皆さんはXPathをテストしたい場合、何を使ってますか?
私はjAutoPagerizeを使っています。jAutoPagerizeはcho45氏作のAutoPagerizeクローンで、私は本家を使わずこちらを使っています。
なぜこれを使っているかというと、jAutoPagerize本来の機能も良いのですがXPathGeneratorが付いているからです。
jAutoPagerizeをインストールすると
また、AutoPagerize対応でないページでアイコンが出ていなくても
XPathGeneratorかわいいよXPathGenerator
例えば
<div class="foo">こんなHTMLで
<p>
<span class="test1">title1</span>
</p>
<ul>
<li>list1</li>
<li>list2</li>
<li>list3</li>
</ul>
</div>
<div class="foo">
<div>
<span class="test1">title2</span>
</div>
<ul>
<li>list1</li>
<li>list2</li>
<li>list3</li>
</ul>
</div>
<div class="foo">
<div>
<span class="test2">title3</span>
</div>
<ul>
<li>list1</li>
<li>list2</li>
<li>list3</li>
</ul>
</div>
- class属性"foo"を持つdiv
- その孫にclass属性"test1"を持つspan
- 上の条件下にある上記divの孫にあるli
//div[@class="foo"]//span[@class="test1"]/../..//liこう書いてたんですが、これだとliの階層が深い場合に".."を書く個数が限定されてしまっていました。
で、今日知ったのですが、expr部には「@xxx="yyy"」といったexprだけでなくパスも書けるのを知った。
//div[@class="foo" and .//span[@class="test1"]]//liこれだとcurrent-contextとして
- class属性"foo"を持つdiv
上の例だとtitle1の下のliと、title2の下のliがマッチする。
ところで皆さんはXPathをテストしたい場合、何を使ってますか?
私はjAutoPagerizeを使っています。jAutoPagerizeはcho45氏作のAutoPagerizeクローンで、私は本家を使わずこちらを使っています。
なぜこれを使っているかというと、jAutoPagerize本来の機能も良いのですがXPathGeneratorが付いているからです。
jAutoPagerizeをインストールすると
というアイコンが画面右上に出るのですが、これをクリックすると![]()
といった形でXPathの入力画面が現れます。ここにXPathを書いて"TAB"キー等でフォーカスを外すと![]()
と赤くハイライトされるのです。視覚的にも分かりやすいですね。他直接ノードからXPathを取得するInspectボタンもクラス名を知るのに使えます。![]()
また、AutoPagerize対応でないページでアイコンが出ていなくても
XPathGeneratorこんなブックマークレットさえ用意しておけば、何時でもXPathGeneratorを表示出来るようになります。
XPathGeneratorかわいいよXPathGenerator
Posted at 12:46
in ソフトウェア::lang::xpath
| WriteBacks (0)
Tagged as: xpath
Bookmarks:
|
|
|
|
|
|
|
|
この記事へのリンク
Tagged as: xpath
Bookmarks:
2008/03/26
Publish::Diigo書いた。
なんか久々。
今回はこのブックマークレットのhackで作った。
これで、私が同期しているソーシャルブックマークは
以下、今後変わっていくかもしれないけどコード。
/lang/perl/plagger/lib/Plagger/Plugin/Publish/Diigo.pm - CodeRepos::Share - Tracwww.diigo.com...ブックマークレットから実行出来る専用ポスト画面がなかなかカッコイイ。
今回はこのブックマークレットのhackで作った。
これで、私が同期しているソーシャルブックマークは
- Publish::Delicious
- Publish::LivedoorClip
- Publish::Buzzurl
- Publish::LivedoorCilp
- Publish::Buzzurl
- Publish::GooBookmark
- Publish::NiftyClip
- Publish::Pookmark
- Publish::YahooBookmark
- Publish::FC2Bookmark
- Publish::BlueDot という名の Pubilsh::Delicious
- Publish::Magnolia という名の Publish::Delicious
- Publish::Diigo
以下、今後変わっていくかもしれないけどコード。
Posted at 15:28
in ソフトウェア::lang::perl
| WriteBacks (0)
Tagged as: plagger
Bookmarks:
|
|
|
|
|
|
|
|
この記事へのリンク
Tagged as: plagger
Bookmarks:
FriendFeedにAPIが出来たのでさっそく使ってみた
昨日kuさんが頑張って探してたのはなんだったんだろう...苦笑
朝起きたらAPIが出来てました。確か昨日「/api」にアクセスしても無かったのになぁ。
つまり、XMLフォーマットを使っているgtktwitterを改造してgtkfriendfeedなんて事も出来る訳ですね。
認証が必要な場合は、「remotekey」と呼ばれるアプリケーションキーを取得する必要があります。remotekeyは
まずコード
そして実行例
朝起きたらAPIが出来てました。確か昨日「/api」にアクセスしても無かったのになぁ。
FriendFeed Blog: FriendFeed API: Extend and improve FriendFeedさっそく使ってみました。APIはJSON、XML、RSS、ATOMで提供されており、クライアントライブラリとしてPHPとpythonのライブラリが用意されています。
We are very excited to announce the launch of the FriendFeed API, which enables developers to interact with the FriendFeed site programmatically. It's designed to make it possible for anyone to improve FriendFeed or integrate FriendFeed into other applications. You can develop a FriendFeed interface for a mobile phone, build a FriendFeed widget for your blog, or develop an application that makes it easy to post photos to your feed from your iPhone.
つまり、XMLフォーマットを使っているgtktwitterを改造してgtkfriendfeedなんて事も出来る訳ですね。
ApiDocumentation - friendfeed-api - Google Codetwitterと同じくprivateでなければ認証無しでアクセス出来ます。
friendfeed-api - Google Code
認証が必要な場合は、「remotekey」と呼ばれるアプリケーションキーを取得する必要があります。remotekeyは
FriendFeed - Remote Keyで取得出来ます。認証方法はBasic認証です。今日は認証を使わない例ですが、javascriptからjsonで私と、kuさんと、otsuneさんのフィードをミックス表示する例をサンプルとして上げておきます。
まずコード
<style type="text/css"><!--
#mattn_friendfeed {
margin: 1em;
font-family: Verdana;
width: 400px;
}
#mattn_friendfeed a {
color: blue;
}
.friendfeed-line {
padding-bottom: 1em;
}
.friendfeed-link {
font-size: small;
}
--></style>
<script type="text/javascript"><!--
function mattn_friendfeed_callback(data) {
var container = document.createElement('div');
for(var n = 0; n < data.entries.length; n++) {
var user = document.createElement('a');
var link = document.createElement('a');
var line = document.createElement('div');
var icon = document.createElement('img');
var br = document.createElement('br');
user.href = data.entries[n].user.profileUrl;
link.className = 'friendfeed-link';
link.href = data.entries[n].link;
link.appendChild(document.createTextNode(link.href));
icon.src = user.href + '/picture?size=small';
icon.setAttribute('align', 'left');
user.appendChild(icon);
br.setAttribute('clear', 'all');
line.className = 'friendfeed-line';
line.appendChild(user);
line.appendChild(document.createTextNode(' ' + data.entries[n].title + ' '));
line.appendChild(document.createElement('br'));
line.appendChild(link);
line.appendChild(br);
container.appendChild(line);
}
document.getElementById('mattn_friendfeed').innerHTML = container.innerHTML;
}
function show_mattn_friendfeed() {
document.getElementById('mattn_friendfeed').innerHTML = '<img src="http://mattn.kaoriya.net/images/ajax-loader.gif">';
var s = document.createElement('script');
s.charset = 'utf-8';
s.src = 'http://friendfeed.com/api/feed/user?nickname=mattn,otsune,ku0522&callback=mattn_friendfeed_callback';
document.body.appendChild(s);
}
--></script>
<input type="button" value="mattnのfriendfeedエントリを表示" onclick="show_mattn_friendfeed();" />
<br />
<em>mattnと、ku0522さんと、otsuneさんのmix表示</em><br />
<div id="mattn_friendfeed"></div>
そして実行例
Posted at 10:47
in ソフトウェア::lang::javascript
| WriteBacks (0)
Tagged as: api, friendfeed, javascript
Bookmarks:
|
|
|
|
|
|
|
|
この記事へのリンク
Tagged as: api, friendfeed, javascript
Bookmarks:
2008/03/25
Firefox3でもmicroformat OperatorのhAtomやhFeedを有効にする方法
最近私もFirefox3を使い始めたのですが、Operator 0.9.1と組み合わせると、microformatsが「hCard」と「adr」だけになってしまい、少し困ってました。
何かのバグにしてはエラーコンソールに何も出ないし悩んでいたのですが、今日ソースを見て納得。
Firefox3からは、ブラウザ自身でmicroformatsを解析出来る仕組みが入ったのですが、その対応がOperatorに中途半端に入っている様です。
chromeからmicroformatsを扱う為には
実際には
実際の作業としては「operator.jar」を解凍し上記パッチを当てた(もしくは手編集)後に再度zip(拡張子jar)化すればOK。見事以前までのmicroformat Operatorが帰ってきました。
相変わらずウチのサイトはmicroformatsだらけですが...
ところでFirefox3で扱えるmicroformats、「Describing microformats in JavaScript - MDC」を見るとどうやら自前でmicroformatの定義が出来る様です。今後draftとして拡張されていくであろうmicroformatsへの配慮ですかね。せっかくmicrosummaryのOperatorプラグイン作ってたのに、こっちの方向で作り直しか?
で、さらにドキュメントの例を見ていると
とにかく簡単に拡張出来そうな仕組みなので、しばらく追ってみる。
Firefox3からは、ブラウザ自身でmicroformatsを解析出来る仕組みが入ったのですが、その対応がOperatorに中途半端に入っている様です。
chromeからmicroformatsを扱う為には
Components.utils.import("resource://gre/modules/Microformats.js");というコードが必要なのですが、この処理がコメントアウトされていました。
実際には
$(FIREFOX_PROFILE)/extensions/{95C9A302-8557-4052-91B7-2BB6BA33C885}/chrome/operator.jarに含まれる
content/operator.jsが原因で、パッチで表すならば以下の様な感じ。
--- chrome/content/operator.js.orig Wed Mar 19 11:44:26 2008おしいなぁ...作者。もしくは開発時はバギーだったかな?
+++ chrome/content/operator.js Tue Mar 25 19:11:01 2008
@@ -77,7 +77,7 @@
/* Attempt to use the Microformats module if available (Firefox 3) */
if (Components.utils.import) {
try {
-// Components.utils.import("resource:///modules/Microformats.js");
+ Components.utils.import("resource:///modules/Microformats.js");
} catch (ex) {
/* Unable to load system Microformats - use builtin */
}
実際の作業としては「operator.jar」を解凍し上記パッチを当てた(もしくは手編集)後に再度zip(拡張子jar)化すればOK。見事以前までのmicroformat Operatorが帰ってきました。
相変わらずウチのサイトはmicroformatsだらけですが...
ところでFirefox3で扱えるmicroformats、「Describing microformats in JavaScript - MDC」を見るとどうやら自前でmicroformatの定義が出来る様です。今後draftとして拡張されていくであろうmicroformatsへの配慮ですかね。せっかくmicrosummaryのOperatorプラグイン作ってたのに、こっちの方向で作り直しか?
で、さらにドキュメントの例を見ていると
var adr_definition = {という記述が...。これOperatorのソースコードのままだね。ってことはOperatorのソースをFirefox3に持ってったのかな?
mfVersion: 0.8,
mfObject: adr,
className: "adr",
properties: {
"type" : {
plural: true,
types: ["work", "home", "pref", "postal", "dom", "intl", "parcel"]
},
"post-office-box" : {
},
"street-address" : {
plural: true
},
"extended-address" : {
},
"locality" : {
},
"region" : {
},
"postal-code" : {
},
"country-name" : {
}
}
};
とにかく簡単に拡張出来そうな仕組みなので、しばらく追ってみる。
Posted at 20:39
in web
| WriteBacks (0)
Tagged as: firefox, firefox3, microformats, operator
Bookmarks:
|
|
|
|
|
|
|
|
この記事へのリンク
Tagged as: firefox, firefox3, microformats, operator
Bookmarks:
2008/03/24
Google Visualizationを動的にロードしてGreasemonkey等で使用されているSITEINFOをGoogle SpreadSheetから取得する
たしかにコレ、やばいっす。
ちなみに
wikiも確かに管理しやすいかもしれないけど、Google SpreadSheetも可能性があると思う。
ちなみに今回作ったSITEINFOは簡単な物なので、「ネタフル」と「IDEA * IDEA」くらいしかない。
以下、Google SpreadSheetからSITEINFOを読み込むサンプル
使い方次第では、結構強力な物になりそうな気がする。spreadsheetとつながってるってやばいじゃんこれspreadsheetをバックエンドdbにしていろいろできるってことでしょ
ku's post on twitter
ちなみに
F's Garage:iPhone SDKを読み解くのに必須! Google AJAX Language APIを使ったブックマークWidget作った。多分以下の様にすれば行けるはず。(jsapiのクエリパラメータ「callback」と、loadの第三引数「callback」)
Google AJAX Language APIは、document.writeで翻訳機能読み込みのscript要素コードを出力するようにできており、ブックマークレットには必須の遅延ロードができないようなので、なんだかいろいろ苦労しちゃいました。
wikiも確かに管理しやすいかもしれないけど、Google SpreadSheetも可能性があると思う。
ちなみに今回作ったSITEINFOは簡単な物なので、「ネタフル」と「IDEA * IDEA」くらいしかない。
あと、クエリのfrom区には「sheet1」とか使えるのが分かった。![]()
以下、Google SpreadSheetからSITEINFOを読み込むサンプル
var siteinfo = [];
function handleQueryResponse(response) {
var data = response.getDataTable();
if (!data || response.isError()) {
alert(response.getMessage() + ':' + response.getDetailedMessage());
return;
}
for (var row = 0; row < data.getNumberOfRows(); row++) {
siteinfo.push({
'name' : data.getFormattedValue(row, 0),
'link' : data.getFormattedValue(row, 1),
'url' : data.getFormattedValue(row, 2),
'xpath' : data.getFormattedValue(row, 3),
'base' : data.getFormattedValue(row, 4)
});
}
var html = '';
for (var n = 0; n < siteinfo.length; n++) {
html += '<b><a href="' + siteinfo[n].link + '">' + siteinfo[n].name + '</a></b><br />'
html += '<blockquote' + '><' + 'pre>';
html += '<b>url</b>:' + siteinfo[n].url + '<br />';
html += '<b>xpath</b>:' + siteinfo[n
spreadsheetとつながってるってやばいじゃんこれspreadsheetをバックエンドdbにしていろいろできるってことでしょ