<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd">
  <channel>
    <title>学習ノート</title>
    <link>http://blog.hahasoha.net/</link>
    <description>学習ノート</description>
    <language>ja</language>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <itunes:subtitle></itunes:subtitle>
    <itunes:summary>学習ノート</itunes:summary>
    <itunes:keywords>PostgreSQL</itunes:keywords>
    
    <itunes:author>hahasoha</itunes:author>
    <itunes:owner>    
       <itunes:name></itunes:name>
       <itunes:email></itunes:email>
    </itunes:owner>
        <itunes:explicit>no</itunes:explicit>
        <item>
      <link>http://blog.hahasoha.net/article/181923072.html</link>
      <title>pg_prewarmについて</title>
      <pubDate>Sun, 24 Dec 2017 00:00:00 +0900</pubDate>
      <description>無駄に長い前置き　これは、PostgreSQL Advent Calendar 2017の16日目の記事です。　昨日はnuko_yokohamaさんの記事でした。　PostgreSQL10では9.6で実装されたパラレルクエリが強化されており、集計・分析業務への適合性が高まっております。　また、ある程度増減するとはいえ、CPUやメモリの価格も時の流れとともにどんどん安くなっています。　数百GBくらいのデータであれば、データを全てメモリに乗せてしまって、マルチコアでパラレルクエリ..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;"><strong>無駄に長い前置き</strong></span></div><div>　これは、PostgreSQL Advent Calendar 2017の16日目の記事です。</div><div>　昨日は<a href="https://qiita.com/nuko_yokohama/items/15f958fc0bb86f6dc19d" target="_blank">nuko_yokohama</a>さんの記事でした。</div><br /><div>　PostgreSQL10では9.6で実装されたパラレルクエリが強化されており、集計・分析業務への適合性が高まっております。</div><br /><div>　また、ある程度増減するとはいえ、CPUやメモリの価格も時の流れとともにどんどん安くなっています。</div><div>　数百GBくらいのデータであれば、データを全てメモリに乗せてしまって、マルチコアでパラレルクエリをぶん回してしまえば、大抵の場合はどうにかなってしまうのではないか……と、昔から考えております。</div><div>　当然、数十TBやPB級は難しいでしょうし、PostgreSQLはインメモリDBでもなければ列指向型DBでもありませんので、高速に集計をすることを前提に作られたDBMSと比較すると効率は良くないでしょう。</div><br /><div>　ただ、記事執筆時点で、例えばDELL社のサイトでサーバを見積もると、CPU物理18コア2ソケットで物理36コア、メモリ32GBを8枚刺しの256GBくらいのマシンであれば、150万円～200万円程度で購入できてしまいます。</div><div>　この値段が高いかはケースバイケースではありますが、過去に構築した集計用システムを高速化したいだけであれば、ハードの一新とPostgreSQLのバージョンアップをするだけで十分に高速化する可能性があるわけで、工数を考慮すると、一概に高いとは言えないのではないかと思われます。</div><br /><div>　ですが、ここまでのお話は、あくまでもデータがメモリに乗っていることが前提であって、そうでなければストレージがボトルネックになってしまいますので、いくらCPUがマルチコアであってもあまり意味がありません。(超高速SSDも台頭してきておりますが)</div><br /><div>　……と、前置きが長くなりましたが、データをメモリに乗せるために、pg_prewarmを使いましょう、というのがこの記事の主題です。</div><div>　（思いがつくままに書き連ねたため、大分内容が発散しておりますが、予めご了承ください……）</div><br /><br /><div><span style="font-size: 10pt;"><strong>pg_prerwarmの概要</strong></span></div><div>　<a href="https://www.postgresql.jp/document/9.4/html/pgprewarm.html" target="_blank">pg_prewarmはVer9.4から追加で提供されるようになったモジュール</a>で、ざっくり言ってしまえばPostgreSQLのデータをメモリに乗せるためのモジュールです。公式ドキュメントでも、「プレウォームはキャッシュが主に空のとき、一般的には起動時にもっとも有用です。」と記載されています。</div><br /><div>　CREATE EXTENSIONで一発で導入できますし、SELECT pg_prewarm('リレーション名')と実行するだけでメモリにデータが乗ります。</div><div>　この時、メモリへのデータの乗せ方を第2引数で「buffer」「prefetch」「read」の3種類から選ぶことができます。</div><br /><br /><div><span style="font-size: 10pt;"><strong>キャッシュされる場所の違い</strong></span></div><div>　「buffer」が指定された場合はPostgreSQLのshared_buffersにキャッシュされ、「prefetch」「read」の場合はOSのバッファキャッシュにデータがロードされます。</div><br /><div>　shared_buffersの中身は<a href="https://www.postgresql.jp/document/9.6/html/pgbuffercache.html" target="_blank">pg_buffercacheモジュール</a>で確認可能ですし、OSのバッファキャッシュも、Linuxの場合はlinux-ftools等でファイル単位に細かく確認可能です。</div><div>　（PostgreSQLのリレーションは$PGDATA/base配下にファイルで管理されますので、oid2name等でリレーションのFilenodeを確認できれば、どのリレーションがどのくらいOSにバッファキャッシュされているかも確認できます）</div><br /><div>　データがキャッシュされていると一言にいっても、ざっくり「shared_buffersにだけキャッシュされている」「OSバッファだけにキャッシュされている」「shared_buffersとOSバッファに重複してキャッシュされている」の3パターンが考えられることになります。</div><div>　（最後のパターンは明らかに無駄が多いので、検討からは割愛します）</div><br /><br /><div><span style="font-size: 10pt;"><strong>shared_buffersとOSのどちらにキャッシュさせるべきなのか？</strong></span></div><div>　pg_prewarmのオプションで指定可能なことからも察せられるように、用途によって異なるというのが一般解ではあるかと思われます。</div><br /><div>　手元の環境で、CPUがボトルネックになるような参照系クエリの処理時間を比較した限りでは、shared_buffersだろうがOSだろうが、どちらのキャッシュに乗っていても明確な処理時間の差は確認できませんでした。</div><div>　（OSキャッシュの場合は、shared_buffersにデータをコピーしてから処理をすることになる筈ですので、その分の影響が出るかとも思いましたが、特に遅延は確認されませんでした）</div><br /><div>　今回の前置きに書いたように、主に参照系の分析用途にメモリを数百GBも積んで、全データをメモリに乗せてしまおう……という用途であれば、深く検証はできておりませんが、記事執筆時点ではOSのバッファキャッシュの方が「無難」ではないかと考えております。</div><br /><div>　shared_buffersが極端に大きい状態ですと、チェックポイント処理が走った場合の負荷量に不安がありますし、ホストマシンのメモリ枯渇時のOOM Killerも考慮する必要が出てきます。ただ、チェックポイント処理もチューニングできますし、PostgreSQL関連プロセスをOOM Killerの対象外にすることも可能ですので、それらの対処コストを上回るメリットがあるのならば、shared_buffersに乗せてしまうのもありかもしれません。</div><br /><div>　ただし、「buffer」を指定してprewarmした場合、既にshared_buffersに格納されている分のデータは再読み込みされないようですが、そうでない分のデータは、shared_buffersに乗ると同時に、OSのキャッシュにも同時に乗る模様です。</div><div>　「データはなるべくメモリに乗せたい。しかし同一サーバ上でPostgreSQL以外も動作していて、OSのキャッシュにも色々と乗せておきたい」……というようなケースでは、PostgreSQLのデータを重複してメモリに乗せるほど余裕はないのではないかと思われます。</div><br /><br /><div><span style="font-size: 10pt;"><strong>「prefetch」「read」はどちらを使うべきなのか？</strong></span></div><div>　公式ドキュメントにも記載がありますが、「prefetch」が動作するならば「prefetch」の方が処理速度が速いです。</div><div>　CentOS7上でltraceを使って確認した限りでは、「prefetch」だと内部的にposix_fadvise関数が、「read」はそのままread関数が呼び出されているようです。</div><br /><div>　ストレージから初回読み込みをする際はストレージがボトルネックになりますので、どちらを選んでも速度的に大差はないかと思われますが、cronか何かでメモリに乗せる処理を定期的に実行するような場合は、「prefetch」の恩恵が大きくなるかと思われます。</div><br /><br /><div><span style="font-size: 10pt;"><strong>pg_prewarm_all自作関数</strong></span></div><div>　ここまでツラツラと書いてみて、大して有益な情報を書けていない感が強かったため、自身が接続しているDBのpublicスキーマ全体を問答無用でメモリに乗せようとする関数を書いてみました。（当然、pg_prewarmが使えることが前提です）</div><div>　pg_classからリレーションを取得してLOOPでpg_prewarmを回しているだけですので、少しクエリをいじれば条件は変更可能です。</div><div>---</div><div>CREATE OR REPLACE FUNCTION pg_prewarm_all()</div><div>RETURNS text AS $BODY$</div><div>DECLARE</div><div>sql text;</div><div>relnames text;</div><br /><div>BEGIN</div><br /><div>FOR relnames IN</div><div>&nbsp; SELECT relname::text FROM pg_class</div><div>&nbsp; WHERE</div><div>&nbsp; &nbsp; relnamespace = (</div><div>&nbsp; &nbsp; &nbsp; SELECT oid FROM pg_catalog.pg_namespace</div><div>&nbsp; &nbsp; &nbsp; WHERE</div><div>&nbsp; &nbsp; &nbsp; &nbsp; nspname = 'public'</div><div>&nbsp; &nbsp; )</div><div>&nbsp; AND&nbsp;</div><div>&nbsp; &nbsp; relkind IN('r','i')</div><br /><div>LOOP</div><div>&nbsp; sql := 'SELECT pg_prewarm(''' || relnames || ''',''buffer'')';</div><div>&nbsp; EXECUTE sql;</div><div>END LOOP;</div><br /><div>RETURN 'OK';</div><br /><div>END $BODY$</div><div>LANGUAGE plpgsql;</div><div>---</div><br /><div>駄文でしたが、最後までお読み頂きありがとうございました。</div><br /><div>最終日は、<a href="https://qiita.com/soudai1025">soudai1025</a>さんです。</div><br /><a name="more"></a>

]]></content:encoded>
            <category>PostgreSQL</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/179557316.html</link>
      <title>さくらのレンタルサーバライトでContent-Encoding: gzipの無効化について</title>
      <pubDate>Tue, 25 Apr 2017 23:04:22 +0900</pubDate>
      <description>　このブログがさくらのブログであることからも明らかですが、さくらのレンタルサーバライトを利用して、いくつかのWebサービスを運用しております。　何年も前に青空文庫形態素解析データ集というサイトを作っておりまして、このサイトもさくらのレンタルサーバ上にコンテンツを配置しております。　その名の通り、青空文庫で公開されているデータを形態素解析した結果をzipやらgzipでダウンロードできるサイトなのですが、先日gzip圧縮されているファイルをダウンロードしたところ、拡張子はgzなの..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;">　このブログがさくらのブログであることからも明らかですが、さくらのレンタルサーバライトを利用して、いくつかのWebサービスを運用しております。</span></div><div><span style="font-size: 10pt;">　何年も前に<a href="http://aozora-word.hahasoha.net/" target="_blank">青空文庫形態素解析データ集</a>というサイトを作っておりまして、このサイトもさくらのレンタルサーバ上にコンテンツを配置しております。</span></div><br /><div><span style="font-size: 10pt;">　その名の通り、青空文庫で公開されているデータを形態素解析した結果をzipやらgzipでダウンロードできるサイトなのですが、先日gzip圧縮されているファイルをダウンロードしたところ、<strong>拡張子はgzなのに、実際は解凍済みのファイルがダウンロードされる</strong>という事象が発生しました。</span></div><br /><div><span style="font-size: 10pt;">　一括ダウンロードのページでは、わざわざ解凍前と解凍後のサイズを明記しているというのに…</span></div><br /><div><span style="font-size: 10pt;">　オペミスか何かで解凍済みのファイルを拡張子をgzとして配置してしまったのかとも思いましたが、サーバに格納されているファイルを確認すると、ちゃんとgzip圧縮されたファイルが配置されていました。</span></div><br /><div><span style="font-size: 10pt;">　どうも、Content-Encodingのgzipが有効になっていて、圧縮転送がされているとブラウザ(Chrome)が判断して、自動的に解凍してしまっている模様です。</span></div><br /><div><span style="font-size: 10pt;">　はて、Content-Encodingのgzipとは、意図的に設定しないでも勝手につくものだったのかしら…ということも気になりますが、とりあえずはブラウザで解凍されないようにすることが先決ですので、方法を調べてみました。</span></div><br /><div><span style="font-size: 10pt;">　で、思ったより苦戦しましたが、とりあえず、.htaccessに以下を追記することで、Chromeでは解凍されずにダウンロードできるようになりました。</span></div><br /><br /><br /><div><div><span style="font-size: 14pt;">&lt;FilesMatch "\.gz$"&gt;</span></div><div><span style="font-size: 14pt;">&nbsp; AddEncoding identity .gz</span></div><div><span style="font-size: 14pt;">&lt;/FilesMatch&gt;</span></div><br /><br /><div><span style="font-size: 10pt;">　さて、以下は上記に至るまでの経過を示していきます。内容に不備があるようであれば、有識者の方は突っ込みをお願いいたします。</span></div><br /><div><span style="font-size: 10pt;">　そもそも、ブラウザがgzファイルを解凍してしまうのは、HTTPレスポンスヘッダのContent-Encodingにgzipが含まれているからではないかと推測し、Wiresharkでパケットを確認した結果、確かに「Content-Encoding: gzip」が含まれていました。</span></div><br /><div><span style="font-size: 10pt;">　ちなみに、他のサイトでgzファイルをダウンロードしても自動的に解凍されませんでした（レスポンスにContent-Encodingそのものがなかった）ので、やはりサーバの設定の問題のようです。</span></div><br /><br /><div><span style="font-size: 10pt;">　で、ブラウザに解凍をさせたくない場合は、Content-Encodingヘッダそのものをつけないのが正しいようですので、初めはmod_headersを用いて以下のようにしてみましたが、<strong>どうにもContent-Encodingヘッダが削除されませんでした。</strong></span></div><br /><div><div><span style="font-size: 10pt;">&lt;FilesMatch "\.gz$"&gt;</span></div><div><span style="font-size: 10pt;">&nbsp; Header unset Content-Encoding</span></div><div><span style="font-size: 10pt;">&lt;/FilesMatch&gt;</span></div><br /><div><span style="font-size: 10pt;">　ETagヘッダで試してみると問題なく削除できましたので、機能が動作していないということはない筈なのですが…</span></div><div><span style="font-size: 10pt;">　あまり自信のない推測ですが、Content-Encodingヘッダはレスポンスヘッダの末尾についておりますので、除去された後にもう一度付与されている…のでしょうか。（私の単なる勘違いだったら申し訳ないですが）</span></div><br /><div><span style="font-size: 10pt;">　次は、Content-Encodingを削除することは一旦あきらめて、内容を変更する方法で検討しました。</span></div><div><span style="font-size: 10pt;">　AddEncodingで変更できることはわかったのですが、<strong>何の文字列に変更すべきかがわからない</strong>…</span></div><br /><div><span style="font-size: 10pt;">　<a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5" target="_blank">RFC2616</a>を見る限りでは…以下のような記載がありますので、やはり、identityが一番近いように読めます。</span></div><br /><div><span style="font-family: Meiryo; font-size: 10pt;">identity The default (identity) encoding; the use of no transformation whatsoever. This content-coding is used only in the Accept- Encoding header, and SHOULD NOT be used in the Content-Encoding header.</span></div><br /><div><span style="font-family: Meiryo; font-size: 10pt;">　<a href="https://www.ipa.go.jp/security/rfc/RFC2119JA.html" target="_blank">SHOULD NOTという表現は、「しないほうがよい」というレベルで、「してはならない」ではないようです</a>ので、ご勘弁を。</span></div><br /><div><span style="font-family: Meiryo; font-size: 10pt;">（長時間かけてググったわけではないですが、同じ事象で困っている人は見つけられませんでしたので、何か私が根本的な勘違いをしている気もしておりますが…）</span></div></div></div><a name="more"></a>

]]></content:encoded>
            <category>その他</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/179066830.html</link>
      <title>BVH WEB VIEWERを公開しました</title>
      <pubDate>Sun, 12 Mar 2017 16:31:28 +0900</pubDate>
      <description>BVH WEB VIEWERを公開しました。http://motion.hahasoha.net/　ひょんなことからVRに触れることになり、関連しそうな情報を色々と調べていたところ、カーネギーメロン大学が公開しているモーションデータをbvh形式に変換して公開しているサイトを見つけました。　必要なツールをダウンロードしてbvhファイルを読み込めば、色々なモーションが見れてなかなか楽しいです。　…が、もっと気軽に検索できて、パパッとモーションを閲覧できる方法がないか調べた結果、ど..</description>
            <content:encoded><![CDATA[
<a href="http://motion.hahasoha.net/" target="_blank">BVH WEB VIEWERを公開しました。<br />http://motion.hahasoha.net/</a><br /><br />　ひょんなことからVRに触れることになり、関連しそうな情報を色々と調べていたところ、<a href="https://sites.google.com/a/cgspeed.com/cgspeed/motion-capture/cmu-bvh-conversion" target="_blank">カーネギーメロン大学が公開しているモーションデータをbvh形式に変換して公開しているサイト</a>を見つけました。<br /><br />　必要なツールをダウンロードしてbvhファイルを読み込めば、色々なモーションが見れてなかなか楽しいです。<br />　…が、もっと気軽に検索できて、パパッとモーションを閲覧できる方法がないか調べた結果、どうも適合するサイトはなさそうでしたので、冒頭の<a href="http://motion.hahasoha.net/" target="_blank">BVH WEB VIEWER</a>を作成し、公開しました。<br /><br />　作成したといっても、three.jsのサンプルコードも殆ど流用させてもらっていますし、手抜き感は否めませんが…<br />　パパッとモーションを検索して、ブラウザで動作を確認してそのままbvhファイルをダウンロードできるようにしましたので、使い勝手は悪くはないかと思います。（手元のスマホで表示をしたらiframeが荒ぶったため、とりあえずPC限定としていますが）<br /><br />　ただ、実際に動きを見ても、何の動きなのかわからないのも多数ありますが…（Alaskan vacationって何なんでしょう…？）<br /><br />　3Dコンテンツの作成は完全に門外漢なので、どれくらいの需要があるのか把握できておりませんが、bvhファイルはBlenderではそのまま使えるようですし、<a href="http://www.drf.co.jp/liveanimation/" target="_blank">ドリームファクトリーのLiveAnimation</a>で変換すればMMDでも使える模様です。<br /><br />　2016年はVR元年と言われていますが、3D系の素材に対する需要・供給も増加していきそうですね。<br /><a name="more"></a>

]]></content:encoded>
            <category>その他</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/174001836.html</link>
      <title>Raspberry PiのGPUアンダークロックと消費電力について</title>
      <pubDate>Sat, 13 Feb 2016 00:00:00 +0900</pubDate>
      <description>前日の記事に引き続き、今度はCPUに加えてGPUもアンダークロックした場合の消費電力について調査しました。使用したモバイルバッテリや条件は以前の記事をご参照ください。まず、/boot/config.txt に gpu_freq=100 と追記してPi Zeroを再起動しようとすると、ディスプレイが点滅を繰り返し、正常起動できませんでした。（公式サイトによると、デフォルトは250だそうです）HDMIを接続して画面表示をしようとしていたので、もしかしたらHDMI接続をしなければ起..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;">前日の記事に引き続き、今度はCPUに加えてGPUもアンダークロックした場合の消費電力について調査しました。</span></div><br /><div><span style="font-size: 10pt;">使用したモバイルバッテリや条件は<a href="http://blog.hahasoha.net/article/173616700.html" target="_blank">以前の記事</a>をご参照ください。</span></div><br /><div><span style="font-size: 10pt;">まず、/boot/config.txt に&nbsp;<span style="color: #555555; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;">gpu_freq=100 と追記してPi Zeroを再起動しようとすると、ディスプレイが点滅を繰り返し、正常起動できませんでした。（<a href="https://www.raspberrypi.org/documentation/configuration/config-txt.md" target="_blank">公式サイト</a>によると、デフォルトは250だそうです）</span></span></div><div><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; font-size: 10pt; line-height: 19.2px;">HDMIを接続して画面表示をしようとしていたので、もしかしたらHDMI接続をしなければ起動可能なのかもしれません。</span></div><br /><div><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; font-size: 10pt; line-height: 19.2px;">で、このままだと起動できなくて困ってしまうわけですが、電源投入時にShiftキーを押下してリカバリモードに入れば、/boot/config.txt の内容を編集できるGUIが表示されます。</span></div><br /><div><span style="font-size: 10pt;"><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;">gpu_freqを100から150に変更したらHDMIを接続した状態での起動に成功しました。</span></span></div><br /><div><span style="font-size: 10pt;"><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;">前述の公式サイトに寄ると</span><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; line-height: 19.2px;">core_freq, h264_freq, isp_freq,v3d_freqも一緒にセットしろと書かれているようですので、あわせて150に設定してみました。</span></span></div><br /><div><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; font-size: 10pt; line-height: 19.2px;">結果としては、<strong>9時間36分間</strong>、起動し続けました。</span></div><br /><div><span color="#555555" face="Arial, Helvetica, sans-serif" style="color: #555555; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 13.3333px; line-height: 19.2px;">これまでに確認したZeroの起動時間をまとめると以下のようになります。</span></span></div><br /><div><span color="#555555" face="Arial, Helvetica, sans-serif" style="color: #555555; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 13.3333px; line-height: 19.2px;">　<strong>8時間30分</strong>　デフォルト状態</span></span></div><div><span color="#555555" face="Arial, Helvetica, sans-serif" style="color: #555555; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 13.3333px; line-height: 19.2px;">　<strong>8時間48分</strong>　</span></span><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 19.2px;">arm_freq 100</span></div><div><span color="#555555" face="Arial, Helvetica, sans-serif" style="color: #555555; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 13.3333px; line-height: 19.2px;">　<strong>9時間36分</strong>　</span></span><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 19.2px;">arm_freq 100、</span><span style="color: #555555; font-family: Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 19.2px;">gpu系5種 150</span></div><br /><div><span color="#555555" face="Arial, Helvetica, sans-serif" style="color: #555555; font-family: Arial, Helvetica, sans-serif;"><span style="font-size: 13.3333px; line-height: 19.2px;">繰り返しテストしたわけではありませんので信頼性は高くはありませんが、GPU系のアンダークロックは10%ほど消費電力を抑える効果が見込めそうですね。</span></span></div><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/173899032.html</link>
      <title>Raspberry PiのCPUアンダークロックと消費電力について</title>
      <pubDate>Thu, 11 Feb 2016 13:17:52 +0900</pubDate>
      <description>Raspberry Piとモバイルバッテリを使った調査をこれまでに色々とやっているわけですが、アンダークロックと消費電力について調査してみました。Raspberry Piのクロック数はraspi-configや、/boot/config.txtの編集で簡単に変更可能です。arm_freqを100まで落とし、例の如く、Pi Zeroで以下のモバイルバッテリでどれだけの時間起動できるのか確認してみました。（その他の条件については前回と同様です）結果としては、8時間48分間、起動し..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;">Raspberry Piとモバイルバッテリを使った調査をこれまでに色々とやっているわけですが、アンダークロックと消費電力について調査してみました。</span></div><br /><div><span style="font-size: 10pt;">Raspberry Piのクロック数はraspi-configや、<a href="https://www.raspberrypi.org/documentation/configuration/config-txt.md" target="_blank">/boot/config.txtの編集</a>で簡単に変更可能です。</span></div><div><span style="font-size: 10pt;">arm_freqを100まで落とし、例の如く、Pi Zeroで以下のモバイルバッテリでどれだけの時間起動できるのか確認してみました。（その他の条件については<a href="http://blog.hahasoha.net/article/173616700.html" target="_blank">前回</a>と同様です）</span></div><br /><div style="text-align: center;"><span style="font-size: 10pt;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B007W09T8U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></span><br /><br /><div style="text-align: left;"><span style="font-size: 10pt;">結果としては、<strong>8時間48分間</strong>、起動し続けました。</span></div><br /><div style="text-align: left;"><span style="font-size: 10pt;"><span style="font-size: 13.3333px;">arm_freqの値を編集していない状態で8時間30分でしたので、差がないわけではないが･･･といったところです。</span></span></div><br /><div style="text-align: left;"><span style="font-size: 10pt;"><span style="font-size: 13.3333px;">アンダークロックと消費電力については<a href="https://www.raspberrypi.org/forums/viewtopic.php?f=63&amp;t=83085" target="_blank">公式フォーラムでも過去に議題にあがっており</a>、</span></span><span style="font-size: 13.3333px;">arm_freqの値を小さくしても、消費電力には殆ど影響が出ない･･･というのが正しい挙動のようです。</span></div><br /><div style="text-align: left;"><span style="font-size: 13.3333px;">ただ、</span><span style="color: rgb(85, 85, 85); font-family: Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 19.2px;">容量1,430mAhのモバイルバッテリで一応は20分弱は起動時間を延長できたわけですから、もっと容量の大きなモバイルバッテリを利用すれば、その分、延長時間も大きくなるものと思われます。</span></div><br /><div style="text-align: left;"><span style="color: rgb(85, 85, 85); font-family: Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 19.2px;">また、前述の公式ドキュメントやフォーラムによると、どうもGPUもアンダークロックできそうですので、次回はgpu_freq,core_freq, h264_freq, isp_freq,v3d_freqの値を小さくして調査してみます。</span></div><br /></div><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/173625946.html</link>
      <title>Raspberry Pi Zeroの体積について</title>
      <pubDate>Sun, 07 Feb 2016 13:40:23 +0900</pubDate>
      <description>Raspberry Pi Zeroを実際に手にしてみると、その小ささ･･･というより、「薄さ」に驚きます。上の画像は、A+と並べて撮影したものです。Zeroの端がA+の下に入っていますが、これはA+をZeroの上に乗せているわけではありません。A+は裏面にmicroSDカードスロット等のモジュールがありますが、Zeroは裏面には何もなく、より薄くなっているため、触れずに下に差し込めるほどの差があります。簡単な計測ですが、A+はGPIO部まで含めて大体13～14mm、Zeroは..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;">Raspberry Pi Zeroを実際に手にしてみると、その小ささ･･･というより、「薄さ」に驚きます。</span></div><br /><div><span style="font-size: 10pt;"><a href="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/zero.jpg" target="_blank"><img style="display: block; margin-left: auto; margin-right: auto;" src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/zero-thumbnail2.jpg" alt="zero.jpg" width="434" height="137" border="0" /></a></span></div><br /><br /><div><span style="font-size: 10pt;">上の画像は、A+と並べて撮影したものです。</span></div><br /><div><span style="font-size: 10pt;">Zeroの端がA+の下に入っていますが、これはA+をZeroの上に乗せているわけではありません。</span></div><div><span style="font-size: 10pt;">A+は裏面にmicroSDカードスロット等のモジュールがありますが、Zeroは裏面には何もなく、より薄くなっているため、触れずに下に差し込めるほどの差があります。</span></div><br /><div><span style="font-size: 10pt;">簡単な計測ですが、A+はGPIO部まで含めて大体13～14mm、Zeroは6～7mmといったところです。</span></div><br /><div><span style="font-size: 10pt;">上から見た面積的にはZeroはA+の約半分ですが、体積的には約1/4ということになります。</span></div><br /><div><span style="font-size: 10pt;">当然、ZeroにもGPIOピンをつければ同じ厚さにはなりますが、個人的には、Zeroの最大のメリットは、この体積の小ささにある･･･と申しますか、このメリットを生かさなければ、Zeroを使う意味があまりないのではないかと考えています。</span></div><br /><div><span style="font-size: 10pt;">カバーをつけると厚さが増してしまいますし、カバーがZero本体よりお高くなる･･･なんてことにもなりますので、カバーはつけずに、小さな空間にガンガン組み込んでいき、壊れたら別のZeroに差し替える･･･という使い方が正しい使い方になりそうです。</span></div><div><span style="font-size: 10pt;">（現状ではまだ入手困難であるためあまり贅沢な使い方はできませんが）</span></div><br /><div>次の記事では、なるべくお手軽かつ省スペースにZeroを利用する方法について検討してみます。</div><br /><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/173616700.html</link>
      <title>Raspberry Pi Zeroの待機電力調査</title>
      <pubDate>Sun, 07 Feb 2016 12:07:14 +0900</pubDate>
      <description>Pimoroniで注文していたRaspberry Pi Zeroが届きました。これでB2、A+、Zeroと揃いましたので、完全に素の状態での待機中の消費電力を比較調査してみました。満タン状態のUSBモバイルバッテリを接続し、起動時刻からバッテリ切れでの停止時刻までを測定します。（cronで毎分現在時刻をテキストに追記し、最初と最後の時刻を比較するだけです）OSはNOOBS 1.5.0でいれたRaspbianで、cron以外の設定や更新は全く行いません。microSDカードとU..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;">Pimoroniで注文していたRaspberry Pi Zeroが届きました。</span></div><br /><div><span style="font-size: 10pt;">これでB2、A+、Zeroと揃いましたので、完全に素の状態での待機中の消費電力を比較調査してみました。</span></div><br /><div><span style="font-size: 10pt;">満タン状態のUSBモバイルバッテリを接続し、起動時刻からバッテリ切れでの停止時刻までを測定します。</span></div><div>（cronで毎分現在時刻をテキストに追記し、最初と最後の時刻を比較するだけです）</div><br /><div><span style="font-size: 10pt;">OSはNOOBS 1.5.0でいれたRaspbianで、cron以外の設定や更新は全く行いません。</span></div><div>microSDカードとUSBモバイルバッテリしかラズパイには接続せず、microSDカードは使い回します。</div><br /><div><span style="font-size: 10pt;">モバイルバッテリは容量1,430mAh の以下の製品を利用します。</span></div><br /><br /><div style="text-align: center;"><span style="font-size: 10pt;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B007W09T8U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></span></div><br /><br /><div><span style="font-size: 10pt;">早速、結果です。</span></div><div>Zero、A+、B2、Zero、A+、B2の順番に2回ずつ実施した平均値です。</div><br /><div><span style="font-size: 12pt;">　8時間30分　Zero</span></div><div><span style="font-size: 12pt;">　8時間29分　A+</span></div><div><span style="font-size: 12pt;">　3時間52分　B2</span></div><br /><div>一応はZeroが一番長く持ちましたが、A+との差は誤差の範囲ですね。</div><div><div>B2の短さが目立ってはしまいますが、性能に大きな差がありますので、これは当然の結果でしょう。</div><br /></div><div>色々とパーツが少ない分、ZeroがA+より長持ちするかとも思いましたが、CPUやメモリの性能がA+より若干高いため、相殺されているのかもしれません。</div><div>（個体差もあるのでしょうが）</div><br /><div>USB機器の接続を想定した場合、ZeroはmicroUSBなのに対し、A+は普通のUSBがそのまま刺さります。</div><div>普通のUSBをZeroで利用する場合は変換コネクタが必要になりますので、その分、A+より消費電力は不利になるかもしれません。</div><br /><div>Zeroの記事なのに、「やるじゃないかA+･･･」という感じになってしまいましたが、次の記事では、Zeroの利点をクローズアップしたいと思います。</div><br /><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/173236200.html</link>
      <title>Raspberry Pi A+の省スペース設置</title>
      <pubDate>Mon, 01 Feb 2016 23:44:39 +0900</pubDate>
      <description>Raspberry Pi A+をなるべくスッキリ設置する方法を考えてみました。モバイルバッテリも魅力的ではありますが、サーバ的に利用するのであれば、やはりコンセントからの給電が現実的です。で、可能な限りケーブルレスにしたらどのようになるか検討した結果、以下のようになりました。とりあえずGPIOは全くつけず、無線LANで通信は可能な状態としています。「壁と水平にUSB差込口がある充電器」と「USB_microUSB変換コネクタ」を併用しています。 この充電器の厚さは17.5mm..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;">Raspberry Pi A+をなるべくスッキリ設置する方法を考えてみました。</span></div><br /><div><span style="font-size: 10pt;">モバイルバッテリも魅力的ではありますが、サーバ的に利用するのであれば、やはりコンセントからの給電が現実的です。</span></div><div><span style="font-size: 10pt;">で、可能な限りケーブルレスにしたらどのようになるか検討した結果、以下のようになりました。</span></div><br /><br /><div style="text-align: center;"><span style="font-size: 10pt;"><a href="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/rasp.jpg" target="_blank"><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/rasp-thumbnail2.jpg" alt="rasp.jpg" width="150" height="320" border="0" /></a></span></div><br /><br /><div><span style="font-size: 10pt;">とりあえずGPIOは全くつけず、無線LANで通信は可能な状態としています。</span></div><br /><div><span style="font-size: 10pt;">「壁と水平にUSB差込口がある充電器」と「USB_microUSB変換コネクタ」を併用しています。</span></div><br /><br /><div style="text-align: center;"><span style="font-size: 10pt;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B0035RQ9CS&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>&nbsp;<iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B00ADZIF2W&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></span></div><br /><br /><div><span style="font-size: 10pt;">この充電器の厚さは17.5mmで、A+のGPIOが僅かに飛び出ますので、実質、壁から20mm分のスペースがあれば設置可能です。</span></div><div><span style="font-size: 10pt;">（ラズパイにケースをつける場合は、当然その分の厚さが必要ですが）</span></div><br /><div><span style="font-size: 10pt;">ラズパイ本体やUSBケーブルの固定方法について考慮する必要がなく、極めて単純にスッキリ設置できます。</span></div><br /><div><span style="font-size: 10pt;">･･･ただ、上記の2商品は送料込みであわせて900円程で、決して高くはない筈なのですが、microUSBの充電器自体は100円ショップでも購入可能ですし、Raspberry Pi Zeroの約2倍か･･･と考えてしまうあたり、毒されているなあと感じます。</span></div><br /><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/163051972.html</link>
      <title>Raspberry Pi 2 Model Bの消費電力調査</title>
      <pubDate>Sun, 06 Sep 2015 21:09:16 +0900</pubDate>
      <description>以前の記事で、Raspberry Pi 2 Model Bの消費電力が900mAであることに触れましたが、このソースを確認できずにおります。日本語版のWikipediaの記事には「900 mA (4.5 - 5.5 W)」と記載されているのですが、この記事はソースが示されておりません。また、英語版のWikipediaの記事では「800 mA (4.0 W)」とされており、こちらはソースらしきものも示されています。で、そもそも公式サイトに示されていないのか調べてみた結果、FAQ..</description>
            <content:encoded><![CDATA[
<div><div><span style="font-size: 10pt;">以前の記事で、Raspberry Pi 2 Model Bの消費電力が900mAであることに触れましたが、このソースを確認できずにおります。</span></div><br /><div><span style="font-size: 10pt;"><a href="https://ja.wikipedia.org/wiki/Raspberry_Pi" target="_blank">日本語版のWikipediaの記事</a>には「900 mA (4.5 - 5.5 W)」と記載されているのですが、この記事はソースが示されておりません。</span></div><br /><div><span style="font-size: 10pt;">また、<a href="https://en.wikipedia.org/wiki/Raspberry_Pi" target="_blank">英語版のWikipediaの記事</a>では「800 mA (4.0 W)」とされており、こちらはソースらしきものも示されています。</span></div><br /><div><span style="font-size: 10pt;">で、そもそも公式サイトに示されていないのか調べてみた結果、<a href="https://www.raspberrypi.org/help/faqs/#power" target="_blank">FAQのPOWERの項目</a>でかなり詳細に記載されていることがわかりました、が･･･</span></div><br /><div><span style="font-size: 10pt;">参考になることが大量に書かれてはおりますが、何故かPi2Bの「Typical bare-board active current consumption（典型的な裸基盤での有効消費電流）」のみが空欄となっています。</span></div><br /><div><span style="font-size: 10pt;">英文をざっと確認した限りでは、空欄である理由にも触れていないようですが･･･</span></div><br /><div><span style="font-size: 10pt;">CPUが4コアという事で、値が大きく上下するので、典型的な値を示していない･･･のかもしれません。</span></div><br /><div><span style="font-size: 10pt;">で、先日せっかく電力チェッカを購入したのですから、Pi2Bもいくつかのパターンで電力量を調べてみたいと思います。</span></div></div><br /><div><table style="margin-left: auto; margin-right: auto;"><tbody><tr><td><span style="font-size: 12pt;">(1)</span></td><td><span style="font-size: 12pt;">Raspberry Pi 2 B 単体　待機状態　</span></td><td style="text-align: right;"><span style="font-size: 12pt;">　0.19A</span></td></tr><tr><td><span style="font-size: 12pt;">(2)</span></td><td><span style="font-size: 12pt;">(1)+HDMI+USBキーボード</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.20A</span></td></tr><tr><td><span style="font-size: 12pt;">(3)</span></td><td><span style="font-size: 12pt;">(1)+有線イーサ　待機状態</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.24A</span></td></tr><tr><td><span style="font-size: 12pt;">(4)</span></td><td><span style="font-size: 12pt;">(1)+有線イーサ　ファイルDL</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.28A</span></td></tr><tr><td><span style="font-size: 12pt;">(5)</span></td><td><span style="font-size: 12pt;">(3)+bash無限ループx1</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.26A</span></td></tr><tr><td><span style="font-size: 12pt;">(6)</span></td><td><span style="font-size: 12pt;">(3)+bash無限ループx2</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.30A</span></td></tr><tr><td><span style="font-size: 12pt;">(7)</span></td><td><span style="font-size: 12pt;">(3)+bash無限ループx3</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.32A</span></td></tr><tr><td><span style="font-size: 12pt;">(8)</span></td><td><span style="font-size: 12pt;">(3)+bash無限ループx4</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.35A</span></td></tr><tr><td><span style="font-size: 12pt;">(9)</span></td><td><span style="font-size: 12pt;">(8)+ファイルDL</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.36A</span></td></tr></tbody></table><div><br /><br /></div></div><div><span style="font-size: 10pt;">待機電力こそA+の3倍以上もありますが、CPUをカツカツの状態にしても思ったよりは消費量は上昇しませんでした。</span></div><br /><div><span style="font-size: 10pt;">裸基盤の状態であと電力を消費できそうなものといえば、GPUとメモリくらいでしょうか･･･</span></div><br /><div><span style="font-size: 10pt;">ただ、USB機器を接続しない状態であれば、500 mAが必要になることすら稀のような･･･</span></div><br /><div><span style="font-size: 10pt;">一応は、<a href="http://blog.hahasoha.net/article/160537625.html" target="_blank">以前に上げた記事</a>で紹介したモバイルバッテリでも、上記の(8)の状態でしばらく放置しても継続して動作することも確認できました。</span></div><br /><div><span style="font-size: 10pt;">いつ停止してファイルシステムが破損するかわかったものではありませんので、全く推奨はできませんが･･･</span></div><br /><div><span style="font-size: 10pt;">軽量低容量のモバイルバッテリでも起動自体は可能ということは、把握しておいても損はないかもしれませんね。</span></div><br /><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/161791975.html</link>
      <title>Raspberry Pi A+の消費電力について</title>
      <pubDate>Tue, 18 Aug 2015 23:17:31 +0900</pubDate>
      <description>以前の記事でRaspberry Pi A+の連続運転テストを実施した際は、想定よりもかなり消費電力が少ないであろう結果が出ました。で、実際の消費電力を確認するために、以下の商品を購入しました。購入時の価格は、送料込みで217円･･･そこまで安くなくても良いのに･･･流石に、この価格帯の商品に厳密な値を求めるつもりはありませんが、しばらく使ってみた限りでは、凡そ正しそうな値を表示してくれているようです。ということで、複数パターンでザッと数値を確認してみました。(1)Raspbe..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;"><a href="http://blog.hahasoha.net/article/160537625.html" target="_blank">以前の記事</a>でRaspberry Pi A+の連続運転テストを実施した際は、想定よりもかなり消費電力が少ないであろう結果が出ました。</span></div><br /><div>で、実際の消費電力を確認するために、以下の商品を購入しました。</div><br /><div style="text-align: center;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B00H3JAPNS&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></div><br /><div>購入時の価格は、送料込みで217円･･･そこまで安くなくても良いのに･･･</div><br /><div>流石に、この価格帯の商品に厳密な値を求めるつもりはありませんが、しばらく使ってみた限りでは、凡そ正しそうな値を表示してくれているようです。</div><br /><div>ということで、複数パターンでザッと数値を確認してみました。</div><br /><div><table style="margin-left: auto; margin-right: auto;"><tbody><tr><td><span style="font-size: 12pt;">(1)</span></td><td><span style="font-size: 12pt;">Raspberry Pi A+ 単体　待機状態　</span></td><td style="text-align: right;"><span style="font-size: 12pt;">　0.06A</span></td></tr><tr><td><span style="font-size: 12pt;">(2)</span></td><td><span style="font-size: 12pt;">(1)+bash無限ループ</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.09A</span></td></tr><tr><td><span style="font-size: 12pt;">(3)</span></td><td><span style="font-size: 12pt;">(1)+有線USBイーサ　待機状態</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.14A</span></td></tr><tr><td><span style="font-size: 12pt;">(4)</span></td><td><span style="font-size: 12pt;">(1)+有線USBイーサ　ファイルDL</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.20A</span></td></tr><tr><td><span style="font-size: 12pt;">(5)</span></td><td><span style="font-size: 12pt;">(1)+無線USBwifi　待機状態</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.14A</span></td></tr><tr><td><span style="font-size: 12pt;">(6)</span></td><td><span style="font-size: 12pt;">(1)+無線USBwifi　ファイルDL　</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.23A</span></td></tr><tr><td><span style="font-size: 12pt;">(7)</span></td><td><span style="font-size: 12pt;">(5)+bash無限ループ</span></td><td style="text-align: right;"><span style="font-size: 12pt;">0.17A</span></td></tr></tbody></table></div><br /><br /><div>有線USBイーサはこちらを利用しています。</div><div>Wifiは以前のテストの際と同じ<span style="color: #555555; font-family: Arial, Helvetica, sans-serif; line-height: 19.2000007629395px;">GW-USNano2</span>です。</div><br /><div style="text-align: center;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B00LVH885U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></div><br /><br /><div>ファイルDLはhttpのwgetで数百MBのファイルをSDカードに書き出す形でダウンロードしています。</div><br /><div>bash無限ループは「while : ; do i=$((i+1)) ; done」でループさせています。</div><br /><div>以前のテストの際はCPUは枯渇状態にはしないで、GPIOで温度センサを稼動させていましたので、(6)よりやや重い負荷なのではないかと思われます。</div><br /><br /><div>さて、今回購入した電圧チェッカでは瞬間的な値までは取得できませんので、前述の表以上の電力が消費されないことを保証するわけでは全くありませんが、それでも大分少な目の値となっております。</div><br /><div>これならば、モバイルバッテリでも、もう少し負荷をかけても大丈夫そうな気がしますね･･･</div><br /><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/161156750.html</link>
      <title>Raspberry piのファイルシステム破損による起動失敗とリカバリ方法</title>
      <pubDate>Wed, 12 Aug 2015 00:00:00 +0900</pubDate>
      <description>それまでは問題なく利用していたRaspberry piが、突然起動しなくなってしまいました。どうやらファイルシステムが破損してしまいrootをマウントできていない模様。具体的には、コンソールの最終行に「end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,6)」と出力されて停止している状態でした。SDカードリーダが搭載されているWindowsノートPCでリカバリができ..</description>
            <content:encoded><![CDATA[
<div><span style="font-size: 10pt;">それまでは問題なく利用していたRaspberry piが、突然起動しなくなってしまいました。</span></div><div><span style="font-size: 10pt;">どうやらファイルシステムが破損してしまいrootをマウントできていない模様。</span></div><br /><div><span style="font-size: 10pt;">具体的には、コンソールの最終行に「end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,6)」と出力されて停止している状態でした。</span></div><br /><div><span style="font-size: 10pt;">SDカードリーダが搭載されているWindowsノートPCでリカバリができましたので、手順をまとめておきます。</span></div><div><span style="font-size: 10pt;">（NOOBSでRaspbianを入れた環境です）</span></div><br /><div><span style="font-size: 10pt;">また、以下の工程では、</span>オペミス等でリカバリに失敗して完全にデータが失われてしまう可能性もあるため、事前にWin32DiskImager等でディスクイメージ毎バックアップを取っておくことをお勧めいたします。</div><div>（ファイルシステムが破損する前にバックアップを取得しておけばよいわけですが…）</div><br /><br /><div><span style="text-decoration: underline;"><span style="font-size: 12pt;">SDカードを認識してfsckコマンドを実行できる環境の準備</span></span></div><br /><div><span style="font-size: 13.3333330154419px;">結局はこの副題が全てな</span>わけですが、該当するようなLinuxマシンが手元になかったため、WindowsのノートPC上に仮想環境を構築しました。</div><br /><div>VirtualBoxとVMware Playerの両方で試してみましたが、個人的にはVMware Playerの方がSDカードの認識部分においてわかりやすかったです。</div><br /><div>VMware Playerは個人用途ならば無償で利用できるため、適時<a href="https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/7_0" target="_blank">ダウンロード</a>して導入してください。</div><br /><div>OSは<a href="https://getfedora.org/ja/" target="_blank">Fedora</a>をお勧めします。</div><br /><div>当初は使い慣れていて既に環境構築済みのCentOSでやったのですが、カードの認識がうまくいかなかったりドライバが足りなかったりと、最終的に成功したとはいえ、色々と面倒でした。</div><br /><div>で、Fedoraならば新し目の要素も対応しているかなと思い試してみた結果、追加で何も設定しない素の状態でSDカードを認識して、リカバリまで持っていけました。</div><br /><br /><div><span style="text-decoration: underline; font-size: 12pt;">デバイスを接続してfsckを実行</span></div><br /><div>VMware Playerでは親機に接続されている機器を仮想マシンに認識させることが可能ですので、ノートPCに搭載されているSDカードリーダにカードを差し込みます。</div><br /><div>この時、初めからカードを差し込んだ状態で、仮想マシンを後から起動しても問題ありませんが、複数のデバイスが選択可能な場合、どれがSDカードリーダなのか案外わかりにくかったりします。</div><br /><div>仮想マシンを起動後にカードを差し込みますと、新規の取り外し可能デバイスとして、以下のようなウィンドウがポップアップされますのでわかりやすいかと思います。</div><br /><div><a href="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/sd.png" target="_blank"><img style="display: block; margin-left: auto; margin-right: auto;" src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/sd-thumbnail2.png" alt="sd.png" width="320" height="209" border="0" /></a></div><br /><br /><div>その後、実際に仮想マシンに認識させる際は、VMware Playerのメニューを「Player」→「取り外し可能デバイス」→「SDカードリーダ名」→「接続（ホストから切断）」の順番で選択します。</div><br /><div>うまく認識してくれると、/dev配下にデバイスが追加されます。</div><br /><div>筆者の環境の場合では、以下のようにデバイスが追加されました。</div><div>（CentOSでやった際は/dev/sdb～として認識されましたので、必ずしも下記の限りではありません）</div><br /><div><div>mmcblk0</div><div>mmcblk0p1</div><div>mmcblk0p2</div><div>mmcblk0p3</div><div>mmcblk0p5</div><div>mmcblk0p6</div></div><br /><div>で、とりあえず一通りのデバイスにfsckを打ち込んでみましたが、mmcblk0p6にエラーがあったようで、結構な数のエラーが出力されました。</div><br /><div>出力されるエラーに対しては、基本的にyで修復を了承していくだけで問題ありません。</div><br /><div>修復が完了後は、Raspberry Piに戻して起動できるか確認しましょう。</div><div>（ファイルの救出が目的の場合は、Raspberry Piに戻さず、仮想環境から直接マウントしてファイルを取得することも可能です）</div><br /><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/160537625.html</link>
      <title>Raspberry Pi A+のモバイルバッテリ連続運転テスト</title>
      <pubDate>Sat, 08 Aug 2015 00:00:00 +0900</pubDate>
      <description>日本Raspberry Pi ユーザーグループ代表の太田さんが書かれているRaspberry Piの今という記事に、以下のような記載があります。Ebenからは汎用としてのRaspberry Pi 2と組み込み機器などの利用で省電力性の高いRaspberry Pi A+が主力製品になるだろうとの話を受けています。私も少々Raspberry Piを扱わせて頂く機会があって、色々な使い道を模索しているのですが…確かに、Raspberry PiをRaspberry Piらしく使うので..</description>
            <content:encoded><![CDATA[
<div>日本Raspberry Pi ユーザーグループ代表の太田さんが書かれている<a href="http://www.infoq.com/jp/articles/RaspberryPi" target="_blank">Raspberry Piの今</a>という記事に、以下のような記載があります。</div><br /><blockquote>Ebenからは汎用としてのRaspberry Pi 2と組み込み機器などの利用で省電力性の高いRaspberry Pi A+が主力製品になるだろうとの話を受けています。</blockquote><br /><div>私も少々Raspberry Piを扱わせて頂く機会があって、色々な使い道を模索しているのですが…</div><br /><div>確かに、Raspberry PiをRaspberry Piらしく使うのであれば、「Pi 2 Model B」より、「Pi 1 Model A+」の方が適しているケースも多いのではないかと思います。</div><br /><div>A+が2Bより優れている点は、「価格」「消費電力」「大きさ」「重さ」でしょう。</div><br /><div>価格は日本国内ではAmazonで購入すると以下のような価格です。</div><br /><br /><div style="text-align: center;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;ref=qf_sp_asin_til&amp;asins=B00T356SFO" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B00PI9KPLC&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></div><br /><br /><div>その他の項目については<a href="https://ja.wikipedia.org/wiki/Raspberry_Pi#.E4.B8.BB.E3.81.AA.E4.BB.95.E6.A7.98" target="_blank">Wikipediaの記事</a>をご覧頂いた方が早いかとは思いますが、前述の4項目の中で、A+が2Bより最も優れているのは<strong>「消費電力」</strong>です。</div><br /><div>2Bが900 mAなのに対し、A+は単体で僅か200 mAです。</div><div>（A+のCPUが700MHz1コアなのに対し、2Bは900MHz4コアですから当然の差とも言えますが）</div><div>（知識不足のため、「電力」「電流」等の用語の使用の誤謬があるかもしれません）</div><br /><div>この消費電力の少なさを最大限に生かそうと考えると、モバイルでの用途が思いつきます。</div><br /><div>モバイルでの利用について、既に先人の方々が記事を挙げられていますが、自身の調査結果も記事にまとめておきたいと思います。</div><br /><br /><div><span style="font-size: large;"><ins>調査対象モバイルバッテリ</ins></span></div><br /><div>Raspberry PiはマイクロUSBから給電をしますので、スマホ用のモバイルバッテリからも給電が可能です。</div><br /><div>ということで、価格.comで最安値となっていた以下の商品を購入してみました。</div><br /><br /><div style="text-align: center;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B007W09T8U&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></div><br /><br /><div>記事執筆時点では、送料無料で680円で購入できました。</div><div>モバイルバッテリってこんなに安いものもあるんですね…</div><br /><div>ちなみに、Amazonのリンク先の説明には「USB出力:DC5V<strong>1A</strong>」とあるのですが、<strong>これはウソです。</strong></div><br /><div><a href="http://panasonic.jp/battery/pocket/p-db/QE-QL102_spec.html" target="_blank">Panasonicの同商品の詳細仕様</a>には「USB出力　DC5V <strong>0.5A</strong>」と明記されています。</div><div>本体の裏面にも定格出力0.5A(MAX)と印字されています。</div><br /><div>0.5Aとは500 mAのことですので、つまり、A+は動作しても2Bは起動すらできないことになります。</div><br /><div>本製品に限らず、出力可能な電圧電流は極めて重要ですので、なるべく正確な情報を確認してから購入するようにご注意ください。</div><br /><div>ちなみにこの商品は、Panasonicのサイトに掲載されている写真をご覧頂ければわかりますが、出力用のマイクロUSBが本体に一体化していて、かつ重さが約58gしかありません。</div><br /><div>A+の重さは23gですので、合わせても余裕で100g未満ということになります。</div><br /><div>容量は1430mAhで、出力時間の目安は満充電した状態で500 mA出力で約1.3時間とのことです。</div><br /><div>また、バッテリ残量をランプの色で確認可能で、残り約60%以上までは緑、残り約30%以上までは橙、残り約30%以下で赤く点灯します。</div><br /><br /><div><span style="font-size: large;"><ins>連続運転テスト条件</ins></span></div><br /><div>このモバイルバッテリーで、A+がどれだけ動作できるか連続運転テストを行いたいと思います。</div><br /><div>が、何の機器も接続していない状態のA+なぞ全く実用的ではありませんので、<strong>Wifiと気温センサ</strong>を実装させます。</div><br /><div>Raspberry Piは素のままではWifiは利用できませんので、アダプタを追加する必要があります。</div><div>で、Amazonで安そうなものを見繕うと以下のような商品が出てきますが、ここでも<strong>消費電力</strong>が重要な要素となります。</div><br /><br /><div style="text-align: center;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B00ESA34GA&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B003NSAMW2&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></div><br /><br /><div>これらの商品は大体同じような価格・スペックに見えますが、それぞれの商品の製品仕様を確認すると、白い方の<a href="https://www.planex.co.jp/product/wireless/gw-usnano2/spec.shtml" target="_blank">GW-USNano2の最大消費電力は最大約1.3W</a>で、黒い方の<a href="http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm/#spec" target="_blank">WLI-UC-GNMは最大約2.5W</a>と、2倍近くも差があります。</div><br /><div>これらの値は、mAに換算するとGW-USNano2は260 mA、WLI-UC-GNMは500 mAとなりますので、前述のモバイルバッテリでは、WLI-UC-GNMを利用していると電圧不足で動作不良を起こす可能性が高いです。</div><br /><div>なので、今回は消費電力の低いGW-USNano2を採用します。</div><div>（Raspberry Piでの利用実績も多いようで、色々なサイトで報告例を見かけます）</div><br /><div>モバイルバッテリの出力が500 mAで、A+単体で200 mA、Wifiで260mA消費しますので…</div><div>一応の計算上は、センサに残り40 mA使えることになります。</div><div>（実際は余裕を持たせるべきでしょうが）</div><br /><div>で、気温センサは以下の書籍を参考に、<a href="http://akizukidenshi.com/catalog/default.aspx" target="_blank">秋月電子</a>でいくつか商品を購入して自作しました。</div><br /><br /><div style="text-align: center;"><iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=niconicoca-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4897979943&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width: 120px; height: 240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></div><br /><br /><div>非常に丁寧に書かれた書籍ですので、Pythonやら組み込み系やらが全くの未経験の方にもお勧めできます。</div><div>気温センサ等の消費電流は125 μA等と、単位がマイクロですので、残り40 mAでもまだ余裕がありそうです。</div><br /><div>これらを組み合わせて「気温センサから値を毎秒取得し、その都度HTTPのGETパラメータでサーバに情報を送信し続ける」という条件でテストを行いました。</div><br /><div>※ランプが消灯するまで使い続けるとデータ破損が発生する可能性が高いため、実際には、バッテリの限界まで利用すべきではありません</div><br /><br /><div><span style="font-size: large;"><ins>テスト結果</ins></span></div><br /><div>結論から書いてしまえば、<strong>約5時間連続して動作しました。</strong></div><br /><div>センサから情報を取得し続けて毎秒HTTPGETするという、それなりに実用的かつ負荷がかかるであろう条件でしたが、思いの外、長時間動作しました。</div><div>（電圧・電流チェッカは後日購入しようかと思います）</div><br /><div>また、10秒毎に写真を撮影し続けるという簡易スクリプトを別のRaspberry Piで動作させ、モバイルバッテリのランプ色の変化も合わせて調査しました。</div><br /><div><table style="height: 108px;" width="254"><tbody><tr><td style="text-align: center;">経過時間</td><td style="text-align: center;">ランプ色</td><td style="text-align: center;">残電量</td></tr><tr><td style="text-align: center;">開始時点</td><td style="text-align: center;">緑</td><td style="text-align: right;">100%</td></tr><tr><td style="text-align: center;">開始から146分経過</td><td style="text-align: center;">橙に変化</td><td style="text-align: right;">60%</td></tr><tr><td style="text-align: center;">更に101分経過</td><td style="text-align: center;">赤に変化</td><td style="text-align: right;">30%</td></tr><tr><td style="text-align: center;">更に51分経過</td><td style="text-align: center;">消灯</td><td style="text-align: right;">0%</td></tr></tbody></table></div><br /><div>赤に変化するまでは大体10%を30分ペースで消費していましたが、ランプが赤になってから消灯するまでの時間は急激に短くなっています。</div><br /><div>ただ、ランプが消灯して電力が供給されなくなる直前まではRaspberry Piは正常に動作をし続け、以下のように、取得した温度センサの値にも異常は見られませんでした。</div><br /><div><a href="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/temp.png" target="_blank"><img style="display: block; margin-left: auto; margin-right: auto;" src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/temp-thumbnail2.png" alt="temp.png" width="320" height="131" border="0" /></a></div><br /><div>エアコンの温度設定を色々と調整して確認しましたが、大体想定通りの値が出ています。</div><div>※ちなみに、19時あたりに急激に温度が下がっているのは、温度センサに<strong>あずきバー</strong>を接近させたためです。</div><br /><div>前述のように、今回利用したモバイルバッテリの容量は<span style="color: #555555; font-family: Arial, Helvetica, sans-serif; line-height: 19.2000007629395px;">1430mAhしかありませんが</span>、それでも数時間も動作するのであれば、電源を確保できないような環境でも、お手軽に様々な用途に利用できるのではないかと思います。</div><br /><br /><div>安価かつ軽量であることを利用して、GPSやジャイロセンサと組み合わせるのも面白いかと思いますので、また別途調査したいと思います。</div><br /><a name="more"></a>

]]></content:encoded>
            <category>Raspberry Pi</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/106595514.html</link>
      <title>PostgreSQLパズル？</title>
      <pubDate>Tue, 16 Dec 2014 18:00:00 +0900</pubDate>
      <description>これはPostgreSQL Advent Calendar 2014の12月16日分の記事です。昨日はmoomindaniさんの記事でした。---宣伝　ここから---来年の1月16日(金)にPostgreSQLパフォーマンスチューニング実例セミナーを開催することになりました。ご興味のある方は是非ご応募ください。---宣伝　ここまで---数あるデータベースの中からPostgreSQL……というより、RDBMSを採用する理由の一つとして、複雑なクエリが実行できることが挙げられます..</description>
            <content:encoded><![CDATA[
<div>これはPostgreSQL Advent Calendar 2014の12月16日分の記事です。</div><br /><div>昨日は<a href="http://moomindani.wordpress.com/2014/12/15/monitoring-rds-postgresql/" target="_blank">moomindaniさんの記事</a>でした。</div><br /><br /><div><a href="http://soft-dojyo-postgresql-20150116.peatix.com/" target="_blank">---宣伝　ここから---</a></div><br /><div><a href="http://soft-dojyo-postgresql-20150116.peatix.com/" target="_blank">来年の1月16日(金)にPostgreSQLパフォーマンスチューニング実例セミナーを開催することになりました。</a></div><br /><div><a href="http://soft-dojyo-postgresql-20150116.peatix.com/" target="_blank">ご興味のある方は是非ご応募ください。</a></div><br /><div><a href="http://soft-dojyo-postgresql-20150116.peatix.com/" target="_blank">---宣伝　ここまで---</a></div><br /><br /><div>数あるデータベースの中からPostgreSQL……というより、RDBMSを採用する理由の一つとして、<strong>複雑なクエリが実行できる</strong>ことが挙げられます。</div><br /><br /><div>スケールアウト等を考えると、重たい処理をDBで実行させるのはあまり褒められた話ではないとも思いますが、趣味でやっているWebサービスレベルであれば、そもそもマシンが1台しかないなら、なるべくDB内で処理を完結させた方が効率的なこともあります。</div><br /><br /><div>で、先日、とある処理をDB内で完結させようとした結果、思いのほかドツボに嵌まり、個人的には相当カオスなSQLが生まれてしまいましたので、ここで紹介したいと思います。</div><br /><div>（と申しますか、もっと美しいSQLがある筈……）</div><br /><br /><div>現在、<a href="http://index.hahasoha.net/" target="_blank">Microsoft Office Wordの自動索引登録機能を補助することに特化したサイト</a>を趣味で作っているのですが、wordファイル中から索引候補を抽出する処理で<a href="http://textsearch-ja.projects.pgfoundry.org/textsearch_ja.html" target="_blank">textsearch_jaのja_analyze</a>を利用させて頂いています。</div><br /><br /><div>例えば、PostgreSQLの公式ドキュメントの一部をja_analyzeにかけると以下のような結果が取得できます。</div><br /><pre class="prettyprint lang-sql"><br /> =&gt;SELECT word,type,ruby FROM <br />   ja_analyze('PostgreSQLの統計情報コレクタはサーバの活動状況に <br />               関する情報を収集し、報告するサブシステムです。'); <br /><br />      word     |  type  |     ruby <br /> --------------+--------+-------------- <br />  PostgreSQL   | 名詞   | PostgreSQL <br />  の           | 助詞   | ノ <br />  統計         | 名詞   | トウケイ <br />  情報         | 名詞   | ジョウホウ <br />  コレクタ     | 名詞   | コレクタ <br />  は           | 助詞   | ハ <br />  サーバ       | 名詞   | サーバ <br />  の           | 助詞   | ノ <br />  活動         | 名詞   | カツドウ <br />  状況         | 名詞   | ジョウキョウ <br />  に           | 助詞   | ニ <br />  関する       | 動詞   | カンスル <br />  情報         | 名詞   | ジョウホウ <br />  を           | 助詞   | ヲ <br />  収集         | 名詞   | シュウシュウ <br />  し           | 動詞   | シ <br />  、           | 記号   | 、 <br />  報告         | 名詞   | ホウコク <br />  する         | 動詞   | スル <br />  サブシステム | 名詞   | サブシステム <br />  です         | 助動詞 | デス <br />  。           | 記号   | 。 <br /> (22 rows) <br /></pre><br /><div>一見すると問題なさそうですが、索引候補とするには、<strong>名詞が細かく分割され過ぎています。</strong></div><br /><div>索引候補としては「統計情報コレクタ」で一つの語句として抽出したいわけです。</div><br /><br /><div>どういった条件で一つの語句とするかは色々な考え方があるのでしょうが、今回は<strong>「名詞が連続している部分を抽出する」</strong>ことを条件としたいと思います。</div><br /><br /><div>つまり、以下のような結果を取得するためには、どのようなSQLを書いたら良いか、ということです。</div><br /><pre class="prettyprint lang-sql"><br />        word       |            ruby <br /> ------------------+---------------------------- <br />  統計情報コレクタ | トウケイジョウホウコレクタ <br />  活動状況         | カツドウジョウキョウ <br /> (2 rows) <br /></pre><br /><div>まず、「連続している名詞」を抽出しなければならないわけですが、これは先日の記事でも紹介した<strong>Window関数</strong>で抽出できます。</div><br /><div>後の処理のために、row_numberも取得しておきます。</div><br /><br /><pre class="prettyprint lang-sql"><br /> =&gt;SELECT row_number () OVER (), <br />          lag (type) OVER (), <br />          lead (type) OVER (), <br />          word,type,ruby FROM <br />   ja_analyze('PostgreSQLの統計情報コレクタはサーバの活動状況に <br />               関する情報を収集し、報告するサブシステムです。'); <br /><br />  row_number |  lag   |  lead  |     word     |  type  |     ruby <br /> ------------+--------+--------+--------------+--------+-------------- <br />           1 |        | 助詞   | PostgreSQL   | 名詞   | PostgreSQL <br />           2 | 名詞   | 名詞   | の           | 助詞   | ノ <br />           3 | 助詞   | 名詞   | 統計         | 名詞   | トウケイ <br />           4 | 名詞   | 名詞   | 情報         | 名詞   | ジョウホウ <br />           5 | 名詞   | 助詞   | コレクタ     | 名詞   | コレクタ <br />           6 | 名詞   | 名詞   | は           | 助詞   | ハ <br />           7 | 助詞   | 助詞   | サーバ       | 名詞   | サーバ <br />           8 | 名詞   | 名詞   | の           | 助詞   | ノ <br />           9 | 助詞   | 名詞   | 活動         | 名詞   | カツドウ <br />          10 | 名詞   | 助詞   | 状況         | 名詞   | ジョウキョウ <br />          11 | 名詞   | 動詞   | に           | 助詞   | ニ <br />          12 | 助詞   | 名詞   | 関する       | 動詞   | カンスル <br />          13 | 動詞   | 助詞   | 情報         | 名詞   | ジョウホウ <br />          14 | 名詞   | 名詞   | を           | 助詞   | ヲ <br />          15 | 助詞   | 動詞   | 収集         | 名詞   | シュウシュウ <br />          16 | 名詞   | 記号   | し           | 動詞   | シ <br />          17 | 動詞   | 名詞   | 、           | 記号   | 、 <br />          18 | 記号   | 動詞   | 報告         | 名詞   | ホウコク <br />          19 | 名詞   | 名詞   | する         | 動詞   | スル <br />          20 | 動詞   | 助動詞 | サブシステム | 名詞   | サブシステム <br />          21 | 名詞   | 記号   | です         | 助動詞 | デス <br />          22 | 助動詞 |        | 。           | 記号   | 。 <br /> (22 rows) <br /></pre><br /><div>lagに1行前の、leadに1行後のtypeが表示されます。</div><br /><div>ウィンドウ演算が行われた結果に対してフィルタ処理を掛ける場合は副問い合わせを利用します。</div><br /><div>また、この後の処理のために、row_numberに対して<strong>CASE文</strong>を打ちます。</div><br /><pre class="prettyprint lang-sql"><br /> =&gt;SELECT CASE <br />            WHEN lag = '名詞' THEN 1 <br />            ELSE row_number <br />          END num, <br />          row_number,word,ruby <br />   FROM <br />    ( <br />     SELECT row_number () OVER (), <br />            lag (type) OVER (), <br />            lead (type) OVER (), <br />            word,type,basic,ruby FROM <br />     ja_analyze('PostgreSQLの統計情報コレクタはサーバの活動状況に <br />                 関する情報を収集し、報告するサブシステムです。') <br />    ) foo1 <br />   WHERE (lead = '名詞' AND type = '名詞') <br />     OR  ( lag = '名詞' AND type = '名詞'); <br /><br />  num | row_number |   word   |     ruby <br /> -----+------------+----------+-------------- <br />    3 |          3 | 統計     | トウケイ <br />    1 |          4 | 情報     | ジョウホウ <br />    1 |          5 | コレクタ | コレクタ <br />    9 |          9 | 活動     | カツドウ <br />    1 |         10 | 状況     | ジョウキョウ <br /> (5 rows) <br /></pre><br /><div>lagを利用し、1行前が名詞だったら1、そうでなければrow_numberを表示させます。</div><br /><div>これにより、<strong>連続している名詞の切れ目でnum列に最大値が現れる</strong>ことになります</div><br /><br /><div>次は、この結果に対して更にWindow関数を用いて副問い合わせします。</div><br /><pre class="prettyprint lang-sql"><br /> =&gt;SELECT max(num) OVER (ORDER BY row_number),word,ruby FROM <br />   ( <br />    SELECT CASE <br />             WHEN lag = '名詞' THEN 1 <br />             ELSE row_number <br />           END num, <br />           row_number,word,ruby <br />      FROM <br />     ( <br />      SELECT row_number () OVER (), <br />             lag (type) OVER (), <br />             lead (type) OVER (), <br />             word,type,basic,ruby FROM <br />      ja_analyze('PostgreSQLの統計情報コレクタはサーバの活動状況に <br />                  関する情報を収集し、報告するサブシステムです。') <br />     ) foo1 <br />    WHERE (lead = '名詞' AND type = '名詞') <br />      OR  ( lag = '名詞' AND type = '名詞') <br />   ) foo2; <br /><br />  max |   word   |     ruby <br /> -----+----------+-------------- <br />    3 | 統計     | トウケイ <br />    3 | 情報     | ジョウホウ <br />    3 | コレクタ | コレクタ <br />    9 | 活動     | カツドウ <br />    9 | 状況     | ジョウキョウ <br /> (5 rows) <br /></pre><br /><div>上から順に各行時点でのnumの最大値を表示するmax列を生成することで、<strong>連続している名詞がmax列の値でグループ化されます。</strong>（個人的にはここの処理で一番悩みました）</div><br /><br /><div>ここまで持ってくればあと一息です。</div><br /><br /><div>異なる行の値を連結するために、<strong>array_agg関数</strong>と<strong>array_to_string関数</strong>を使います。</div><br /><div>array_agg関数は引数を配列に変換する集約関数で、array_to_string関数は引数の配列を文字列に結合する関数です。</div><br /><br /><div>よって、上記の結果を更に副問い合わせし、max列で集約すれば完成です。</div><br /><br /><pre class="prettyprint lang-sql"><br /> =&gt;SELECT <br />   array_to_string (array_agg (word), '') word, <br />   array_to_string (array_agg (ruby), '') ruby FROM <br />   ( <br />    SELECT max(num) OVER (ORDER BY row_number),word,ruby FROM <br />    ( <br />     SELECT CASE <br />              WHEN lag = '名詞' THEN 1 <br />              ELSE row_number <br />            END num, <br />            row_number,word,ruby <br />       FROM <br />      ( <br />       SELECT row_number () OVER (), <br />              lag (type) OVER (), <br />              lead (type) OVER (), <br />              word,type,basic,ruby FROM <br />       ja_analyze('PostgreSQLの統計情報コレクタはサーバの活動状況に <br />                   関する情報を収集し、報告するサブシステムです。') <br />      ) foo1 <br />     WHERE (lead = '名詞' AND type = '名詞') <br />       OR  ( lag = '名詞' AND type = '名詞') <br />    ) foo2 <br />   ) foo3 GROUP BY max; <br /><br />        word       |            ruby <br /> ------------------+---------------------------- <br />  統計情報コレクタ | トウケイジョウホウコレクタ <br />  活動状況         | カツドウジョウキョウ <br /> (2 rows) <br /></pre><br /><br /><div>如何でしたでしょうか。</div><br /><br /><div>……SQLでやらなければforループとかで遥かにシンプルに実装できそうなことはわかってはおりますが、そこはPostgreSQL Advent Calendarの記事だからということで目をつむって頂ければと思います。</div><br /><br /><div>SQLに限った話ではないですが、結局、各種機能を「知っているか知らないか」だけで生産性が大幅に変わることになります。</div><br /><br /><div>SQLによる他の方法で同結果を得る方法を思いつく方は、是非ご教示ください。</div><br /><a name="more"></a>

]]></content:encoded>
            <category>PostgreSQL</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/106421871.html</link>
      <title>Microsoft Office Word 索引作成支援ツール マニュアル</title>
      <pubDate>Sun, 14 Dec 2014 21:02:43 +0900</pubDate>
      <description>Microsoft Office Word 索引作成支援ツールの利用方法を説明します。本ツールは、Microsoft Office Wordに実装されている自動索引登録機能で利用するためのファイル作成を支援します。実際の索引作成には、正規のMicrosoft Office Wordが必要となることにご注意ください。初回解析初めて本ツールを利用する場合は、トップ画面の「索引候補ファイル作成」の「ファイルを選択」をクリックし、索引を作成したいWordファイルを選択して「初回解析」..</description>
            <content:encoded><![CDATA[
<br /><div><a href="http://index.hahasoha.net/" target="_blank">Microsoft Office Word 索引作成支援ツール</a>の利用方法を説明します。</div><br /><br /><div>本ツールは、Microsoft Office Wordに実装されている自動索引登録機能で利用するためのファイル作成を支援します。</div><br /><div>実際の索引作成には、正規のMicrosoft Office Wordが必要となることにご注意ください。</div><br /><br /><br /><div><strong><strong><span style="font-size: large;">初回解析</span></strong></strong></div><br /><br /><div>初めて本ツールを利用する場合は、<a href="http://index.hahasoha.net/" target="_blank">トップ画面</a>の「索引候補ファイル作成」の「ファイルを選択」をクリックし、索引を作成したいWordファイルを選択して「初回解析」をクリックしてください。</div><br /><div>※対応している拡張子はdocxのみです。</div><br /><br /><div>本マニュアルでは、<a href="http://index.hahasoha.net/rashomon.docx" target="_blank">サンプルファイル</a>として<a href="http://www.aozora.gr.jp/cards/000879/card127.html" target="_blank">青空文庫の「羅生門」</a>の本文を利用します。</div><br /><br /><div><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/index1.png" alt="index1.png" width="100%" border="0" /></div><br /><br /><div>解析が終了すると、索引登録候補一覧画面に遷移します。</div><br /><div>大量に列挙された候補の中から、索引として登録すべき用語のみチェックをつけてください。</div><br /><div>語句や読みが正確に解析されていない場合は手動で修正してください。</div><br /><br /><br /><div><strong><strong><span style="font-size: large;">作業状態の保存と再開</span></strong></strong></div><br /><br /><div>「作業状態保存ファイルをダウンロード」をクリックすると、現在の作業状態が記録されたtsvファイルがダウンロードされます。</div><br /><div>トップ画面の「索引候補ファイル再編集」から該当のファイルをアップロードすれば、編集作業を再開することができます。</div><br /><br /><br /><div><strong><strong><span style="font-size: large;">索引登録ファイルをダウンロード</span></strong></strong></div><br /><br /><div>「索引登録ファイルをダウンロード」をクリックすると、Microsoft Office Word用の索引登録ファイルがダウンロードされます。</div><br /><div>中身は以下のようなdocxファイルですが、通常このファイルを開く必要はありません。</div><br /><br /><div><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/index2.png" alt="index2.png" width="100%" border="0" /></div><br /><br /><br /><div><strong><span style="font-size: large;">索引登録と索引作成</span></strong></div><br /><br /><div><span style="color: #ff0000;">本作業実施前に、索引作成対象のWordファイルのバックアップを取得するようにして下さい。</span></div><br /><br /><div>索引を作成したいWordファイルをMicrosoft Office Wordで開いてください。</div><br /><div>メニューから「参考資料」→「索引の挿入」を選択してください。</div><br /><br /><div><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/index3.png" alt="index3.png" width="159" border="0" /></div><br /><br /><br /><div>「自動索引登録」をクリックし、本サイトからダウンロードした索引登録ファイルを選択してください。</div><br /><br /><div><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/index4.png" alt="index4.png" width="100%" border="0" /></div><br /><br /><div>本文中に索引項目が以下のように自動登録されます。</div><br /><br /><div><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/index5.png" alt="index5.png" width="100%" border="0" /></div><br /><br /><div>索引項目を非表示にしたい場合は、メニューから「ホーム」→「編集記号の表示／非表示」を選択して表示を切り替えてください。</div><br /><br /><div><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/index6.png" alt="index6.png" width="114" border="0" /></div><br /><br /><div>索引を作成します。</div><br /><div>索引を作成したい個所にカーソルを合わせた状態で再度メニューから「参考資料」→「索引の挿入」を選択してください。</div><br /><br /><div><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/index3.png" alt="index3.png" width="159" border="0" /></div><br /><br /><div>任意のスタイルを設定後、「OK」を選択してください。</div><br /><div>以下のように索引が作成されます。</div><br /><br /><div><img src="http://hahasoha.sakura.ne.jp/sblo_files/hahasoha/image/index8.png" alt="index8.png" width="100%" border="0" /></div><br /><br /><div>説明は以上です。</div><br /><br /><a name="more"></a>

]]></content:encoded>
            <category>その他</category>
      <author>hahasoha</author>
          </item>
        <item>
      <link>http://blog.hahasoha.net/article/106154669.html</link>
      <title>テストデータに対するテストについて</title>
      <pubDate>Sat, 06 Dec 2014 00:00:00 +0900</pubDate>
      <description>これはPostgreSQL Advent Calendar 2014の12月6日分の記事です。河原と申します。僭越ながらPostgreSQL関連本をAmazon PODで出版させて頂いております。---宣伝　ここから---来年の1月16日(金)にPostgreSQLパフォーマンスチューニング実例セミナーを開催することになりました。ご興味のある方は是非ご応募ください。---宣伝　ここまで---この記事以外に全く記事がないことからもお分かり頂けるように、記事の投稿の為にわざわざブ..</description>
            <content:encoded><![CDATA[
<div>これは<a href="http://qiita.com/advent-calendar/2014/postgresql" target="_blank">PostgreSQL Advent Calendar 2014</a>の12月6日分の記事です。</div><br /><br /><div>河原と申します。</div><br /><div>僭越ながら<a href="http://www.ntts.co.jp/publish/book/#book09" target="_blank">PostgreSQL関連本</a>をAmazon PODで出版させて頂いております。</div><br /><br /><div><a href="http://soft-dojyo-postgresql-20150116.peatix.com/" target="_blank">---宣伝　ここから---</a></div><br /><div><a href="http://soft-dojyo-postgresql-20150116.peatix.com/" target="_blank">来年の1月16日(金)にPostgreSQLパフォーマンスチューニング実例セミナーを開催することになりました。</a></div><br /><div><a href="http://soft-dojyo-postgresql-20150116.peatix.com/" target="_blank">ご興味のある方は是非ご応募ください。</a></div><br /><div><a href="http://soft-dojyo-postgresql-20150116.peatix.com/" target="_blank">---宣伝　ここまで---</a></div><br /><br /><div>この記事以外に全く記事がないことからもお分かり頂けるように、記事の投稿の為にわざわざブログを解説したわけですが、大した記事は書けませんのであしからず…</div><br /><br /><div>早速、本題に入ります。</div><br /><div>テストデータはなるべく本番環境のデータに近い内容であるべきなのですが、大量のリアルなデータを作成するには、それなりにテクニックが必要となります。</div><br /><br /><div>で、PostgreSQLでのテストデータ作成については<a href="http://lets.postgresql.jp/documents/technical/gen_data/1" target="_blank">既に去年のAdvent Calendarで笠原さんが書かれていますので</a>未読の方はまずはそちらの記事をご覧ください。</div><br /><br /><div>リアルなデータを作成するには色々と問題があるわけですが、その一つとして<strong>ランダム性</strong>が挙げられます。</div><br /><div>generate_series関数を使えば大量の連番データは容易に作成できますが、そこにランダム性を加えるとなると一工夫が必要となるわけです。</div><br /><br /><div>そして、ただランダムなだけであればrandom関数でも噛ませれば済む話なのですが、<strong>「ランダム性もあって整合性も保たれてなければならない」</strong>となると更に工夫が必要となります。</div><br /><br /><div>例えば先日、<strong>「シーケンス列とレコード作成日時列」</strong>の2列を持つテーブルのサンプルデータを作成する機会がありました。</div><br /><div>簡略化しますが、以下のようなイメージです。</div><br /><br /><pre class="prettyprint lang-sql"><br />  seq |      testtime <br /> -----+--------------------- <br />    1 | 2014-12-04 00:00:01 <br />    2 | 2014-12-04 00:00:02 <br />    3 | 2014-12-04 00:00:03 <br />    4 | 2014-12-04 00:00:04 <br />    5 | 2014-12-04 00:00:05 <br /> 　   : <br /></pre><br /><div>で、testtimeにランダム性を持たせたいわけですが、現実のデータを模するのであれば、testtimeは、seqが小さいレコードより大きな値でなければなりません。</div><br /><div>つまり、ランダムの間隔でレコードが作成されていくのを模したいわけです。</div><br /><br /><div>とりあえず、本当にランダム性が高いといえるか疑問はありますが、以下のようにサンプルデータを作成したとします。</div><br /><br /><pre class="prettyprint lang-sql"><br /> =&gt; CREATE TEMP TABLE tempdata AS <br />    SELECT generate_series(1,1000000) seq, <br />    current_timestamp + (generate_series(1,1000000)||'minutes')::interval <br />    - (floor(random() * 60)||'seconds')::interval testtime ; <br /><br />  seq |           testtime <br /> -----+------------------------------- <br />    1 | 2014-12-04 00:25:42.593496+09 <br />    2 | 2014-12-04 00:26:27.593496+09 <br />    3 | 2014-12-04 00:27:22.593496+09 <br />    4 | 2014-12-04 00:28:13.593496+09 <br />    5 | 2014-12-04 00:29:09.593496+09 <br /> 　   : <br /></pre><br /><div>レコード単位に1分ずつ加算させつつ、60秒未満のランダムな秒数を減算します。</div><br /><div>仮にseqが1のレコードが最小の減算値で、逆にseqが2のレコードが最大の減算値であったとしても、1のtesttimeが2を上回ることはない……<strong>筈なのですが、確認したくなるのが人情でしょう。</strong></div><br /><blockquote><br />余談ですが、100点満点のテストの点数のサンプルデータを作成する場合、ceil(random()*100)とやりたくなりますが、これだと0点が出ないことになるので、ceil(random()*101)-1かfloor(random()*101)としないと求めたい結果が出ません。<br /><br />ですが、公式ドキュメントでは、random関数の範囲は<a href="https://www.postgresql.jp/document/8.3/html/functions-math.html" target="_blank">8.3まででは「0.0～1.0の範囲の乱数値」</a>と、<a href="https://www.postgresql.jp/document/9.3/html/functions-math.html" target="_blank">最新のドキュメントでは「0.0 &lt;= x &lt; 1.0の範囲の乱数値」</a>と説明されています。<br />この説明が正しければ、<strong>random関数でジャスト0が出力される可能性がある</strong>ということになります。<br />が、とりあえず以下のSQLで10億回ほど施行してみましたが0は出ませんでした。<br /><pre class="prettyprint lang-sql"><br /> =&gt; WITH r AS <br />    (SELECT ceil(random()) col1 FROM generate_series(1,1000000000)) <br />    SELECT * FROM r WHERE col1 = 0 ; <br /><br />  col1 <br /> ------ <br /> (0 rows) <br /></pre><br />random関数はdouble precisionを返すようですが、<a href="http://www.postgresql.jp/document/9.3/html/datatype-numeric.html#DATATYPE-FLOAT" target="_blank">公式ドキュメントの浮動小数点データ型の説明</a>を簡単に読んだ限りでは、相当な桁数まで行くようですね…<br />本当に0が出るのか確認するためにはソースを読んだ方が早そうです。<br /></blockquote><br /><div>本題に戻ります。</div><br /><div>testtimeがseqと同様に昇順となっているか確認する方法としてまず思いつくのは、以下のように自己結合を用いる方法でしょうか。</div><br /><pre class="prettyprint lang-sql"><br /> =&gt; SELECT * FROM tempdata t1,tempdata t2 <br />    WHERE (t1.seq + 1 = t2.seq) AND (t1.testtime &gt; t2.testtime) ; <br /><br />  seq | testtime | seq | testtime <br /> -----+----------+-----+---------- <br /> (0 rows) <br /></pre><br /><div>ただ、この方法ですと抜け番のない列がないと実施できません。</div><br /><br /><div>方法は色々とあると思いますが、個人的には<a href="http://lets.postgresql.jp/documents/technical/window_functions" target="_blank">Window関数</a>をよく使っています。</div><br /><br /><div>row_numberを取得するために使われたことがある人も多いかと思いますが、普通の集約関数も大変便利に使えます。</div><br /><div>例えば以下のように使えば、seqでソート後のテーブルに対して、上から順に各行時点での最大値を取得できます。</div><br /><pre class="prettyprint lang-sql"><br /> =&gt; SELECT *,max(testtime) over(ORDER BY seq) FROM tempdata ; <br /><br />  seq |           testtime            |              max <br /> -----+-------------------------------+------------------------------- <br />    1 | 2014-12-04 23:19:49.001853+09 | 2014-12-04 23:19:49.001853+09 <br />    2 | 2014-12-04 23:20:48.001853+09 | 2014-12-04 23:20:48.001853+09 <br />    3 | 2014-12-04 23:21:49.001853+09 | 2014-12-04 23:21:49.001853+09 <br />    4 | 2014-12-04 23:22:32.001853+09 | 2014-12-04 23:22:32.001853+09 <br />    5 | 2014-12-04 23:23:55.001853+09 | 2014-12-04 23:23:55.001853+09 <br /> 　   : <br /></pre><br /><div>後は、testtimeとmaxの値が異なる行が存在しないかを確認するだけです。</div><br /><pre class="prettyprint lang-sql"><br /> =&gt; WITH r AS (SELECT *,max(testtime) over(ORDER BY seq) FROM tempdata) <br />    SELECT * FROM r WHERE testtime &lt;&gt; max ; <br /><br />  seq | testtime | max <br /> -----+----------+----- <br /> (0 rows) <br /></pre><br /><div>因みに、今回のケースでは自己結合よりWindow関数を利用した方が約1.5倍ほど高速でした。</div><br /><br /><br /><div>さて、ここで記事を終えても良いのですが、もう一つ<strong>ありがちな罠</strong>を紹介しておきます。</div><br /><br /><div>1回のSQLだけで整合性のあるデータを作らなければならないわけでは必ずしもありません。</div><br /><div>データを作成後に、後から問題のあるデータを修正するというやり方もあるかと思います。</div><br /><br /><div>が、深く考えずにやってしまいますと、その修正により整合性が失われてしまうことがあります。</div><br /><pre class="prettyprint lang-sql"><br /> =&gt; CREATE TEMP TABLE tempdata2 AS <br />    SELECT generate_series(1,1000) seq, <br />    current_timestamp + (generate_series(1,1000)||'days')::interval <br />    - (floor(random() * 24)||'hours')::interval testtime ; <br /><br /> =&gt; WITH r AS (SELECT *,max(testtime) over(ORDER BY seq) FROM tempdata2) <br />    SELECT * FROM r WHERE testtime &lt;&gt; max ; <br /><br />  seq | testtime | max <br /> -----+----------+----- <br /> (0 rows) <br /></pre><br /><div>この時点では整合性が保たれているのですが、このクエリでは日付が相当未来になってしまいますので、interval型を利用して2年ほど日付を巻き戻しますと……</div><br /><pre class="prettyprint lang-sql"><br /> =&gt; UPDATE tempdata2 SET testtime = testtime - interval '2 years'; <br /><br /> =&gt; WITH r AS (SELECT *,max(testtime) over(ORDER BY seq) FROM tempdata2) <br />    SELECT * FROM r WHERE testtime &lt;&gt; max ; <br /><br />  seq |           testtime           |             max <br /> -----+------------------------------+------------------------------ <br />  451 | 2014-02-28 07:27:44.77576+09 | 2014-02-28 18:27:44.77576+09 <br /> (1 row) <br /></pre><br /><div>ご覧のように、整合性に問題のあるデータが発生してしまいました。</div><br /><div>日付を見れば原因はすぐにお分かり頂けるかと思いますが、<strong>うるう年</strong>の影響です。</div><br /><br /><div>interval型は当然うるう年に対応していますが、対応した結果、</div><br /><div><strong>2016年2月29日 00:00:00</strong>の2年前は<strong>2014年2月28日 00:00:00</strong>となり、</div><br /><div><strong>2016年2月28日 12:00:00</strong>の2年前は<strong>2014年2月28日 12:00:00</strong>となります。</div><br /><pre class="prettyprint lang-sql"><br /> =&gt; SELECT '2016-2-29 00:00:00'::timestamp - interval '2 years' col1 , <br />           '2016-2-28 12:00:00'::timestamp - interval '2 years' col2 ; <br /><br /> -[ RECORD 1 ]------------- <br /> col1 | 2014-02-28 00:00:00 <br /> col2 | 2014-02-28 12:00:00 <br /></pre><br /><div>このように、前後関係が逆転してしまう可能性があるわけです。</div><br /><br /><div>「自分はこんなドジは踏まない」という方も多いかと思いますが、大量のテストデータを作成する場合は、僅かな意識漏れが結果として大きな違いを生む可能性があります。</div><br /><br /><div>テストデータを使ってテストをする前に、その<strong>テストデータ自身をテストする</strong>ことを強くお勧め致します。</div><br /><br /><div>12月7日は、<a href="http://d.hatena.ne.jp/nuko_yokohama/" target="_blank">nuko_yokohama</a>さんです。</div><br /><div>（カンファレンスお疲れ様でした。私も行きたかったです……）</div><br /><a name="more"></a>

]]></content:encoded>
            <category>PostgreSQL</category>
      <author>hahasoha</author>
          </item>
      </channel>
</rss>
