<?xml version="1.0" encoding="EUC-JP"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>とあるエンジニアの日常</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/" />
    <link rel="self" type="application/atom+xml" href="http://blog.himawari-dream.com/atom.xml" />
    <id>tag:blog.himawari-dream.com,2009-08-30://1</id>
    <updated>2012-01-25T14:17:15Z</updated>
    <subtitle>広島で悪戦苦闘の日々を送るとあるエンジニアが綴るブログ。ダーツ、カープ、呪文ｗがメイン。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.261</generator>

<entry>
    <title>カープの2012年の試合日程をiCalendarファイルにしてみた（開幕版） </title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2012/01/2012icalendar-1.html" />
    <id>tag:blog.himawari-dream.com,2012://1.531</id>

    <published>2012-01-25T14:15:17Z</published>
    <updated>2012-01-25T14:17:15Z</updated>

    <summary>公式戦の時間発表来てた〜！ ということで、開幕版に差し替え〜。 カープ試合日程-...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="カープ" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>公式戦の時間発表来てた〜！</p>
<p>ということで、開幕版に差し替え〜。</p>
<p><a href="http://download.himawari-dream.com/carp/calendar-2012.zip">カープ試合日程-2012 開幕版(zip)</a></p>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>カープの2012年の試合日程をiCalendarファイルにしてみた（暫定版）</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2012/01/2012icalendar.html" />
    <id>tag:blog.himawari-dream.com,2012://1.530</id>

    <published>2012-01-23T03:34:29Z</published>
    <updated>2012-01-23T03:52:30Z</updated>

    <summary>カープの2012年の試合日程を iPhone で見れるようにしたかったので、公式...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>カープの2012年の試合日程を iPhone で見れるようにしたかったので、公式からデータを引っ張ってくる＆そのデータを加工して、iCalendar を生成するスクリプトを作成してみた。</p>
<p>折角 ics として作成したので、一応圧縮ファイルとしては公開。</p>
<p><a href="http://download.himawari-dream.com/carp/calendar-2012.zip">カープ試合日程-2012 暫定版(zip)</a></p>
<p>ics ダイレクトでないのは、このサーバの負荷を懸念したため。なので、適当なサーバにアップして自己責任でご活用下さい。（リアル友人は応相談）</p>
<p>ちなみに、（暫定版）とあるとおり、まだ公式戦の時間が公式サイトに記載されていないため、終日スケジュールとして表示される。</p>
<p>これは、記載され次第更新予定。</p>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>iPhone から Canon 製プリンタへ印刷できない場合の対応</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2012/01/iphone-canon.html" />
    <id>tag:blog.himawari-dream.com,2012://1.529</id>

    <published>2012-01-22T04:50:38Z</published>
    <updated>2012-01-22T04:57:56Z</updated>

    <summary>最近購入した MG6230 に iPhone 用アプリ(Canon iEPP）か...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="その他" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>最近購入した MG6230 に iPhone 用アプリ(Canon iEPP）から印刷できないトラブルに遭遇。</p>
<p>ネットの情報を漁る限り、同じ悩みを抱えている人が多いようなので、対応方法をまとめておく。</p>
<p>■環境<br />---<br />プリンタ: Canon MG6230<br />iPhone: iPhone 4 (iOS 5.0.1)<br />Wi-Fi AP: PLANEX MZK-MF300N</p>
<p style="MARGIN-RIGHT: 0px" dir="ltr" align="left">■対応内容<br />---<br />ポイントは以下の２点であるようです。</p>
<p style="MARGIN-RIGHT: 0px" dir="ltr" align="left">(1) プリンタのファームウェアが ver.2.000 以上であること<br />　ファームウェアのバージョンは、PC などのブラウザより、下記で確認できます。<br />　　http://[プリンタのIPアドレス]/<br />　Bonjour によるプリンタの検出は ver.2.000 以降での対応である旨、下記公式サイトへの<br />　記述があるために対応。必須であるかどうかは未確認。<br />　　<a href="http://cweb.canon.jp/pls/webcc/WC_SHOW_CONTENTS.EdtDsp?i_cd_pr_catg=011&amp;i_tx_contents_dir=/e-support/faq/answer/inkjetmfp/&amp;i_tx_contents_file=64787-1.html&amp;i_fl_edit=1&amp;i_tx_search_pr_name=&amp;i_cl_form=03&amp;i_cd_qasearch=Q000064787&amp;i_cd_transition=2#2">http://cweb.canon.jp/pls/webcc/WC_SHOW_CONTENTS.EdtDsp?i_cd_pr_catg=011&amp;i_tx_contents_dir=/e-support/faq/answer/inkjetmfp/&amp;i_tx_contents_file=64787-1.html&amp;i_fl_edit=1&amp;i_tx_search_pr_name=&amp;i_cl_form=03&amp;i_cd_qasearch=Q000064787&amp;i_cd_transition=2#2</a></p>
<p style="MARGIN-RIGHT: 0px" dir="ltr" align="left">　ちなみに、MG6230 のアップデートユーティリティは下記からダウンロード。<br />　　<a href="http://cweb.canon.jp/drv-upd/ij-mfp/fuu-win-mg6200-10-ea7.html">http://cweb.canon.jp/drv-upd/ij-mfp/fuu-win-mg6200-10-ea7.html</a></p>
<p style="MARGIN-RIGHT: 0px" dir="ltr" align="left">　我が家のプリンタは、2011/12 に購入したものですが、それでも初期状態は ver.1.000 でした。</p>
<p style="MARGIN-RIGHT: 0px" dir="ltr" align="left">(2) Wi-Fi AP の暗号化方式を WPA2 以外にすること<br />　AP 側の問題かもしれませんが、WPA2(AES) の場合には使用することができませんでした。<br />　WEP ならば動作しますが、セキュリティ強度が極めて低いため、あまりおすすめしません。<br />　WPA が指定できるならば、せめて WPA(AES) にしておいた方が良いでしょう。<br />　※この辺の詳細はご自身でお調べ下さい。</p>
<p style="MARGIN-RIGHT: 0px" dir="ltr" align="left">　ちなみに、我が家で使用している AP では PC 用、ゲーム機用に個別で指定できるため、<br />　ゲーム機用を WEP から WPA(AES) に変更することで対応しています。<br />　ただし、任天堂 DS などを Wi-Fi 接続で使用されている場合には、WEP 以外には対応して<br />　いない可能性があるので、ご自身の環境に合わせて設定して下さい。<br />&nbsp;<br />　余談ですが、WPA2(AES) で iPhone を使用されていて、動画の読み込みが遅いなぁという<br />　場合にも、暗号化方式の変更は有効です。<br />　（私はそもそも、動画の読み込みが遅いのに嫌気がさして、調べた結果、保留にしていた<br />　　iPhone での印刷にも対応できるようになったのに気付きました、、、）</p>
<p style="MARGIN-RIGHT: 0px" dir="ltr" align="left">&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>広ブロのオフ会に参加してきた</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2010/07/post-408.html" />
    <id>tag:blog.himawari-dream.com,2010://1.528</id>

    <published>2010-07-17T02:39:54Z</published>
    <updated>2010-07-17T02:46:54Z</updated>

    <summary>というわけで、先日広島ブログのオフ会に参加してきました。 各投稿に貼られているオ...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="日常" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>というわけで、先日広島ブログのオフ会に参加してきました。</p>
<p>各投稿に貼られているオレンジ色のリンクのやつです。＾＾</p>
<p>友人に誘われての参加だったのですが、最初エンジニア関係の方が多いのかな？と思っていたら、その逆で、色々なお仕事の方がいらっしゃっていて、良い意味で刺激を頂きました。</p>
<p>特に、最近ブログを更新してなかったなと思い、まとめて５件投稿したりしてｗ</p>
<p>ただ、最近の蓄積疲労＆酒のせいで後半瞼が重くて、ほとんど話ができず残念でした。</p>
<p>違う分野の方とお話させて頂くことはめったにないことなので、機会があればまた刺激を頂きにいきたいと思います。</p>
<p>ということで、参加者のみなさまお疲れさまでした。</p>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>HTML5 でメニューの開閉状態を保存する</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2010/07/html5.html" />
    <id>tag:blog.himawari-dream.com,2010://1.527</id>

    <published>2010-07-17T02:12:35Z</published>
    <updated>2010-07-17T02:37:31Z</updated>

    <summary>Webアプリでトグル式になったメニューを作ることがありますよね。 ボタンを押した...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>Webアプリでトグル式になったメニューを作ることがありますよね。</p>
<p>ボタンを押したら開いて、再度押したら閉じてっていうやつです。</p>
<p>その開閉状態をブラウザを閉じても保持しようとすると、今までは非同期でサーバ側に状態を保存するか、Cookieを使うしかありませんでした。</p>
<p>HTML5だと、この辺も楽ちんですね。sessionStorageとか、localStorageを使えば、Cookie以上にお手軽に key, value のペアをローカル側に保存できるので、サーバ側の実装不要で状態を保存することができます。</p>
<p>試しにサンプルコードを載せておきます。</p>
<p>ちなみに、jQueryと、jQuery.jsonを使用していますのでご注意ください。</p>
<p>上述した通り、保存可能なデータは、key, value ですが、value は String である必要があるため、オブジェクトを JSON 形式に変換して保存するのに使用しています。</p>
<p>&nbsp;</p>]]>
        <![CDATA[<pre><p>（サンプルコード）Safari, Chromeのみ</p><p>click! を押すと、各contents部分の表示／非表示が切り替わります。</p><p>ブラウザを開きなおしても、表示状態は保持されます。</p><p>-------------------------------------------------------------------------</p><p>&lt;html&gt;<br />&lt;script src="./jquery-1.4.2.min.js"&gt;&lt;/script&gt;<br />&lt;script src="./jquery.json-2.2.min.js"&gt;&lt;/script&gt;<br />&lt;script&gt;<br />var customlocalStorage = {<br />&nbsp;get: function(key) {<br />&nbsp;&nbsp;return(localStorage.getItem(key));<br />&nbsp;},<br />&nbsp;add: function(key, value) {<br />&nbsp;&nbsp;localStorage.setItem(key, value);<br />&nbsp;},<br />&nbsp;object: function(key) {<br />&nbsp;&nbsp;var str = this.get(key);<br />&nbsp;&nbsp;if (str) {<br />&nbsp;&nbsp;&nbsp;return($.evalJSON(str));<br />&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;return(undefined);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />};</p>
<p>var autoElementOpener = {<br />&nbsp;set: function(group, id) {<br />&nbsp;&nbsp;var obj = $("#" + id);</p>
<p>&nbsp;&nbsp;if (obj) {<br />&nbsp;&nbsp;&nbsp;var db = customlocalStorage.object("autoElementOpener_" + group);</p>
<p>&nbsp;&nbsp;&nbsp;if (!db) {<br />&nbsp;&nbsp;&nbsp;&nbsp;db = {};<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;if (obj.css("display") === "none") {<br />&nbsp;&nbsp;&nbsp;&nbsp;db[id] = false;<br />&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;db[id] = true;<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;customlocalStorage.add("autoElementOpener_" + group, $.toJSON(db));<br />&nbsp;&nbsp;}<br />&nbsp;},</p>
<p>&nbsp;refresh: function(group) {<br />&nbsp;&nbsp;var db = customlocalStorage.object("autoElementOpener_" + group);</p>
<p>&nbsp;&nbsp;if (db) {<br />&nbsp;&nbsp;&nbsp;jQuery.each(db, function(key, val) {<br />&nbsp;&nbsp;&nbsp;&nbsp;var obj = $("#" + key);<br />&nbsp;&nbsp;&nbsp;&nbsp;if (obj) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (obj.css("display") === "none") {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (val) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.css("display", "");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!val) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.css("display", "none");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;}<br />&nbsp;}<br />};</p>
<p>var toggleDisplay = function(id) {<br />&nbsp;var obj = $("#" + id);</p>
<p>&nbsp;if (obj) {<br />&nbsp;&nbsp;if (obj.css("display") === "none") {<br />&nbsp;&nbsp;&nbsp;obj.css("display", "");<br />&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;obj.css("display", "none");<br />&nbsp;&nbsp;}<br />&nbsp;}<br />};</p>
<p>&lt;/script&gt;<br />&lt;body onLoad="autoElementOpener.refresh('test');"&gt;<br />&lt;span onClick="toggleDisplay('test1');autoElementOpener.set('test', 'test1');" style="display:;"&gt;click!(test1)&lt;/span&gt;&lt;br&gt;<br />&lt;span id="test1" onClick="toggleDisplay('test1');autoElementOpener.set('test', 'test1');"&gt;contents(test1)&lt;/span&gt;&lt;br&gt;&lt;br&gt;<br />&lt;span onClick="toggleDisplay('test2');autoElementOpener.set('test', 'test2');" style="display:;"&gt;click!(test2)&lt;/span&gt;&lt;br&gt;<br />&lt;span id="test2" onClick="toggleDisplay('test2');autoElementOpener.set('test', 'test2');"&gt;contents(test2)&lt;/span&gt;&lt;br&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p></pre>]]>
    </content>
</entry>

<entry>
    <title>Apache Hadoop について調べてみる（継続中）</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2010/07/apache-hadoop.html" />
    <id>tag:blog.himawari-dream.com,2010://1.526</id>

    <published>2010-07-17T01:54:30Z</published>
    <updated>2010-07-17T01:58:48Z</updated>

    <summary>一時いろんなファイルシステムについて調べていた時期があったので、ついでに備忘代わ...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="ファイルシステム" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>一時いろんなファイルシステムについて調べていた時期があったので、ついでに備忘代わりにアップｗ</p>
<p>今回は Apache Hadoop について、これまた既に色々なウェブサービスで利用されているので、ご存じの方も多いはず。</p>
<p>そのうち隙をみてインストールとか色々試してみたいと思います。</p>]]>
        <![CDATA[<p>■タイトル<br />---<br />　Apache Hadoop</p>
<p>■概要<br />---<br />　Apache HadoopはフリーのJavaソフトウェアフレームワークであり、<br />　大規模データの分散アプリケーションをサポートする。<br />　Hadoopはアプリケーションが数千ノードおよびペタバイトクラスのデータを<br />　処理することを可能としている。</p>
<p>■前提条件<br />---<br />　・コンピュータやストレージは故障する<br />　・高いサーバを必要とせずパフォーマンスを確保する<br />　・１度しか書き込まれない大規模なファイルにストリーミング・アクセス</p>
<p>■特徴<br />---<br />　HDFS(Hadoop Distributed File System)<br />　　Hadoop独自のファイルシステム。<br />　　各OSが提供するファイルシステム上で動作し、 数ペタバイトの容量まで<br />　　スケールするよう設計されている。</p>
<p>　・大きなファイルをブロックに分割し、複数のコンピュータにまたがって格納<br />　　　→ブロックサイズは通常64MB<br />　・データの複製を複数のコンピュータに格納<br />　　　→RAID不要で信頼性向上<br />　・データノードはHTTPによりデータを提供することができる<br />　・スケーラビリティに富み１台のコンピュータに高スペックは必要としない<br />　　　→台数が多いほど並列化の原則により高速化<br />　・Java言語で作成されたフレームワークがあり、親和性が高い<br />　　　→C++、Perl でも<br />　・クライアントからは従来の階層構造のファイルシステムのように見える<br />　　　→ファイルの作成、削除、移動、リネーム等可能<br />　・通常のオペレーティングシステムにはマウントできない<br />　　　→Linux では FUSE(Filesystem in Userspace) により、解決可能？</p>
<p>■構成要素<br />　ネームノード：<br />　　全てのファイル操作を司る。<br />　　ファイルシステムの名前空間を管理し、クライアントによるアクセスを制御。<br />　　HDFSにおける single point of failure（単一障害点）。<br />　　ネームノードがダウンした場合、ファイルシステムはオフラインとなる。<br />　　プライマリ・ネームノード、セカンダリ・ネームノードがあるが、セカンダリは<br />　　プライマリの代替ではなく、ディレクトリ情報のスナップショットをダウンロードし、<br />　　最新のディレクトリ構造を作成するなど、動作上の補助を行う。<br />　　実際の I/O トランザクションはネームノードを通過せず、ブロックとデータノードとの<br />　　間でのファイルのマッピングを示すメタデータのみがネームノードを通過する。<br />　　データノードから送信されてくるハートビート・メッセージのブロック・レポートと<br />　　自身の持つメタデータと突合せ検証し、問題があれば修復アクションを実行。</p>
<p>　データノード：<br />　　HDFS クライアントからの読み書きリクエストに応答する。<br />　　ネームノードから受信されるブロック作成、削除複製のコマンドにも応答。<br />　　ブロック・レポートを含めたハートビート・メッセージを定期的にネームノードに送信。</p>
<p>　簡易構成図：<br />　　<a href="http://www.ibm.com/developerworks/jp/linux/library/l-hadoop/">http://www.ibm.com/developerworks/jp/linux/library/l-hadoop/</a></p>
<p>■ファイル操作の流れ<br />---<br />　1. クライアントから HDFS へのファイル書き込みが発生<br />　　→ローカル一時ストレージにキャッシング<br />　2. ブロックサイズを超えるとファイル作成リクエストをネームノードに送信<br />　　→ネームノードはデータノードの ID と宛先ブロックをクライアントに返す<br />　　→同じくレプリカデータノード群にも通知<br />　3. ブロックをデータノードに送信<br />　　→パイプライン方式で即座にレプリカデータノード群にも送信<br />　4. クライアントでチェックサムファイルを作成し<br />　　→同じ HDFS 名前空間に保存<br />　5. 最後のブロックの送信が完了<br />　　→ネームノードは永続メタデータ・ストレージに対してファイルの作成をコミット</p>
<p>■主要なユーザ<br />---<br />　・Yahoo!<br />　・Amazon EC2/S3<br />　・A9.com<br />　・Facebook<br />　・Fox Interactive Media<br />　・IBM<br />　・ImageShack<br />　・ISI<br />　・Joost<br />　・Last.fm<br />　・Powerset<br />　・ニューヨーク・タイムズ<br />　・Rackspace<br />　・Veoh<br />　・Metaweb</p>
<p>■参考ＵＲＬ<br />---<br />　<a href="http://ja.wikipedia.org/wiki/Hadoop">http://ja.wikipedia.org/wiki/Hadoop</a><br />　<a href="http://www.ibm.com/developerworks/jp/linux/library/l-hadoop/">http://www.ibm.com/developerworks/jp/linux/library/l-hadoop/</a><br />　<a href="http://d.hatena.ne.jp/naoya/20080511/1210506301">http://d.hatena.ne.jp/naoya/20080511/1210506301</a><br />　<a href="http://www.db.is.kyushu-u.ac.jp/rinkou/cloudcomputing/hadoopinstall.html">http://www.db.is.kyushu-u.ac.jp/rinkou/cloudcomputing/hadoopinstall.html</a></p>]]>
    </content>
</entry>

<entry>
    <title>HTML5 で広がるWebアプリの世界</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2010/07/html5-web.html" />
    <id>tag:blog.himawari-dream.com,2010://1.525</id>

    <published>2010-07-17T01:28:38Z</published>
    <updated>2010-07-17T01:52:24Z</updated>

    <summary>HTML5 では、ローカルストレージ（ローカル側にデータを格納）のための方法が多...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>HTML5 では、ローカルストレージ（ローカル側にデータを格納）のための方法が多く定義されています。</p>
<p>実際に、iPhone（Safari）では既に多くの機能が使用できるため、単純なWebアプリであっても、オフライン利用や、キャッシュによる高速化と言った事が可能です。</p>
<p>ということで、今回は、ストレージ部分にフォーカスして投稿しておきます。（主目的は自分の備忘録ｗ）</p>
<p>&nbsp;</p>]]>
        <![CDATA[<p>//<br />// HTML5 - Offline Web Applications<br />//</p>
<p>■Web Storage<br />---<br />　データをブラウザに蓄積する仕組みで、キー、ペアの対となるデータを格納することができる。<br />　クッキーよりも大きなデータを保存することができるため、オフラインアプリケーションの開発に役立つ。</p>
<p>　[1] sessionStorage<br />　　キーと値のペアを永続的に保存できる。<br />　　ただし、sessionStorageはウィンドウごとにストレージが異なり、ウィンドウが閉じられるとデータは削除される。<br />　　ドメインごとにストレージは異なる。<br />　　　<a href="http://ayuta.co.jp/html5-samples/storage/simple-sessionStorage/sessionStorage.html">http://ayuta.co.jp/html5-samples/storage/simple-sessionStorage/sessionStorage.html</a></p>
<p>　　(1) setItemメソッド<br />　　　キー、値のペアをセットする<br />　　　　sessionStorage.setItem(key, value);</p>
<p>　　(2) getItemメソッド<br />　　　キーから値を取得する<br />　　　　sessionStorage.getItem(key)</p>
<p>　　(3) removeItemメソッド<br />　　　指定されたキーのペアを削除する<br />　　　　sessionStorage.removeItem(key)</p>
<p>　　(4) clearメソッド<br />　　　全てのデータを削除する<br />　　　　sessionStorage.clear()</p>
<p>　　(5) lengthプロパティ<br />　　　sessionStorageに格納されているペアの数<br />　　　　sessionStorage.length</p>
<p>　　(6) keyメソッド<br />　　　n 番目の key を返す。<br />　　　　sessionStorage.key(n)</p>
<p>　[2] localStorage<br />　　キーと値のペアを永続的に保存できる。<br />　　sessionStorageとの違いはウィンドウが閉じられてもデータは削除されない点にある。<br />　　ドメインごとにストレージは異なる。<br />　　　<a href="http://ayuta.co.jp/html5-samples/storage/simple-localStorage/localStorage.html">http://ayuta.co.jp/html5-samples/storage/simple-localStorage/localStorage.html</a></p>
<p>　　(1) setItemメソッド<br />　　　キー、値のペアをセットする<br />　　　　localStorage.setItem(key, value);</p>
<p>　　(2) getItemメソッド<br />　　　キーから値を取得する<br />　　　　localStorage.getItem(key)</p>
<p>　　(3) removeItemメソッド<br />　　　指定されたキーのペアを削除する<br />　　　　localStorage.removeItem(key)</p>
<p>　　(4) clearメソッド<br />　　　全てのデータを削除する<br />　　　　localStorage.clear()</p>
<p>　　(5) lengthプロパティ<br />　　　localStorageに格納されているペアの数<br />　　　　localStorage.length</p>
<p>　　(6) keyメソッド<br />　　　n 番目の key を返す。<br />　　　　localStorage.key(n)</p>
<p>■Offline Web Applications<br />---<br />　[1] SQL<br />　　SQL を用いたデータ保存を実現。<br />　　※2009/12/25 現在 Safari のみ？（Chromeは未確認）</p>
<p>　　(1) openDatabase<br />　　　window オブジェクトに定義されている。<br />　　　データベースを定義し、実際に使うために最初に実行するメソッド。</p>
<p>　　　使用方法：<br />　　　　var db = openDatabase(DBName, Version, ViewName, MaxSize);<br />　　　　　DBName: データベース名<br />　　　　　Version: データベースバージョン<br />　　　　　ViewName: 表示名<br />　　　　　MaxSize: データベースの最大サイズ（バイト）</p>
<p>　　　例：<br />&nbsp;var db = openDatabase("DB", "1.0", "Custom Database", 10000000);<br />　　　※このメソッドが存在しない場合、SQLはサポートされていない</p>
<p>　　(2) transaction/executeSql<br />　　　transactionメソッドはopenDatabaseで生成したオブジェクトに定義されるメソッド。<br />　　　SQL はこのメソッドのコールバック中で実行する。<br />　　　実際には、transactionの第一引数に定義されるexecuteSql メソッドで実行する。<br />　　　SQL は次の特徴を持つ。<br />　　　　・ドメインごとに保存される永続データ<br />　　　　・SafariではSQLiteが使用されている<br />　　　　・2009/12/25 現在サポートブラウザは少ない（Safari, Chrome）</p>
<p>　　　使用方法：<br />　　　　・transaction<br />　　　　　db.transaction(FUNC, ERROR, SUCCESS);<br />　　　　　　FUNC: トランザクション処理<br />　　　　　　ERROR: エラーコールバック<br />　　　　　　SUCCESS: サクセスコールバック</p>
<p>　　　　・executeSql<br />　　　　　db.transaction(function(tx) {<br />　　　　　&nbsp;tx.executeSql(SQL, PARAMS, SCB, ECB);<br />　　　　　});<br />　　　　　　SQL: 実行するSQL文字列<br />　　　　　　PARAMS: 値の配列<br />　　　　　　SCB: サクセスコールバック<br />　　　　　　ECB: エラーコールバック</p>
<p>　　　例：<br />&nbsp;db.transaction(function(tx) {<br />&nbsp;&nbsp;tx.executeSql("SELECT DATA FROM CUSTOM_TABLE WHERE ID=?", [id], function(tx, rs) {<br />&nbsp;&nbsp;&nbsp;var row = rs.rows.item(0);<br />&nbsp;&nbsp;&nbsp;return(row.data);<br />&nbsp;&nbsp;}, function(tx, error) {<br />&nbsp;&nbsp;&nbsp;alert("error!");<br />&nbsp;&nbsp;});<br />&nbsp;});</p>
<p>　　(3) changeVersion<br />　　　changeVersionメソッドはexecuteSqlメソッド同様、transactionの第一引数に定義される。<br />　　　データベースの定義を変更（バージョン変更）したい場合に使用します。</p>
<p>　　　使用方法：<br />&nbsp;db.changeVersion(OLD_VERSION, NEW_VERSION, FUNC, ERROR, SUCCESS);<br />　　　　　OLD_VERSION: 以前のデータベースバージョン<br />　　　　　NEW_VERSION: 新しいデータベースバージョン<br />　　　　　FUNC: トランザクション処理<br />　　　　　ERROR: エラーコールバック<br />　　　　　SUCCESS: サクセスコールバック</p>
<p>　　　例：<br />&nbsp;db.changeVersion("1.0", "2.0", function(tx) {<br />　　　　&nbsp;// 変更処理<br />　　　　}, function(error) {<br />　　　　&nbsp;// エラー処理<br />　　　　}, function() {<br />　　　　&nbsp;// サクセス処理<br />　　　　});</p>
<p>〜〜〜サンプル〜〜〜<br />var dbWrapper = {<br />&nbsp;initialize: function() {<br />&nbsp;&nbsp;if (window.openDatabase) {<br />&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;this.db = openDatabase("DAisdb", "1.0", "DA INSUITE(R)Enterprise Web Storage", 10000000);<br />&nbsp;&nbsp;&nbsp;} catch (e) {<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;},<br />&nbsp;getTime: function() {<br />&nbsp;&nbsp;var date = new Date();<br />&nbsp;&nbsp;var time = parseInt(date.getTime() / 1000, 10);<br />&nbsp;&nbsp;return(time);<br />&nbsp;},<br />&nbsp;select: function(table, params, success, error) {<br />&nbsp;&nbsp;var id&nbsp; = parseInt(params.id, 10);<br />&nbsp;&nbsp;var type = parseInt(params.type, 10);<br />&nbsp;&nbsp;if (this.db) {<br />&nbsp;&nbsp;&nbsp;this.db.transaction(function(tx) {<br />&nbsp;&nbsp;&nbsp;&nbsp;tx.executeSql("SELECT * FROM " + table + " WHERE ID=? AND TYPE=?", [id, type], function(tx, rs) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var row = rs.rows.item(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(row.data);<br />&nbsp;&nbsp;&nbsp;&nbsp;}, error);<br />&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;}<br />&nbsp;},<br />&nbsp;update: function(table, json) {<br />&nbsp;&nbsp;var id = parseInt(json.id, 10);<br />&nbsp;&nbsp;var type = parseInt(json.type, 10);<br />&nbsp;&nbsp;var data = json.data;<br />&nbsp;&nbsp;var modify = this.getTime();</p>
<p>&nbsp;&nbsp;if (this.db) {<br />&nbsp;&nbsp;&nbsp;this.db.transaction(function(tx) {<br />&nbsp;&nbsp;&nbsp;&nbsp;tx.executeSql("CREATE TABLE IF NOT EXISTS " + table + "(id INTEGER PRIMARY KEY,type INTEGER,modify INTEGER,data TEXT)", [], function(tx, rs) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.executeSql("DELETE FROM " + table + " WHERE ID=? AND TYPE=?", [id, type], function(tx, rs) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, function(tx, error) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("delete failed.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.executeSql("INSERT INTO " + table + " (id,type,modify,data) VALUES (?,?,?,?)", [id,type,modify,data], function(tx, rs) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}, function(tx, error) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("insert failed.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;}, function(tx, error) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("update failed.");<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;}<br />&nbsp;}<br />};<br />〜〜〜サンプル〜〜〜</p>
<p>　[2] Offline Application Caching API<br />　　オフライン時にもコンテンツの表示に支障がないようキャッシュすべきファイルを指定する</p>
<p>　　・HTML<br />　　　&lt;html manifest="cache.manifest"&gt; <br />　　　※cache.manifest ファイルをマニフェストファイルとして定義する</p>
<p>　　・cache.manifest</p>
<p>〜〜〜サンプル〜〜〜<br />CACHE MANIFEST<br />index.html<br />help.html<br />style/default.css<br />images/logo.png<br />images/backgound.png</p>
<p>NETWORK:<br />server.cgi<br />〜〜〜サンプル〜〜〜</p>
<p>　　　CACHE MANIFEST: キャッシュさせるリスト<br />　　　NETWORK: キャッシュさせないリスト</p>
<p>　　・.htaccessなど</p>
<p>〜〜〜サンプル〜〜〜<br />AddType text/cache-manifest .manifest <br />〜〜〜サンプル〜〜〜</p>
<p>　　・event-source？<br />　　　HTML 5 日本語公式サイトに、「event-source 要素は、サーバがWebページに更新情報を連続的に流すことができるようにする HTML 5 の新機能です。」とあるが、詳細不明。</p>
<p>〜〜〜サンプル〜〜〜<br />&lt;event-source src="server.cgi"&gt;<br />〜〜〜サンプル〜〜〜</p>
<p>■参考<br />---<br />　<a href="http://www.html5.jp/trans/w3c_webstorage.html">http://www.html5.jp/trans/w3c_webstorage.html</a><br />　<a href="http://ayuta.co.jp/html5-samples/index.html">http://ayuta.co.jp/html5-samples/index.html</a><br />　<a href="http://d.hatena.ne.jp/amachang/20080327/1206607704">http://d.hatena.ne.jp/amachang/20080327/1206607704</a><br /></p>]]>
    </content>
</entry>

<entry>
    <title>MogileFS を試してみた</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2010/07/mogilefs.html" />
    <id>tag:blog.himawari-dream.com,2010://1.524</id>

    <published>2010-07-17T01:23:46Z</published>
    <updated>2010-07-17T01:24:59Z</updated>

    <summary>MogileFS をインストールして試してみた。...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="ファイルシステム" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>MogileFS をインストールして試してみた。</p>]]>
        <![CDATA[<p>//<br />// MogileFS<br />//<br />■概要<br />---<br />Perlで実装された分散ファイルシステム。<br />memcachedと同じくBrad Fitzpatrick氏が開発。</p>
<p>■特徴<br />---<br />・アプリケーションレベルでの実装（カーネル変更必要なし）<br />・プロトコルはHTTP<br />・ファイルシステムに依存しない<br />・簡単にディスク追加が可能<br />・自動レプリケーション<br />・自動フェイルオーバー</p>
<p>→ネットワーク障害などでいずれかのサーバがダウンしても、他のサーバにコピーされた<br />　ファイルにアクセスできるた冗長性に富んだシステム構築が可能</p>
<p><br />■動作原理と用語説明<br />---<br />下記のサイトが参考になります。<br /><a href="http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs.html">http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs.html</a></p>
<p>上記参考サイトより抜粋</p>
<p>　domain：ファイル名の名前空間最上位に位置するもので、すべての key は何らかの domain に所属します。<br />　key：一般的なローカルファイルシステムのファイル名にあたる部分です。<br />　trackers：client と storage nodes との仲介役。<br />　　database からファイルの URL を生成し client に返す。client はその URL に対して HTTP でアクセス。<br />　database：ファイルのノード情報、storage nodes の情報を保持するデータベース。<br />　　storage node のホスト名<br />　　storage node のポート番号 <br />　　storage node 上で管理されているファイル名（keyとは異なる、MogileFS内部で使用するファイル名です） <br />　storage nodes：ファイルの実体を保持する HTTP サーバー。 </p>
<p>■インストール<br />---<br />インストールも下記参考サイト様が詳しいので、割愛ｗ</p>
<p><a href="http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs_install.html">http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs_install.html</a></p>
<p>とりあえず以下のように設定しました。</p>
<p>===<br /># mogadm check<br />Checking trackers...<br />&nbsp; 127.0.0.1:7001 ... OK</p>
<p>Checking hosts...<br />&nbsp; [ 1] localhost ... OK</p>
<p>Checking devices...<br />&nbsp; host device&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size(G)&nbsp;&nbsp;&nbsp; used(G)&nbsp;&nbsp;&nbsp; free(G)&nbsp;&nbsp; use%&nbsp;&nbsp; ob state&nbsp;&nbsp; I/O%<br />&nbsp; ---- ------------ ---------- ---------- ---------- ------ ---------- -----<br />&nbsp; [ 1] dev1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17.340&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.358&nbsp;&nbsp;&nbsp;&nbsp; 12.982&nbsp; 25.13%&nbsp; writeable&nbsp;&nbsp; 0.0<br />&nbsp; [ 1] dev2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17.340&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.358&nbsp;&nbsp;&nbsp;&nbsp; 12.982&nbsp; 25.13%&nbsp; writeable&nbsp;&nbsp; 0.0<br />&nbsp; [ 1] dev3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17.340&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.358&nbsp;&nbsp;&nbsp;&nbsp; 12.982&nbsp; 25.13%&nbsp; writeable&nbsp;&nbsp; 0.0<br />&nbsp; ---- ------------ ---------- ---------- ---------- ------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total:&nbsp;&nbsp;&nbsp; 52.020&nbsp;&nbsp;&nbsp;&nbsp; 13.075&nbsp;&nbsp;&nbsp;&nbsp; 38.945&nbsp; 25.13%<br />===<br />※ステータス情報<br />alive：書き込み、読み込み可能。 <br />down：一時的に使用不可。 <br />dead：使用不可。ファイルは別の場所にコピーされている。 <br />readonly：読み込み専用。 </p>
<p>===<br /># mogadm domain list<br />&nbsp;domain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mindevcount&nbsp;&nbsp; replpolicy<br />-------------------- -------------------- ------------- ------------<br />&nbsp;darts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultipleHosts()<br />&nbsp;darts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; normal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultipleHosts()<br />===<br />※mindevcount で指定されている数の node でコピーを保存します</p>
<p>■Client API<br />---<br />下記参考サイト様を（以下略）ｗ</p>
<p><a href="http://www.sixapart.jp/techtalk/2006/10/mogilefsclient_mogilefs.html">http://www.sixapart.jp/techtalk/2006/10/mogilefsclient_mogilefs.html</a></p>
<p>■起動<br />---<br /># /etc/rc.d/init.d/mysqld start<br /># sudo -u mogile mogilefsd<br /># sudo mogstored -d</p>
<p>■サンプルコードと実験<br />---<br />書き込み、読み込みのサンプルコードを書いて色々試してみました。</p>
<p>[1] 書き込み<br />===<br />#!/usr/bin/perl<br />use strict;<br />use warnings;</p>
<p>use MogileFS::Client;</p>
<p>die "Please input parameters." if (!$ARGV[0] || !$ARGV[1]);</p>
<p>## MogileFS インスタンス作成<br />my $mogfs = MogileFS::Client-&gt;new(<br />&nbsp;&nbsp;&nbsp; domain =&gt; 'darts',<br />&nbsp;&nbsp;&nbsp; hosts&nbsp; =&gt; [ '127.0.0.1:7001' ],<br />);<br />die "Unable to initialize MogileFS object." unless $mogfs;</p>
<p>## key 名 "hello" のファイルを normal クラス（mindevcount=2）で新規ファイル作成<br />my $fh = $mogfs-&gt;new_file($ARGV[0], "normal") or die $mogfs-&gt;errstr;</p>
<p>## 書き込み<br />$fh-&gt;print($ARGV[1]) or die $mogfs-&gt;errstr;</p>
<p>## 閉じる<br />$fh-&gt;close or die $mogfs-&gt;errstr;<br />===<br />※ls -la /var/mogdata/*/*/*/*</p>
<p>[2] 読み込み<br />===<br />#!/usr/bin/perl<br />use strict;<br />use warnings;</p>
<p>use MogileFS::Client;</p>
<p>die "Please input parameters." if (!$ARGV[0]);</p>
<p>## MogileFS インスタンス作成<br />my $mogfs = MogileFS::Client-&gt;new(<br />&nbsp;&nbsp;&nbsp; domain =&gt; 'darts',<br />&nbsp;&nbsp;&nbsp; hosts&nbsp; =&gt; [ '127.0.0.1:7001' ],<br />);<br />die "Unable to initialize MogileFS object." unless $mogfs;</p>
<p>## key 名 hello のファイルを読み込んで表示<br />my $data = $mogfs-&gt;get_file_data($ARGV[0]);<br />die $mogfs-&gt;errstr unless $data;<br />print $$data . "\n";<br />===</p>
<p>[3] 実験<br />(1) レプリケーションされたファイルを削除する<br />　→一定時間後にファイルが復元</p>
<p>(2) レプリケーションされたファイルを強制書き換え<br />　→一定時間後にも特に変化なし</p>
<p>ということで、どうやらファイル消失時の復旧は自動で行われるようですが、<br />破損時には復旧されないようですね。</p>
<p>Perlで利用できるファイルシステムなので、memcached同様様々な利用シーンが<br />ありそうですが、破損時に関しては注意が必要ですね。</p>
<p>■参考ＵＲＬ<br />---<br /><a href="http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs.html">http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs.html</a><br /><a href="http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs_install.html">http://www.sixapart.jp/techtalk/2006/10/dev_mogilefs_install.html</a><br /><a href="http://www.sixapart.jp/techtalk/2006/10/mogilefsclient_mogilefs.html">http://www.sixapart.jp/techtalk/2006/10/mogilefsclient_mogilefs.html</a><br /><a href="http://builder.japan.zdnet.com/sp/open-source-software-moonlinx-2009/story/0,3800096543,20391825,00.htm">http://builder.japan.zdnet.com/sp/open-source-software-moonlinx-2009/story/0,3800096543,20391825,00.htm</a><br /></p>]]>
    </content>
</entry>

<entry>
    <title>memcachedをインストールしてみる</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2010/07/memcached.html" />
    <id>tag:blog.himawari-dream.com,2010://1.523</id>

    <published>2010-07-17T00:39:17Z</published>
    <updated>2010-07-17T00:54:35Z</updated>

    <summary>しばらく放置気味でした＾＾；；； かなり前にmemcachedについて調べてた内...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="その他" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>しばらく放置気味でした＾＾；；；</p>
<p>かなり前にmemcachedについて調べてた内容を、今更ながらアップしてみる。</p>
<p>既に多くのウェブサービスで利用されているので、ほんとに今更なんだけども、、、</p>
<p>実際ビジネスユースで使うには、32bitOSではセッション情報と簡単な設定くらいしか（サイズ的に）利用が難しいかなぁ。それなりのデータを保存するには、それこそ台数でカバーするしか、、、</p>
<p>でも、64bitOSだと利用可能なメモリサイズが段違いなので、色々と利用シーンがありそうですよね。</p>]]>
        <![CDATA[<p>//<br />// memcached<br />//<br />■概要<br />---<br />　データやオブジェクトを分散的にメモリにキャッシュするためのシステム。<br />　複数のサーバで各サーバのメモリ空間を共有のメモリ空間として扱うことができるため、<br />　データベースに比べ、高速で簡易かつスケーラビリティに飛んだデータ共有を実現できる。</p>
<p>　　サーバＡ|サーバＢ|サーバＣ<br />　------------------------------<br />　　（共有メモリ空間）ハッシュ</p>
<p>■インストール<br />---<br />　(1) libevent<br />　　# yum install libevent libevent-devel<br />　　※RPMでも可 </p>
<p>　(2) memcached<br />　　・下記よりソースをダウンロード<br />　　　<a href="http://memcached.org/">http://memcached.org/</a></p>
<p>　　・コンパイル<br />　　　# tar xvfz memcached-1.4.4.tar.gz -C /tmp<br />　　　# ./configure<br />　　　# make<br />　　　# make install</p>
<p>　　・起動<br />　　　/usr/local/bin/memcached -d -m 256 -l 10.1.136.124 -p 11211<br />　　　　-d: デーモンとして起動<br />　　　　-m: メモリサイズ（MB）<br />　　　　-l: Listenアドレス<br />　　　　-p: Listenポート<br />　　　# su - apache<br />　　　$ /usr/local/bin/memcached -d -m 256 -l 10.1.136.124 -p 11211<br />　　　※rootでは起動できない</p>
<p>　　・接続確認<br />　　　# telnet 10.1.136.124 11211<br />■コマンド<br />---<br />　telnet で接続後</p>
<p>　(1) 基本クライアント・コマンド<br />　　1. set, add, replace</p>
<p>　　　コマンド構文：<br />　　　　command &lt;key&gt; &lt;flags&gt; &lt;expiration time&gt; &lt;bytes&gt;(改行)<br />　　　　&lt;value&gt;</p>
<p>　　　　　key: キャッシュのキー <br />　　　　　flags: キーと値のペアに関連付ける付加情報（整数） <br />　　　　　expiration time: キャッシュに保持する期間 (0 は永続的、単位は秒) <br />　　　　　bytes: キャッシュに保存するバイト数 <br />　　　　　value: キャッシュの値</p>
<p>　　・set<br />　　　新しいキーと値のペアーを追加します。既に同じキーが存在する場合は上書きします。</p>
<p>〜〜〜サンプル〜〜〜<br />set user 0 0 5&nbsp; &lt;&lt; 入力<br />12345&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; 入力<br />STORED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt; 出力<br />〜〜〜サンプル〜〜〜</p>
<p>　　・add<br />　　　新しいキーと値のペアーを追加します。既に同じキーが存在する場合は NOT_STORED が返されます。</p>
<p>〜〜〜サンプル〜〜〜<br />set userId 0 0 5<br />12345<br />STORED<br />〜〜〜サンプル〜〜〜</p>
<p>　　・replace<br />　　　指定したキーが存在する場合にのみ、上書きします。存在しない場合は NOT_STORED が返されます。</p>
<p>〜〜〜サンプル〜〜〜<br />replace userId 0 0 5<br />6789<br />STORED<br />〜〜〜サンプル〜〜〜</p>
<p>　　2. get, delete</p>
<p>　　　コマンド構文：<br />　　　　command &lt;key&gt;</p>
<p>　　　　　key: キャッシュのキー </p>
<p>　　・get<br />　　　指定したキーが存在する場合には値を返します。存在しない場合には何も返しません。</p>
<p>〜〜〜サンプル〜〜〜<br />get userId<br />VALUE userId 0 5<br />12345<br />END<br />get undefined<br />END<br />〜〜〜サンプル〜〜〜</p>
<p>　　・delete<br />　　　指定したキーが存在する場合には削除します。存在しない場合には NOT_FOUND が返されます。</p>
<p>〜〜〜サンプル〜〜〜<br />delete userId<br />DELETED<br />delete undefined<br />NOT_FOUND<br />〜〜〜サンプル〜〜〜</p>
<p>　(2) 拡張クライアント・コマンド<br />　　・gets<br />　　　指定したキーが存在すれば、更新番号を付加して返す。</p>
<p>〜〜〜サンプル〜〜〜<br />gets userId<br />VALUE userId 0 5 5<br />12345<br />〜〜〜サンプル〜〜〜</p>
<p>　　・cas(check and set)<br />　　　setと同様であるが、上記の更新番号を指定して実行するため、更新番号が最新でない場合エラーになる。<br />　　　SELECT FOR UPDATE のようなイメージ。</p>
<p>〜〜〜サンプル〜〜〜<br />set userId 0 0 5<br />12345<br />STORED</p>
<p>gets userId<br />VALUE userId 0 5 3<br />6789<br />END</p>
<p>cas userId 0 0 5 2<br />11111<br />EXISTS<br />〜〜〜サンプル〜〜〜</p>
<p>　(3) キャッシュ管理用コマンド<br />　　・stats<br />　　　キャッシュの使用効率などの統計情報が返されます。</p>
<p>〜〜〜サンプル〜〜〜<br />stats<br />STAT pid 7376<br />STAT uptime 768<br />STAT time 1261131795<br />STAT version 1.4.4<br />STAT pointer_size 32<br />STAT rusage_user 0.000000<br />STAT rusage_system 0.020996<br />STAT curr_connections 5<br />STAT total_connections 6<br />STAT connection_structures 6<br />STAT cmd_get 2<br />STAT cmd_set 1<br />STAT cmd_flush 0<br />STAT get_hits 1<br />STAT get_misses 1<br />STAT delete_misses 1<br />STAT delete_hits 1<br />STAT incr_misses 0<br />STAT incr_hits 0<br />STAT decr_misses 0<br />STAT decr_hits 0<br />STAT cas_misses 0<br />STAT cas_hits 0<br />STAT cas_badval 0<br />STAT auth_cmds 0<br />STAT auth_errors 0<br />STAT bytes_read 92<br />STAT bytes_written 63<br />STAT limit_maxbytes 268435456<br />STAT accepting_conns 1<br />STAT listen_disabled_num 0<br />STAT threads 4<br />STAT conn_yields 0<br />STAT bytes 0<br />STAT curr_items 0<br />STAT total_items 1<br />STAT evictions 0<br />END<br />〜〜〜サンプル〜〜〜</p>
<p>　　　・flush_all<br />　　　　キャッシュを全てクリアする。</p>
<p>〜〜〜サンプル〜〜〜<br />flush_all<br />OK<br />〜〜〜サンプル〜〜〜</p>
<p>　　　・quit<br />　　　　コネクションの終了</p>
<p>■php-memcache<br />---<br />　・インストール<br />　　# /usr/local/bin/pecl search memcache</p>
<p>　・/usr/local/lib/php.ini</p>
<p>〜〜〜サンプル〜〜〜<br />extension=memcache.so<br />〜〜〜サンプル〜〜〜</p>
<p>　・テストスクリプト（起動処理）</p>
<p>〜〜〜サンプル〜〜〜<br />&lt;?php</p>
<p>$memcache = new Memcache;<br />$memcache-&gt;connect('centos5.dreamarts.co.jp', 11211) or die ("Can't connect.");</p>
<p>if ($memcache) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $object = new StdClass;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $object-&gt;objectkey = 'test';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $memcache-&gt;set("object", $object);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "OK!";<br />} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "Undefined memcache object.";<br />}</p>
<p>?&gt;<br />〜〜〜サンプル〜〜〜</p>
<p>　・テストスクリプト（取得処理）</p>
<p>〜〜〜サンプル〜〜〜<br />&lt;?php</p>
<p>$memcache = new Memcache;<br />$memcache-&gt;connect('hoge.com', 11211) or die ("Can't connect.");</p>
<p>if ($memcache) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $object = $memcache-&gt;get("object");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo $object-&gt;objectkey;<br />} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "Undefined memcache object.";<br />}</p>
<p>?&gt;<br />〜〜〜サンプル〜〜〜</p>
<p>■参考<br />---<br />　<a href="http://www.ibm.com/developerworks/jp/java/library/j-memcached1/#resources">http://www.ibm.com/developerworks/jp/java/library/j-memcached1/#resources</a></p>]]>
    </content>
</entry>

<entry>
    <title>【結果報告】LPIC Level 1 Exam 102試験を受けてみた</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2010/02/lpic-level-1-ex-1.html" />
    <id>tag:blog.himawari-dream.com,2010://1.522</id>

    <published>2010-02-14T09:20:24Z</published>
    <updated>2010-02-14T09:21:08Z</updated>

    <summary>最近この手の話題しか出してないけど、、、 本日２つ目の試験を受けてきました。 結...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="日常" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>最近この手の話題しか出してないけど、、、 <br /><br />本日２つ目の試験を受けてきました。 <br /><br />結果は、８００満点中７１０点で無事合格。 <br />ということで、やっとレベル１をパスしたおｗ <br />てことでしばらくインターバルを置いて、次はレベル２をとるぞっとｗ <br /><br />しかしこの手の試験って、どこが間違ったのかわからんから、気持ち悪い。。。 <br /><br />ある程度完璧？と思ってても、思ったよりも点数が低かったりするので、見直そうにもできないこのジレンマ。。。 <br /><br />まぁ、受かったから良いか。 <br /><br />とりあえず、祝杯だｗ</p>]]>
        
    </content>
</entry>

<entry>
    <title>【結果報告】LPIC Level 1 Exam 101試験を受けてみた</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2010/01/lpic-level-1-ex.html" />
    <id>tag:blog.himawari-dream.com,2010://1.521</id>

    <published>2010-01-31T06:43:22Z</published>
    <updated>2010-01-31T08:49:49Z</updated>

    <summary><![CDATA[受けてきました。 結果は残念ながら、、、、、 &nbsp;...]]></summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="日常" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>受けてきました。</p>
<p><br />結果は残念ながら、、、、、</p>
<p>&nbsp;</p>]]>
        <![CDATA[<p>満点合格できませんでしたｗ</p>
<p>いやー密かに狙ってたんですけどねー満点合格。<br />んが、意外と細かいところがむずい。。。ということで、結局正答率は８５％位でした。まだまだだな俺。＾＾；</p>
<p>でもまぁ、合格は合格なので、、、今日はもう何もしねぇーｗ</p>
<p>とりあえず今後の予定は、再来週の日曜日に今度は102試験を受験する予定。それに合格すれば晴れて Level 1 認定となります。<br />まぁ来週も忙しいので、実際には勉強の進み具合を見て申し込む事にはなりそうですが。ひとまず一段落。</p>
<p>&nbsp;</p>
<p>しかし、今日は正直試験受けるまでが、試練だった、、、</p>
<p>会場に移動しようと駅まで言ったのですが、人身事故により電車がストップしてやがった、、、orz<br />そこで急遽車で移動することに。<br />元々慌しいのが嫌なので、時間には余裕を持って行動していたのが幸いし、何とかぎりぎり間に合いそうな感じに。</p>
<p>で、ふとＵターンしようとしたら、反対車線の茂みに警察官が潜んでいるのがちらっと見えたので、ん？と思ってよく見たらＵターン禁止だった。<br />あわてて、Ｕターンせずに別ルートで遠回りして引き返す事に。<br />で件の警察官の前を通るときに確認すると笛もって明らかに交差点見てるし、、、アブねーってところでした。＾＾；</p>
<p>なにはともあれ、今回は色々な方に応援頂きありがとうございました。m(_"_)m</p>
<p>またよろしくお願いします。w</p>]]>
    </content>
</entry>

<entry>
    <title>iPhoneデータ連携（３） CalDAV mod_caldav を入れてみた</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2009/12/iphone-caldav-m.html" />
    <id>tag:blog.himawari-dream.com,2009://1.520</id>

    <published>2009-12-26T07:01:04Z</published>
    <updated>2009-12-26T07:02:35Z</updated>

    <summary>今回試した中で一番苦労した、、、にも関わらず結果的に使えなかったという、、、 だ...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="Apache" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="日常" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>今回試した中で一番苦労した、、、にも関わらず結果的に使えなかったという、、、</p>
<p>だれか続きをやってくれｗ</p>]]>
        <![CDATA[<p>//<br />// mod_caldav<br />//</p>
<p>■概要<br />---<br />　Apacheモジュールとして開発されたCALDAVサーバ。<br />　ApacheへのリクエストをCALDAVプロトコルとして処理し、カレンダー情報をファイルに保存する。<br />　mod_dav_aclが必須であるため、ある程度のACLは可能。（な模様）<br />　ただし、現状iPhoneとの連携は確認できていない。<br />　また、lightningなどでも、PUTによるカレンダー登録は可能であるが、PROPFINDで取得したデータの解析に<br />　失敗し参照関連も上手く動作しなかった、、、、</p>
<p>　メリット：Apacheモジュールであるため、LDAPへの認証が容易ではないかと思われる。<br />　デメリット：Apacheのリコンパイルが必要。最新バージョンでの動作は未確認。<br />　　　　　　　※パッチはWebDAVへのパッチなので、同梱のものがそのまま使えるかも？</p>
<p>■ライセンス<br />---<br />　GPLv2.1</p>
<p>■必須ソフトウェア<br />---<br />　Apache 2.2.8(?)<br />　mod_dav, mod_dav_acl<br />　　※mod_dav_aclをコンパイルする前に、Apacheへのパッチ適用が必要。</p>
<p>■言語<br />---<br />　C</p>
<p>■インストール（あくまでも検証環境）<br />---<br />　(0) 前提<br />　　・CentOS 5 or Red Hat Enterprise Linux 5</p>
<p>　(1) httpd等をアンインストール<br />　　# rpm -e apr apr-devel apr-util apr-util-devel httpd httpd-manual mod_perl mod_ssl mod_python php webalizer subversion gnome-user-share </p>
<p>intltool evolution-data-server evolution-data-server-devel<br />　※インストールされていないものは除外する</p>
<p>　(2) intltool<br />　　# rpm -ivh intltool-0.35.0-2.src.rpm<br />　　　※RHNなどからSRPMを取得しておく<br />　　# cp -p intltool-0.40.3.tar.bz2 /usr/src/redhat/SOURCES<br />　　# cd /usr/src/redhat/SPECS<br />　　# vi intltool.spec<br />　　　※以下を書き換え<br />　　　　&lt; Version: 0.35.0<br />　　　　&lt; Release: 2<br />　　　　--<br />　　　　&gt; Version: 0.40.3<br />　　　　&gt; Release: 1</p>
<p>　　# rpmbuild -ba --target i386 intltool.spec<br />　　# cd /usr/src/redhat/RPMS/i386<br />　　# rpm -ivh intltool-0.40.3-1.i386.rpm<br />　　　※インストール済みの場合は<br />　　　　# rpm -Uvh intltool-0.40.3-1.i386.rpm</p>
<p>　(3) evolution-data-server<br />　　# rpm -ivh evolution-data-server-1.12.3-18.el5.src.rpm<br />　　　※RHNなどからSRPMを取得しておく<br />　　# tar xvfz mod_caldav-0.1.9.tar.gz -C /tmp<br />　　# cd /tmp/mod_caldav-0.1.9<br />　　# cp eds-caldav-ju-1.12.patch /usr/src/redhat/SOURCES<br />　　# cd /usr/src/redhat/SOURCES<br />　　# chown root:root eds-caldav-ju-1.12.patch<br />　　# cd /usr/src/redhat/SPECS<br />　　# vi evolution-data-server.spec<br />　　　※以下を書き換え<br />　　　&gt; Patch39: eds-caldav-ju-1.12.patch<br />　　　==<br />　　　&lt; %patch28 -p1 -b .caldav_2_26<br />　　　--<br />　　　&gt; #%patch28 -p1 -b .caldav_2_26<br />　　　==<br />　　　&lt; Release: 18%{?dist}<br />　　　--<br />　　　&gt; Release: 18_1%{?dist}</p>
<p>　　# rpmbuild -ba --target i386 evolution-data-server.spec<br />　　# cd /usr/src/redhat/RPMS/i386<br />　　# rpm -ivh evolution-data-server-1.12.3-18_1.i386.rpm evolution-data-server-devel-1.12.3-18_1.i386.rpm<br />　　　※インストール済みの場合は<br />　　　　# rpm -Uvh --force evolution-data-server-1.12.3-18_1.i386.rpm evolution-data-server-devel-1.12.3-18_1.i386.rpm</p>
<p>　(4) apr<br />　　# tar xvfz apr-1.3.9.tar.gz -C /tmp<br />　　# cd /tmp/apr-1.3.9<br />　　# ./configure<br />　　# make<br />　　# make install</p>
<p>　(5) aprutil<br />　　# tar xvfz apr-util-1.3.9.tar.gz -C /tmp<br />　　# cd /tmp/apr-util-1.3.9<br />　　# ./configure --with-apr=/usr/local/apr --with-ldap --without-gdbm --with-sqlite3 --with-pgsql --with-berkeley-db --without-sqlite2<br />　　# make<br />　　# make install<br />　　　※コンパイルオプションは適当に</p>
<p>　(6) httpd<br />　　# tar xvfz mod_dav_acl-0.1.4.tar.gz -C /tmp<br />　　# tar xvfz httpd-2.2.8.tar.gz -C /tmp<br />　　# cd /tmp/httpd-2.2.8<br />　　# patch -p1 &lt; ../mod_dav_acl-0.1.4/httpd-2.2.8-ju.patch<br />　　　※mod_dav_aclのソースが、../mod_dav_acl-0.1.4 である場合<br />　　# ./configure --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --enable-mods-shared=all --enable-so --enable-ssl --with-ldap --</p>
<p>enable-authnz-ldap=shared --enable-ldap=shared --enable-proxy --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http --enable-proxy-ajp </p>
<p>--enable-proxy-balancer<br />　　# make<br />　　# make install<br />　　　※コンパイルオプションは適当に</p>
<p>　(7) mod_dav_acl<br />　　# cd /tmp/mod_dav_acl-0.1.4<br />　　# export PKG_CONFIG_PATH=/usr/local/apr/lib/pkgconfig:/usr/lib/pkgconfig<br />　　# export APXS=/usr/local/apache2/bin/apxs<br />　　# ./configure --sysconfdir=/usr/local/apache2 --with-apache-config-subdir=conf/extra --libdir=/usr/local/apache2 --with-apache-module-</p>
<p>subdir=modules --includedir=/usr/local/apache2 --with-apache-include-subdir=include<br />　　# make<br />　　# make install</p>
<p>　(8) libical<br />　　# tar xvfz libical-0.44.tar.gz -C /tmp<br />　　# cd /tmp/libical-0.44<br />　　# ./configure<br />　　# make<br />　　# make install</p>
<p>　(9) mod_caldav<br />　　・インストール<br />　　　# tar xvfz mod_caldav-0.1.9.tar.gz -C /tmp<br />　　　# cd /tmp/mod_caldav-0.1.9<br />　　　# export PKG_CONFIG_PATH=/usr/local/apr/lib/pkgconfig:/usr/local/apache2/pkgconfig:/usr/lib/pkgconfig:/usr/local/lib/pkgconfig<br />　　　# export APXS=/usr/local/apache2/bin/apxs<br />　　　# ./configure --sysconfdir=/usr/local/apache2 --with-apache-config-subdir=conf/extra --libdir=/usr/local/apache2 --with-apache-module-</p>
<p>subdir=modules --includedir=/usr/local/apache2 --with-apache-include-subdir=include<br />　　　# make<br />　　　# make install</p>
<p>　　・ディレクトリ作成<br />　　　# mkdir -p /usr/local/apache2/htdocs/principals/users/hoge<br />　　　# chown -R apache:apache /usr/local/apache2/htdocs/principals<br />　　　# mkdir /usr/local/apache2/tmp<br />　　　# chown apache:apache /uar/local/apache2/tmp</p>
<p>　　・動作確認<br />　　　# cd /tmp/mod_dav_acl-0.1.4<br />　　　# ./acl_tests</p>
<p>〜〜〜サンプル〜〜〜<br />************************************<br />* Summary:&nbsp; 0/34 tests passed<br />************************************<br />〜〜〜サンプル〜〜〜</p>
<p>　　　# cd /tmp/mod_caldav-0.1.9<br />　　　# ./caldav_tests</p>
<p>〜〜〜サンプル〜〜〜<br />************************************<br />* Summary:&nbsp; 0/28 tests passed<br />************************************<br />〜〜〜サンプル〜〜〜</p>
<p>　(10) Apache設定<br />　　・証明書作成<br />　　　# cd /usr/local/apache2/conf/<br />　　　# mkdir cert<br />　　　# cd cert<br />　　　# openssl genrsa -des3 -out server.key 1024<br />　　　# openssl req -new -x509 -key server.key -out server.crt<br />　　　　※表示される入力項目は適当に<br />　　　# mv server.key server.key_org<br />　　　# openssl rsa -in server.key_org server.key</p>
<p>　　・/usr/local/apache/conf/httpd.conf<br />　　　ServerAdmin <a href="mailto:hoge@hoge.com">hoge@hoge.com</a><br />　　　ServerName <a href="http://www.hoge.com:80">www.hoge.com:80</a><br />　　　---<br />　　　Include conf/extra/httpd-ssl.conf<br />　　　　→コメントアウトを外す<br />　　　---<br />　　　User apache<br />　　　Group apache</p>
<p>　　・/etc/httpd/conf/extra/httpd-ssl.conf<br />　　　Listen 443<br />　　　---<br />　　　&lt;VirtualHost _default_:443&gt;<br />　　　---<br />　　　ServerName <a href="http://www.hoge.com:443">www.hoge.com:443</a><br />　　　ServerAdmin <a href="mailto:hoge@hoge.com">hoge@hoge.com</a><br />　　　---<br />　　　SSLCertificateFile "/usr/local/apache2/conf/cert/server.crt"<br />　　　SSLCertificateKeyFile "/usr/local/apache2/conf/cert/server.key"</p>
<p>　　・/usr/local/apache2/conf/httpd.conf<br />　　　Include conf/extra/dav_acl.conf<br />　　　Include conf/extra/caldav.conf</p>
<p>　　・/usr/local/apache2/conf/extra/dav_acl.conf（正しいのか自信がない、、、）</p>
<p>〜〜〜サンプル〜〜〜<br />LoadModule dav_acl_module modules/mod_dav_acl.so</p>
<p>&lt;IfModule mod_dav_acl.c&gt;</p>
<p># GLOBALS but can of course be local as well<br /># But _update_ these settings these are just examples<br /># and acltests is only for running tests</p>
<p>AclOwnerFullRights on<br />AclLockFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/apache2/tmp/davacl.lock<br />AclSharedMemFile&nbsp;&nbsp; /usr/local/apache2/tmp/davacl.shm<br />AclSharedMemSize&nbsp;&nbsp; 65000<br />AclPrincipals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.hoge.com/principals">http://www.hoge.com/principals</a><br />AclPrincipalDir&nbsp;&nbsp;&nbsp; /usr/local/apache2/htdocs/principals</p>
<p>&lt;/ifModule&gt;<br />〜〜〜サンプル〜〜〜</p>
<p>　　・/usr/local/apache2/conf/extra/caldav.conf（正しいのか自信がない、、、）</p>
<p>〜〜〜サンプル〜〜〜<br />LoadModule caldav_module modules/mod_caldav.so</p>
<p>Alias /principals/ "/usr/local/apache2/htdocs/principals"</p>
<p>DAVLockDB /usr/local/apache2/tmp/DavLock</p>
<p>&lt;Directory /&gt;<br />&nbsp;&nbsp; Dav on<br />&lt;/Directory&gt;</p>
<p>&lt;Location /caldav&gt;<br />&nbsp;&nbsp; Dav on<br />&nbsp;&nbsp; Options None</p>
<p>&nbsp;&nbsp; MaxAttendeesPerInstance&nbsp;&nbsp; 10000<br />&nbsp;&nbsp; CalQueryETagResponse on</p>
<p>&nbsp;&nbsp; AuthType Digest<br />&nbsp;&nbsp; AuthName "CalDAV"<br />&nbsp;&nbsp; AuthUserFile /usr/local/apache2/conf/passwords<br />&nbsp;&nbsp; Require valid-user<br />&nbsp;&nbsp; AuthDigestProvider file</p>
<p>&nbsp;&nbsp; FileETag MTime</p>
<p>&nbsp;&nbsp; DAVETagResponse on<br />&nbsp;&nbsp; DAVACL on</p>
<p>&lt;/Location&gt;<br />〜〜〜サンプル〜〜〜</p>
<p>　　・パスワードファイルの作成<br />　　　# /usr/local/apache2/bin/htdigest -c /usr/local/apache2/conf/passwords CalDAV hoge</p>
<p>　　・自動起動<br />　　　# /sbin/chkconfig --add httpd<br />　　　# /sbin/chkconfig --level 345 httpd on<br />　　　# /etc/rc.d/init.d/httpd start</p>
<p>　　・httpd 動作確認<br />　　　・<a href="http://www.hoge.com">http://www.hoge.com</a><br />　　　・<a href="https://www.hoge.com">https://www.hoge.com</a></p>
<p>　(11) iPhone<br />　　1. 設定&gt;&gt;メール／連絡先／カレンダー&gt;&gt;アカウントを追加&gt;&gt;その他&gt;&gt;CalDAVアカウントを追加<br />　　2. 以下の設定を変更<br />　　　・サーバ<br />　　　　caldavサーバ<br />　　　・ユーザ名<br />　　　　INSUITEユーザ名<br />　　　・パスワード<br />　　　　INSUITEパスワード<br />　　　・詳細設定<br />　　　　・ポート<br />　　　　　443<br />　　　　※後で表示される<br />　　　※アクセス先は https://[サーバ]:443/principals/users/[ユーザ名]/<br />　　　※「SSLで接続できません」というメッセージが表示されば場合は、続けるを選択し、詳細設定を行う</p>
<p>■注意事項<br />---<br />　Apache 2.2.8 以外では以下のエラー（最新でもパッチを適用すれば大丈夫かもしれないが、未確認）</p>
<p>〜〜〜エラー〜〜〜<br />mod_dav_acl.c:2903: error: 'options' undeclared (first use in this function)<br />mod_dav_acl.c:2905: error: 'res_hooks' undeclared (first use in this function)<br />make[1]: *** [mod_dav_acl_la-mod_dav_acl.lo] エラー 1<br />make[1]: ディレクトリ `/home/xxxx/mod_dav_acl-0.1.4' から出ます<br />make: *** [all] エラー 2<br />〜〜〜エラー〜〜〜</p>
<p>■参考<br />---<br />　<a href="http://archive.apache.org/dist/httpd/">http://archive.apache.org/dist/httpd/</a><br />　<a href="http://freshmeat.net/projects/intltool">http://freshmeat.net/projects/intltool</a><br />　<a href="http://www.go-evolution.org/Main_Page">http://www.go-evolution.org/Main_Page</a><br />　<a href="http://freshmeat.net/projects/intltool">http://freshmeat.net/projects/intltool</a><br />　<a href="http://www.go-evolution.org/Main_Page">http://www.go-evolution.org/Main_Page</a></p>]]>
    </content>
</entry>

<entry>
    <title>忘年会第３弾</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2009/12/post-407.html" />
    <id>tag:blog.himawari-dream.com,2009://1.519</id>

    <published>2009-12-23T02:39:27Z</published>
    <updated>2009-12-23T02:45:09Z</updated>

    <summary>昨日は今年３度目の忘年会でした。しかもメンバーほとんど一緒ｗ どんだけ年を忘れた...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="日常" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>昨日は今年３度目の忘年会でした。しかもメンバーほとんど一緒ｗ</p>
<p>どんだけ年を忘れたいんだとｗ</p>
<p>しかもしかも、予定していたわけではなく当日の１９時位に急遽決まったので、この時期に店の予約もなく探すと言う無謀さｗ</p>
<p>まぁ首謀者の頑張りにより見つかったんですけどねｗ</p>
<p>今年はあと１回かな？メンバーは違いますけど、こちらも気の合う仲間たちなので楽しみです。</p>
<p>あー、そーいえば今年は会社関係の忘年会が一度もなさそう。全部プライベート。</p>
<p>まぁ景気が悪いからｗなんですが、なんだか珍しい年です。</p>]]>
        
    </content>
</entry>

<entry>
    <title>高橋建復帰</title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2009/12/post-406.html" />
    <id>tag:blog.himawari-dream.com,2009://1.518</id>

    <published>2009-12-23T02:23:54Z</published>
    <updated>2009-12-23T02:37:22Z</updated>

    <summary><![CDATA[建さんの復帰が決まったみたいですね。 &nbsp; 【復帰高橋、決意新た　入団会...]]></summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="カープ" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>建さんの復帰が決まったみたいですね。</p>
<p>&nbsp;</p>
<p>【復帰高橋、決意新た　入団会見で「本当にうれしい」 】<br /><a href="http://www.chugoku-np.co.jp/Carp/Cw200912230091.htm">http://www.chugoku-np.co.jp/Carp/Cw200912230091.htm</a></p>
<p>&nbsp;</p>
<p>予定外にルイスが抜け（まぁ想定内でしたが）、投手陣補強が急務であっただけに、心強い限りです。</p>
<p>先発争いが更に激化しそう。個人的には、大竹、前田健は当確として、さいとーくん、今井、篠田、小松、武内・今村辺りでローテーションを回して、建さん、青木高あたりは後ろに回って中継ぎを厚くしてもらいたいかな。篠田が後ろでも割りと安定しそう。</p>
<p>シュルツを先発にという話がでているみたいですが、個人的には配置換えは失敗のリスクも高いので、できればこのまま行ってほしいですね。</p>
<p>まぁどちらにしろ問題は野手陣なんでしょうけど、、、、野手陣奮起しろ！！</p>]]>
        
    </content>
</entry>

<entry>
    <title>iPhoneデータ連携（２） CalDAV bedework を入れてみた </title>
    <link rel="alternate" type="text/html" href="http://blog.himawari-dream.com/archives/2009/12/iphone-caldav-b.html" />
    <id>tag:blog.himawari-dream.com,2009://1.517</id>

    <published>2009-12-21T08:08:33Z</published>
    <updated>2009-12-21T08:39:52Z</updated>

    <summary>前回に引き続き bedework も入れてみた。 ちなみに CalDAV につい...</summary>
    <author>
        <name>kado</name>
        <uri>http://blog.himawari-dream.com/</uri>
    </author>
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="その他" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="呪文" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="日常" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.himawari-dream.com/">
        <![CDATA[<p>前回に引き続き bedework も入れてみた。</p>
<p>ちなみに CalDAV について簡単に説明すると。</p>
<p>CalDAV（calendaring extensions to WebDAV の略）とは、ネットワークを介して<br />カレンダー情報を共有するためのプロトコルであり、IETFのRFC4791として規定<br />されている標準規格。<br />カレンダー情報をクライアントとサーバで共有するために使用され、通信はHTTPを<br />拡張したWebDAVプロトコルが使用される。<br />カレンダーデータは、iCalendarと呼ぶインターネット標準のフォーマット(RFC 2445)<br />で書かれている。</p>
<p>こんな感じですｗ。</p>]]>
        <![CDATA[<p>//<br />// bedework<br />//</p>
<p>■概要<br />---<br />　Thunderbird/lightningでの動作確認はＯＫであったが、iPhoneによる動作検証はＮＧ（何もできない）。<br />　メーリングリストにも同様の質問があるが、回答はなし。<br />　現時点で対応していない可能性が高い。</p>
<p>■ライセンス<br />---<br />　BSD</p>
<p>■必須ソフトウェア<br />---<br />　Java 1.5.0<br />　Tomcat※<br />　hypersonic SQL(or MySQL or Oracle)※<br />　Apache Ant※<br />　※今回は同根パッケージを使用</p>
<p>■言語<br />---<br />　Java</p>
<p>■インストール（あくまでも検証環境）<br />---<br />　(0) 前提<br />　　・CentOS 5 だけどあんまり関係ないかな</p>
<p>　(1) JAVA<br />　　# yum install java-1.6.0-openjdk java-1.6.0-openjdk-devel giflib jpackage-utils<br />　　　※RPMでも可</p>
<p>　(2) quickstartパッケージを公式サイトからダウンロード<br />　　<a href="http://www.bedework.org/bedework/">http://www.bedework.org/bedework/</a><br />　　　Bedework<br />　　　Tomcat<br />　　　Hypeprsonic SQL<br />　　　Apache Ant</p>
<p>　(3) 展開と起動<br />　　# unzip quickstart-3.5.zip<br />　　# cd quickstart-3.5<br />　　# export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre<br />　　# ./bw -quickstart start</p>
<p>　(4) 動作確認<br />　　プロンプトが停止した状況で下記にアクセス<br />　　<a href="http://bedework-IP:8080/bedework">http://bedework-IP:8080/bedework</a></p>
<p>　(5) iPhone<br />　　1. 設定&gt;&gt;メール／連絡先／カレンダー&gt;&gt;アカウントを追加&gt;&gt;その他&gt;&gt;CalDAVアカウントを追加<br />　　2. 以下の設定を変更<br />　　　・サーバ<br />　　　　bedeworkサーバ<br />　　　・ユーザ名<br />　　　　bedeworkユーザ<br />　　　・パスワード<br />　　　　bedeworkパスワード<br />　　　・詳細設定<br />　　　　・ポート<br />　　　　　8080<br />　　　　・アカウントＵＲＬ<br />　　　　　https://[サーバ]:8080/ucaldav/user/vbede/calendar<br />　　　　※後で表示される<br />　　　※「SSLで接続できません」というメッセージが表示されば場合は、続けるを選択し、詳細設定を行う</p>
<p>■参考<br />---<br />　<a href="http://itpro.nikkeibp.co.jp/article/Keyword/20071225/290169/">http://itpro.nikkeibp.co.jp/article/Keyword/20071225/290169/</a><br />　<a href="http://www.bedework.org/bedework/">http://www.bedework.org/bedework/</a></p>]]>
    </content>
</entry>

</feed>

