<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="http://jamadam.com/blog/?t=rss.xml" rel="self" type="application/rss+xml" />
<title>JAMADAM.COM</title>
<link>http://jamadam.com/blog/</link>
<description>A personal weblog published</description>
<language>ja</language>
<copyright>(c) Jamadam.com All rights reserved.</copyright>
<category>Weblog</category>
<lastBuildDate>Fri, 21 May 2010 00:14:00 +0900</lastBuildDate>
<generator>Nudeable Type</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<item>
	<title>Perl - クラスの定数引数はインスタンスメソッドで指定する</title>
	<link>http://jamadam.com/blog/?b=3635#parent</link>
	<guid>http://jamadam.com/blog/?b=3635#parent</guid>
	<pubDate>Fri, 21 May 2010 00:14:00 +0900</pubDate>
	<description>
		<![CDATA[<p>Perlでやたら定数風関数を使うようにしてみた。最近この方針を徹底しているけど、後で後悔しなきゃいいが。</p>
<pre class="program_code">
<span class="keyword">use</span> strict;
<span class="keyword">use</span> warnings;
<span class="keyword">use</span> Switch;

<span class="variable">$a</span> = MyClass1-&gt;<span class="method">new</span>;
<span class="variable">$a</span>-&gt;<span class="method">crud</span>(<span class="variable">$a</span>-&gt;<span class="method">MODE_CREATE</span>);
<span class="variable">$a</span>-&gt;<span class="method">crud</span>(<span class="variable">$a</span>-&gt;<span class="method">MODE_READ</span>);
<span class="variable">$a</span>-&gt;<span class="method">crud</span>(<span class="variable">$a</span>-&gt;<span class="method">MODE_UPDATE</span>);
<span class="variable">$a</span>-&gt;<span class="method">crud</span>(<span class="variable">$a</span>-&gt;<span class="method">MODE_DELETE</span>);

<span class="keyword">package</span> MyClass1;
<span class="keyword">use</span> strict;
<span class="keyword">use</span> warnings;
<span class="keyword">use</span> Switch;

    <span class="keyword">sub</span> MODE_CREATE() {<span class="number">1</span>}
    <span class="keyword">sub</span> MODE_READ()   {<span class="number">2</span>}
    <span class="keyword">sub</span> MODE_UPDATE() {<span class="number">3</span>}
    <span class="keyword">sub</span> MODE_DELETE() {<span class="number">4</span>}
    
    <span class="keyword">sub</span> new {
        
        <span class="keyword">return</span> <span class="keyword">bless</span> {}, <span class="keyword">shift</span>;
    }

    <span class="keyword">sub</span> crud {
        
        <span class="keyword">my</span> (<span class="variable">$self</span>, <span class="variable">$mode</span>) = <span class="variable">@_</span>;
        switch (<span class="variable">$mode</span>) {
            case MODE_CREATE {<span class="keyword">print</span> <span class="wquote">&quot;create\n&quot;</span>}
            case MODE_READ   {<span class="keyword">print</span> <span class="wquote">&quot;read\n&quot;</span>}
            case MODE_UPDATE {<span class="keyword">print</span> <span class="wquote">&quot;update\n&quot;</span>}
            case MODE_DELETE {<span class="keyword">print</span> <span class="wquote">&quot;delete\n&quot;</span>}
        }
    }
</pre>
<p>名前つき引数としてのハッシュ引数は可読性が高いんだけど、名前を文字列で入力するとミスしやすい。なので下記のようにする。</p>
<pre class="program_code">
<span class="keyword">use</span> strict;
<span class="keyword">use</span> warnings;

<span class="keyword">my</span> <span class="variable">$ins</span> = MyClass2-&gt;<span class="method">new</span>();
<span class="keyword">print</span> <span class="variable">$ins</span>-&gt;<span class="method">some_method</span>(
    <span class="variable">$ins</span>-&gt;<span class="method">ARG_NAME</span> =&gt; <span class="quote">'saito'</span>, 
    <span class="variable">$ins</span>-&gt;<span class="method">ARG_ADDR</span> =&gt; <span class="quote">'sapporo'</span>
);
<span class="keyword">print</span> <span class="wquote">&quot;\n&quot;</span>;

<span class="keyword">package</span> MyClass2;
<span class="keyword">use</span> strict;
<span class="keyword">use</span> warnings;
    
    <span class="keyword">sub</span> ARG_NAME() {<span class="number">1</span>}
    <span class="keyword">sub</span> ARG_ADDR() {<span class="number">2</span>}
    
    <span class="keyword">sub</span> new {
        
        <span class="keyword">return</span> <span class="keyword">bless</span> {}, <span class="keyword">shift</span>;
    }
    
    <span class="keyword">sub</span> some_method {
        
        <span class="keyword">my</span> (<span class="variable">$self</span>, <span class="variable">%hash</span>) = <span class="variable">@_</span>;
        <span class="keyword">return</span> <span class="variable">$hash</span>{<span class="function">ARG_NAME()</span>}. <span class="quote">' lives in '</span>. <span class="variable">$hash</span>{<span class="function">ARG_ADDR()</span>};
    }
</pre>
<p>定数風関数はメソッド呼び出しできるので</p>
<ul>
    <li>&nbsp;アロー演算子により、クラスが期待する値だけがIDEの補完候補にあがる(クラスを取り違える心配がない)。</li>
    <li>&nbsp;パッケージ修飾が不要(本当の定数だと$Path::To::Module::ARG_NAMEとか長い)。</li>
    <li>&nbsp;継承もできる(ただし主要なIDEでは継承先まで補完できない)。</li>
</ul>
<p>&nbsp;Perl Best Practiceが届いた。けど、まだ読めてない。</p>
<p>&nbsp;</p>]]>
    </description>
</item>
<item>
	<title>Tweetの文脈を分かりやすくするChromeエクステンションを作った</title>
	<link>http://jamadam.com/blog/?b=3633#parent</link>
	<guid>http://jamadam.com/blog/?b=3633#parent</guid>
	<pubDate>Sun, 07 Mar 2010 13:46:26 +0900</pubDate>
	<description>
		<![CDATA[<p>&nbsp;「Context Fetcher」です。ついったーで、Tweetのパーマリンクを開いたときに単独の発言だけでは意味が分からないことがあるので、その発言に至った経緯を読み取れるように、関連ツイートを表示します。</p>
<p><a href="attach_file/3633_1_cf.crx">これをインストール</a></p>
<p><img alt="screen cpture" src="attach_file/3633_2_screen.png" /></p>]]>
    </description>
</item>
<item>
	<title>ついったーのTLを60件に保つグリモンを作った</title>
	<link>http://jamadam.com/blog/?b=3632#parent</link>
	<guid>http://jamadam.com/blog/?b=3632#parent</guid>
	<pubDate>Wed, 24 Feb 2010 21:24:00 +0900</pubDate>
	<description>
		<![CDATA[<p>ついったーのタイムラインが放っておくと超長くなってブラウザが重くなるので、タイムラインのサイズを一定に保つグリモンスクリプトを作った。60件より古いtweetをjQueryでremoveしている。内部的にデータがどうなってるのか分からないので効果は不明だけどDOMが減るので軽くなるだろうという憶測。</p>
<p><a href="attach_file/3632_1_reduceTwitter.user.js">これをインストール</a></p>
<pre class="program_code">
<span class='comment'>// ==UserScript==</span>
<span class='comment'>// @name           tweetReduce</span>
<span class='comment'>// @namespace      http://jamadam.com/</span>
<span class='comment'>// @description    Avoid Twitter Timeline size get too long</span>
<span class='comment'>// @include        http://twitter.com/*</span>
<span class='comment'>// ==/UserScript==</span>

(<span class='keyword'>function</span>() {

    var $;
    var jversion = <span class='quote'>'1.2.6'</span>;
    var jexist = (typeof unsafeWindow.jQuery != <span class='quote'>'undefined'</span>);
    var conflict = (jexist &amp;&amp; unsafeWindow.jQuery.fn.jquery != jversion);
    <span class='comment'>// Add jQuery if not loaded</span>
    <span class='keyword'>if</span> (! jexist || conflict) {
        var GM_JQ = <span class='keyword'>document</span>.<span class='keyword'>createElement</span>(<span class='quote'>'script'</span>);
        GM_JQ.<span class='keyword'>src</span> = <span class='quote'>'http://ajax.googleapis.com/ajax/libs/jquery/'</span> + jversion + <span class='quote'>'/jquery.js'</span>;
        GM_JQ.<span class='keyword'>type</span> = <span class='quote'>'text/javascript'</span>;
        <span class='keyword'>document</span>.<span class='keyword'>getElementsByTagName</span>(<span class='quote'>'body'</span>)[<span class='number'>0</span>].<span class='keyword'>appendChild</span>(GM_JQ);
    }

    GM_wait();

    <span class='comment'>// Check if jQuery's loaded</span>
    <span class='keyword'>function</span> GM_wait() {
        <span class='keyword'>if</span> (typeof unsafeWindow.jQuery == <span class='quote'>'undefined'</span> || unsafeWindow.jQuery.fn.jquery != jversion) {
            <span class='keyword'>window</span>.<span class='keyword'>setTimeout</span>(GM_wait,<span class='number'>100</span>);
        } <span class='keyword'>else</span> {
            <span class='keyword'>if</span> (conflict) {
                $ = unsafeWindow.jQuery.noConflict(true);
            } <span class='keyword'>else</span> {
                $ = unsafeWindow.jQuery;
            }
            letsJQuery();
        }
    }

    <span class='comment'>// All your GM code must be inside this function</span>
    <span class='keyword'>function</span> letsJQuery() {
        var topid = $(<span class='quote'>'#timeline li'</span>).eq(<span class='number'>0</span>).attr(<span class='quote'>'id'</span>);
        <span class='keyword'>window</span>.<span class='keyword'>setInterval</span>(reduce, <span class='number'>5000</span>);
        <span class='keyword'>function</span> reduce() {
            var newid = $(<span class='quote'>'#timeline li'</span>).eq(<span class='number'>0</span>).attr(<span class='quote'>'id'</span>);
            <span class='keyword'>if</span> (topid != newid) {
                topid = newid;
                console.<span class='keyword'>log</span>($(<span class='quote'>'#timeline li'</span>).<span class='keyword'>length</span>);
                <span class='keyword'>while</span> ($(<span class='quote'>'#timeline li'</span>).<span class='keyword'>length</span> &gt; <span class='number'>60</span>) {
                    $(<span class='quote'>'#timeline li'</span>).eq(<span class='number'>60</span>).remove();
                }
            }
        }
    }
})();
</pre>]]>
    </description>
</item>
<item>
	<title>翻訳結果を検証しやすい翻訳サービスを作った</title>
	<link>http://jamadam.com/blog/?b=3631#parent</link>
	<guid>http://jamadam.com/blog/?b=3631#parent</guid>
	<pubDate>Tue, 23 Feb 2010 16:57:24 +0900</pubDate>
	<description>
		<![CDATA[<p>「翻訳の可逆性を検証し、よりよい訳文を選択可能な翻訳サービス」です。いろんな翻訳サービスをマッシュアップしてます。</p>
<p><a href="http://jamadam.com/vt/">Verifiable Translator &beta;</a></p>
<p>経験上、ウェブ上の翻訳サービスの精度はかなり低いです。「不自然な表現」どころか、意味を想像することすら難しい程の間違った訳が平気で提示されます。外国語を母国語へ翻訳して読解する場合は利用価値があるのですが、母国語から外国語へ翻訳するケースでは、対象外国語を全く理解できないまま利用するのは危険です。</p>
<p>このサービスは、入力された日本語を様々な翻訳サービスを利用して外国語に翻訳し、その結果をさらに逆翻訳した日本語を合わせて提示します。利用者は出力された日本語の正当性を評価することで訳文を検証することができます。また、ひとつの入力に対して多数の候補を提示することで、より妥当な訳文を選択することができます。</p>
<p>現在は日本語-&gt;英語と日本語-&gt;中国語の翻訳が可能です。</p>]]>
    </description>
</item>
<item>
	<title>commons markerの件数をgoogle検索結果に表示するグリモンをつくった</title>
	<link>http://jamadam.com/blog/?b=3630#parent</link>
	<guid>http://jamadam.com/blog/?b=3630#parent</guid>
	<pubDate>Fri, 15 Jan 2010 01:04:00 +0900</pubDate>
	<description>
		<![CDATA[<p>[2010.01.15追記] 無駄な処理が多かったのでソースを少し整理した。</p>
<p>恥ずかしながら、commons markerというサービスを最近まで知らなかった。前々から出来たらいいなと思っていたことにすごく近いので使い始めてみた。</p>
<p>ところで、はてなブックマークのFirefoxアドオンはとても便利で、とくにGoogle検索の結果にブクマ件数が表示されるのは、クリックすべきリンクのアタリをつけるのに大変便利なのですが、同じ発想でcommons markerの件数も参考データとして意味があるかもしれないと思い、早速グリモンスクリプトで実現してみた。</p>
<p><a href="attach_file/3630_1_googleResultWithMarker.user.js">googleResultWithMarker.user.jsをインストール</a></p>
<p><img alt="image" src="attach_file/3630_2_image.png" class="diagram" /></p>
<pre class="program_code"><span class="comment">// ==UserScript==</span>
<span class="comment">// @name           googleResultWithMarker</span>
<span class="comment">// @namespace      http://jamadam.com/blog/</span>
<span class="comment">// @description    googleResultWithMarker</span>
<span class="comment">// @include        http://*.google.co.jp/search*</span>
<span class="comment">// ==/UserScript==</span>


(<span class="keyword">function</span>() {

    var $;
    var jversion = <span class="quote">'1.3.2'</span>;
    var jexist = (typeof unsafeWindow.jQuery != <span class="quote">'undefined'</span>);
    var conflict = (jexist &amp;&amp; unsafeWindow.jQuery.fn.jquery != jversion);
    <span class="comment">// Add jQuery if not loaded</span>
    <span class="keyword">if</span> (! jexist || conflict) {
        var GM_JQ = <span class="keyword">document</span>.<span class="keyword">createElement</span>(<span class="quote">'script'</span>);
        GM_JQ.<span class="keyword">src</span> = <span class="quote">'http://ajax.googleapis.com/ajax/libs/jquery/'</span> + jversion + <span class="quote">'/jquery.js'</span>;
        GM_JQ.<span class="keyword">type</span> = <span class="quote">'text/javascript'</span>;
        <span class="keyword">document</span>.<span class="keyword">getElementsByTagName</span>(<span class="quote">'body'</span>)[<span class="number">0</span>].<span class="keyword">appendChild</span>(GM_JQ);
    }

    GM_wait();

    <span class="comment">// Check if jQuery's loaded</span>
    <span class="keyword">function</span> GM_wait() {
        <span class="keyword">if</span> (typeof unsafeWindow.jQuery == <span class="quote">'undefined'</span> || unsafeWindow.jQuery.fn.jquery != jversion) {
            <span class="keyword">window</span>.<span class="keyword">setTimeout</span>(GM_wait,<span class="number">100</span>);
        } <span class="keyword">else</span> {
            <span class="keyword">if</span> (conflict) {
                $ = unsafeWindow.jQuery.noConflict(true);
            } <span class="keyword">else</span> {
                $ = unsafeWindow.jQuery;
            }
            letsJQuery();
        }
    }

    <span class="comment">// All your GM code must be inside this function</span>
    <span class="keyword">function</span> letsJQuery() {

        var array = $(<span class="quote">'#res li.g'</span>);
        var procExist = false;
        var i = <span class="number">0</span>;
        var loop = <span class="keyword">function</span>() {
            <span class="keyword">if</span> (i &lt; array.<span class="keyword">length</span>) {
                <span class="keyword">if</span> (procExist) {<span class="keyword">return</span>;}
                procExist = true;
                var <span class="keyword">href</span> = array.eq(i).<span class="keyword">find</span>(<span class="quote">'h3 a'</span>).attr(<span class="wquote">&quot;href&quot;</span>);
                var pos = array.eq(i).<span class="keyword">find</span>(<span class="quote">'span.gl'</span>);
                var url = encodeURIComponent(<span class="keyword">href</span>);
                var jsurl = <span class="wquote">&quot;http://commonsmarker.com/tools/latest_info?url=&quot;</span> + url;
                unsafeWindow[<span class="wquote">&quot;__jsonp__aD3jHjaf27mZQxt&quot;</span>] = <span class="keyword">function</span>(a) {
                    <span class="keyword">if</span> (! a || ! a.marks || ! a.marks.<span class="keyword">length</span>) {
                        <span class="keyword">return</span>;
                    }
                    $(<span class="wquote">&quot;&lt;a&gt;&quot;</span> + a.marks.<span class="keyword">length</span> + <span class="wquote">&quot; markers&lt;/a&gt;&quot;</span>)
                        .attr(<span class="quote">'href'</span>, <span class="wquote">&quot;http://commonsmarker.com/page/&quot;</span> + <span class="keyword">href</span>)
                        .css({
                            backgroundColor:<span class="wquote">&quot;#f5d0d0&quot;</span>,
                            color:<span class="wquote">&quot;#ff0000&quot;</span>,
                            fontFamily:<span class="wquote">&quot;arial,sans-serif&quot;</span>,
                            fontWeight:<span class="wquote">&quot;bold&quot;</span>,
                            marginLeft:<span class="wquote">&quot;4px&quot;</span>,
                            padding:<span class="wquote">&quot;1px&quot;</span>,
                            fontSize:<span class="wquote">&quot;85%&quot;</span>
                        })
                        .insertAfter(pos);
                }
                $.ajax({
                    <span class="keyword">type</span>: <span class="wquote">&quot;GET&quot;</span>,
                    url: jsurl,
                    dataType: <span class="wquote">&quot;script&quot;</span>,
                    <span class="keyword">complete</span>: <span class="keyword">function</span>() {
                        i++;
                        procExist = false;
                        loop();
                    }
                });
            }
        }
        loop();
    }
})();
</pre>
<p>commons markerの公式のインターフェースはまだ機能不足なため他のユーザーの動向がよく掴めなかったんだけど、こうしてスクリプトで簡単に件数を把握できるようにしてみて分かったことは、「全然利用されてない」ということでした。予想はしていたけど。</p>
<p>なお、commons markerはこの手の外部スクリプトへのインターフェースや仕様を一切公開していません。今回のスクリプトはとても強引な処理と憶測で実装しているので、サーバーの仕様が変わって動かなくなることが大いに予想されます。</p>]]>
    </description>
</item>
<item>
	<title>グリモンでjQueryのコンフリクトを避けるテンプレート</title>
	<link>http://jamadam.com/blog/?b=3629#parent</link>
	<guid>http://jamadam.com/blog/?b=3629#parent</guid>
	<pubDate>Tue, 10 Nov 2009 02:15:12 +0900</pubDate>
	<description>
		<![CDATA[<p>昨日のつづき。</p>
<p>グリモンスクリプトでjQueryを使うとき、他のスクリプトでロードされたjQueryの別バージョンとのコンフリクトを避けるためのテンプレート。</p>
<pre class="program_code">
(<span class="keyword">function</span>() {
        
    var $;
    var jversion = <span class="quote">&#39;1.3&#39;</span>;
    var jexist = (typeof unsafeWindow.jQuery != <span class="quote">&#39;undefined&#39;</span>);
    var conflict = (jexist &amp;&amp; unsafeWindow.jQuery.fn.jquery != jversion);
    
    <span class="comment">// Add jQuery if not loaded</span>
    <span class="keyword">if</span> (! jexist || conflict) {
        var GM_JQ = <span class="keyword">document</span>.<span class="keyword">createElement</span>(<span class="quote">&#39;script&#39;</span>);
        GM_JQ.<span class="keyword">src</span> = <span class="quote">&#39;http://ajax.googleapis.com/ajax/libs/jquery/&#39;</span> + jversion + <span class="quote">&#39;/jquery.js&#39;</span>;
        GM_JQ.<span class="keyword">type</span> = <span class="quote">&#39;text/javascript&#39;</span>;
        <span class="keyword">document</span>.<span class="keyword">getElementsByTagName</span>(<span class="quote">&#39;body&#39;</span>)[<span class="number">0</span>].<span class="keyword">appendChild</span>(GM_JQ);
    }
    
    GM_wait();
    
    <span class="comment">// Check if jQuery&#39;s loaded</span>
    <span class="keyword">function</span> GM_wait() {
        <span class="keyword">if</span> (typeof unsafeWindow.jQuery == <span class="quote">&#39;undefined&#39;</span> || unsafeWindow.jQuery.fn.jquery != jversion) {
            <span class="keyword">window</span>.<span class="keyword">setTimeout</span>(GM_wait,<span class="number">100</span>);
        } <span class="keyword">else</span> {
            <span class="keyword">if</span> (conflict) {
                $ = unsafeWindow.jQuery.noConflict(true);
            } <span class="keyword">else</span> {
                $ = unsafeWindow.jQuery;
            }
            letsJQuery();
        }
    }
    
    <span class="comment">// All your GM code must be inside this function</span>
    <span class="keyword">function</span> letsJQuery() {
    
    }
})();
</pre>
<p>a</p>]]>
    </description>
</item>
<item>
	<title>グリモンでjQuery使ったらTwitterがバグった件が解決した</title>
	<link>http://jamadam.com/blog/?b=3628#parent</link>
	<guid>http://jamadam.com/blog/?b=3628#parent</guid>
	<pubDate>Sun, 08 Nov 2009 20:55:59 +0900</pubDate>
	<description>
		<![CDATA[<p><a href="http://joanpiedra.com/jquery/greasemonkey/">jQuery &amp; Greasemonkey</a></p>
<p>Twitterの公式ページに適用するためのGreasemonkeyスクリプトにjQueryを使おうと思ったら、しばらくうまく行かなかった。原因は、TwitterページがすでにjQueryの旧バージョンをロードしていたというだけ。今回はたまたま自分のスクリプトがバージョンに依存しない内容だったので、if文でjQueryの存在確認をしてからロードすることで解決した。</p>
<pre class="program_code">(<span class="keyword">function</span>() {

    <span class="comment">// Add jQuery if not loaded</span>
    <span class="keyword">if</span> (typeof unsafeWindow.jQuery == <span class="quote">&#39;undefined&#39;</span>) {
        var GM_JQ = <span class="keyword">document</span>.<span class="keyword">createElement</span>(<span class="quote">&#39;script&#39;</span>);
        GM_JQ.<span class="keyword">src</span> = <span class="quote">&#39;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js&#39;</span>;
        GM_JQ.<span class="keyword">type</span> = <span class="quote">&#39;text/javascript&#39;</span>;
        <span class="keyword">document</span>.<span class="keyword">getElementsByTagName</span>(<span class="quote">&#39;body&#39;</span>)[<span class="number">0</span>].<span class="keyword">appendChild</span>(GM_JQ);
    }
    
    <span class="comment">// Check if jQuery&#39;s loaded</span>
    <span class="keyword">function</span> GM_wait() {
        <span class="keyword">if</span> (typeof unsafeWindow.jQuery == <span class="quote">&#39;undefined&#39;</span>) {
            <span class="keyword">window</span>.<span class="keyword">setTimeout</span>(GM_wait,<span class="number">100</span>);
        } <span class="keyword">else</span> {
            jQuery = unsafeWindow.jQuery;
            letsJQuery();
        }
    }
    GM_wait();

    <span class="comment">// All your GM code must be inside this function</span>
    <span class="keyword">function</span> letsJQuery() {
        
    }
})();
</pre>]]>
    </description>
</item>
<item>
	<title>ついったらータグs API(仮)</title>
	<link>http://jamadam.com/blog/?b=3627#parent</link>
	<guid>http://jamadam.com/blog/?b=3627#parent</guid>
	<pubDate>Thu, 05 Nov 2009 00:02:00 +0900</pubDate>
	<description>
		<![CDATA[<p>「ついったらータグs API(仮)」は、ついったらータグs(仮)のデータベースへの問い合わせをアプリケーションから利用するためのインターフェースを提供します。ついったらータグs(仮)のデータベースにはTwitterの各ユーザーページに対する、はてなブックマークタグの情報を格納しています。本APIを利用することで、任意のユーザーに対するタグ付けの情報はもちろんのこと、任意のタグがどのユーザーに適用されているかという情報を取得することができます。また、対象となるデータベースとして、独自のルールでタグ文字列の正規化を行ったテーブルを対象にすることもできます(任意)。</p>
<p>&nbsp;全てのAPIは下記のURLで提供されます。</p>
<blockquote>
<p>http://jamadam.com/th/</p>
</blockquote>
<p>&nbsp;現在サポートされている操作は、タグ-ユーザー検索(パラメータt=api/tag.json)とユーザー-タグ検索(パラメータt=api/user.json)です。いずれもレスポンスとしてJSONを返します。また、クエリーとしてcallbackを渡すことでJSONPを受け取ることもできます。</p>
<p>&nbsp;</p>
<p><u><span style="font-size: large;">タグ-ユーザー検索</span><br />
</u></p>
<p>任意のタグ文字列を指定することで、このタグがつけられたユーザーのスクリーンネームのリストを得ます。</p>
<p><strong>パラメータ</strong></p>
<ul>
    <li>t (必須)<br />
    &quot;api/tag.json&quot;を指定します。</li>
    <li>str (必須)<br />
    任意のタグを指定します。</li>
    <li>nn (オプション)<br />
    正規化されたテーブルを使用しないためのパラメータです。1を指定すると、はてなブックマークに登録された通りのタグ文字列が対象となります。デフォルトは0です。</li>
</ul>
<p>&nbsp;<strong>リクエスト例</strong></p>
<blockquote>
<p>/th/?t=api/tag.json&amp;str=it</p>
</blockquote>
<p><strong>レスポンス例</strong></p>
<blockquote>
<p>{&quot;result&quot;:[<br />
{&quot;user&quot;:&quot;takapon_jp&quot;,&quot;occurance&quot;:&quot;2&quot;},<br />
{&quot;user&quot;:&quot;m_kumagai&quot;,&quot;occurance&quot;:&quot;1&quot;},<br />
{&quot;user&quot;:&quot;huehara88&quot;,&quot;occurance&quot;:&quot;1&quot;}<br />
]}</p>
</blockquote>
<p>&nbsp;※実際はレスポンスに改行は含まれません。</p>
<p>&nbsp;</p>
<p><u><span style="font-size: large;">ユーザー-タグ検索</span><br />
</u></p>
<p>任意のスクリーンネームを指定することで、このユーザーに付与されたタグの一覧を得ます。</p>
<p><strong>パラメータ</strong></p>
<ul>
    <li>t (必須)<br />
    &quot;api/user.json&quot;を指定します。</li>
    <li>str (必須)<br />
    任意のスクリーンネームを指定します。</li>
    <li>nn (オプション)<br />
    正規化されたテーブルを使用しないためのパラメータです。1を指定すると、はてなブックマークに登録された通りのタグ文字列が対象となります。デフォルトは0です。</li>
</ul>
<p><strong>リクエスト例</strong></p>
<blockquote>
<p>/th/?t=api/user.json&amp;str=jamadam</p>
</blockquote>
<p><strong>レスポンス例</strong></p>
<blockquote>
<p>{&quot;result&quot;:[<br />
{&quot;tag&quot;:&quot;twitter&quot;,&quot;occurance&quot;:&quot;38&quot;},<br />
{&quot;tag&quot;:&quot;音楽&quot;,&quot;occurance&quot;:&quot;9&quot;},<br />
{&quot;tag&quot;:&quot;有名人&quot;,&quot;occurance&quot;:&quot;4&quot;},<br />
{&quot;tag&quot;:&quot;webサービス&quot;,&quot;occurance&quot;:&quot;4&quot;}<br />
]}</p>
</blockquote>
<p>※実際はレスポンスに改行は含まれません。</p>
<p>&nbsp;</p>
<p><u><span style="font-size: large;">実装例</span></u></p>
<p>ユーザー-タグ検索を利用してタグ一覧を取得するPerlコードは以下のようになります。</p>
<pre class="program_code"><span class="keyword">use</span> LWP::UserAgent;
<span class="keyword">use</span> JSON::XS;

<span class="keyword">my</span> <span class="variable">$tags</span> = _twitterer_tags(<span class="quote">'jamadam'</span>);
<span class="keyword">foreach</span> <span class="keyword">my</span> <span class="variable">$entry</span> (@<span class="variable">$tags</span>) {
    <span class="keyword">print</span>(<span class="variable">$entry</span>-&gt;{tag});
    <span class="keyword">print</span>(<span class="wquote">&quot;:&quot;</span>);
    <span class="keyword">print</span>(<span class="variable">$entry</span>-&gt;{occurance}.<span class="wquote">&quot;回&quot;</span>);
    <span class="keyword">print</span>(<span class="wquote">&quot;&yen;n&quot;</span>);
}

<span class="keyword">sub</span> _twitterer_tags {
    <span class="keyword">my</span> <span class="variable">$user</span> = <span class="keyword">shift</span>;
    <span class="keyword">my</span> <span class="variable">$ua</span> = LWP::UserAgent-&gt;<span class="method">new</span>;
    <span class="keyword">my</span> <span class="variable">$res</span> = <span class="variable">$ua</span>-&gt;<span class="method">get</span>(<span class="quote">'http://jamadam.com/th/?t=api/user.json&amp;str='</span>. <span class="variable">$user</span>);
    <span class="keyword">my</span> <span class="variable">$obj</span> = decode_json <span class="variable">$res</span>-&gt;<span class="method">content</span>();
    <span class="keyword">return</span> <span class="variable">$obj</span>-&gt;{result};
}
</pre>
<p>&nbsp;</p>]]>
    </description>
</item>
<item>
	<title>ある意味、世界一のURL短縮サービスを作った</title>
	<link>http://jamadam.com/blog/?b=3555#parent</link>
	<guid>http://jamadam.com/blog/?b=3555#parent</guid>
	<pubDate>Wed, 04 Nov 2009 01:13:00 +0900</pubDate>
	<description>
		<![CDATA[<p>[2009.09.30] <a href="http://asiajin.com/blog/2009/09/29/the-world-shortest-url-shortener-using-international-domain-name/">Asiajin</a>で取り上げていただきました。ありがとうございます。そして、同じネタがすでにあったと知りました。リサーチ不足。</p>
<p>&nbsp;</p>
<p>長いURLの文字数を削減してくれるURL短縮サービスはたくさんあるけど、世界中のどの方式よりも文字数を短縮できる方法を発明しました。</p>
<p><a href="http://縮.jp/">縮.jp</a></p>
<p>サイト名ですでにネタばれですが、これは各URLに割り振るIDをマルチバイト文字の組み合わせにすることで、文字数的には短いでしょ、というネタです。ついったーなんかは完全に文字数に依存なので有効かも。</p>
<p>IDに使用する文字は日本の常用漢字1945字です。シーケンシャルに割り振り、使い切ったら繰り上がるので、最初の370万件は2桁に収まり、最初の73億件も3桁に収まります。</p>
<p>注意事項としては</p>
<ul>
    <li>Firefox3.5, IE7, Chrome, iPhoneで正常動作を確認しました。逆に、Androidエミュレータ, DoCoMoやAUのブラウザ(フルブラウザ含む)は日本語ドメインに未対応のようです。</li>
    <li>IDはシーケンシャルに割り振られるので使用済みのIDは容易に推測できます。</li>
    <li>「悪」などというイヤなIDが当たってしまったら<strike>リロードして再割当してください。</strike>「縮AGAIN」ボタンを押してください。</li>
    <li>これはジョークサービスです。本サービスの利用に起因または関連する利用者の損害について管理者は何ら責任を負いません。</li>
</ul>
<p>&nbsp;</p>
]]>
    </description>
</item>
<item>
	<title>先日のグリモンから先日のサイトに飛べるようにした</title>
	<link>http://jamadam.com/blog/?b=3626#parent</link>
	<guid>http://jamadam.com/blog/?b=3626#parent</guid>
	<pubDate>Tue, 03 Nov 2009 08:12:34 +0900</pubDate>
	<description>
		<![CDATA[<p>です。<a href="./?b=3625"><br />
</a></p>
<ul>
    <li><a href="./?b=3625">Twitterとはてなブックマークでマッシュアップしてみた</a></li>
    <li><a href="./?b=3624">ついったーユーザーへのタグらしきものを表示するグリモンつくった</a></li>
</ul>
<p>ただし、グリモンはバグものです。投稿時に固まる。そのうち直したい。</p>]]>
    </description>
</item>
<item>
	<title>Twitterとはてなブックマークでマッシュアップしてみた</title>
	<link>http://jamadam.com/blog/?b=3625#parent</link>
	<guid>http://jamadam.com/blog/?b=3625#parent</guid>
	<pubDate>Sat, 31 Oct 2009 06:21:12 +0900</pubDate>
	<description>
		<![CDATA[<p>してみた。眠いので寝る。</p>
<p><a href="http://jamadam.com/th/">ついったらータグs</a> </p>]]>
    </description>
</item>
<item>
	<title>ついったーユーザーへのタグらしきものを表示するグリモンつくった</title>
	<link>http://jamadam.com/blog/?b=3624#parent</link>
	<guid>http://jamadam.com/blog/?b=3624#parent</guid>
	<pubDate>Fri, 30 Oct 2009 01:33:00 +0900</pubDate>
	<description>
		<![CDATA[<p>ユーザー名にマウスオーバーすると、その人に対して付けられたかもしれないタグが列挙されます。ページによって反応しないかもしれません。アルファ版ということでお願いします。</p>
<p><img class="diagram" alt="image1" src="attach_file/3624_1_image.png" /></p>
<p><img class="diagram" alt="image2" src="attach_file/3624_4_image.png" /></p>
<p>&nbsp;</p>
<p><a href="attach_file/3624_2_twitterers_on_hatebu.user.js">これをインストール</a></p>
<p>ちなみに、このスクリプトにはタグ付け機能がありません。タグ付けには<a href="http://b.hatena.ne.jp/guide/firefox_addon">こちらのツール</a>が使用できます。あと、複数ユーザーをタグ毎に束ねられなければタグの意味がないんですが、出来る気がしません。</p>]]>
    </description>
</item>
<item>
	<title>縮.jpに外国人向けの機能をいくつかつけた</title>
	<link>http://jamadam.com/blog/?b=3623#parent</link>
	<guid>http://jamadam.com/blog/?b=3623#parent</guid>
	<pubDate>Wed, 28 Oct 2009 03:07:33 +0900</pubDate>
	<description>
		<![CDATA[<p><a href="http://縮.jp/">縮.jp</a>に、IDとして使われた漢字の英訳を表示する機能を付けた。また、カスタムIDに外国語の単語などを入力した場合はエラーが出つつも、その単語の日本語訳から抽出した漢字を次候補として提案する機能をつけた。Google AJAX Language APIを使ってみたかっただけ。</p>]]>
    </description>
</item>
<item>
	<title>念のためテスト</title>
	<link>http://jamadam.com/blog/?b=3622#parent</link>
	<guid>http://jamadam.com/blog/?b=3622#parent</guid>
	<pubDate>Sat, 24 Oct 2009 10:24:07 +0900</pubDate>
	<description>
		<![CDATA[<p>ほげほげ</p>]]>
    </description>
</item>
<item>
	<title>LWP直った？テスト</title>
	<link>http://jamadam.com/blog/?b=3621#parent</link>
	<guid>http://jamadam.com/blog/?b=3621#parent</guid>
	<pubDate>Thu, 22 Oct 2009 00:27:54 +0900</pubDate>
	<description>
		<![CDATA[<p>テスト</p>]]>
    </description>
</item>
<item>
	<title>twilogで日本語ドメイン名にリンクを張るGreasemonkeyスクリプトを作った</title>
	<link>http://jamadam.com/blog/?b=3620#parent</link>
	<guid>http://jamadam.com/blog/?b=3620#parent</guid>
	<pubDate>Mon, 19 Oct 2009 02:49:33 +0900</pubDate>
	<description>
		<![CDATA[<p>開発ネタがぜんぜん思いつかないのでGreasemonkeyスクリプトをもうひとつ作った。</p>
<p><a href="http://twilog.org/">twilog</a>というサービスで、つぶやきの文中の日本語ドメインURLにリンクが張られていないようなので、勝手に張ってくれるGreasemonkeyスクリプトです。</p>
<p><a href="attach_file/3620_1_accessible_idn.user.js">accessible_idnをインストール</a></p>
<pre class="program_code"><span class="comment">// ==UserScript==</span>
<span class="comment">// @name           accessible_idn</span>
<span class="comment">// @namespace      http://jamadam.com/blog/</span>
<span class="comment">// @description    This makes IDN URLs accessible.</span>
<span class="comment">// @include        http://twilog.org/*</span>
<span class="comment">// ==/UserScript==</span>

(<span class="keyword">function</span>() {
var tltexts = <span class="keyword">document</span>.getElementsByClassName(<span class="quote">&#39;tl-text&#39;</span>);
<span class="keyword">for</span> (var i = <span class="number">0</span>; i &lt; tltexts.<span class="keyword">length</span>; i++) {
    var tmp = tltexts[i].<span class="keyword">innerHTML</span>;
    <span class="keyword">for</span> (var j = <span class="number">0</span>; j &lt; tmp.<span class="keyword">length</span>;) {
        <span class="keyword">if</span> (tmp.<span class="keyword">substr</span>(j, <span class="number">3</span>) == <span class="quote">&#39;&lt;a &#39;</span>) {
            var closepos = tmp.<span class="keyword">indexOf</span>(<span class="quote">&#39;&lt;/a&gt;&#39;</span>, j);
            <span class="keyword">if</span> (closepos == -<span class="number">1</span>) {
                <span class="keyword">break</span>;
            } <span class="keyword">else</span> {
                j =  closepos + <span class="number">4</span> + <span class="number">1</span>;
                <span class="keyword">continue</span>;
            }
        }
        <span class="keyword">if</span> (tmp.<span class="keyword">substr</span>(j, <span class="number">2</span>) == <span class="quote">&#39;ht&#39;</span> &amp;&amp; 
            tmp.<span class="keyword">substr</span>(j, <span class="number">8</span>).<span class="keyword">match</span>(/^https?:&yen;/&yen;<span class="comment">//)) {</span>
            var end = tmp.<span class="keyword">substr</span>(j).<span class="keyword">search</span>(/&yen;s| |$/);
            var url = tmp.<span class="keyword">substr</span>(j, end);
            var gen = <span class="quote">&#39;&lt;a href=&quot;%1&quot;&gt;%2&lt;/a&gt;&#39;</span>.<span class="keyword">replace</span>(<span class="quote">&#39;%1&#39;</span>, url)
                                           .<span class="keyword">replace</span>(<span class="quote">&#39;%2&#39;</span>, url);
            tmp = tmp.<span class="keyword">substr</span>(<span class="number">0</span>, j) + gen + tmp.<span class="keyword">substr</span>(j + end);
            <span class="keyword">continue</span>;
        }
        
        j++;
    }
    
    tltexts[i].<span class="keyword">innerHTML</span> = tmp;
}
})();
</pre>
<p>&nbsp;前回のネタよりちょっと難しかった。既設リンクをスルーする仕組みが多少いい加減。</p>]]>
    </description>
</item>
<item>
	<title>国際化ドメイン名をHTMLに記述する際の記述方法</title>
	<link>http://jamadam.com/blog/?b=3619#parent</link>
	<guid>http://jamadam.com/blog/?b=3619#parent</guid>
	<pubDate>Sun, 18 Oct 2009 11:23:14 +0900</pubDate>
	<description>
		<![CDATA[<p>国際化ドメイン名をHTMLに記述する際の記述方法に関するメモ。間違いあったら指摘して。</p>
<pre class="program_code">
(1) &lt;<span class="tag">a href=<span class="wquote">&quot;http://%E7%B8%AE.jp/&quot;</span></span>&gt;http://縮.jp/&lt;<span class="tag">/a</span>&gt; <span style="color: rgb(255, 0, 0);">(誤り)</span>
(2) &lt;<span class="tag">a href=<span class="wquote">&quot;http://縮.jp/&quot;</span></span>&gt;http://縮.jp/&lt;<span class="tag">/a</span>&gt;
(3) &lt;<span class="tag">a href=<span class="wquote">&quot;http://&amp;#x7e2e;.jp/&quot;</span></span>&gt;http://縮.jp/&lt;<span class="tag">/a</span>&gt;
(4) &lt;<span class="tag">a href=<span class="wquote">&quot;http://xn--jj0a.jp/&quot;</span></span>&gt;http://縮.jp/&lt;<span class="tag">/a</span>&gt;
</pre>
<p>(1)パーセントエンコード。誤り。</p>
<p>(2)マルチバイト文字を直接記述する。一番正しくて手軽な記述。問題点は、UAがIDNに対応していないため通信時に正しくpunycode変換されないかもしれないこと。</p>
<p>(3)マルチバイト文字を数値文字参照で記述する。敢えてこう記述するメリットはあまりないけど、例えばマルチバイト文字を扱えないシステムとの相互運用を想定しているためにHTML内に日本語を直接記述したくない場合には、このように記述して構わない。</p>
<p>(4)punycode変換して記述する。リンクを正しく動作させるという点では一番安全かもしれない記述。ただし、エンドユーザーが知りうるURLが全てデコードされるかどうかはブラウザの実装次第。例えば「リンクをコピー」したときにpunycodeのまま出力されてしまってはIDNの利点が台無し。punycode変換はUAが通信時に行うことが推奨されているため、HTMLに記述する時点で行う必要はない。</p>]]>
    </description>
</item>
<item>
	<title>誤ってエンコードされたIDNを直すGreasemonkeyスクリプトを作った</title>
	<link>http://jamadam.com/blog/?b=3618#parent</link>
	<guid>http://jamadam.com/blog/?b=3618#parent</guid>
	<pubDate>Sun, 18 Oct 2009 03:48:58 +0900</pubDate>
	<description>
		<![CDATA[<p>開発ネタがぜんぜん思いつかないのでGreasemonkeyスクリプトでもやってみようと思った。</p>
<p>世の中のWEBシステムの多くは国際化ドメイン名(IDN)に対応していないと最近気づいた。例えば<a href="http://pcod.no-ip.org/yats/">Twitter検索</a>の結果とかにhttp://日本語.jp/とあっても飛び先がエラーになるのはサーバープログラムが「日本語」を誤ってパーセントエンコードしているため。このリンクを正しく動作させるためにドメイン名をデコードするGreasemonkeyスクリプトを作りました。</p>
<pre class="program_code"><span class="comment">// ==UserScript==</span>
<span class="comment">// @name           idn_fixer</span>
<span class="comment">// @namespace      http://jamadam.com/blog/</span>
<span class="comment">// @description    This fixes wrongly percent encoded domains in hrefs.</span>
<span class="comment">// @include        *</span>
<span class="comment">// ==/UserScript==</span>

(<span class="keyword">function</span>() {
var links = <span class="keyword">document</span>.<span class="keyword">getElementsByTagName</span>(<span class="quote">&#39;a&#39;</span>);
<span class="keyword">for</span> (var i = <span class="number">0</span>; i &lt; links.<span class="keyword">length</span>; i++) {
    var pos1 = links[i].<span class="keyword">href</span>.<span class="keyword">indexOf</span>(<span class="quote">&#39;//&#39;</span>, <span class="number">0</span>) + <span class="number">2</span>;
    var pos2 = links[i].<span class="keyword">href</span>.<span class="keyword">indexOf</span>(<span class="quote">&#39;/&#39;</span>, pos1);
    var <span class="keyword">domain</span> = links[i].<span class="keyword">href</span>.<span class="keyword">substr</span>(pos1, pos2 - pos1);
    <span class="keyword">if</span> (<span class="keyword">domain</span>.<span class="keyword">indexOf</span>(<span class="quote">&#39;%&#39;</span>) != -<span class="number">1</span>) {
        links[i].<span class="keyword">href</span> = <span class="keyword">decodeURI</span>(links[i].<span class="keyword">href</span>);
    }
}
})();
</pre>
<p><a href="attach_file/3618_1_idn_fixer.user.js">idn_fixerをインストール</a></p>
<p>初めてのGreasemonkeyスクリプトなので作法とか間違ってるかも知れません。</p>]]>
    </description>
</item>
<item>
	<title>縮.jpに待望の「縮AGAIN」ボタンを搭載</title>
	<link>http://jamadam.com/blog/?b=3610#parent</link>
	<guid>http://jamadam.com/blog/?b=3610#parent</guid>
	<pubDate>Fri, 16 Oct 2009 03:10:00 +0900</pubDate>
	<description>
		<![CDATA[<p>縮.jp。7月に作って放置してたら10月になって話題になった。人生で一番集客した。そんな訳で、ネタを必要以上に膨らませるべく、システムを改修しました。見た目的にはあまり変化ありませんが、中身はほぼ丸々変わってます。特筆すべき変化は。。</p>
<p><strong>待望の「縮AGAIN」ボタンを搭載</strong></p>
<p>生成された短縮URLが気に入らなかった場合、このボタンを押すと別のURLを生成してくれます。なお、縮AGAINした場合、古いURLはしばらくして解放されます。</p>
<p><strong>既設の短縮URLがあれば、短い順にご提案</strong></p>
<p>今までは湯水のように新規作成してましたが、縮ボタンを押した際、まずは既設の短縮URLを提示するようになりました。縮AGEINすると短い順に既設URLが表示され、なくなれば新規作成されます。</p>
<p><strong>転送時、末尾のゴミを可能な限り取り除く</strong></p>
<p>Twitterで<a href="http://縮.jp/上これすげー">http://縮.jp/上これすげー</a>みたいなつぶやきが多発していたので、こういう場合はhttp://縮.jp/上を検知して転送します。Perlでいうと、</p>
<pre class="program_code">
$id =~ s/&yen;P{Han}.*//; 
</pre>
<p>となっています。漢字を表す正規表現なんて初めて知りました。</p>
<p><strong>ちなみに、ファイルベースからPostgresqlに移行</strong></p>
<p>パフォーマンスいいかなと思って、1件1ファイルなどというデータ管理をしてたんですが、IDがシーケンシャルに固定されるとか、逆引きできないとか、色々問題あったのでPostgresqlにしました。なお、ファイルベースのキャッシュの仕組みを導入したので転送時のパフォーマンスは以前と変わらない。はず。</p>
<p><strong>APIにも変更あり</strong></p>
<p>offsetというパラメータが新設されました。これは前述の既設URLの再利用と関連するもので、任意の既設URLを取り出すためのパラメータです。offsetを十分に大きくすると自動的に新規作成されます。<span style="color: rgb(255, 0, 0);">通常は指定しないでください。</span></p>
<p>&nbsp;</p>
<p><strong>既知の問題</strong></p>
<ul>
    <li>元URLがbit.ly等ですでに短縮済みだった場合、iPhoneで転送されない。確かソフトバンクの仕様でiPhoneで多段リダイレクトできない。</li>
    <li>Twitter用のいくつかのGreaseMonkeyスクリプトやアドオンで縮.jpへ飛べない。FirefoxのJavascriptのバグっぽい挙動が原因と思われる。対処法は<a href="./?b=3616">こちら</a></li>
    <li>Twitter周辺サービスで日本語ドメインが誤ってパーセントエンコードされているケースも見かけます。サーバサイドでの処理に問題があるのではないか(憶測)。</li>
    <li>iPhoneの多くのアプリで開けない。おそらくアプリからwebkitだかのAPI的なものに渡すURLをpunycode変換してないのではないか(憶測)。対処法は<a href="http://hmdt.jp/archives/2004_12.html#sec2004121502">こちら</a>の12月15日の記事くらいしか見当たらなかった。</li>
</ul>
<p>&nbsp;</p>
<p><strong>今後の予定<br />
</strong></p>
<ol>
    <li><strike>任意のIDを指定可能に</strike></li>
    <li>不人気文字を避ける仕組み</li>
    <li>元URLがすでに短縮URLだった場合に展開してから短縮</li>
    <li>スパム対策</li>
</ol>
<p>&nbsp;</p>]]>
    </description>
</item>
<item>
	<title>開発小ネタその2(改)</title>
	<link>http://jamadam.com/blog/?b=3617#parent</link>
	<guid>http://jamadam.com/blog/?b=3617#parent</guid>
	<pubDate>Wed, 14 Oct 2009 02:02:56 +0900</pubDate>
	<description>
		<![CDATA[<p><a href="./?b=3615">開発小ネタ集その2</a>のネタ、なんか違和感あると思ったらゼロがなかったんだ。という訳で書き直した。66進数。<a href="http://縮.jp/">縮.jp</a>は差し詰め、1945進数か。</p>
<pre class="program_code"><span class="keyword">use</span> strict;
<span class="keyword">use</span> warnings;

<span class="comment">### 文字リスト</span>
<span class="keyword">our</span> <span class="variable">@ascii</span> = qw(
    <span class="number">0</span> <span class="number">1</span> <span class="number">2</span> <span class="number">3</span> <span class="number">4</span> <span class="number">5</span> <span class="number">6</span> <span class="number">7</span> <span class="number">8</span> <span class="number">9</span>
    a b c d e f g h i j k l m n o p <span class="quote">q r </span>s t u v w x y z
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    _ + - =
);

<span class="keyword">my</span> <span class="variable">$num1</span> = str2num(<span class="wquote">&quot;0&quot;</span>);   <span class="comment">  ### 0</span>
<span class="keyword">my</span> <span class="variable">$num2</span> = str2num(<span class="wquote">&quot;=&quot;</span>);     <span class="comment">### 65</span>
<span class="keyword">my</span> <span class="variable">$num3</span> = str2num(<span class="wquote">&quot;10&quot;</span>);    <span class="comment">### 66</span>
<span class="keyword">my</span> <span class="variable">$num4</span> = str2num(<span class="wquote">&quot;A359&quot;</span>);  <span class="comment">### 10363263</span>
<span class="keyword">my</span> <span class="variable">$str</span> = num2str(<span class="number">10363263</span>); <span class="comment">### A359</span>

<span class="comment">### --------------</span>
<span class="comment">### 文字列を数値に変換</span>
<span class="comment">### --------------</span>
<span class="keyword">sub</span> str2num {

    <span class="keyword">my</span> <span class="variable">$num</span> = <span class="number">0</span>;
    <span class="keyword">my</span> <span class="variable">@id_array</span> = <span class="keyword">split</span>(//, <span class="variable">$_</span>[<span class="number">0</span>]);
    <span class="variable">@id_array</span> = <span class="keyword">reverse</span>(<span class="variable">@id_array</span>);

    <span class="keyword">for</span> (<span class="keyword">my</span> <span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> &lt; <span class="keyword">scalar</span> <span class="variable">@id_array</span>; <span class="variable">$i</span>++) {
        <span class="keyword">for</span> (<span class="keyword">my</span> <span class="variable">$j</span> = <span class="number">0</span>; <span class="variable">$j</span> &lt; <span class="keyword">scalar</span> <span class="variable">@ascii</span>; <span class="variable">$j</span>++) {
            <span class="keyword">if</span> (<span class="variable">$ascii</span>[<span class="variable">$j</span>] eq <span class="variable">$id_array</span>[<span class="variable">$i</span>]) {
                <span class="variable">$num</span> += (<span class="keyword">scalar</span> <span class="variable">@ascii</span> ** <span class="variable">$i</span>) * <span class="variable">$j</span>;
                <span class="keyword">last</span>;
            }
            <span class="keyword">if</span> (<span class="variable">$j</span> == <span class="keyword">scalar</span> <span class="variable">@ascii</span> - <span class="number">1</span>) {
                <span class="keyword">return</span>;
            }
        }
    }

    <span class="keyword">return</span> <span class="variable">$num</span>;
}

<span class="comment">### --------------</span>
<span class="comment">### 数値を文字列に変換</span>
<span class="comment">### --------------</span>
<span class="keyword">sub</span> num2str {

    <span class="keyword">my</span> <span class="variable">$sho</span>     = <span class="keyword">int</span>(<span class="variable">$_</span>[<span class="number">0</span>] / <span class="keyword">scalar</span> <span class="variable">@ascii</span>);
    <span class="keyword">my</span> <span class="variable">$upper</span>   = (<span class="variable">$sho</span> &gt; <span class="number">0</span>) ? <span class="function">&amp;num2str</span>(<span class="variable">$sho</span>) : <span class="wquote">&quot;&quot;</span>;
    <span class="keyword">my</span> <span class="variable">$current</span> = <span class="variable">$ascii</span>[(<span class="variable">$_</span>[<span class="number">0</span>] % <span class="keyword">scalar</span> <span class="variable">@ascii</span>)];
    <span class="keyword">return</span> <span class="variable">$upper</span>. <span class="variable">$current</span>;
}
</pre>]]>
    </description>
</item>

</channel>
</rss>
