<?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; php</title>
	<atom:link href="http://taichino.com/category/programming/php-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>WordPressで、はてなダイアリーで言うところの「注目のエントリー」的なリストを表示する</title>
		<link>http://taichino.com/programming/1699</link>
		<comments>http://taichino.com/programming/1699#comments</comments>
		<pubDate>Fri, 02 Apr 2010 21:07:07 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[sbm_popular_entry]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1699</guid>
		<description><![CDATA[ブックマークされた数が多い順にエントリーを表示するのに重宝しているSBM_Popular_Entryですが、単純にブックマーク数が多い順だと中々リストの内容が変わらず、どうしても古い記事が上の方に来ます。そこではてなダイアリーで言うところの、注目のエントリー機能が欲しいなぁと思ったので、SBM_Popular_Entryに書き足してみました。このブログでは右側の「最近の注目のエントリー」が、書き足した機能で表示しているリストです。まぁ自分で「注目の」とか言うのは結構恥ずかしいのですけども。 結論だけ書きます。下記のコードをwp-sbm_popular_entry.phpの下の方に書き加えます。汚くてごめんなさい。SQL構築処理に手を入れるのが嫌だったので豪快にコピペしています。ごめんなさいごめんなさい。 function SBM_popular_recent_entry_list&#40;$limit=10, $threshold=5, $val=&#34;&#34;&#41; &#123; global $wpdb; &#160; $pluginurl = get_option&#40;'siteurl'&#41;.&#34;/wp-content/plugins/wp-sbm_popular_entry/&#34;; $metalist = $wpdb-&#62;get_results&#40; SBM_popular_recent_entry_list_sql&#40;$limit, $threshold, $val&#41; &#41;; &#160; if &#40; $metalist &#41; &#123; ob_start&#40;&#41;; foreach &#40;$metalist as $metarow&#41; &#123; $permalink = get_permalink&#40;$metarow-&#62;ID&#41;; $title = $metarow-&#62;post_title; $meta = get_post_meta&#40;$metarow-&#62;ID, &#34;SBM_count&#34;, 1&#41;; $popup = &#34;iconImageClickHandler(this, '&#34;.$permalink.&#34;', event)&#34;; list&#40;$count, $icon, $link, $add&#41; = _template_parm&#40;$pluginurl, $permalink, [...]]]></description>
			<content:encoded><![CDATA[<p>ブックマークされた数が多い順にエントリーを表示するのに重宝している<a href="http://aoina.com/archives/18">SBM_Popular_Entry</a>ですが、単純にブックマーク数が多い順だと中々リストの内容が変わらず、どうしても古い記事が上の方に来ます。そこではてなダイアリーで言うところの、注目のエントリー機能が欲しいなぁと思ったので、SBM_Popular_Entryに書き足してみました。このブログでは右側の「最近の注目のエントリー」が、書き足した機能で表示しているリストです。まぁ自分で「注目の」とか言うのは結構恥ずかしいのですけども。</p>
<p><span id="more-1699"></span></p>
<p>結論だけ書きます。下記のコードをwp-sbm_popular_entry.phpの下の方に書き加えます。汚くてごめんなさい。SQL構築処理に手を入れるのが嫌だったので豪快にコピペしています。ごめんなさいごめんなさい。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> SBM_popular_recent_entry_list<span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #000088;">$threshold</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #000088;">$val</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$pluginurl</span> <span style="color: #339933;">=</span> get_option<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'siteurl'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/wp-content/plugins/wp-sbm_popular_entry/&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$metalist</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_results</span><span style="color: #009900;">&#40;</span> SBM_popular_recent_entry_list_sql<span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span><span style="color: #339933;">,</span> <span style="color: #000088;">$threshold</span><span style="color: #339933;">,</span> <span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$metalist</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</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;">$metalist</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$metarow</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$permalink</span> <span style="color: #339933;">=</span> get_permalink<span style="color: #009900;">&#40;</span><span style="color: #000088;">$metarow</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ID</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$metarow</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post_title</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$meta</span> <span style="color: #339933;">=</span> get_post_meta<span style="color: #009900;">&#40;</span><span style="color: #000088;">$metarow</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ID</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;SBM_count&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$popup</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;iconImageClickHandler(this, '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$permalink</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;', event)&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$count</span><span style="color: #339933;">,</span> <span style="color: #000088;">$icon</span><span style="color: #339933;">,</span> <span style="color: #000088;">$link</span><span style="color: #339933;">,</span> <span style="color: #000088;">$add</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> _template_parm<span style="color: #009900;">&#40;</span><span style="color: #000088;">$pluginurl</span><span style="color: #339933;">,</span> <span style="color: #000088;">$permalink</span><span style="color: #339933;">,</span> <span style="color: #000088;">$title</span><span style="color: #339933;">,</span> <span style="color: #000088;">$metarow</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">meta_value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$count</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sum'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
                <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'wp-content/plugins/wp-sbm_popular_entry/template_list.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ob_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">ob_end_clean</span><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;">$content</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> SBM_popular_recent_entry_list_sql<span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span><span style="color: #339933;">,</span> <span style="color: #000088;">$threshold</span><span style="color: #339933;">,</span> <span style="color: #000088;">$val</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tablepost2tag</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tabletags</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT ID, post_title, meta_value &quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$sql</span><span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;FROM <span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span>, <span style="color: #006699; font-weight: bold;">$wpdb-&gt;postmeta</span> WHERE &quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$sql</span><span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span>.ID=<span style="color: #006699; font-weight: bold;">$wpdb-&gt;postmeta</span>.post_id and meta_key = 'SBM_count' and meta_value &gt;= <span style="color: #006699; font-weight: bold;">$threshold</span> &quot;</span><span style="color: #339933;">.</span>
                 <span style="color: #0000ff;">&quot;ORDER BY ID DESC LIMIT &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$limit</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$sql</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>上記修正を行った後に、リストが欲しい場所で以下のようにします。1つ目の引数(10)はリストのアイテム数の上限で、2つ目の引数(5)はブックマーク数の下限値です。以下の場合は「5ブックマーク数以上のエントリを新しいものから最大10件取得」という事になります。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php SBM_popular_recent_entry_list<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>これでリピータの方にも最近の活動の様子を少しアピールできるようになりましたね。汚いコードは誰か直して下さい。僕にはもうその元気がありません。あと、以前に<a href="http://taichino.com/programming/1490">ちょろっと書いたパッチ</a>もあわせて参照して下さいませ。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1699/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SBM Popular Entryのパッチを書いた</title>
		<link>http://taichino.com/programming/1490</link>
		<comments>http://taichino.com/programming/1490#comments</comments>
		<pubDate>Tue, 12 Jan 2010 16:09:45 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[sbm_popular_entry]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=1490</guid>
		<description><![CDATA[このブログでもメニューバーに「ブックマークが多いエントリー」を表示していますが、これはSBM Popular EntryというWordpressプラグインを利用させて頂いています。hatena, delicious, livedoor, yahooそれぞれのSBM数を集計してくれるので、特定のブックマークサービスに偏らずに一番ブックマークされている順で記事を表示できて便利です。ところが各ブックマークサービスのAPI呼出しの形式の変化等により、一部動作がバギーだったのでパッチを書きました。 修正したのは以下の点です。SBM_Popular_Entry1.5をベースに修正しています。 集計結果に同一エントリが複数回表れる deliciousのブックマーク数が反映されない 管理ページからhatenaとlivedoorブックマークへのリンク切れ 以下がパッチになりますが、集計結果に同一エントリが複数回現れるのは、コードではなくMySQLのバージョンが原因かもしれません。僕の場合はMySQL 4.0.26(チカッパレンタルサーバ)で、この現象が発生していたのですが、下記パッチを当て、MySQLを5.0.51にアップデートすることで問題は発生しなくなりました。 --- wp-sbm_popular_entry.php.orig 2010-01-08 17:32:29.000000000 +0900 +++ wp-sbm_popular_entry.php 2010-01-08 17:32:51.000000000 +0900 @@ -9,23 +9,17 @@ Author URI: http://aoina.com */ &#160; - - - - $SBM_PopularEntry = new SBM_PopularEntry&#40;&#41;; &#160; add_filter&#40;'manage_posts_columns', array&#40;&#38;$SBM_PopularEntry, 'manage_posts_columns'&#41;&#41;; add_action&#40;'manage_posts_custom_column', array&#40;&#38;$SBM_PopularEntry, 'manage_posts_custom_column'&#41;&#41;; &#160; -add_action&#40;'wp_head', array&#40;&#38;$SBM_PopularEntry, 'wp_head'&#41;&#41;; +add_action&#40;'wp_head', array&#40;&#38;$SBM_PopularEntry, 'wp_head'&#41;&#41;; add_action&#40;'wp_head', array&#40;&#38;$SBM_PopularEntry, [...]]]></description>
			<content:encoded><![CDATA[<p>このブログでもメニューバーに「ブックマークが多いエントリー」を表示していますが、これは<a href="http://aoina.com/archives/18">SBM Popular Entry</a>というWordpressプラグインを利用させて頂いています。hatena, delicious, livedoor, yahooそれぞれのSBM数を集計してくれるので、特定のブックマークサービスに偏らずに一番ブックマークされている順で記事を表示できて便利です。ところが各ブックマークサービスのAPI呼出しの形式の変化等により、一部動作がバギーだったのでパッチを書きました。</p>
<p><span id="more-1490"></span></p>
<p>修正したのは以下の点です。SBM_Popular_Entry1.5をベースに修正しています。</p>
<ol>
<li><strong>集計結果に同一エントリが複数回表れる</strong></li>
<li><strong>deliciousのブックマーク数が反映されない</strong></li>
<li><strong>管理ページからhatenaとlivedoorブックマークへのリンク切れ</strong></li>
</ol>
<p>以下がパッチになりますが、集計結果に同一エントリが複数回現れるのは、コードではなくMySQLのバージョンが原因かもしれません。僕の場合はMySQL 4.0.26(チカッパレンタルサーバ)で、この現象が発生していたのですが、下記パッチを当て、MySQLを5.0.51にアップデートすることで問題は発生しなくなりました。</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;"><span style="color: #888822;">--- wp-sbm_popular_entry.php.orig       2010-01-08 17:32:29.000000000 +0900</span>
<span style="color: #888822;">+++ wp-sbm_popular_entry.php    2010-01-08 17:32:51.000000000 +0900</span>
<span style="color: #440088;">@@ -9,23 +9,17 @@</span>
 Author URI: http://aoina.com
 */
&nbsp;
<span style="color: #991111;">-</span>
<span style="color: #991111;">-</span>
<span style="color: #991111;">-</span>
<span style="color: #991111;">-</span>
 $SBM_PopularEntry = new SBM_PopularEntry<span style="">&#40;</span><span style="">&#41;</span>;
&nbsp;
 add_filter<span style="">&#40;</span>'manage_posts_columns', array<span style="">&#40;</span>&amp;$SBM_PopularEntry, 'manage_posts_columns'<span style="">&#41;</span><span style="">&#41;</span>;
 add_action<span style="">&#40;</span>'manage_posts_custom_column', array<span style="">&#40;</span>&amp;$SBM_PopularEntry, 'manage_posts_custom_column'<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
<span style="color: #991111;">-add_action<span style="">&#40;</span>'wp_head',  array<span style="">&#40;</span>&amp;$SBM_PopularEntry, 'wp_head'<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+add_action<span style="">&#40;</span>'wp_head', array<span style="">&#40;</span>&amp;$SBM_PopularEntry, 'wp_head'<span style="">&#41;</span><span style="">&#41;</span>;</span>
 add_action<span style="">&#40;</span>'wp_head', array<span style="">&#40;</span>&amp;$SBM_PopularEntry, 'get_count'<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
 unset<span style="">&#40;</span>$SBM_PopularEntry<span style="">&#41;</span>;
&nbsp;
<span style="color: #991111;">-</span>
<span style="color: #991111;">-class SBM_PopularEntry</span>
<span style="color: #991111;">-<span style="">&#123;</span></span>
<span style="color: #00b000;">+class SBM_PopularEntry <span style="">&#123;</span></span>
     var $plugin_url;
     var $post;
     var $post_meta;
<span style="color: #440088;">@@ -34,22 +28,11 @@</span>
     var $urllink;
     var $key;
&nbsp;
<span style="color: #991111;">-</span>
<span style="color: #991111;">-    /**</span>
<span style="color: #991111;">-     *</span>
<span style="color: #991111;">-     *</span>
<span style="color: #991111;">-     */</span>
<span style="color: #991111;">-    function SBM_PopularEntry<span style="">&#40;</span><span style="">&#41;</span></span>
<span style="color: #991111;">-    <span style="">&#123;</span></span>
<span style="color: #00b000;">+    function SBM_PopularEntry<span style="">&#40;</span><span style="">&#41;</span> <span style="">&#123;</span></span>
         $this-&gt;plugin_url = get_option<span style="">&#40;</span>'siteurl'<span style="">&#41;</span>.&quot;/wp-content/plugins/wp-sbm_popular_entry/&quot;;
         $this-&gt;key = &quot;SBM_count&quot;;
     <span style="">&#125;</span>
&nbsp;
<span style="color: #991111;">-</span>
<span style="color: #991111;">-    /**</span>
<span style="color: #991111;">-     * 管理画面の記事リストの&lt;th&gt;部分のアイコン</span>
<span style="color: #991111;">-     *</span>
<span style="color: #991111;">-     */</span>
     function manage_posts_columns<span style="">&#40;</span>$posts_columns<span style="">&#41;</span>
     <span style="">&#123;</span>
         $posts_columns<span style="">&#91;</span>'SBM_hatena'<span style="">&#93;</span>    = '&lt;img src=&quot;'.$this-/&gt;plugin_url.'hatena.gif&quot; alt=&quot;hatena&quot; /&gt;';
<span style="color: #440088;">@@ -60,11 +43,6 @@</span>
         return $posts_columns;
     <span style="">&#125;</span>
&nbsp;
<span style="color: #991111;">-</span>
<span style="color: #991111;">-    /**</span>
<span style="color: #991111;">-     * 管理画面の記事リストに被ブックマーク数を表示</span>
<span style="color: #991111;">-     *</span>
<span style="color: #991111;">-     */</span>
     function manage_posts_custom_column<span style="">&#40;</span>$column_name<span style="">&#41;</span>
     <span style="">&#123;</span>
         global $post;
<span style="color: #440088;">@@ -72,9 +50,9 @@</span>
         if<span style="">&#40;</span>@$this-&gt;post-&gt;ID != $post-&gt;ID<span style="">&#41;</span><span style="">&#123;</span>
             $this-&gt;post = $post;
             $this-&gt;permalink   = get_permalink<span style="">&#40;</span><span style="">&#41;</span>;
<span style="color: #991111;">-            $this-&gt;urllink<span style="">&#91;</span>'hatena'<span style="">&#93;</span>    = &quot;http://b.hatena.ne.jp/entry/&quot;.urlencode<span style="">&#40;</span>$this-&gt;permalink<span style="">&#41;</span>;</span>
<span style="color: #991111;">-            $this-&gt;urllink<span style="">&#91;</span>'delicious'<span style="">&#93;</span> = &quot;http://del.icio.us/url/&quot;.md5<span style="">&#40;</span>$this-&gt;permalink<span style="">&#41;</span>;</span>
<span style="color: #991111;">-            $this-&gt;urllink<span style="">&#91;</span>'livedoor'<span style="">&#93;</span>  = &quot;http://clip.livedoor.com/page/&quot;.urlencode<span style="">&#40;</span>$this-&gt;permalink<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+            $this-&gt;urllink<span style="">&#91;</span>'hatena'<span style="">&#93;</span>    = &quot;http://b.hatena.ne.jp/entry/&quot;.substr<span style="">&#40;</span>$this-&gt;permalink, <span style="">7</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+            $this-&gt;urllink<span style="">&#91;</span>'delicious'<span style="">&#93;</span> = &quot;http://delicious.com/url/&quot;.md5<span style="">&#40;</span>$this-&gt;permalink<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+                       $this-&gt;urllink<span style="">&#91;</span>'livedoor'<span style="">&#93;</span>  = &quot;http://clip.livedoor.com/page/&quot;.$this-&gt;permalink;</span>
             $this-&gt;urllink<span style="">&#91;</span>'yahoo'<span style="">&#93;</span>     = &quot;http://bookmarks.yahoo.co.jp/url?url=&quot;.urlencode<span style="">&#40;</span>$this-&gt;permalink<span style="">&#41;</span>;
&nbsp;
             $meta = get_post_meta<span style="">&#40;</span>$this-&gt;post-&gt;ID, $this-&gt;key, <span style="">1</span><span style="">&#41;</span>;
<span style="color: #440088;">@@ -104,29 +82,25 @@</span>
     <span style="">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #991111;">-    /**</span>
<span style="color: #991111;">-     * 記事表示時に各ブクマサイトより被ブックマーク数をGET</span>
<span style="color: #991111;">-     *</span>
<span style="color: #991111;">-     */</span>
     function get_count<span style="">&#40;</span><span style="">&#41;</span>
     <span style="">&#123;</span>
         global $post;
&nbsp;
<span style="color: #991111;">-        if <span style="">&#40;</span>!is_single<span style="">&#40;</span><span style="">&#41;</span> &amp;&amp; !is_page<span style="">&#41;</span> return false;</span>
<span style="color: #991111;">-        if <span style="">&#40;</span>!$post-&gt;ID &gt; <span style="">0</span><span style="">&#41;</span> return false;</span>
		 +        if <span style="">&#40;</span>!is_single<span style="">&#40;</span><span style="">&#41;</span> &amp;&amp; !is_page<span style="">&#40;</span><span style="">&#41;</span><span style="">&#41;</span> return false;
<span style="color: #00b000;">+        if <span style="">&#40;</span>$post-&gt;ID &lt; = <span style="">0</span><span style="">&#41;</span> return false;</span>
&nbsp;
         $permalink = get_permalink<span style="">&#40;</span><span style="">&#41;</span>;
<span style="color: #991111;">-        $flg = get_post_meta<span style="">&#40;</span>$post-&gt;ID, $this-&gt;key, <span style="">1</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        $flg = get_post_meta<span style="">&#40;</span>$post-&gt;ID, $this-&gt;key, true<span style="">&#41;</span>;</span>
         if<span style="">&#40;</span>!$flg<span style="">&#41;</span><span style="">&#123;</span>
             $flg = &quot;00000&lt;&gt;<span style="">0</span>&lt;&gt;<span style="">0</span>&lt;&gt;<span style="">0</span>&lt;&gt;<span style="">0</span>&lt;&gt;<span style="">0</span>&lt;&gt;<span style="">0</span>&quot;;
<span style="color: #991111;">-            add_post_meta<span style="">&#40;</span>$post-&gt;ID, $this-&gt;key, $flg, <span style="">1</span><span style="">&#41;</span>;</span>
         <span style="">&#125;</span>
<span style="color: #991111;">-        $meta = explode<span style="">&#40;</span>&quot;&lt;&gt;&quot;,$flg<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        $meta = explode<span style="">&#40;</span>&quot;&lt;&gt;&quot;, $flg<span style="">&#41;</span>;</span>
&nbsp;
<span style="color: #991111;">-        if<span style="">&#40;</span> $meta<span style="">&#91;</span><span style="">1</span><span style="">&#93;</span> &gt; time<span style="">&#40;</span><span style="">&#41;</span>-<span style="">60</span>*<span style="">60</span> <span style="">&#41;</span> return false;</span>
<span style="color: #00b000;">+        if<span style="">&#40;</span>$meta<span style="">&#91;</span>1<span style="">&#93;</span> &gt; time<span style="">&#40;</span><span style="">&#41;</span> - 60*60<span style="">&#41;</span></span>
<span style="color: #00b000;">+                 return false;</span>
&nbsp;
         $new_meta<span style="">&#91;</span>'hatena'<span style="">&#93;</span>    = $this-&gt;xmlrpc_results<span style="">&#40;</span>'http://b.hatena.ne.jp/xmlrpc', 'bookmark.getCount', $permalink<span style="">&#41;</span>;
<span style="color: #991111;">-        $new_meta<span style="">&#91;</span>'delicious'<span style="">&#93;</span> = $this-&gt;socket_results<span style="">&#40;</span>'http://del.icio.us/url/'.md5<span style="">&#40;</span>$permalink<span style="">&#41;</span>, '/this url has been saved by <span style="">&#40;</span><span style="">&#91;</span>\d<span style="">&#93;</span>+?<span style="">&#41;</span> <span style="">&#40;</span>person|people<span style="">&#41;</span>/'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               $new_meta<span style="">&#91;</span>'delicious'<span style="">&#93;</span> = $this-&gt;socket_results<span style="">&#40;</span>'http://feeds.delicious.com/v2/json/urlinfo/'.md5<span style="">&#40;</span>$permalink<span style="">&#41;</span>, '/&quot;total_posts&quot;:<span style="">&#40;</span><span style="">&#91;</span>\d<span style="">&#93;</span>+?<span style="">&#41;</span>,/'<span style="">&#41;</span>;</span>
         $new_meta<span style="">&#91;</span>'livedoor'<span style="">&#93;</span>  = $this-&gt;xmlrpc_results<span style="">&#40;</span>'http://rpc.clip.livedoor.com/count', 'clip.getCount', $permalink<span style="">&#41;</span>;
         $new_meta<span style="">&#91;</span>'yahoo'<span style="">&#93;</span>     = $this-&gt;socket_results<span style="">&#40;</span>'http://bookmarks.yahoo.co.jp/url?url='.urlencode<span style="">&#40;</span>$permalink<span style="">&#41;</span>, '/&lt;span class=&quot;nosaved\d&quot;&gt;<span style="">&#40;</span>\d<span style="">&#41;</span>人が登録&lt; \/span&gt;/'<span style="">&#41;</span>;
&nbsp;
<span style="color: #440088;">@@ -138,7 +112,7 @@</span>
&nbsp;
         $meta<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span> = $meta<span style="">&#91;</span><span style="">2</span><span style="">&#93;</span> + $meta<span style="">&#91;</span><span style="">3</span><span style="">&#93;</span> + $meta<span style="">&#91;</span><span style="">4</span><span style="">&#93;</span> + $meta<span style="">&#91;</span><span style="">5</span><span style="">&#93;</span>;
         $meta<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span> = substr<span style="">&#40;</span>&quot;00000&quot;.$meta<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span>, -<span style="">5</span><span style="">&#41;</span>;
<span style="color: #991111;">-        $meta<span style="">&#91;</span><span style="">1</span><span style="">&#93;</span>  = time<span style="">&#40;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        $meta<span style="">&#91;</span><span style="">1</span><span style="">&#93;</span> = time<span style="">&#40;</span><span style="">&#41;</span>;</span>
         update_post_meta<span style="">&#40;</span>$post-&gt;ID, $this-&gt;key, implode<span style="">&#40;</span>'&lt;&gt;', $meta<span style="">&#41;</span><span style="">&#41;</span>;
     <span style="">&#125;</span>
&nbsp;
<span style="color: #440088;">@@ -366,12 +340,12 @@</span>
     $icon<span style="">&#91;</span>'popup'<span style="">&#93;</span>     = $pluginurl.&quot;popup.gif&quot;;
&nbsp;
     $link<span style="">&#91;</span>'hatena'<span style="">&#93;</span>    = 'http://b.hatena.ne.jp/entry/'.$permalink;
<span style="color: #991111;">-    $link<span style="">&#91;</span>'delicious'<span style="">&#93;</span> = 'http://del.icio.us/url/'.md5<span style="">&#40;</span>$permalink<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $link<span style="">&#91;</span>'delicious'<span style="">&#93;</span> = 'http://delicious.com/url/'.md5<span style="">&#40;</span>$permalink<span style="">&#41;</span>;</span>
     $link<span style="">&#91;</span>'livedoor'<span style="">&#93;</span>  = 'http://clip.livedoor.com/page/'.$permalink;
     $link<span style="">&#91;</span>'yahoo'<span style="">&#93;</span>     = 'http://bookmarks.yahoo.co.jp/url?url='.$permalink;
&nbsp;
     $add<span style="">&#91;</span>'hatena'<span style="">&#93;</span>     = &quot;http://b.hatena.ne.jp/append?&quot;.$permalink.&quot;&amp;amp;h=&quot;.$title;
<span style="color: #991111;">-    $add<span style="">&#91;</span>'delicious'<span style="">&#93;</span>  = &quot;http://del.icio.us/post?url=&quot;.$permalink.&quot;&amp;amp;title=&quot;.$title;</span>
<span style="color: #00b000;">+    $add<span style="">&#91;</span>'delicious'<span style="">&#93;</span>  = &quot;http://delicious.com/post?url=&quot;.$permalink.&quot;&amp;amp;title=&quot;.$title;</span>
     $add<span style="">&#91;</span>'livedoor'<span style="">&#93;</span>   = &quot;http://clip.livedoor.com/clip/add?jump=myclip&amp;amp;link=&quot;.$permalink.&quot;&amp;amp;title=&quot;.$title;
     $add<span style="">&#91;</span>'yahoo'<span style="">&#93;</span>      = &quot;http://bookmarks.yahoo.co.jp/action/post/done?url=&quot;.$permalink.&quot;&amp;amp;title=&quot;.$title;
<span style="color: #991111;">&lt;/span&gt;&lt;/th&gt;</span></pre></div></div>

<p>コメント文字化けしたので消しちゃいました。ごめんなさい。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/1490/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpからpythonへの変換を考える</title>
		<link>http://taichino.com/programming/947</link>
		<comments>http://taichino.com/programming/947#comments</comments>
		<pubDate>Thu, 10 Sep 2009 18:56:07 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[php2py]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=947</guid>
		<description><![CDATA[2000行くらいのphpスクリプトをpythonに移植したいのですが、出来るだけ自動的に変換したいと思い、少し試行錯誤してみました。(単に単調に手を動かすのが嫌だという話もあります。) 1. 正規表現でチャレンジ 2. token_get_allでチャレンジ(字句解析結果を使う) 3. phcでチャレンジ(構文解析結果を使う) 1. 正規表現でチャレンジ まず初めに試してみたのは正規表現を使って小さな変更を何度も繰り返して行う方法です。一行ずつソースコードを読み込んでセミコロンを消してみたり、ブレースを消してみたりと取っ付きは良く、意気揚々と書き始めて以下のようになりました。 #!/usr/bin/perl use strict; use warnings; use Perl6::Say; use Text::Trim; &#160; my $indentUnit = &#34; &#34;; my $currentIndent = 0; while&#40;&#60;&#62;&#41; &#123; my $line = trim&#40;$_&#41;; my $delta = countIndent&#40;$line&#41;; my $result = convertLine&#40;$line&#41;; if &#40;$delta &#62;= 0&#41; &#123; say $indentUnit x $currentIndent . $result if [...]]]></description>
			<content:encoded><![CDATA[<p>2000行くらいのphpスクリプトをpythonに移植したいのですが、出来るだけ自動的に変換したいと思い、少し試行錯誤してみました。(単に単調に手を動かすのが嫌だという話もあります。)</p>
<ul>
<li>1. 正規表現でチャレンジ</li>
<li>2. token_get_allでチャレンジ(字句解析結果を使う)</li>
<li>3. phcでチャレンジ(構文解析結果を使う)</li>
</ul>
<p><span id="more-947"></span></p>
<p><strong>1. 正規表現でチャレンジ</strong><br />
まず初めに試してみたのは正規表現を使って小さな変更を何度も繰り返して行う方法です。一行ずつソースコードを読み込んでセミコロンを消してみたり、ブレースを消してみたりと取っ付きは良く、意気揚々と書き始めて以下のようになりました。</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
<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>
<span style="color: #000000; font-weight: bold;">use</span> Text<span style="color: #339933;">::</span><span style="color: #006600;">Trim</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$indentUnit</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;  &quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$currentIndent</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&lt;&gt;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$line</span>   <span style="color: #339933;">=</span> trim<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$_</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$delta</span>  <span style="color: #339933;">=</span> countIndent<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$line</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$result</span> <span style="color: #339933;">=</span> convertLine<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$line</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$delta</span> <span style="color: #339933;">&gt;=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        say <span style="color: #0000ff;">$indentUnit</span> x <span style="color: #0000ff;">$currentIndent</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">$result</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$result</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$currentIndent</span> <span style="color: #339933;">+=</span> <span style="color: #0000ff;">$delta</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #0000ff;">$currentIndent</span> <span style="color: #339933;">+=</span> <span style="color: #0000ff;">$delta</span><span style="color: #339933;">;</span>
        say <span style="color: #0000ff;">$indentUnit</span> x <span style="color: #0000ff;">$currentIndent</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">$result</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$result</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> countIndent <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$indent</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;"># 1文字ずつ走査して{}でindentを増減させる</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$inSQ</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>    <span style="color: #666666; font-style: italic;"># in Single Quatation</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$inDQ</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>    <span style="color: #666666; font-style: italic;"># in Double Quatation</span>
    <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$c</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">//,</span> <span style="color: #0000ff;">$line</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #0000ff;">$inSQ</span> <span style="color: #b1b100;">and</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">$inDQ</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #0000ff;">$indent</span><span style="color: #339933;">++</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$c</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'{'</span><span style="color: #339933;">;</span>
            <span style="color: #0000ff;">$indent</span><span style="color: #339933;">--</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$c</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'}'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #0000ff;">$inSQ</span> <span style="color: #339933;">=</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">$inSQ</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$c</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$inDQ</span> <span style="color: #339933;">=</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">$inDQ</span> <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$c</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'&quot;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$indent</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> convertLine <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/^&lt; \?php$//g</span><span style="color: #339933;">;</span>     <span style="color: #666666; font-style: italic;"># phpブロック開始削除</span>
    <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/^\?&gt;$//g</span><span style="color: #339933;">;</span>        <span style="color: #666666; font-style: italic;"># phpブロック終了削除</span>
    <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/\s*;$//g</span><span style="color: #339933;">;</span>        <span style="color: #666666; font-style: italic;"># 行末のセミコロン削除</span>
&nbsp;
    <span style="color: #666666; font-style: italic;"># ブロックの処理</span>
    <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/function (\w+)\(([^)]*)\)\s*{/def $1($2):/</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># メソッド</span>
    <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/if\s*\(([^)]+)\)\s*{/if $1:/</span><span style="color: #339933;">;</span>               <span style="color: #666666; font-style: italic;"># if</span>
    <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/while\s*\(([^)]+)\)\s*{/while $1:/</span><span style="color: #339933;">;</span>         <span style="color: #666666; font-style: italic;"># while</span>
    <span style="color: #0000ff;">$line</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/^}$//g</span><span style="color: #339933;">;</span>                                     <span style="color: #666666; font-style: italic;"># 閉じブロック</span>
&nbsp;
    <span style="color: #666666; font-style: italic;"># 正規表現で変換しにくい部分を処理</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$inSQ</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>    <span style="color: #666666; font-style: italic;"># in Single Quatation</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$inDQ</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>    <span style="color: #666666; font-style: italic;"># in Double Quatation</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$result</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$c</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">//,</span> <span style="color: #0000ff;">$line</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #0000ff;">$inSQ</span> <span style="color: #b1b100;">and</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">$inDQ</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;"># コーテーションの外側</span>
            <span style="color: #0000ff;">$result</span> <span style="color: #339933;">.=</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$c</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'$'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">$c</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;"># コーテーションの内側</span>
            <span style="color: #0000ff;">$result</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">$c</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$result</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>ところが最初の勢いはすぐに無くなってしまいました。明らかに破綻している気がしたからです。理由は幾つもあるのですが、やはり各行が独立している訳ではないので、行をまたぐ変換をするにはフラグだらけの酷い事になりそうだったからです。あとはコメントの存在がやっかいで、正規表現に一致した箇所がコメントか否かを一々判断するのは無理だと思いました。(そう判断したのは僕が正規表現力が足りないという事もあります。正規表現マスターなら見事に変換プログラムを書けるかもしれません。)</p>
<p><strong>2. token_get_allでチャレンジ</strong><br />
さて正規表現での変換を諦めて、じゃあ次はどうすれば良いのか考えました。<br />
先ほどのプログラムを書いていて思ったのは、やはりソースコードをある程度解析する必要があるという事です。例えば&#8221;if&#8221;という文字列があった時に、それがif構文のifなのか、コメント中のifなのか、変数名のifなのか、正規表現で正面からいきなりこれらの問題を解決するのは流石にキツいので、このifはif構文のifですよという事が先に解っている状態にしてから変換をかけたいです。</p>
<p>という事で少し調べてみると、phpには<a href="http://php.morva.net/manual/ja/function.token-get-all.php">token_get_all</a>というメソッドが用意されている事がわかりました。このメソッドをにphpのスクリプトを文字列で渡すと、解析してtoken列として返却されます。いわゆる字句解析を行ってくれる訳です。例えば以下のような訳の解らないプログラムを渡すと、(T_IF, T_VARIABLE, T_COMMENT, T_PRINT, T_CONSTANT)の様にtoken列として返却されます。これで先ほどのこのifは何のifなのかという問題は解決されました。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt; ?php
# 以下のヒアドキュメント中のphpコードから
$code = &lt;&lt;&lt; PHP
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>\<span style="color: #000088;">$if</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">/* if $if is true */</span> <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\$</span>if&quot;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
PHP;
&nbsp;
$tokens = token_get_all($code);
foreach ($tokens as $token) {
  if (is_array($token))
    print token_name($token[0]) . &quot;\n&quot;;
}
/* 以下のような出力を得られる (T_WHITESPACEは消去)
    T_OPEN_TAG
    T_IF
    T_VARIABLE
    T_COMMENT
    T_PRINT
    T_CONSTANT_ENCAPSED_STRING
    T_CLOSE_TAG
 */
?&gt;</pre></div></div>

<p>これは行けるかもしれないと、再度意気揚々とコードを書き始めたのですが、またまたすぐに止めてしまいました。正規表現で書くよりは見通しの良いプログラムになりそうだったのですが、字句解析されたトークンを元に変換を考えた場合、先ほどと同じで、各トークンが独立でないので、トークンをまたぐ変換を行う為には多くの状態変数が必要になります。この状態変数がおそらくは複雑すぎて、僕には到底扱える気がしませんでした。字句解析だけでも不十分なのです。</p>
<p><strong>3. phcでチャレンジ</strong><br />
ここまでで解ったのはプログラムを変換するには、最低でもプログラムの構文木を得る必要があるという事です。という訳でphp構文木を得られるツールは無いかと探して見つけたのが<a href="http://taichino.com/programming/928">先ほどのphc</a>です。<br />
このphcを利用して再々度変換を行ってみる事にしました。このツールを使うと先ほどのエントリでも書いたようにphpスクリプトの構文木をXMLとして出力する事ができます。このXMLを見ながらpythonのコードを出力すれば良いので、php => pythonの変換を直接するよりもxml => pythonの方が遥かに簡単に期待の動作を得られそうです。(出力されるXMLのスキーマは<a href="http://www.phpcompiler.org/phc-1.0/">これ</a>です)</p>
<p>すでに構文木が得られているので、今まで問題となっていた複雑すぎる状態変数等に悩まされる事無く、単純に構文木の各ノードを辿りながら対応するpythonコードを出力するだけです。phpコードを入力としてpythonコードを吐くメインクラスは以下のようになりました。各々のノードタイプにあわせたProcessorを用意して、ノードをプロセッサに食わせると対応するpythonコードが出力される仕組みです。メインメソッドはprocess_nodeとprocess_downで、計15行と結構すっきり書けたんじゃないかと思います。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ProcessContext <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;"># メンバ変数省略
</span>  <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
  	<span style="color: #666666; font-style: italic;"># dispatcherに各ノードに対応したプロセッサを準備しておく
</span>    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dispatcher</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
          <span style="color: #0000ff;">'AST:PHP_script'</span>            <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">new</span> NodeProcessor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'AST:Statement_list'</span>        <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">new</span> StatementListProcessor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'AST:Catch'</span>                 <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">new</span> CatchProcessor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		  <span style="color: #666666; font-style: italic;"># 途中省略
</span>          <span style="color: #0000ff;">'AST:Throw'</span>                 <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">new</span> ThrowProcessor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$dom</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DomDocument<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">preserveWhiteSpace</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dom</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dom</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> start_process<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">process_node</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dom</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">firstChild</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;"># このメソッドがメインメソッド
</span>  <span style="color: #000000; font-weight: bold;">function</span> process_node<span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contextData</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$cur</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nodeName</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">process_down</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contextData</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">process_node</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nextSibling</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contextData</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">function</span> process_down<span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contextData</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$processor</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dispatcher</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nodeName</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$processor</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$processor</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">defaultProcessor</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$processor</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">comment_process</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contextData</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$done</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$processor</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pre_process</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contextData</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$done</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">process_node</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">firstChild</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contextData</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$processor</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post_process</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$contextData</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;"># 残りのメンバメソッド省略
</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>まだ変換漏れも多く、バグも潜んでいると思いますが、手元ではこのスクリプトを使って以下のような変換結果となっています。元のphpコードよりは変換後のコードをベースにした方が楽に移植できそうな位には変換できてる気がします。<br />
<strong>変換前</strong></p>

<div class="wp_syntax"><div 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: #009933; font-style: italic;">/**
 * 変換を意識したFizzBuzzです。
 * ただし変換後そのままでは動作しません
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> FizzBuzz <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// メインルーチン</span>
  <span style="color: #000000; font-weight: bold;">function</span> fizzbuzz<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	  <span style="color: #000088;">$out</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
	  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$out</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Fizz'</span><span style="color: #339933;">;</span>
	  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">5</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$out</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'Buzz'</span><span style="color: #339933;">;</span>
	  <span style="color: #009900;">&#125;</span>
	  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$out</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$out</span>&quot;</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: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$i</span><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: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$fb</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> FizzBuzz<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$fb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fizzbuzz</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p><strong>変換後</strong></p>

<div class="wp_syntax"><div 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: #483d8b;">&quot;&quot;&quot;*
 * 変換を意識したFizzBuzzです。
 * ただし変換後そのままでは動作しません
 &quot;&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> FizzBuzz:
  <span style="color: #808080; font-style: italic;"># メインルーチン</span>
  <span style="color: #ff7700;font-weight:bold;">def</span> fizzbuzz<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">while</span> i+=<span style="color: #ff4500;">1</span><span style="color: #66cc66;">&amp;</span>lt<span style="color: #66cc66;">;</span><span style="color: #ff4500;">100</span>:
      out = <span style="color: #483d8b;">&quot;&quot;</span>
      <span style="color: #ff7700;font-weight:bold;">if</span> i<span style="color: #66cc66;">%</span>3==<span style="color: #ff4500;">0</span>:
        out = <span style="color: #483d8b;">&quot;Fizz&quot;</span>
      <span style="color: #ff7700;font-weight:bold;">if</span> i<span style="color: #66cc66;">%</span>5==<span style="color: #ff4500;">0</span>:
        out+=<span style="color: #483d8b;">&quot;Buzz&quot;</span>
      <span style="color: #ff7700;font-weight:bold;">if</span> out:
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span>+out+<span style="color: #483d8b;">&quot;&quot;</span>+<span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span>+i+<span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
fb = FizzBuzz<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
fb.<span style="color: black;">fizzbuzz</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><strong>まとめと課題</strong><br />
構文木にアクセスできれば、構文木に対する出力を制御できるので、なんちゃって言語変換プログラムを割と簡単に作る事が出来るという事が解りました。もっと他の言語の構文木を弄るのも面白そうなので時間があればやってみようと思います。<del datetime="2009-09-10T19:49:40+00:00">一応現状のコードは<a href='http://taichino.com/wp-content/uploads/2009/09/php2py.php'>コレ</a>になります。</del><a href="http://github.com/taichino/php2py/tree/master">githubにリポジトリを作りました。</a></p>
<p>ただし変換後のコードの精度が必要な場合は、現状では全然不十分で使い物になりません。特に以下の２点をこれから気が向いた時に修正して行こうと思います。</p>
<ol>
<li>phpの構文木の変換フェーズを入れる<br />
今のところphpの構文木から直接pythonのコードに変換していますが、その為に構文自体を弄るような処理がしづらく、処理抜けも多いです。そこでphpの構文木からpythonの構文木へと変換するフェーズを入れる事で、より見通しのよいプログラムが書ける気がします。また言語ごとに定義されている構文木をうまく抽象化できたら、もっと面白い事ができそうですが、先は遠いですね。
</li>
<li>APIの違いを吸収する<br />
構文だけ変換しても、変換後のコードが動作するようにはならないので、APIの違いを吸収する必要があります。ただ、こちらは一番と違いどのようなアプローチが有効なのかイメージが掴めていないので試行錯誤が必要そうです。
</li>
</ol>
<p>あとソースを変換するのではなくて、バイトコードを変換するアプローチもあると思うので、そこらへんもちょっと調べてみようと思いますです。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/947/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>phc(PHPコンパイラ)でphpの構文木をXMLで出力してみる</title>
		<link>http://taichino.com/programming/928</link>
		<comments>http://taichino.com/programming/928#comments</comments>
		<pubDate>Thu, 10 Sep 2009 10:18:01 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[phc]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=928</guid>
		<description><![CDATA[phcというphpコンパイラを使ってphpの構文木を取得してみたので記録しておきます。インストールに手こずりました。 phcについて phcとはphpのコンパイラで、phpスクリプトをコンパイルして実行ファイルを作成する事ができます。例えば以下のようにコンパイルする事ができます。速くなるのかもしれませんが試していません。 % cat sample1.php &#60; ?php echo &#34;hello phc world\n&#34;; ?&#62; % phc -c sample1.php -o sample1 % ./sample1 hello phc world コンパイルだけだとあまり使い道が思いつかないのですが、コンパイラ機能を一部解放してくれていて、読み込んだスクリプトの構文木をxmlで出力する事ができます。なのでこのツールを利用するとphpの構文木に手軽にアクセスできて便利です。例えば以下のように変換できます。 % phc --dump-xml=ast sample1.php &#62; out.xml % cat out.xml &#60; ?xml version=&#34;1.0&#34;?&#62; &#60;ast :PHP_script xmlns:AST=&#34;http://www.phpcompiler.org/phc-1.1&#34; xmlns:HIR=&#34;http://www.phpcompiler.org/phc-1.1&#34; xmlns:MIR=&#34;http://www.phpcompiler.org/phc-1.1&#34; xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;&#62; &#60;/ast&#62;&#60;ast :Statement_list&#62; -- 長いので省略 -- &#60;/ast&#62; インストール手順 phpをenable-embedを有効にしてインストール phcをインストール 1. phpをenable-embedを有効にしてビルドしてインストール あまり理解していないのですが、phcを使用するにはphpが&#8211;enable-embedというフラグが有効状態でインストールされている必要があります。このフラグはyumやapt等のパッケージ管理ツールでインストールした場合は、ほぼ無効状態なので、ソースからビルドし直します。 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.phpcompiler.org/">phc</a>というphpコンパイラを使ってphpの構文木を取得してみたので記録しておきます。インストールに手こずりました。</p>
<p><span id="more-928"></span></p>
<p><strong>phcについて</strong><br />
phcとはphpのコンパイラで、phpスクリプトをコンパイルして実行ファイルを作成する事ができます。例えば以下のようにコンパイルする事ができます。速くなるのかもしれませんが試していません。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">cat</span> sample1.php
<span style="color: #000000; font-weight: bold;">&lt;</span> ?php
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;hello phc world<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
?<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">%</span> phc <span style="color: #660033;">-c</span> sample1.php <span style="color: #660033;">-o</span> sample1
<span style="color: #000000; font-weight: bold;">%</span> .<span style="color: #000000; font-weight: bold;">/</span>sample1
hello phc world</pre></div></div>

<p>コンパイルだけだとあまり使い道が思いつかないのですが、コンパイラ機能を一部解放してくれていて、読み込んだスクリプトの構文木をxmlで出力する事ができます。なのでこのツールを利用するとphpの構文木に手軽にアクセスできて便利です。例えば以下のように変換できます。</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">% phc --dump-xml=ast sample1.php &gt; out.xml
% cat out.xml
&lt; ?xml version=&quot;1.0&quot;?&gt;
&lt;ast :PHP_script xmlns:AST=&quot;http://www.phpcompiler.org/phc-1.1&quot;
                xmlns:HIR=&quot;http://www.phpcompiler.org/phc-1.1&quot;
				xmlns:MIR=&quot;http://www.phpcompiler.org/phc-1.1&quot;
				xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;
  &lt;/ast&gt;&lt;ast :Statement_list&gt;
   -- 長いので省略 --
&lt;/ast&gt;</pre></div></div>

<p><strong>インストール手順</strong></p>
<ol>
<li>phpをenable-embedを有効にしてインストール</li>
<li>phcをインストール</li>
</ol>
<p><strong>1. phpをenable-embedを有効にしてビルドしてインストール</strong><br />
あまり理解していないのですが、phcを使用するにはphpが&#8211;enable-embedというフラグが有効状態でインストールされている必要があります。このフラグはyumやapt等のパッケージ管理ツールでインストールした場合は、ほぼ無効状態なので、ソースからビルドし直します。</p>
<p>僕はここでハマりました。完全に正しいかどうかは解らないのですが、試行錯誤の結果、手元で動作した際のconfigureオプションを以下に書いておきます。phpのソースは最新の5.2.10を使いました。OSはCentOS 5.3になります。osxでも試してみましたが上手く行きませんでした。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>jp2.php.net<span style="color: #000000; font-weight: bold;">/</span>get<span style="color: #000000; font-weight: bold;">/</span>php-5.2.10.tar.bz2<span style="color: #000000; font-weight: bold;">/</span>from<span style="color: #000000; font-weight: bold;">/</span>jp.php.net<span style="color: #000000; font-weight: bold;">/</span>mirror
<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> jxvf php-5.2.10.tar.bz2
<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">cd</span> php-5.2.10
<span style="color: #000000; font-weight: bold;">%</span> .<span style="color: #000000; font-weight: bold;">/</span>configure \
<span style="color: #660033;">--enable-bcmath</span> \
<span style="color: #660033;">--enable-embed</span> \
<span style="color: #660033;">--enable-cli</span> \
<span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr \
<span style="color: #660033;">--with-zlib-dir</span>=<span style="color: #000000; font-weight: bold;">/</span>usr \
<span style="color: #660033;">--enable-mbstring</span> \
<span style="color: #660033;">--enable-mbregex</span> \
<span style="color: #660033;">--enable-sockets</span> \
<span style="color: #660033;">--with-iodbc</span>=<span style="color: #000000; font-weight: bold;">/</span>usr \
<span style="color: #660033;">--with-curl</span>=<span style="color: #000000; font-weight: bold;">/</span>usr \
<span style="color: #660033;">--with-config-file-path</span>=<span style="color: #000000; font-weight: bold;">/</span>etc \
<span style="color: #660033;">--with-xmlrpc</span> \
<span style="color: #660033;">--with-xsl</span>=<span style="color: #000000; font-weight: bold;">/</span>usr \
<span style="color: #660033;">--without-pear</span> \
<span style="color: #660033;">--without-iodbc</span>
<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p><strong>2. phcをインストール</strong><br />
phpのインストールが完了したら、phcをソースコードからインストールします。boostやその他パッケージが何かと必要になりますが、configureがエラーを吐くので、エラーに従って必要なライブラリをインストールして下さい。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>phc.googlecode.com<span style="color: #000000; font-weight: bold;">/</span>files<span style="color: #000000; font-weight: bold;">/</span>phc-0.2.0.3.tar.bz2
<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">tar</span> jxvf phc-0.2.0.3.tar.bz2
<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #7a0874; font-weight: bold;">cd</span> phc-0.2.0.3
<span style="color: #000000; font-weight: bold;">%</span> .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--includedir</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>php <span style="color: #660033;">--with-php</span>=<span style="color: #000000; font-weight: bold;">/</span>usr <span style="color: #660033;">--disable-gc</span>
<span style="color: #000000; font-weight: bold;">%</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>なお、手順1でphpが上手くインストールされていないと、configureが以下のような警告を出します。この警告が出た場合は、phc自体のインストールは出来ますが、動きませんので手順１をやり直して下さい。</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">*******************************************************************************
* It seems the PHP embed SAPI has not been installed.                         *
*                                                                             *
* You will be able to compile and run phc, but you will not be able to        *
* compile PHP scripts with phc.                                               *
*                                                                             *
* To install the PHP embed SAPI, follow the PHP installation instructions,    *
* but make sure to pass the --enable-embed option to the PHP configure        *
* script.                                                                     *
*******************************************************************************</pre></div></div>

<p><strong>まとめ</strong><br />
という訳で、以上でphpの構文木にアクセスする手段が出来ました。以下のようにすると標準出力に構文木を表すXMLが得られます。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">%</span> phc <span style="color: #660033;">--dump-xml</span>=ast <span style="color: #7a0874; font-weight: bold;">&#40;</span>phpファイル名<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>他にも幾つか出力形式が選べるようですが、詳しくは<a href="http://www.phpcompiler.org/doc/latest/manual.html#users-manual">ドキュメントを参照</a>して下さいませ。<br />
一応上記sample1.phpのXML出力を貼付けておきます。十分実用レベルの構文木が得られてると思います。<br />
<a href='http://taichino.com/wp-content/uploads/2009/09/out.xml'>出力したXML</a></p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/928/feed</wfw:commentRss>
		<slash:comments>0</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>
	</channel>
</rss>

