<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>taichino.com &#187; javascript</title>
	<atom:link href="http://taichino.com/category/programming/javascript-programming/feed" rel="self" type="application/rss+xml" />
	<link>http://taichino.com</link>
	<description>永遠のネバーランド</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:33:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>[RSAの勉強日記2] Javascriptで暗号化してPythonで復号したい</title>
		<link>http://taichino.com/programming/2667</link>
		<comments>http://taichino.com/programming/2667#comments</comments>
		<pubDate>Sat, 04 Feb 2012 08:21:39 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[pkcs]]></category>
		<category><![CDATA[RSA]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2667</guid>
		<description><![CDATA[先日、RSAについて解った気になったと書いたんですけど、実際はあんまり解ってなかったので補足等。やりたいのはクライアントで暗号化した情報をサーバで受けて復号したいという事ですね。 鍵の生成をサーバで行って公開鍵をJSのコードに埋める JS側で公開鍵を使って暗号化したデータをサーバに送る サーバで受け取ったデータをPythonで復号 単純な話なはずだったんですけど、上手く行かずにハマりました。 結論から書くと、PyCryptoモジュールがPKCS#1で規定されているのパディング/アンパディングに対応してなかったので自前でアンパディング処理を追加したら上手く行ったという事ですが、学習をかねてもう少し詳しく書いておきます。 本エントリ中の公開鍵・秘密鍵は以下のものを使用しています。他の鍵を使った場合は文中の値は異なります。 PRIVATE KEY: p=312812244098101569570522771086507368199 q=261732496899955705693539027437044751693 n=81873129708674556552097159647951377728324724985548367405770094930146879610907 d=61350191904775909756579327908681267205274632675124298948670533913070326529385 e=65537 PUBLIC KEY: n=81873129708674556552097159647951377728324724985548367405770094930146879610907 e=65537 結局コード見るのがはやいです。まずはPython側ですが、PyCryptoから暗号化処理部分の抜粋したコードを以下に示します。 # pubkey.pyから抜粋 def encrypt(self, plaintext, K): &#34;&#34;&#34;encrypt(plaintext:string&#124;long, K:string&#124;long) : tuple Encrypt the string or integer plaintext. K is a random parameter required by some algorithms. &#34;&#34;&#34; wasString=0 if isinstance(plaintext, types.StringType): plaintext=bytes_to_long(plaintext) ; wasString=1 if isinstance(K, types.StringType): [...]]]></description>
			<content:encoded><![CDATA[<p>先日、<a href="http://taichino.com/engineer-life/2647" title="RSAの勉強日記">RSAについて解った気になったと書いた</a>んですけど、実際はあんまり解ってなかったので補足等。やりたいのはクライアントで暗号化した情報をサーバで受けて復号したいという事ですね。</p>
<ol>
<li>鍵の生成をサーバで行って公開鍵をJSのコードに埋める</li>
<li>JS側で公開鍵を使って暗号化したデータをサーバに送る</li>
<li>サーバで受け取ったデータをPythonで復号</li>
</ol>
<p>単純な話なはずだったんですけど、上手く行かずにハマりました。</p>
<p>結論から書くと、<a href="https://www.dlitz.net/software/pycrypto/" title="pycryptoモジュール" target="_blank">PyCryptoモジュール</a>がPKCS#1で規定されているのパディング/アンパディングに対応してなかったので自前でアンパディング処理を追加したら上手く行ったという事ですが、学習をかねてもう少し詳しく書いておきます。</p>
<p><span id="more-2667"></span></p>
<p>本エントリ中の公開鍵・秘密鍵は以下のものを使用しています。他の鍵を使った場合は文中の値は異なります。</p>
<pre class="brush: text; gutter: true; first-line: 1; highlight: []; html-script: false">
PRIVATE KEY:
  p=312812244098101569570522771086507368199
  q=261732496899955705693539027437044751693
  n=81873129708674556552097159647951377728324724985548367405770094930146879610907
  d=61350191904775909756579327908681267205274632675124298948670533913070326529385
  e=65537
PUBLIC KEY:
  n=81873129708674556552097159647951377728324724985548367405770094930146879610907
  e=65537
</pre>
<p>結局コード見るのがはやいです。まずはPython側ですが、PyCryptoから暗号化処理部分の抜粋したコードを以下に示します。</p>
<pre class="brush: python; gutter: true; first-line: 1; highlight: []; html-script: false">
# pubkey.pyから抜粋
def encrypt(self, plaintext, K):
    &quot;&quot;&quot;encrypt(plaintext:string|long, K:string|long) : tuple
    Encrypt the string or integer plaintext.  K is a random
    parameter required by some algorithms.
    &quot;&quot;&quot;
    wasString=0
    if isinstance(plaintext, types.StringType):
        plaintext=bytes_to_long(plaintext) ; wasString=1
    if isinstance(K, types.StringType):
        K=bytes_to_long(K)
    ciphertext=self._encrypt(plaintext, K)
    if wasString: return tuple(map(long_to_bytes, ciphertext))
    else: return ciphertext

# _slowmath.pyから抜粋
def _encrypt(self, m):
    # compute m**d (mod n)
    return pow(m, self.e, self.n)
</pre>
<p>直線的で解りやすいコードですね。理解の為にencrypt関数に&#8221;a&#8221;を一文字だけ入れた場合の暗号化の流れを観察すると以下のようになります。</p>
<pre class="brush: text; gutter: true; first-line: 1; highlight: []; html-script: false">
a
=&gt; bytes_to_long (バイト列を数値に)
97
=&gt; _encrypt (中でpow。これがいわゆる公開鍵による暗号化)
(52050588761940096487735844075636185108122635599049953266504222754946145963317L,)
=&gt; long_to_bytes (数値を再度バイト列に)
(&#039;s\x13\x96\xd7\xd3\xaf\x92\xf2V\xa3]\x1d:;9O3\xd2\x91\xb7;&quot;\x16\xde\xe7\xf5 \x8a\xdd\x1d\xcd5&#039;,)
</pre>
<p>バイト列を数値に直してから公開鍵による暗号化を行い、再度バイト列に直しています。復号時はこれを逆順で行うわけですね。(もちろん暗号化処理は秘密鍵による復号処理になります。)ここまでは僕の理解通りの処理になっていて何の問題もありませんでした。</p>
<p>一方でJavascriptで行われていた処理を見てみます。ライブラリは<a href="https://ziyan.info/2008/10/javascript-rsa/" title="RSA module with pure Javascript" target="_blank">コチラのrsa.js</a>を使わせて頂いています。色々検索した結果pemをロードできるのはこれしか見つかりませんでした。下記に対応する部分のコードを抜粋します。</p>
<pre class="brush: javascript; gutter: true; first-line: 1; highlight: []; html-script: false">
encrypt: function($data, $pubkey) {
    if (!$pubkey) return false;
    $data = this.pkcs1pad2($data,($pubkey.modulus.bitLength()+7)&gt;&gt;3);
    if(!$data) return false;
    $data = $data.modPowInt($pubkey.encryptionExponent, $pubkey.modulus);
    if(!$data) return false;
    $data = $data.toString(16);
    $data = Hex.decode($data);
    return Base64.encode($data);
},
pkcs1pad2: function($data, $keysize) {
    if($keysize &lt; $data.length + 11)
        return null;
    var $buffer = [];
    var $i = $data.length - 1;
    while($i &gt;= 0 &amp;&amp; $keysize &gt; 0)
        $buffer[--$keysize] = $data.charCodeAt($i--);
    $buffer[--$keysize] = 0;
    while($keysize &gt; 2)
        $buffer[--$keysize] = Math.floor(Math.random()*254) + 1;
    $buffer[--$keysize] = 2;
    $buffer[--$keysize] = 0;
    return new BigInteger($buffer);
}
</pre>
<p>encrypt関数の冒頭で既に様子が違います。暗号化する前の元のデータにpkcs1pad2とかいう謎の処理をかませて、データが変更されています。そしてpkcs1pad2の関数を見ても何をやっているのか全然解りません。関数名からパディングでもやってんのかな位しかわかりません。わずかな希望を胸に、データの暗号化の流れを見てみます。</p>
<pre class="brush: text; gutter: true; first-line: 1; highlight: []; html-script: false">
a
=&gt; pkcs1pad2 (パディング)
3758866564912349439687065567220758327058221768110629839398887525335105633
=&gt; modPowInt (公開鍵暗号化)
14633336708515644111578124792772238970855809995718279846212374275613915803829
=&gt; toString(16)
205a2cd13e395895de49814ec6f9c424f4622f1ffa722f1c88ee23aa521af0b5
=&gt; Hex.decode
バイト列(HTMLで上手く表示できません)
=&gt; Base64.encode
IFos0T45WJXeSYFOxvnEJPRiLx/6ci8ciO4jqlIa8LU=
</pre>
<p>もしかしたらデータは一致するかもという希望は失われました。全然違ったデータになっていますね。困りましたね。要は一口にRSA暗号化といっても、実装によって暗号化・復号処理以外の部分で、データの扱いに違いがあって必ずしも相互にデータを受け渡せるとは限らないという事ですね。</p>
<p>仕方が無いのでpkcs1pad2関数について調べてみると、PKCSというのは<a href="http://ja.wikipedia.org/wiki/PKCS" title="pkcs in wikpedia" target="_blank">Public-Key Cryptography Standards</a>の略で、公開鍵暗号の分野のRFCのようなもののようです。そしてpkcs1というのはPKCS#1のことで、特定の標準仕様を指していて、この中でパディングの方法についても規定されています。</p>
<p>んじゃあ、このPKCSってどの位採用されてんの？と思うわけですが、ざっと調べた感じ事実上デファクトで、perlやrubyのモジュールでは当然のように対応されています。何故かPythonのPyCryptoだけ対応してないという話のようです。</p>
<p>ちょっと調べてみると<a href="http://kfalck.net/2011/03/07/decoding-pkcs1-padding-in-python" title="PyCryptoでPKCS#1を復号" target="_blank">PyCryptoでPKCS#1のデータ復号するときはこうしろという記事</a>が見つかったので、解決しました。まとめがてらPyCryptoでrsa.jsで暗号化したデータを復号する処理を書いておきます。</p>
<pre class="brush: python; gutter: true; first-line: 1; highlight: []; html-script: false">
import Crypto
from Crypto.PublicKey import RSA
import base64

def pkcs1_unpad(text):
    if len(text) &gt; 0 and text[0] == &#039;\x02&#039;:
        # Find end of padding marked by nul
        pos = text.find(&#039;\x00&#039;)
        if pos &gt; 0:
            return text[pos+1:]
    return None

priv = RSA.importKey(open(&#039;priv.pem&#039;, &#039;r&#039;).read())
data = &#039;aoNFe/Y/Nae0wmeY1DUuMTP4bDe4Tib0/fQZynL7UFc=&#039; # encrypted data from js with base 64 encoded
data = base64.b64decode(data)
data = priv.decrypt(data)
data = pkcs1_unpad(data)    # a
</pre>
<p>以上で、Javascriptで暗号化したデータをPythonで復号できました。○○暗号化と一口に言っても実装によって差異があるというのが解って、まぁ良かったと言えば良かったです。PyCryptoでも早く対応して欲しいところです。あと、pkcs1pad2の&#8221;2&#8243;が何を意味しているのか解らないので、誰か知ってたら教えてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/2667/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LiveTopHatenarをChrome Extensionに移植してみた</title>
		<link>http://taichino.com/programming/1709</link>
		<comments>http://taichino.com/programming/1709#comments</comments>
		<pubDate>Fri, 09 Apr 2010 23:00:49 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[chrome extension]]></category>
		<category><![CDATA[livetophatenar]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1709</guid>
		<description><![CDATA[Chrome Extensions TechTalkのUstreamを見ていて、僕も作りたくなったので、去年作ったFirefoxプラグインのLiveTopHatenarを移植してみました。 HTMLとJavasciptで組んで行くので、雰囲気としてはFirefoxの拡張機能と同じ感じで作れますが、Firefoxの拡張機能を作るより断然作り易かったです。特にFirefoxではソースを修正する度にブラウザ再起動という酷い状態だったのが、Chromeでは開発中モジュールの単体リロードが可能だったので非常に助かりました。 また公式ドキュメントの質が良くて、チュートリアルを10分くらいすれば、おおよその雰囲気が掴めて、開発を開始できました。しかも覚える事が少ないので取っ付き易いです。 本拡張機能のプロジェクト一式の構造は以下のようになっています。アイコンファイルを除けばmanifest.jsonとpopup.htmlの２ファイルのみです。 $ tree `--- livetophatenar &#124;-- icon.png &#124;-- icon128.png &#124;-- icon48.png &#124;-- manifest.json # 拡張機能の設定ファイル `-- popup.html # 拡張機能本体 manifest.jsonはfirefox拡張機能でいうところのinstall.rdfで、バージョンや概要などのメタ情報からプラグインの動作概要まで定義されています。install.rdfに比べるとJSONフォーマットなので非常に見通しが良いですね。 &#123; &#34;name&#34;: &#34;LiveTopHatenar&#34;, &#34;version&#34;: &#34;0.1&#34;, &#34;icons&#34; : &#123; &#34;48&#34; : &#34;icon48.png&#34;, &#34;128&#34;: &#34;icon128.png&#34; &#125;, &#34;description&#34;: &#34;LiveTopHatenar provides TopHatenar's score of current page&#34;, &#34;browser_action&#34;: &#123; &#34;default_icon&#34;: &#34;icon.png&#34;, &#34;popup&#34; : &#34;popup.html&#34; &#125;, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://groups.google.co.jp/group/chromium-extensions-japan/web/chrome-extension-techtalk?pli=1">Chrome Extensions TechTalk</a>のUstreamを見ていて、僕も作りたくなったので、去年作ったFirefoxプラグインの<a href="https://addons.mozilla.org/ja/firefox/addon/45574">LiveTopHatenar</a>を移植してみました。</p>
<p><a href="http://taichino.com/wp-content/uploads/2010/04/Picture-32.png"><img src="http://taichino.com/wp-content/uploads/2010/04/Picture-32.png" alt="Chrome LiveTopHatenar Capture Image" title="Chrome LiveTopHatenar" width="234" height="141" class="alignnone size-full wp-image-1710" /></a></p>
<p><span id="more-1709"></span></p>
<p>HTMLとJavasciptで組んで行くので、雰囲気としてはFirefoxの拡張機能と同じ感じで作れますが、Firefoxの拡張機能を作るより断然作り易かったです。特にFirefoxではソースを修正する度にブラウザ再起動という酷い状態だったのが、Chromeでは開発中モジュールの単体リロードが可能だったので非常に助かりました。</p>
<p>また<a href="http://code.google.com/chrome/extensions/getstarted.html">公式ドキュメント</a>の質が良くて、チュートリアルを10分くらいすれば、おおよその雰囲気が掴めて、開発を開始できました。しかも覚える事が少ないので取っ付き易いです。</p>
<p>本拡張機能のプロジェクト一式の構造は以下のようになっています。アイコンファイルを除けばmanifest.jsonとpopup.htmlの２ファイルのみです。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">tree</span>
<span style="color: #000000; font-weight: bold;">`</span>--- livetophatenar
   <span style="color: #000000; font-weight: bold;">|</span>-- icon.png
   <span style="color: #000000; font-weight: bold;">|</span>-- icon128.png
   <span style="color: #000000; font-weight: bold;">|</span>-- icon48.png
   <span style="color: #000000; font-weight: bold;">|</span>-- manifest.json     <span style="color: #666666; font-style: italic;"># 拡張機能の設定ファイル</span>
   <span style="color: #000000; font-weight: bold;">`</span>-- popup.html        <span style="color: #666666; font-style: italic;"># 拡張機能本体</span></pre></div></div>

<p>manifest.jsonはfirefox拡張機能でいうところのinstall.rdfで、バージョンや概要などのメタ情報からプラグインの動作概要まで定義されています。install.rdfに比べるとJSONフォーマットなので非常に見通しが良いですね。</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: black;">&#123;</span>
  <span style="color: #483d8b;">&quot;name&quot;</span>: <span style="color: #483d8b;">&quot;LiveTopHatenar&quot;</span>,
  <span style="color: #483d8b;">&quot;version&quot;</span>: <span style="color: #483d8b;">&quot;0.1&quot;</span>,
  <span style="color: #483d8b;">&quot;icons&quot;</span> : <span style="color: black;">&#123;</span>
    <span style="color: #483d8b;">&quot;48&quot;</span> : <span style="color: #483d8b;">&quot;icon48.png&quot;</span>,
    <span style="color: #483d8b;">&quot;128&quot;</span>: <span style="color: #483d8b;">&quot;icon128.png&quot;</span>
  <span style="color: black;">&#125;</span>,
  <span style="color: #483d8b;">&quot;description&quot;</span>: <span style="color: #483d8b;">&quot;LiveTopHatenar provides TopHatenar's score of current page&quot;</span>,
  <span style="color: #483d8b;">&quot;browser_action&quot;</span>: <span style="color: black;">&#123;</span>
    <span style="color: #483d8b;">&quot;default_icon&quot;</span>: <span style="color: #483d8b;">&quot;icon.png&quot;</span>,
    <span style="color: #483d8b;">&quot;popup&quot;</span>       : <span style="color: #483d8b;">&quot;popup.html&quot;</span>
  <span style="color: black;">&#125;</span>,
  <span style="color: #483d8b;">&quot;permissions&quot;</span>: <span style="color: black;">&#91;</span>
    <span style="color: #483d8b;">&quot;tabs&quot;</span>,
    <span style="color: #483d8b;">&quot;http://tophatenar.com/&quot;</span>
  <span style="color: black;">&#93;</span>
<span style="color: black;">&#125;</span></pre></div></div>

<p>popup.htmlは拡張機能の本体で、firefoxの元と同様に現在のURLでTopHatenarにリクエストを投げてレスポンスを解析して結果を表示しています。ここでは省略します。以上、簡単なので暇つぶしにでも何か作ってみたら良いと思います！</p>
<p>というわけで<a href="https://chrome.google.com/extensions/detail/hiddkidjlljaaahdhcodeoealcfidgne">インストールはコチラ</a>から。ソースコードは<a href="http://github.com/taichino/livetophatenar">github</a>から。</p>
<p>これで一応firefoxとchromeの拡張機能が作れるようになりました。実は作りたい拡張機能あって習得したわけですが、中々重い腰をあげれません。。頑張らねば。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1709/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>pythonとperlとphpとas3とjavascriptで日時計算</title>
		<link>http://taichino.com/programming/794</link>
		<comments>http://taichino.com/programming/794#comments</comments>
		<pubDate>Mon, 10 Aug 2009 14:08:32 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[actionscript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[日時計算]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=794</guid>
		<description><![CDATA[各言語でスニペットのまとめエントリ第2段は日時計算です。日時データは表現方法が様々なため、必要なデータ形式にデータを変換するのが覚えれなくてイライラしますね。そこで以下の3つの表現を相互に変換するスニペットを書きました。 日時オブジェクト フォーマットされた文字列 unixタイムスタンプ(1970-01-01 00:00:00 UTC からの経過秒数) python pythonはdatetimeを使います。また日付計算はtimedeltaでオフセットを表現します。 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 #!/usr/bin/python # -*- coding: utf-8 -*- &#160; import time from datetime import datetime, timedelta [...]]]></description>
			<content:encoded><![CDATA[<p>各言語でスニペットのまとめエントリ第2段は日時計算です。日時データは表現方法が様々なため、必要なデータ形式にデータを変換するのが覚えれなくてイライラしますね。そこで以下の3つの表現を相互に変換するスニペットを書きました。</p>
<ul>
<li>日時オブジェクト</li>
<li>フォーマットされた文字列</li>
<li>unixタイムスタンプ(1970-01-01 00:00:00 UTC からの経過秒数)</li>
</ul>
<p><span id="more-794"></span></p>
<p><strong>python</strong><br />
pythonはdatetimeを使います。また日付計算はtimedeltaでオフセットを表現します。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">datetime</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>, timedelta
&nbsp;
<span style="color: #808080; font-style: italic;"># obj, text, timestamp(time)の相互変換</span>
format = <span style="color: #483d8b;">'%Y-%m-%d %H:%M:%S'</span>
orig   = <span style="color: #dc143c;">datetime</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2009</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">10</span>, <span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">53</span>, <span style="color: #ff4500;">30</span><span style="color: black;">&#41;</span>
text1  = orig.<span style="color: black;">isoformat</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">' '</span><span style="color: black;">&#41;</span>                          <span style="color: #808080; font-style: italic;"># obj  =&gt; txt</span>
date1  = <span style="color: #dc143c;">datetime</span>.<span style="color: black;">strptime</span><span style="color: black;">&#40;</span>text1, format<span style="color: black;">&#41;</span>             <span style="color: #808080; font-style: italic;"># txt  =&gt; obj</span>
time1  = <span style="color: #dc143c;">time</span>.<span style="color: black;">mktime</span><span style="color: black;">&#40;</span>date1.<span style="color: black;">timetuple</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>               <span style="color: #808080; font-style: italic;"># obj  =&gt; time</span>
date2  = <span style="color: #dc143c;">datetime</span>.<span style="color: black;">fromtimestamp</span><span style="color: black;">&#40;</span>time1<span style="color: black;">&#41;</span>                <span style="color: #808080; font-style: italic;"># time =&gt; obj</span>
time2  = <span style="color: #dc143c;">time</span>.<span style="color: black;">mktime</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">time</span>.<span style="color: black;">strptime</span><span style="color: black;">&#40;</span>text1, format<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>    <span style="color: #808080; font-style: italic;"># txt  =&gt; time</span>
text2  = <span style="color: #dc143c;">datetime</span>.<span style="color: black;">fromtimestamp</span><span style="color: black;">&#40;</span>time2<span style="color: black;">&#41;</span>.<span style="color: black;">isoformat</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">' '</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># time =&gt; txt (obj経由)</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> orig
<span style="color: #ff7700;font-weight:bold;">print</span> date2
<span style="color: #ff7700;font-weight:bold;">print</span> text2
<span style="color: #ff7700;font-weight:bold;">print</span> time2
&nbsp;
<span style="color: #808080; font-style: italic;"># 現在時刻</span>
now = <span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> now
&nbsp;
<span style="color: #808080; font-style: italic;"># 日時計算</span>
one_hour_later    = now + timedelta<span style="color: black;">&#40;</span>hours = <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># 1時間後</span>
two_days_later    = now + timedelta<span style="color: black;">&#40;</span>days  = <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># 2日後</span>
three_weeks_later = now + timedelta<span style="color: black;">&#40;</span>weeks = <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># 3週間後</span>
<span style="color: #ff7700;font-weight:bold;">print</span> one_hour_later
<span style="color: #ff7700;font-weight:bold;">print</span> two_days_later
<span style="color: #ff7700;font-weight:bold;">print</span> three_weeks_later</pre></td></tr></table></div>

<p><strong>perl</strong><br />
perlはDateTimeオブジェクト。DateTimeオブジェクトはかなり強力ですが、文字列フォーマットを扱えないのが残念です。ここでは日付文字列を扱うのにDateTime::Format::Strptimeを使ってみました。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> DateTime<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> DateTime<span style="color: #339933;">::</span><span style="color: #006600;">Format</span><span style="color: #339933;">::</span><span style="color: #006600;">Strptime</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># obj, text, timestampの相互変換</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$format</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'%Y-%m-%d %H:%M:%S'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$parser</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #339933;">::</span><span style="color: #006600;">Format</span><span style="color: #339933;">::</span><span style="color: #006600;">Strptime</span><span style="color: #009900;">&#40;</span>pattern <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$format</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$orig</span>   <span style="color: #339933;">=</span> DateTime<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>year <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2009</span><span style="color: #339933;">,</span> month <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span> day <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span>
                           hour <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">14</span><span style="color: #339933;">,</span> minute <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">53</span><span style="color: #339933;">,</span> second <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$text1</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">$orig</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">strftime</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$format</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                                 <span style="color: #666666; font-style: italic;"># obj  =&gt; txt</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$date1</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">$parser</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">parse_datetime</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$text1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                          <span style="color: #666666; font-style: italic;"># txt  =&gt; obj</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$time1</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">$date1</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">epoch</span><span style="color: #339933;">;</span>                                            <span style="color: #666666; font-style: italic;"># obj  =&gt; time</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$date2</span>  <span style="color: #339933;">=</span> DateTime<span style="color: #339933;">-&gt;</span><span style="color: #006600;">from_epoch</span><span style="color: #009900;">&#40;</span>epoch <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$time1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                    <span style="color: #666666; font-style: italic;"># time =&gt; obj</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$time2</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">$parser</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">parse_datetime</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$text1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">epoch</span><span style="color: #339933;">;</span>                   <span style="color: #666666; font-style: italic;"># txt  =&gt; time (obj経由)</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$text2</span>  <span style="color: #339933;">=</span> DateTime<span style="color: #339933;">-&gt;</span><span style="color: #006600;">from_epoch</span><span style="color: #009900;">&#40;</span>epoch <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$time2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">strftime</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$format</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># time =&gt; txt  (obj経由)</span>
&nbsp;
say <span style="color: #0000ff;">$orig</span><span style="color: #339933;">;</span>
say <span style="color: #0000ff;">$date2</span><span style="color: #339933;">;</span>
say <span style="color: #0000ff;">$time2</span><span style="color: #339933;">;</span>
say <span style="color: #0000ff;">$text2</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 現在時刻</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$now</span> <span style="color: #339933;">=</span> DateTime<span style="color: #339933;">-&gt;</span><span style="color: #006600;">now</span><span style="color: #339933;">;</span>
say <span style="color: #0000ff;">$now</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 日時計算</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$one_hour_later</span>    <span style="color: #339933;">=</span> <span style="color: #0000ff;">$now</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">add</span><span style="color: #009900;">&#40;</span>hours <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$two_days_later</span>    <span style="color: #339933;">=</span> <span style="color: #0000ff;">$now</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">add</span><span style="color: #009900;">&#40;</span>days  <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$three_weeks_later</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$now</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">add</span><span style="color: #009900;">&#40;</span>weeks <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
say <span style="color: #0000ff;">$one_hour_later</span><span style="color: #339933;">;</span>
say <span style="color: #0000ff;">$two_days_later</span><span style="color: #339933;">;</span>
say <span style="color: #0000ff;">$three_weeks_later</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>php</strong><br />
phpでの処理の特徴は、他の言語が中心に日付オブジェクトがあるのに対して、phpでは中心に日付文字列がある事ですね。文字列に対する各種処理が豊富にそろっています。あと関係ないですが、改行付きのprintがあればもっとすっきりするのにと思います。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/php
</span><span style="color: #339933;">&lt;</span> ?php
<span style="color: #666666; font-style: italic;"># obj, text, timestamp(time)の相互変換
</span><span style="color: #000088;">$format</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Y-m-d H:i:s'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$orig</span>  <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'2009-08-10 14:53:30'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$text1</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$orig</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                <span style="color: #666666; font-style: italic;"># obj  =&gt; txt
</span><span style="color: #000088;">$date1</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #000088;">$text1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                  <span style="color: #666666; font-style: italic;"># txt  =&gt; obj
</span><span style="color: #000088;">$time1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtotime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$date1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #666666; font-style: italic;"># obj  =&gt; time (txt経由)
</span><span style="color: #000088;">$date2</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #339933;">,</span> <span style="color: #000088;">$time1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># time =&gt; obj  (txt経由)
</span><span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$y</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$h</span><span style="color: #339933;">,</span> <span style="color: #000088;">$mi</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sscanf</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$text1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%d</span>-<span style="color: #009933; font-weight: bold;">%d</span>-<span style="color: #009933; font-weight: bold;">%d</span> <span style="color: #009933; font-weight: bold;">%d</span>:<span style="color: #009933; font-weight: bold;">%d</span>:<span style="color: #009933; font-weight: bold;">%d</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$time2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mktime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$h</span><span style="color: #339933;">,</span> <span style="color: #000088;">$mi</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s</span><span style="color: #339933;">,</span> <span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$d</span><span style="color: #339933;">,</span> <span style="color: #000088;">$y</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>       <span style="color: #666666; font-style: italic;"># text =&gt; time
</span><span style="color: #000088;">$text2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #339933;">,</span> <span style="color: #000088;">$time2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                 <span style="color: #666666; font-style: italic;"># time =&gt; text
</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$orig</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$date2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$text2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$time2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 現在時刻
</span><span style="color: #000088;">$now</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateTime<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$now</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 日時計算
</span><span style="color: #000088;">$one_hour_later</span>    <span style="color: #339933;">=</span> clone <span style="color: #000088;">$now</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$one_hour_later</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">modify</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'+1 hour'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># '+1 hour +2 day ...'
</span><span style="color: #000088;">$two_days_later</span>    <span style="color: #339933;">=</span> clone <span style="color: #000088;">$now</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$two_days_later</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">modify</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'+2 days'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$three_weeks_later</span> <span style="color: #339933;">=</span> clone <span style="color: #000088;">$now</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$three_weeks_later</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">modify</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'+3 weeks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$one_hour_later</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span>    <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$two_days_later</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span>    <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$three_weeks_later</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p><strong>as3</strong><br />
as3はDateオブジェクトを使用します。コンストラクタが強力でオブジェクトだろうが、文字列だろうが、タイムスタンプだろうが何でも取ります。一方で日付の計算をミリ秒単位に変換して行わないと行けないのが大変です。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span><span style="color: #000066; font-weight: bold;">.*;</span>
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> DatetimeTest <span style="color: #0033ff; font-weight: bold;">extends</span> <span style="color: #004993;">Sprite</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #339966; font-weight: bold;">function</span> DatetimeTest<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            <span style="color: #009900; font-style: italic;">// obj, text, timestamp(time)の相互変換</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> orig<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Date</span>    = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight:bold;">2009</span><span style="color: #000066; font-weight: bold;">,</span> <span style="color: #000000; font-weight:bold;">8</span><span style="color: #000066; font-weight: bold;">,</span> <span style="color: #000000; font-weight:bold;">10</span><span style="color: #000066; font-weight: bold;">,</span> <span style="color: #000000; font-weight:bold;">14</span><span style="color: #000066; font-weight: bold;">,</span> <span style="color: #000000; font-weight:bold;">53</span><span style="color: #000066; font-weight: bold;">,</span> <span style="color: #000000; font-weight:bold;">30</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> text1<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">String</span> = orig<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>               <span style="color: #009900; font-style: italic;">// obj  =&gt; txt</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> date1<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Date</span>   = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span>text1<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>               <span style="color: #009900; font-style: italic;">// txt  =&gt; obj</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> time1<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = date1<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">getTime</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>               <span style="color: #009900; font-style: italic;">// obj  =&gt; time</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> date2<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Date</span>   = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span>time1<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>               <span style="color: #009900; font-style: italic;">// time =&gt; obj</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> time2<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = <span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span>text1<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">getTime</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>   <span style="color: #009900; font-style: italic;">// txt  =&gt; time (obj経由)</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> text2<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span>time2<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>  <span style="color: #009900; font-style: italic;">// time =&gt; txt  (obj経由)</span>
&nbsp;
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>orig<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>date2<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>text2<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>time2<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
            <span style="color: #009900; font-style: italic;">// 現在時刻</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> now<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Date</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>now<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
            <span style="color: #009900; font-style: italic;">// 日時計算</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> one_hour_later<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Date</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span>now<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            one_hour_later<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">setTime</span><span style="color: #000000;">&#40;</span>one_hour_later<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">getTime</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">60</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">60</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">1000</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>              <span style="color: #009900; font-style: italic;">// 1時間後</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> two_days_later<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Date</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span>now<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            two_days_later<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">setTime</span><span style="color: #000000;">&#40;</span>two_days_later<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">getTime</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">2</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">24</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">60</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">60</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">1000</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>         <span style="color: #009900; font-style: italic;">// 2日後</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> three_weeks_later<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Date</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span>now<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            three_weeks_later<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">setTime</span><span style="color: #000000;">&#40;</span>three_weeks_later<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">getTime</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">3</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">7</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">24</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">60</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">60</span><span style="color: #000066; font-weight: bold;">*</span><span style="color: #000000; font-weight:bold;">1000</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span> <span style="color: #009900; font-style: italic;">// 3週間後</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>one_hour_later<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>two_days_later<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>three_weeks_later<span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p><strong>javascript</strong><br />
as3とjavascriptがこんなに似ているとは思いませんでした。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; 
          &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;datetime test&lt;/title&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;jquery-1.3.2.js&quot;&gt;&lt;/script&gt;
    <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
      $<span style="color: #009900;">&#40;</span>
          <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #006600; font-style: italic;">// obj, text, timestampの相互変換</span>
              <span style="color: #003366; font-weight: bold;">var</span> orig  <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2009</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">8</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">14</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">53</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              <span style="color: #003366; font-weight: bold;">var</span> text1 <span style="color: #339933;">=</span> orig.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                <span style="color: #006600; font-style: italic;">// obj  =&gt; txt</span>
              <span style="color: #003366; font-weight: bold;">var</span> date1 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span>text1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                <span style="color: #006600; font-style: italic;">// txt  =&gt; obj</span>
              <span style="color: #003366; font-weight: bold;">var</span> time1 <span style="color: #339933;">=</span> date1.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                <span style="color: #006600; font-style: italic;">// obj  =&gt; time</span>
              <span style="color: #003366; font-weight: bold;">var</span> date2 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span>time1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                <span style="color: #006600; font-style: italic;">// time =&gt; obj</span>
              <span style="color: #003366; font-weight: bold;">var</span> time2 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span>text1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>    <span style="color: #006600; font-style: italic;">// txt  =&gt; time (obj経由)</span>
              <span style="color: #003366; font-weight: bold;">var</span> text2 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span>time2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #006600; font-style: italic;">// time =&gt; txt  (obj経由)</span>
              <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>text1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>date2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>text2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>time2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
              <span style="color: #006600; font-style: italic;">// 現在時刻</span>
              <span style="color: #003366; font-weight: bold;">var</span> now <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>now<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
              <span style="color: #006600; font-style: italic;">// 日時計算</span>
              <span style="color: #003366; font-weight: bold;">var</span> one_hour_later <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span>now<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              one_hour_later.<span style="color: #660066;">setTime</span><span style="color: #009900;">&#40;</span>one_hour_later.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">60</span><span style="color: #339933;">*</span><span style="color: #CC0000;">60</span><span style="color: #339933;">*</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>              <span style="color: #006600; font-style: italic;">// 1時間後</span>
              <span style="color: #003366; font-weight: bold;">var</span> two_days_later <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span>now<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              two_days_later.<span style="color: #660066;">setTime</span><span style="color: #009900;">&#40;</span>two_days_later.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">*</span><span style="color: #CC0000;">24</span><span style="color: #339933;">*</span><span style="color: #CC0000;">60</span><span style="color: #339933;">*</span><span style="color: #CC0000;">60</span><span style="color: #339933;">*</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>         <span style="color: #006600; font-style: italic;">// 2日後</span>
              <span style="color: #003366; font-weight: bold;">var</span> three_weeks_later <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span>now<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              three_weeks_later.<span style="color: #660066;">setTime</span><span style="color: #009900;">&#40;</span>three_weeks_later.<span style="color: #660066;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">*</span><span style="color: #CC0000;">7</span><span style="color: #339933;">*</span><span style="color: #CC0000;">24</span><span style="color: #339933;">*</span><span style="color: #CC0000;">60</span><span style="color: #339933;">*</span><span style="color: #CC0000;">60</span><span style="color: #339933;">*</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// 3週間後</span>
              <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>one_hour_later<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>two_days_later<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>three_weeks_later<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
      <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
  &lt;/head&gt;
  &lt;body&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p><strong>まとめ</strong><br />
最近pythonを使い始めて肩入れしている気はしますが，pythonが一番綺麗です。timedeltaオブジェクトがあるのが素晴しいですね。どの言語でも、変換の中心になる形式があるので、その形式を押さえる事が重要そうですね。各言語とも特に不自由はありませんが、as3とjavascriptは日時計算が若干やりにくいので、やはりクライアントサイドは基本的にビューアとして考えるのがいいのかなと思いました。飛躍しましたか。そうですか。あとphpは一々惜しい印象。幾つかシンタックスシュガーを用意したら結構使い易くなるんじゃないかと思います。</p>
<p><strong>おまけのMySQL</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">2009</span><span style="color: #66cc66;">-</span>08<span style="color: #66cc66;">-</span>06 <span style="color: #cc66cc;">12</span>:08:<span style="color: #cc66cc;">55</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> UNIX_TIMESTAMP<span style="color: #66cc66;">&#40;</span>NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-----------------------+</span>
<span style="color: #66cc66;">|</span>            <span style="color: #cc66cc;">1249528147</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-----------------------+</span>
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> FROM_UNIXTIME<span style="color: #66cc66;">&#40;</span>UNIX_TIMESTAMP<span style="color: #66cc66;">&#40;</span>NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">--------------------------------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">2009</span><span style="color: #66cc66;">-</span>08<span style="color: #66cc66;">-</span>06 <span style="color: #cc66cc;">12</span>:09:<span style="color: #cc66cc;">31</span>                  <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">--------------------------------------+</span></pre></td></tr></table></div>

<p>覚えにくいんですが、UNIX_TIMESTAMPとFROM_UNIXTIMEを使えると結構便利だと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/794/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>pythonとperlとphpとas3とjavascriptでJSON</title>
		<link>http://taichino.com/programming/778</link>
		<comments>http://taichino.com/programming/778#comments</comments>
		<pubDate>Sun, 09 Aug 2009 01:50:39 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[actionscript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=778</guid>
		<description><![CDATA[扱う言語が多くなってきて、特定の処理を思い出せずにイライラする事が頻発しています。そこで自分が使う各言語でスニペット付きでまとめる事にしました。第一弾はJSONの扱いです。連想配列をJSONにencodeして、再度decodeという基本的な流れを書きました。 python 2.6系だとJSONが標準で組み込まれてるらしいんですが、手元は2.5系なのでsimplejsonを使っています。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/usr/bin/python # -*- coding: utf-8 -*- import sys, codecs sys.stdout = codecs.getwriter&#40;'utf_8'&#41;&#40;sys.stdout&#41; &#160; import simplejson &#160; data = &#123; 'items':&#91; &#123;'name':'iPhone', 'price':50000&#125;, &#123;'name':'macbook', 'price':100000&#125;, &#123;'name':&#34;マクド&#34;, 'price':100&#125;, &#93;&#125; text = simplejson.dumps&#40;data&#41; # encode [...]]]></description>
			<content:encoded><![CDATA[<p>扱う言語が多くなってきて、特定の処理を思い出せずにイライラする事が頻発しています。そこで自分が使う各言語でスニペット付きでまとめる事にしました。第一弾はJSONの扱いです。連想配列をJSONにencodeして、再度decodeという基本的な流れを書きました。</p>
<p><span id="more-778"></span></p>
<p><strong>python</strong><br />
2.6系だとJSONが標準で組み込まれてるらしいんですが、手元は2.5系なので<a href="http://pypi.python.org/pypi/simplejson">simplejson</a>を使っています。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">codecs</span>
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span> = <span style="color: #dc143c;">codecs</span>.<span style="color: black;">getwriter</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf_8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> simplejson
&nbsp;
data = <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'items'</span>:<span style="color: black;">&#91;</span>
  <span style="color: black;">&#123;</span><span style="color: #483d8b;">'name'</span>:<span style="color: #483d8b;">'iPhone'</span>,  <span style="color: #483d8b;">'price'</span>:<span style="color: #ff4500;">50000</span><span style="color: black;">&#125;</span>,
  <span style="color: black;">&#123;</span><span style="color: #483d8b;">'name'</span>:<span style="color: #483d8b;">'macbook'</span>, <span style="color: #483d8b;">'price'</span>:<span style="color: #ff4500;">100000</span><span style="color: black;">&#125;</span>,
  <span style="color: black;">&#123;</span><span style="color: #483d8b;">'name'</span>:<span style="color: #483d8b;">&quot;マクド&quot;</span>,  <span style="color: #483d8b;">'price'</span>:<span style="color: #ff4500;">100</span><span style="color: black;">&#125;</span>,
<span style="color: black;">&#93;</span><span style="color: black;">&#125;</span>
text = simplejson.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># encode</span>
<span style="color: #dc143c;">copy</span> = simplejson.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>text<span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># decode</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;data = &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;text = &quot;</span> + text
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;copy = &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">copy</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> item <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">copy</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'items'</span><span style="color: black;">&#93;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> item<span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;name&quot;</span><span style="color: black;">&#93;</span></pre></td></tr></table></div>

<p><strong>perl</strong><br />
perlはJSON.pm。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dump</span> <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">dump</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> JSON<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$data</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'items'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span>
  <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'iPhone'</span><span style="color: #339933;">,</span>  <span style="color: #ff0000;">'price'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">50000</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
  <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'macbook'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'price'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">100000</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
  <span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'マクド'</span><span style="color: #339933;">,</span>  <span style="color: #ff0000;">'price'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>               
<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$text</span> <span style="color: #339933;">=</span> encode_json<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$copy</span> <span style="color: #339933;">=</span> decode_json<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;data = &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000066;">dump</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;text = &quot;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">$text</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;copy = &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000066;">dump</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$copy</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$item</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span><span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">$copy</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">&quot;items&quot;</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">print</span> <span style="color: #0000ff;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">&quot;name&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><strong>php</strong><br />
phpは5.2系以降で標準でphp-jsonライブラリが組み込まれているようです。それ以前の場合はpeclで別途インストールします。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/php
</span><span style="color: #339933;">&lt;</span> ?php
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'items'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'iPhone'</span><span style="color: #339933;">,</span>  <span style="color: #0000ff;">'price'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">50000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'macbook'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'price'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">100000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'マクド'</span><span style="color: #339933;">,</span>  <span style="color: #0000ff;">'price'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$text</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$copy</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$text</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$copy</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$copy</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;items&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">print</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;name&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p><strong>as3</strong><br />
as3では<a href="http://code.google.com/p/as3corelib/">as3corelib</a>を使います。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span> <span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span><span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">Sprite</span><span style="color: #000066; font-weight: bold;">;</span>
    <span style="color: #0033ff; font-weight: bold;">import</span> com<span style="color: #000066; font-weight: bold;">.</span>adobe<span style="color: #000066; font-weight: bold;">.</span>serialization<span style="color: #000066; font-weight: bold;">.</span>json<span style="color: #000066; font-weight: bold;">.</span>JSON<span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> JsonTest <span style="color: #0033ff; font-weight: bold;">extends</span> <span style="color: #004993;">Sprite</span> <span style="color: #000000;">&#123;</span>
        <span style="color: #339966; font-weight: bold;">function</span> JsonTest<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">data</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Object</span> = <span style="color: #000000;">&#123;</span>
                items<span style="color: #000066; font-weight: bold;">:</span> <span style="color: #000000;">&#91;</span>
                    <span style="color: #000000;">&#123;</span> <span style="color: #004993;">name</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #990000;">&quot;iPhone&quot;</span><span style="color: #000066; font-weight: bold;">,</span>  price<span style="color: #000066; font-weight: bold;">:</span><span style="color: #000000; font-weight:bold;">50000</span>  <span style="color: #000000;">&#125;</span><span style="color: #000066; font-weight: bold;">,</span>
                    <span style="color: #000000;">&#123;</span> <span style="color: #004993;">name</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #990000;">&quot;macbook&quot;</span><span style="color: #000066; font-weight: bold;">,</span> price<span style="color: #000066; font-weight: bold;">:</span><span style="color: #000000; font-weight:bold;">100000</span> <span style="color: #000000;">&#125;</span><span style="color: #000066; font-weight: bold;">,</span>
                    <span style="color: #000000;">&#123;</span> <span style="color: #004993;">name</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #990000;">&quot;マクド&quot;</span><span style="color: #000066; font-weight: bold;">,</span>  price<span style="color: #000066; font-weight: bold;">:</span><span style="color: #000000; font-weight:bold;">100</span>    <span style="color: #000000;">&#125;</span>
                <span style="color: #000000;">&#93;</span>
            <span style="color: #000000;">&#125;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">text</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">String</span> = JSON<span style="color: #000066; font-weight: bold;">.</span>encode<span style="color: #000000;">&#40;</span><span style="color: #004993;">data</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">copy</span><span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Object</span> = JSON<span style="color: #000066; font-weight: bold;">.</span><span style="color: #004993;">decode</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">text</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
&nbsp;
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">data</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">text</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">copy</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #0033ff; font-weight: bold;">each</span> <span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> item<span style="color: #000066; font-weight: bold;">:</span><span style="color: #004993;">Object</span> <span style="color: #0033ff; font-weight: bold;">in</span> <span style="color: #004993;">copy</span><span style="color: #000000;">&#91;</span><span style="color: #990000;">&quot;items&quot;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
                <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>item<span style="color: #000000;">&#91;</span><span style="color: #990000;">&quot;name&quot;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000066; font-weight: bold;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p><strong>javascript</strong><br />
javascriptは色々方法があるようですが、僕は<a href="https://github.com/douglascrockford/JSON-js">json2.js</a>を使っています。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">&lt;html&gt;
  &lt;head&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;json2.js&quot;&gt;&lt;/script&gt;
    <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
      <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">'items'</span><span style="color: #339933;">:</span><span style="color: #009900;">&#91;</span>
        <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'name'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'iPhone'</span><span style="color: #339933;">,</span>  <span style="color: #3366CC;">'price'</span><span style="color: #339933;">:</span><span style="color: #CC0000;">50000</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'name'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'macbook'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'price'</span><span style="color: #339933;">:</span><span style="color: #CC0000;">100000</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'name'</span><span style="color: #339933;">:</span><span style="color: #3366CC;">'マクド'</span><span style="color: #339933;">,</span>  <span style="color: #3366CC;">'price'</span><span style="color: #339933;">:</span><span style="color: #CC0000;">100</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
      <span style="color: #003366; font-weight: bold;">var</span> text <span style="color: #339933;">=</span> JSON.<span style="color: #660066;">stringify</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// encode</span>
      <span style="color: #003366; font-weight: bold;">var</span> copy <span style="color: #339933;">=</span> JSON.<span style="color: #660066;">parse</span><span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #006600; font-style: italic;">// decode</span>
&nbsp;
      <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>copy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> copy<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;items&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>copy<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;items&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
&lt;/head&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>どの言語もほぼ同じように処理できていて、JSONは連想配列が使える言語と相性が本当にいいですね。中でもjavascriptがやっぱり一番簡単に扱えてる気がします。perlはリファレンスの扱いが面倒で、phpはarrayにシンタックスシュガーを用意したらもっと良い言語になると思いました。</p>
<p>あと、<a href="http://www.json.org/">json.org</a>の情報量が凄いので要ブックマーク！</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/778/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jTemplatesのMultiTemplatesが思ったのと違う件</title>
		<link>http://taichino.com/programming/559</link>
		<comments>http://taichino.com/programming/559#comments</comments>
		<pubDate>Fri, 24 Jul 2009 07:06:39 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jtemplates]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=559</guid>
		<description><![CDATA[最近javascriptをさわり始めておりまして、そうすると動的にデータを操作するのでjTemplatesというテンプレートエンジンを使う事にしました。jQueryのプラグインだという事と、１つのファイルで複数のテンプレートを定義出来るという事で選んだわけですが、「複数テンプレート」のニュアンスがちょっと思ってたのと違うのでメモ書きです。 サーバーサイドのテンプレートエンジンはページ単位が多いわけですが、javascriptで動的に入れ替えたいのはページ単位というよりは、HTMLのブロック要素単位だと思います。なのでページ単位で作ったテンプレートファイルの中にブロック用のテンプレートを複数持たせたいのです。 まずjTemplatesの基本的な使い方は以下のような感じで、テンプレートを特定のブロックにセットして、データと一緒にprocessTemplateを走らせるという流れになります。 &#60;html&#62; &#60;head&#62; &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34;&#62; &#60;script type=&#34;text/javascript&#34; src=&#34;jquery-1.3.2.js&#34;&#62;&#60;/script&#62; &#60;script type=&#34;text/javascript&#34; src=&#34;jquery-jtemplates.js&#34;&#62;&#60;/script&#62; &#60;script type=&#34;text/javascript&#34;&#62; $&#40;function&#40;&#41; &#123; var data = &#123; teams: &#91; &#123; name:&#34;巨人&#34;, win:50, lose:28 &#125;, &#123; name:&#34;中日&#34;, win:51, lose:34 &#125;, &#123; name:&#34;広島&#34;, win:35, lose:46 &#125;, &#93; &#125;; $&#40;&#34;#result&#34;&#41;.setTemplateURL&#40;&#34;test.tpl&#34;&#41;; $&#40;&#34;#result&#34;&#41;.processTemplate&#40;data&#41;; &#125;&#41; &#60;/script&#62; &#60;/meta&#62;&#60;/head&#62; &#60;body&#62; &#60;div id=&#34;result&#34;&#62;&#60;/div&#62; &#60;/body&#62; &#60;/html&#62; test.tpl (テンプレートファイル) &#123;#template [...]]]></description>
			<content:encoded><![CDATA[<p>最近javascriptをさわり始めておりまして、そうすると動的にデータを操作するのでjTemplatesというテンプレートエンジンを使う事にしました。jQueryのプラグインだという事と、１つのファイルで複数のテンプレートを定義出来るという事で選んだわけですが、「複数テンプレート」のニュアンスがちょっと思ってたのと違うのでメモ書きです。</p>
<p><span id="more-559"></span></p>
<p>サーバーサイドのテンプレートエンジンはページ単位が多いわけですが、javascriptで動的に入れ替えたいのはページ単位というよりは、HTMLのブロック要素単位だと思います。なのでページ単位で作ったテンプレートファイルの中にブロック用のテンプレートを複数持たせたいのです。</p>
<p>まずjTemplatesの基本的な使い方は以下のような感じで、テンプレートを特定のブロックにセットして、データと一緒にprocessTemplateを走らせるという流れになります。</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;jquery-1.3.2.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;jquery-jtemplates.js&quot;&gt;&lt;/script&gt;
    <span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #003366; font-weight: bold;">var</span> data <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
        teams<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
            <span style="color: #009900;">&#123;</span> <span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;巨人&quot;</span><span style="color: #339933;">,</span> win<span style="color: #339933;">:</span><span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> lose<span style="color: #339933;">:</span><span style="color: #CC0000;">28</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span> <span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;中日&quot;</span><span style="color: #339933;">,</span> win<span style="color: #339933;">:</span><span style="color: #CC0000;">51</span><span style="color: #339933;">,</span> lose<span style="color: #339933;">:</span><span style="color: #CC0000;">34</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span> <span style="color: #000066;">name</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;広島&quot;</span><span style="color: #339933;">,</span> win<span style="color: #339933;">:</span><span style="color: #CC0000;">35</span><span style="color: #339933;">,</span> lose<span style="color: #339933;">:</span><span style="color: #CC0000;">46</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#93;</span>
      <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
      $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#result&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">setTemplateURL</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;test.tpl&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#result&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">processTemplate</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
  &lt;/meta&gt;&lt;/head&gt;
  &lt;body&gt;
    &lt;div id=&quot;result&quot;&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;">test.tpl (テンプレートファイル)
<span style="color: #D36900;">&#123;</span>#template MAIN<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;table&gt;</span>
  <span style="color: #D36900;">&#123;</span>#foreach <span style="color: #00aaff;">$T</span>.<span style="color: #006600;">teams</span> as team<span style="color: #D36900;">&#125;</span>
  <span style="color: #009000;">&lt;tr&gt;</span>
     <span style="color: #009000;">&lt;td&gt;</span> <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #6A0A0A;">name</span><span style="color: #D36900;">&#125;</span> <span style="color: #009000;">&lt;/td&gt;</span>
     <span style="color: #009000;">&lt;td&gt;</span> <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #006600;">win</span><span style="color: #D36900;">&#125;</span>  <span style="color: #009000;">&lt;/td&gt;</span>
     <span style="color: #009000;">&lt;td&gt;</span> <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #006600;">lose</span><span style="color: #D36900;">&#125;</span> <span style="color: #009000;">&lt;/td&gt;</span>
  <span style="color: #009000;">&lt;/tr&gt;</span>
  <span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span>for<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;/table&gt;</span>
<span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span><span style="color: #0600FF;">template</span> MAIN<span style="color: #D36900;">&#125;</span></pre></div></div>

<p>続いて複数のテンプレートを定義します。テーブルの代わりにリストにしてみました。</p>

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"><span style="color: #D36900;">&#123;</span>#template MAIN<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;table&gt;</span>
  <span style="color: #D36900;">&#123;</span>#foreach <span style="color: #00aaff;">$T</span>.<span style="color: #006600;">teams</span> as team<span style="color: #D36900;">&#125;</span>
  <span style="color: #009000;">&lt;tr&gt;</span>
     <span style="color: #009000;">&lt;td&gt;</span> <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #6A0A0A;">name</span><span style="color: #D36900;">&#125;</span> <span style="color: #009000;">&lt;/td&gt;</span>
     <span style="color: #009000;">&lt;td&gt;</span> <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #006600;">win</span><span style="color: #D36900;">&#125;</span>  <span style="color: #009000;">&lt;/td&gt;</span>
     <span style="color: #009000;">&lt;td&gt;</span> <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #006600;">lose</span><span style="color: #D36900;">&#125;</span> <span style="color: #009000;">&lt;/td&gt;</span>
  <span style="color: #009000;">&lt;/tr&gt;</span>
  <span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span>for<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;/table&gt;</span>
<span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span><span style="color: #0600FF;">template</span> MAIN<span style="color: #D36900;">&#125;</span>
&nbsp;
<span style="color: #D36900;">&#123;</span>#template SUB<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;ul&gt;</span>
  <span style="color: #D36900;">&#123;</span>#foreach <span style="color: #00aaff;">$T</span>.<span style="color: #006600;">teams</span> as team<span style="color: #D36900;">&#125;</span>
  <span style="color: #009000;">&lt;li&gt;</span>
     <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #6A0A0A;">name</span><span style="color: #D36900;">&#125;</span> : <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #006600;">win</span><span style="color: #D36900;">&#125;</span> : <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">team</span>.<span style="color: #006600;">lose</span><span style="color: #D36900;">&#125;</span>
  <span style="color: #009000;">&lt;/li&gt;</span>
  <span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span>for<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;/ul&gt;</span>
<span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span><span style="color: #0600FF;">template</span> SUB<span style="color: #D36900;">&#125;</span></pre></div></div>

<p>ここで問題なのは新しく定義したSUBテンプレートを指定してロードする方法が無い事です。そんなバカなと思ってソースを見てみるとMAINというテンプレートを即値で読み込む作りになっています。<br />
じゃあ他のテンプレートは何に使うのかというと、どうもテンプレート内で部品化できる部分をテンプレートとして定義して、それをincludeする事で余分な繰り返し等を避けれるって言う話のようです。</p>
<p>このままでは悔しいので、適当に変数を利用してMAIN内で分岐させれば良いかもと思ったのですが、{#include}内で変数を展開する事が出来ないようです。</p>

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;">以下のように外部変数を元に分岐させられない
<span style="color: #D36900;">&#123;</span>#template MAIN<span style="color: #D36900;">&#125;</span>
  <span style="color: #D36900;">&#123;</span>#include <span style="color: #00aaff;">$P</span>.<span style="color: #6A0A0A;">name</span> root<span style="color: #D36900;">=</span><span style="color: #00aaff;">$T</span><span style="color: #D36900;">&#125;</span>
<span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span><span style="color: #0600FF;">template</span><span style="color: #D36900;">&#125;</span></pre></div></div>

<p>というわけで結局一つのテンプレートファイルで、実質的に複数のテンプレートを使おうとすると、外部変数と{#if}で無理矢理分岐させる事になりそうです。</p>

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;">// MAINの中で無理矢理分岐させる
<span style="color: #D36900;">&#123;</span>#template MAIN<span style="color: #D36900;">&#125;</span>
  <span style="color: #D36900;">&#123;</span>#if <span style="color: #00aaff;">$P</span>.<span style="color: #6A0A0A;">name</span> <span style="color: #D36900;">==</span> <span style="color: #ff0000;">&quot;SUB1&quot;</span><span style="color: #D36900;">&#125;</span>
    <span style="color: #D36900;">&#123;</span>#include SUB1 root<span style="color: #D36900;">=</span><span style="color: #00aaff;">$T</span><span style="color: #D36900;">&#125;</span>
  <span style="color: #D36900;">&#123;</span>#elseif <span style="color: #00aaff;">$P</span>.<span style="color: #6A0A0A;">name</span> <span style="color: #D36900;">==</span> <span style="color: #ff0000;">&quot;SUB2&quot;</span><span style="color: #D36900;">&#125;</span>
    <span style="color: #D36900;">&#123;</span>#include SUB2 root<span style="color: #D36900;">=</span><span style="color: #00aaff;">$T</span><span style="color: #D36900;">&#125;</span>
  <span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span><span style="color: #0600FF;">if</span><span style="color: #D36900;">&#125;</span>
<span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span><span style="color: #0600FF;">template</span> MAIN<span style="color: #D36900;">&#125;</span>
&nbsp;
<span style="color: #D36900;">&#123;</span>#template SUB1<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;h1&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$P</span>.<span style="color: #6A0A0A;">name</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/h1&gt;</span>
<span style="color: #009000;">&lt;font color=&quot;#0000FF&quot;&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">param</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/font&gt;</span>
<span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span><span style="color: #0600FF;">template</span> SUB1<span style="color: #D36900;">&#125;</span>
&nbsp;
<span style="color: #D36900;">&#123;</span>#template SUB2<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;h1&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$P</span>.<span style="color: #6A0A0A;">name</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/h1&gt;</span>
<span style="color: #009000;">&lt;font color=&quot;#FF0000&quot;&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$T</span>.<span style="color: #006600;">param</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/font&gt;</span>
<span style="color: #D36900;">&#123;</span>#<span style="color: #D36900;">/</span><span style="color: #0600FF;">template</span> SUB2<span style="color: #D36900;">&#125;</span></pre></div></div>

<p>一見、テンプレートファイルが増えるよりも、まだ保守性が良さそうですが、分岐部分の修正によって既存部分にまで影響する可能性もあり微妙です。</p>
<p>もっといい方法がありそうですね。見つけたらまた書きたいと思います。</p>
<p><strong>参考</strong></p>
<ul>
<li>http://blog.livedoor.jp/techblog/archives/64748832.html</li>
<li>http://jtemplates.tpython.com/</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/559/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

