<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
  <title>今日も適当ダイアリー</title>
  
  <subtitle>PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。</subtitle>
  
  <link href="https://blog.madapaja.net/"/>
  <updated>2015-04-30T20:00:02+09:00</updated>
  <author>
    <name>ja9</name>
  </author>
  <generator uri="https://blog.hatena.ne.jp/" version="dd1dc12ea5c05e203be39af96d7695">Hatena::Blog</generator>
  <id>hatenablog://blog/12704346814673915484</id>

  
    
    
    <entry>
        <title>第89回PHP勉強会＠東京でBEAR.Sundayのお話をしてきました #phpstudy</title>
        <link href="https://blog.madapaja.net/entry/2015/04/30/200000"/>
        <id>hatenablog://entry/8454420450093094212</id>
        <published>2015-04-30T20:00:00+09:00</published>
        <updated>2015-04-30T20:00:02+09:00</updated>        <summary type="html">blogger からはてなブログに移行したんだけど、面倒だから適当に移行して以前の記事が 404 Not Found になってたりしてごめんなさいな @madapaja です。 もう4月も終わりますね。 やること、やりたい事が多くて時間が足りてません。 さて、先日 4月28日にリジョブ咲くらぼで第89回 PHP勉強会＠東京が開催されました。</summary>
        <content type="html">&lt;p&gt;blogger からはてなブログに移行したんだけど、面倒だから適当に移行して以前の記事が 404 Not Found になってたりしてごめんなさいな &lt;a href=&quot;http://twitter.com/madapaja&quot;&gt;@madapaja&lt;/a&gt; です。&lt;/p&gt;

&lt;p&gt;もう4月も終わりますね。
やること、やりたい事が多くて時間が足りてません。&lt;/p&gt;

&lt;p&gt;さて、先日 4月28日に&lt;a href=&quot;http://tech.rejob.co.jp/p/blog-page.html&quot;&gt;リジョブ咲くらぼ&lt;/a&gt;で&lt;a href=&quot;https://phpstudy.doorkeeper.jp/events/23826&quot;&gt;第89回 PHP勉強会＠東京&lt;/a&gt;が開催されました。&lt;/p&gt;

&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20150430/20150430123417.png&quot; alt=&quot;f:id:ja9:20150430123417p:plain&quot; title=&quot;f:id:ja9:20150430123417p:plain&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;勉強会の内容は、PHP勉強会＠東京で恒例となっている参加者全員での自己紹介から始まり、セッション、懇親会＋LTと約2時間半程度でした。&lt;/p&gt;

&lt;p&gt;参加者は使い始めたばかりの方からPHP歴10年以上のベテランまで、バックグランドも経験も様々な人が集まっていろんな話をしました。久しぶりに参加したのですが楽しかったです。&lt;/p&gt;

&lt;p&gt;会の詳細は、&lt;a href=&quot;http://togetter.com/li/814531&quot;&gt;togetter でのまとめ&lt;/a&gt;とか、&lt;a href=&quot;https://twitter.com/search?q=%23phpstudy%20since%3A2015-04-27%20until%3A2015-05-15&amp;amp;src=typd:#phpstudy&quot;&gt;Twitter&lt;/a&gt;あたりで素敵なまとめブログとかが出てくるんじゃないかと思いますので、そちらを要チェックです。&lt;/p&gt;

&lt;p&gt;で、私は &lt;a href=&quot;https://speakerdeck.com/madapaja/bear-dot-sunday-falsehanasi-di-89hui-phpmian-qiang-hui-at-dong-jing&quot;&gt;BEAR.Sundayのはなし&lt;/a&gt; というタイトルで発表してきたので、そちらの内容のまとめを書きたいと思います。&lt;/p&gt;

&lt;h1&gt;BEAR.Sundayのはなし&lt;/h1&gt;

&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;d7a80be2507348929414d15b362c2f62&quot; data-ratio=&quot;1.33333333333333&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;


&lt;h2&gt;BEAR.Sunday = DI + AOP + REST(Hypermedia)&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://bearsunday.github.io/&quot;&gt;BEAR.Sunday&lt;/a&gt; は DI、AOP と REST(Hypermedia) という3つの仕組みが柱となっているリソース指向フレームワークです。&lt;/p&gt;

&lt;p&gt;DI、AOP、REST(Hypermedia) はそれぞれ &lt;a href=&quot;https://github.com/ray-di/Ray.Di&quot;&gt;Ray.Di&lt;/a&gt;、&lt;a href=&quot;https://github.com/ray-di/Ray.Aop&quot;&gt;Ray.Aop&lt;/a&gt;、&lt;a href=&quot;https://github.com/bearsunday/BEAR.Resource&quot;&gt;BEAR.Resource&lt;/a&gt; というフレームワーク（ライブラリ）が用いられており、すべて BEAR.Sunday の開発者でもある郡山さん（&lt;a href=&quot;https://twitter.com/koriym&quot;&gt;@koriym&lt;/a&gt;）を中心に開発されているものです。&lt;/p&gt;

&lt;h2&gt;DI と Ray.Di&lt;/h2&gt;

&lt;p&gt;Ray.Di は、Module という単位でルールを記述（どういう構造なのかを示す）すると、そのルールを基にオブジェクトが生成出来る DI フレームワークです。
ルールを一度記述すれば、同じルールで表現できるDIであれば、別のクラスなどで利用する際にも、新しい設定なしに必要な依存オブジェクトが注入されるため、よりクラス同士の密結合を減らせます。&lt;/p&gt;

&lt;p&gt;Ray.Diについては、以前にブログを書いていますので（ちょっと古い内容ですが、根本は変わっていないので）参考になるかもしれません。&lt;/p&gt;

&lt;p&gt;&lt;iframe src=&quot;http://blog.madapaja.net/embed/2012/07/11/000700&quot; title=&quot;PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻 其の壱 - 今日も適当ダイアリー&quot; class=&quot;embed-card embed-blogcard&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;&quot;&gt;&lt;a href=&quot;http://blog.madapaja.net/entry/2012/07/11/000700&quot;&gt;PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻 其の壱 - 今日も適当ダイアリー&lt;/a&gt;&lt;/iframe&gt;&lt;cite class=&quot;hatena-citation&quot;&gt;&lt;a href=&quot;http://blog.madapaja.net/entry/2012/07/11/000700&quot;&gt;blog.madapaja.net&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;なお、Ray.Diは最近リリースされたバージョン2.1から、インスタンス生成コードの自動生成への対応が行われ、よりパフォーマンスの向上が期待できます。&lt;/p&gt;

&lt;h2&gt;AOP と Ray.Aop&lt;/h2&gt;

&lt;p&gt;Ray.Aop は横断的関心事を分離するためのアスペクト指向フレームワークです。
インターセプターという仕組みを利用して、横断的関心事を本質的関心事と切り離し、それを結びつけることができます。&lt;/p&gt;

&lt;p&gt;Ray.Aop についても過去の記事がありますのでもっと知りたい方は見てみてください。&lt;/p&gt;

&lt;p&gt;&lt;iframe src=&quot;http://blog.madapaja.net/embed/2012/07/20/120700&quot; title=&quot;BEAR.Sunday meetup #0 でRayについて話してきました #BEARSunday - 今日も適当ダイアリー&quot; class=&quot;embed-card embed-blogcard&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; style=&quot;display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;&quot;&gt;&lt;a href=&quot;http://blog.madapaja.net/entry/2012/07/20/120700&quot;&gt;BEAR.Sunday meetup #0 でRayについて話してきました #BEARSunday - 今日も適当ダイアリー&lt;/a&gt;&lt;/iframe&gt;&lt;cite class=&quot;hatena-citation&quot;&gt;&lt;a href=&quot;http://blog.madapaja.net/entry/2012/07/20/120700&quot;&gt;blog.madapaja.net&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Ray.Aopもバージョン2.1からコード生成部分の効率化が図られ、より使いやすく進化ました。&lt;/p&gt;

&lt;h2&gt;REST(Hypermedia) と ROP（リソース指向プログラミング）、BEAR.Resource&lt;/h2&gt;

&lt;p&gt;PHPの多くのフレームワークとの大きな違いは、MVCではなく、リソース指向を選択している点でしょう。&lt;/p&gt;

&lt;p&gt;皆さんも Web を日々利用していると思いますが、その凄さは何なのでしょうか？
その凄さの一つに、REST、Hypermediaによってもたらされる拡張性、柔軟性、ポータビリティの高さ等があると思います。&lt;/p&gt;

&lt;p&gt;BEAR.Resource では、1つのURLを1つのクラス（リソースオブジェクト）と対応させ、それらのリソースをRESTと同じように扱おうとするフレームワークです。&lt;/p&gt;

&lt;p&gt;リソースは URI とクエリなどによってリクエストを行い、&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;タグや&lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;タグのようにリソース同士をリンクしたり、&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;タグや&lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt;タグのようにリソース内に別のリソースを埋め込む事ができます。&lt;/p&gt;

&lt;p&gt;また、MVCのようにコントローラがモデルからデータを受け取りView渡すのではなく、リソースに対するリクエストに対して、リソース自身がレンダラーを持っており、それによって表現、アウトプットする、というのも特徴的だと思います。&lt;/p&gt;

&lt;h2&gt;まとめ&lt;/h2&gt;

&lt;p&gt;BEAR.Sunday は DIで構造を結びつけ、AOPで横断的関心事を結びつけ、ROP（REST, Hypermedia）でリソース同士を結びつけるConnecting Framework と言うことも出来ます。&lt;/p&gt;

&lt;p&gt;また、RESTの力を引き出し、それをアプリケーションにも適用することで、広がる世界は面白いと思いませんか？&lt;/p&gt;

&lt;p&gt;だって、Webの凄さはみんな知っているでしょ？&lt;/p&gt;

&lt;p&gt;興味を持たれた方は、ぜひ一緒に &lt;a href=&quot;http://bearsunday.github.io/&quot;&gt;BEAR.Sunday&lt;/a&gt; 触りましょう！&lt;/p&gt;

&lt;h2&gt;質問&lt;/h2&gt;

&lt;p&gt;勉強会で質問されたことをこちらでもまとめておきます。&lt;/p&gt;

&lt;h4&gt;BEAR.Sunday の由来は何ですか？&lt;/h4&gt;

&lt;p&gt;（会場では言えませんでしたが）&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Because Everything is A Resource&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Sunday なのはクマの名前から、というのは、&lt;a href=&quot;http://qiita.com/koriym/items/fc07cd0a2aebbd83711a&quot;&gt;アドベントカレンダー&lt;/a&gt;で郡山さんが書いていたのでチェックしてみてください！&lt;/p&gt;

&lt;h4&gt;どの程度の規模のアプリに適していますか？&lt;/h4&gt;

&lt;p&gt;スケールについては Web と同じです。つまり、最小から極大までに対応できます。&lt;/p&gt;

&lt;p&gt;速度面については、HelloWorldベンチが以下にあるので実際に図ってみてください。（誰かベンチしたらぜひシェアしてください！）&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bearsunday/BEAR.HelloWorld&quot;&gt;bearsunday/BEAR.HelloWorld &amp;middot; GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;参考URL&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bearsunday.github.io/&quot;&gt;BEAR.Sunday&lt;/a&gt;（公式マニュアル）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ray-di/Ray.Di&quot;&gt;ray-di/Ray.Di &amp;middot; GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ray-di/Ray.Aop&quot;&gt;ray-di/Ray.Aop &amp;middot; GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bearsunday/BEAR.Resource&quot;&gt;bearsunday/BEAR.Resource &amp;middot; GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>        
        <category term="php" label="php" />
        
        <category term="勉強会" label="勉強会" />
        
        <category term="BEAR.Sunday" label="BEAR.Sunday" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/457d2f06a64bb36f42e8183354484cea99824e57/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20150430%2F20150430123417.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>BEAR.Sunday meetup #0 でRayについて話してきました #BEARSunday</title>
        <link href="https://blog.madapaja.net/entry/2012/07/20/120700"/>
        <id>hatenablog://entry/8454420450093083873</id>
        <published>2012-07-20T12:07:00+09:00</published>
        <updated>2012-07-20T12:07:00+09:00</updated>        <summary type="html">こんばんわ。BEARでBEERな @madapaja です。 7/19に行われた BEAR.Sunday meetup #0 に参加して BEAR のオブジェクトフレームワークである Ray について発表させていただきました。 最初に、会場を提供していただいたVoyage Groupさん、ありがとうございました。そして、スピーカーの皆さん、参加者の皆さん、スタッフの皆さん、本当にお疲れ様でした！ また、@koriym さんには発表前から後までフォローいただき非常にお世話になりました。ありがとうございました。 ということで、まだ開発途上のPHPフレームワーク「BEAR.Sunday」の勉強会とい…</summary>
        <content type="html">&lt;p&gt;こんばんわ。BEARでBEERな &lt;a href=&quot;https://twitter.com/madapaja&quot;&gt;@madapaja&lt;/a&gt; です。&lt;/p&gt;
&lt;p&gt;7/19に行われた &lt;a href=&quot;http://www.zusaar.com/event/331061&quot;&gt;BEAR.Sunday meetup #0&lt;/a&gt; に参加して BEAR のオブジェクトフレームワークである Ray について発表させていただきました。&lt;/p&gt;
&lt;p&gt;最初に、会場を提供していただいたVoyage Groupさん、ありがとうございました。そして、スピーカーの皆さん、参加者の皆さん、スタッフの皆さん、本当にお疲れ様でした！ また、&lt;a href=&quot;https://twitter.com/koriym&quot;&gt;@koriym&lt;/a&gt; さんには発表前から後までフォローいただき非常にお世話になりました。ありがとうございました。&lt;/p&gt;
&lt;p&gt;ということで、まだ開発途上のPHPフレームワーク「BEAR.Sunday」の勉強会ということでしたが、野心的でパワフルな方々が参加され、非常に面白い勉強会でした。&lt;br /&gt;アットホームな雰囲気で、濃い話が聞けたのはとても良かったです。&lt;/p&gt;
&lt;p&gt;私自身、BEAR.Sundayについて直接聞くのは、昨年末の前々回のSymfony勉強会、先月のSymfony勉強会に続いて3度目でしたが、やっとのことで、BEARの考え方がある程度理解できました。やっとスタートラインに立てたかな、などと思っています。&lt;br /&gt;といっても、じゃあ他の人に説明してみて、と言われたらまだ出来ないので、これからも継続的にウォッチしたいとは思います。&lt;/p&gt;
&lt;h4&gt;Ray.Di / Ray.Aop コトハジメ&lt;/h4&gt;
&lt;p&gt;「Ray.Di / Ray.Aop コトハジメ」というタイトルで発表した内容は、スライドを見ればなんとなく分かるかと思いますが、スライドには書ききれなかったことを補足したいと思います。&lt;/p&gt;


&lt;p&gt; &lt;/p&gt;
&lt;p&gt;当日使った資料とあわせてご覧ください。&lt;/p&gt;
&lt;p&gt;
&lt;script class=&quot;speakerdeck-embed&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot; async=&quot;async&quot; data-id=&quot;5006c85036af010002035dc8&quot; data-ratio=&quot;1.3333333333333333&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h4&gt;BEAR.Sunday&lt;/h4&gt;
&lt;p&gt;以前、郡山さんからこんなDMをもらいました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「ポイントは問題の解決に実装ではなく設計で挑もうとしてる点です。&lt;br /&gt; これが開発リソースの細い細い僕が挑める唯一の方法です。」(@koriym)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この言葉にもある通り、BEAR.Sundayには多くの挑戦があり、多くの設計に関するキーワードがあります。&lt;/p&gt;
&lt;p&gt;BEAR.Sundayを取り巻くコンセプトやアーキテクチャ、技術などは様々あります。（ここには書き切れませんし、説明し始めたら1日でも終わらないと…） その中で、BEAR.Sundayのコアフレームワークの一つである Ray の紹介を行いました。&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a style=&quot;margin-left: 1em; margin-right: 1em;&quot; href=&quot;http://1.bp.blogspot.com/-zYwE4UmGwcg/UAjZQxvfThI/AAAAAAAAGkg/dpM_aE8Evyk/s1600/slide-2-728.jpg&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/-zYwE4UmGwcg/UAjZQxvfThI/AAAAAAAAGkg/dpM_aE8Evyk/s400/slide-2-728.jpg&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;(&lt;a href=&quot;http://www.slideshare.net/akihito.koriyama/bearsunday-tmp-slide&quot;&gt;BEAR.Sunday Note&lt;/a&gt; より)&lt;/div&gt;
&lt;h4&gt;Ray (rayphp)&lt;/h4&gt;
&lt;p&gt;Rayは、DI（依存性の注入）をサポートするRay.Diと、AOP（アスペクト指向プログラミング）をサポートするRay.Aopの2つのフレームワークから構成されています。&lt;/p&gt;
&lt;p&gt;Rayの役割は、オブジェクトの面倒をみることです。 つまり、DIでオブジェクトの生成を行い、AOPによって振る舞いを変更することでオブジェクトを利用します。&lt;br /&gt;このDIとAOPという2つのフレームワークによって、オブジェクトを「生成」して「利用」し「消滅」されるまでをサポートしているため、オブジェクトフレームワークと呼ばれます。&lt;/p&gt;
&lt;h4&gt;Ray.Di&lt;/h4&gt;
&lt;p&gt;発表では少しだけDIの使い方を紹介しました。 これは、DIの使い方を紹介したかった、というよりは、使い方からRay.Diの持っている価値観を見た方が理解しやすいのではないか、と思ったからです。&lt;/p&gt;
&lt;h5&gt;Symfony DI and Ray.Di Pattern A&lt;/h5&gt;
&lt;p&gt;最初に比較のために、SymfonyのDIコンポーネントと、それと似た形でのRay.Di（Ray.Di Pattern Aスライド）でのDIの使用方法を紹介しました。&lt;/p&gt;
&lt;p&gt;この方法では、対象に全く触らずに依存関係を構築でき、依存関係はインジェクター側で全て持っている点も特徴です。&lt;/p&gt;
&lt;p&gt;また、Ray.Diの場合、親クラスを指定した場合でも、その設定が継承され注入されます。（例ではMailerクラス自体ではなく、そのベースクラスであるMailerBaseクラスへDIしています）&lt;/p&gt;
&lt;p&gt;ですが、BEARにおいては、この方法でのDIは特別な場合を除いて推奨されません。 BEAR.Sundayの標準の方法はアノテーションを使った方法です。&lt;/p&gt;
&lt;h5&gt;Ray.Di Pattern B (BEAR.Sunday standard, DI with annotation)&lt;/h5&gt;
&lt;p&gt;アノテーションを使ったDIでは文字通り、注記（＝アノテーション）になりコードの読みやすさが向上されます。&lt;br /&gt;SymfonyのDIコンポーネントや、Pattern Aで紹介した方法と比べて、NewsletterManager に対するDIの設定が行われていないのが分かるでしょうか。&lt;/p&gt;
&lt;p&gt;これにより、「&lt;strong&gt;&lt;em&gt;同じ依存が欲しいときにはモジュールに設定を追加する必要がなく、注入が欲しい箇所にアノテーション（@Inject）を加えるだけで済む&lt;/em&gt;&lt;/strong&gt;」という特徴があります。&lt;/p&gt;
&lt;p&gt;言い方を変えれば、この方法では“&lt;strong&gt;&lt;em&gt;どの依存を用意するか&lt;/em&gt;&lt;/strong&gt;”に注目し、&lt;strong&gt;&lt;em&gt;依存中心に考えている&lt;/em&gt;&lt;/strong&gt;ことになります。 （もちろん、どちらが良いという話ではなく、BEAR.Sundayではそのような価値観を持って作られている、ということです）&lt;/p&gt;
&lt;h5&gt;モジュール&lt;/h5&gt;
&lt;p&gt;モジュールでは、複数のモジュールを合成することで、DIやAopの知識を構成します。&lt;br /&gt;Ray.Diでは、そのモジュールの持つ知識を持ってオブジェクトグラフを構築することになります。&lt;/p&gt;
&lt;p&gt;オブジェクトグラフとは、下記のようなイメージです。&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a style=&quot;margin-left: 1em; margin-right: 1em;&quot; href=&quot;http://3.bp.blogspot.com/-dOXkytu4Unk/UAjZUzYxYEI/AAAAAAAAGks/hFT_1P0WH7c/s1600/bear-sunday-tmp-111219033305-phpapp02-1.035.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/-dOXkytu4Unk/UAjZUzYxYEI/AAAAAAAAGks/hFT_1P0WH7c/s400/bear-sunday-tmp-111219033305-phpapp02-1.035.png&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;(&lt;a href=&quot;http://www.bear-project.net/blog/2012/04/di/&quot;&gt;Object Framework - Ray.Di | BEAR blog&lt;/a&gt; より)&lt;/div&gt;
&lt;p&gt;この図では、Controllerが各ModelやEvent、Session、ACL、Viewなどの注入を必要としています。&lt;br /&gt;また、SessionnではStrageの注入が、ViewではFromやTemplateの注入を必要としています。&lt;/p&gt;
&lt;p&gt;このように、依存関係をDIによって再帰的に解決していき、必要なオブジェクトのすべてがDIによって注入されることになります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（追記）記事公開時の説明に間違いがありましたので修正を行いました。間違っていた個所は以下の記述です。&lt;/p&gt;
&lt;p&gt;&lt;del&gt;また、LogやConfigは複数のオブジェクトによって必要とされています。 これは、特定のオブジェクトに依存するものではなく、複数のオブジェクトに渡って必要な、つまり横断的関心事（アスペクト）です。 この横断的関心事はAOPフレームワークであるRay.Aopを使って解決することになります。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;複数のオブジェクトに同じオブジェクトが必要な場合の注入（早期束縛）は、DIで行われます。&lt;/p&gt;
&lt;p&gt;AOPを利用するのは、横断的関心事（アスペクト）を解決したい場合です。 たとえば、ロギングしたい、とか、アクセス･コントロールしたい、とかを実現するために、Ray.Aopを使って振る舞いを変更します。&lt;/p&gt;
&lt;p&gt;また、動的に利用するオブジェクトを変更したい場合（遅延束縛）、例えば、Select時はslave DBを使い、Insert時はmaster DBと使うようにする、とか、指定されたIDによってSelect/InsertするDBを変更したい、のような（動的に）依存を解決したい場合は、Ray.Aopによるランタイムインジェクションによって動的に必要なオブジェクトをインジェクトすることができます。（&lt;a href=&quot;http://www.bear-project.net/blog/2012/04/object-framework-ray-aop/&quot;&gt;Object Framework - Ray.Aop&lt;/a&gt;の「ランタイムインジェクター」節を参照）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LogやConfigは複数のオブジェクトによって必要とされていますが、Ray.Diではそのオブジェクトが必要なクラスに、LogInterfaceやConfigInterfaceを受け取るコンストラクタ、もしくは、セッターを用意し「@Inject」アノテーションを加えるだけで、すべてのLog、Configが必要なクラスにそれぞれのオブジェクトをDIできます。&lt;/p&gt;
&lt;p&gt;これは、Ray.DIが（アノテーションでの指定であれば）それぞれの（注入される側の）オブジェクトに対してDIを行うのではなく、インターフェース（もしくは名前）に基づいてDIを行うためで、モジュール側で一度、LogInterfaceに対してLogオブジェクトを注入するという指定を行えば、すべてのLogInterfaceが必要な個所にLogオブジェクトが注入されるためです。&lt;/p&gt;
&lt;p&gt;（同じインターフェースに対して別々のオブジェクトの注入を行いたい場合、名前付き（@Named）で指定することで行えます）&lt;/p&gt;
&lt;h4&gt;Ray.Aop&lt;/h4&gt;
&lt;p&gt;AOPではインターセプタによって処理の前後に任意の処理を織り込むことができ、これによりオブジェクトのメソッドの利用にこれまでにない拡張性と機能性を与えます。&lt;br /&gt;ここで注目したいのは下記に説明する2点です。（スライドのサンプルコードを参照）&lt;/p&gt;
&lt;p&gt;1つめは、利用側（&lt;code&gt;$user-&amp;gt;save()&lt;/code&gt;）のコードを変更しなくても、インターセプタが適用されるということ。 つまり、getInstance した際には、Weaverされたインターセプタが織り込み済みのオブジェクトが返ってきているから。&lt;/p&gt;
&lt;p&gt;2つめは、メソッドが呼び出す側（この例の場合、TimerIntercepter）は、&lt;code&gt;$invocation-&amp;gt;proceed()&lt;/code&gt;のコールによりオリジナルメソッドを実行しているつもりだけど、本当にオリジナルメソッドが呼ばれているかどうかはわからない、ということ。&lt;br /&gt;つまり、インターセプタをチェーンすることで、メソッド実行がチェーンされるため、インターセプタ同士はどの位置のインターセプタかも知らないけど、最後のインターセプタだけが実際のメソッドを呼び出し、それ以外のメソッドは（オリジナルのメソッドを呼び出しているつもりで）次のインターセプタを呼び出している。&lt;br /&gt;言い方を変えると、インターセプタによってアスペクトが織り込まれている、ということ。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;サンプルコード内の利用部分で、&lt;code&gt;Ray\Di\Injector::create([new DevModule]);&lt;/code&gt;というコードがありますが、これは、&lt;code&gt;DevModule&lt;/code&gt;ではなく&lt;code&gt;UserModule&lt;/code&gt;の間違いです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AOPを実現するのに裏で複雑な処理が行われているように思うかもしれませんが、実際に、Ray.Aopでのインターセプタの実装を見ると基本的なコードはこれだけです。（スライド: インターセプタのRay.Aop実装を参照）&lt;br /&gt;インターセプタが空＝残っていなければオリジナルメソッドを呼び、次のインターセプタがあれば、自分を引数としてinvokeメソッドを呼び出しているだけ。&lt;/p&gt;
&lt;p&gt;たったこれだけで、インターセプタが実現されていることはちょっと驚きじゃないかと私はそう感じました。&lt;/p&gt;
&lt;h4&gt;まとめ&lt;/h4&gt;
&lt;p&gt;Ray では、オブジェクトを生成する（コンパイル）ための Ray.Di と、それを利用（ランタイム）するための Ray.Aop の2つを組み合わせることで、生成と利用を分離する、ひいては関心の分離を強力にサポートします。&lt;/p&gt;
&lt;p&gt;また、生成と利用がはっきりと分離されていることにより、生成（コンパイル）されたオブジェクトグラフをそのまま再利用することができるようになります。&lt;br /&gt;生成が再利用できることで、すべてのオブジェクトをキャッシュすることが可能で、パースやインジェクションのコストを原理的には0にすることが可能です。&lt;/p&gt;
&lt;p&gt;説明した内容は Ray のもつ一部のコンセプトや機能ですが、興味を持ったら、是非使ってみてください！&lt;/p&gt;</content>        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/09b3d8d4de6a305be1471599b6b87180f35c8fdf/backend=imagemagick;version=1;width=1300/http%3A%2F%2F1.bp.blogspot.com%2F-zYwE4UmGwcg%2FUAjZQxvfThI%2FAAAAAAAAGkg%2FdpM_aE8Evyk%2Fs400%2Fslide-2-728.jpg" type="image/jpeg" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻 其の参</title>
        <link href="https://blog.madapaja.net/entry/2012/07/12/220700"/>
        <id>hatenablog://entry/8454420450093083856</id>
        <published>2012-07-12T22:07:00+09:00</published>
        <updated>2012-07-12T22:07:00+09:00</updated>        <summary type="html">こんにちは。呼ばれて飛び出てジャジャジャジャーン、@madapajaです。 PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻シリーズ 其の壱 其の弐 其の参 続きです。 前回は、Ray.Di を使って依存性の注入を行ってみました。 今回は、Ray.Aop でインターセプターを使い、アスペクト指向プログラミングの体験を中心に進めてみたいと思います。 前回の補足 …と、その前に前回の補足を。 @PostConstruct アノテーション 前回、@PostConstruct アノテーションによって初期化メソッド（__construct() 後に実行する…</summary>
        <content type="html">&lt;p&gt;こんにちは。呼ばれて飛び出てジャジャジャジャーン、&lt;a href=&quot;https://twitter.com/madapaja&quot;&gt;@madapaja&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻シリーズ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/000700&quot;&gt;其の壱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/200700&quot;&gt;其の弐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/12/220700&quot;&gt;其の参&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;続きです。 &lt;a&gt;前回&lt;/a&gt;は、Ray.Di を使って依存性の注入を行ってみました。 今回は、Ray.Aop でインターセプターを使い、アスペクト指向プログラミングの体験を中心に進めてみたいと思います。&lt;/p&gt;
&lt;h4&gt;前回の補足&lt;/h4&gt;
&lt;p&gt;…と、その前に前回の補足を。&lt;/p&gt;
&lt;h5&gt;&lt;code&gt;@PostConstruct&lt;/code&gt; アノテーション&lt;/h5&gt;
&lt;p&gt;前回、&lt;code&gt;@PostConstruct&lt;/code&gt; アノテーションによって初期化メソッド（&lt;code&gt;__construct()&lt;/code&gt; 後に実行するメソッド）の定義を行いました。&lt;br /&gt;これはコンストラクタでやるのと、何が違うのでしょうか？ 今回のサンプルの場合、コンストラクタ上で呼び出しても挙動は変わりません。&lt;br /&gt;なぜコンストラクタで行わないのか、その理由を3つほど考えてみました。（&lt;a href=&quot;https://twitter.com/koriym&quot;&gt;@koriym&lt;/a&gt;さんからもアドバイスをもらいました）&lt;/p&gt;
&lt;p&gt;1つめは、関心を分離させるためです。&lt;br /&gt;コンストラクタでは文字通り構造を構成する（つまり、プロパティへの代入）のみに徹し、&lt;code&gt;@PostConstruct&lt;/code&gt; 内でその構成されたオブジェクトに対しての初期化処理を記述することで関心を分離させられます。&lt;/p&gt;
&lt;p&gt;2つめは、&lt;code&gt;@PostConstruct&lt;/code&gt; では全ての依存が注入されているのが保証されています。&lt;br /&gt;前回のサンプルではコンストラクタへのインジェクションを行いましたが、Ray.Di ではSetterを使ったインジェクションも可能です。コンストラクタでも、Setterでも注入するという点では同じですし、挙動も基本的に変わりませんが、Setterインジェクションを行うことで、traitを利用しやすくなります。（実際に、BEAR.Sundayではtraitを利用して、テンプレートエンジンを注入したり、様々な箇所で使用されています。）&lt;br /&gt;Ray.Diの内部の挙動は、コンストラクタへの注入後に、Setterへの注入が行われ、最後に &lt;code&gt;@PostConstract&lt;/code&gt; が呼ばれます。&lt;br /&gt;たとえば、複数のSetterインジェクションがあるような場合、それらの複合的な設定を行うには、全ての注入が保証されている &lt;code&gt;@PostConstruct&lt;/code&gt; 内でしか初期化できない処理も考えられるでしょう。&lt;/p&gt;
&lt;p&gt;3つめは、これは副次的な特徴ですが &lt;code&gt;@PostConstruct&lt;/code&gt; では、同時にインターセプタを利用することが可能です。（逆に言えば、コンストラクタ内から別メソッド呼び出してもインターセプトされません。）&lt;br /&gt;Ray.Di で、&lt;code&gt;Injector::getInstance()&lt;/code&gt; を行うと、そのクラスの依存が解決した後に、依存を注入しオブジェクトを構成させ、その後にウィーバー（インターセプトを織り込む）され、最後に &lt;code&gt;@PostConstruct&lt;/code&gt; が呼び出されます。&lt;br /&gt;そのため、このアノテーション内では同時にインターセプトを利用することもできる、というわけです。&lt;/p&gt;
&lt;h5&gt;モジュールの作り方について&lt;/h5&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;ja&quot;&gt;
&lt;p&gt;モジュールの分割単位は１）機能の関心ごと２）動作モード　などで分割します。sandboxアプリではDevModule（動作モード）がフレームワークモジュール、機能のモジュール、アプリケーションモジュール等をinstallしてます。&lt;/p&gt;
— BEAR.Sundayさん (@BEARSunday) &lt;a href=&quot;https://twitter.com/BEARSunday/status/223386903108534272&quot; data-datetime=&quot;2012-07-12T12:02:42+00:00&quot;&gt;7月 12, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;
&lt;script src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;ja&quot;&gt;
&lt;p&gt;機能はたとえばDbなら Database\PdoModule にするのか Database\DoctrineOrm にするのかといった具合です。そのモジュール内では必要なDI、AOP設定を行います。&lt;/p&gt;
— BEAR.Sundayさん (@BEARSunday) &lt;a href=&quot;https://twitter.com/BEARSunday/status/223386973325365249&quot; data-datetime=&quot;2012-07-12T12:02:59+00:00&quot;&gt;7月 12, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;
&lt;script src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;とあるように、モジュールは関心ごとに分離すべきです。（今回はサンプルなので…）&lt;/p&gt;
&lt;p&gt;Ray.Diには、あるモジュールの中から他のモジュールをインストール（追加設定のような感じ）する機能があります。&lt;br /&gt;機能・関心ごとにモジュールを分離させることで、たとえば、実行（本番、テスト、開発）モードが要求する機能や関心を、必要に応じて構成させることができるようになります。&lt;/p&gt;
&lt;p&gt;これは、下のつぶやきにもあるように、BEAR.Sundayの大きな特徴の一つです。&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;ja&quot;&gt;
&lt;p&gt;ここが他のFWのイベントによる機能拡張と違うところで、FW内のコードでイベント（シグナル）を発行してApp側でコールバックをアタッチするのではなくて、サービスコンポーネントそのものをDIで入れ替え、その振る舞いをAOPで変更します&lt;/p&gt;
— BEAR.Sundayさん (@BEARSunday) &lt;a href=&quot;https://twitter.com/BEARSunday/status/223390269461114880&quot; data-datetime=&quot;2012-07-12T12:16:05+00:00&quot;&gt;7月 12, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;
&lt;script src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h4&gt;すべてのメソッドにインターセプタをバインドしてみる&lt;/h4&gt;
&lt;p&gt;では、ようやく本編です。&lt;/p&gt;


&lt;p&gt;処理時間を計るタイマーインターセプタを作り、それをすべてのメソッドへ問答無用で追加（バインド）してみたいと思います。 メソッドへ適用するインターセプタは &lt;code&gt;Ray\Aop\MethodInterceptor&lt;/code&gt; を継承して作ります。&lt;/p&gt;
&lt;p&gt;メソッドが呼び出されると、&lt;code&gt;invoke()&lt;/code&gt; が呼び出されるのでその中で前後に挟み込みたい処理を記述します。&lt;br /&gt;今回は以下のように作りました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Interceptor/Timer.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php;highlight:[14];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Interceptor;&lt;br /&gt;&lt;br /&gt;use Ray\Aop\MethodInterceptor;&lt;br /&gt;use Ray\Aop\MethodInvocation;&lt;br /&gt;&lt;br /&gt;class Timer implements MethodInterceptor&lt;br /&gt;{&lt;br /&gt;    public function invoke(MethodInvocation $invocation)&lt;br /&gt;    {&lt;br /&gt;        printf(&#39;%s::%s(): Timer start&#39;.&quot;\n&quot;, $invocation-&amp;gt;getMethod()-&amp;gt;class, $invocation-&amp;gt;getMethod()-&amp;gt;name);&lt;br /&gt;        $mtime = microtime(true);&lt;br /&gt;        $return = $invocation-&amp;gt;proceed();&lt;br /&gt;        $time = microtime(true) - $mtime;&lt;br /&gt;        printf(&#39;%s::%s(): Timer stop [%01.7f sec]&#39;.&quot;\n\n&quot;, $invocation-&amp;gt;getMethod()-&amp;gt;class, $invocation-&amp;gt;getMethod()-&amp;gt;name, $time);&lt;br /&gt;&lt;br /&gt;        return $return;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;処理としては、メソッド開始前後にメソッド名とタイマー状況のアウトプットと、計測処理を行っているだけですね。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;invoke&lt;/code&gt; メソッドは呼び出される際に引数としてメソッド実行に必要な知識を持ったオブジェクト（MethodInvocation）が渡されます。&lt;br /&gt;その知識を利用してメソッド名などを表示させ、また、14行目で &lt;code&gt;$invocation-&amp;gt;proceed()&lt;/code&gt; することでオリジナルのメソッドを実行します。&lt;/p&gt;
&lt;p&gt;さあ、インターセプタが出来たのでそれをバインドします。&lt;/p&gt;
&lt;p&gt;前回説明したとおり、アプリケーションやフレームワークを構成する際に使われる知識はモジュールが持ちます。&lt;br /&gt;&lt;code&gt;UserModule&lt;/code&gt; にインターセプタをバインドする処理を追加します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Module/UserModule.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php; highlight:[6,17,18,19,20,21];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Module;&lt;br /&gt;&lt;br /&gt;use Ray\Di\AbstractModule;&lt;br /&gt;use Madapaja\Ray\Di\Sample01\Interceptor\Timer;&lt;br /&gt;&lt;br /&gt;class UserModule extends AbstractModule&lt;br /&gt;{&lt;br /&gt;    protected function configure()&lt;br /&gt;    {&lt;br /&gt;        // bind dependency @Inject @Named(&quot;pdo_user&quot;)&lt;br /&gt;        $pdo = new \PDO(&#39;sqlite::memory:&#39;, null, null);&lt;br /&gt;        $this-&amp;gt;bind(&#39;PDO&#39;)-&amp;gt;annotatedWith(&#39;pdo_user&#39;)-&amp;gt;toInstance($pdo);&lt;br /&gt;&lt;br /&gt;        // bind aspect Timer&lt;br /&gt;        $this-&amp;gt;bindInterceptor(&lt;br /&gt;            $this-&amp;gt;matcher-&amp;gt;any(),&lt;br /&gt;            $this-&amp;gt;matcher-&amp;gt;any(),&lt;br /&gt;            [new Timer]&lt;br /&gt;        );&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;17行目から &lt;code&gt;bindInterceptor&lt;/code&gt; メソッドでインターセプタをバインドしています。 このメソッドは 3 つの引数を取り、1つ目はクラスのマッチャーを、2つめはメソッドのマッチャーを、3つめはインターセプターの配列を渡します。&lt;br /&gt;1つめと、2つめの引数に &lt;code&gt;$this-&amp;gt;matcher-&amp;gt;any()&lt;/code&gt; を渡すことで、すべてのメソッドに適用されるようになります。&lt;/p&gt;
&lt;p&gt;この状態で、&lt;code&gt;php main.php&lt;/code&gt; として実行してみると、タイマーインターセプタがバインドされていることが分かるかと思います。&lt;/p&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;Madapaja\Ray\Di\Sample01\Model\User::init(): Timer start&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::init(): Timer stop [0.0005341 sec]&lt;br /&gt;&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer stop [0.0001001 sec]&lt;br /&gt;&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start&lt;br /&gt;    :&lt;br /&gt;    :&lt;/pre&gt;
&lt;h4&gt;アノテーションを使って特定のメソッドにインターセプタをバインドしてみる&lt;/h4&gt;
&lt;p&gt;次に、トランザクションを行うインターセプタを作って特定のメソッドへのバインドをしてみます。 特定のメソッドへのバインドは、メソッド名のプレフィックスやアノテーションでマッチさせることができますが、今回は汎用的に使えるようにアノテーションでマッチさせるようにします。&lt;/p&gt;
&lt;p&gt;まずはタイマーの時と同じように、トランザクションインターセプタを作ります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Interceptor/Transaction.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php; highlight:[15,16];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Interceptor;&lt;br /&gt;&lt;br /&gt;use Ray\Aop\MethodInterceptor;&lt;br /&gt;use Ray\Aop\MethodInvocation;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Transaction interceptor&lt;br /&gt; */&lt;br /&gt;class Transaction implements MethodInterceptor&lt;br /&gt;{&lt;br /&gt;    public function invoke(MethodInvocation $invocation)&lt;br /&gt;    {&lt;br /&gt;        $object = $invocation-&amp;gt;getThis();&lt;br /&gt;        $ref = new \ReflectionProperty($object, &#39;db&#39;);&lt;br /&gt;        $ref-&amp;gt;setAccessible(true);&lt;br /&gt;        $db = $ref-&amp;gt;getValue($object);&lt;br /&gt;        $db-&amp;gt;beginTransaction();&lt;br /&gt;        try {&lt;br /&gt;            echo &quot;begin Transaction&quot; . json_encode($invocation-&amp;gt;getArguments()) . &quot;\n&quot;;&lt;br /&gt;            $invocation-&amp;gt;proceed();&lt;br /&gt;            $db-&amp;gt;commit();&lt;br /&gt;            echo &quot;commit\n&quot;;&lt;br /&gt;        } catch (\Exception $e) {&lt;br /&gt;            $db-&amp;gt;roleback();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;15行目で &lt;code&gt;$invocation-&amp;gt;getThis()&lt;/code&gt; し、実行されるオブジェクト（User オブジェクト）を取得しています。 トランザクションを行うために &lt;code&gt;User::$db&lt;/code&gt; へのアクセスを行いたいのですが、このプロパティはプライベートプロパティのため、そのままアクセスすることができません。&lt;/p&gt;
&lt;p&gt;そこで 16行目でリフレクションプロパティを取得し、プロパティをアクセス可能にした上でトランザクション処理を行っています。&lt;/p&gt;
&lt;p&gt;次に、このインターセプタを適用させるアノテーションを作ります。&lt;br /&gt;今回は &lt;code&gt;@Transactional&lt;/code&gt; アノテーションという名前で以下のように作りました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Annotation/Transactional.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php; highlight:[];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Annotation;&lt;br /&gt;&lt;br /&gt;use Ray\Di\Di\Annotation;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @Annotation&lt;br /&gt; * @Target(&quot;METHOD&quot;)&lt;br /&gt; */&lt;br /&gt;final class Transactional implements Annotation&lt;br /&gt;{&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;作ったアノテーションを &lt;code&gt;User&lt;/code&gt; クラスに適用させましょう。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Model/User.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php; highlight:[8,15];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Model;&lt;br /&gt;&lt;br /&gt;use Ray\Di\Di\Inject;&lt;br /&gt;use Ray\Di\Di\Named;&lt;br /&gt;use Ray\Di\Di\PostConstruct;&lt;br /&gt;use Madapaja\Ray\Di\Sample01\Annotation\Transactional;&lt;br /&gt;&lt;br /&gt;class User&lt;br /&gt;{&lt;br /&gt;    // ...&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @Transactional&lt;br /&gt;     */&lt;br /&gt;    public function createUser($name, $age)&lt;br /&gt;    {&lt;br /&gt;        $sth = $this-&amp;gt;db-&amp;gt;prepare(&#39;INSERT INTO User (Name, Age) VALUES (:name, :age)&#39;);&lt;br /&gt;        return $sth-&amp;gt;execute(array(&#39;:name&#39; =&amp;gt; $name, &#39;:age&#39; =&amp;gt; $age));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // ...&lt;/pre&gt;
&lt;p&gt;use してアノテーションするだけです。&lt;/p&gt;
&lt;p&gt;最後に &lt;code&gt;UserModule&lt;/code&gt; でバインドします。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Module/UserModule.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php; highlight:[5,16,17,18,19,20];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Module;&lt;br /&gt;use Madapaja\Ray\Di\Sample01\Interceptor\Timer;&lt;br /&gt;use Madapaja\Ray\Di\Sample01\Interceptor\Transaction;&lt;br /&gt;&lt;br /&gt;use Ray\Di\AbstractModule;&lt;br /&gt;&lt;br /&gt;class UserModule extends AbstractModule&lt;br /&gt;{&lt;br /&gt;    protected function configure()&lt;br /&gt;    {&lt;br /&gt;        // ...&lt;br /&gt;&lt;br /&gt;        // bind aspect @Transactional method&lt;br /&gt;        $this-&amp;gt;bindInterceptor(&lt;br /&gt;            $this-&amp;gt;matcher-&amp;gt;any(),&lt;br /&gt;            $this-&amp;gt;matcher-&amp;gt;annotatedWith(&#39;Madapaja\Ray\Di\Sample01\Annotation\Transactional&#39;),&lt;br /&gt;            [new Transaction]&lt;br /&gt;        );&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;18行目で、メソッドに &lt;code&gt;@Transactional&lt;/code&gt; アノテーションが指定されている場合にマッチするように、&lt;code&gt;annotatedWith()&lt;/code&gt; マッチャーを使ってバインドします。&lt;/p&gt;
&lt;p&gt;これでトランザクションインターセプタがバインドできましたので、&lt;code&gt;php main.php&lt;/code&gt; として実行してみましょう。&lt;/p&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;Madapaja\Ray\Di\Sample01\Model\User::init(): Timer start&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::init(): Timer stop [0.0005541 sec]&lt;br /&gt;&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start&lt;br /&gt;begin Transaction[&quot;Koriym&quot;,30]&lt;br /&gt;commit&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer stop [0.0001891 sec]&lt;br /&gt;&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start&lt;br /&gt;begin Transaction[&quot;Bear&quot;,22]&lt;br /&gt;commit&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer stop [0.0001378 sec]&lt;br /&gt;&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer start&lt;br /&gt;begin Transaction[&quot;Yoshi&quot;,25]&lt;br /&gt;commit&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::createUser(): Timer stop [0.0001421 sec]&lt;br /&gt;&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::readUsers(): Timer start&lt;br /&gt;Madapaja\Ray\Di\Sample01\Model\User::readUsers(): Timer stop [0.0000980 sec]&lt;br /&gt;    :&lt;br /&gt;    :&lt;/pre&gt;
&lt;p&gt;このように &lt;code&gt;@Transactional&lt;/code&gt; アノテーションをした &lt;code&gt;User::createUser()&lt;/code&gt; メソッドのみにトランザクションが行われているのが分かるかと思います。&lt;/p&gt;
&lt;p&gt;とりあえず、サンプルを通じて Ray の触りをご紹介できたと思います。&lt;/p&gt;
&lt;p&gt;インターセプター面白いです。&lt;/p&gt;
&lt;h4&gt;参考リンク&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/bearsunday/&quot;&gt;BEAR.Sunday Google Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/koriym/BEAR.Sunday&quot;&gt;BEAR.Sunday Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/rayphp/&quot;&gt;BEAR Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/rayphp/&quot;&gt;RayPHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/madapaja/ray-di-sample&quot;&gt;madapaja/ray-di-sample - Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻シリーズ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/000700&quot;&gt;其の壱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/200700&quot;&gt;其の弐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/12/220700&quot;&gt;其の参&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450093083856/1430387335" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻 其の弐</title>
        <link href="https://blog.madapaja.net/entry/2012/07/11/200700"/>
        <id>hatenablog://entry/8454420450093083841</id>
        <published>2012-07-11T20:07:00+09:00</published>
        <updated>2012-07-11T20:07:00+09:00</updated>        <summary type="html">こんにちは。夏はやっぱり生ビール、@madapajaです。PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻 其の壱 : 今日も適当ダイアリー の続きです。 PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻シリーズ 其の壱 其の弐 其の参 前回は、Ray を Composer 経由でインストールして User クラスを作りました。 Ray を使わずに書いてみる</summary>
        <content type="html">&lt;p&gt;こんにちは。夏はやっぱり生ビール、&lt;a href=&quot;https://twitter.com/madapaja&quot;&gt;@madapaja&lt;/a&gt;です。&lt;br /&gt;&lt;a href=&quot;/entry/2012/07/11/000700&quot;&gt;PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻 其の壱 : 今日も適当ダイアリー&lt;/a&gt; の続きです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻シリーズ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/000700&quot;&gt;其の壱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/200700&quot;&gt;其の弐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/12/220700&quot;&gt;其の参&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;/entry/2012/07/11/000700&quot;&gt;前回&lt;/a&gt;は、Ray を Composer 経由でインストールして &lt;code&gt;User&lt;/code&gt; クラスを作りました。&lt;/p&gt;
&lt;h4&gt;Ray を使わずに書いてみる&lt;/h4&gt;


&lt;p&gt;Ray を使ってみる前に、普通に PHP を書いて &lt;code&gt;User&lt;/code&gt; クラスを実行してみたいと思います。今回は &lt;code&gt;Madapaja\Ray\Di\Sample01\App&lt;/code&gt; クラスを下記のように書きました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/App.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01;&lt;br /&gt;use Madapaja\Ray\Di\Sample01\Model\User;&lt;br /&gt;&lt;br /&gt;class App&lt;br /&gt;{&lt;br /&gt;    public function run()&lt;br /&gt;    {&lt;br /&gt;        $pdo = new \PDO(&#39;sqlite::memory:&#39;, null, null);&lt;br /&gt;        $user = new User($pdo);&lt;br /&gt;&lt;br /&gt;        $user-&amp;gt;init();&lt;br /&gt;&lt;br /&gt;        $user-&amp;gt;createUser(&#39;Koriym&#39;, mt_rand(18,35));&lt;br /&gt;        $user-&amp;gt;createUser(&#39;Bear&#39;, mt_rand(18,35));&lt;br /&gt;        $user-&amp;gt;createUser(&#39;Yoshi&#39;, mt_rand(18,35));&lt;br /&gt;&lt;br /&gt;        $users = $user-&amp;gt;readUsers();&lt;br /&gt;        print_r($users);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;そして上の &lt;code&gt;App&lt;/code&gt; クラスを実行するために下記のファイルを作ります。内容はオートローダを読み込んで &lt;code&gt;App::run()&lt;/code&gt; を実行するだけです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;main.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;&lt;br /&gt;require __DIR__.&#39;/vendor/autoload.php&#39;;&lt;br /&gt;&lt;br /&gt;use Madapaja\Ray\Di\Sample01\App;&lt;br /&gt;(new App())-&amp;gt;run();&lt;/pre&gt;
&lt;p&gt;ここまで出来たら &lt;code&gt;php main.php&lt;/code&gt; として実行してみます。&lt;/p&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;Array&lt;br /&gt;(&lt;br /&gt;    [0] =&amp;gt; Array&lt;br /&gt;        (&lt;br /&gt;            [Name] =&amp;gt; Koriym&lt;br /&gt;            [Age] =&amp;gt; 24&lt;br /&gt;        )&lt;br /&gt;&lt;br /&gt;    [1] =&amp;gt; Array&lt;br /&gt;        (&lt;br /&gt;            [Name] =&amp;gt; Bear&lt;br /&gt;            [Age] =&amp;gt; 18&lt;br /&gt;        )&lt;br /&gt;&lt;br /&gt;    [2] =&amp;gt; Array&lt;br /&gt;        (&lt;br /&gt;            [Name] =&amp;gt; Yoshi&lt;br /&gt;            [Age] =&amp;gt; 30&lt;br /&gt;        )&lt;br /&gt;&lt;br /&gt;)&lt;/pre&gt;
&lt;p&gt;のように、結果が表示されたでしょうか？簡単ですね。というか、普通のPHPなので当たり前ですね。&lt;/p&gt;
&lt;h4&gt;Ray.Di でインジェクトしてみよう&lt;/h4&gt;
&lt;p&gt;やっと、Rayの出番です。Ray.Diを使って依存性を注入してみます。今回の場合は、 &lt;code&gt;User&lt;/code&gt; クラスへ &lt;code&gt;PDO&lt;/code&gt; を注入します。&lt;/p&gt;
&lt;p&gt;Ray では DI や AOP の設定をモジュールという単位（クラス）で行います。モジュールはアプリケーションやフレームワークを構成する際に使われる知識を持っており、その知識をもとにインジェクターが依存を注入することで、適切なオブジェクトグラフを生成されることになります。&lt;br /&gt;とりあえず、モジュールで DI と AOP の設定をするよ、ということが分かればOKです。&lt;/p&gt;
&lt;h5&gt;アノテーションの追加&lt;/h5&gt;
&lt;p&gt;モジュールを作る前に、&lt;code&gt;User&lt;/code&gt; クラスのコンストラクタへインジェクトを行うことを示すために、アノテーションを追加します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Model/User.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php; highlight:[5,6,13,14];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Model;&lt;br /&gt;&lt;br /&gt;use Ray\Di\Di\Inject;&lt;br /&gt;use Ray\Di\Di\Named;&lt;br /&gt;&lt;br /&gt;class User&lt;br /&gt;{&lt;br /&gt;    private $db;&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @Inject&lt;br /&gt;     * @Named(&quot;pdo=pdo_user&quot;)&lt;br /&gt;     */&lt;br /&gt;    public function __construct(\PDO $pdo)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;db = $pdo;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // ...&lt;/pre&gt;
&lt;p&gt;13行目で &lt;code&gt;@Inject&lt;/code&gt; アノテーションによってインジェクトポイントだということを示し、14行目で &lt;code&gt;@Named&lt;/code&gt; アノテーションで &lt;code&gt;pdo_user&lt;/code&gt; という名前で（&lt;code&gt;pdo&lt;/code&gt; を）バインドすることを示します。&lt;br /&gt;なお、5～6行目は &lt;code&gt;@Inject&lt;/code&gt; と &lt;code&gt;@Named&lt;/code&gt; アノテーションの名前空間を解決させるために &lt;code&gt;use&lt;/code&gt; しています。&lt;/p&gt;
&lt;h5&gt;UserModule を作る&lt;/h5&gt;
&lt;p&gt;ということで、&lt;code&gt;User&lt;/code&gt; クラスの構成設定を行う &lt;code&gt;UserModule&lt;/code&gt; を作ります。 モジュールは &lt;code&gt;Ray\Di\AbstractModule&lt;/code&gt; を継承し &lt;code&gt;configure()&lt;/code&gt; メソッド内で構成の設定を行います。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Module/UserModule.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php; highlight:[13];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Module;&lt;br /&gt;&lt;br /&gt;use Ray\Di\AbstractModule;&lt;br /&gt;&lt;br /&gt;class UserModule extends AbstractModule&lt;br /&gt;{&lt;br /&gt;    protected function configure()&lt;br /&gt;    {&lt;br /&gt;        // bind dependency @Inject @Named(&quot;pdo_user&quot;)&lt;br /&gt;        $pdo = new \PDO(&#39;sqlite::memory:&#39;, null, null);&lt;br /&gt;        $this-&amp;gt;bind(&#39;PDO&#39;)-&amp;gt;annotatedWith(&#39;pdo_user&#39;)-&amp;gt;toInstance($pdo);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;DI の設定は 13 行目で行っており、&lt;code&gt;PDO&lt;/code&gt; クラスの &lt;code&gt;pdo_user&lt;/code&gt; という名前の箇所に PDO インスタンス（&lt;code&gt;$pdo&lt;/code&gt;）をバインドしています。 （本来はインターフェースではない PDO クラスや、その実体（インスタンス）を使用しない方がいいのですが、ここではコードを簡単にするために許してもらいます。）&lt;/p&gt;
&lt;h5&gt;インジェクタ経由でインスタンスを取得する&lt;/h5&gt;
&lt;p&gt;これで準備が整いました。 &lt;code&gt;App&lt;/code&gt; クラスを書き変えてインジェクタを利用してみます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/App.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php; highlight:[5,6,12,13];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01;&lt;br /&gt;&lt;br /&gt;use Ray\Di\Injector;&lt;br /&gt;use Madapaja\Ray\Di\Sample01\Module\UserModule;&lt;br /&gt;&lt;br /&gt;class App&lt;br /&gt;{&lt;br /&gt;    public function run()&lt;br /&gt;    {&lt;br /&gt;        $di = Injector::create([new UserModule]);&lt;br /&gt;        $user = $di-&amp;gt;getInstance(&#39;Madapaja\Ray\Di\Sample01\Model\User&#39;);&lt;br /&gt;&lt;br /&gt;        $user-&amp;gt;init();&lt;br /&gt;&lt;br /&gt;        // ...&lt;/pre&gt;
&lt;p&gt;12行目で、今作った &lt;code&gt;UserModule&lt;/code&gt; を指定してインジェクタを生成し、13行目で実際に &lt;code&gt;User&lt;/code&gt; クラスのインスタンスを取得しています。 これで、依存がよしなに解決されるようになりました。&lt;/p&gt;
&lt;h5&gt;アノテーションのオートロードを設定&lt;/h5&gt;
&lt;p&gt;さっそく実行してみたいところですが、アノテーションのオートロードのためにもうひとつ処理を追加する必要があります。 これは BEAR.Sunday ではフレームワーク側でやってくれますので、今回のように Ray をスタンドアロンで利用する場合にのみ必要な設定です。&lt;/p&gt;
&lt;p&gt;main.php でオートローダーを取得して、アノテーションレジストリにローダーを登録します。 実際のソースは下記のようになります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;main.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;&lt;br /&gt;use Doctrine\Common\Annotations\AnnotationRegistry;&lt;br /&gt;use Madapaja\Ray\Di\Sample01\App;&lt;br /&gt;&lt;br /&gt;$loader = require __DIR__.&#39;/vendor/autoload.php&#39;;&lt;br /&gt;AnnotationRegistry::registerLoader(array($loader, &quot;loadClass&quot;));&lt;br /&gt;&lt;br /&gt;(new App())-&amp;gt;run();&lt;/pre&gt;
&lt;p&gt;これでやっと実行できるようになりました。&lt;code&gt;php main.php&lt;/code&gt; を実行させて問題なく動くのを確認してみましょう。&lt;/p&gt;
&lt;h4&gt;@PostConstruct アノテーションによる初期化メソッドの定義&lt;/h4&gt;
&lt;p&gt;これまで&lt;code&gt;User&lt;/code&gt; クラスを初期化するために、 &lt;code&gt;App&lt;/code&gt; クラスで &lt;code&gt;User::init()&lt;/code&gt; メソッドを呼び出していました。 これを &lt;code&gt;@PostConstruct&lt;/code&gt; アノテーションすることで、インジェクタに初期化メソッドの呼び出しを任せようと思います。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/App.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php;highlight:[12];&quot;&gt;&lt;br /&gt;// ...&lt;br /&gt;&lt;br /&gt;class App&lt;br /&gt;{&lt;br /&gt;    public function run()&lt;br /&gt;    {&lt;br /&gt;        $di = Injector::create([new UserModule]);&lt;br /&gt;        $user = $di-&amp;gt;getInstance(&#39;Madapaja\Ray\Di\Sample01\Model\User&#39;);&lt;br /&gt;&lt;br /&gt;        // $user-&amp;gt;init();&lt;br /&gt;&lt;br /&gt;        // ...&lt;/pre&gt;
&lt;p&gt;App.phpの修正は、12行目を削除するだけです。&lt;br /&gt;次に &lt;code&gt;User&lt;/code&gt; クラスにアノテーションを追加します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Model/User.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php;highlight:[7,15];&quot;&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Model;&lt;br /&gt;&lt;br /&gt;use Ray\Di\Di\Inject;&lt;br /&gt;use Ray\Di\Di\Named;&lt;br /&gt;use Ray\Di\Di\PostConstruct;&lt;br /&gt;&lt;br /&gt;class User&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    // ...&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * @PostConstruct&lt;br /&gt;     */&lt;br /&gt;    public function init()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;db-&amp;gt;query(&#39;CREATE TABLE User (Id INTEGER PRIMARY KEY, Name TEXT, Age INTEGER)&#39;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // ...&lt;/pre&gt;
&lt;p&gt;名前空間を &lt;code&gt;use&lt;/code&gt; して、&lt;code&gt;@PostConstruct&lt;/code&gt; アノテーションを追加するだけです。 これだけで、インジェクタの &lt;code&gt;getInstance&lt;/code&gt; メソッドでインスタンスを取得する際、コンストラクタ後にアノテーションしたメソッドが呼び出されるようになります。&lt;/p&gt;
&lt;h4&gt;いよいよ Ray.Aop の登板！&lt;/h4&gt;
&lt;p&gt;という所なのですが、またもや長くなってきた（というか疲れた）ので、其の参に続きます！にんにん！&lt;/p&gt;
&lt;p&gt;（7/12追記）&lt;a href=&quot;/entry/2012/07/12/220700&quot;&gt;続き&lt;/a&gt;書きました！&lt;/p&gt;
&lt;h4&gt;参考リンク&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/bearsunday/&quot;&gt;BEAR.Sunday Google Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/koriym/BEAR.Sunday&quot;&gt;BEAR.Sunday Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/rayphp/&quot;&gt;BEAR Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/rayphp/&quot;&gt;RayPHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/madapaja/ray-di-sample&quot;&gt;madapaja/ray-di-sample - Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻シリーズ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/000700&quot;&gt;其の壱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/200700&quot;&gt;其の弐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/12/220700&quot;&gt;其の参&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450093083841/1430387290" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
    <entry>
        <title>PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻 其の壱</title>
        <link href="https://blog.madapaja.net/entry/2012/07/11/000700"/>
        <id>hatenablog://entry/8454420450093083828</id>
        <published>2012-07-11T00:07:00+09:00</published>
        <updated>2012-07-11T00:07:00+09:00</updated>        <summary type="html">こんばんは。そろそろ健康診断なのでダイエットしようかと思ってる@madapajaです。 特にSymfony界隈などで話題になっている、PHP5.4+向けに開発が行われているリソース指向フレームワークBEAR.Sundayは皆さんチェックされてますか？ このフレームワークはPHP5.2+向けのリソース指向フレームワークBEAR.Saturdayの新バージョンにあたるもので、設計の全てを見直して@koriym氏によって開発が進められています。 リソース指向や、開発思想などについてはとってもここでは書き切れないので BEAR Blogなどをチェックしていただければと。 さて、そんなBEAR.Sund…</summary>
        <content type="html">&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot; href=&quot;http://4.bp.blogspot.com/-wiILTTmsRM0/T_xKCO-yZRI/AAAAAAAAGgQ/nl1fD9SA8Ws/s1600/20120710.png&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/-wiILTTmsRM0/T_xKCO-yZRI/AAAAAAAAGgQ/nl1fD9SA8Ws/s400/20120710.png&quot; alt=&quot;&quot; width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;こんばんは。そろそろ健康診断なのでダイエットしようかと思ってる&lt;a href=&quot;http://twitter.com/madapaja&quot;&gt;@madapaja&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;特にSymfony界隈などで話題になっている、PHP5.4+向けに開発が行われているリソース指向フレームワーク&lt;a href=&quot;http://code.google.com/p/bearsunday/&quot;&gt;BEAR.Sunday&lt;/a&gt;は皆さんチェックされてますか？&lt;/p&gt;
&lt;p&gt;このフレームワークはPHP5.2+向けのリソース指向フレームワーク&lt;a href=&quot;http://code.google.com/p/bear-project/&quot;&gt;BEAR.Saturday&lt;/a&gt;の新バージョンにあたるもので、設計の全てを見直して&lt;a href=&quot;http://twitter.com/koriym&quot;&gt;@koriym&lt;/a&gt;氏によって開発が進められています。&lt;/p&gt;
&lt;p&gt;リソース指向や、開発思想などについてはとってもここでは書き切れないので &lt;a href=&quot;http://code.google.com/p/rayphp/&quot;&gt;BEAR Blog&lt;/a&gt;などをチェックしていただければと。&lt;/p&gt;
&lt;p&gt;さて、そんなBEAR.Sundayですが、まだ開発中のフレームワークですので実際に使う上で足りない機能もたくさんありますし、アプリケーションコントローラなども機能追加や仕様変更がこれからたくさん行われることになるようです。&lt;/p&gt;
&lt;p&gt;だけど、&lt;a href=&quot;http://d.hatena.ne.jp/brtRiver/20120707/1341662909&quot;&gt;Bear.Sunday Meetup #0 が開催されるようだ&lt;/a&gt;という情報も出回ってるいるので、さわりだけでも触ってみたい！&lt;/p&gt;
&lt;p&gt;ということで、今後も仕様の変更はほとんど考えられない Ray.Di と Ray.Aopを使ってみよう、という企画です。&lt;/p&gt;


&lt;h4&gt;Rayって何?&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/rayphp/&quot;&gt;Ray&lt;/a&gt;は、Google GuiceというJavaフレームワークのPHP版で、BEAR.Sundayと同じく&lt;a href=&quot;http://twitter.com/koriym&quot;&gt;@koriym&lt;/a&gt;氏によって開発されています。&lt;/p&gt;
&lt;p&gt;Rayは2つのパッケージ、一つはDI（Dependency Injection）を行うための&lt;a href=&quot;https://github.com/koriym/Ray.Di&quot;&gt;Ray.Di&lt;/a&gt;、もう一つはアスペクトを構成するためのフレームワーク&lt;a href=&quot;https://github.com/koriym/Ray.Aop&quot;&gt;Ray.Aop&lt;/a&gt;から構成されています。&lt;/p&gt;
&lt;p&gt;今回は&lt;a href=&quot;https://github.com/koriym/Ray.Di/tree/master/doc/sample&quot;&gt;Ray.Aopにあるサンプル&lt;/a&gt;を元にRayでどのようにアプリケーションを構成できるのかを見ていきたいと思います。&lt;/p&gt;
&lt;p&gt;なお、今回のサンプルの完成版は下記においてありますので参考にどうぞ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/madapaja/ray-di-sample&quot;&gt;madapaja/ray-di-sample - Github &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なお、このチュートリアル（？）ではGit、PHP5.4、PDO SQLite拡張が必要です。&lt;/p&gt;
&lt;h4&gt;RayをComposerでインストール&lt;/h4&gt;
&lt;p&gt;Ray/DiとRay/Aopをrequireに指定してcomposer install すればOK？と思ったのですが、そうは問屋が卸してくれませんでした。&lt;/p&gt;
&lt;p&gt;試行錯誤の結果、下記の内容でインストールできたので実際にやってみる方はコピペするのが吉かと。&lt;/p&gt;
&lt;p&gt;ついでに、自分の書くソースのautoload設定も追加しておきます。&lt;br /&gt;私は名前空間は&quot;Madapaja\Ray\Di\Sample01&quot;としてsrcディレクトリ配下に置くことにしました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;composer.json&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;{&lt;br /&gt;    &quot;require&quot;: {&lt;br /&gt;        &quot;php&quot;: &quot;&amp;gt;=5.4.0&quot;,&lt;br /&gt;        &quot;ext-pdo&quot;: &quot;*&quot;,&lt;br /&gt;        &quot;ext-pdo_sqlite&quot;: &quot;*&quot;,&lt;br /&gt;        &quot;Ray/Di&quot;: &quot;&amp;gt;=1.0.x-dev&quot;,&lt;br /&gt;        &quot;doctrine/common&quot;: &quot;2.3.x-dev&quot;,&lt;br /&gt;        &quot;Ray/Aop&quot;: &quot;&amp;gt;=1.0.x-dev&quot;,&lt;br /&gt;        &quot;Aura/Di&quot;: &quot;&amp;gt;=1.0.x-dev&quot;&lt;br /&gt;    },&lt;br /&gt;    &quot;autoload&quot;: {&lt;br /&gt;        &quot;psr-0&quot;: {&lt;br /&gt;            &quot;Aura\\Di&quot;: &quot;vendor/Aura/Di/src/&quot;,&lt;br /&gt;            &quot;Madapaja\\Ray\\Di\\Sample01&quot;: &quot;src&quot;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;上記ファイルが出来たら&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;curl -s &lt;a href=&quot;http://getcomposer.org/installer&quot;&gt;http://getcomposer.org/installer&lt;/a&gt; | php&lt;br /&gt;php composer.phar install&lt;/pre&gt;
&lt;p&gt;として、ライブラリをインストールしましょう。&lt;br /&gt;実行して、ずらずらーっと文字が出てきて最後に「Generating autoload files」と表示されればOK。&lt;/p&gt;
&lt;p&gt;では、実際にソースを書き始めます。&lt;/p&gt;
&lt;h4&gt;書き始める&lt;/h4&gt;
&lt;p&gt;さっそく、Rayを使いたいところですが、ぐっと我慢して普通のアプリケーションの開発と同じくモデルを書くところから始めます。&lt;/p&gt;
&lt;p&gt;Userクラスを下記のように作りました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;src/Madapaja/Ray/Di/Sample01/Model/User.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;&lt;br /&gt;&lt;br /&gt;namespace Madapaja\Ray\Di\Sample01\Model;&lt;br /&gt;&lt;br /&gt;class User&lt;br /&gt;{&lt;br /&gt;    private $db;&lt;br /&gt;&lt;br /&gt;    public function __construct(\PDO $pdo)&lt;br /&gt;    {&lt;br /&gt;        $this-&amp;gt;db = $pdo;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function init()&lt;br /&gt;    {&lt;br /&gt;        return $this-&amp;gt;db-&amp;gt;query(&#39;CREATE TABLE User (Id INTEGER PRIMARY KEY, Name TEXT, Age INTEGER)&#39;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function createUser($name, $age)&lt;br /&gt;    {&lt;br /&gt;        $sth = $this-&amp;gt;db-&amp;gt;prepare(&#39;INSERT INTO User (Name, Age) VALUES (:name, :age)&#39;);&lt;br /&gt;        return $sth-&amp;gt;execute(array(&#39;:name&#39; =&amp;gt; $name, &#39;:age&#39; =&amp;gt; $age));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public function readUsers()&lt;br /&gt;    {&lt;br /&gt;        $sth = $this-&amp;gt;db-&amp;gt;query(&#39;SELECT Name, Age FROM User&#39;);&lt;br /&gt;        $result = $sth-&amp;gt;fetchAll(\PDO::FETCH_ASSOC);&lt;br /&gt;        return $result;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;なんてことはないDBのUserテーブルを操作する普通のクラス（Model）です。強いて言えば、依存関係は自分で解決せずに、DIによって後で良きに計らってもらえるように、コンストラクタでPDOインスタンスを受け取る形にしたくらいです。&lt;/p&gt;
&lt;p&gt;もちろんこの段階でこのクラスに対してテストを書くのも簡単ですね。今回は&lt;a href=&quot;https://github.com/madapaja/ray-di-sample/blob/master/src/Madapaja/Ray/Di/Sample01/Tests/Model/UserTest.php&quot;&gt;こんな感じ&lt;/a&gt;で書いてみました。&lt;/p&gt;
&lt;h4&gt;ここからRayの出番です&lt;/h4&gt;
&lt;p&gt;という所なのですが、予想以上に長くなってきた（というか疲れた）ので、其の弐に続きます！&lt;/p&gt;
&lt;p&gt;実際のRayを触るのは次回になってしまいましたが、待ちきれないぜ、俺は今やりたいんだよ、という方は&lt;a href=&quot;https://github.com/madapaja/ray-di-sample/commits/master&quot;&gt;madapaja/ray-di-sample のコミット履歴&lt;/a&gt;なんかが参考になるかもしれません。&lt;/p&gt;
&lt;p&gt;（7/11追記）&lt;a href=&quot;/entry/2012/07/11/200700&quot;&gt;其の弐書きました！&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;参考リンク&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/bearsunday/&quot;&gt;BEAR.Sunday Google Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/koriym/BEAR.Sunday&quot;&gt;BEAR.Sunday Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/rayphp/&quot;&gt;BEAR Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/rayphp/&quot;&gt;RayPHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/madapaja/ray-di-sample&quot;&gt;madapaja/ray-di-sample - Github &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻シリーズ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/000700&quot;&gt;其の壱&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/11/200700&quot;&gt;其の弐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/entry/2012/07/12/220700&quot;&gt;其の参&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/6eb15223af6afcdc67d86da7253f67545cd32b9b/backend=imagemagick;version=1;width=1300/http%3A%2F%2F4.bp.blogspot.com%2F-wiILTTmsRM0%2FT_xKCO-yZRI%2FAAAAAAAAGgQ%2Fnl1fD9SA8Ws%2Fs400%2F20120710.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>Symfony勉強会 #6 に参加してきた〜Symfony温泉に向けて</title>
        <link href="https://blog.madapaja.net/entry/2012/07/08/190700"/>
        <id>hatenablog://entry/8454420450093083809</id>
        <published>2012-07-08T19:07:00+09:00</published>
        <updated>2012-07-08T19:07:00+09:00</updated>        <summary type="html">こんにちは。随分ブログをサボっていた @madapaja です。 先週、6/30に開かれたSymfony勉強会 #6 にスタッフとして参加しました。なんと、勉強会＋懇親会で13時間に及んだ勉強会でしたが、やっぱりSymfony勉強会ってイイね、と思いました。</summary>
        <content type="html">&lt;p&gt;こんにちは。随分ブログをサボっていた &lt;a href=&quot;https://twitter.com/madapaja&quot;&gt;@madapaja &lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;先週、6/30に開かれたSymfony勉強会 #6 にスタッフとして参加しました。&lt;br /&gt;なんと、勉強会＋懇親会で13時間に及んだ勉強会でしたが、やっぱりSymfony勉強会ってイイね、と思いました。&lt;/p&gt;


&lt;p&gt;勉強会の内容や雰囲気については、ユーザー会や参加者の方の素敵なレポートを下の方にリンクしておくので、そちらを確認していただければと思いますが、何がイイって、Symfonyの話がそんなに無いのがイイねと。&lt;br /&gt;そう言うとちょっと語弊があるかもしれないですけど、でも実際に、今回の勉強会ではSymfonyのHow toやコードや、実際に使う上での細かい（固有の）話は出てこなかったと思います。（ワークショップは除いて）&lt;br /&gt;Symfonyを使う時にだけしか使えない、ひいて言えば、PHPを使う時だけにしか使えないような知識は登場せず、もっとその奥にある普遍的な知識が増やせる、そんな貴重な勉強会だったと思います。&lt;/p&gt;
&lt;p&gt;また、もちろんSymfony以外のフレームワークの話や、オブジェクト指向ってみんな言ってるけど、その本質って何だっけ？とかいう話まで聞けちゃうというとってもお得な勉強会。&lt;br /&gt;今回参加できなかった方は、機会があれば次回以降に是非！&lt;br /&gt;そして、勉強会本編には参加したけど、懇親会は参加できなかった、という方は次は絶対に懇親会も参加してみてくださいね。&lt;br /&gt;Symfony勉強会の懇親会は本編に増して素敵な話を聞けますよ。&lt;/p&gt;
&lt;p&gt;ということで、Symfony勉強会に参加して、もっと勉強しなきゃなと思っている今日この頃です。&lt;/p&gt;
&lt;p&gt;会場を提供していただいたVoyage Groupさん、ありがとうございました。そして、スピーカーの皆さん、参加者の皆さん、スタッフの皆さん、本当にお疲れ様でした！&lt;/p&gt;
&lt;h4&gt;Symfony温泉？&lt;/h4&gt;
&lt;p&gt;さて、Symfonyユーザー会では、過去何度か温泉旅行に行っています。&lt;br /&gt;これは、Symfonyドキュメント周りの翻訳を一気に進めるために、有志で温泉に行って泊まりがけでドキュメントを翻訳しようぜ、というものなのですが、今年もSymfony勉強会で「Symfony温泉まだ？」という話も出始めているので、きっとSymfonyのイケメンさんが計画してくれるはず。&lt;/p&gt;
&lt;p&gt;ということで、Symfonyコンポーネントの勉強も兼ねてちょっとしたツール（Symfony2ドキュメントの翻訳差分をチェックするツール）を作ってみました。&lt;/p&gt;
&lt;ul style=&quot;text-align: -webkit-auto;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/madapaja/prompter&quot;&gt;https://github.com/madapaja/prompter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Symfony2の日本語のドキュメントは、オリジナルのドキュメント更新と付き合わせられるように、そのコメント内にコミットハッシュを書いてあります。なので差分を翻訳する際には、そこに記載されているコミットハッシュとオリジナルドキュメントのHEADのdiffをとって云々……という事をしないといけないのですが、いかんせんそれが面倒なので、ちゃちゃっとコマンドを作りました。&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a style=&quot;margin-left: 1em; margin-right: 1em;&quot; href=&quot;http://1.bp.blogspot.com/-mTAWAOxRLt0/T_larlLep1I/AAAAAAAAGgA/eu71UVFJkDE/s1600/1.png&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/-mTAWAOxRLt0/T_larlLep1I/AAAAAAAAGgA/eu71UVFJkDE/s640/1.png&quot; alt=&quot;&quot; width=&quot;640&quot; height=&quot;476&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;./prompter/prompter check ./symfony-docs ./symfony-docs-ja&lt;/pre&gt;
&lt;p&gt;などという風に、オリジナルと日本語のドキュメントのルートを渡すと、各ファイルの翻訳状況がずらーっと表示されます。（画像の白が翻訳されているもの、黄色が更新されているもの、青が不明なもの、赤が一方のファイルがないもの）&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a style=&quot;margin-left: 1em; margin-right: 1em;&quot; href=&quot;http://4.bp.blogspot.com/-ixtfwXfabvE/T_larWHXxrI/AAAAAAAAGf8/uCpmeMDdr_E/s1600/2.png&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/-ixtfwXfabvE/T_larWHXxrI/AAAAAAAAGf8/uCpmeMDdr_E/s640/2.png&quot; alt=&quot;&quot; width=&quot;640&quot; height=&quot;262&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;./prompter/prompter check ./symfony-docs/book/controller.rst ./symfony-docs-ja/book/controller.rst&lt;/pre&gt;
&lt;p&gt;のようにファイル名まで指定すれば、そのファイルの詳細な状態を確認する事も出来ます。&lt;/p&gt;
&lt;p&gt;使用した Symfonyコンポーネントは、&lt;a href=&quot;http://docs.symfony.gr.jp/symfony2/components/console.html&quot;&gt;Consoleコンポーネント&lt;/a&gt;、&lt;a href=&quot;http://docs.symfony.gr.jp/symfony2/components/finder.html&quot;&gt;Finderコンポーネント&lt;/a&gt;、&lt;a href=&quot;http://docs.symfony.gr.jp/symfony2/components/process.html&quot;&gt;Processコンポーネント&lt;/a&gt;の3つ。&lt;br /&gt;見た目にも綺麗なコンソールアプリを作るためにConsoleコンポーネントを、ディレクトリ内のファイルの操作にFinderコンポーネントを、Gitコマンドをサブプロセスとして簡単に実行するためにProcessコンポーネントを使ってみました。&lt;/p&gt;
&lt;p&gt;Symfonyコンポーネントは単体で簡単に利用できることは知っていたものの、実際にこういう形で使ったことが無かったのですが、とても簡単に利用出来ました。&lt;/p&gt;
&lt;p&gt;本当はコンポーネントの使い方を…と思ったのですが、長くなりそうなので別の機会に紹介したいと思います。&lt;/p&gt;
&lt;h4&gt;勉強会レポート&lt;/h4&gt;
&lt;p&gt;Symfony勉強会 #6 のレポートをリンクしておきます。漏れなどありましたら、教えてください！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.symfony.gr.jp/blog/20120630-symfony2-workshop6-report&quot;&gt;Symfony勉強会 #6 レポート | 日本Symfonyユーザー会&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://togetter.com/li/330883&quot;&gt;Symfony勉強会 #6 まとめ #Symfony2Study - Togetter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://phpmentors.jp/post/26269116927/symfony-6-symfony&quot;&gt;PHPメンターズ -&amp;gt; Symfony勉強会#6でSymfonyとドメイン駆動の話、モックによるオブジェクト指向の話をしてきました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/brtRiver/20120702/1341242008&quot;&gt;Symfony勉強会 #6 が無事終了！！ - ぷぎがぽぎ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fivestar.hatenablog.com/entry/2012/07/02/112931&quot;&gt;Symfony勉強会#6で効率本の紹介などをしてきました - Fivestar&#39;s blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.karakaram.com/diary/symfony-study6-1/&quot;&gt;Symfony勉強会 #6 に参加してきた | karakaram-blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.karakaram.com/diary/symfony-study6-2/&quot;&gt;Symfony勉強会 #6 LTの補足 コントローラのテストを短くする試み | karakaram-blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.tojiru.net/article/278307117.html&quot;&gt;PSR-0はなぜ0（≒最重要）なのか - 泥のように&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pneskin2.nekoget.com/press/?p=781&quot;&gt;ねこげっとぷれす » Symfony勉強会 #6 に参加しました&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.0yen-coding.com/blog/2012/07/01/symfony%E5%8B%89%E5%BC%B7%E4%BC%9A-6%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82/&quot;&gt;Symfony勉強会 #6に参加しました。 | Regelog2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/y_guriko/20120705/p1&quot;&gt;Symfony勉強会 #6 at VOYAGE GROUP に参加してきた | 高橋です&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/16dcc2f205d6846dbf46a01c6b5c6be9301390ed/backend=imagemagick;version=1;width=1300/http%3A%2F%2F1.bp.blogspot.com%2F-mTAWAOxRLt0%2FT_larlLep1I%2FAAAAAAAAGgA%2Feu71UVFJkDE%2Fs640%2F1.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>選択範囲のテキストを操作する jQuery.selection を更新して github に移行しました</title>
        <link href="https://blog.madapaja.net/entry/2012/05/09/070500"/>
        <id>hatenablog://entry/8454420450093083796</id>
        <published>2012-05-09T07:05:00+09:00</published>
        <updated>2012-05-09T07:05:00+09:00</updated>        <summary type="html">昔作った、選択範囲のテキストを操作するための jQuery プラグイン jQuery.selection が長らく放置されていたのですが、使っていただいている方もいるようなので、メンテナンスして github にあげました。メンテナンスの過程で、メソッド名を大幅に変更してしまいましたが。。。 jQuery.selection とは選択範囲のテキストを操作するための jQuery プラグインです。テキスト選択（キャレット）位置や、選択テキストを取得したり、選択されているテキストの置き換えや挿入などを行えます。詳細は 紹介ページ内のデモ をご覧ください。 変更点IE でテキストボックスの選択範囲（…</summary>
        <content type="html">&lt;p&gt;昔作った、選択範囲のテキストを操作するための &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt; &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3&quot;&gt;プラグイン&lt;/a&gt; &lt;a href=&quot;http://madapaja.github.com/jquery.selection/&quot;&gt;jQuery.selection&lt;/a&gt; が長らく放置されていたのですが、使っていただいている方もいるようなので、メンテナンスして &lt;a href=&quot;http://madapaja.github.com/jquery.selection/&quot;&gt;github&lt;/a&gt; にあげました。&lt;br /&gt;&lt;br /&gt;メンテナンスの過程で、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;名を大幅に変更してしまいましたが。。。 &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt;.selection とは&lt;/h4&gt;選択範囲のテキストを操作するための &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt; &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3&quot;&gt;プラグイン&lt;/a&gt;です。&lt;br /&gt;テキスト選択（キャレット）位置や、選択テキストを取得したり、選択されているテキストの置き換えや挿入などを行えます。&lt;br /&gt;&lt;br /&gt;詳細は &lt;a href=&quot;http://madapaja.github.com/jquery.selection/&quot;&gt;紹介ページ&lt;/a&gt;内の&lt;a href=&quot;http://madapaja.github.com/jquery.selection/#demo&quot;&gt;デモ &lt;/a&gt;をご覧ください。 &lt;h4&gt;変更点&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/IE&quot;&gt;IE&lt;/a&gt; でテキストボックスの選択範囲（キャレット情報）を取れない問題を修正&lt;/li&gt;&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;名などを大幅に変更&lt;/li&gt;&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/QUnit&quot;&gt;QUnit&lt;/a&gt; のテストを追加&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;リンク&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/madapaja/jquery.selection&quot;&gt;Github のプロジェクトページ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://madapaja.github.com/jquery.selection/&quot;&gt;jQuery.selection 紹介ページ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/madapaja/jquery.selection/wiki/API&quot;&gt;jQuery.selection API&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;ということで、バグなどあれば issue を挙げていただくか、コードを直して pull request ください！&lt;br /&gt;よろしくお願いします。&lt;/p&gt;</content>        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450093083796/1430357592" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>PHP5.4 で Symfony2 は速くなるのか？</title>
        <link href="https://blog.madapaja.net/entry/2011/12/07/001200"/>
        <id>hatenablog://entry/8454420450093083785</id>
        <published>2011-12-07T00:12:00+09:00</published>
        <updated>2011-12-07T00:12:00+09:00</updated>        <summary type="html">Symfony Advent Calendar JP 2011 7日目です。6日は @uechoco さんによる [Symfony2]入出力の文字エンコードを変換してみよう Symfony Advent Calender JP 2011 – 6日目- でした。 さて、@uechoco さんから「MongoDB JPにも所属している@madapajaさん」と紹介いただき、これは MongoDB ネタをやれってことかな？とか考えてしまいましたが、今回は PHP5.4 がらみのことを。 PHP5.4 は速くなっているらしいと風の噂で聞いたものの、Symfony2 は速くなるのかなと思ったので試してみ…</summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://atnd.org/events/22378&quot;&gt;Symfony Advent Calendar JP 2011&lt;/a&gt; 7日目です。&lt;br /&gt;6日は &lt;a href=&quot;https://twitter.com/uechoco&quot;&gt;@uechoco&lt;/a&gt; さんによる &lt;a href=&quot;http://labs.uechoco.com/blog/2011/12/symfony2-convert-input-or-output-encoding.html&quot;&gt;[Symfony2]入出力の文字エンコードを変換してみよう Symfony Advent Calender JP 2011 – 6日目-&lt;/a&gt; でした。&lt;/p&gt;
&lt;p&gt;さて、@uechoco さんから「MongoDB JPにも所属している@madapajaさん」と紹介いただき、これは MongoDB ネタをやれってことかな？とか考えてしまいましたが、今回は PHP5.4 がらみのことを。&lt;/p&gt;
&lt;p&gt;PHP5.4 は速くなっているらしいと風の噂で聞いたものの、Symfony2 は速くなるのかなと思ったので試してみました。&lt;br /&gt;環境によって結果が異なると思いますが、今回は Symfony2 本体のテスト速度を計測してみます。&lt;br /&gt;今回テストに用いた環境は下記の通りです。&lt;/p&gt;


&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;サーバー&lt;/th&gt;
&lt;td&gt;さくらのVPS 512&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;OS&lt;/th&gt;
&lt;td&gt;Ubuntu 10.04.3 LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;PHP&lt;/th&gt;
&lt;td&gt;
&lt;ul&gt;
&lt;li&gt;5.3.8&lt;/li&gt;
&lt;li&gt;5.3.9 RC2&lt;/li&gt;
&lt;li&gt;5.4.0 RC2&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PHP はすべて下記のconfigureオプションを用いてコンパイルしました。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;  --with-openssl \&lt;br /&gt;  --with-pcre-regex \&lt;br /&gt;  --with-zlib \&lt;br /&gt;  --with-mhash \&lt;br /&gt;  --with-xsl \&lt;br /&gt;  --enable-intl \&lt;br /&gt;  --enable-mbstring \&lt;br /&gt;  --with-mcrypt \&lt;br /&gt;  --enable-pcntl \&lt;br /&gt;  --with-libedit \&lt;br /&gt;  --with-readline \&lt;br /&gt;  --with-pear \&lt;br /&gt;  --disable-debug&lt;/pre&gt;
&lt;p&gt;PHPUnit をインストール。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ ./php-5.X/bin/pear channel-discover pear.phpunit.de&lt;br /&gt;$ ./php-5.X/bin/pear channel-discover components.ez.no&lt;br /&gt;$ ./php-5.X/bin/pear channel-discover pear.symfony-project.com&lt;br /&gt;$ ./php-5.X/bin/pear install phpunit/PHPUnit&lt;/pre&gt;
&lt;p&gt;最後に最低限の php.ini を設定します。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;extension=apc.so&lt;br /&gt;&lt;br /&gt;short_open_tag = Off&lt;br /&gt;magic_quotes_gpc = Off&lt;br /&gt;&lt;br /&gt;[Date]&lt;br /&gt;date.timezone = Asia/Tokyo&lt;/pre&gt;
&lt;p&gt;念のためバージョンを確認。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ ./php-5.3.8/bin/php -v&lt;br /&gt;PHP 5.3.8 (cli) (built: Dec  3 2011 16:37:19)&lt;br /&gt;Copyright (c) 1997-2011 The PHP Group&lt;br /&gt;Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies&lt;br /&gt;&lt;br /&gt;$ ./php-5.3.9RC2/bin/php -v&lt;br /&gt;PHP 5.3.9RC2 (cli) (built: Dec  3 2011 16:45:05)&lt;br /&gt;Copyright (c) 1997-2011 The PHP Group&lt;br /&gt;Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies&lt;br /&gt;&lt;br /&gt;$ ./php-5.4.0RC2/bin/php -v&lt;br /&gt;PHP 5.4.0RC2 (cli) (built: Dec  3 2011 16:55:22)&lt;br /&gt;Copyright (c) 1997-2011 The PHP Group&lt;br /&gt;Zend Engine v2.4.0, Copyright (c) 1998-2011 Zend Technologies&lt;/pre&gt;
&lt;h1&gt;いざ、テスト！&lt;/h1&gt;
&lt;p&gt;テストは、&lt;a href=&quot;https://github.com/symfony/symfony&quot;&gt;symfony/symfony - GitHub&lt;/a&gt; から clone して、&lt;code&gt;vendors.php&lt;/code&gt; でベンダーファイルをインストールしたら、phpunit と叩くだけです。&lt;br /&gt;今回は、PHP 5.3.8 → 5.3.9RC2 → 5.4.0RC2 の順でテストを実行させ、それを11周実行することにしました。そのうちの、1サイクル目を除いた10サイクル分の結果を比較してみます。（なお、テスト間は 5秒の sleep を入れてあります。）&lt;/p&gt;
&lt;p&gt;では実行結果です。じゃじゃーん。&lt;br /&gt;PHPUnit で表示される秒数とメモリ（Mb）の平均です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt; &lt;/th&gt;&lt;th&gt;Time (Sec.)&lt;/th&gt;&lt;th&gt;Memory (Mb)&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;PHP 5.3.8&lt;/th&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;19.6&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;264.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;PHP 5.3.9RC2&lt;/th&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;19.0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;191.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;PHP 5.4.0RC2&lt;/th&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;14.2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;136.8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;結果は明白ですが、一応グラフも。数値が低い方がベターなのは言うまでもありません。&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/-z5Rv3FqQTOs/Tt3CtTHFpwI/AAAAAAAAABg/gVqVpYRCIb4/s1600/time.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;http://2.bp.blogspot.com/-bLMPHCmRTtk/Tt3CtkgsXzI/AAAAAAAAABs/hy8Xn902c1c/s1600/memory.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
&lt;p&gt;PHP 5.4.0 の方が時間、メモリ共に効率がよくなっているようです。PHP 5.3.8 と 5.3.9 の比較では時間はさほど変わりませんでしたが、メモリの使用量は減っていますね。&lt;br /&gt;構成や設定など環境や使い方によって結果は異なってくるかと思いますが、PHP 5.4 のリリースも楽しみにしたいと思いました。&lt;/p&gt;
&lt;h1&gt;PHP 5.4.0RC2 で謎のセグフォ&lt;/h1&gt;
&lt;p&gt;PHP 5.4.0RC2 でテストを実行したら、テストの途中で Segmentation Fault で落ちるという事態が発生しました。&lt;br /&gt;あーだこーだと悩んだ挙句に下記の変更で無理やり回避出来ることがわかりました。&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;// src/Symfony/Component/HttpKernel/Kernel.php&lt;br /&gt;    :&lt;br /&gt;&lt;br /&gt;    // 530行目あたり&lt;br /&gt;    protected function initializeContainer()&lt;br /&gt;    {&lt;br /&gt;        $class = $this-&amp;gt;getContainerClass();&lt;br /&gt;        $cache = new ConfigCache($this-&amp;gt;getCacheDir().&#39;/&#39;.$class.&#39;.php&#39;, $this-&amp;gt;debug);&lt;br /&gt;        $fresh = true;&lt;br /&gt;        if (!$cache-&amp;gt;isFresh()) {&lt;br /&gt;            $container = $this-&amp;gt;buildContainer();&lt;br /&gt;            $this-&amp;gt;dumpContainer($cache, $container, $class, $this-&amp;gt;getContainerBaseClass());&lt;br /&gt;&lt;br /&gt;            $fresh = false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        usleep(0); ///&amp;lt; これを追加&lt;br /&gt;&lt;br /&gt;        require_once $cache;&lt;br /&gt;        $this-&amp;gt;container = new $class();&lt;br /&gt;        $this-&amp;gt;container-&amp;gt;set(&#39;kernel&#39;, $this);&lt;br /&gt;    :&lt;/pre&gt;
&lt;p&gt;もちろんこれは根本的な解決ではなく、そして Symfony2 のバグでもなく、PHPか、そのモジュールか、環境によるバグだと思われます。&lt;br /&gt;とりあえず、Symfony2 のバグでは無さそうだ、という事を確認しただけで調べていないのですが、とりあえず、私の環境では上記の行にシステムコール（というのが正しいのか分かりませんが、sleepとかfopenとか）があるとセグフォらない、という状況でした。&lt;/p&gt;
&lt;blockquote&gt;（追記）&lt;br /&gt;この問題が発生したのは、SecurityBundle の機能テストのみです。（具体的には下記テストの実行でセグフォ）&lt;br /&gt;src/Symfony/Bundle/SecurityBundle/Tests/Functional/FormLoginTest.php&lt;br /&gt;src/Symfony/Bundle/SecurityBundle/Tests/Functional/LocalizedRoutesAsPathTest.php&lt;br /&gt;src/Symfony/Bundle/SecurityBundle/Tests/Functional/SecurityRoutingIntegrationTest.php&lt;/blockquote&gt;
&lt;p&gt;さあ、明日の Symfony Advent Calendar JP 2011、第8話 は &lt;a href=&quot;https://twitter.com/yuchimiri&quot;&gt;@yuchimiri&lt;/a&gt; さんです！&lt;br /&gt;お楽しみに！&lt;/p&gt;</content>        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/8c6e6ef869599d799884dd0a56022de544d4fac9/backend=imagemagick;version=1;width=1300/http%3A%2F%2F4.bp.blogspot.com%2F-z5Rv3FqQTOs%2FTt3CtTHFpwI%2FAAAAAAAAABg%2FgVqVpYRCIb4%2Fs1600%2Ftime.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>PHP5.4+ で開発が行われている BEAR.Sunday フレームワークを動かしてみる</title>
        <link href="https://blog.madapaja.net/entry/2011/12/06/011200"/>
        <id>hatenablog://entry/8454420450093083768</id>
        <published>2011-12-06T01:12:00+09:00</published>
        <updated>2011-12-06T01:12:00+09:00</updated>        <summary type="html">PHP5.4 Advent Calendar 2011 6日目です。5日は @chobi_e さんによる 5.4のSession周りの変更について でした。さて、勢いにまかせて Advent Calender に名乗り出たもののネタをどうしようか、と思っていたら、先日開催された Symfony 勉強会兼忘年会 で @koriym 師匠に出会いいたく感銘を受けました。そこで、@koriym さんが開発をされている BEAR.Sunday を動かしてみたいと思います。</summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://atnd.org/events/22473&quot;&gt;PHP5.4 Advent Calendar 2011&lt;/a&gt; 6日目です。&lt;br /&gt;5日は &lt;a href=&quot;https://twitter.com/chobi_e&quot;&gt;@chobi_e&lt;/a&gt; さんによる &lt;a href=&quot;http://chobie.hatenablog.com/entry/2011/12/05/000323&quot;&gt;5.4のSession周りの変更について&lt;/a&gt; でした。&lt;br /&gt;&lt;br /&gt;さて、勢いにまかせて Advent Calender に名乗り出たもののネタをどうしようか、と思っていたら、先日開催された &lt;a href=&quot;http://www.symfony.gr.jp/events/20111114-symfony-study5&quot;&gt;Symfony 勉強会兼忘年会&lt;/a&gt; で &lt;a href=&quot;https://twitter.com/koriym&quot;&gt;@koriym&lt;/a&gt; 師匠に出会いいたく感銘を受けました。&lt;br /&gt;そこで、&lt;a href=&quot;https://twitter.com/koriym&quot;&gt;@koriym&lt;/a&gt; さんが開発をされている &lt;a href=&quot;https://github.com/koriym/BEAR.Sunday&quot;&gt;BEAR.Sunday&lt;/a&gt; を動かしてみたいと思います。&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.bear-project.net/&quot;&gt;BEAR&lt;/a&gt; はリソース指向の PHP フレームワークで、現行のバージョンは &lt;a href=&quot;https://github.com/koriym/BEAR.Saturday&quot;&gt;BEAR.Saturday&lt;/a&gt; というコードネーム（？）で開発されています。&lt;br /&gt;その次期バージョンとして PHP 5.4+ で開発が行われているのが &lt;a href=&quot;https://github.com/koriym/BEAR.Sunday&quot;&gt;BEAR.Sunday&lt;/a&gt; です。&lt;/p&gt;
&lt;blockquote&gt;※下記は開発中のバージョンに対しての動作結果になりますので、下記のとおり行っても動かなかったり、今後構造が変更される可能性が高いです。&lt;/blockquote&gt;
&lt;p&gt;インストールは下記のコマンドで行えます。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;$ git clone git://github.com/koriym/BEAR.Sunday.git&lt;br /&gt;$ cd BEAR.Sunday&lt;/pre&gt;
&lt;p&gt;現在の最新は dev2 ブランチのようです。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;$ git checkout -b dev2 origin/dev2&lt;br /&gt;$ git submodule update --init&lt;/pre&gt;
&lt;p&gt;サンプルアプリケーションを動かすには下記のようにします。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;$ php apps/01-helloworld/htdocs/index.php get /Hello &lt;br /&gt;[HEADER]X-Cache-Since: Tue, 06 Dec 2011 00:54:15 +0900 (15120)&lt;br /&gt;[HEADER]X-Request-Per-Second: 0&lt;br /&gt;[HEADER]X-Memory-Peak-Usage: 1,310,720&lt;br /&gt;[BODY]&lt;br /&gt;&lt;br /&gt;    Hello World&lt;/pre&gt;
&lt;h1&gt;ビルトインウェブサーバー対応&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://php.net/manual/ja/features.commandline.webserver.php&quot;&gt;ビルトインウェブサーバー&lt;/a&gt;にも対応予定で、開発やデバッグに活用できることになるかと思います。&lt;br /&gt;&lt;br /&gt;実はここで実際に動かしてみようと思ったのですが、私の環境+取得したバージョンではうまく動きませんでした……。（devブランチ版では動いたのですが）&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;http://jp2.php.net/manual/ja/language.oop5.traits.php&quot;&gt;Trait&lt;/a&gt; によるページ単位でのテンプレートエンジン選択&lt;/h1&gt;
&lt;blockquote&gt;（2012/07/13追記）&lt;br /&gt;コメント欄で、開発者でもある @koriym 氏より指摘いただきましたが、この機能は現在（2012/07/13）、DIによる「テンプレートエンジンの注入」に変更されています。&lt;br /&gt;以下は執筆当時の内容となりますのでご注意ください。&lt;/blockquote&gt;
&lt;p&gt;BEAR.Sunday の現在の実装では、Trait を用いてページ単位でテンプレートエンジンを変更することが可能です。&lt;br /&gt;&lt;br /&gt;apps/02-template-engine/Page 配下に Page リソースがあり、4つのテンプレートエンジンの切り替えのサンプルが実装されています。&lt;br /&gt;以下の2つのテンプレートエンジンの例を見れば分かる通りなのですが、基本的に変更されているのは、10行目の &lt;a href=&quot;http://jp2.php.net/manual/ja/language.oop5.traits.php&quot;&gt;Trait&lt;/a&gt; の利用を指定する use 文のみです。&lt;br /&gt;&lt;a href=&quot;http://jp2.php.net/manual/ja/language.oop5.traits.php&quot;&gt;Trait&lt;/a&gt; によって、疎結合になり水平方向に展開されている（BEAR.Sunday の開発方針の一つとして「継承より合成を好む」と語られています）のが見て取れます。何をどうしているのか、が初めてこのコードを見ても直感的に分かる、というのも重要なポイントですね。 &lt;br /&gt;テンプレートエンジンに PHP を使ったページ&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;namespace template\Page;&lt;br /&gt;&lt;br /&gt;use BEAR\Resource\Object as ResourceObject,&lt;br /&gt;    BEAR\Resource\AbstractObject as Page,&lt;br /&gt;    BEAR\Resource\Resource;&lt;br /&gt;&lt;br /&gt;class Php extends Page&lt;br /&gt;{&lt;br /&gt;    use BEAR\Framework\Link\View\Php; ///&amp;lt;&lt;br /&gt;&lt;br /&gt;    public function __construct()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;    :&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;テンプレートエンジンに Twig を使ったページ&lt;/p&gt;
&lt;pre class=&quot;brush:php&quot;&gt;namespace template\Page;&lt;br /&gt;&lt;br /&gt;use BEAR\Resource\Object as ResourceObject,&lt;br /&gt;    BEAR\Resource\AbstractObject as Page,&lt;br /&gt;    BEAR\Resource\Resource;&lt;br /&gt;&lt;br /&gt;class Twig extends Page&lt;br /&gt;{&lt;br /&gt;    use BEAR\Framework\Link\View\Twig; ///&amp;lt;&lt;br /&gt;&lt;br /&gt;    public function __construct()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;    :&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;まもなくデビューする PHP5.4 と併せて PHP5.4+ なフレームワークも要注目です！&lt;br /&gt;&lt;br /&gt;BEAR 自体を紹介することは出来ませんでしたが、非常に興味深いフレームワークであり、コードを読むと様々なチャレンジが凝縮されているのがよくわかります。&lt;br /&gt;Symfony 勉強会でも、グローバル変数や、goto 文の使用などが注目されていましたが、開発&quot;慣れ&quot;している方にとっては、ハッと思わされるような事が多くあります。ただ、BEAR.Sunday では「敢えて」そのように書かれており、その背景には深い考察があります。&lt;br /&gt;&lt;br /&gt;BEAR(Sunday) に興味を持った方は、下記ブログなどで設計思想や設計方針が語られていますので、是非そちらもチェックしてみてくださいね。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bear-project.net/blog/2011/07/bear-sunday/&quot;&gt;BEAR (Sunday) « BEAR Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/koriym/BEAR.Sunday/wiki/Overall-Design-Principles&quot;&gt;Overall Design Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bear-project.net/blog/2011/07/bear1-to-saturday/&quot;&gt;BEAR1 to Saturday (2003, 2011) « BEAR Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/koriym&quot;&gt;@koriym&lt;/a&gt; さんは「PHP は&lt;strong&gt;スクリプト&lt;/strong&gt;言語です」とも投げかけていました。これについては、昨日 &lt;a href=&quot;https://twitter.com/BEARSunday&quot;&gt;@BEARSunday&lt;/a&gt; でつぶやかれていましたので興味のある方はそちらも要チェックですよ。 &lt;br /&gt;&lt;br /&gt;さて、PHP5.4 Advent Calender 7日目は &lt;a href=&quot;https://twitter.com/Hiraku&quot;&gt;@Hiraku&lt;/a&gt; さんです！&lt;/p&gt;</content>        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450093083768/1430360228" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>2.0 からはじめる MongoDB - 第1回 #mongodbjp</title>
        <link href="https://blog.madapaja.net/entry/2011/09/21/000900"/>
        <id>hatenablog://entry/8454420450093083749</id>
        <published>2011-09-21T00:09:00+09:00</published>
        <updated>2011-09-21T00:09:00+09:00</updated>        <summary type="html">勉強会用の名刺が届いてウハウハ（？）な @madapaja です。関連記事もどうぞ 2.0 からはじめる MongoDB 第0回 MongoDB の紹介 第1回 インストール～シェルと戯れる 【番外編】MongoDB の歴史（MongoDB 2.0 まで） この連載では MongoDB をこれからはじめる方に向けて、MongoDB 2.0 で追加された機能を含んだ、MongoDB 全体を広くご紹介していきたいと思っています。 今回のアジェンダ なぜ MongoDB か MongoDB のインストール MongoDB シェルと戯れる</summary>
        <content type="html">&lt;p&gt;勉強会用の名刺が届いてウハウハ（？）な @madapaja です。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;関連記事もどうぞ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2.0 からはじめる MongoDB
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-0.html&quot;&gt;第0回 MongoDB の紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-1-mongodbjp.html&quot;&gt;第1回 インストール～シェルと戯れる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;【番外編】&lt;a href=&quot;http://blog.madapaja.net/2011/09/mongodb-mongodb-20-mongodbjp.html&quot;&gt;MongoDB の歴史（MongoDB 2.0 まで）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この連載では MongoDB をこれからはじめる方に向けて、MongoDB 2.0 で追加された機能を含んだ、MongoDB 全体を広くご紹介していきたいと思っています。&lt;/p&gt;
&lt;h4&gt;今回のアジェンダ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;なぜ MongoDB か&lt;/li&gt;
&lt;li&gt;MongoDB のインストール&lt;/li&gt;
&lt;li&gt;MongoDB シェルと戯れる&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;なぜ MongoDB か&lt;/h4&gt;
&lt;p&gt;MongoDB はここ1～2年で注目が高まった、NOSQL（Not Only SQL）と呼ばれる、“非”RDBMS（Relational DataBase Management System）なデータベースの一つです。&lt;br /&gt;様々な所で議論されているように、NOSQL データベースは既存の RDBMS に完全に置き換わる存在ではなく、それぞれの長所・短所を理解した上で、RDBMS と NOSQL をうまく組み合わせることで、より柔軟でスケールしやすいシステムを作ることが可能でしょう。&lt;br /&gt;&lt;br /&gt;さて、その NOSQL の中でも MongoDB が注目されている理由は、その「簡単さ」にあるでしょう。MongoDB にはインストール、運用、クエリ（問い合わせ）、インデックスなど様々な点でエンジニアが思ったことを実現する機能が充実しています。特にクエリやインデックスの機能については、柔軟で豊富なクエリと、どの属性に対してもインデックスを作成できるフル・インデックスのサポートにより、既存の RDBMS からの移行でも戸惑うことなく開発に専念させてくれます。&lt;br /&gt;&lt;br /&gt;もう少し後押しするために、採用実績にも触れておこうと思います。&lt;br /&gt;採用実績は、&lt;a href=&quot;http://www.mongodb.org/display/DOCS/Production+Deployments&quot; target=&quot;_blank&quot;&gt;公式サイトの Production Deployments&lt;/a&gt; に掲載されていますので、その中からいくつかピックアップしてご紹介します。&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Disney&lt;/dt&gt;
&lt;dd&gt;インタラクティブメディアグループ内のすべてのゲームの共通のツールと API の、ステータス情報を保持するコモン・オブジェクト・リポジトリとして MongoDB が使われています。&lt;/dd&gt;
&lt;dt&gt;foursquare&lt;/dt&gt;
&lt;dd&gt;位置ベースのソーシャルネットワークである foursquare は、場所と場所へのユーザー「チェックイン」を保持するために、MongoDB が使われています。&lt;/dd&gt;
&lt;dt&gt;bit.ly&lt;/dt&gt;
&lt;dd&gt;リンクの短縮、シェアとトラッキングを行える bit.ly では、MongoDB がユーザー履歴を保持するために使われています。&lt;/dd&gt;
&lt;dt&gt;SourceForge&lt;/dt&gt;
&lt;dd&gt;MongoDB が SourceForge の全プロジェクトのフロントページ、プロジェクトページ、ダウンロードページのバックエンドストレージとして使われています。&lt;/dd&gt;
&lt;dt&gt;github&lt;/dt&gt;
&lt;dd&gt;ソーシャルコーディングサイトの GitHub では、内部のリポーティングアプリケーションで MongoDB が使われています。&lt;/dd&gt;
&lt;dt&gt;株式会社プリファードインフラストラクチャー&lt;/dt&gt;
&lt;dd&gt;株式会社プリファードインフラストラクチャーの、様々な検索ニーズに対応する“統合検索プラットフォーム”Sedue（セデュー）では、現在、MongoDB を使用して柔軟性、可用性の高い方法でドキュメントが保存されています。&lt;/dd&gt;
&lt;dt&gt;CyberAgent, Inc.&lt;/dt&gt;
&lt;dd&gt;CyberAgent, Inc. では、Ameba Pico（ピグの海外版）、Ameba tappie（タッピー）サービスにて MongoDB が使われています。&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;では、そろそろ実際に MongoDB を触れて、その世界を体験していただきたいと思います。&lt;br /&gt;MongoDB が&lt;strong&gt;柔軟&lt;/strong&gt;で、&lt;strong&gt;パワー&lt;/strong&gt;があり、&lt;strong&gt;スピード&lt;/strong&gt;が出て、&lt;strong&gt;簡単に使える&lt;/strong&gt;ように設計されている、ということを&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-0.html&quot;&gt;第0回&lt;/a&gt;から紹介してきたわけですが、その思想は至る所に現れています。&lt;br /&gt;もちろんインストールやコンソールも例外ではありません。いかに簡単でパワフルかを触りながら実感して頂ければと思います。&lt;/p&gt;
&lt;h4&gt;MongoDB のインストール&lt;/h4&gt;
&lt;p&gt;MongoDB は様々なプラットフォームへ簡単にインストールできます。&lt;a href=&quot;http://www.mongodb.org/downloads&quot; target=&quot;_blank&quot;&gt;MongoDB ダウンロードページ&lt;/a&gt; には、Mac OS X、Linux、Windows、Solaris用のバイナリが提供されています。また、必要であればソースコードを自分でコンパイルすることもできます。&lt;br /&gt;ここでは、いくつかの OS へのインストール方法を紹介していきます。&lt;br /&gt;&lt;br /&gt;なお、各OS共に 32bit 版と 64bit 版の2種類が用意されていますが、64bit OS であれば 64bit 版のインストールを推奨します。32bit 版の MongoDB プロセスは、約 2.5GB のデータに制限されます。&lt;/p&gt;
&lt;h5&gt;Mac OS X へのインストール&lt;/h5&gt;
&lt;p&gt;Mac OS X へのインストールにはパッケージマネージャを使うのが楽です。ここでは、&lt;a href=&quot;http://mxcl.github.com/homebrew/&quot; target=&quot;_blank&quot;&gt;Homebrew&lt;/a&gt; でのインストール方法をご紹介します。&lt;br /&gt;&lt;a href=&quot;http://mxcl.github.com/homebrew/&quot; target=&quot;_blank&quot;&gt;Homebrew&lt;/a&gt; で MongoDB をインストールするには、ターミナルで下記のコマンドを実行します。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ brew update&lt;br /&gt;$ brew install mongodb&lt;/pre&gt;
&lt;p&gt;インストール時に表示されるメッセージに従って、インストールを完了させます。&lt;br /&gt;初めてのインストールで、ログイン時に自動起動させる場合は、以下のような感じになります。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ mkdir -p ~/Library/LaunchAgents&lt;br /&gt;$ cp /usr/local/Cellar/mongodb/2.0.0-x86_64/org.mongodb.mongod.plist ~/Library/LaunchAgents/&lt;br /&gt;$ launchctl load -w ~/Library/LaunchAgents/org.mongodb.mongod.plist&lt;/pre&gt;
&lt;h5&gt;Linux へのインストール&lt;/h5&gt;
&lt;p&gt;ここでは、パッケージを使ったインストール方法をご紹介します。&lt;/p&gt;
&lt;h6&gt;CentOS / Fedora へのインストール&lt;/h6&gt;
&lt;p&gt;yum リポジトリが提供されているので、お使いのシステムに合わせて &lt;code&gt;/etc/yum.repos.d/10gen.repo&lt;/code&gt; に下記を書いて、リポジトリを登録します。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;64bit 版&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;[10gen]&lt;br /&gt;name=10gen Repository&lt;br /&gt;baseurl=&lt;a href=&quot;http://downloads-distro.mongodb.org/repo/redhat/os/x86_64&quot;&gt;http://downloads-distro.mongodb.org/repo/redhat/os/x86_64&lt;/a&gt;&lt;br /&gt;gpgcheck=0&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;32bit 版&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;[10gen]&lt;br /&gt;name=10gen Repository&lt;br /&gt;baseurl=&lt;a href=&quot;http://downloads-distro.mongodb.org/repo/redhat/os/i686&quot;&gt;http://downloads-distro.mongodb.org/repo/redhat/os/i686&lt;/a&gt;&lt;br /&gt;gpgcheck=0&lt;/pre&gt;
&lt;p&gt;その後、yum でインストールし MongoDB サーバーを起動しましょう。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ sudo yum install mongo-10gen mongo-10gen-server&lt;br /&gt;$ sudo /etc/init.d/mongod start&lt;/pre&gt;
&lt;p&gt;なお、システム起動時に開始するようにしたい場合は、chkconfig コマンドで登録します。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ sudo chkconfig --add mongod&lt;/pre&gt;
&lt;h6&gt;Ubuntu へのインストール&lt;/h6&gt;
&lt;p&gt;apt リポジトリが提供されています。&lt;br /&gt;ここでは、最近の Ubuntu へのインストール方法を紹介しますが、 SysV 形式の init スクリプト（Debian Lenny や 古い Ubuntu）の場合は、 &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages#UbuntuandDebianpackages-gpgkey&quot;&gt;MongoDB マニュアルの Ubuntu and Debian packages&lt;/a&gt;を参照してください。&lt;br /&gt;&lt;br /&gt;最初に、下記のコマンドで GPG キーを登録します。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10&lt;/pre&gt;
&lt;p&gt;その後、&lt;code&gt;/etc/apt/source.list&lt;/code&gt; に下記を追記し、リポジトリを登録します。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;deb &lt;a href=&quot;http://downloads-distro.mongodb.org/repo/ubuntu-upstart&quot;&gt;http://downloads-distro.mongodb.org/repo/ubuntu-upstart&lt;/a&gt; dist 10gen&lt;/pre&gt;
&lt;p&gt;下記コマンドで MongoDB をインストールします。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ sudo apt-get update&lt;br /&gt;$ sudo apt-get install mongodb-10gen&lt;/pre&gt;
&lt;h5&gt;Windows へのインストール&lt;/h5&gt;
&lt;p&gt;Windows へのインストールは、インストーラなどがないため少しだけ作業が必要です。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.mongodb.org/downloads&quot; target=&quot;_blank&quot;&gt;MongoDB ダウンロードページ&lt;/a&gt; から、Windows 用のバイナリをダウンロードします。&lt;br /&gt;解凍すると「mongodb-win32-XXXX-2.0.0」のようなフォルダが出来るので、それを適当な場所に移動させます。（ここでは、mongo にフォルダ名を変え、c:\mongo に設置したものとします。）&lt;/p&gt;
&lt;h6&gt;データディレクトリの作成&lt;/h6&gt;
&lt;p&gt;エクスプローラなどで DB データが保存されるディレクトリを作成します。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;c:\data\db&lt;/pre&gt;
&lt;h6&gt;サービスとして登録する&lt;/h6&gt;
&lt;p&gt;Windowsキー + R で、&lt;code&gt;cmd&lt;/code&gt; と入力してコマンドプロンプトを表示し、以下のコマンドでサービスとして登録します。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;c:\&amp;gt; cd c:\mongo\bin&lt;br /&gt;c:\mongo\bin&amp;gt; mongod --install --logpath c:\mongo\logs --logappend --bind_ip 127.0.0.1&lt;/pre&gt;
&lt;p&gt;サービスとして登録されたら、以下のコマンドで MongoDB をスタートさせることができます。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;c:\mongo\bin &amp;gt; net start &quot;MongoDB&quot;&lt;/pre&gt;
&lt;h4&gt;MongoDB シェルと戯れる&lt;/h4&gt;
&lt;p&gt;さて、詳しくは次回より紹介していきますが、ここで終わるのもなんなので、少しだけ MongoDB シェルに触れて今回は終わることにしましょう。&lt;/p&gt;
&lt;h5&gt;MongoDB シェルの起動と終了&lt;/h5&gt;
&lt;p&gt;&amp;gt;MongoDB シェルの起動は、mongo コマンドで行います。&lt;/p&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;&lt;br /&gt;$ mongo&lt;/pre&gt;
&lt;p&gt;コマンドを実行すると、下記のように表示され MongoDB シェルのバージョン 2.0.0 が起動し、test データベースに接続されたことが分かります。&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;MongoDB shell version: 2.0.0&lt;br /&gt;connecting to: test&lt;br /&gt;&amp;gt;&lt;/pre&gt;
&lt;p&gt;また、MongoDB シェルを終了するには exit コマンドを入力します。&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;exit&lt;/pre&gt;
&lt;h5&gt;MongoDB シェルの特徴&lt;/h5&gt;
&lt;p&gt;MongoDB シェルは Firefox などの Javascript エンジンである SpiderMonkey を拡張した、Javascript シェルになります。今後の説明では特に明記がない限りは、このシェル上での実行例となります。&lt;br /&gt;では、まずシェル上で簡単な Javascript を実行してみたいと思います。&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;var data = []; // 配列を初期化&lt;br /&gt;&lt;br /&gt;for (var i = 0; i &amp;lt; 1000; i++) {&lt;br /&gt;  // 配列に num, text 値を持ったオブジェクトを追加&lt;br /&gt;  data.push({&lt;br /&gt;    num: i,&lt;br /&gt;    text: &#39;test&#39; + i&lt;br /&gt;  });&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;上記の例では、何も DB への操作をしていませんが、Javascript が実行されているため、&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;print(data.length);&lt;br /&gt;print(data[100].text);&lt;/pre&gt;
&lt;p&gt;と実行すると、&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;1000&lt;br /&gt;test100&lt;/pre&gt;
&lt;p&gt;とそれぞれ返って来ると思います。&lt;br /&gt;この機能は、テストデータを挿入する場合などにも非常に便利に使えるでしょう。&lt;br /&gt;&lt;br /&gt;では、少しだけ DB への操作もしてみましょう。&lt;br /&gt;MongoDB のコマンドやクエリを知らなくても、その雰囲気を感じていただければと思います。&lt;br /&gt;まずは、データの保存です。先ほどのデータを保存します。&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;use first_mongo; // DB の選択&lt;br /&gt;&lt;br /&gt;for (var i = 0; data.length; i++) {&lt;br /&gt;  db.test.save(data[i]);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;4 行目で保存をしているのが MongoDB を知らなくても何となく分かるかと思います。&lt;br /&gt;次にデータがきちんと保存されているかを確認したいと思います。まずは、データ件数を確認してみます。&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;db.test.count();&lt;/pre&gt;
&lt;p&gt;正常に保存されていれば、&lt;code&gt;1000&lt;/code&gt; と返って来るはずです。&lt;br /&gt;実際に保存されたデータも確認してみましょう。下記のコマンドで保存されたデータを取得します。&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;db.test.find();&lt;/pre&gt;
&lt;p&gt;すると、下記のように保存されているデータが返って来るはずです。（ObjectId という部分の値は環境によって異なります。）&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d1ff&quot;), &quot;num&quot; : 0, &quot;text&quot; : &quot;test0&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d200&quot;), &quot;num&quot; : 1, &quot;text&quot; : &quot;test1&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d201&quot;), &quot;num&quot; : 2, &quot;text&quot; : &quot;test2&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d202&quot;), &quot;num&quot; : 3, &quot;text&quot; : &quot;test3&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d203&quot;), &quot;num&quot; : 4, &quot;text&quot; : &quot;test4&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d204&quot;), &quot;num&quot; : 5, &quot;text&quot; : &quot;test5&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d205&quot;), &quot;num&quot; : 6, &quot;text&quot; : &quot;test6&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d206&quot;), &quot;num&quot; : 7, &quot;text&quot; : &quot;test7&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d207&quot;), &quot;num&quot; : 8, &quot;text&quot; : &quot;test8&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d208&quot;), &quot;num&quot; : 9, &quot;text&quot; : &quot;test9&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d209&quot;), &quot;num&quot; : 10, &quot;text&quot; : &quot;test10&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d20a&quot;), &quot;num&quot; : 11, &quot;text&quot; : &quot;test11&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d20b&quot;), &quot;num&quot; : 12, &quot;text&quot; : &quot;test12&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d20c&quot;), &quot;num&quot; : 13, &quot;text&quot; : &quot;test13&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d20d&quot;), &quot;num&quot; : 14, &quot;text&quot; : &quot;test14&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d20e&quot;), &quot;num&quot; : 15, &quot;text&quot; : &quot;test15&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d20f&quot;), &quot;num&quot; : 16, &quot;text&quot; : &quot;test16&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d210&quot;), &quot;num&quot; : 17, &quot;text&quot; : &quot;test17&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d211&quot;), &quot;num&quot; : 18, &quot;text&quot; : &quot;test18&quot; }&lt;br /&gt;{ &quot;_id&quot; : ObjectId(&quot;4e78ab3e4e6d38925bd6d212&quot;), &quot;num&quot; : 19, &quot;text&quot; : &quot;test19&quot; }&lt;br /&gt;has more&lt;/pre&gt;
&lt;p&gt;データ挿入時に指定していない &quot;_id&quot; という値が定義されている以外は、データが保存されているようです。&lt;br /&gt;なお、MongoDB シェルでは 1 画面で 20 件までのデータしか表示しません。その次のデータを見るためには &lt;code&gt;it&lt;/code&gt; （iterate の略）と入力する事で、次の 20 件のデータを表示します。&lt;br /&gt;&lt;br /&gt;それでは、今日はここで終わりですので、遊んだデータについては削除しておくことにしましょう。&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;use first_mongo;&lt;br /&gt;db.dropDatabase(); // first_mongo データベースを削除&lt;/pre&gt;
&lt;h4&gt;まとめ&lt;/h4&gt;
&lt;p&gt;今回は MongoDB をインストールし、実際に MongoDB シェルでいくつかの処理を行ってみました。&lt;br /&gt;まだ何も MongoDB について説明していないような気がしますが、その雰囲気だけでもつかんで頂ければと思います。&lt;br /&gt;&lt;br /&gt;さて、次回からは MongoDB シェルを使って MongoDB の様々な機能に入っていきたいと思います。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;関連記事もどうぞ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2.0 からはじめる MongoDB
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-0.html&quot;&gt;第0回 MongoDB の紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-1-mongodbjp.html&quot;&gt;第1回 インストール～シェルと戯れる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;【番外編】&lt;a href=&quot;http://blog.madapaja.net/2011/09/mongodb-mongodb-20-mongodbjp.html&quot;&gt;MongoDB の歴史（MongoDB 2.0 まで）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450093083749/1430360243" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>MongoDB の歴史（MongoDB 2.0 まで） #mongodbjp</title>
        <link href="https://blog.madapaja.net/entry/2011/09/14/180900"/>
        <id>hatenablog://entry/8454420450093083716</id>
        <published>2011-09-14T18:09:00+09:00</published>
        <updated>2011-09-14T18:09:00+09:00</updated>        <summary type="html">つい先日の9月12日、MongoDB 2.0 が正式にリリースされました。「2.0 から始める MongoDB」 という記事を書くにあたって、MongoDB 2.0までの遷移を調べていたのですが思いのほか濃い内容になってしまい、せっかくなのでここで皆さまに共有します。</summary>
        <content type="html">&lt;p&gt;つい先日の9月12日、&lt;a href=&quot;http://www.mongodb.org/&quot;&gt;MongoDB&lt;/a&gt; 2.0 が正式にリリースされました。&lt;br /&gt;「&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-0.html&quot;&gt;2.0 から始める MongoDB&lt;/a&gt;」 という記事を書くにあたって、MongoDB 2.0までの遷移を調べていたのですが思いのほか濃い内容になってしまい、せっかくなのでここで皆さまに共有します。&lt;/p&gt;


&lt;h4&gt;～2008年&lt;/h4&gt;
&lt;p&gt;Githubのレポジトリを見ると、ファーストコミットは2007年10月20日のこと。&quot;first commit&quot; というメッセージと共に30ファイル、計約2000行のコードがコミットされています。いつから開発が始まったかは定かではありませんが、2007年後半からプロジェクトがスタートしたと推測できます。&lt;br /&gt;（正確な情報をご存じの方がいましたら、教えてください。）&lt;br /&gt;&lt;a href=&quot;https://github.com/mongodb/mongo/commit/e73188b5512c82290a4070af4afddac20d0b981e&quot; target=&quot;_blank&quot;&gt;GitHub: mongodb/mongo - first commit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gitリポジトリのタグから察すると、2007年10月に最初のコミットが行われた後、2008年の6～7月には ver.0.0系、2008年下半期には ver.0.1系（rcのタグしかないのですが）を開発しており、MongoDB の基本的な機能を実装していたものと思われます。&lt;/p&gt;
&lt;h4&gt;2009年&lt;/h4&gt;
&lt;p&gt;2009年に入ると、ver.0.2系が2009年2月に、ver.0.9.0が 2009年4月にリリースされており、ver.1.0 に向けての最終調整に入る事になります。&lt;br /&gt;2009年の半ばくらいから、ちらほらと日本でもブログなどの記事として MongoDB が登場するようになってきます。&lt;br /&gt;また、この頃になると、プロジェクト管理ツールとして JIRA が導入されたようです。&lt;br /&gt;&lt;a href=&quot;https://jira.mongodb.org/browse/SERVER&quot; target=&quot;_blank&quot;&gt;MongoDB Core Server (JIRA)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;table style=&quot;width: 96%;&quot; align=&quot;center&quot;&gt;&lt;caption&gt;2009年 下半期&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th width=&quot;16.5%&quot;&gt;7月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;8月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;9月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;10月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;11月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;12月&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(07: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.0.9.6&lt;/span&gt;)&lt;br /&gt; (29: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.0.9.7&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;14: (&lt;span style=&quot;color: #34a62d;&quot;&gt;ver.0.9.8&lt;/span&gt;)&lt;br /&gt; 18: (&lt;span style=&quot;color: #34a62d;&quot;&gt;ver.0.9.9&lt;/span&gt;)&lt;br /&gt; 24: (&lt;span style=&quot;color: #34a62d;&quot;&gt;ver.0.9.10&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;27: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.0.0&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(14: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.1.0&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(01: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.1.1&lt;/span&gt;)&lt;br /&gt; (16: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.1.2&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;22: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.0.1&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(10: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.1.3&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(04: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.1.4&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;10: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.2.0&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;30: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.2.1&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (31: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.3.0&lt;/span&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;表では、日付（JIRA 上のリリース日なので、ずれている場合があるかも）とバージョン番号を載せています。また、安定版は太字に、開発版はカッコ付きで表記してあります。&lt;br /&gt;なお、MongoDBのバージョン番号は少し特殊で、0.2 ずつ上がります。マイナーバージョンが偶数のものが安定版（1.0, 1.2, 1.4 …）、奇数のものが次のリリースへの開発版（1.1 は 1.2 の開発版, 1.3 は 1.4 の開発版…）となります。（少しでも見やすいように、バージョン0.2ずつ交互に色分けして表示してあります。）&lt;/p&gt;
&lt;h5&gt;バージョン 1.0&lt;/h5&gt;
&lt;p&gt;2009年8月27日にバージョン1.0.0として、初めての正式なGAリリースが行われます。&lt;/p&gt;
&lt;figure&gt;
&lt;blockquote&gt;
&lt;p&gt;プロダクション環境でシングルマスター、マスター/スレーブ、レプリカ・ペアをする準備が整っています。人々が望むもっとたくさんの機能があり、動作します。1.0 は非常に安定しており、コードベースは18ヶ月以上、プロダクションで使われています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figcaption&gt; &lt;cite&gt;&lt;a href=&quot;http://blog.mongodb.org/post/173107215/1-0-ga-released&quot; target=&quot;_blank&quot;&gt;1.0 GA Released : MongoDB blog&lt;/a&gt;&lt;/cite&gt; から翻訳 &lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;バージョン1.0.0のリリース後、9月～12月にかけて、1.1系が開発されます。その後、12月10日に、バージョン1.2.0がリリースされます。&lt;/p&gt;
&lt;h5&gt;バージョン 1.2&lt;/h5&gt;
&lt;p&gt;リリースノートを要約すると次のようになります。&lt;/p&gt;
&lt;figure&gt;
&lt;blockquote&gt;
&lt;h4&gt;新機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;コレクション毎への追加のインデックス&lt;/li&gt;
&lt;li&gt;より高速なインデックス生成&lt;/li&gt;
&lt;li&gt;Map/Reduce&lt;/li&gt;
&lt;li&gt;JavasScript 関数の保存&lt;/li&gt;
&lt;li&gt;設定可能な fsync 時間&lt;/li&gt;
&lt;li&gt;いくつかの小さな機能や fix&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;アップグレードの注意点&lt;/h4&gt;
1.0からのアップグレード時には、DBの更新が必要です。
&lt;h5&gt;master/slave&lt;/h5&gt;
レプリケーションにおいて、小さな変更が行われました。master/slave 設定が行われている ver.1.1.2以下 からのバージョンアップの際は、slaveからアップデートする必要があります。
&lt;h5&gt;mongoimport&lt;/h5&gt;
mongoimportjson が削除され、mongoimport に置き換わりました。mongoimportでは、json/csv/tsv からインポートを行えます。
&lt;h5&gt;フィールドフィルタ&lt;/h5&gt;
フィールドフィルタの動作が若干変更されました。以前は、フィールドフィルタを使うと、これらのフィールドを持つオブジェクトのみが返されていましたが、フィールドフィルタは（フィールドを持つか持たないか、に関わらず）出力時にのみに用いられます。以前の動作が必要な場合は、$exists を使用できます。&lt;/blockquote&gt;
&lt;figcaption&gt; &lt;cite&gt;&lt;a href=&quot;http://www.mongodb.org/display/DOCS/1.2.x+Release+Notes&quot; target=&quot;_blank&quot;&gt;1.2.x Release Notes - MongoDB&lt;/a&gt; から抜粋翻訳&lt;/cite&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;多くの改善が行われていますが、MapReduce 機能により、サーバー側で柔軟に解析や集計させることが出来るようになった事は見逃せないでしょう。&lt;br /&gt;&lt;br /&gt;蛇足ですが、1.2で正式に取り込まれた機能で気になったものを少しだけピックアップします。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://jira.mongodb.org/browse/SERVER-304&quot; target=&quot;_blank&quot;&gt;Add --version option&lt;/a&gt;&lt;br /&gt;実は、ver.1.1.1 まで --version オプションが無かったそうな。これまでは、起動しない限りはバージョン情報を見ることが出来ませんでした。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://jira.mongodb.org/browse/SERVER-199&quot; target=&quot;_blank&quot;&gt;JSON PrettyPrinter&lt;/a&gt;&lt;br /&gt;読みやすい形で JSON を整形してくれる機能は、ver.1.1.4 で追加されました。&lt;br /&gt;mongoコンソールは javascript で何でもできるので非常に重宝しているのですが、この機能がないと、大きなドキュメントは見る気になりませんね。。。&lt;/p&gt;
&lt;h4&gt;2010年&lt;/h4&gt;
&lt;p&gt;さて、年が改まって2010年を見ていきます。NoSQLが一気に有名になりバズワード化したのもこの年だったと思いますが、MongoDBはより使いやすく進化していきます。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;table style=&quot;width: 96%;&quot; align=&quot;center&quot;&gt;&lt;caption&gt;2010年 上半期&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th width=&quot;16.5%&quot;&gt;1月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;2月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;3月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;4月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;5月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;6月&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(20: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.3.1&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;27: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.2.2&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;23: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.2.3&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (11: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.3.2&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;01: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.2.4&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (02: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.3.3&lt;/span&gt;)&lt;br /&gt; (17: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.3.4&lt;/span&gt;)&lt;br /&gt; (22: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.3.5&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;25: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.4.0&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;07: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.2.5&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (09: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.0&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;14: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.4.1&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;27: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.4.2&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(03: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.1&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;24: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.4.3&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (27: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.2&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(17: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.3&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;29: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.4.4&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h5&gt;バージョン 1.4&lt;/h5&gt;
&lt;p&gt;2010年3月には ver.1.4 がリリースされました。&lt;/p&gt;
&lt;figure&gt;
&lt;blockquote&gt;1.2 から 1.4 へのアップグレードは、mongod をシャットダウンし、新しいバイナリを起動するだけです。
&lt;h4&gt;コアサーバーの強化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;並列処理の向上&lt;/li&gt;
&lt;li&gt;インデックス時のメモリーの改善&lt;/li&gt;
&lt;li&gt;バックグラウンドでのインデックス生成&lt;/li&gt;
&lt;li&gt;正規表現のより良い検出&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;レプリケーション &amp;amp; シャーディング&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;スレーブ再起動時のよりより処理&lt;/li&gt;
&lt;li&gt;スナップショットからの高速な新しいスレーブ&lt;/li&gt;
&lt;li&gt;設定可能なスレーブディレイ&lt;/li&gt;
&lt;li&gt;マスターでのレプリケーション処理クロックの非対称化&lt;/li&gt;
&lt;li&gt;$inc レプリケーションの fix&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;デプロイ &amp;amp; プロダクション&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;プロファイリングのための &quot;slow threshold&quot; 設定&lt;/li&gt;
&lt;li&gt;生ファイルのバックアップのための fsync + lock&lt;/li&gt;
&lt;li&gt;DB ごとのディレクトリ分割のオプション&lt;/li&gt;
&lt;li&gt;http でのサーバーステータス取得&lt;/li&gt;
&lt;li&gt;REST インターフェース&lt;/li&gt;
&lt;li&gt;DB コマンドでのログトーテート&lt;/li&gt;
&lt;li&gt;serverStatus コマンドの強化&lt;/li&gt;
&lt;li&gt;新ツール mongostat&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;クエリ言語強化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;正規表現での $all&lt;/li&gt;
&lt;li&gt;$not&lt;/li&gt;
&lt;li&gt;配列要素の部分マッチ $elemMatch&lt;/li&gt;
&lt;li&gt;配列のアップデートのための$ オペレータ&lt;/li&gt;
&lt;li&gt;$addToSet&lt;/li&gt;
&lt;li&gt;$unset&lt;/li&gt;
&lt;li&gt;マッチしたオブジェクトの $pull サポート&lt;/li&gt;
&lt;li&gt;配列インデックスでの $set&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Geo&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;2D の地理空間検索&lt;/li&gt;
&lt;li&gt;Geo $center, $box 検索&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figcaption&gt; &lt;cite&gt;&lt;a href=&quot;http://www.mongodb.org/display/DOCS/1.4+Release+Notes&quot; target=&quot;_blank&quot;&gt;1.4 Release Notes - MongoDB&lt;/a&gt; から抜粋翻訳&lt;/cite&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;ver.1.4 は MongoDB 全体に渡って、様々な機能強化や改善が行われました。かゆい所に手が届かない事が以前はありましたが、このバージョンできちんと手が届くプロダクトに進化していると言えるでしょう。&lt;br /&gt;GeoIndex（地理空間へのIndex）への対応も特筆に値するユニークな機能でしょう。&lt;br /&gt;また、ver.1.6 で正式にリリースされるシャーディングの布石としての機能がこのバージョンで追加されているのも、見逃せません。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;table style=&quot;width: 96%;&quot; align=&quot;center&quot;&gt;&lt;caption&gt;2010年 下半期&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th width=&quot;16.5%&quot;&gt;7月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;8月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;9月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;10月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;11月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;12月&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(02: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.4&lt;/span&gt;)&lt;br /&gt; (16: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.5&lt;/span&gt;)&lt;br /&gt; (24: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.6&lt;/span&gt;)&lt;br /&gt; (30: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.7&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(03: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.5.8&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;05: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.6.0&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;17: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.6.1&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;31: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.4.5&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;01: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.6.2&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (04: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.7.0&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;23: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.6.3&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (28: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.7.1&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;26: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.6.4&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (29: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.7.2&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(16: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.7.3&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;20: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.6.5&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(21: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.7.4&lt;/span&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;2010年8月には、ver.1.6.0 がリリースされます。&lt;/p&gt;
&lt;figure&gt;
&lt;blockquote&gt;
&lt;h4&gt;新機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;シャーディング&lt;/li&gt;
&lt;li&gt;レプリカセット&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;改善&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;$or クエリー&lt;/li&gt;
&lt;li&gt;並列処理の向上&lt;/li&gt;
&lt;li&gt;$slice オペレータ&lt;/li&gt;
&lt;li&gt;コレクション毎に64個のインデックスが可能に（これまでは40個でした）&lt;/li&gt;
&lt;li&gt;64-bit integer がシェルで NumberLog を使って表されるように&lt;/li&gt;
&lt;li&gt;findAndModify での Upsert をサポート&lt;/li&gt;
&lt;li&gt;ドキュメントのディスクロケーションを表示する $showDiskLoc オプション&lt;/li&gt;
&lt;li&gt;IPv6 と UNIX ドメインソケットのサポート&lt;/li&gt;
&lt;li&gt;Windows サービスの向上&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figcaption&gt; &lt;cite&gt;&lt;a href=&quot;http://www.mongodb.org/display/DOCS/1.6+Release+Notes&quot; target=&quot;_blank&quot;&gt;1.6 Release Notes - MongoDB&lt;/a&gt; から抜粋翻訳&lt;/cite&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;ver.1.6 ではシャーディングが production-ready として正式に追加されました。また、レプリケーション機能においてもレプリカセットがリリースされ、より幅広いニーズに応えられるようになりました。&lt;br /&gt;この、シャーディングとレプリケーションにより、水平スケール、バックアップ、フェイルオーバーなどの巨大なデータや安定性に必要不可欠な機能が一通り出そろったといえるでしょう。&lt;br /&gt;&lt;br /&gt;また、この頃になると、日本でも MongoDB の情報が様々なところで見られるようになってきます。MongoDB JP が立ち上がったのも11月。その翌月に「第1回 MongoDB JP &amp;amp; CouchDB JP 合同勉強会」が開催されるなど、ユーザー数も急激に増加していたと思います。&lt;/p&gt;
&lt;h4&gt;2011年&lt;/h4&gt;
&lt;table style=&quot;width: 96%;&quot; align=&quot;center&quot;&gt;&lt;caption&gt;2011年 上半期&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th width=&quot;16.5%&quot;&gt;1月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;2月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;3月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;4月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;5月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;6月&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(26: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.7.5&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(14: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.7.6&lt;/span&gt;)&lt;br /&gt; (23: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.8.0-rc0&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(04: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.8.0-rc1&lt;/span&gt;)&lt;br /&gt; (09: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.8.0-rc2&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;16: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.8.0&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;06: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.8.1&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(02: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.9.0&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.8.2&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt; 2011年3月には ver.1.8 がリリースされました。&lt;/p&gt;
&lt;figure&gt;
&lt;blockquote&gt;
&lt;h4&gt;新機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ジャーナリング&lt;/li&gt;
&lt;li&gt;Sparse, Cavered インデックス&lt;/li&gt;
&lt;li&gt;インクリメンタル Map/Reduce サポート&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figcaption&gt; &lt;cite&gt;&lt;a href=&quot;http://www.mongodb.org/display/DOCS/1.8+Release+Notes&quot; target=&quot;_blank&quot;&gt;1.8 Release Notes - MongoDB&lt;/a&gt; から抜粋翻訳&lt;/cite&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;大きな機能としては、write-ahead（書き込み前に）ログを取ることで、素早いクラッシュリカバリと耐久性を助けるジャーナリング機能や、特定の検索を高速化する Sparse, Cavered インデックス、より柔軟な Map/Reduce をサポートするオプションの追加、などが挙げられます。&lt;br /&gt;特に、ジャーナリングのサポートは、耐久性、信頼性の向上に寄与する機能で、プロダクトで使用する際には心強い機能です。&lt;br /&gt;リリースノートには小さくしか記載されていないのですが、個人的には、Geoインデックスが球体対応し、ほぼ正確な地球上の距離を使用してのソートなどが可能になったことも見逃せない向上点です。&lt;/p&gt;
&lt;table style=&quot;width: 96%;&quot; align=&quot;center&quot;&gt;&lt;caption&gt;2011年 下半期&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th width=&quot;16.5%&quot;&gt;7月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;8月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;9月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;10月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;11月&lt;/th&gt;&lt;th width=&quot;16.5%&quot;&gt;12月&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(26: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.9.1&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(15: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.1.9.2&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;22: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.8.3&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (25: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.2.0.0-rc0&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(02: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.2.0.0-rc1&lt;/span&gt;)&lt;br /&gt; (07: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.2.0.0-rc2&lt;/span&gt;)&lt;br /&gt; &lt;strong&gt;12: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.2.0.0&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; &lt;strong&gt;*29: &lt;span style=&quot;color: #b03078;&quot;&gt;ver.2.0.1&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;*04: &lt;span style=&quot;color: #34a62d;&quot;&gt;ver.1.8.4&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt; (04: *&lt;span style=&quot;color: #34a62d;&quot;&gt;ver.2.1.0&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt;(01: *&lt;span style=&quot;color: #34a62d;&quot;&gt;ver.2.1.1&lt;/span&gt;)&lt;br /&gt; (29: *&lt;span style=&quot;color: #34a62d;&quot;&gt;ver.2.1.2&lt;/span&gt;)&lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;9月14日以降のリリース（*）については、目標であり正式なものではありません。&lt;br /&gt;&lt;br /&gt;現時点での最新版である MongoDB 2.0.0 がリリースされたのは12日でした。&lt;/p&gt;
&lt;figure&gt;
&lt;blockquote&gt;
&lt;h4&gt;新機能&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Compact コマンド&lt;/li&gt;
&lt;li&gt;Concurrency の改善&lt;/li&gt;
&lt;li&gt;デフォルトスタックサイズ&lt;/li&gt;
&lt;li&gt;Indexの強化&lt;/li&gt;
&lt;li&gt;セキュリティ
&lt;ul&gt;
&lt;li&gt;Sharding 認証機能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Replica Sets
&lt;ul&gt;
&lt;li&gt;Priority&lt;/li&gt;
&lt;li&gt;Data-center awareness&lt;/li&gt;
&lt;li&gt;w : &quot;majority&quot;&lt;/li&gt;
&lt;li&gt;マイノリティの復帰の際の再設定&lt;/li&gt;
&lt;li&gt;Primary が secondary を見つけられない場合、ステップダウン不可能に&lt;/li&gt;
&lt;li&gt;Extended shutdown on the primary to minimize interruption&lt;/li&gt;
&lt;li&gt;メンテナンスモード&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Geospatial Features
&lt;ul&gt;
&lt;li&gt;マルチロケーションドキュメント&lt;/li&gt;
&lt;li&gt;ポリゴンサーチャー&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Journaling の強化&lt;/li&gt;
&lt;li&gt;バルクインサートのための新しい ContinueOnError オプション&lt;/li&gt;
&lt;li&gt;Regex オプション: s&lt;/li&gt;
&lt;li&gt;システムスキーマの変更(field changes)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figcaption&gt; &lt;cite&gt;&lt;a href=&quot;http://www.mongodb.org/pages/viewpage.action?pageId=24708318&quot; target=&quot;_blank&quot;&gt;2.0 リリースノート - MongoDB&lt;/a&gt; から抜粋&lt;/cite&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;さすが、メジャーバージョンアップだけあって、様々な機能が追加されています。&lt;br /&gt;ここでは、それぞれの機能を紹介しませんが、主に、開発・運用のしやすさに対する機能（クエリやコマンド、セキュリティ機能など）追加とその改善、そして、信頼性やスケーラビリティなどのための機能追加やその改善などが特に注力されているように思います。&lt;br /&gt;レプリカセットの機能として、クラウドでの利用をサポートするために、データセンターやロケーションに対しての柔軟なオプションが設定できるようになったことも大きな進化です。&lt;/p&gt;
&lt;h4&gt;最後に&lt;/h4&gt;
&lt;p&gt;こうやって一気に歴史を追ってみると、MongoDB の設計思想である&lt;strong&gt;柔軟性&lt;/strong&gt;、&lt;strong&gt;パワー&lt;/strong&gt;、&lt;strong&gt;スピード&lt;/strong&gt;、そして&lt;strong&gt;簡単に使えること&lt;/strong&gt;をきちんと追求していることが垣間見れた気がします。&lt;br /&gt;（設計思想については「&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-0.html&quot;&gt;2.0 からはじめる MongoDB - 第0回 #mongodbjp : 今日も適当ダイアリー&lt;/a&gt;」で取り上げています）&lt;br /&gt;&lt;br /&gt;きっと今後も MongoDB はより柔軟に、よりパワフルに、より高速に、より簡単になっていくでしょう。そんな MongoDB にこれからも目が離せませんよ！&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;関連記事もどうぞ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2.0 からはじめる MongoDB
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-0.html&quot;&gt;第0回 MongoDB の紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-1-mongodbjp.html&quot;&gt;第1回 インストール～シェルと戯れる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;【番外編】&lt;a href=&quot;http://blog.madapaja.net/2011/09/mongodb-mongodb-20-mongodbjp.html&quot;&gt;MongoDB の歴史（MongoDB 2.0 まで）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450093083716/1430360269" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
    <entry>
        <title>2.0 からはじめる MongoDB - 第0回 #mongodbjp</title>
        <link href="https://blog.madapaja.net/entry/2011/09/14/000900"/>
        <id>hatenablog://entry/8454420450093083695</id>
        <published>2011-09-14T00:09:00+09:00</published>
        <updated>2011-09-14T00:09:00+09:00</updated>        <summary type="html">一部の方から“SymfonyのMongoDBの人”などと呼ばれたりしますが、実はSymfonyもMongoDBも業務では使っていない、という痛い感じの @madapaja です。大事なことは最初に言う。という事で、宣伝から始めます。ここ1年で急伸している MongoDB。日本でもMongoDB JP（MongoDBの日本ユーザー会）が去年の11月18日に立ちあがって以来、勉強会やカンファレンス等も開かれ、盛り上がりは加速し続けています。MongoDBをもっと知りたい、と思ったら、以下のGoogle グループや勉強会にもぜひ参加してください！みんなでMongoDBを楽しみましょう。MongoDB…</summary>
        <content type="html">&lt;p&gt;一部の方から“SymfonyのMongoDBの人”などと呼ばれたりしますが、実はSymfonyもMongoDBも業務では使っていない、という痛い感じの @madapaja です。&lt;br /&gt;&lt;br /&gt;大事なことは最初に言う。という事で、宣伝から始めます。&lt;br /&gt;ここ1年で急伸している MongoDB。日本でも&lt;a href=&quot;https://groups.google.com/group/mongodb-jp/about&quot;&gt;MongoDB JP&lt;/a&gt;（MongoDBの日本ユーザー会）が去年の11月18日に立ちあがって以来、勉強会やカンファレンス等も開かれ、盛り上がりは加速し続けています。&lt;br /&gt;MongoDBをもっと知りたい、と思ったら、以下のGoogle グループや勉強会にもぜひ参加してください！みんなでMongoDBを楽しみましょう。&lt;br /&gt;&lt;a href=&quot;https://groups.google.com/group/mongodb-jp/about&quot;&gt;MongoDB JP | Google グループ&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://atnd.org/events/19308&quot;&gt;「第6回 MongoDB 勉強会 in Tokyo」 : ATND&lt;/a&gt;（すでに定員オーバーしてますね。。。）&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://twitter.com/#!/madapaja/status/113458880687771648&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/-OPHCEUvacRo/Tm71ALbqboI/AAAAAAAAABA/SE5OLTUU3uA/s640/twitter.png&quot; alt=&quot;宣言 2.0からはじめるMongoDB という記事をブログに書く！宣言しないと書かなそうなので…&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;と大見得を切ったので、MongoDB について最初から優しく丁寧に解説していこうと思います。&lt;br /&gt;ただ、とても一回で終わりそうにないので、これから複数回にわたって MongoDB の基本的な使い方を書いていこうと思います。&lt;br /&gt;&lt;br /&gt;さて、今回は「0回目」として、MongoDB のメリット・デメリットやユースケース、特徴を通して“MongoDB とはなんぞや”という部分をお話します。（たぶん割と退屈な内容です。。。）&lt;/p&gt;
&lt;h4&gt;今回のアジェンダ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;設計思想&lt;/li&gt;
&lt;li&gt;デメリット&lt;/li&gt;
&lt;li&gt;ユースケース&lt;/li&gt;
&lt;li&gt;特徴&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;MongoDB がデータベースで、NoSQL の一つだって知っている人は多いと思いますが、そもそも、MongoDB ってどんなもので、どんな事が出来るのでしょうか。&lt;/p&gt;
&lt;h4&gt;MongoDB の設計思想&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;http://www.mongodb.org/download/attachments/590394/featuresPerformace.png?version=12&amp;amp;modificationDate=1258579871490&quot; alt=&quot;&quot; align=&quot;right&quot; /&gt;右図は、&lt;a href=&quot;http://www.mongodb.org/pages/viewpage.action?pageId=20743144&quot;&gt;MongoDB が目指すもの&lt;/a&gt;として紹介されている図ですが、MongoDB では KVS と同等のスケーラビリティとパフォーマンス、RDBMS に近い機能性の高さを目指して作られています。&lt;br /&gt;&lt;br /&gt;MongoDB は&lt;strong&gt;柔軟性&lt;/strong&gt;、&lt;strong&gt;パワー&lt;/strong&gt;、&lt;strong&gt;スピード&lt;/strong&gt;、そして&lt;strong&gt;簡単に使える&lt;/strong&gt;ことの4つに注力し開発されており、下記のような特徴があります（そう目指して開発されています）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSON（正確には、BSON - Binary JSON）でデータを扱います。JSON は、プログラミング言語のネイティブな型とマップでき、スキーマレスです。柔軟性が高く、理解・管理しやすく、関連性を内部的にグループ化することで卓越したパフォーマンスを生みます。&lt;/li&gt;
&lt;li&gt;パフォーマンスと共に、純粋な KVS とは一線を画した機能性の高さのニーズに応えます。MongoDB では、セカンダリインデックスや動的なクエリやソート、リッチなアップデートや集計など、これまでのRDBMSのような多くの機能を提供します。&lt;/li&gt;
&lt;li&gt;水平スケーリングが容易で、オート・シャーディングにより、ダウンタイムなく容量の増加に対応することも可能です。&lt;/li&gt;
&lt;li&gt;多くの環境で（どこでも）動作し、インストール・設定・メンテナンスそして、使用が容易で、開発に専念できます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;MongoDB のデメリット&lt;/h4&gt;
&lt;p&gt;また、MongoDB のデメリットには下記のようなものが挙げられるでしょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;トランザクション、JOIN が無い&lt;/li&gt;
&lt;li&gt;メモリを食う（インデックスがメモリに乗らなくなると性能劣化が激しい）&lt;/li&gt;
&lt;li&gt;歴史が浅い（MySQLやPostgreSQLなどのRDBMSと比べて）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;ユースケース&lt;/h4&gt;
&lt;p&gt;メリットとデメリットから、以下の条件に当てはまる場合、MongoDB に向いています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高速なデータのインサート・アップデートが必要&lt;/li&gt;
&lt;li&gt;豊富で柔軟なクエリが必要&lt;/li&gt;
&lt;li&gt;スキーマレスなデータの保存&lt;/li&gt;
&lt;li&gt;一貫性（トランザクション）を保てない場合があるのが許容できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具体的に上げると、次のようなシステムに向いています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CMS&lt;/li&gt;
&lt;li&gt;リアルタイム統計&lt;/li&gt;
&lt;li&gt;アーカイブやイベントログ&lt;/li&gt;
&lt;li&gt;コメントや投票データ&lt;/li&gt;
&lt;li&gt;セッションデータ&lt;/li&gt;
&lt;li&gt;Eコマース（RDBMSとの組み合わせで。最終的な注文・会計処理ではトランザクションのあるRDBMSを使うべきでしょう）&lt;/li&gt;
&lt;li&gt;ゲーム/モバイル（MongoDBには地理情報インデックスもあります！）&lt;/li&gt;
&lt;li&gt;イテレーティブ/アジャイル開発での利用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考：&lt;a href=&quot;http://www.mongodb.org/pages/viewpage.action?pageId=21266728&quot;&gt;ユースケース MongoDB マニュアル&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;MongoDB の特徴&lt;/h4&gt;
&lt;p&gt;さて、MongoDBの主な機能を俯瞰することで、MongoDB で何が出来るのかを見ていきましょう。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.mongodb.org/&quot;&gt;MongoDB&lt;/a&gt; の公式ホームページにはこう書かれています。&lt;/p&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.mongodb.org/&quot;&gt;&lt;img src=&quot;http://4.bp.blogspot.com/-bllWYbpqb98/Tm71DG6oDkI/AAAAAAAAABE/4oRiEdU2-yI/s640/mongotop.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;figure&gt;
&lt;blockquote&gt;&lt;big&gt;&lt;strong&gt;素早く&lt;/strong&gt;て、&lt;strong&gt;スケーラブル&lt;/strong&gt;&lt;/big&gt;&lt;br /&gt; MongoDB （&quot;hu&lt;strong&gt;mongo&lt;/strong&gt;us&quot; = どでかい）は、スケーラブル、ハイパフォーマンス、オープンソースなドキュメント指向データベースです。C++で書かれ、以下のような特徴があります。&lt;br /&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;ドキュメント指向ストレージ&lt;/li&gt;
&lt;li&gt;完全なインデックスのサポート&lt;/li&gt;
&lt;li&gt;レプリケーション &amp;amp; 高可用性&lt;/li&gt;
&lt;li&gt;オート・シャーディング&lt;/li&gt;
&lt;li&gt;クエリ&lt;/li&gt;
&lt;li&gt;高速な in-place（その場での）アップデート&lt;/li&gt;
&lt;li&gt;Map/Reduce&lt;/li&gt;
&lt;li&gt;GridFS&lt;/li&gt;
&lt;li&gt;コマーシャルサポート&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/figure&gt;
&lt;p&gt;各々の特徴について簡単に見ていきましょう。&lt;/p&gt;
&lt;h5&gt;ドキュメント指向データベース&lt;/h5&gt;
&lt;p&gt;RDB（リレーショナルデータベース）では、テーブル（表）を定義した上で、データを&lt;strong&gt;レコード&lt;/strong&gt;として保存し、複数のテーブルを連結（join）することで、様々なデータを保存します。&lt;br /&gt;対して、ドキュメント指向データベースでは、それぞれのデータを&lt;strong&gt;ドキュメント&lt;/strong&gt;として保存し、それぞれのドキュメントはスキーマレス（RDBでいうテーブル定義が必要ない）なので、柔軟なデータを入れることが出来ます。&lt;br /&gt;&lt;br /&gt;MongoDBではドキュメントを保存するために、JSON（正確には、BSON - Binary JSON）を用いています。&lt;br /&gt;&lt;br /&gt;MongoDBから、2つのドキュメントを取得した例（コメントは私が追記）：&lt;/p&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;&lt;br /&gt;// 1つ目のドキュメント&lt;br /&gt;{&lt;br /&gt;  &quot;_id&quot; : ObjectId(&quot;4e6efb28dbfb278da997d208&quot;),&lt;br /&gt;  &quot;title&quot; : &quot;はじめてのMongoDB&quot;,&lt;br /&gt;  &quot;tags&quot; : [ &quot;mongo&quot;, &quot;db&quot; ], // もちろん配列もOK&lt;br /&gt;  &quot;created&quot; : ISODate(&quot;2011-09-01T12:00:00Z&quot;)&lt;br /&gt;}&lt;br /&gt;// 2つ目のドキュメント&lt;br /&gt;{&lt;br /&gt;  &quot;_id&quot; : ObjectId(&quot;4e6efb7edbfb278da997d209&quot;),&lt;br /&gt;  &quot;title&quot; : &quot;PHPでハマった&quot;,&lt;br /&gt;  &quot;tags&quot; : [ &quot;php&quot; ],&lt;br /&gt;  &quot;created&quot; : ISODate(&quot;2011-09-05T13:00:00Z&quot;),&lt;br /&gt;  &quot;modified&quot; : ISODate(&quot;2011-09-06T02:00:00Z&quot;)&lt;br /&gt;}&lt;/pre&gt;
&lt;h5&gt;フル・インデックスのサポート&lt;/h5&gt;
&lt;p&gt;必要な時に、どの属性にもインデックスを作れます。&lt;br /&gt;インデックスはクエリーのパフォーマンスをとても向上させます。MongoDB では RDBMS のようなインデックスを、簡単に作る事ができます。&lt;/p&gt;
&lt;h5&gt;レプリケーション &amp;amp; 高可用性&lt;/h5&gt;
&lt;p&gt;スケールと心の平和のために、LAN、WANにまたがったミラーリングを提供します。&lt;br /&gt;MongoDB では、バックアップやフェールオーバーに備えて、マスター-スレーブやレプリカセットといった、柔軟なレプリケーションオプションがあります。&lt;/p&gt;
&lt;h5&gt;オート・シャーディング&lt;/h5&gt;
&lt;p&gt;機能性を損なわない水平スケーラビリティを提供します。&lt;br /&gt;MongoDB には、負荷やデータ分布、マシンの追加などの変化に伴って自動的にスケールアウトできる、シャーディング機能があります。また、1000ノード以上でのスケールアウトでき、自動フェイルオーバー機能も備えています。&lt;/p&gt;
&lt;h5&gt;クエリ&lt;/h5&gt;
&lt;p&gt;リッチなドキュメントベースのクエリを提供します。&lt;br /&gt;好きな条件で柔軟に検索できるクエリが使えるため、RDMBS からの移行でもクエリが物足りなく感じることはないでしょう。&lt;/p&gt;
&lt;h5&gt;高速な in-place（その場での）アップデート&lt;/h5&gt;
&lt;p&gt;MongoDB は、ドキュメント全体を入れ替えるための通常のアップデートだけでなく、アトミック、インプレース（その場での）アップデートをサポートしています。&lt;/p&gt;
&lt;h5&gt;Map/Reduce&lt;/h5&gt;
&lt;p&gt;柔軟な集約やデータ処理を提供します。&lt;br /&gt;バッチでのデータ処理や集計の際に便利な MapReduce を MongoDB では備えています。&lt;/p&gt;
&lt;h5&gt;GridFS&lt;/h5&gt;
&lt;p&gt;MongoDB の GridFS を使うことで簡単に巨大なサイズのファイルを保存できます。&lt;/p&gt;
&lt;h5&gt;コマーシャルサポート&lt;/h5&gt;
&lt;p&gt;エンタープライズ向けのサポート、トレーニング、コンサルティングを MongoDB の開発元である 10gen が提供しています。&lt;/p&gt;
&lt;h4&gt;最後に&lt;/h4&gt;
&lt;p&gt;今回は MongoDB の軸となる部分をまとめましたが、本当に「はじめて」の方にはちんぷんかんぷんな内容も多かったと思います。&lt;br /&gt;ただ、MongoDB の目指しているものと、特徴的な機能をまとめたものですので、頭の片隅に置いておくと、今後、理解しやすいかもしれません。&lt;br /&gt;&lt;br /&gt;さあ、次回の第1回からは実際に MongoDB をインストールし、動かしながら話を進めていきましょう。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;関連記事もどうぞ&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2.0 からはじめる MongoDB
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-0.html&quot;&gt;第0回 MongoDB の紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.madapaja.net/2011/09/20-mongodb-1-mongodbjp.html&quot;&gt;第1回 インストール～シェルと戯れる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;【番外編】&lt;a href=&quot;http://blog.madapaja.net/2011/09/mongodb-mongodb-20-mongodbjp.html&quot;&gt;MongoDB の歴史（MongoDB 2.0 まで）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/77b139a9ec8e9ade629b1fe40d43e24cb1b8af33/backend=imagemagick;version=1;width=1300/http%3A%2F%2F1.bp.blogspot.com%2F-OPHCEUvacRo%2FTm71ALbqboI%2FAAAAAAAAABA%2FSE5OLTUU3uA%2Fs640%2Ftwitter.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>TDDBC Tokyo 1.7 for PHP に参加して #tddbc</title>
        <link href="https://blog.madapaja.net/entry/2011/09/09/120900"/>
        <id>hatenablog://entry/8454420450093083681</id>
        <published>2011-09-09T12:09:00+09:00</published>
        <updated>2011-09-09T12:09:00+09:00</updated>        <summary type="html">8/21（日）にタイレルシステムズさんの TDDBC Tokyo 1.7 for PHP に参加してきました。すでに3週間が経とうとしてますが、あの時感じた事や、今想う事をここに書いておきます。（なので、TDDのやり方やブートキャンプ部分については、今回は触れていません。。。）なお、TDDBCについてのまとめ記事は主催者である @shishi4tw さんが書かれた記事が詳しいので、そちらをどうぞ。It&#39;s just same as dust ahead of a wind: TDDBC Tokyo 1.7 for PHP を開催しましたhttp://shishithefool.blogspot…</summary>
        <content type="html">&lt;p&gt;8/21（日）にタイレルシステムズさんの TDDBC Tokyo 1.7 for PHP に参加してきました。&lt;br /&gt;すでに3週間が経とうとしてますが、あの時感じた事や、今想う事をここに書いておきます。（なので、TDDのやり方やブートキャンプ部分については、今回は触れていません。。。）&lt;br /&gt;&lt;br /&gt;なお、TDDBCについてのまとめ記事は主催者である @shishi4tw さんが書かれた記事が詳しいので、そちらをどうぞ。&lt;br /&gt;&lt;a href=&quot;http://shishithefool.blogspot.com/2011/08/tddbc-tokyo-17-for-php.html&quot;&gt;It&#39;s just same as dust ahead of a wind: TDDBC Tokyo 1.7 for PHP を開催しました&lt;br /&gt;http://shishithefool.blogspot.com/2011/08/tddbc-tokyo-17-for-php.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;今回のTDDBCの内容は大きく2つにわかれ、1つめは日本のTDD先駆者である @t_wada 氏によるTDD（BC）についての基調講演を中心とした（いわゆる普通の）勉強会の部分、2つめはTDDをペアプログラミングで実践してみるTDD&lt;strong&gt;BC&lt;/strong&gt;のBCの部分です。&lt;/p&gt;


&lt;p&gt;@t_wada 氏による基調講演では、TDDの前提から、基本的な事を丁寧に説明がありました。その中でも、TDDに限った話ではないのですが、そもそもエンジニアとしてどうあるべきか、という部分が心に刺さりました。&lt;br /&gt;それは、エンジニアとしての自分に&lt;em&gt;やましい部分&lt;/em&gt;を感じていたからだと思います。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;良心のある開発者でいたい。&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; 動く綺麗なコードを作りたい。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;そう思いながら、そう出来ていない自分がいます。悩み、改善しなければ、と思いつつも、「スケジュールが…」とか、「うちの会社じゃ…」とか言って、先延ばしにする。見えないフリをしている。&lt;br /&gt;そんなやましい自分に正面から向き合うように言われた気がしたのです。 &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;完璧主義の呪い&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;「きれいなコード」、「動くコード」を書こうとした場合について、和田さんは以下のように説明されました。 &lt;br /&gt;&lt;br /&gt;良い設計を行おうとすると、設計から逃れることができない。&lt;br /&gt;きれいな設計には終わりがない。&lt;br /&gt;→いつまで経ってもコードが書き始められない&lt;br /&gt;→でも、コードを書き始めて気付く事は非常に多い&lt;br /&gt;→完璧な設計だと思って始めたら、全然完璧じゃない&lt;br /&gt;&lt;br /&gt;また、「動かして学ぶことで学ぶ点が多い」ことも挙げて、「動くコード」を書くことを最初にやると「動くけど汚い」コードで止まってしまう。&lt;br /&gt;&lt;br /&gt;そして、動くコードをきれいなコードにしていくことで、これらの問題を解決しよう、という実践的な試みが「TDD」である、と。&lt;br /&gt;「きれいなコードにする事をあきらめない」ために、TDDの心として挙げれていたものが重要だと思ったので、以下に簡単にまとめます。（メモ書きですが）&lt;/p&gt;
&lt;h5&gt;一つずつ、少しずつ&lt;/h5&gt;
&lt;p&gt;大きな問題を、小さくすぐに達成可能な分解された問題の連続にする&lt;br /&gt;大きな問題を制御可能に&lt;/p&gt;
&lt;h5&gt;一人ずつ仕留める&lt;/h5&gt;
&lt;p&gt;一対多を一対一の連続にすれば、負けることはない！&lt;/p&gt;
&lt;h5&gt;すばやくまわす&lt;/h5&gt;
&lt;p&gt;サイクルが速ければ速いほど開発が加速化される&lt;br /&gt;1〜2分でテストコード、1分でコードを書いて、3分でリファクタリング、を目標にしてみたら？&lt;br /&gt;&lt;br /&gt;サイクルのスピードを保ち続ける&lt;br /&gt;開発が進んでくるとスピードが落ちがち。でも、様々なテクニックを駆使してそのスピードを維持！&lt;/p&gt;
&lt;h5&gt;自分が最初のユーザー&lt;/h5&gt;
&lt;p&gt;自分がテストコードを書く→自分の書くコードの最初のコードが自分自身になる&lt;br /&gt;テストコードを書く＝利用者視点に立てる&lt;/p&gt;
&lt;h5&gt;道具にこだわる&lt;/h5&gt;
&lt;p&gt;プロフェッショナルとして道具にこだわる&lt;br /&gt;どれが一番効率的か&lt;br /&gt;エディタ、IDE、そのほかのツール…&lt;/p&gt;
&lt;h5&gt;不安をテストに&lt;/h5&gt;
&lt;p&gt;不安に対してテストコードを書く&lt;br /&gt;何を自分の手を止めるか→不安によるもの&lt;br /&gt;テストの粒度はものによって異なる&lt;br /&gt;getter/setterにテストコードは必要？→基本的には不要では？&lt;br /&gt;不安なものは、不安を解消できるテストを書く&lt;/p&gt;
&lt;h5&gt;祈るのではダメ&lt;/h5&gt;
&lt;p&gt;機能追加・修正でバグは生まれないか？&lt;br /&gt;→祈るのではダメ！&lt;br /&gt;→日々のコーディングの中でテストコードを書く・整備すること&lt;/p&gt;
&lt;h5&gt;テストが命綱&lt;/h5&gt;
&lt;p&gt;必要な時にテストを書くでは遅い&lt;br /&gt;→テストコードを書くモチベーションを保ち、日々書いていこう&lt;/p&gt;
&lt;h4&gt;TDDの真の目的は「健康」&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;健康体のコード（無駄のない、引き締まった体を持ったコード）&lt;/li&gt;
&lt;li&gt;健康体のチーム&lt;/li&gt;
&lt;li&gt;健康体の自分&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらがあって、変化に柔軟に対応できるコード（プロジェクト）になる。&lt;br /&gt;そして、テストを書くことで、不安を克服できる。&lt;br /&gt;&lt;br /&gt;テストは目的ではなく手段、である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;即座にフィードバックを得る&lt;/li&gt;
&lt;li&gt;書いたコードに自身を持つ&lt;/li&gt;
&lt;li&gt;これから書くコードに自信を持つ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ためにテストを書き、リファクタリングできれいにすることで、「健康を維持」しよう。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;私たちは完璧なプログラマーではない&lt;/strong&gt;事を自覚し、その上で、&lt;strong&gt;プロフェッショナルであり続ける&lt;/strong&gt;ために、いろいろな事を学び、改善し続けなければならない、と深く感じた一日でした。&lt;br /&gt;&lt;br /&gt;最後になりましたが、主催された @shishi4tw さん、講演された @t_wada さんを始めスタッフ・参加者の皆さん、本当にありがとうございました！&lt;br /&gt;&lt;br /&gt;&lt;em&gt;acts_as_professional !&lt;/em&gt;&lt;/p&gt;</content>        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450093083681/1430360297" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title> Git のおさらい</title>
        <link href="https://blog.madapaja.net/entry/20110822/1313986395"/>
        <id>hatenablog://entry/8454420450091973138</id>
        <published>2011-08-22T13:13:15+09:00</published>
        <updated>2011-08-22T13:13:15+09:00</updated>        <summary type="html">8/21（日）にタイレルシステムズさんに会場提供いただいて行われた TDDBC Tokyo 1.7 for PHP に参加してきました。 参加登録に出遅れ補欠だったのですが、@shishi4tw さんから、 LT してくださる方を 1 名補欠の方の中から募集します。LT してくださる方は LT 枠として、本編にも参加していただけるようにします。題材は広く PHP や TDD に関することなら何でも良い、つまり、開発に関することなら何でも良い、とします。 との言葉をいただき、参加したかったので、LT表明をして参加させていただけることになりました。そこで、「Gitのおさらい」というLTをしてきまし…</summary>
        <content type="html">&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110824093804&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110824/20110824093804.png&quot; alt=&quot;f:id:ja9:20110824093804p:image&quot; title=&quot;f:id:ja9:20110824093804p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;8/21（日）に&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%EC%A5%EB&quot;&gt;タイレル&lt;/a&gt;システムズさんに会場提供いただいて行われた TDDBC Tokyo 1.7 for &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt; に参加してきました。&lt;br /&gt;
参加登録に出遅れ補欠だったのですが、@&lt;a class=&quot;twitter-user-screen-name&quot; href=&quot;http://twitter.com/shishi4tw&quot;&gt;shishi4tw&lt;/a&gt; さんから、&lt;/p&gt;

    &lt;blockquote&gt;
        &lt;p&gt; LT してくださる方を 1 名補欠の方の中から募集します。LT してくださる方は LT 枠として、本編にも参加していただけるようにします。題材は広く &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt; や TDD に関することなら何でも良い、つまり、開発に関することなら何でも良い、とします。&lt;/p&gt;

    &lt;/blockquote&gt;
&lt;p&gt;との言葉をいただき、参加したかったので、LT表明をして参加させていただけることになりました。&lt;/p&gt;&lt;p&gt;そこで、「Gitのおさらい」というLTをしてきましたので、その内容をまとめておきます。&lt;br /&gt;
なお、勉強会本編の感想は別記事でアップする予定です。&lt;br /&gt;
&lt;span class=&quot;deco&quot; style=&quot;font-style:italic;&quot;&gt;下にあるスライドと併せてお読みください&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;Git&lt;/h4&gt;
    
&lt;ul&gt;
&lt;li&gt;「ぎっと」と読みます&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%B4%C9%CD%FD%A5%B7%A5%B9%A5%C6%A5%E0&quot;&gt;バージョン管理システム&lt;/a&gt;の一つ
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/CVS&quot;&gt;CVS&lt;/a&gt;, &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Subversion&quot;&gt;Subversion&lt;/a&gt;, Git, &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Mercurial&quot;&gt;Mercurial&lt;/a&gt; ...&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;その中でも、分散&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%B4%C9%CD%FD%A5%B7%A5%B9%A5%C6%A5%E0&quot;&gt;バージョン管理システム&lt;/a&gt;の一つ
&lt;ul&gt;
&lt;li&gt;Git, &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Mercurial&quot;&gt;Mercurial&lt;/a&gt;, Bazaar ...&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;みんな使ってる！&lt;/li&gt;
&lt;li&gt;使いこなせたらかっちょいい&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;分散&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%B4%C9%CD%FD%A5%B7%A5%B9%A5%C6%A5%E0&quot;&gt;バージョン管理システム&lt;/a&gt;&lt;/h4&gt;
    
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;が&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4&quot;&gt;複数&lt;/a&gt;ある&lt;/h5&gt;
    &lt;p&gt;集中型&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%B4%C9%CD%FD%A5%B7%A5%B9%A5%C6%A5%E0&quot;&gt;バージョン管理システム&lt;/a&gt;（&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/CVS&quot;&gt;CVS&lt;/a&gt;、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Subversion&quot;&gt;Subversion&lt;/a&gt;など）では、開発者は、サーバー上などにある唯一の&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;に対してチェックアウトやコミットを行います。&lt;/p&gt;&lt;p&gt;それに対して、分散&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%B4%C9%CD%FD%A5%B7%A5%B9%A5%C6%A5%E0&quot;&gt;バージョン管理システム&lt;/a&gt;では、開発者は、サーバー上などにある&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;から、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;をコピー（clone）し、そのコピー（ローカル&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;）に対してコミットやブランチなどの作業を行います。&lt;/p&gt;&lt;p&gt;つまり、マスター&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;の他に、Aさんのローカル&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;、Bさんのローカル&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;……のように、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4&quot;&gt;複数&lt;/a&gt;の&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;が存在します。（システム的にはそれぞれの&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;は優劣はなく、マスター&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;が無くても構わない。）&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;気軽にコミットできる&lt;/h5&gt;
    &lt;p&gt;ローカル&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;へのコミットは他人に影響しないため、気軽にコミットしたり、ブランチを切って実験的な試みをすることができます。（心理的な障壁がとても少ない）&lt;/p&gt;&lt;p&gt;集中型バージョン管理ではコミットすると、プロジェクトメンバーの全員にその変更が伝わるので、ちょっとした作業とか、汚い状態ではなかなかコミットし辛かったですよね。（それに無駄にリビジョン番号が上がってくのも。。。）&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;速い&lt;/h5&gt;
    &lt;p&gt;コミットやブランチなどの日常的に行う操作がローカル内で完結し、いちいちリモートの&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;に問い合わせる必要がないので、集中型-よりも速いです。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;マスター&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;への同期や変更の反映はコミットとは別の任意のタイミングで行える&lt;/h5&gt;
    &lt;p&gt;マスター&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;との同期（fetchやpull）や変更の反映（push）などは、任意のタイミングで行えます。&lt;/p&gt;&lt;p&gt;なので、実験的な試みをローカル&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;内で育てていって、ある程度固まったタイミングでマスター&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;に反映させたりできますし、もちろん、ネットワークの環境がない場合でも、ローカル&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;へのコミットなどの作業を行えます。&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;オブジェクトについて&lt;/h4&gt;
    &lt;p&gt;Gitではプロジェクトの状態などを記録するために、データをオブジェクトという単位が使われています。また、そのオブジェクトにはいくつかの種類がありますが、すべて下記の形式で保存されています。&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110822130029&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110822/20110822130029.png&quot; alt=&quot;f:id:ja9:20110822130029p:image&quot; title=&quot;f:id:ja9:20110822130029p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;オブジェクトのヘッダーとデータを結合し、その「&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/SHA-1&quot;&gt;SHA-1&lt;/a&gt;ハッシュ」を取った値（16進数40文字）が&lt;span class=&quot;deco&quot; style=&quot;font-weight:bold;&quot;&gt;オブジェクト名&lt;/span&gt;（オブジェクトIDと呼ばれることも）となり、このオブジェクト名をキーとして、オブジェクトDBにデータが（実際には圧縮されて）保存されます。&lt;/p&gt;&lt;p&gt;Gitでは、このオブジェクト名がコミットやファイルなどを一意に特定する際に用いられます。&lt;/p&gt;&lt;p&gt;オブジェクトの型は下記の4つのようです。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;blob オブジェクト&lt;/h5&gt;
    &lt;p&gt;ファイルデータを格納します。ファイル名や権限情報などは保持せずに、データ部にファイルの内容がそのまま入ります。&lt;/p&gt;&lt;p&gt;例：&lt;br /&gt;
&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110822130024&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110822/20110822130024.png&quot; alt=&quot;f:id:ja9:20110822130024p:image&quot; title=&quot;f:id:ja9:20110822130024p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;tree オブジェクト&lt;/h5&gt;
    &lt;p&gt;1つ以上のblobオブジェクトやtreeオブジェクト（サブディレクトリ）を参照することで、ディレクトリ/ファイル構成を格納します。&lt;br /&gt;
ファイル/ディレクトリ名やファイル権限なども保持します。&lt;/p&gt;&lt;p&gt;例：&lt;br /&gt;
&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110822130023&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110822/20110822130023.png&quot; alt=&quot;f:id:ja9:20110822130023p:image&quot; title=&quot;f:id:ja9:20110822130023p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;commit オブジェクト&lt;/h5&gt;
    &lt;p&gt;コミット情報を格納します。下記のようなデータが保持されます。&lt;/p&gt;

&lt;table&gt;
    &lt;tr&gt;
    &lt;th&gt;tree&lt;/th&gt;
    &lt;td&gt;ルートディレクトリのtreeオブジェクト名&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;th&gt;parent&lt;/th&gt;
    &lt;td&gt;（この）コミットが作られる元となったコミット（ひとつ前のコミット）。マージの際などのように、元となるコミットが&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4&quot;&gt;複数&lt;/a&gt;ある場合は、parentも&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4&quot;&gt;複数&lt;/a&gt;ある。&lt;br&gt;&lt;br&gt;下記の例のようにparent項目が無い場合は、前のコミットが無いルートコミット（最初のコミット）&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;th&gt;author&lt;/th&gt;
    &lt;td&gt;Author情報&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;th&gt;comitter&lt;/th&gt;
    &lt;td&gt;Comitter情報&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;td&gt;-&lt;/td&gt;
    &lt;td&gt;コミットコメント&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;例：&lt;br /&gt;
&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110822130025&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110822/20110822130025.png&quot; alt=&quot;f:id:ja9:20110822130025p:image&quot; title=&quot;f:id:ja9:20110822130025p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;tagオブジェクト&lt;/h5&gt;
    &lt;p&gt;コメント付き、署名付きタブを格納します。&lt;br /&gt;
（$ git tag stable-1 などとして作られる軽量タグの場合は、オブジェクトは作られません。）&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;インデックスについて&lt;/h4&gt;
    &lt;p&gt;Gitでは&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;とワークツリー（作業ディレクトリ）の間に、インデックスという領域があります。&lt;/p&gt;&lt;p&gt;インデックスは、ステージングエリアと呼ばれることもあり、プロジェクト全体のスナップショット（treeオブジェクトを生成するための情報）、ツリー間のコンフリクト情報や3-wayマージのためのツリー情報などを保持しています。&lt;/p&gt;&lt;p&gt;コミットやチェックアウトなど、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;とワークツリー間のやりとりにはインデックスが経由されます。&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110822130026&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110822/20110822130026.png&quot; alt=&quot;f:id:ja9:20110822130026p:image&quot; title=&quot;f:id:ja9:20110822130026p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;2.チェックアウト（checkout）を行うと、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;の内容がインデックスとワークツリーに展開されます。&lt;br /&gt;
4.編集後、インデックスへの反映（add）を行うことで、ワークツリーのスナップショットがインデックスに記録されます。&lt;br /&gt;
5.コミット（commit）を行うと、インデックスの内容が&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;にコミットされます。（ワークツリーの状態がコミットされるのではない）&lt;/p&gt;&lt;p&gt;下記の図のように、インデックスへの反映（add）後にワークツリーを再編集して、コミット（commit）した場合、再編集した内容ではなく、インデックスへの反映（add）時の状態がコミットされます。&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110822130027&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110822/20110822130027.png&quot; alt=&quot;f:id:ja9:20110822130027p:image&quot; title=&quot;f:id:ja9:20110822130027p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;再編集した内容をコミットしたい場合は、下記の図のように、再度インデックスへの反映（add）を行う必要があります。&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110822130028&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110822/20110822130028.png&quot; alt=&quot;f:id:ja9:20110822130028p:image&quot; title=&quot;f:id:ja9:20110822130028p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;プロジェクトの開始&lt;/h4&gt;
    
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;新しいプロジェクトを作る&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ &lt;span class=&quot;synStatement&quot;&gt;cd&lt;/span&gt; path/to/project
$ git init
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;既存のプロジェクトを取得&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git clone git://path/to/project
$ &lt;span class=&quot;synStatement&quot;&gt;cd&lt;/span&gt; project
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;インデックス-ワークツリー間に対する操作&lt;/h4&gt;
    
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;indexにファイルのスナップショットを追加&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git add target.php  &lt;span class=&quot;synComment&quot;&gt;# 対象ファイルを指定&lt;/span&gt;

$ git add &lt;span class=&quot;synSpecial&quot;&gt;-u&lt;/span&gt;          &lt;span class=&quot;synComment&quot;&gt;# 変更されたファイルの追加&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;indexからの削除&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git &lt;span class=&quot;synStatement&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;--cached&lt;/span&gt; target.php &lt;span class=&quot;synComment&quot;&gt;# ワークツリーのファイルは残す&lt;/span&gt;

$ git &lt;span class=&quot;synStatement&quot;&gt;rm&lt;/span&gt; target.php          &lt;span class=&quot;synComment&quot;&gt;# ワークツリーのファイルも削除&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ステータスの確認&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git &lt;span class=&quot;synStatement&quot;&gt;status&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;index-ワークツリーのdiff&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git diff
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;indexからチェックアウト&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git checkout target.php
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;indexへの変更を無かったことに&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git reset HEAD target.php
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;-インデックス間に対する操作&lt;/h4&gt;
    
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;-インデックスのdiff&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git diff &lt;span class=&quot;synSpecial&quot;&gt;--cached&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;インデックスの内容をコミットする&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git commit
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;コミットをやり直す&lt;/h5&gt;
    &lt;p&gt;直前のコミットを無効にして、新しいcommitオブジェクトを生成する。&lt;/p&gt;
&lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git commit &lt;span class=&quot;synSpecial&quot;&gt;--amend&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;コミットを取り消し、その内容をindexに戻す&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git reset &lt;span class=&quot;synSpecial&quot;&gt;--soft&lt;/span&gt; HEAD^
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;-ワークツリー間に対する操作&lt;/h4&gt;
    
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;-ワークツリーのdiff&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git diff HEAD
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;変更されたファイルをコミットする&lt;/h5&gt;
    &lt;p&gt;git add -u &amp;&amp; git commit と同じ&lt;/p&gt;
&lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git commit &lt;span class=&quot;synSpecial&quot;&gt;-a&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ワークツリーを指定したコミット時点の状態に戻し、コミットする&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git revert a5102ef4
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;コミットを取り消し、ワークツリーの内容も書き換える&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git reset &lt;span class=&quot;synSpecial&quot;&gt;--hard&lt;/span&gt; HEAD^
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ブランチの内容をチェックアウト&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git checkout master
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ブランチを作り、その内容をチェックアウト&lt;/h5&gt;
    &lt;p&gt;git branch branch1 &amp;&amp; git checkout branch1 と同じ&lt;/p&gt;
&lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git checkout &lt;span class=&quot;synSpecial&quot;&gt;-b&lt;/span&gt; branch1
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;コミット間をマージし、結果をワークツリーに反映&lt;/h5&gt;
    &lt;p&gt;マージ結果を自動でコミット&lt;/p&gt;
&lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git merge new_function
&lt;/pre&gt;&lt;p&gt;マージ結果をコミットしない&lt;br /&gt;
$ git merge --no-commit new_function&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;内での操作&lt;/h4&gt;
    
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ログを見る&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git log
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;コミット間のdiff&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git diff HEAD^..HEAD
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ブランチの確認&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git branch
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ブランチの作成&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git branch experimental
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ブランチの削除&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git branch &lt;span class=&quot;synSpecial&quot;&gt;-d&lt;/span&gt; experimental
$ git branch &lt;span class=&quot;synSpecial&quot;&gt;-D&lt;/span&gt; experimental  &lt;span class=&quot;synComment&quot;&gt;# 強制削除&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;リモー&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%C8%A5%EA%A5%DD%A5%B8&quot;&gt;トリポジ&lt;/a&gt;トリへの操作&lt;/h4&gt;
    
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;リモートブランチの確認&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git branch &lt;span class=&quot;synSpecial&quot;&gt;-r&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;リモートブランチを複製元&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA&quot;&gt;リポジトリ&lt;/a&gt;の最新バージョンの状態に更新&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git fetch origin
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;リモートブランチの内容をローカルブランチにマージ&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git merge origin/master
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;リモー&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%C8%A5%EA%A5%DD%A5%B8&quot;&gt;トリポジ&lt;/a&gt;トリから変更をプル&lt;/h5&gt;
    &lt;p&gt;git fetch origin &amp;&amp; git merge origin/master と同じ&lt;/p&gt;
&lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git pull origin master
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;リモートブランチの削除&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git push origin :experimental
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;リモー&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%C8%A5%EA%A5%DD%A5%B8&quot;&gt;トリポジ&lt;/a&gt;トリに変更をプッシュ&lt;/h5&gt;
    &lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git push origin master
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;まとめ&lt;/h4&gt;
    &lt;p&gt;オブジェクトとインデックスを理解して、よりgitを直感的に使いこなしましょう！&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;スライド&lt;/h4&gt;
    &lt;p&gt;&lt;div style=&quot;width:425px&quot; id=&quot;__ss_8931165&quot;&gt; &lt;strong style=&quot;display:block;margin:12px 0 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/madapaja/git-8931165&quot; title=&quot;Gitのおさらい&quot; target=&quot;_blank&quot;&gt;Gitのおさらい&lt;/a&gt;&lt;/strong&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/8931165&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;div style=&quot;padding:5px 0 12px&quot;&gt; View more &lt;a href=&quot;http://www.slideshare.net/&quot; target=&quot;_blank&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/madapaja&quot; target=&quot;_blank&quot;&gt;madapaja&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;参考&lt;/h4&gt;
    &lt;p&gt;&lt;div class=&quot;hatena-asin-detail&quot;&gt;&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/orpheeauxenfe-22/&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41R5gj5VRFL._SL160_.jpg&quot; class=&quot;hatena-asin-detail-image&quot; alt=&quot;入門Git&quot; title=&quot;入門Git&quot;&gt;&lt;/a&gt;&lt;div class=&quot;hatena-asin-detail-info&quot;&gt;&lt;p class=&quot;hatena-asin-detail-title&quot;&gt;&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/orpheeauxenfe-22/&quot;&gt;入門Git&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class=&quot;hatena-asin-detail-label&quot;&gt;作者:&lt;/span&gt; 濱野純(Junio C Hamano)&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;hatena-asin-detail-label&quot;&gt;出版社/メーカー:&lt;/span&gt; &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%BD%A8%CF%C2%A5%B7%A5%B9%A5%C6%A5%E0&quot;&gt;秀和システム&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;hatena-asin-detail-label&quot;&gt;発売日:&lt;/span&gt; 2009/09/19&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;hatena-asin-detail-label&quot;&gt;メディア:&lt;/span&gt; 単行本&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;hatena-asin-detail-label&quot;&gt;購入&lt;/span&gt;: 31人 &lt;span class=&quot;hatena-asin-detail-label&quot;&gt;クリック&lt;/span&gt;: 736回&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/asin/4798023809/orpheeauxenfe-22&quot; target=&quot;_blank&quot;&gt;この商品を含むブログ (158件) を見る&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;hatena-asin-detail-foot&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href=&quot;http://progit.org/book/ja/&quot;&gt;http://progit.org/book/ja/&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;反省&lt;/h4&gt;
    
&lt;ul&gt;
&lt;li&gt;Gitは「ぎっと」と呼びます。どうしても「じっと」と読んでしまう自分に反省。&lt;/li&gt;
&lt;li&gt;10分で収まる内容じゃなかった。。。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</content>        
        <category term="Git" label="Git" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/0542dfa4b1cee8ade61dfaa6a79e10bac906a1d9/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20110824%2F20110824093804.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title> Symfony温泉に参加してきました！ #trspa</title>
        <link href="https://blog.madapaja.net/entry/20110727/1311771698"/>
        <id>hatenablog://entry/8454420450091973162</id>
        <published>2011-07-27T22:01:38+09:00</published>
        <updated>2011-07-27T22:01:38+09:00</updated>        <summary type="html">[テトラポッドで作業をする人々] Symfonyユーザー会で企画された温泉ツアーに参加しました。 今回は、主にリリースが迫った Symfony2 のドキュメントの翻訳を一気に進めよう、ということで、7月23日（土）〜24日（日）の一泊二日で静岡県伊東の旅館に行ってきました。 旅館に着いて一発目、靴箱に書かれた「シンポニーユーザー会」の文字で吹き出してしまいました。 旅館の粋な計らい。侮れませぬ。 私は、短めのドキュメントを2つ翻訳したのですが、久しぶりに翻訳をして日本語がやっぱり難しいな、と改めて感じました。 結局の所、自然な日本語を作るのが難しい。 ですが、これをきっかけに、SymfonやM…</summary>
        <content type="html">&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110727210725&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110727/20110727210725.jpg&quot; alt=&quot;f:id:ja9:20110727210725j:image&quot; title=&quot;f:id:ja9:20110727210725j:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
[&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%C6%A5%C8%A5%E9%A5%DD%A5%C3%A5%C9&quot;&gt;テトラポッド&lt;/a&gt;で作業をする人々]&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Symfony&quot;&gt;Symfony&lt;/a&gt;ユーザー会で企画された温泉ツアーに参加しました。&lt;br /&gt;
今回は、主にリリースが迫った Symfony2 のドキュメントの翻訳を一気に進めよう、ということで、7月23日（土）〜24日（日）の一泊二日で静岡県伊東の旅館に行ってきました。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20110727210727&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20110727/20110727210727.jpg&quot; alt=&quot;f:id:ja9:20110727210727j:image:left&quot; title=&quot;f:id:ja9:20110727210727j:image:left&quot; class=&quot;hatena-fotolife hatena-image-left&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
旅館に着いて一発目、靴箱に書かれた「シン&lt;span class=&quot;deco&quot; style=&quot;font-weight:bold;&quot;&gt;ポ&lt;/span&gt;ニーユーザー会」の文字で吹き出してしまいました。&lt;br /&gt;
旅館の粋な計らい。侮れませぬ。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;私は、短めのドキュメントを2つ翻訳したのですが、久しぶりに翻訳をして日本語がやっぱり難しいな、と改めて感じました。&lt;br /&gt;
結局の所、自然な日本語を作るのが難しい。&lt;br /&gt;
ですが、これをきっかけに、SymfonやMongoDBのドキュメント翻訳に出来る範囲で貢献していけたらいいな、と思っています。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;それにしても今回のツアーでは翻訳をしていたのに、いつの間にか&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Mac&quot;&gt;Mac&lt;/a&gt;やGitの勉強会になったり、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%C2%E7%B4%EE%CD%F8&quot;&gt;大喜利&lt;/a&gt;大会になったりして、なかなかユニークで面白くて&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%CD%AD%B0%D5&quot;&gt;有意&lt;/a&gt;義な2日間でした。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;まとめ：&lt;span class=&quot;deco&quot; style=&quot;font-weight:bold;&quot;&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Symfony&quot;&gt;Symfony&lt;/a&gt;ユーザー会にはツッコミが多い&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;他の参加者の日記：&lt;br /&gt;
&lt;a href=&quot;http://yanchi52.blog21.fc2.com/blog-entry-40.html&quot;&gt;http://yanchi52.blog21.fc2.com/blog-entry-40.html&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://d.hatena.ne.jp/n416/20110726/1311645557&quot;&gt;http://d.hatena.ne.jp/n416/20110726/1311645557&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://shishithefool.blogspot.com/2011/07/2-symfony.html&quot;&gt;http://shishithefool.blogspot.com/2011/07/2-symfony.html&lt;/a&gt;&lt;/p&gt;
</content>        
        <category term="symfony2" label="symfony2" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/edf71c54c687f089205ce09591aa5abadc350917/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20110727%2F20110727210725.jpg" type="image/jpeg" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title> [symfony2][mongo]「第4回 Symfony2 勉強会」でも、Symfony2でMongoDBと仲良くする方法についてLTしてきました</title>
        <link href="https://blog.madapaja.net/entry/20110606/1307361553"/>
        <id>hatenablog://entry/8454420450091973165</id>
        <published>2011-06-06T20:59:13+09:00</published>
        <updated>2011-06-06T20:59:13+09:00</updated>        <summary type="html">2011-06-06 に ZyngaJapan さんで開催された Symfony2 勉強会でLTをしてきました。今回の勉強会では MongoDB 周り以外にもちょっと応用的な内容（動的なフォーム、バリデーションなど）を含むことをやろうと思っていたのですが、あえなく挫折。 そして、時間的に押し押しになっていたことと、LTにしては欲張り過ぎたのか、全然説明できずにLTは終わってしまった感があります。。。 が、スライドは丁寧に書いたので、そちらを見ていただけると嬉しいかな、と思います。 また、これを機に、Symfony2やMongoDBを触り始めていただければ、なお嬉しいかな、と思います。なお、下記…</summary>
        <content type="html">&lt;p&gt;2011-06-06 に ZyngaJapan さんで開催された Symfony2 勉強会でLTをしてきました。&lt;/p&gt;&lt;p&gt;今回の勉強会では MongoDB 周り以外にもちょっと応用的な内容（動的なフォーム、バリデーションなど）を含むことをやろうと思っていたのですが、あえなく挫折。&lt;br /&gt;
そして、時間的に押し押しになっていたことと、LTにしては欲張り過ぎたのか、全然説明できずにLTは終わってしまった感があります。。。&lt;br /&gt;
が、スライドは丁寧に書いたので、そちらを見ていただけると嬉しいかな、と思います。&lt;br /&gt;
また、これを機に、Symfony2やMongoDBを触り始めていただければ、なお嬉しいかな、と思います。&lt;/p&gt;&lt;p&gt;なお、下記のスライドやサンプルコードは、Symfony2 Beta1 での動作を確認しています。&lt;br /&gt;
将来のバージョンでは動かなくなってしまうかも知れませんが、また改めて、このブログでも取り上げようと思いますので、一緒にSymfony2 + Mongoしましょう！&lt;/p&gt;&lt;p&gt;スライド：&lt;div style=&quot;width:425px&quot; id=&quot;__ss_8197727&quot;&gt; &lt;strong style=&quot;display:block;margin:12px 0 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/madapaja/symfony2mongodb&quot; title=&quot;Symfony2でMongoDBと仲良くする方法&quot;&gt;Symfony2でMongoDBと仲良くする方法&lt;/a&gt;&lt;/strong&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/8197727&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt; &lt;div style=&quot;padding:5px 0 12px&quot;&gt; View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/madapaja&quot;&gt;madapaja&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;&lt;a href=&quot;http://www.slideshare.net/madapaja/symfony2mongodb&quot;&gt;http://www.slideshare.net/madapaja/symfony2mongodb&lt;/a&gt;&lt;/p&gt;&lt;p&gt;サンプルコード：&lt;br /&gt;
&lt;a href=&quot;https://github.com/madapaja/MadapajaMongoWikiBundle&quot;&gt;https://github.com/madapaja/MadapajaMongoWikiBundle&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ツッコミお待ちしてます！&lt;/p&gt;
</content>        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450091973165/1429416087" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>「第2回 Symfony2 勉強会」でSymfony2からDoctrine MongoDB ODMを使ってみる、というLTをしてきました！</title>
        <link href="https://blog.madapaja.net/entry/20110117/1295230055"/>
        <id>hatenablog://entry/8454420450091973167</id>
        <published>2011-01-17T11:07:35+09:00</published>
        <updated>2011-01-17T11:07:35+09:00</updated>        <summary type="html">2011-01-15にZynga Japanさんにて開催された、Symfony2 勉強会でLTをしてきました。 内容は、Symfony Adventで書いた記事をざっくりまとめ、現時点での最新情報に更新しただけなのですが、Symfony2+MongoDB ODMの基本的な使い方をご紹介しました。 Symfony2からdoctrine mongo db odmを使ってみる from madapaja この勉強会は、なかなかスパルタ、というか、あまり説明をしないで、とりあえず作ってみやがれ！的なノリで進行していくので、事前情報なしだと結構ひぃひぃですｗ でも、やはり、習うより慣れろじゃないですけど…</summary>
        <content type="html">&lt;p&gt;2011-01-15にZynga Japanさんにて開催された、Symfony2 勉強会でLTをしてきました。&lt;br /&gt;
内容は、Symfony Adventで書いた&lt;a href=&quot;http://d.hatena.ne.jp/ja9/20101214/1292348839&quot;&gt;&amp;#x8A18;&amp;#x4E8B;&lt;/a&gt;をざっくりまとめ、現時点での最新情報に更新しただけなのですが、Symfony2+MongoDB ODMの基本的な使い方をご紹介しました。&lt;/p&gt;&lt;p&gt;&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/9AxO4BOUr2Vw9d&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt; &lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/madapaja/symfony2doctrine-mongo-db-odm-6550048&quot; title=&quot;Symfony2からdoctrine mongo db odmを使ってみる&quot; target=&quot;_blank&quot;&gt;Symfony2からdoctrine mongo db odmを使ってみる&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;//www.slideshare.net/madapaja&quot; target=&quot;_blank&quot;&gt;madapaja&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;&lt;/p&gt;&lt;p&gt;この勉強会は、なかなかスパルタ、というか、あまり説明をしないで、とりあえず作ってみやがれ！的なノリで進行していくので、事前情報なしだと結構ひぃひぃですｗ&lt;br /&gt;
でも、やはり、習うより慣れろじゃないですけど、やっぱり最初はトライ＆エラーを重ねていくしかないわけで。&lt;br /&gt;
それこそ、フレームワーク始めて！っていう方から、Symfonyのスペシャリストまで、いろいろな方がいる中で、こーすればいいよ！だったり、あーでもない、こーでもないというやり取りをしていくのは、適度な緊張感があって面白いです！&lt;/p&gt;&lt;p&gt;勉強会全体については、日本ユーザー会の下記ページをご覧ください。&lt;br /&gt;
&lt;a href=&quot;http://symfony.gr.jp/blog/20110116-symfony2-workshop2-report&quot;&gt;http://symfony.gr.jp/blog/20110116-symfony2-workshop2-report&lt;/a&gt;&lt;/p&gt;&lt;p&gt;@hidenorigoto さん、Zynga Japanの皆様を始め、運営の皆様、参加者の皆様、本当にありがとうございました！&lt;br /&gt;
私も十分に楽しみましたよ！&lt;/p&gt;
</content>        
        <category term="symfony2" label="symfony2" />
        
        <category term="mongo" label="mongo" />
        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450091973167/1430359733" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title> Symfony2 + MongoDB ODM を使ってみる</title>
        <link href="https://blog.madapaja.net/entry/20101214/1292348839"/>
        <id>hatenablog://entry/8454420450091973175</id>
        <published>2010-12-14T02:47:19+09:00</published>
        <updated>2010-12-14T02:47:19+09:00</updated>        <summary type="html">この記事は、Symfony アドベントカレンダー2010 に参加しています。 日本Symfonyユーザー会 Symfony アドベントカレンダー2010 前の記事：2010-12-14 - jiskaのメモ書き 次の記事：Redirect 投稿時の設定を間違え、12/14付けになっちゃってますが、Adventカレンダー15日目の記事です！（投稿も15日早朝です） 日付変えちゃうとURL変っちゃうのでそのままにしてありますが、ご容赦くださいませ〜 と発言したので、今回は Doctrine MongoDB ODM を Symfony2 から使ってみる。という、割と初心者向けチュートリアル的な記事で…</summary>
        <content type="html">&lt;p&gt;この記事は、&lt;a href=&quot;http://www.symfony.gr.jp/adventcalendar/2010&quot;&gt;Symfony &amp;#x30A2;&amp;#x30C9;&amp;#x30D9;&amp;#x30F3;&amp;#x30C8;&amp;#x30AB;&amp;#x30EC;&amp;#x30F3;&amp;#x30C0;&amp;#x30FC;2010&lt;/a&gt; に参加しています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.symfony.gr.jp/&quot;&gt;&amp;#x65E5;&amp;#x672C;Symfony&amp;#x30E6;&amp;#x30FC;&amp;#x30B6;&amp;#x30FC;&amp;#x4F1A;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.symfony.gr.jp/adventcalendar/2010&quot;&gt;Symfony &amp;#x30A2;&amp;#x30C9;&amp;#x30D9;&amp;#x30F3;&amp;#x30C8;&amp;#x30AB;&amp;#x30EC;&amp;#x30F3;&amp;#x30C0;&amp;#x30FC;2010&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;前の記事：&lt;a href=&quot;http://d.hatena.ne.jp/jiskay/20101214&quot;&gt;2010-12-14 - jiska&amp;#x306E;&amp;#x30E1;&amp;#x30E2;&amp;#x66F8;&amp;#x304D;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;次の記事：&lt;a href=&quot;http://labs.unoh.net/2010/12/for-quick-feedback-cycle.html&quot;&gt;Redirect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;hr /&gt;&lt;br /&gt;
&lt;/p&gt;

    &lt;blockquote&gt;
        &lt;p&gt;投稿時の設定を間違え、12/14付けになっちゃってますが、Adventカレンダー&lt;span style=&quot;font-weight:bold;&quot;&gt;15日目&lt;/span&gt;の記事です！（投稿も15日早朝です）&lt;br /&gt;
日付変えちゃうとURL変っちゃうのでそのままにしてありますが、ご容赦くださいませ〜&lt;/p&gt;

    &lt;/blockquote&gt;
&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101210135720&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101210/20101210135720.png&quot; alt=&quot;f:id:ja9:20101210135720p:image&quot; title=&quot;f:id:ja9:20101210135720p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
と発言したので、今回は Doctrine MongoDB ODM を Symfony2 から使ってみる。という、割と初心者向け&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB&quot;&gt;チュートリアル&lt;/a&gt;的な記事です。&lt;/p&gt;&lt;p&gt;今回使用した環境は下記の通り。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt; 5.3.3&lt;/li&gt;
&lt;li&gt;MongoDB 1.7.3&lt;/li&gt;
&lt;li&gt;Symfony2 PR4&lt;/li&gt;
&lt;li&gt;Doctrine MongoDB ODM 1.0.0 beta1&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt; Mongo Extension 1.1.0 (&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/pecl&quot;&gt;pecl&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;MongoDB ODM ってなに？&lt;/h4&gt;
    &lt;p&gt;ODM は Object Document Mapper の事で、Doctrine2 のORM（Object Relational Mapper）によく似ていて、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt; 5.3.0+ のオブジェクトをMongoDBのドキュメント（&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RDB&quot;&gt;RDB&lt;/a&gt;のレコードに相当）として簡単に扱えるようになります。&lt;/p&gt;&lt;p&gt;Symfony2 から MongoDB ODM は標準でサポートされているので、早速ためしてみたいと思います。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;作るもの&lt;/h4&gt;
    &lt;p&gt;解説のみだとドキュメント見たほうが豊富だし、そもそも1回の記事では解説しきれないので、今回はサンプルプログラムとして“ささやきアプリケーション”を作る事にします。&lt;br /&gt;
まぁ、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/twitter&quot;&gt;twitter&lt;/a&gt;的な一言掲示板アプリですね。&lt;/p&gt;&lt;p&gt;要件は下記の通りです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ささやきアプリケーションの機能
&lt;ul&gt;
&lt;li&gt;ささやき投稿&lt;/li&gt;
&lt;li&gt;ささやきリスト表示（ささやきを時間順（降順）で表示）&lt;/li&gt;
&lt;li&gt;特定の人のささやき表示（指定した人が発言したささやきを時間順（降順）で表示）&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;ささやきは以下の項目で構成されます
&lt;ul&gt;
&lt;li&gt;ID (今回は MongoDB で自動生成される MongoId を利用します)&lt;/li&gt;
&lt;li&gt;名前（String）《入力項目》&lt;/li&gt;
&lt;li&gt;本文（String）《入力項目》&lt;/li&gt;
&lt;li&gt;ささやいた時間（DateTime）&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;下記のような感じになる予定です。&lt;br /&gt;
&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101210135723&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101210/20101210135723.png&quot; alt=&quot;f:id:ja9:20101210135723p:image&quot; title=&quot;f:id:ja9:20101210135723p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%B5%A5%F3%A5%C9%A5%DC%A5%C3%A5%AF%A5%B9&quot;&gt;サンドボックス&lt;/a&gt;を用意&lt;/h4&gt;
    &lt;p&gt;今回は、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%B5%A5%F3%A5%C9%A5%DC%A5%C3%A5%AF%A5%B9&quot;&gt;サンドボックス&lt;/a&gt;をベースに作りますので、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%B5%A5%F3%A5%C9%A5%DC%A5%C3%A5%AF%A5%B9&quot;&gt;サンドボックス&lt;/a&gt;を用意します。&lt;br /&gt;
Gitがインストールされた&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Linux&quot;&gt;Linux&lt;/a&gt;系OSであれば、下記のような感じでしょうか。&lt;/p&gt;
&lt;pre class=&quot;code lang-sh&quot; data-lang=&quot;sh&quot; data-unlink&gt;$ git clone git://github.com/symfony/symfony-sandbox.git
$ &lt;span class=&quot;synStatement&quot;&gt;cd&lt;/span&gt; symfony-sandbox/src
$ ../bin/install_vendors.sh
$ &lt;span class=&quot;synStatement&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;777&lt;/span&gt; ../app/cache ../app/logs
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;アプリケーション設定の変更&lt;/h4&gt;
    &lt;p&gt;では、さっそく、アプリケーションの設定を変えていきます。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;app/AppKernel.&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/php&quot;&gt;php&lt;/a&gt;&lt;/h5&gt;
    &lt;p&gt;まずは、MongoDB ODM を使うためのバンドルと、ささやきアプリケーション用のバンドルをアプリケーションに登録するために、AppKernel.&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/php&quot;&gt;php&lt;/a&gt;ファイルを編集します。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;synComment&quot;&gt;/* 8&amp;lt; 8&amp;lt; 8&amp;lt; 8&amp;lt; 略 8&amp;lt; 8&amp;lt; 8&amp;lt; 8&amp;lt; */&lt;/span&gt;

&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt; AppKernel &lt;span class=&quot;synType&quot;&gt;extends&lt;/span&gt; Kernel
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;/* 8&amp;lt; 8&amp;lt; 8&amp;lt; 8&amp;lt; 略 8&amp;lt; 8&amp;lt; 8&amp;lt; 8&amp;lt; */&lt;/span&gt;

    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; registerBundles&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;bundles&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Symfony\Bundle\FrameworkBundle\FrameworkBundle&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;,
            &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Symfony\Bundle\TwigBundle\TwigBundle&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;,

            &lt;span class=&quot;synComment&quot;&gt;// enable third-party bundles&lt;/span&gt;
            &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Symfony\Bundle\ZendBundle\ZendBundle&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;,
            &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;,
            &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Symfony\Bundle\DoctrineBundle\DoctrineBundle&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;,
            &lt;span class=&quot;synComment&quot;&gt;//new Symfony\Bundle\DoctrineMigrationsBundle\DoctrineMigrationsBundle(),&lt;/span&gt;
            &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Symfony\Bundle\DoctrineMongoDBBundle\DoctrineMongoDBBundle&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;,
            &lt;span class=&quot;synComment&quot;&gt;// ↑コメントアウトを解除し、DoctrineMongoDBBundleを有効にします。&lt;/span&gt;

            &lt;span class=&quot;synComment&quot;&gt;// register your bundles&lt;/span&gt;
            &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Application\SasayakiBundle\SasayakiBundle&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;,
            &lt;span class=&quot;synComment&quot;&gt;// ↑HelloBundleは使わないので、HelloBundleを削除し、&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// かわりにSasayakiBundleを登録します。&lt;/span&gt;
        &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

        &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;isDebug&lt;span class=&quot;synSpecial&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;bundles&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Symfony\Bundle\WebProfilerBundle\WebProfilerBundle&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;
        &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;bundles&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;/* 8&amp;lt; 8&amp;lt; 8&amp;lt; 8&amp;lt; 略 8&amp;lt; 8&amp;lt; 8&amp;lt; 8&amp;lt; */&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;app/config/config.yml&lt;/h5&gt;
    &lt;p&gt;次に、設定ファイルにMongoDB ODM の設定を追記します。&lt;/p&gt;

&lt;pre&gt;## doctrine_odm.mongodbが有効になるように追記。
doctrine_odm.mongodb: ~
&lt;/pre&gt;&lt;p&gt;ちなみに、上記設定の場合、接続などにデフォルト値が使われますので、変更したい場合はパラメータを指定する必要があります。&lt;br /&gt;
今回は、下記のように設定しましたが、環境に合わせて変更してください。&lt;/p&gt;

&lt;pre&gt;## doctrine_odm.mongodbが有効になるように追記。
doctrine_odm.mongodb:
    mappings:
        SasayakiBundle: ~
    server: mongodb://&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/localhost&quot;&gt;localhost&lt;/a&gt;:27077
    default_database: sasayakiapp
    options:
        connect: true
        persist: foobar
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;app/config/routing.yml&lt;/h5&gt;
    &lt;p&gt;ルーティングルールも変更します。&lt;br /&gt;
今回は、Sasayakiバンドルのルーティングルールに従うように、下記のように変更しました。&lt;/p&gt;

&lt;pre&gt;homepage:
    resource: SasayakiBundle/Resources/config/routing.yml
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;その他の設定&lt;/h5&gt;
    &lt;p&gt;もし、デフォルトのHTMLを変えたければ、お好みで app/views/layout.twig も編集しましょう。&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;Sasayakiバンドルの作成&lt;/h4&gt;
    &lt;p&gt;下準備が整ったら、Sasayakiバンドルを作るためにディレクトリを作ります。&lt;br /&gt;
ディレクトリの構成は下記の通りです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;src/Application/SasayakiBundle : Sasayakiバンドルのルート
&lt;ul&gt;
&lt;li&gt;/Controller : コントローラファイル&lt;/li&gt;
&lt;li&gt;/Document : ODM用のクラス（ドキュメント）ファイル&lt;/li&gt;
&lt;li&gt;/Resources
&lt;ul&gt;
&lt;li&gt;/config : 設定ファイル&lt;/li&gt;
&lt;li&gt;/views : ビューファイル&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/SasayakiBundle.&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/php&quot;&gt;php&lt;/a&gt;&lt;/h5&gt;
    &lt;p&gt;Sasayakiバンドルを有効にするために、Bundleファイルを書きます。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;synType&quot;&gt;namespace&lt;/span&gt; Application\SasayakiBundle;

&lt;span class=&quot;synPreProc&quot;&gt;use&lt;/span&gt; Symfony\Component\HttpKernel\Bundle\Bundle;

&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt; SasayakiBundle &lt;span class=&quot;synType&quot;&gt;extends&lt;/span&gt; Bundle
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;Sasayakiドキュメントの作成&lt;/h4&gt;
    &lt;p&gt;まずは、MongoDBに保存される「Sasayakiドキュメント」を作ります。&lt;/p&gt;&lt;p&gt;基本的には、上に書いたささやきの情報をそのままクラス化すればOKですが、MongoDB ODM を使うために「@mongodb:」から始まるコメントを記述する必要があります。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Document/Sasayaki.&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/php&quot;&gt;php&lt;/a&gt;&lt;/h5&gt;
    
    &lt;blockquote&gt;
        &lt;p&gt;2010/12/15追記:&lt;br /&gt;
&lt;span style=&quot;color:#990000;&quot;&gt;下記のサンプルでは要素をpublicプロパティで宣言していますが、Doctrine2では、private/protectedプロパティとして宣言した上で、getter/setter&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;でアクセスする事が推奨されています。&lt;/span&gt;&lt;br /&gt;
Doctrine2マニュアル：&lt;a href=&quot;http://www.doctrine-project.org/docs/orm/2.0/en/reference/best-practices.html#don-t-use-public-properties-on-entities&quot;&gt;27. Best Practices &amp;mdash; Doctrine 2 ORM 2 documentation&lt;/a&gt;&lt;/p&gt;

    &lt;/blockquote&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;synType&quot;&gt;namespace&lt;/span&gt; Application\SasayakiBundle\Document;

&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * -- 接続するコレクション名を指定&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @mongodb:Document(collection=&amp;quot;sasayaki&amp;quot;)&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * -- nameとsasayaki_atをインデックスとして登録&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @mongodb:Indexes({&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *   @mongodb:Index(keys={&amp;quot;name&amp;quot;=&amp;quot;asc&amp;quot;}),&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *   @mongodb:Index(keys={&amp;quot;sasayaki_at&amp;quot;=&amp;quot;desc&amp;quot;})&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * })&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt; Sasayaki
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * -- MongoID型&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * （MongoDB上では規定のプライマリキーである&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     *   &amp;quot;_id&amp;quot; フィールドとして保存されます）&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * @mongodb:Id&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;id&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * @mongodb:String&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;name&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * @mongodb:String&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;body&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * -- MongoDate型 (Timestamp)&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * @mongodb:Date&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki_at&lt;/span&gt;;

    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// 生成時に時間が自動で設定されるようにします。&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// \DateTime を使うのがオススメ。&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;sasayaki_at &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; \DateTime&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * return integer $id&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; getId&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;id;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * return DateTime $sasayaki_at&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; getSasayakiAt&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;sasayaki_at;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;id と sasayaki_at については、自動的に生成され、変更不可なので protected メンバ変数として定義し、getXXXという&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;を使用してアクセスする事とします。&lt;/p&gt;&lt;p&gt;なお、通常のタイムスタンプの保存には「@mongodb:Date」を指定します。&lt;br /&gt;
「@mongodb:Timestamp」ではありませんので、注意してください。「@mongodb:Timestamp」で定義した場合、MongoTimestampクラスが利用され、このクラスはシャーディングで使用される特別な型となります。&lt;br /&gt;
MongoTimestampクラスについては、&lt;a href=&quot;http://jp.php.net/MongoTimestamp&quot;&gt;PHP: MongoTimestamp - Manual&lt;/a&gt;を参照してください。&lt;/p&gt;

    &lt;blockquote&gt;
        &lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;注意：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;ODMへのIndex関連の設定は、上記設定で通っているようなのですが、MongoDB側にちゃんと伝わっていない模様です。&lt;br /&gt;
なぜかは良く分かっていない（きちんと調べていない）のですが、情報をお持ちの方がいれば教えてください。。。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ODM側でのインデックス情報のチェック&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// MongoDB ODM DocumentManager を取得&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;doctrine.odm.mongodb.document_manager&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;// インデックス情報を取得&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;var_export&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getClassMetadata&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getIndexes&lt;span class=&quot;synSpecial&quot;&gt;())&lt;/span&gt;;
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;返ってきた値（nameとsasayaki_atがそれぞれキー指定されている）&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
            &#39;&lt;span class=&quot;synConstant&quot;&gt;keys&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;name&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;,
            &#39;&lt;span class=&quot;synConstant&quot;&gt;options&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;unique&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;,
        &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;,
        &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
            &#39;&lt;span class=&quot;synConstant&quot;&gt;keys&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki_at&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;-1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;,
            &#39;&lt;span class=&quot;synConstant&quot;&gt;options&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;unique&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;,
        &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;,
    &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;MongoDB側でのインデックス情報のチェック（Mongoシェル）&lt;/span&gt;&lt;/p&gt;

&lt;pre&gt;&gt; db.sasayaki.getIndexes();
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;返ってきた値（_idしかキーになっていない）&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synIdentifier&quot;&gt;[{&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;_id_&amp;quot;&lt;/span&gt;,
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;ns&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;sasayakiapp.sasayaki&amp;quot;&lt;/span&gt;,
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;key&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; : 1 &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;,
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;v&amp;quot;&lt;/span&gt; : 0
&lt;span class=&quot;synIdentifier&quot;&gt;}]&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;なぜゆえ！？&lt;/p&gt;

    &lt;blockquote&gt;
        &lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;2011-01-04追記&lt;/span&gt;&lt;br /&gt;
自動的にやってくれるものと勘違いしていたのですが、&lt;br /&gt;
下記のように明示的にインデックスを作らないといけないようです。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
   &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getSchemaManager&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;ensureIndexes&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;
&lt;/pre&gt;&lt;p&gt;タイミング的には、データ投入時のflush()の前あたりかと思われます。&lt;/p&gt;

    &lt;/blockquote&gt;

    &lt;/blockquote&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;コントローラの作成&lt;/h4&gt;
    
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;MongoDB ODMの利用方法&lt;/h5&gt;
    &lt;p&gt;さっき作ったドキュメントを使うのであらかじめ、&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;synPreProc&quot;&gt;use&lt;/span&gt; Application\SasayakiBundle\Document\Sasayaki;
&lt;/pre&gt;&lt;p&gt;などとしておきます。&lt;/p&gt;&lt;p&gt;まず、コントローラ内で下記のようにMongoDB ODM の DocumentManager を取得しておきます。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// MongoDB ODM DocumentManager を取得&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;doctrine.odm.mongodb.document_manager&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
&lt;/pre&gt;&lt;p&gt;MongoDB へデータを保存するには、DocumentManager を取得した後に下記のようにします。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// Sasayakiドキュメントを生成し、データを入れる&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Sasayaki&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &#39;&lt;span class=&quot;synConstant&quot;&gt;名前です&lt;/span&gt;&#39;;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;body &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &#39;&lt;span class=&quot;synConstant&quot;&gt;ここにボディテキストを指定します！&lt;/span&gt;&#39;;

    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;persist&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// データを入れて&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;flush&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// 保存&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;データの取得は方法が何通りもありますが&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// 1. 全件取得&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getResults&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;// 2. _idを指定し、1件だけ取得&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;findOne&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;,
        &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&amp;quot;&lt;span class=&quot;synConstant&quot;&gt;_id&lt;/span&gt;&amp;quot; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; \MongoId&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&amp;quot;&lt;span class=&quot;synConstant&quot;&gt;XXXXXXXXXXXXXXXXXXXXXXXX&lt;/span&gt;&amp;quot;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;// 3. リポジトリを取得し、nameがJhonのものを取得&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getRepository&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;findByName&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&amp;quot;&lt;span class=&quot;synConstant&quot;&gt;Jhon&lt;/span&gt;&amp;quot;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getResults&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;// 4. createQuery でクエリを生成し、sasayaki_atを降順で取得&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;createQuery&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;sort&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki_at&lt;/span&gt;&#39;, &#39;&lt;span class=&quot;synConstant&quot;&gt;desc&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getResult&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;
&lt;/pre&gt;&lt;p&gt;などの方法で取得出来ます。&lt;/p&gt;&lt;p&gt;ちなみに、今回は使いませんが、findAndModify を使用する事で効率的に編集・削除を行うことも可能です。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;createQuery&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// ささやきを探す&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;findAndModify&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;field&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;name&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;equals&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Jhon&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;synComment&quot;&gt;// アップデートします&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;update&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;field&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;name&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;set&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;ジョン&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;execute&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;

    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;createQuery&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// ささやきを探す&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;findAndModify&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;field&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;name&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;equals&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Jhon&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;synComment&quot;&gt;// 削除する&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;execute&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Controller/SasayakiController.&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/php&quot;&gt;php&lt;/a&gt;&lt;/h5&gt;
    &lt;p&gt;では、結果として出来たコントローラは下記の通りです。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;synType&quot;&gt;namespace&lt;/span&gt; Application\SasayakiBundle\Controller;

&lt;span class=&quot;synPreProc&quot;&gt;use&lt;/span&gt; Symfony\Bundle\FrameworkBundle\Controller\Controller;

&lt;span class=&quot;synPreProc&quot;&gt;use&lt;/span&gt; Symfony\Component\Form\Form;
&lt;span class=&quot;synPreProc&quot;&gt;use&lt;/span&gt; Symfony\Component\Form\TextField;
&lt;span class=&quot;synPreProc&quot;&gt;use&lt;/span&gt; Symfony\Component\Form\TextareaField;

&lt;span class=&quot;synComment&quot;&gt;// さっき作ったSasayakiドキュメントを使う&lt;/span&gt;
&lt;span class=&quot;synPreProc&quot;&gt;use&lt;/span&gt; Application\SasayakiBundle\Document\Sasayaki;

&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt; SasayakiController &lt;span class=&quot;synType&quot;&gt;extends&lt;/span&gt; Controller
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * ささやきの取得&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; listAction&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// MongoDB ODM DocumentManager を取得&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;doctrine.odm.mongodb.document_manager&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

        &lt;span class=&quot;synComment&quot;&gt;// Sasayakiドキュメントのクエリを作成&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;createQuery&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 発言順（降順）にソート&lt;/span&gt;
            &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;sort&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki_at&lt;/span&gt;&#39;, &#39;&lt;span class=&quot;synConstant&quot;&gt;desc&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 最初の10件だけ&lt;/span&gt;
            &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;limit&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 取得&lt;/span&gt;
            &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getResult&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;

        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;render&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;SasayakiBundle:Sasayaki:index.twig&lt;/span&gt;&#39;, &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
            &#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt;,
            &#39;&lt;span class=&quot;synConstant&quot;&gt;sasayakiname&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &#39;&lt;span class=&quot;synConstant&quot;&gt;みんな&lt;/span&gt;&#39;,
        &lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * $nameのささやきを取得&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; findByNameAction&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// MongoDB ODM DocumentManager を取得&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;doctrine.odm.mongodb.document_manager&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

        &lt;span class=&quot;synComment&quot;&gt;// Sasayakiドキュメントのクエリを作成&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;createQuery&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;Application\SasayakiBundle\Document\Sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// フィールド name が $name のドキュメントを&lt;/span&gt;
            &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;field&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;name&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;equals&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 発言順（降順）にソート&lt;/span&gt;
            &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;sort&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki_at&lt;/span&gt;&#39;, &#39;&lt;span class=&quot;synConstant&quot;&gt;desc&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 最初の10件だけ&lt;/span&gt;
            &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;limit&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 取得&lt;/span&gt;
            &lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getResult&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;

        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;render&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;SasayakiBundle:Sasayaki:index.twig&lt;/span&gt;&#39;, &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
            &#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt;,
            &#39;&lt;span class=&quot;synConstant&quot;&gt;sasayakiname&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;name&lt;/span&gt;,
        &lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * ささやきの投稿&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     * モード切替のために $standalone を定義しておく（viewで使用）&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;     */&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; createAction&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;standalone&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// Sasayakiドキュメントを生成&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Sasayaki&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;

        &lt;span class=&quot;synComment&quot;&gt;// フォームと結びつけて&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Form&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki&lt;/span&gt;&#39;, &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;sasayaki&lt;/span&gt;, &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;validator&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;

        &lt;span class=&quot;synComment&quot;&gt;// 入力項目を追加&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; TextField&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;name&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; TextareaField&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;body&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;

        &lt;span class=&quot;synComment&quot;&gt;// メソッドが POST の場合&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;POST&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;request&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getMethod&lt;span class=&quot;synSpecial&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 送信された sasayaki を取得して&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;bind&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;request&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;request&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;

            &lt;span class=&quot;synComment&quot;&gt;// バリデーションOKなら&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;isValid&lt;span class=&quot;synSpecial&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;synComment&quot;&gt;// MongoDB ODM DocumentManager を取得&lt;/span&gt;
                &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;get&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;doctrine.odm.mongodb.document_manager&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
                &lt;span class=&quot;synComment&quot;&gt;// DocumentManager にデータを入れて&lt;/span&gt;
                &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;persist&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getData&lt;span class=&quot;synSpecial&quot;&gt;())&lt;/span&gt;;
                &lt;span class=&quot;synComment&quot;&gt;// 保存&lt;/span&gt;
                &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;dm&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;flush&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;

                &lt;span class=&quot;synComment&quot;&gt;// リストページにリダイレクト&lt;/span&gt;
                &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;redirect&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;generateUrl&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;sasayaki_list&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;
            &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;render&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;SasayakiBundle:Sasayaki:sasayakiform.twig&lt;/span&gt;&#39;, &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
            &#39;&lt;span class=&quot;synConstant&quot;&gt;form&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;form&lt;/span&gt;,
            &#39;&lt;span class=&quot;synConstant&quot;&gt;standalone&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;standalone&lt;/span&gt;,
        &lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Resources/config/routing.yml&lt;/h5&gt;
    &lt;p&gt;では、このコントローラにアクセス出来るようにルーティングを書きます。&lt;/p&gt;

&lt;pre&gt;sasayaki_list:
    pattern:  /
    defaults: { _controller: SasayakiBundle:Sasayaki:list }

sasayaki_create:
    pattern:  /sasayaku
    defaults: { _controller: SasayakiBundle:Sasayaki:create }

sasayaki_byname:
    pattern: /name/:name
    defaults: { _controller: SasayakiBundle:Sasayaki:findByName }
&lt;/pre&gt;&lt;p&gt;これで、&lt;a href=&quot;http://example.com/&quot;&gt;http://example.com/&lt;/a&gt; で一覧、&lt;a href=&quot;http://example.com/sasayaku&quot;&gt;http://example.com/sasayaku&lt;/a&gt; で投稿画面、&lt;a href=&quot;http://example.com/name/&quot;&gt;http://example.com/name/&lt;/a&gt;[検索した名前] で特定の人の投稿画面が見られますね。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Resources/config/config.yml&lt;/h5&gt;
    &lt;p&gt;Validationが有効になるようにconfig.ymlも書きます。&lt;/p&gt;

&lt;pre&gt;app.config:
    validation:
        enabled: true
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Resources/config/validation.yml&lt;/h5&gt;
    &lt;p&gt;最低限のValidationの設定を書きました。&lt;/p&gt;

&lt;pre&gt;Application\SasayakiBundle\Document\Sasayaki:
    properties:
        name:
            - NotBlank: ~
        body:
            - NotBlank: ~
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;ビューの作成&lt;/h4&gt;
    &lt;p&gt;ここまでくれば、後はビューの作成のみ。&lt;br /&gt;
サンプルなので、最低限の内容を書いていきます。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Resources/views/layout.twig&lt;/h5&gt;
    &lt;pre class=&quot;code lang-html&quot; data-lang=&quot;html&quot; data-unlink&gt;{% extends &amp;quot;::layout.twig&amp;quot; %}

{% block body %}
{% block content %}{% endblock %}
{% endblock %}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Resources/views/Sasayaki/index.twig&lt;/h5&gt;
    &lt;p&gt;リストページのテンプレートです。&lt;/p&gt;
&lt;pre class=&quot;code lang-html&quot; data-lang=&quot;html&quot; data-unlink&gt;{% extends &amp;quot;SasayakiBundle::layout.twig&amp;quot; %}

{% block content %}
{# &lt;span class=&quot;synComment&quot;&gt;&amp;lt;!--&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;  一覧ページにも投稿画面が欲しいので、createActionの内容を描画します。&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;  このフォームは、リストページに組み込まれるため、&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;  standaloneフラグをfalseにしておきます。&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;--&amp;gt;&lt;/span&gt; #}
{% render &amp;quot;SasayakiBundle:Sasayaki:create&amp;quot; with [&#39;standalone&#39;: false] %}

{# &lt;span class=&quot;synComment&quot;&gt;&amp;lt;!-- 特定の人のささやきの表示の場合、sasayakinameに人の名前が入ります --&amp;gt;&lt;/span&gt; #}
&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;{{ sasayakiname|default(&#39;みんな&#39;) }} のささやき&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;list&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
{% for item in sasayaki %}
{# &lt;span class=&quot;synComment&quot;&gt;&amp;lt;!-- それぞれのささやきを表示 --&amp;gt;&lt;/span&gt; #}
  &lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;sasayaki&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;name: &lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;{% path &#39;sasayaki_byname&#39; with [&#39;name&#39;: item.name] %}&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;synUnderlined&quot;&gt;{{ item.name }}&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;{{ item.body }}&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;sasayaki at: {{ item.sasayakiAt|date(&amp;quot;Y-m-d H:i:s&amp;quot;) }}&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
{% endfor %}
&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
{% endblock %}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Resources/views/Sasayaki/sasayakiform.twig&lt;/h5&gt;
    &lt;pre class=&quot;code lang-html&quot; data-lang=&quot;html&quot; data-unlink&gt;{# &lt;span class=&quot;synComment&quot;&gt;&amp;lt;!-- &lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;  standalone が true（SasayakiBundle:Sasayaki:create に直接アクセス）の場合、&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;  通常のレイアウトを継承し、&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;  それ以外の（リストページから呼び出された）場合、form.twig を 継承します。&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;--&amp;gt;&lt;/span&gt; #}
{% extends standalone ? &amp;quot;SasayakiBundle::layout.twig&amp;quot; : &amp;quot;SasayakiBundle:Sasayaki:form.twig&amp;quot; %}

{% block content %}
&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;sasayakiForm&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;ささやく&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;{% path &#39;sasayaki_create&#39; %}&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;post&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
    {{ form|render }}

    &lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;submit&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; &lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;Send!&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt; /&amp;gt;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;&amp;gt;&lt;/span&gt;
{% endblock %}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;src/Application/SasayakiBundle/Resources/views/Sasayaki/form.twig&lt;/h5&gt;
    &lt;pre class=&quot;code lang-html&quot; data-lang=&quot;html&quot; data-unlink&gt;{# フォーム以外には描画しない #}
{% block content %}
{% endblock %}
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;完成！&lt;/h4&gt;
    &lt;p&gt;というわけで、完成したささやきアプリケーションは下記のようなものになりました。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;■一覧画面&lt;/span&gt;&lt;br /&gt;
　　&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101210135723&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101210/20101210135723.png&quot; alt=&quot;f:id:ja9:20101210135723p:image&quot; title=&quot;f:id:ja9:20101210135723p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;■投稿画面&lt;/span&gt;&lt;br /&gt;
　　&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101210135722&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101210/20101210135722.png&quot; alt=&quot;f:id:ja9:20101210135722p:image&quot; title=&quot;f:id:ja9:20101210135722p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;■特定の人の一覧画面&lt;/span&gt;&lt;br /&gt;
　　&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101210135721&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101210/20101210135721.png&quot; alt=&quot;f:id:ja9:20101210135721p:image&quot; title=&quot;f:id:ja9:20101210135721p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Symfony2 の下準備から始めたため、若干長くなってしまいましたが、MongoDB ODMへのアクセス自体は非常に簡単で、柔軟なアクセスが可能になっていることが分かるかと思います。&lt;br /&gt;
MongoDB ODM の機能は、ここでは到底書きつくせないほど多くありますので、ぜひ MongoDB ODM を触っていただけたらと思います。&lt;/p&gt;&lt;p&gt;MongoDBもSymfony2も楽しいよ！&lt;/p&gt;&lt;p&gt;こうやったらいいよ！とか、こうじゃない？とか、そういったツッコミがありましたら、是非、 @madapaja もしくは、コメントで教えてください！&lt;/p&gt;&lt;p&gt;&lt;hr /&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Symfony&quot;&gt;Symfony&lt;/a&gt; Advent 2010&lt;/h4&gt;
    &lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Symfony&quot;&gt;Symfony&lt;/a&gt; Advent 2010では12月1日から12月24日までを使って日替わりで&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/symfony&quot;&gt;symfony&lt;/a&gt;でイイなと思った小さなtipsから内部構造まで迫った解説などをブログ記事にして公開していくイベントです。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.symfony.gr.jp/&quot;&gt;&amp;#x65E5;&amp;#x672C;Symfony&amp;#x30E6;&amp;#x30FC;&amp;#x30B6;&amp;#x30FC;&amp;#x4F1A;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.symfony.gr.jp/adventcalendar/2010&quot;&gt;Symfony &amp;#x30A2;&amp;#x30C9;&amp;#x30D9;&amp;#x30F3;&amp;#x30C8;&amp;#x30AB;&amp;#x30EC;&amp;#x30F3;&amp;#x30C0;&amp;#x30FC;2010&lt;/a&gt;&lt;/p&gt;&lt;p&gt;※Syfony Advent 2010は&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/symfony&quot;&gt;symfony&lt;/a&gt;好きな有志で集まったチームです。&lt;/p&gt;

&lt;/div&gt;</content>        
        <category term="symfony2" label="symfony2" />
        
        <category term="mongo" label="mongo" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/79a444d437e4d352e82d3aceee48cdd443024c8b/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20101210%2F20101210135720.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>「第1回 MongoDB JP ＆ CouchDB JP 合同勉強会 in Tokyo」でMongoDB 地理空間インデックスについてLTしました+</title>
        <link href="https://blog.madapaja.net/entry/20101213/1292231352"/>
        <id>hatenablog://entry/8454420450091973195</id>
        <published>2010-12-13T18:09:12+09:00</published>
        <updated>2010-12-13T18:09:12+09:00</updated>        <summary type="html">昨日（2010/12/12）開催された「第1回 MongoDB JP ＆ CouchDB JP 合同勉強会 in Tokyo」で、MongoDBの地理空間インデックスの紹介をLTとしてやりました。初LTで緊張しまくってましたが（？）皆様の暖かいまなざしに救われ、なんとか無事に終われました。勉強会全体の内容については、主催者でもある@doryokujinさんがまとめられた記事をご覧ください。 「第1回 MongoDB JP ＆ CouchDB JP 合同勉強会 in Tokyo」を開催してきました！ - doryokujin&#39;s blogで、地理空間インデックスに関するいくつかの補足と、コピペ用…</summary>
        <content type="html">&lt;p&gt;昨日（2010/12/12）開催された「第1回 MongoDB JP ＆ &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/CouchDB&quot;&gt;CouchDB&lt;/a&gt; JP 合同勉強会 in Tokyo」で、MongoDBの地理空間インデックスの紹介をLTとしてやりました。&lt;/p&gt;&lt;p&gt;初LTで緊張しまくってましたが（？）皆様の暖かいまなざしに救われ、なんとか無事に終われました。&lt;/p&gt;&lt;p&gt;勉強会全体の内容については、主催者でもある@doryokujinさんがまとめられた記事をご覧ください。&lt;br /&gt;
&lt;a href=&quot;http://d.hatena.ne.jp/doryokujin/20101213/1292201919&quot;&gt;&amp;#x300C;&amp;#x7B2C;1&amp;#x56DE; MongoDB JP &amp;#xFF06; CouchDB JP &amp;#x5408;&amp;#x540C;&amp;#x52C9;&amp;#x5F37;&amp;#x4F1A; in Tokyo&amp;#x300D;&amp;#x3092;&amp;#x958B;&amp;#x50AC;&amp;#x3057;&amp;#x3066;&amp;#x304D;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#xFF01; - doryokujin&amp;#39;s blog&lt;/a&gt;&lt;/p&gt;&lt;p&gt;で、地理空間インデックスに関するいくつかの補足と、コピペ用のテキストを書いておきたいと思います。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;Geospatial Indexingの速度&lt;/h4&gt;
    &lt;p&gt;昨日、Geospatial Indexingの速度はどうなのか聞かれ、数万件程度のレコードでは（普通のIndexに比べて）重くは感じない、と答えたのですが、気になったのでちゃちゃっと検証してみました。&lt;br /&gt;
（簡易的な検証ですので参考程度に）&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;検証環境&lt;/h5&gt;
    
&lt;ul&gt;
&lt;li&gt;CPU: &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Xeon&quot;&gt;Xeon&lt;/a&gt; 2.26 GHz (4コア)&lt;/li&gt;
&lt;li&gt;Memory: 4G&lt;/li&gt;
&lt;li&gt;OS: &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/CentOS&quot;&gt;CentOS&lt;/a&gt; 5.2&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt;: 5.3.3&lt;/li&gt;
&lt;li&gt;MongoDB: 1.7.3&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;（&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/localhost&quot;&gt;localhost&lt;/a&gt;上での検証。各テストは3回計測し、その平均値を掲載しています）&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;保存&lt;/h5&gt;
    &lt;p&gt;1,000万件のレコードをインサートした時の結果です。&lt;/p&gt;

&lt;table&gt;
    &lt;tr&gt;
    &lt;th&gt;名前&lt;/th&gt;
    &lt;th&gt;普通のIndex（ObjectId）&lt;/th&gt;
    &lt;th&gt;GeoIndex&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;th&gt;合計時間（秒）&lt;/th&gt;
    &lt;td&gt; 942.7&lt;/td&gt;
    &lt;td&gt;1,162.2 (+23%)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;th&gt;秒間に処理された件数（/sec）&lt;/th&gt;
    &lt;td&gt;10,613.4&lt;/td&gt;
    &lt;td&gt;8,606.7 (-19%)&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;※カッコ内は、ObjectIdに比べての増減の比率&lt;/p&gt;&lt;p&gt;GeoIndexについては、あらかじめensureIndexを実行してあります。&lt;/p&gt;&lt;p&gt;ObjectIdと比較すると、保存では2割程度の速度低下が見られました。&lt;br /&gt;
これは、内部的にGeoHash化するため、その計算処理が多くを占めていると思われます。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;検索&lt;/h5&gt;
    &lt;p&gt;上記で保存したデータ（1,000万件）を、ObjectIdでの検索と、GeoIndexの$near, $nearSphereで検索をそれぞれ10万回した時の結果です。&lt;br /&gt;
（findOne で実行）&lt;/p&gt;

&lt;table&gt;
    &lt;tr&gt;
    &lt;th&gt;名前&lt;/th&gt;
    &lt;th&gt;普通のIndex（ObjectId）&lt;/th&gt;
    &lt;th&gt;$near&lt;/th&gt;
    &lt;th&gt;$nearSphere&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;th&gt;合計時間（秒）&lt;/th&gt;
    &lt;td&gt;6.2&lt;/td&gt;
    &lt;td&gt;8.5 (+37%)&lt;/td&gt;
    &lt;td&gt;9.3 (+50%)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
    &lt;th&gt;秒間に処理された件数（/sec）&lt;/th&gt;
    &lt;td&gt;16,155.4&lt;/td&gt;
    &lt;td&gt;11,770.8 (-38%)&lt;/td&gt;
    &lt;td&gt;10,770.8 (-51%)&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;※カッコ内は、ObjectIdに比べての増減の比率&lt;/p&gt;&lt;p&gt;検索に関しては、ObjectIdと比較し、4〜5割程度の速度低下となりました。&lt;br /&gt;
これは、基点のGeoHash処理に加え、GeoHashでの前方一致検索を行った後に、距離計算とソートが行われるためかと思われます。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;結論&lt;/h5&gt;
    
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;スライド&lt;/h4&gt;
    &lt;p&gt;&lt;div style=&quot;width:425px&quot; id=&quot;__ss_6125507&quot;&gt;&lt;strong style=&quot;display:block;margin:12px 0 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/madapaja/mongodb-6125507&quot; title=&quot;MongoDBと位置情報 〜地理空間インデックスの紹介&quot;&gt;MongoDBと位置情報 〜地理空間インデックスの紹介&lt;/a&gt;&lt;/strong&gt;&lt;object id=&quot;__sse6125507&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-101212032852-phpapp01&amp;stripped_title=mongodb-6125507&amp;userName=madapaja&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed name=&quot;__sse6125507&quot; src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-101212032852-phpapp01&amp;stripped_title=mongodb-6125507&amp;userName=madapaja&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;padding:5px 0 12px&quot;&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/madapaja&quot;&gt;madapaja&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;スライド内容の補足と、コピペ用コードたち&lt;/h4&gt;
    &lt;p&gt;地理空間のインデックス、Geospatial Indexingでは、二次元の&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%C3%CF%CD%FD%B6%F5%B4%D6%BE%F0%CA%F3&quot;&gt;地理空間情報&lt;/a&gt;をキーに検索を行うことが出来ます。&lt;br /&gt;
経度・緯度以外の情報を入れることも出来ますが、普通は経度・緯度情報を使うと思います。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;Geospatial Index の作成&lt;/h5&gt;
    &lt;p&gt;Indexを作るには、普通のIndexと同じで、コレクションのensureIndex&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;を使うのですが、Geospatial Index の場合は、2dという文字列を指定します。&lt;br /&gt;
ただし、コレクション毎に、一つのGeospatial Indexしか作れません。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.ensureIndex(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synComment&quot;&gt;// loc フィールドに Geospatial Index を張る&lt;/span&gt;
  loc : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;2d&amp;quot;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;もちろん、複合Indexとして普通のIndexと同時に指定する事も出来ます。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.ensureIndex(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;2d&amp;quot;&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// Geospatial Index を張る&lt;/span&gt;
  category: 1 &lt;span class=&quot;synComment&quot;&gt;// 他のフィールドに Indexを張る&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;ちなみに、デフォルトでは、±180のfloat値を受け付けますが、拡張も可能です。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.ensureIndex(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;2d&amp;quot;&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// Geospatial Index を張る&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;, &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;// オプションで拡張もできる&lt;/span&gt;
  min: -1000,
  max: 1000
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;保存&lt;/h5&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; lon = 139;
&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; lat = 35;

db.shopinfo.save(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  name: &lt;span class=&quot;synConstant&quot;&gt;&#39;喫茶もんご&#39;&lt;/span&gt;,
  category: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&#39;喫茶店&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;,
  loc: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;lon, lat&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;// 位置情報 (x, y の順がオススメ)&lt;/span&gt;
  &lt;span class=&quot;synComment&quot;&gt;// loc: [x: lon, y: lat] // 連想配列でも&lt;/span&gt;
  &lt;span class=&quot;synComment&quot;&gt;// loc: [lon: lon, lat: lat] // lon,latでも&lt;/span&gt;
  &lt;span class=&quot;synComment&quot;&gt;// loc: [foo: lon, bar:lat] // 適当な名前でもOK&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;クエリー：完全一致&lt;/h5&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;// ほぼ使い道なし。。。&lt;/span&gt;
db.shopinfo.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139, 35&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;クエリー：$near&lt;/h5&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    $near : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139.4, 35.4&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;// [139.4, 35.4]から近い順にソート&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;クエリー：$maxDistance&lt;/h5&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    $near : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139.4, 35.4&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;,
    $maxDistance : 2 &lt;span class=&quot;synComment&quot;&gt;// 最大距離が ±2 のものを検索&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;クエリー：複合条件&lt;/h5&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    $near : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139.4, 35.4&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;,
    $maxDistance : 2
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;,
  category: &lt;span class=&quot;synConstant&quot;&gt;&#39;喫茶店&#39;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;クエリー：geoNearコマンド&lt;/h5&gt;
    &lt;p&gt;geoNearコマンドを使うと、詳細情報を取得することが出来ます。&lt;br /&gt;
runCommand&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;で、geoNearでコレクション名を指定します。&lt;br /&gt;
指定出来るオプションには、&quot;near&quot;, &quot;maxDistance&quot;, &quot;query&quot;なんかがあります。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.runCommand(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  geoNear: &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;shopinfo&amp;quot;&lt;/span&gt;,
  near: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139.4, 35.4&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;,
  maxDistance: 2,
  query: &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;category: &lt;span class=&quot;synConstant&quot;&gt;&#39;喫茶店&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;// 普通のクエリも使える&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;上記を実行すると下記のように返ってきます&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;ns&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;test.shopinfo&amp;quot;&lt;/span&gt;,
  &lt;span class=&quot;synComment&quot;&gt;// ↓基点に指定した情報をGeoHash化したビット列&lt;/span&gt;
  &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;near&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;1110100101001011000011000101000010111011111111011110&amp;quot;&lt;/span&gt;,
  &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;results&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;[{&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;dis&amp;quot;&lt;/span&gt; : 0.5656861498877501, &lt;span class=&quot;synComment&quot;&gt;// 距離（単位：度）&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;obj&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt; : ObjectId(&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;4d01f5616919cb54afce6a77&amp;quot;&lt;/span&gt;),
      &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;喫茶もんご&amp;quot;&lt;/span&gt;,
      &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;category&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;喫茶店&amp;quot;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;,
      &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;loc&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139, 35&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}]&lt;/span&gt;,
  &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;stats&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;time&amp;quot;&lt;/span&gt; : 0,
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;btreelocs&amp;quot;&lt;/span&gt; : 0,
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;nscanned&amp;quot;&lt;/span&gt; : 1,
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;objectsLoaded&amp;quot;&lt;/span&gt; : 1,
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;avgDistance&amp;quot;&lt;/span&gt; : 0.5656861498877501,
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;maxDistance&amp;quot;&lt;/span&gt; : 0.5656861498877501
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;,
  &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;ok&amp;quot;&lt;/span&gt; : 1
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;地理空間インデックスでは、内部でGeoHashを併用することで、高速性を高めています。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;領域のクエリー：$within&lt;/h5&gt;
    &lt;p&gt;長方形のモデルの場合、右上と左下（もちろん、右下と左上とかでもいいのだけど…）の点情報を配列で指定します。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    $within : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
      $box : &lt;span class=&quot;synIdentifier&quot;&gt;[[&lt;/span&gt;130, 30&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;140, 35&lt;span class=&quot;synIdentifier&quot;&gt;]]&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;// (130, 30) - (140, 35)の長方形内&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;円形のモデルの場合、中心点と半径情報を配列で指定します。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    $within : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
      $center : &lt;span class=&quot;synIdentifier&quot;&gt;[[&lt;/span&gt;135, 35&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;, 4&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;// (135, 35)から半径4の円の範囲&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;地球は球体：&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Sphere&quot;&gt;Sphere&lt;/a&gt; クエリ&lt;/h5&gt;
    &lt;p&gt;（本当は楕円だ、とか、そういうツッコミはとりあえず置いておきます！）&lt;/p&gt;&lt;p&gt;経度1度の距離は赤道から離れるほど、小さくなるので、精度が落ちてしまう、&lt;br /&gt;
というか、ソートの順番が正しくない場合があり、使い物になりません。&lt;/p&gt;&lt;p&gt;Ver.1.7.0以降でサポートされた&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Sphere&quot;&gt;Sphere&lt;/a&gt;クエリ使いましょう。&lt;/p&gt;&lt;p&gt;使い方は、$near の代わりに $nearSphere&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    $nearSphere : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139.4, 35.4&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;$center の代わりに $centerSphere&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.shopinfo.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  loc : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    $within : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;synComment&quot;&gt;// (135, 35)から半径 0.1ラジアンの円の範囲&lt;/span&gt;
      $centerSphere : &lt;span class=&quot;synIdentifier&quot;&gt;[[&lt;/span&gt;135, 35&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;, 0.1&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;を使うだけ（簡単！）&lt;/p&gt;&lt;p&gt;ちなみに、$boxSphereというのは、仕組み上意味をなさないので無いよ！&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Sphere&quot;&gt;Sphere&lt;/a&gt;系の距離単位：&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A2%A5%F3&quot;&gt;ラジアン&lt;/a&gt;&lt;/h5&gt;
    &lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Sphere&quot;&gt;Sphere&lt;/a&gt;系では、距離の単位が&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A2%A5%F3&quot;&gt;ラジアン&lt;/a&gt;になります。&lt;/p&gt;&lt;p&gt;地球では1&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A2%A5%F3&quot;&gt;ラジアン&lt;/a&gt;が6371kmになるので、これを基に計算を行えば問題ないと思います。&lt;/p&gt;

    &lt;blockquote&gt;
        &lt;p&gt;1&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A2%A5%F3&quot;&gt;ラジアン&lt;/a&gt; = (約) 6371 km&lt;/p&gt;

    &lt;/blockquote&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;runCommandでの球体モデル&lt;/h5&gt;
    &lt;p&gt;runCommandで、球体モデルを使用したい場合は、spherical パラメータを true にします。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.runCommand(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  geoNear: &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;shopinfo&amp;quot;&lt;/span&gt;,
  near: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;135, 35&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;,
  query: &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;category: &lt;span class=&quot;synConstant&quot;&gt;&#39;喫茶店&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;,
  spherical: &lt;span class=&quot;synConstant&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;// 球体モデルを有効に&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;結果はこんな感じ（抜粋）&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;results&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;[{&lt;/span&gt;
  &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;dis&amp;quot;&lt;/span&gt; : 0.05718377899700883, &lt;span class=&quot;synComment&quot;&gt;// ラジアン単位で返ります&lt;/span&gt;
  &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;obj&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;loc&amp;quot;&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139, 35&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}]&lt;/span&gt;,
&lt;/pre&gt;&lt;p&gt;検索基点から検索結果までの距離がdisというプロパティで返ってくる（&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A2%A5%F3&quot;&gt;ラジアン&lt;/a&gt;単位）ので、上記の場合、0.057…&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E9%A5%B8%A5%A2%A5%F3&quot;&gt;ラジアン&lt;/a&gt;×6371kmで、大体364 km になるよ。&lt;/p&gt;&lt;p&gt;というわけで、一緒にMongoDBで遊び（？）ましょう！&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;</content>        
        <category term="勉強会" label="勉強会" />
        
        <category term="mongo" label="mongo" />
        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450091973195/1429416113" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title> MongoDBの地理空間のインデックスを試してみる</title>
        <link href="https://blog.madapaja.net/entry/20101119/1290162711"/>
        <id>hatenablog://entry/8454420450091973260</id>
        <published>2010-11-19T19:31:51+09:00</published>
        <updated>2010-11-19T19:31:51+09:00</updated>        <summary type="html">MongoDB面白いですね。 ドキュメントが親切なのでありがたいのですが、なかなか日本語の記事が無かったりするので、Geospatial Indexingについて試してみた事を投稿しますよ！マニュアル：MongoDB internal corp site Geospatial Indexing は MongoDB ver1.3.3以上で使えます。 地理空間のインデックスとは 読んで字のごとくなのですが、MongoDBでは二次元地理空間情報（多くの場合、緯度経度情報）をインデックスとして検索をかけることが出来ます。最近のガラケーやスマートフォンからは簡単にGPS機能を利用することもできますし、P…</summary>
        <content type="html">&lt;p&gt;MongoDB面白いですね。&lt;br /&gt;
ドキュメントが親切なのでありがたいのですが、なかなか日本語の記事が無かったりするので、Geospatial Indexingについて試してみた事を投稿しますよ！&lt;/p&gt;&lt;p&gt;マニュアル：&lt;a href=&quot;http://www.mongodb.org/pages/viewpage.action?pageId=18448704&quot;&gt;MongoDB internal corp site&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101119192350&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101119/20101119192350.png&quot; alt=&quot;f:id:ja9:20101119192350p:image&quot; title=&quot;f:id:ja9:20101119192350p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

    &lt;blockquote&gt;
        &lt;p&gt;Geospatial Indexing は MongoDB ver1.3.3以上で使えます。&lt;/p&gt;

    &lt;/blockquote&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;地理空間のインデックスとは&lt;/h4&gt;
    &lt;p&gt;読んで字のごとくなのですが、MongoDBでは二次元&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%C3%CF%CD%FD%B6%F5%B4%D6%BE%F0%CA%F3&quot;&gt;地理空間情報&lt;/a&gt;（多くの場合、緯度経度情報）をインデックスとして検索をかけることが出来ます。&lt;/p&gt;&lt;p&gt;最近の&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%AC%A5%E9%A5%B1%A1%BC&quot;&gt;ガラケー&lt;/a&gt;や&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3&quot;&gt;スマートフォン&lt;/a&gt;からは簡単に&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/GPS&quot;&gt;GPS&lt;/a&gt;機能を利用することもできますし、PCブラウザなどでも位置情報を取得出来るようになったり、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/html5&quot;&gt;html5&lt;/a&gt;のGeolocation &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/API&quot;&gt;API&lt;/a&gt;（厳密には&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HTML5&quot;&gt;HTML5&lt;/a&gt;に含まれてはいない）の登場などで、今後、ますます位置情報の利用頻度は高くなるんじゃないかと思います。&lt;/p&gt;&lt;p&gt;でも、位置情報って検索が面倒だったりして、そのままで使いやすい情報ではないです。&lt;/p&gt;&lt;p&gt;GeoHashやGeoHexなどというエリア（面）情報として文字列で保存する方法などもありますが、一長一短。&lt;/p&gt;&lt;p&gt;例えば、GeoHashは、文字数が長いほど詳細なエリアを表し、検索なども非常に使い勝手がいい（文字列比較で済む）のですが、その特徴上、距離でのソートが難しかったり、検索エリアの範囲を細かく指定しづらかったりと、デメリットもあります。&lt;/p&gt;&lt;p&gt;どんな技術も、制約と利便性の&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%C8%A5%EC%A1%BC%A5%C9%A5%AA%A5%D5&quot;&gt;トレードオフ&lt;/a&gt;なので、上手く使い分けてやる必要があります。&lt;/p&gt;&lt;p&gt;今回は、MongoDB の Geospatial Index を用いて「近い店検索」のようなものを実験してみます。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;データの追加&lt;/h4&gt;
    &lt;p&gt;今回は、テスト用なので渋谷付近にランダムなデータを100件ほど追加します。&lt;/p&gt;&lt;p&gt;以下はmongoシェルでの操作です。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;// geotest というDBを使います&lt;/span&gt;
use geotest

&lt;span class=&quot;synComment&quot;&gt;// 渋谷付近の経度緯度&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; baseLng = 139.65534000898916;
&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; baseLat = 35.63588652257869;
&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; diffLng = 139.75730686689930 - baseLng;
&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; diffLat = 35.67661462940957 - baseLat;

&lt;span class=&quot;synComment&quot;&gt;// カテゴリのリスト&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; categories = &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&#39;カフェ&#39;&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;&#39;バー&#39;&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;&#39;レストラン&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;;

&lt;span class=&quot;synComment&quot;&gt;// ランダムに100件のデータを追加&lt;/span&gt;
&lt;span class=&quot;synStatement&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; i=1; i&amp;lt;=100; i++) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; myLng = baseLng + (Math.random() * diffLng);
  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; myLat = baseLat + (Math.random() * diffLat);

  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; myCategory = categories&lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;
    Math.floor(Math.random() * categories.length)
  &lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;;

  &lt;span class=&quot;synComment&quot;&gt;// ランダムなデータを保存&lt;/span&gt;
  db.places.save(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt;: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;myLng, myLat&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// 位置情報&lt;/span&gt;
    category: myCategory      &lt;span class=&quot;synComment&quot;&gt;// カテゴリ&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;shell で &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/JavaScript&quot;&gt;JavaScript&lt;/a&gt; が利用できるのは幸せですね。&lt;br /&gt;
ランダムデータの生成も楽ちんです。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;Index を作成&lt;/h4&gt;
    &lt;p&gt;次に、地理空間インデックスを作成します。&lt;/p&gt;&lt;p&gt;MongoDB では複合インデックスもOKなので、位置情報と共に、カテゴリ情報にもインデックスを張ります。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;// インデックスを作成&lt;/span&gt;
db.places.ensureIndex(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt; : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;2d&amp;quot;&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// location に Geospatial Index を張る&lt;/span&gt;
  category : 1     &lt;span class=&quot;synComment&quot;&gt;// category に Index を張る&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;検索してみる&lt;/h4&gt;
    &lt;p&gt;完全一致で検索&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.places.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139.66, 35.65&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;普通のインデックスで検索&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.places.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt; category : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;レストラン&amp;quot;&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;$near で検索&lt;/h4&gt;
    &lt;p&gt;これだと、あまり意味がないのですが、$nearを使う事で、近いロケーションを検索することができます。&lt;br /&gt;
（実際には近い順に並び替えられる）&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;// [139.66, 35.65] の近くにある店を5件検索&lt;/span&gt;
db.places.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt; $near : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139.66, 35.65&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;).limit(5);
&lt;/pre&gt;&lt;p&gt;もちろん、複合インデックスでの指定もOKです。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;// [139.66, 35.65] の近くにあるカフェを5件検索&lt;/span&gt;
db.places.find(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt; : &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt; $near : &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;139.66, 35.65&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;,
  category : &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;カフェ&amp;quot;&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;).limit(5);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;$nearの注意点&lt;/h4&gt;
    &lt;p&gt;$near は経度と緯度の1度が同じ距離を指すことを前提として計算が行われます。&lt;/p&gt;&lt;p&gt;例えば、&lt;/p&gt;

&lt;pre&gt;【基点】
経度：10°
緯度：-84°
&lt;/pre&gt;&lt;p&gt;から、&lt;/p&gt;

&lt;pre&gt;【点A】
経度：12°
緯度：-84°

【点B】
経度：10°
緯度：-85°
&lt;/pre&gt;&lt;p&gt;への距離を計算した場合、経度と緯度の1度が同じ距離である平面とすると、下図のような感じになるため、点Bの方が近いように見えます。&lt;br /&gt;
&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101129154749&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101129/20101129154749.png&quot; alt=&quot;f:id:ja9:20101129154749p:image&quot; title=&quot;f:id:ja9:20101129154749p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;実験してみましょう。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;// 点A の追加&lt;/span&gt;
db.places.save(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt;: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;12, -84&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;, name: &lt;span class=&quot;synConstant&quot;&gt;&#39;A&#39;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);

&lt;span class=&quot;synComment&quot;&gt;// 点B の追加&lt;/span&gt;
db.places.save(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt;: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;10, -85&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;, name: &lt;span class=&quot;synConstant&quot;&gt;&#39;B&#39;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);

&lt;span class=&quot;synComment&quot;&gt;// 基点から近いポイントの検索&lt;/span&gt;
db.places.findOne(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt;: &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&#39;$near&#39;&lt;/span&gt;: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;10, -84&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;結果は下記のように点Aが返ります。&lt;/p&gt;

&lt;pre&gt;{
        &quot;_id&quot; : ObjectId(&quot;4cef9fb0a22c7137b609561a&quot;),
        &quot;location&quot; : [
                10,
                -85
        ],
        &quot;name&quot; : &quot;B&quot;
}
&lt;/pre&gt;&lt;p&gt;ですが。。。。&lt;/p&gt;&lt;p&gt;実際には、地球は球体なので場所によって1度は変わります。&lt;/p&gt;&lt;p&gt;今回の経度・緯度の場合、下記のような間隔になると予想出来ます。&lt;br /&gt;
&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101129154748&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101129/20101129154748.png&quot; alt=&quot;f:id:ja9:20101129154748p:image&quot; title=&quot;f:id:ja9:20101129154748p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size:small;&quot;&gt;※実際の縮尺ではありません。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;下記サイトで、地球を球体として二点間の距離を計算してみましょう。&lt;br /&gt;
&lt;a href=&quot;http://keisan.casio.jp/has10/SpecExec.cgi?id=system/2006/1257670779&quot;&gt;&amp;#xFF12;&amp;#x5730;&amp;#x70B9;&amp;#x9593;&amp;#x306E;&amp;#x8DDD;&amp;#x96E2;&amp;#x3068;&amp;#x65B9;&amp;#x4F4D;&amp;#x89D2; - &amp;#x9AD8;&amp;#x7CBE;&amp;#x5EA6;&amp;#x8A08;&amp;#x7B97;&amp;#x30B5;&amp;#x30A4;&amp;#x30C8;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;すると、&lt;/p&gt;

&lt;pre&gt;【基点-点A間の距離】23.270942 km
【基点-点B間の距離】111.319491 km
&lt;/pre&gt;&lt;p&gt;となり、実際には点Aの方が近い事がわかります。&lt;/p&gt;&lt;p&gt;この問題に解決するため、新しい球体のモデルがバージョン1.7.0で追加されました。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;球体モデルを使用して求める&lt;/h4&gt;
    
    &lt;blockquote&gt;
        &lt;p&gt;この先の球体モデルは MongoDB ver1.7.0 以上で使えます。&lt;/p&gt;

    &lt;/blockquote&gt;
&lt;p&gt;利用は簡単です。$near を $nearSphere に変更するだけです。&lt;/p&gt;&lt;p&gt;実際にやってみましょう。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;db.places.findOne(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;location&lt;/span&gt;: &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&#39;$nearSphere&#39;&lt;/span&gt;: &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;10, -84&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;結果は下記のように正しく点Aが返るようになりました。&lt;/p&gt;

&lt;pre&gt;{
        &quot;_id&quot; : ObjectId(&quot;4cef9fada22c7137b6095619&quot;),
        &quot;location&quot; : [
                12,
                -84
        ],
        &quot;name&quot; : &quot;A&quot;
}
&lt;/pre&gt;&lt;p&gt;なお、球体モデルを使用する場合には、位置情報を &lt;span style=&quot;font-weight:bold;&quot;&gt;X(経度), Y(緯度) の順で使っていると仮定される&lt;/span&gt;ため、その&lt;span style=&quot;font-weight:bold;&quot;&gt;順序を守る&lt;/span&gt;必要があります。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;サンプルプログラム&lt;/h4&gt;
    &lt;p&gt;今回は、GoogleMaps &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/API&quot;&gt;API&lt;/a&gt;を使用してサンプルプログラムを作ってみました。&lt;/p&gt;
&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20101119192350&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20101119/20101119192350.png&quot; alt=&quot;f:id:ja9:20101119192350p:image&quot; title=&quot;f:id:ja9:20101119192350p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;mongodbとのやり取りは下記のような形で&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt;にて行っています。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;geo&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; getGeoInfo&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;

&lt;span class=&quot;synComment&quot;&gt;// 見つける！&lt;/span&gt;
&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;geo&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
    &#39;&lt;span class=&quot;synConstant&quot;&gt;location&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
        &#39;&lt;span class=&quot;synConstant&quot;&gt;$nearSphere&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;lng&lt;/span&gt;,
            &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;lat&lt;/span&gt;,
        &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;,
    &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;,
&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;

&lt;span class=&quot;synType&quot;&gt;class&lt;/span&gt; getGeoInfo
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synType&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;mongo&lt;/span&gt;;
    &lt;span class=&quot;synType&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;collection&lt;/span&gt;;

    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;__construct&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// mongodb に接続&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;mongo &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;new&lt;/span&gt; Mongo&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;mongodb://localhost:27077&lt;/span&gt;&#39;, &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;persist&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &#39;&lt;span class=&quot;synConstant&quot;&gt;myPersistId&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt;;
        &lt;span class=&quot;synComment&quot;&gt;// collection を選択&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;collection &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;mongo&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;selectDB&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;geotest201011&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;selectCollection&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;places&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synType&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; find&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;, &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;limit&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// findを実行して、カーソルを取得&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;cursor&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;collection&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

        &lt;span class=&quot;synComment&quot;&gt;// JSON形式で返す&lt;/span&gt;
        &lt;span class=&quot;synPreProc&quot;&gt;echo&lt;/span&gt; &#39;&lt;span class=&quot;synConstant&quot;&gt;[&lt;/span&gt;&#39;;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;isFirst&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;true&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;hasNext&lt;span class=&quot;synSpecial&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;is_null&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;limit&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;limit&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;cursor&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;-&amp;gt;&lt;/span&gt;getNext&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;exportItem&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
                &#39;&lt;span class=&quot;synConstant&quot;&gt;location&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;location&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;,
                &#39;&lt;span class=&quot;synConstant&quot;&gt;category&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;category&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;,
            &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

            &lt;span class=&quot;synPreProc&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;isFirst&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;?&lt;/span&gt; &#39;&#39; &lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt; &#39;&lt;span class=&quot;synConstant&quot;&gt;, &lt;/span&gt;&#39;;
            &lt;span class=&quot;synPreProc&quot;&gt;echo&lt;/span&gt; json_encode&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;exportItem&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

            &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;isFirst&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;isFirst&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;false&lt;/span&gt;;
            &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;synStatement&quot;&gt;++$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;i&lt;/span&gt;;
        &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;synPreProc&quot;&gt;echo&lt;/span&gt; &#39;&lt;span class=&quot;synConstant&quot;&gt;]&lt;/span&gt;&#39;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;以上、駆け足ですが、MongoDBでの地理空間インデックスのサンプルでした！&lt;/p&gt;

&lt;/div&gt;</content>        
        <category term="php" label="php" />
        
        <category term="mongo" label="mongo" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/617baa0b7a78a4d14c145c04cffe06921a634a45/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20101119%2F20101119192350.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>色空間メソッドと色のアニメーションを拡張するjQueryプラグインjQuery.iColor ver.1.0 beta</title>
        <link href="https://blog.madapaja.net/entry/20100921/1285053078"/>
        <id>hatenablog://entry/8454420450091973274</id>
        <published>2010-09-21T16:11:18+09:00</published>
        <updated>2010-09-21T16:11:18+09:00</updated>        <summary type="html">色空間メソッドと色のアニメーションを拡張するjQueryプラグイン jQuery.iColor をバージョンアップしました。バグフィックスのみで、メソッドなども以前と同等になりますので、使い方については、下記エントリを参照してください。 jQuery.iColor の使い方 色空間メソッドと色のアニメーションを拡張するjQueryプラグインiColorを書いた - 今日も適当ダイアリー ファイルはこちら http://jquery-icolor.googlecode.com/svn/tags/ http://code.google.com/p/jquery-icolor/downloads/l…</summary>
        <content type="html">&lt;p&gt;色空間&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;と色のアニメーションを拡張する&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3&quot;&gt;プラグイン&lt;/a&gt; &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt;.iColor をバージョンアップしました。&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20100911042230&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20100911/20100911042230.png&quot; alt=&quot;f:id:ja9:20100911042230p:image&quot; title=&quot;f:id:ja9:20100911042230p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D0%A5%B0%A5%D5%A5%A3%A5%C3%A5%AF%A5%B9&quot;&gt;バグフィックス&lt;/a&gt;のみで、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;なども以前と同等になりますので、使い方については、下記エントリを参照してください。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt;.iColor の使い方&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://d.hatena.ne.jp/ja9/20100911/1284146159&quot;&gt;&amp;#x8272;&amp;#x7A7A;&amp;#x9593;&amp;#x30E1;&amp;#x30BD;&amp;#x30C3;&amp;#x30C9;&amp;#x3068;&amp;#x8272;&amp;#x306E;&amp;#x30A2;&amp;#x30CB;&amp;#x30E1;&amp;#x30FC;&amp;#x30B7;&amp;#x30E7;&amp;#x30F3;&amp;#x3092;&amp;#x62E1;&amp;#x5F35;&amp;#x3059;&amp;#x308B;jQuery&amp;#x30D7;&amp;#x30E9;&amp;#x30B0;&amp;#x30A4;&amp;#x30F3;iColor&amp;#x3092;&amp;#x66F8;&amp;#x3044;&amp;#x305F; - &amp;#x4ECA;&amp;#x65E5;&amp;#x3082;&amp;#x9069;&amp;#x5F53;&amp;#x30C0;&amp;#x30A4;&amp;#x30A2;&amp;#x30EA;&amp;#x30FC;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ファイルはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://jquery-icolor.googlecode.com/svn/tags/&quot;&gt;http://jquery-icolor.googlecode.com/svn/tags/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://code.google.com/p/jquery-icolor/downloads/list&quot;&gt;http://code.google.com/p/jquery-icolor/downloads/list&lt;/a&gt; (圧縮ファイル)&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;デモはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.icolor.html&quot;&gt;jQuery.iColor - jQueryPlugin DEMO&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;</content>        
        <category term="jQuery" label="jQuery" />
        
        <category term="javascript" label="javascript" />
        
        <category term="jQuery.iColor" label="jQuery.iColor" />
        
        <category term="色" label="色" />
        
        <category term="色空間" label="色空間" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/4b02ec6278a97b58d65a6daaa04602b1b288a9f0/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20100911%2F20100911042230.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>選択範囲のテキストを操作するjQueryプラグインjQuery.selection</title>
        <link href="https://blog.madapaja.net/entry/20100917/1284146159"/>
        <id>hatenablog://entry/8454420450091973280</id>
        <published>2010-09-17T04:15:59+09:00</published>
        <updated>2015-04-30T11:48:41+09:00</updated>        <summary type="html">以下の内容は、古い内容です。 新しい記事で情報を確認してください。 http://blog.madapaja.net/entry/2012/05/09/070500 選択範囲のテキストを操作するためのjQueryプラグイン jQuery.selection を書いたので、アップしました。IE6やFireFox3.5、Google Chrome 6など主要なブラウザでチェック済みです。 ファイルはこちら http://jquery-selection.googlecode.com/svn/tags/（URLが間違っていたため訂正しました） http://code.google.com/p/jqu…</summary>
        <content type="html">
    &lt;blockquote&gt;
        &lt;p&gt;&lt;span class=&quot;deco&quot; style=&quot;font-weight:bold;&quot;&gt;以下の内容は、古い内容です。&lt;/span&gt;&lt;br /&gt;
新しい記事で情報を確認してください。&lt;br /&gt;
&lt;a href=&quot;http://blog.madapaja.net/entry/2012/05/09/070500&quot;&gt;http://blog.madapaja.net/entry/2012/05/09/070500&lt;/a&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;

    &lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
選択範囲のテキストを操作するためのjQueryプラグイン jQuery.selection を書いたので、アップしました。&lt;/p&gt;&lt;p&gt;IE6やFireFox3.5、Google Chrome 6など主要なブラウザでチェック済みです。&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20100917192023&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20100917/20100917192023.png&quot; alt=&quot;f:id:ja9:20100917192023p:image&quot; title=&quot;f:id:ja9:20100917192023p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ファイルはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://jquery-selection.googlecode.com/svn/tags/&quot;&gt;http://jquery-selection.googlecode.com/svn/tags/&lt;/a&gt;&lt;span style=&quot;color:#666666;&quot;&gt;（URLが間違っていたため訂正しました）&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;http://code.google.com/p/jquery-selection/downloads/list&quot;&gt;http://code.google.com/p/jquery-selection/downloads/list&lt;/a&gt; (圧縮ファイル)&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;デモはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.selection.html&quot;&gt;jQuery.selection - jQuery Plugin DEMO&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;簡単な説明&lt;/h4&gt;
    
&lt;dl&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;$.getSelection([mode = &#39;text&#39;])&lt;/span&gt;:HTMLドキュメント内の選択されたテキスト/HTMLを取得する&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;getSelection()&lt;/span&gt;:テキストボックス/エリアの選択されたテキストを取得する&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;replaceSelection(text[, caret = &#39;keep&#39;])&lt;/span&gt;:テキストボックス/エリアの選択されたテキストを置換する&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;insertBeforeSelection(text[, caret = &#39;keep&#39;])&lt;/span&gt;:テキストボックス/エリアの選択されたテキストの前に文字列を挿入する&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;insertAfterSelection(text[, caret = &#39;keep&#39;])&lt;/span&gt;:テキストボックス/エリアの選択されたテキストの後に文字列を挿入する&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;getCaretPos()&lt;/span&gt;:テキストボックス/エリアの選択範囲を取得する&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;setCaretPos(range):テキストボックス/エリアの選択範囲を設定する&lt;/span&gt;&lt;/dd&gt;
&lt;/dl&gt;&lt;p&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.selection.html&quot;&gt;&amp;#x30C7;&amp;#x30E2;&lt;/a&gt;も併せてご確認ください。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;$.getSelection([mode = &#39;text&#39;])&lt;/h4&gt;
    &lt;p&gt;&lt;span style=&quot;color:#0066FF;&quot;&gt;HTMLドキュメント内の選択されたテキスト/HTMLを取得する&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;mode&lt;/h5&gt;
    &lt;p&gt;modeには、&#39;text&#39;もしくは&#39;html&#39;を指定します。&lt;br /&gt;
指定しなかった場合は、&#39;text&#39;となります。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;返り値&lt;/h5&gt;
    &lt;p&gt;String型で mode に指定した値によって、選択されたテキストか、HTMLテキストが返ります。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;getSelection()&lt;/h4&gt;
    &lt;p&gt;&lt;span style=&quot;color:#0066FF;&quot;&gt;テキストボックス/エリアの選択されたテキストを取得する&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;返り値&lt;/h5&gt;
    &lt;p&gt;String型で選択されたテキストが返ります。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;replaceSelection(text[, caret = &#39;keep&#39;])&lt;/h4&gt;
    &lt;p&gt;&lt;span style=&quot;color:#0066FF;&quot;&gt;テキストボックス/エリアの選択されたテキストを置換する&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;text&lt;/h5&gt;
    &lt;p&gt;置換後の文字列を指定します。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;caret&lt;/h5&gt;
    &lt;p&gt;caretには&#39;keep&#39;か&#39;start&#39;、&#39;end&#39;のいずれかを指定します。&lt;br /&gt;
指定しなかった場合は、&#39;keep&#39;となります。&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;keep&lt;/span&gt;:選択範囲を保持します。（指定したtextが選択状態となります）&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;start&lt;/span&gt;:キャレットを選択範囲の最初に移動します&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;end&lt;/span&gt;:キャレットを選択範囲の後ろに移動します&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;insertBeforeSelection(text[, caret = &#39;keep&#39;])&lt;/h4&gt;
    &lt;p&gt;&lt;span style=&quot;color:#0066FF;&quot;&gt;テキストボックス/エリアの選択されたテキストの前に文字列を挿入する&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;text&lt;/h5&gt;
    &lt;p&gt;挿入する文字列を指定します。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;caret&lt;/h5&gt;
    &lt;p&gt;caretには&#39;keep&#39;か&#39;start&#39;、&#39;end&#39;のいずれかを指定します。&lt;br /&gt;
指定しなかった場合は、&#39;keep&#39;となります。&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;keep&lt;/span&gt;:選択範囲を保持します。&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;start&lt;/span&gt;:キャレットを選択範囲の最初に移動します&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;end&lt;/span&gt;:キャレットを選択範囲の後ろに移動します&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;insertAfterSelection(text[, caret = &#39;keep&#39;])&lt;/h4&gt;
    &lt;p&gt;&lt;span style=&quot;color:#0066FF;&quot;&gt;テキストボックス/エリアの選択されたテキストの後に文字列を挿入する&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;text&lt;/h5&gt;
    &lt;p&gt;挿入する文字列を指定します。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;caret&lt;/h5&gt;
    &lt;p&gt;caretには&#39;keep&#39;か&#39;start&#39;、&#39;end&#39;のいずれかを指定します。&lt;br /&gt;
指定しなかった場合は、&#39;keep&#39;となります。&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;keep&lt;/span&gt;:選択範囲を保持します。&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;start&lt;/span&gt;:キャレットを選択範囲の最初に移動します&lt;/dd&gt;
&lt;dt&gt;&lt;/dt&gt;
&lt;dd&gt;bold;&quot;&gt;end&lt;/span&gt;:キャレットを選択範囲の後ろに移動します&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;getCaretPos()&lt;/h4&gt;
    &lt;p&gt;&lt;span style=&quot;color:#0066FF;&quot;&gt;テキストボックス/エリアの選択範囲を取得する&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;返り値&lt;/h5&gt;
    &lt;p&gt;Object型 {start: 選択開始位置, end: 選択終了位置} で選択範囲が返ります。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;例&lt;/h5&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; pos = $(&lt;span class=&quot;synConstant&quot;&gt;&#39;textarea&#39;&lt;/span&gt;).getCaretPos();
&lt;span class=&quot;synStatement&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;synConstant&quot;&gt;&#39;&#39;&lt;/span&gt;+ pos.start + &lt;span class=&quot;synConstant&quot;&gt;&#39; から &#39;&lt;/span&gt; + pos.end + &lt;span class=&quot;synConstant&quot;&gt;&#39;までが選択されています。&#39;&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;setCaretPos(range)&lt;/h4&gt;
    &lt;p&gt;&lt;span style=&quot;color:#0066FF;&quot;&gt;テキストボックス/エリアの選択範囲を設定する&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;range&lt;/h5&gt;
    &lt;p&gt;Object型 {start: 選択開始位置, end: 選択終了位置} で選択範囲を指定します。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;例&lt;/h5&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; strLen = $(&lt;span class=&quot;synConstant&quot;&gt;&#39;textarea&#39;&lt;/span&gt;).val().length; &lt;span class=&quot;synComment&quot;&gt;// 文字数を取得&lt;/span&gt;

&lt;span class=&quot;synComment&quot;&gt;// 全て選択します&lt;/span&gt;
$(&lt;span class=&quot;synConstant&quot;&gt;&#39;textarea&#39;&lt;/span&gt;).setCaretPos(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  start: 0,     &lt;span class=&quot;synComment&quot;&gt;// 最初から&lt;/span&gt;
  end  : strLen &lt;span class=&quot;synComment&quot;&gt;// 最後まで&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ファイルはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://jquery-selection.googlecode.com/svn/tags/&quot;&gt;http://jquery-selection.googlecode.com/svn/tags/&lt;/a&gt;&lt;span style=&quot;color:#666666;&quot;&gt;（URLが間違っていたため訂正しました）&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;http://code.google.com/p/jquery-selection/downloads/list&quot;&gt;http://code.google.com/p/jquery-selection/downloads/list&lt;/a&gt; (圧縮ファイル)&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;デモはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.selection.html&quot;&gt;jQuery.selection - jQuery Plugin DEMO&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;</content>        
        <category term="jQuery" label="jQuery" />
        
        <category term="javascript" label="javascript" />
        
        <category term="jQuery.selection" label="jQuery.selection" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/50ae00946f998736c1712604cb4ee8cb7b45c2c1/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20100917%2F20100917192023.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>色空間メソッドと色のアニメーションを拡張するjQueryプラグインiColorを書いた</title>
        <link href="https://blog.madapaja.net/entry/20100911/1284146159"/>
        <id>hatenablog://entry/8454420450091973293</id>
        <published>2010-09-11T04:15:59+09:00</published>
        <updated>2010-09-11T04:15:59+09:00</updated>        <summary type="html">[色空間] - 今日も適当ダイアリーなどで、色空間の変換についての記事を書きましたが、それらを簡単に使えるように、jQueryプラグインとして書き直しました。まだ、アルファ版なのですが、取り急ぎ公開しておきます。 ファイルはこちら http://jquery-icolor.googlecode.com/svn/tags/ http://code.google.com/p/jquery-icolor/downloads/list (圧縮ファイル) http://www.weekendphp.com/jQuery/jquery.color.js http://www.weekendphp.com/…</summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://d.hatena.ne.jp/ja9/searchdiary?word=%2A%5B%BF%A7%B6%F5%B4%D6%5D&quot;&gt;[&amp;#x8272;&amp;#x7A7A;&amp;#x9593;] - &amp;#x4ECA;&amp;#x65E5;&amp;#x3082;&amp;#x9069;&amp;#x5F53;&amp;#x30C0;&amp;#x30A4;&amp;#x30A2;&amp;#x30EA;&amp;#x30FC;&lt;/a&gt;などで、色空間の変換についての記事を書きましたが、それらを簡単に使えるように、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3&quot;&gt;プラグイン&lt;/a&gt;として書き直しました。&lt;/p&gt;&lt;p&gt;まだ、アルファ版なのですが、取り急ぎ公開しておきます。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ファイルはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://jquery-icolor.googlecode.com/svn/tags/&quot;&gt;http://jquery-icolor.googlecode.com/svn/tags/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://code.google.com/p/jquery-icolor/downloads/list&quot;&gt;http://code.google.com/p/jquery-icolor/downloads/list&lt;/a&gt; (圧縮ファイル)&lt;br /&gt;
&lt;del datetime=&quot;2010-09-21T16:01:56+09:00&quot;&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.color.js&quot;&gt;http://www.weekendphp.com/jQuery/jquery.color.js&lt;/a&gt;&lt;/del&gt;&lt;br /&gt;
&lt;del datetime=&quot;2010-09-21T16:01:56+09:00&quot;&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.color-min.js&quot;&gt;http://www.weekendphp.com/jQuery/jquery.color-min.js&lt;/a&gt;&lt;/del&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;デモはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.icolor.html&quot;&gt;jQuery.iColor - jQueryPlugin DEMO&lt;/a&gt;&lt;br /&gt;
&lt;del datetime=&quot;2010-09-21T16:01:56+09:00&quot;&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.color.html&quot;&gt;jQuery.iColor - jQueryPlugin DEMO&lt;/a&gt;&lt;/del&gt;&lt;/p&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20100911042230&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20100911/20100911042230.png&quot; alt=&quot;f:id:ja9:20100911042230p:image&quot; title=&quot;f:id:ja9:20100911042230p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;簡単な説明&lt;/h4&gt;
    &lt;p&gt;この&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3&quot;&gt;プラグイン&lt;/a&gt;では、jQueyrに下記3つが拡張されます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;animateの拡張（色のアニメーションが行えます）&lt;/li&gt;
&lt;li&gt;getColor&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;の追加（iColorオブジェクトを返します）&lt;/li&gt;
&lt;li&gt;iColorオブジェクト($.iColor)の追加&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;animateを拡張&lt;/h4&gt;
    &lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt;単体ではanimateにて色のアニメーションが行えないのですが、行えるように拡張を行いました。&lt;br /&gt;
また、柔軟な指定に対応しました。&lt;/p&gt;&lt;p&gt;対応したプロパティ名は下記の通りです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;color&lt;/li&gt;
&lt;li&gt;backgroundColor&lt;/li&gt;
&lt;li&gt;borderTopColor&lt;/li&gt;
&lt;li&gt;borderRightColor&lt;/li&gt;
&lt;li&gt;borderBottomColor&lt;/li&gt;
&lt;li&gt;borderLeftColor&lt;/li&gt;
&lt;li&gt;outlineColor&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;値は下記2通りの方法で指定出来ます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/CSS&quot;&gt;CSS&lt;/a&gt;色指定  (※rgba、hsla形式も対応していますが、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/IE&quot;&gt;IE&lt;/a&gt;ではalpha値は無視されます)&lt;/li&gt;
&lt;li&gt;オブジェクト指定&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;サンプルを見た方がわかりやすいと思います。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;$(&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;#test1&amp;quot;&lt;/span&gt;).animate(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  backgroundColor: &lt;span class=&quot;synConstant&quot;&gt;&#39;yellow&#39;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;, 2000);

$(&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;#test2&amp;quot;&lt;/span&gt;).animate(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  backgroundColor: 
  &lt;span class=&quot;synComment&quot;&gt;// オブジェクトとして、一部の値を渡すことも出来ます。&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&#39;h&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;+=1080&#39;&lt;/span&gt;,
    &lt;span class=&quot;synConstant&quot;&gt;&#39;s&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;-=0.3&#39;&lt;/span&gt;,
    &lt;span class=&quot;synConstant&quot;&gt;&#39;mode&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;HSV&#39;&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;, 3000);

$(&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;#test3&amp;quot;&lt;/span&gt;).animate(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  backgroundColor: &lt;span class=&quot;synConstant&quot;&gt;&#39;rgba(255,255,0,0)&#39;&lt;/span&gt;,
  borderTopColor: &lt;span class=&quot;synConstant&quot;&gt;&#39;lightblue&#39;&lt;/span&gt;,
  borderBottomColor: &lt;span class=&quot;synConstant&quot;&gt;&#39;lightblue&#39;&lt;/span&gt;,
  borderLeftColor: &lt;span class=&quot;synConstant&quot;&gt;&#39;lightblue&#39;&lt;/span&gt;,
  borderRightColor: &lt;span class=&quot;synConstant&quot;&gt;&#39;lightblue&#39;&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;, 2000);

$(&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;#test4&amp;quot;&lt;/span&gt;).animate(&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  backgroundColor: &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&#39;r&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;-=100&#39;&lt;/span&gt;,
    &lt;span class=&quot;synConstant&quot;&gt;&#39;b&#39;&lt;/span&gt;: 200,
    &lt;span class=&quot;synConstant&quot;&gt;&#39;a&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;+=0.5&#39;&lt;/span&gt;,
    &lt;span class=&quot;synConstant&quot;&gt;&#39;mode&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;RGB&#39;&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;, 2000);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;getColor&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;の追加&lt;/h4&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;iColor &lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt; getColor(attr)
&lt;/pre&gt;&lt;p&gt;attr には&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/CSS&quot;&gt;CSS&lt;/a&gt;プロパティ名を指定します。&lt;/p&gt;&lt;p&gt;返り値はiColorオブジェクトとなります。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;// iColor オブジェクトが返ります。&lt;/span&gt;
color = $(&lt;span class=&quot;synConstant&quot;&gt;&#39;div#test1&#39;&lt;/span&gt;).getColor(&lt;span class=&quot;synConstant&quot;&gt;&#39;background-color&#39;&lt;/span&gt;);

&lt;span class=&quot;synComment&quot;&gt;// こんな使い方もできます&lt;/span&gt;
$(&lt;span class=&quot;synConstant&quot;&gt;&#39;#getColorTest2&#39;&lt;/span&gt;).text(
  $(&lt;span class=&quot;synConstant&quot;&gt;&#39;div#test1&#39;&lt;/span&gt;).getColor(&lt;span class=&quot;synConstant&quot;&gt;&#39;background-color&#39;&lt;/span&gt;) &lt;span class=&quot;synComment&quot;&gt;// div#test1の背景色を取得&lt;/span&gt;
    .change(&lt;span class=&quot;synConstant&quot;&gt;&#39;h&#39;&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;&#39;+=30&#39;&lt;/span&gt;) &lt;span class=&quot;synComment&quot;&gt;// hue (色相) を +30度 変える&lt;/span&gt;
    .getStr() &lt;span class=&quot;synComment&quot;&gt;// 色表現文字列を取得&lt;/span&gt;
);
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;iColorオブジェクトの追加&lt;/h4&gt;
    &lt;p&gt;iColorオブジェクトは下記のいずれかにより生成されます。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;// A) getColorメソッド&lt;/span&gt;
color = $(&lt;span class=&quot;synConstant&quot;&gt;&#39;div#test1&#39;&lt;/span&gt;).getColor(&lt;span class=&quot;synConstant&quot;&gt;&#39;background-color&#39;&lt;/span&gt;);

&lt;span class=&quot;synComment&quot;&gt;// B) iColorコンストラクタ&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;// B-1. 引数指定&lt;/span&gt;
color = jQuery.iColor(color1, color2, color3, &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;type = &lt;span class=&quot;synConstant&quot;&gt;&#39;RGB&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;);
color = jQuery.iColor(color1 color2, color3, &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;alpha&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;type = &lt;span class=&quot;synConstant&quot;&gt;&#39;RGBA&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;);

&lt;span class=&quot;synComment&quot;&gt;// color1〜3は数値ですが、typeにより取り得る範囲が異なります。&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;//      R, G, B: 0 〜 255 または 0% 〜 100%&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;//      H: 0〜360 (角度なので 0 と 360 は同値)&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;//      S, V, L: 0 〜 1 または 0% 〜 100%&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;// alpha 値は 0〜1の数値です。&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;// type は色空間を表し次のいずれかを取ります。&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;//      &#39;RGB&#39;, &#39;RGBA&#39;, &#39;HSV&#39;, &#39;HSVA&#39;, &#39;HLS&#39;, &#39;HLSA&#39;, &#39;HSL&#39;, &#39;HSLA&#39;&lt;/span&gt;

&lt;span class=&quot;synComment&quot;&gt;// B-2. 配列指定&lt;/span&gt;
color = jQuery.iColor(colorArray, &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;type = &lt;span class=&quot;synConstant&quot;&gt;&#39;RGB&#39;&lt;/span&gt;||&lt;span class=&quot;synConstant&quot;&gt;&#39;RGBA&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;);
&lt;span class=&quot;synComment&quot;&gt;// colorArray は [color1, color2, color3]&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;// または [color1, color2, color3, alpha] となります。 &lt;/span&gt;

&lt;span class=&quot;synComment&quot;&gt;// B-3. オブジェクト指定&lt;/span&gt;
color = jQuery.iColor(colorArray, &lt;span class=&quot;synIdentifier&quot;&gt;[&lt;/span&gt;type = &lt;span class=&quot;synConstant&quot;&gt;&#39;RGB&#39;&lt;/span&gt;||&lt;span class=&quot;synConstant&quot;&gt;&#39;RGBA&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;]&lt;/span&gt;);
&lt;span class=&quot;synComment&quot;&gt;// 例： jQuery.iColor({r: 255, g: 255, b: 255}, &#39;RGB&#39;);&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;//      jQuery.iColor({r: 255, g: 255, b: 255, type: &#39;RGB&#39;});&lt;/span&gt;

&lt;span class=&quot;synComment&quot;&gt;// B-4. CSS色表現指定&lt;/span&gt;
color = jQuery.iColor(colorStr);
&lt;span class=&quot;synComment&quot;&gt;// colorStr は、 blue や #rrggbb、rgb(255,255,0)、hsla(300,10%,50%,1) など&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;iColorオブジェクトのプロパティ&lt;/h4&gt;
    &lt;p&gt;iColorオブジェクトは下記のプロパティを持ちます。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;typeプロパティ&lt;/h5&gt;
    &lt;p&gt;type プロパティは色空間を表し次のいずれかを取ります。&lt;br /&gt;
&#39;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt;&#39;, &#39;RGBA&#39;, &#39;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt;&#39;, &#39;HSVA&#39;, &#39;HLS&#39;, &#39;HLSA&#39;, &#39;HSL&#39;, &#39;HSLA&#39;&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;色要素プロパティ&lt;/h5&gt;
    &lt;p&gt;typeプロパティに応じて、それぞれの色要素プロパティを持ちます。&lt;br /&gt;
たとえば、typeが&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt;だった場合、r、g、bという3つの色要素プロパティを持つことになります。&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;iColorオブジェクトの&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;&lt;/h4&gt;
    &lt;p&gt;iColorオブジェクトは下記の&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;を持ちます。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;string function getStr([format = &#39;#xxx&#39;])&lt;/h5&gt;
    &lt;p&gt;iColorオブジェクトの&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/CSS&quot;&gt;CSS&lt;/a&gt;色表現文字列を返します。&lt;/p&gt;&lt;p&gt;format は下記のいずれかを取ります&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;#xxx&lt;/dt&gt;
&lt;dd&gt;#fffのような(可能であれば、短い)16進表現でテキストを返します。&lt;/dd&gt;
&lt;dt&gt;#xxxxxx&lt;/dt&gt;
&lt;dd&gt;#ffffffのような6桁の6進表現でテキストを返します。&lt;/dd&gt;
&lt;dt&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/rgb&quot;&gt;rgb&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/rgb&quot;&gt;rgb&lt;/a&gt;(255, 255, 255) または、rgba(255, 255, 255, 1)形式で返します。&lt;/dd&gt;
&lt;dt&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/rgb&quot;&gt;rgb&lt;/a&gt;%&lt;/dt&gt;
&lt;dd&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/rgb&quot;&gt;rgb&lt;/a&gt;(100%, 100%, 100%) または、rgba(100%, 100%, 100%, 1)形式で返します。&lt;/dd&gt;
&lt;dt&gt;hsl&lt;/dt&gt;
&lt;dd&gt;hsl(350, 0.5, 1) または、hsla(350, 0.5, 1, 1)形式で返します。&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function to(type)&lt;/h5&gt;
    
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function toRGB()&lt;/h5&gt;
    
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function toRGBA()&lt;/h5&gt;
    
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function toHSV()&lt;/h5&gt;
    
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function toHSVA()&lt;/h5&gt;
    
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function toHSL()&lt;/h5&gt;
    
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function toHSLA()&lt;/h5&gt;
    
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function toHLS()&lt;/h5&gt;
    
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function toHLSA()&lt;/h5&gt;
    &lt;p&gt;iColorオブジェクトの色空間変換し、新しいiColorオブジェクトを返します。&lt;br /&gt;
toXXX 形式は、to(&#39;XXX&#39;)のショートカットであり、同一の挙動をします。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;iColor function change(target, val, mode)&lt;/h5&gt;
    &lt;p&gt;iColorオブジェクトの特定の色要素を変更し、新しいiColorオブジェクトを返します。&lt;/p&gt;&lt;p&gt;target には変更したい色要素名（1文字の文字列）を指定します。&lt;/p&gt;&lt;p&gt;val には、変更したい値(1 や &#39;255&#39; など)、もしくは変化させたい量(&#39;+=0.1&#39; や &#39;-=30&#39; など)を指定出来ます。&lt;/p&gt;&lt;p&gt;詳細はデモで確認してください。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;ファイルはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://jquery-icolor.googlecode.com/svn/tags/&quot;&gt;http://jquery-icolor.googlecode.com/svn/tags/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://code.google.com/p/jquery-icolor/downloads/list&quot;&gt;http://code.google.com/p/jquery-icolor/downloads/list&lt;/a&gt; (圧縮ファイル)&lt;br /&gt;
&lt;del datetime=&quot;2010-09-21T16:01:56+09:00&quot;&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.color.js&quot;&gt;http://www.weekendphp.com/jQuery/jquery.color.js&lt;/a&gt;&lt;/del&gt;&lt;br /&gt;
&lt;del datetime=&quot;2010-09-21T16:01:56+09:00&quot;&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.color-min.js&quot;&gt;http://www.weekendphp.com/jQuery/jquery.color-min.js&lt;/a&gt;&lt;/del&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;デモはこちら&lt;/h5&gt;
    &lt;p&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.icolor.html&quot;&gt;jQuery.iColor - jQueryPlugin DEMO&lt;/a&gt;&lt;br /&gt;
&lt;del datetime=&quot;2010-09-21T16:01:56+09:00&quot;&gt;&lt;a href=&quot;http://www.weekendphp.com/jQuery/jquery.color.html&quot;&gt;jQuery.iColor - jQueryPlugin DEMO&lt;/a&gt;&lt;/del&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;</content>        
        <category term="jQuery" label="jQuery" />
        
        <category term="javascript" label="javascript" />
        
        <category term="jQuery.iColor" label="jQuery.iColor" />
        
        <category term="色" label="色" />
        
        <category term="色空間" label="色空間" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/4b02ec6278a97b58d65a6daaa04602b1b288a9f0/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20100911%2F20100911042230.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title> RGB色空間とHLS(HSL, HSI)色空間の相互変換 Javascript版</title>
        <link href="https://blog.madapaja.net/entry/20100907/1283840213"/>
        <id>hatenablog://entry/8454420450091973312</id>
        <published>2010-09-07T15:16:53+09:00</published>
        <updated>2010-09-07T15:16:53+09:00</updated>        <summary type="html">RGB色空間とHSV色空間の相互変換 Javascript版 - 今日も適当ダイアリー で Javascript での RGB と HSV の相互変換処理を書いたので、今度はRGB と HLS（HSL、HSIと呼ばれる事もある）の相互変換をメモ。HLS色空間については HLS色空間 - Wikipedia などを参照してください。 RGB から HLS色空間へのコンバート /** * RGB を HLS へ変換します * * @param {Number} r red値 ※ 0〜255 の数値 * @param {Number} g green値 ※ 0〜255 の数値 * @param {N…</summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://d.hatena.ne.jp/ja9/20100903/1283504341&quot;&gt;RGB&amp;#x8272;&amp;#x7A7A;&amp;#x9593;&amp;#x3068;HSV&amp;#x8272;&amp;#x7A7A;&amp;#x9593;&amp;#x306E;&amp;#x76F8;&amp;#x4E92;&amp;#x5909;&amp;#x63DB; Javascript&amp;#x7248; - &amp;#x4ECA;&amp;#x65E5;&amp;#x3082;&amp;#x9069;&amp;#x5F53;&amp;#x30C0;&amp;#x30A4;&amp;#x30A2;&amp;#x30EA;&amp;#x30FC;&lt;/a&gt; で &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Javascript&quot;&gt;Javascript&lt;/a&gt; での &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt; と &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt; の相互変換処理を書いたので、今度は&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt; と HLS（HSL、HSIと呼ばれる事もある）の相互変換をメモ。&lt;/p&gt;&lt;p&gt;HLS色空間については &lt;a href=&quot;http://ja.wikipedia.org/wiki/HLS%E8%89%B2%E7%A9%BA%E9%96%93&quot;&gt;HLS&amp;#x8272;&amp;#x7A7A;&amp;#x9593; - Wikipedia&lt;/a&gt; などを参照してください。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt; から HLS色空間へのコンバート&lt;/h4&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * RGB を HLS へ変換します&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  r         red値   ※ 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  g         green値 ※ 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  b         blue値  ※ 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @return  {Object}  {h, l, s} ※ h は 0〜360の数値、l/s は 0〜1 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt; RGBtoHLS(r, g, b) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; h, &lt;span class=&quot;synComment&quot;&gt;// 0..360&lt;/span&gt;
      l, s; &lt;span class=&quot;synComment&quot;&gt;// 0..1&lt;/span&gt;

  &lt;span class=&quot;synComment&quot;&gt;// 0..1 に変換&lt;/span&gt;
  r = r / 255;
  g = g / 255;
  b = b / 255;
  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; max = Math.max(Math.max(r, g), b),
      min = Math.min(Math.min(r, g), b);

  &lt;span class=&quot;synComment&quot;&gt;// hue の計算&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (max == min) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h = 0; &lt;span class=&quot;synComment&quot;&gt;// 本来は定義されないが、仮に0を代入&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (max == r) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h = 60 * (g - b) / (max - min) + 0;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (max == g) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h = (60 * (b - r) / (max - min)) + 120;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h = (60 * (r - g) / (max - min)) + 240;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synStatement&quot;&gt;while&lt;/span&gt; (h &amp;lt; 0) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h += 360;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synComment&quot;&gt;// Lightness の計算&lt;/span&gt;
  l = (max + min) / 2;

  &lt;span class=&quot;synComment&quot;&gt;// Saturation の計算&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (max == min) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    s = 0;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    s = (l &amp;lt; 0.5)
      ? (max - min) / (max + min)
      : (max - min) / (2.0 - max - min);
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&#39;h&#39;&lt;/span&gt;: h, &lt;span class=&quot;synConstant&quot;&gt;&#39;l&#39;&lt;/span&gt;: l, &lt;span class=&quot;synConstant&quot;&gt;&#39;s&#39;&lt;/span&gt;: s, &lt;span class=&quot;synConstant&quot;&gt;&#39;type&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;HLS&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;HLS から &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt;色空間へのコンバート&lt;/h4&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * HLS を RGB へ変換します&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  h         hue値        ※ 0〜360の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  l         lightness値  ※ 0〜1 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  s         saturation値 ※ 0〜1 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @return  {Object}  {r, g, b} ※ r/g/b は 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt; HLStoRGB(h, l, s) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; r, g, b; &lt;span class=&quot;synComment&quot;&gt;// 0..255&lt;/span&gt;

  &lt;span class=&quot;synStatement&quot;&gt;while&lt;/span&gt; (h &amp;lt; 0) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h += 360;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
  h = h % 360;

  &lt;span class=&quot;synComment&quot;&gt;// 特別な場合 saturation = 0&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (s == 0) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// → RGB は V に等しい&lt;/span&gt;
    l = Math.round(l * 255);
    &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&#39;r&#39;&lt;/span&gt;: l, &lt;span class=&quot;synConstant&quot;&gt;&#39;g&#39;&lt;/span&gt;: l, &lt;span class=&quot;synConstant&quot;&gt;&#39;b&#39;&lt;/span&gt;: l, &lt;span class=&quot;synConstant&quot;&gt;&#39;type&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;RGB&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; m2 = (l &amp;lt; 0.5) ? l * (1 + s) : l + s - l * s,
      m1 = l * 2 - m2,
      tmp;

  tmp = h + 120;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;gt; 360) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    tmp = tmp - 360
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 60) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    r = (m1 + (m2 - m1) * tmp / 60);
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 180) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    r = m2;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 240) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    r = m1 + (m2 - m1) * (240 - tmp) / 60;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    r = m1;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  tmp = h;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 60) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    g = m1 + (m2 - m1) * tmp / 60;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 180) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    g = m2;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 240) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    g = m1 + (m2 - m1) * (240 - tmp) / 60;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    g = m1;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  tmp = h - 120;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 0) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    tmp = tmp + 360
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 60) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    b = m1 + (m2 - m1) * tmp / 60;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 180) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    b = m2;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (tmp &amp;lt; 240) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    b = m1 + (m2 - m1) * (240 - tmp) / 60;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    b = m1;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&#39;r&#39;&lt;/span&gt;: Math.round(r * 255), &lt;span class=&quot;synConstant&quot;&gt;&#39;g&#39;&lt;/span&gt;: Math.round(g * 255), &lt;span class=&quot;synConstant&quot;&gt;&#39;b&#39;&lt;/span&gt;: Math.round(b * 255), &lt;span class=&quot;synConstant&quot;&gt;&#39;type&#39;&lt;/span&gt;: &lt;span class=&quot;synConstant&quot;&gt;&#39;RGB&#39;&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;ためしてみる&lt;/h4&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; r = 10, g = 155, b = 200, hls, rgb;
hls = RGBtoHLS(r, g, b);
rgb = HLStoRGB(hls.h, hls.l, hls.s);

&lt;span class=&quot;synStatement&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;synConstant&quot;&gt;&#39;R: &#39;&lt;/span&gt; + r + &lt;span class=&quot;synConstant&quot;&gt;&#39;, G: &#39;&lt;/span&gt; + g + &lt;span class=&quot;synConstant&quot;&gt;&#39;, B: &#39;&lt;/span&gt; + b + &lt;span class=&quot;synSpecial&quot;&gt;&#39;\n&#39;&lt;/span&gt; +
  &lt;span class=&quot;synConstant&quot;&gt;&#39; =&amp;gt; H : &#39;&lt;/span&gt; + hls.h + &lt;span class=&quot;synConstant&quot;&gt;&#39;, L: &#39;&lt;/span&gt; + hls.l + &lt;span class=&quot;synConstant&quot;&gt;&#39;, S: &#39;&lt;/span&gt; + hls.s + &lt;span class=&quot;synSpecial&quot;&gt;&#39;\n&#39;&lt;/span&gt; +
  &lt;span class=&quot;synConstant&quot;&gt;&#39; =&amp;gt; R : &#39;&lt;/span&gt; + rgb.r + &lt;span class=&quot;synConstant&quot;&gt;&#39;, G: &#39;&lt;/span&gt; + rgb.g + &lt;span class=&quot;synConstant&quot;&gt;&#39;, B: &#39;&lt;/span&gt; + rgb.b);
&lt;/pre&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20100907151606&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20100907/20100907151606.png&quot; alt=&quot;f:id:ja9:20100907151606p:image&quot; title=&quot;f:id:ja9:20100907151606p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;/div&gt;</content>        
        <category term="javascript" label="javascript" />
        
        <category term="色空間" label="色空間" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/9f03d5c60f948b9795c8f25bf88d74888649c3db/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20100907%2F20100907151606.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title> RGB色空間とHSV色空間の相互変換 Javascript版</title>
        <link href="https://blog.madapaja.net/entry/20100903/1283504341"/>
        <id>hatenablog://entry/8454420450091973324</id>
        <published>2010-09-03T17:59:01+09:00</published>
        <updated>2010-09-03T17:59:01+09:00</updated>        <summary type="html">RGB色空間とHSV色空間の相互変換 PHP版 - 今日も適当ダイアリー の記事に、「Javascript RGB HSV変換」というキーワード検索で入ってくる方がいらっしゃるようなので、Javascript版も一応掲載しておきます。HSV色空間については HSV色空間 - Wikipedia を参照してください。 上記Wikipediaに載っている変換式をそのままjavascriptにしただけなので、特に難しい事はしていません。 jQueryのプラグインにすれば、ちょっとした時に使えるかも？と思いましたが、意外に面倒そうなので、書いたらあらためて、このブログで紹介したいと思います。 RGB …</summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://d.hatena.ne.jp/ja9/20100831/1283181870&quot;&gt;RGB&amp;#x8272;&amp;#x7A7A;&amp;#x9593;&amp;#x3068;HSV&amp;#x8272;&amp;#x7A7A;&amp;#x9593;&amp;#x306E;&amp;#x76F8;&amp;#x4E92;&amp;#x5909;&amp;#x63DB; PHP&amp;#x7248; - &amp;#x4ECA;&amp;#x65E5;&amp;#x3082;&amp;#x9069;&amp;#x5F53;&amp;#x30C0;&amp;#x30A4;&amp;#x30A2;&amp;#x30EA;&amp;#x30FC;&lt;/a&gt; の記事に、「&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Javascript&quot;&gt;Javascript&lt;/a&gt; &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt; &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt;変換」というキーワード検索で入ってくる方がいらっしゃるようなので、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Javascript&quot;&gt;Javascript&lt;/a&gt;版も一応掲載しておきます。&lt;/p&gt;&lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt;色空間については &lt;a href=&quot;http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93&quot;&gt;HSV&amp;#x8272;&amp;#x7A7A;&amp;#x9593; - Wikipedia&lt;/a&gt; を参照してください。&lt;br /&gt;
上記&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Wikipedia&quot;&gt;Wikipedia&lt;/a&gt;に載っている変換式をそのまま&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/javascript&quot;&gt;javascript&lt;/a&gt;にしただけなので、特に難しい事はしていません。&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/jQuery&quot;&gt;jQuery&lt;/a&gt;の&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3&quot;&gt;プラグイン&lt;/a&gt;にすれば、ちょっとした時に使えるかも？と思いましたが、意外に面倒そうなので、書いたらあらためて、このブログで紹介したいと思います。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt; から &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt;色空間へのコンバート&lt;/h4&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * RGB配列 を HSV配列 へ変換します&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  r         red値   ※ 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  g         green値 ※ 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  b         blue値  ※ 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Boolean} coneModel 円錐モデルにするか&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @return  {Object}  {h, s, v} ※ h は 0〜360の数値、s/v は 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt; RGBtoHSV (r, g, b, coneModel) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; h, &lt;span class=&quot;synComment&quot;&gt;// 0..360&lt;/span&gt;
      s, v, &lt;span class=&quot;synComment&quot;&gt;// 0..255&lt;/span&gt;
      max = Math.max(Math.max(r, g), b),
      min = Math.min(Math.min(r, g), b);

  &lt;span class=&quot;synComment&quot;&gt;// hue の計算&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (max == min) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h = 0; &lt;span class=&quot;synComment&quot;&gt;// 本来は定義されないが、仮に0を代入&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (max == r) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h = 60 * (g - b) / (max - min) + 0;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (max == g) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h = (60 * (b - r) / (max - min)) + 120;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h = (60 * (r - g) / (max - min)) + 240;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synStatement&quot;&gt;while&lt;/span&gt; (h &amp;lt; 0) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h += 360;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synComment&quot;&gt;// saturation の計算&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (coneModel) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// 円錐モデルの場合&lt;/span&gt;
    s = max - min;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    s = (max == 0)
      ? 0 &lt;span class=&quot;synComment&quot;&gt;// 本来は定義されないが、仮に0を代入&lt;/span&gt;
      : (max - min) / max * 255;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synComment&quot;&gt;// value の計算&lt;/span&gt;
  v = max;

  &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&#39;h&#39;&lt;/span&gt;: h, &lt;span class=&quot;synConstant&quot;&gt;&#39;s&#39;&lt;/span&gt;: s, &lt;span class=&quot;synConstant&quot;&gt;&#39;v&#39;&lt;/span&gt;: v&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt; から &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt;色空間へのコンバート&lt;/h4&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * HSV配列 を RGB配列 へ変換します&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  h         hue値        ※ 0〜360の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  s         saturation値 ※ 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   {Number}  v         value値      ※ 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @return  {Object}  {r, g, b} ※ r/g/b は 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt; HSVtoRGB (h, s, v) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; r, g, b; &lt;span class=&quot;synComment&quot;&gt;// 0..255&lt;/span&gt;

  &lt;span class=&quot;synStatement&quot;&gt;while&lt;/span&gt; (h &amp;lt; 0) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    h += 360;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  h = h % 360;

  &lt;span class=&quot;synComment&quot;&gt;// 特別な場合 saturation = 0&lt;/span&gt;
  &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (s == 0) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// → RGB は V に等しい&lt;/span&gt;
    v = Math.round(v);
    &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&#39;r&#39;&lt;/span&gt;: v, &lt;span class=&quot;synConstant&quot;&gt;&#39;g&#39;&lt;/span&gt;: v, &lt;span class=&quot;synConstant&quot;&gt;&#39;b&#39;&lt;/span&gt;: v&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  s = s / 255;

  &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; i = Math.floor(h / 60) % 6,
      f = (h / 60) - i,
      p = v * (1 - s),
      q = v * (1 - f * s),
      t = v * (1 - (1 - f) * s)

  &lt;span class=&quot;synStatement&quot;&gt;switch&lt;/span&gt; (i) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; 0 :
      r = v;  g = t;  b = p;  &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
    &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; 1 :
      r = q;  g = v;  b = p;  &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
    &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; 2 :
      r = p;  g = v;  b = t;  &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
    &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; 3 :
      r = p;  g = q;  b = v;  &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
    &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; 4 :
      r = t;  g = p;  b = v;  &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
    &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; 5 :
      r = v;  g = p;  b = q;  &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
  &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;&#39;r&#39;&lt;/span&gt;: Math.round(r), &lt;span class=&quot;synConstant&quot;&gt;&#39;g&#39;&lt;/span&gt;: Math.round(g), &lt;span class=&quot;synConstant&quot;&gt;&#39;b&#39;&lt;/span&gt;: Math.round(b)&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;ためしてみる&lt;/h4&gt;
    &lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; r = 10, g = 155, b = 200, hsv, rgb;
hsv = RGBtoHSV(r, g, b);
rgb = HSVtoRGB(hsv.h, hsv.s, hsv.v);

&lt;span class=&quot;synStatement&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;synConstant&quot;&gt;&#39;R: &#39;&lt;/span&gt; + r + &lt;span class=&quot;synConstant&quot;&gt;&#39;, G: &#39;&lt;/span&gt; + g + &lt;span class=&quot;synConstant&quot;&gt;&#39;, B: &#39;&lt;/span&gt; + b + &lt;span class=&quot;synSpecial&quot;&gt;&#39;\n&#39;&lt;/span&gt; +
  &lt;span class=&quot;synConstant&quot;&gt;&#39; =&amp;gt; H : &#39;&lt;/span&gt; + hsv.h + &lt;span class=&quot;synConstant&quot;&gt;&#39;, S: &#39;&lt;/span&gt; + hsv.s + &lt;span class=&quot;synConstant&quot;&gt;&#39;, V: &#39;&lt;/span&gt; + hsv.v + &lt;span class=&quot;synSpecial&quot;&gt;&#39;\n&#39;&lt;/span&gt; +
  &lt;span class=&quot;synConstant&quot;&gt;&#39; =&amp;gt; R : &#39;&lt;/span&gt; + rgb.r + &lt;span class=&quot;synConstant&quot;&gt;&#39;, G: &#39;&lt;/span&gt; + rgb.g + &lt;span class=&quot;synConstant&quot;&gt;&#39;, B: &#39;&lt;/span&gt; + rgb.b);
&lt;/pre&gt;&lt;p&gt;&lt;span itemscope itemtype=&quot;http://schema.org/Photograph&quot;&gt;&lt;a href=&quot;http://f.hatena.ne.jp/ja9/20100903175838&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;url&quot;&gt;&lt;img src=&quot;http://cdn-ak.f.st-hatena.com/images/fotolife/j/ja9/20100903/20100903175838.png&quot; alt=&quot;f:id:ja9:20100903175838p:image&quot; title=&quot;f:id:ja9:20100903175838p:image&quot; class=&quot;hatena-fotolife&quot; itemprop=&quot;image&quot;&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;/div&gt;</content>        
        <category term="javascript" label="javascript" />
        
        <category term="色空間" label="色空間" />
        
        <link rel="enclosure" href="https://cdn.image.st-hatena.com/image/scale/55d9a73f844bbc2b7aa175121a77b6d75eab218b/backend=imagemagick;version=1;width=1300/http%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fj%2Fja9%2F20100903%2F20100903175838.png" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>SlicehostからさくらのVPSへ乗り換えようか</title>
        <link href="https://blog.madapaja.net/entry/20100902/1283414153"/>
        <id>hatenablog://entry/8454420450091973330</id>
        <published>2010-09-02T16:55:53+09:00</published>
        <updated>2010-09-02T16:55:53+09:00</updated>        <summary type="html">趣味利用のサーバーとして、Rackspace Managed Cloud Services—More than just infrastructureを使っているんだけど、VPS（仮想専用サーバ）｜さくらインターネット - 無料お試し実施中に乗り換えようか考えている。 とりあえず、昨日、申し込みをして、さくらのVPSをお試し中。基本的なスペック（価格も含めて）は、さくらのVPSが上回っているんだけど、ちょっと僕が迷っているのは下記の3点だ。 Slicehostで出来て、さくらのVPSで出来ないこと （自分が迷っている点のみ） IPアドレス追加がない(1個だけ) もう1つ(計2つ)欲しいんだよね…</summary>
        <content type="html">&lt;p&gt;趣味利用のサーバーとして、&lt;a href=&quot;http://www.slicehost.com/&quot;&gt;Rackspace Managed Cloud Services&amp;mdash;More than just infrastructure&lt;/a&gt;を使っているんだけど、&lt;a href=&quot;http://vps.sakura.ad.jp/&quot;&gt;VPS&amp;#xFF08;&amp;#x4EEE;&amp;#x60F3;&amp;#x5C02;&amp;#x7528;&amp;#x30B5;&amp;#x30FC;&amp;#x30D0;&amp;#xFF09;&amp;#xFF5C;&amp;#x3055;&amp;#x304F;&amp;#x3089;&amp;#x30A4;&amp;#x30F3;&amp;#x30BF;&amp;#x30FC;&amp;#x30CD;&amp;#x30C3;&amp;#x30C8; - &amp;#x7121;&amp;#x6599;&amp;#x304A;&amp;#x8A66;&amp;#x3057;&amp;#x5B9F;&amp;#x65BD;&amp;#x4E2D;&lt;/a&gt;に乗り換えようか考えている。&lt;br /&gt;
とりあえず、昨日、申し込みをして、さくらの&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/VPS&quot;&gt;VPS&lt;/a&gt;をお試し中。&lt;/p&gt;&lt;p&gt;基本的なスペック（価格も含めて）は、さくらの&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/VPS&quot;&gt;VPS&lt;/a&gt;が上回っているんだけど、ちょっと僕が迷っているのは下記の3点だ。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Slicehost&quot;&gt;Slicehost&lt;/a&gt;で出来て、さくらの&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/VPS&quot;&gt;VPS&lt;/a&gt;で出来ないこと&lt;/h4&gt;
    &lt;p&gt;（自分が迷っている点のみ）&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9&quot;&gt;IPアドレス&lt;/a&gt;追加がない(1個だけ)&lt;/dt&gt;
&lt;dd&gt;もう1つ(計2つ)欲しいんだよね。。&lt;br /&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Slicehost&quot;&gt;Slicehost&lt;/a&gt;の場合は、追加IPは1個につき $2.0で出来る。&lt;/dd&gt;
&lt;dt&gt;ネームサーバがついてこない&lt;/dt&gt;
&lt;dd&gt;自分で動かすのはいやだし。さくらの&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/DNS&quot;&gt;DNS&lt;/a&gt;サーバーでできるのかな？（でも、月額が&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/VPS&quot;&gt;VPS&lt;/a&gt;より高い。。。）&lt;br /&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Slicehost&quot;&gt;Slicehost&lt;/a&gt;なら標準でついてくる。&lt;/dd&gt;
&lt;dt&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9&quot;&gt;IPアドレス&lt;/a&gt;の逆引きができない&lt;/dt&gt;
&lt;dd&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Slicehost&quot;&gt;Slicehost&lt;/a&gt;なら標準でできる。&lt;/dd&gt;
&lt;/dl&gt;&lt;p&gt;オプション対応とかでもいいので、してくれたら、はい変えます！って感じなのだけれど。&lt;/p&gt;&lt;p&gt;もうちょっと悩もうと思う。&lt;/p&gt;&lt;p&gt;結局、さくらに移転することになる気もするけど。&lt;/p&gt;

&lt;/div&gt;</content>        
        <category term="サーバー" label="サーバー" />
        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450091973330/1429416159" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>パスワード(ランダム)文字列を生成してみる</title>
        <link href="https://blog.madapaja.net/entry/20100901/1283327709"/>
        <id>hatenablog://entry/8454420450091973336</id>
        <published>2010-09-01T16:55:09+09:00</published>
        <updated>2010-09-01T16:55:09+09:00</updated>        <summary type="html">パスワード自動生成のための javascript を書いてみた。 要件 要件は、下記の通りとします。 生成する文字列の文字数を指定できること 生成する文字列に使用する文字リストを指定できること 生成する文字列の文字が重複しないようにするか否かを指定できること 関数定義 関数の定義は以下の通り パスワード文字列（ランダム文字列）を生成する @param {Number} i 生成する文字列の文字数 @param {String} s 生成する文字列に使用する文字リスト @param {Boolean} f 文字が重複しないようにするか否か @returns {String} 生成された文字列 素…</summary>
        <content type="html">&lt;p&gt;パスワード自動生成のための &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/javascript&quot;&gt;javascript&lt;/a&gt; を書いてみた。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;要件&lt;/h4&gt;
    &lt;p&gt;要件は、下記の通りとします。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;生成する文字列の文字数を指定できること&lt;/li&gt;
&lt;li&gt;生成する文字列に使用する文字リストを指定できること&lt;/li&gt;
&lt;li&gt;生成する文字列の文字が重複しないようにするか否かを指定できること&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;関数定義&lt;/h4&gt;
    &lt;p&gt;関数の定義は以下の通り&lt;/p&gt;
&lt;pre class=&quot;code&quot; data-lang=&quot;&quot; data-unlink&gt;パスワード文字列（ランダム文字列）を生成する

@param     {Number}   i 生成する文字列の文字数
@param     {String}   s 生成する文字列に使用する文字リスト
@param     {Boolean}  f 文字が重複しないようにするか否か
@returns   {String}   生成された文字列&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;素直にforループでまわしてみる&lt;/h4&gt;
    &lt;p&gt;単純に、forループを使ってランダムな文字列を生成してみます。&lt;/p&gt;&lt;p&gt;なお、今回は、一回限り使えればよかったので無名関数で定義してます。（なので、使いきりです）&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;(&lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt;(i,s,f) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; p = &lt;span class=&quot;synConstant&quot;&gt;&#39;&#39;&lt;/span&gt;;

    &lt;span class=&quot;synStatement&quot;&gt;for&lt;/span&gt; (; i &amp;gt; 0; i--) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// 文字リストからランダムに選択&lt;/span&gt;
        &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; j = Math.floor(Math.random() * s.length);

        &lt;span class=&quot;synComment&quot;&gt;// 結果文字列に追加&lt;/span&gt;
        p += s.charAt(j);

        &lt;span class=&quot;synComment&quot;&gt;// 文字を重複させない場合は今回使った文字をリストから削除&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (f) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
            s = s.substr(0, j) + s.substr(j + 1);
        &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; p;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;)(
    10, &lt;span class=&quot;synComment&quot;&gt;// 文字数&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&#39;ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789&#39;&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// 文字リスト&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;true&lt;/span&gt;); &lt;span class=&quot;synComment&quot;&gt;// 文字を重複させない場合はtrue&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;念のため言っておくと、実際に利用するには、下記のように記述します。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;&lt;span class=&quot;synStatement&quot;&gt;document&lt;/span&gt;.getElementById(&lt;span class=&quot;synConstant&quot;&gt;&#39;ターゲットのID&#39;&lt;/span&gt;).value =
    &lt;span class=&quot;synComment&quot;&gt;/* ここに本体のコード */&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;やっている事は単純で、forループ内で文字リストからランダムな一文字を選択して、それを結果文字列に追加しているだけです。&lt;br /&gt;
文字を重複させない場合は、文字リストから今使った文字を削除していく感じですね。&lt;/p&gt;&lt;p&gt;実行例：&lt;a href=&quot;http://www.weekendphp.com/misc/blog/hatena/ja9/2010-09-01.1.html&quot;&gt;http://www.weekendphp.com/misc/blog/hatena/ja9/2010-09-01.1.html&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;圧縮してみる&lt;/h5&gt;
    &lt;p&gt;上記のコードをあーだこーだして、改行やスペースなどを取っ払って、圧縮（？）してみます。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;(&lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt;(i,s,f)&lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;for&lt;/span&gt;(&lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; m=Math,p=&lt;span class=&quot;synConstant&quot;&gt;&#39;&#39;&lt;/span&gt;;i&amp;gt;0;i--)&lt;span class=&quot;synIdentifier&quot;&gt;{var&lt;/span&gt; j=m.floor(m.random()*s.length);p+=s.charAt(j);s=f?s.substr(0,j)+s.substr(j+1):s&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; p&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;)(10,&lt;span class=&quot;synConstant&quot;&gt;&#39;ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789&#39;&lt;/span&gt;,&lt;span class=&quot;synConstant&quot;&gt;true&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;本体部分は140バイトになりました。&lt;br /&gt;
もっと短く出来ないかと、別の方法も考えてみます。&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;こんどは&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%BA%C6%B5%A2&quot;&gt;再帰&lt;/a&gt;関数にしてみる&lt;/h4&gt;
    &lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%BA%C6%B5%A2&quot;&gt;再帰&lt;/a&gt;関数にすれば、もっと短くなるのでは？と思い、チャレンジしてみます。&lt;/p&gt;&lt;p&gt;今回は、勉強がてら無名関数を&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%BA%C6%B5%A2&quot;&gt;再帰&lt;/a&gt;してみます。&lt;br /&gt;
自分自身は、arguments.calleeで参照できます。&lt;/p&gt;&lt;p&gt;参考：&lt;a href=&quot;https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Functions/arguments/callee&quot;&gt;arguments.callee - JavaScript | MDN&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;(&lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt;(i,s,f) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synIdentifier&quot;&gt;var&lt;/span&gt; j = Math.floor(Math.random() * s.length); &lt;span class=&quot;synComment&quot;&gt;// 文字リストからランダムに選択&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (i &amp;lt;= 1) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; s.charAt(j);
    &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;synComment&quot;&gt;// 文字を重複させない場合は今回使った文字をリストから削除&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; (f) &lt;span class=&quot;synIdentifier&quot;&gt;{&lt;/span&gt;
        s = s.substr(0, j) + s.substr(j + 1);
    &lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;// i &amp;gt; 1 なら再帰させる&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; s.charAt(j) +
            &lt;span class=&quot;synIdentifier&quot;&gt;arguments&lt;/span&gt;.callee(i - 1, s, f); &lt;span class=&quot;synComment&quot;&gt;// 自分自身を呼び出す&lt;/span&gt;
&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;)(
    10, &lt;span class=&quot;synComment&quot;&gt;// 文字数&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;&#39;ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789&#39;&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// 文字リスト&lt;/span&gt;
    &lt;span class=&quot;synConstant&quot;&gt;true&lt;/span&gt;); &lt;span class=&quot;synComment&quot;&gt;// 文字を重複させない場合はtrue&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;やっている事自体は、forの時と大差ありません。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h5&gt;圧縮してみる&lt;/h5&gt;
    &lt;p&gt;あーだこーだします。&lt;/p&gt;
&lt;pre class=&quot;code lang-javascript&quot; data-lang=&quot;javascript&quot; data-unlink&gt;(&lt;span class=&quot;synIdentifier&quot;&gt;function&lt;/span&gt;(i,s,f)&lt;span class=&quot;synIdentifier&quot;&gt;{var&lt;/span&gt; m=Math,j=m.floor(m.random()*s.length);&lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; s.charAt(j)+(i&amp;gt;1?&lt;span class=&quot;synIdentifier&quot;&gt;arguments&lt;/span&gt;.callee(i-1,f?s.substr(0,j)+s.substr(j+1):s,f):&lt;span class=&quot;synConstant&quot;&gt;&#39;&#39;&lt;/span&gt;)&lt;span class=&quot;synIdentifier&quot;&gt;}&lt;/span&gt;)(10,&lt;span class=&quot;synConstant&quot;&gt;&#39;ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789&#39;&lt;/span&gt;,&lt;span class=&quot;synConstant&quot;&gt;true&lt;/span&gt;);
&lt;/pre&gt;&lt;p&gt;どうかな？&lt;br /&gt;
と思ったら、本体部分は144バイトでした。&lt;br /&gt;
forループより4バイト増えてしまいました。&lt;/p&gt;&lt;p&gt;そもそも、arguments.callee という変数/&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/%A5%E1%A5%BD%A5%C3%A5%C9&quot;&gt;メソッド&lt;/a&gt;名が長いので、不利だったぽいです。&lt;/p&gt;&lt;p&gt;また、時間が時間があったら別の方法も考えてみようかな。&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;</content>        
        <category term="javascript" label="javascript" />
        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450091973336/1429416165" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title> RGB色空間とHSV色空間の相互変換 PHP版</title>
        <link href="https://blog.madapaja.net/entry/20100831/1283181870"/>
        <id>hatenablog://entry/8454420450091973345</id>
        <published>2010-08-31T00:24:30+09:00</published>
        <updated>2010-08-31T00:24:30+09:00</updated>        <summary type="html">PHP配列とCSS色表現の相互変換 - 今日も適当ダイアリー に続いて、 relColors に使った関数を公開します。色の明度や色相を計算するために、いったんRGBで表現された色情報を、HSV色空間に変換した上で計算を行いました。 HSV色空間については HSV色空間 - Wikipedia を参照してください。 RGB から HSV色空間へのコンバート 変換式は、上記したWikipediaに載っているので、それを素直にPHPで書きました。 &lt;?php /** * RGB配列 を HSV配列 へ変換します * * @param array $arr array(r, g, b) ※ r/g/…</summary>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://d.hatena.ne.jp/ja9/20100828/1282964908&quot;&gt;PHP&amp;#x914D;&amp;#x5217;&amp;#x3068;CSS&amp;#x8272;&amp;#x8868;&amp;#x73FE;&amp;#x306E;&amp;#x76F8;&amp;#x4E92;&amp;#x5909;&amp;#x63DB; - &amp;#x4ECA;&amp;#x65E5;&amp;#x3082;&amp;#x9069;&amp;#x5F53;&amp;#x30C0;&amp;#x30A4;&amp;#x30A2;&amp;#x30EA;&amp;#x30FC;&lt;/a&gt; に続いて、 &lt;a href=&quot;http://www.weekendphp.com/relColors/&quot;&gt;relColors&lt;/a&gt; に使った関数を公開します。&lt;/p&gt;&lt;p&gt;色の明度や色相を計算するために、いったん&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt;で表現された色情報を、&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt;色空間に変換した上で計算を行いました。&lt;br /&gt;
&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt;色空間については &lt;a href=&quot;http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93&quot;&gt;HSV&amp;#x8272;&amp;#x7A7A;&amp;#x9593; - Wikipedia&lt;/a&gt; を参照してください。&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt; から &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt;色空間へのコンバート&lt;/h4&gt;
    &lt;p&gt;変換式は、上記した&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/Wikipedia&quot;&gt;Wikipedia&lt;/a&gt;に載っているので、それを素直に&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt;で書きました。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * RGB配列 を HSV配列 へ変換します&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   array   $arr            array(r, g, b) ※ r/g/b は 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   bool    $coneModel      円錐モデルにするか&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @return  array   array(h, s, v) ※h は 0〜360の数値、s/v は 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; RGBtoHSV&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;, &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;coneModel&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// 0..360&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// 0..255&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// 0..255&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;// hue の計算&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// 本来は定義されないが、仮に0を代入&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// MAX = R&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// 60 * (G-B)/(MAX-MIN) + 0&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// MAX = G&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// 60 * (B-R)/(MAX-MIN) + 120&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;120&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// MAX = B&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// 60 * (R-G)/(MAX-MIN) + 240&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;240&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;360&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;// saturation の計算&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;coneModel&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// 円錐モデルの場合&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 本来は定義されないが、仮に0を代入&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;;
        &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;255&lt;/span&gt;;
        &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;// value の計算&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;max&lt;/span&gt;;

    &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;h&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// H&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;s&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// S&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;v&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// V&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
&lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/HSV&quot;&gt;HSV&lt;/a&gt; から &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/RGB&quot;&gt;RGB&lt;/a&gt;色空間へのコンバート&lt;/h4&gt;
    &lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * HSV配列 を RGB配列 へ変換します&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   array   $arr            array(h, s, v) ※h は 0〜360の数値、s/v は 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @return  array   array(r, g, b) ※ r/g/b は 0〜255 の数値&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; HSVtoRGB&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// 0..255&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// 0..255&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;; &lt;span class=&quot;synComment&quot;&gt;// 0..255&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;360&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;360&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;// 特別な場合&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// S = 0.0&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// → RGB は V に等しい&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;synIdentifier&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;,
            &lt;span class=&quot;synIdentifier&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;,
            &lt;span class=&quot;synIdentifier&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;,
        &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;255&lt;/span&gt;;


    &lt;span class=&quot;synComment&quot;&gt;// Hi = floor(H/60) mod 6&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;6&lt;/span&gt;;
    &lt;span class=&quot;synComment&quot;&gt;// f = H/60 - Hi&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;i&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;// p = V (1 - S)&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;;
    &lt;span class=&quot;synComment&quot;&gt;// q = V (1 - fS)&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;;
    &lt;span class=&quot;synComment&quot;&gt;// t = V (1 - (1 - f) S)&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;;

    &lt;span class=&quot;synStatement&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// R = V, G = t, B = p&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;t&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;p&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// R = q, G = V, B = p&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;q&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;p&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// R = p, G = V, B = t&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;p&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;t&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// R = p, G = q, B = V&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;p&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;q&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// R = t, G = p, B = V&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;t&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;p&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// R = V, G = p, B = q&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;p&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;q&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;synIdentifier&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// r&lt;/span&gt;
        &lt;span class=&quot;synIdentifier&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// g&lt;/span&gt;
        &lt;span class=&quot;synIdentifier&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// b&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
&lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;</content>        
        <category term="php" label="php" />
        
        <category term="色空間" label="色空間" />
        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450091973345/1429416172" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>DB内のテーブル名一覧、テーブル情報などを取得するSQL</title>
        <link href="https://blog.madapaja.net/entry/20100830/1283146058"/>
        <id>hatenablog://entry/8454420450091973352</id>
        <published>2010-08-30T14:27:38+09:00</published>
        <updated>2010-08-30T14:27:38+09:00</updated>        <summary type="html">PHPで新人教育向けにSQL（ここでは PostgreSQL）勉強用プログラムを制作しているのだけど、その中で、DB内のテーブル名一覧や、テーブル情報、列情報などを表示させたい、と思った。で、お題を追加や変更時になるべく最小限の変更で済むようにするには……とかそんな事を思ったら、やっぱりDBの事はDBに聞け、って結論に。始めて pg_* 系のテーブルをあーだこーだして、たどり着いたSQLを（ツッコミどころがありそうで心配なのですが）備忘録代わりに記載しておきます。 テーブル一覧の取得 SELECT cls.oid, -- pg_class.oid nsp.nspname, -- テーブルを持つ…</summary>
        <content type="html">&lt;p&gt;&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt;で新人教育向けに&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/SQL&quot;&gt;SQL&lt;/a&gt;（ここでは &lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PostgreSQL&quot;&gt;PostgreSQL&lt;/a&gt;）勉強用プログラムを制作しているのだけど、その中で、DB内のテーブル名一覧や、テーブル情報、列情報などを表示させたい、と思った。&lt;/p&gt;&lt;p&gt;で、お題を追加や変更時になるべく最小限の変更で済むようにするには……とかそんな事を思ったら、やっぱりDBの事はDBに聞け、って結論に。&lt;/p&gt;&lt;p&gt;始めて pg_* 系のテーブルをあーだこーだして、たどり着いた&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/SQL&quot;&gt;SQL&lt;/a&gt;を（ツッコミどころがありそうで心配なのですが）備忘録代わりに記載しておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;テーブル一覧の取得&lt;/h4&gt;
    &lt;pre class=&quot;code lang-sql&quot; data-lang=&quot;sql&quot; data-unlink&gt;&lt;span class=&quot;synStatement&quot;&gt;SELECT&lt;/span&gt;
    cls.oid,     &lt;span class=&quot;synComment&quot;&gt;-- pg_class.oid&lt;/span&gt;
    nsp.nspname, &lt;span class=&quot;synComment&quot;&gt;-- テーブルを持つスキーマ名 public とか&lt;/span&gt;
    usr.usename, &lt;span class=&quot;synComment&quot;&gt;-- 所有ユーザー名&lt;/span&gt;
    cls.relname  &lt;span class=&quot;synComment&quot;&gt;-- テーブル名&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;FROM&lt;/span&gt;
    pg_class cls
        INNER JOIN pg_namespace nsp
            &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (cls.relnamespace = nsp.oid)
        INNER JOIN pg_user usr
            &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (cls.relowner = usr.usesysid)
&lt;span class=&quot;synSpecial&quot;&gt;WHERE&lt;/span&gt;
    cls.relkind = &lt;span class=&quot;synConstant&quot;&gt;&#39;r&#39;&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;--     AND nsp.nspname = &#39;public&#39; -- スキーマ名で絞込み&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;--     AND usr.usename = &#39;user1&#39; -- 所有ユーザー名で絞込み&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;BY&lt;/span&gt;
    nsp.nspname,
    usr.usename,
    cls.relname
&lt;/pre&gt;&lt;p&gt;pg_class を基点に、ネームスペースとユーザー情報を取得します。&lt;br /&gt;
relkind は種別を表していますが、小文字の r が通常のテーブル、となります。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;シーケンス一覧の取得&lt;/h4&gt;
    &lt;pre class=&quot;code lang-sql&quot; data-lang=&quot;sql&quot; data-unlink&gt;&lt;span class=&quot;synStatement&quot;&gt;SELECT&lt;/span&gt;
    cls.oid,     &lt;span class=&quot;synComment&quot;&gt;-- pg_class.oid&lt;/span&gt;
    nsp.nspname, &lt;span class=&quot;synComment&quot;&gt;-- シーケンスを持つスキーマ名 public とか&lt;/span&gt;
    usr.usename, &lt;span class=&quot;synComment&quot;&gt;-- 所有ユーザー名&lt;/span&gt;
    cls.relname  &lt;span class=&quot;synComment&quot;&gt;-- テーブル名&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;FROM&lt;/span&gt;
    pg_class cls
        INNER JOIN pg_namespace nsp
            &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (cls.relnamespace = nsp.oid)
        INNER JOIN pg_user usr
            &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (cls.relowner = usr.usesysid)
&lt;span class=&quot;synSpecial&quot;&gt;WHERE&lt;/span&gt;
    cls.relkind = &lt;span class=&quot;synConstant&quot;&gt;&#39;S&#39;&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;--     nsp.nspname = &#39;public&#39; -- スキーマ名で絞込み&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt;--     usr.usename = &#39;user1&#39; -- 所有ユーザー名で絞込み&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;BY&lt;/span&gt;
    nsp.nspname,
    usr.usename,
    cls.relname
&lt;/pre&gt;&lt;p&gt;やっている事は、テーブル一覧の取得と全く変わりません。&lt;br /&gt;
relkind が大文字の S がシーケンスを表します。&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;テーブル列一覧の取得&lt;/h4&gt;
    &lt;p&gt;上記テーブル一覧取得の際にゲットした「pg_class.oid」を基に列の一覧を取得します。&lt;/p&gt;
&lt;pre class=&quot;code lang-sql&quot; data-lang=&quot;sql&quot; data-unlink&gt;&lt;span class=&quot;synStatement&quot;&gt;SELECT&lt;/span&gt;
    colname &lt;span class=&quot;synSpecial&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;列名&amp;quot;&lt;/span&gt;,
    CASE
        WHEN &lt;span class=&quot;synSpecial&quot;&gt;size&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;NULL&lt;/span&gt;
            &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; datatype
        &lt;span class=&quot;synComment&quot;&gt;-- サイズ情報が取得できた場合は付加&lt;/span&gt;
        &lt;span class=&quot;synSpecial&quot;&gt;ELSE&lt;/span&gt; datatype || &lt;span class=&quot;synConstant&quot;&gt;&#39; (&#39;&lt;/span&gt; || &lt;span class=&quot;synSpecial&quot;&gt;size&lt;/span&gt; || &lt;span class=&quot;synConstant&quot;&gt;&#39;)&#39;&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;データ型&amp;quot;&lt;/span&gt;,
    CASE
        &lt;span class=&quot;synComment&quot;&gt;-- NOT NULL情報 と DEFAULT情報をマージ&lt;/span&gt;
        WHEN &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;notnull&amp;quot;&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;NULL&lt;/span&gt;
            &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;notnull&amp;quot;&lt;/span&gt; || &lt;span class=&quot;synConstant&quot;&gt;&#39; &#39;&lt;/span&gt; || &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;default&amp;quot;&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;-- &lt;/span&gt;
        &lt;span class=&quot;synSpecial&quot;&gt;ELSE&lt;/span&gt; COALESCE(&lt;span class=&quot;synConstant&quot;&gt;&amp;quot;notnull&amp;quot;&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;default&amp;quot;&lt;/span&gt;)
    &lt;span class=&quot;synSpecial&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&amp;quot;属性&amp;quot;&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;FROM&lt;/span&gt;
    (
        &lt;span class=&quot;synStatement&quot;&gt;SELECT&lt;/span&gt;
            attr.attnum &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; idx, &lt;span class=&quot;synComment&quot;&gt;-- 列番号&lt;/span&gt;
            attr.attname &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; colname, &lt;span class=&quot;synComment&quot;&gt;-- 列名&lt;/span&gt;
            CASE typ.typname &lt;span class=&quot;synComment&quot;&gt;-- 分かりやすい名前に変更&lt;/span&gt;
                WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;int2&#39;&lt;/span&gt;   &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;SMALLINT&#39;&lt;/span&gt;
                WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;int4&#39;&lt;/span&gt;   &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;INT&#39;&lt;/span&gt;
                WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;int8&#39;&lt;/span&gt;   &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;BIGINT&#39;&lt;/span&gt;
                WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;float4&#39;&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;REAL&#39;&lt;/span&gt;
                WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;float8&#39;&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;DOUBLE&#39;&lt;/span&gt;
                WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;bpchar&#39;&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;CHAR&#39;&lt;/span&gt;
                &lt;span class=&quot;synSpecial&quot;&gt;ELSE&lt;/span&gt; UPPER(typ.typname)
            &lt;span class=&quot;synSpecial&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; datatype, &lt;span class=&quot;synComment&quot;&gt;-- データ型&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;-- attr.atttypmod が正の整数なら、&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;-- サイズ付加情報あり？&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;-- （よく調べて無いので自信なし）&lt;/span&gt;
            CASE WHEN attr.atttypmod &amp;gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt;
                CASE typ.typname
                    WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;numeric&#39;&lt;/span&gt;
                        &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; (attr.atttypmod - &lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt;) / &lt;span class=&quot;synConstant&quot;&gt;65536&lt;/span&gt;
                    WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;decimal&#39;&lt;/span&gt;
                        &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; (attr.atttypmod - &lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt;) / &lt;span class=&quot;synConstant&quot;&gt;65536&lt;/span&gt;
                    WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;date&#39;&lt;/span&gt;
                        &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; COALESCE(attr.atttypmod - &lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;10&lt;/span&gt;)
                    WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;time&#39;&lt;/span&gt;
                        &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; COALESCE(attr.atttypmod - &lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;8&lt;/span&gt;)
                    WHEN &lt;span class=&quot;synConstant&quot;&gt;&#39;timestamp&#39;&lt;/span&gt;
                        &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; COALESCE(attr.atttypmod - &lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;19&lt;/span&gt;)
                    &lt;span class=&quot;synSpecial&quot;&gt;ELSE&lt;/span&gt; attr.atttypmod - &lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt;
                &lt;span class=&quot;synSpecial&quot;&gt;END&lt;/span&gt;
            &lt;span class=&quot;synSpecial&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;size&lt;/span&gt;,
            &lt;span class=&quot;synComment&quot;&gt;-- attnotnull が true なら NOT NULL&lt;/span&gt;
            CASE attr.attnotnull
                WHEN &lt;span class=&quot;synSpecial&quot;&gt;TRUE&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;NOT NULL&#39;&lt;/span&gt;
                &lt;span class=&quot;synSpecial&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;NULL&lt;/span&gt;
            &lt;span class=&quot;synSpecial&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; notnull,
            &lt;span class=&quot;synComment&quot;&gt;-- atthasdef が true なら DEFAULT 値あり&lt;/span&gt;
            CASE attr.atthasdef
                WHEN &lt;span class=&quot;synSpecial&quot;&gt;TRUE&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;DEFAULT &#39;&lt;/span&gt; || adef.adsrc
                &lt;span class=&quot;synSpecial&quot;&gt;ELSE&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;NULL&lt;/span&gt;
            &lt;span class=&quot;synSpecial&quot;&gt;END&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;default&lt;/span&gt;
        &lt;span class=&quot;synSpecial&quot;&gt;FROM&lt;/span&gt;
            pg_class cls
                INNER JOIN pg_attribute attr
                    &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (cls.oid = attr.attrelid)
                INNER JOIN pg_type typ
                    &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (attr.atttypid = typ.oid)
                &lt;span class=&quot;synComment&quot;&gt;-- デフォルト値情報&lt;/span&gt;
                LEFT OUTER JOIN pg_attrdef adef
                    &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (cls.oid = adef.adrelid
                        &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; attr.attnum = adef.adnum)
        &lt;span class=&quot;synSpecial&quot;&gt;WHERE&lt;/span&gt;
            cls.oid = ? &lt;span class=&quot;synComment&quot;&gt;-- pg_class.oid を入れよ&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;-- 列番号が0以下の場合、システム列なので対象にしない&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; attr.attnum &amp;gt;= &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;-- attisdropped が TRUE なら、&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;-- この列はすでに削除されていて無効状態&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; attr.attisdropped &lt;span class=&quot;synSpecial&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;TRUE&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; typ.typisdefined
    ) &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; tbl
&lt;span class=&quot;synSpecial&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;BY&lt;/span&gt; idx;
&lt;/pre&gt;&lt;p&gt;メジャーどころの型でしか試してないし、複合型などの事は一切考えずに書いているので、問題があるかもしれません。&lt;br /&gt;
特にサイズ情報の取得は自信がない（＝適当）です。&lt;br /&gt;
必要があったら、また調べて書き直したいと思います。&lt;br /&gt;
というか、コメントで教えていただけると助かります。（自堕落ですみません）&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;テーブルインデックスの取得&lt;/h4&gt;
    &lt;p&gt;「pg_class.oid」を基にテーブルインデックス情報を取得します。&lt;/p&gt;
&lt;pre class=&quot;code lang-sql&quot; data-lang=&quot;sql&quot; data-unlink&gt;&lt;span class=&quot;synStatement&quot;&gt;SELECT&lt;/span&gt;
    cls.relname &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; name, &lt;span class=&quot;synComment&quot;&gt;-- インデックス名&lt;/span&gt;
    (
        CASE
            &lt;span class=&quot;synComment&quot;&gt;-- プライマリキー&lt;/span&gt;
            WHEN idx.indisprimary
                &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;PRIMARY KEY, &#39;&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;-- ユニーク属性&lt;/span&gt;
            WHEN idx.indisunique
                &lt;span class=&quot;synSpecial&quot;&gt;THEN&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;&#39;UNIQUE, &#39;&lt;/span&gt;
        &lt;span class=&quot;synSpecial&quot;&gt;END&lt;/span&gt;
        || am.amname &lt;span class=&quot;synComment&quot;&gt;-- インデックスのアクセスメソッド名&lt;/span&gt;
        || &lt;span class=&quot;synConstant&quot;&gt;&#39; (&#39;&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;-- 列名の取得（カンマ区切りで並べる）&lt;/span&gt;
        || ARRAY_TO_STRING(ARRAY(
            &lt;span class=&quot;synStatement&quot;&gt;SELECT&lt;/span&gt;
                attr.attname
            &lt;span class=&quot;synSpecial&quot;&gt;FROM&lt;/span&gt;
                pg_class cls2
                    INNER JOIN pg_attribute attr
                        &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (cls2.oid = attr.attrelid)
            &lt;span class=&quot;synSpecial&quot;&gt;WHERE&lt;/span&gt;
                cls2.oid = idx.indrelid
                &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; attr.attnum = &lt;span class=&quot;synStatement&quot;&gt;ANY&lt;/span&gt;(idx.indkey)
        ), &lt;span class=&quot;synConstant&quot;&gt;&#39;, &#39;&lt;/span&gt;)
        || &lt;span class=&quot;synConstant&quot;&gt;&#39;)&#39;&lt;/span&gt;
    )&lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; value &lt;span class=&quot;synComment&quot;&gt;-- 情報&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;FROM&lt;/span&gt;
    pg_index idx
        INNER JOIN pg_class cls
            &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (idx.indexrelid = cls.oid)
        INNER JOIN pg_am am
            &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (cls.relam = am.oid)
&lt;span class=&quot;synSpecial&quot;&gt;WHERE&lt;/span&gt;
    idx.indrelid = ? &lt;span class=&quot;synComment&quot;&gt;-- pg_class.oid を入れよ&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;BY&lt;/span&gt;
    indexrelid;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;テーブルチェック制約 / 外部キー制約の取得&lt;/h4&gt;
    &lt;p&gt;「pg_class.oid」を基にチェック制約 / 外部キー制約を取得します。&lt;/p&gt;
&lt;pre class=&quot;code lang-sql&quot; data-lang=&quot;sql&quot; data-unlink&gt;&lt;span class=&quot;synStatement&quot;&gt;SELECT&lt;/span&gt;
    con.conname &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; name, &lt;span class=&quot;synComment&quot;&gt;-- 制約名&lt;/span&gt;
    pg_get_constraintdef(con.oid) &lt;span class=&quot;synSpecial&quot;&gt;AS&lt;/span&gt; value &lt;span class=&quot;synComment&quot;&gt;-- 情報&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;FROM&lt;/span&gt;
    pg_constraint con
&lt;span class=&quot;synSpecial&quot;&gt;WHERE&lt;/span&gt;
    con.conrelid = ? &lt;span class=&quot;synComment&quot;&gt;-- pg_class.oid を入れよ&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; (con.contype = &lt;span class=&quot;synConstant&quot;&gt;&#39;c&#39;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;OR&lt;/span&gt; con.contype = &lt;span class=&quot;synConstant&quot;&gt;&#39;f&#39;&lt;/span&gt;)
&lt;span class=&quot;synSpecial&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;BY&lt;/span&gt;
    con.contype,
    conname;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot;&gt;
    &lt;h4&gt;テーブルトリガの取得&lt;/h4&gt;
    &lt;p&gt;「pg_class.oid」を基にテーブルトリガ名、実行する関数情報を取得します。&lt;/p&gt;
&lt;pre class=&quot;code lang-sql&quot; data-lang=&quot;sql&quot; data-unlink&gt;&lt;span class=&quot;synStatement&quot;&gt;SELECT&lt;/span&gt;
    trg.tgname, &lt;span class=&quot;synComment&quot;&gt;-- トリガ名&lt;/span&gt;
    prc.proname, &lt;span class=&quot;synComment&quot;&gt;-- 実行する関数名&lt;/span&gt;
    rtrim(replace(encode(trg.tgargs, &lt;span class=&quot;synConstant&quot;&gt;&#39;escape&#39;&lt;/span&gt;)
        , E&lt;span class=&quot;synConstant&quot;&gt;&#39;\\000&#39;&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;&#39;, &#39;&lt;/span&gt;),&lt;span class=&quot;synConstant&quot;&gt;&#39;, &#39;&lt;/span&gt;) &lt;span class=&quot;synComment&quot;&gt;-- 引数&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;FROM&lt;/span&gt;
    pg_trigger trg
    INNER JOIN pg_proc prc &lt;span class=&quot;synSpecial&quot;&gt;ON&lt;/span&gt; (trg.tgfoid = prc.oid)
&lt;span class=&quot;synSpecial&quot;&gt;WHERE&lt;/span&gt;
    trg.tgrelid = &lt;span class=&quot;synConstant&quot;&gt;17812&lt;/span&gt; &lt;span class=&quot;synComment&quot;&gt;-- pg_class.oid を入れよ&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; trg.tgenabled
    &lt;span class=&quot;synStatement&quot;&gt;AND&lt;/span&gt; trg.tgisconstraint &lt;span class=&quot;synSpecial&quot;&gt;IS&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;FALSE&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;トリガが実行されるタイミングは取得していません。&lt;br /&gt;
（面倒そうだったので、機会があれば調べてみようと思います。）&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;間違い、過不足、他のいい方法などありましたら、コメントで教えてください。&lt;br /&gt;
よろしくお願いします。&lt;/p&gt;

&lt;/div&gt;</content>        
        <category term="PostgreSQL" label="PostgreSQL" />
        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450091973352/1429416180" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
    
    
    <entry>
        <title>PHP配列とCSS色表現の相互変換</title>
        <link href="https://blog.madapaja.net/entry/20100828/1282964908"/>
        <id>hatenablog://entry/8454420450091973355</id>
        <published>2010-08-28T12:08:28+09:00</published>
        <updated>2010-08-28T12:08:28+09:00</updated>        <summary type="html">前回（色をアルファブレンドする - 今日も適当ダイアリー）にて、 relColors に使った使い回せそうな関数の公開を始めたのですが、ユーティリティ関数を書くのをすっかり忘れていました。ということで、色テキスト表現からPHP配列の相互変換の関数を提示しておきます。たいした事してないですけどね。 PHPで16進数テキストを integer にしたい場合は hexdec を使うとか、integer から16進表現にする場合は sprintf を使うとか、そこあたりは、よく忘れますよね。 初めてこの関数を聞いたっていう方は、頭の片隅においておくと、何かの時に便利かもと思います。 &lt;?php /**…</summary>
        <content type="html">&lt;p&gt;前回（&lt;a href=&quot;http://d.hatena.ne.jp/ja9/20100827/1282928579&quot;&gt;&amp;#x8272;&amp;#x3092;&amp;#x30A2;&amp;#x30EB;&amp;#x30D5;&amp;#x30A1;&amp;#x30D6;&amp;#x30EC;&amp;#x30F3;&amp;#x30C9;&amp;#x3059;&amp;#x308B; - &amp;#x4ECA;&amp;#x65E5;&amp;#x3082;&amp;#x9069;&amp;#x5F53;&amp;#x30C0;&amp;#x30A4;&amp;#x30A2;&amp;#x30EA;&amp;#x30FC;&lt;/a&gt;）にて、 &lt;a href=&quot;http://www.weekendphp.com/relColors/&quot;&gt;relColors&lt;/a&gt; に使った使い回せそうな関数の公開を始めたのですが、ユーティリティ関数を書くのをすっかり忘れていました。&lt;/p&gt;&lt;p&gt;ということで、色テキスト表現から&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt;配列の相互変換の関数を提示しておきます。&lt;/p&gt;&lt;p&gt;たいした事してないですけどね。&lt;br /&gt;
&lt;a class=&quot;keyword&quot; href=&quot;http://d.hatena.ne.jp/keyword/PHP&quot;&gt;PHP&lt;/a&gt;で16進数テキストを integer にしたい場合は hexdec を使うとか、integer から16進表現にする場合は sprintf を使うとか、そこあたりは、よく忘れますよね。&lt;br /&gt;
初めてこの関数を聞いたっていう方は、頭の片隅においておくと、何かの時に便利かもと思います。&lt;/p&gt;
&lt;pre class=&quot;code lang-php&quot; data-lang=&quot;php&quot; data-unlink&gt;&lt;span class=&quot;synSpecial&quot;&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * 色表現テキスト(#rrggbb 形式) を配列形式に変換します&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   string  $str        色表現テキスト(#rrggbb 形式)&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @return  array   array(r, g, b)&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; getColor&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// 先頭の # を除去 (#rrggbb → rrggbb)&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;strpos&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;, &#39;&lt;span class=&quot;synConstant&quot;&gt;#&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;// 先頭の 0x を除去 (0xrrggbb → rrggbb)&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;strpos&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;, &#39;&lt;span class=&quot;synConstant&quot;&gt;0x&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;substr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;, &lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;// 6 桁にそろえる&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;strlen&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 6桁ならそのまま&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// 3桁なら6桁に (rgb → rrggbb)&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;;
            &lt;span class=&quot;synStatement&quot;&gt;break&lt;/span&gt;;
        &lt;span class=&quot;synStatement&quot;&gt;default:&lt;/span&gt;
            &lt;span class=&quot;synComment&quot;&gt;// それ以外はNG&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;false&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;matches&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;()&lt;/span&gt;;
    &lt;span class=&quot;synComment&quot;&gt;// rrggbb を色事にキャプチャ&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;preg_match&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;/^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i&lt;/span&gt;&#39;, &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;str&lt;/span&gt;, &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;matches&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// rrggbb (それぞれは0~9 か a〜f) 以外ならNG&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;false&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synType&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;synIdentifier&quot;&gt;hexdec&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;0x&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;matches&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// (int) r&lt;/span&gt;
        &lt;span class=&quot;synIdentifier&quot;&gt;hexdec&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;0x&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;matches&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// (int) g&lt;/span&gt;
        &lt;span class=&quot;synIdentifier&quot;&gt;hexdec&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;0x&lt;/span&gt;&#39; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;matches&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;, &lt;span class=&quot;synComment&quot;&gt;// (int) b&lt;/span&gt;
    &lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;;
&lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;synComment&quot;&gt;/**&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * 配列形式 を 色表現テキスト(#rrggbb 形式) に変換します&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; *&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   array   $arr        array(r, g, b)&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   bool    $compress   短い色表現(#rgb 形式) を許すか&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @param   string  $prefix     プレフィックス (# 以外にしたい場合は指定)&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; * @return  string  色表現テキスト(#rrggbb 形式)&lt;/span&gt;
&lt;span class=&quot;synComment&quot;&gt; */&lt;/span&gt;
&lt;span class=&quot;synPreProc&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;getText&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;, &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;compress&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;true&lt;/span&gt;, &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;prefix&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &#39;&lt;span class=&quot;synConstant&quot;&gt;#&lt;/span&gt;&#39;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// マイナス値が入っていたらNG&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;false&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;// rrggbb 形式に変換 (integer 型に強制しておく)&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synIdentifier&quot;&gt;sprintf&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&#39;&lt;span class=&quot;synConstant&quot;&gt;%02x%02x%02x&lt;/span&gt;&#39;, &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synType&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt;;

    &lt;span class=&quot;synComment&quot;&gt;// 6桁にならない場合は失敗 (256以上が入っているとそうなる)&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;strlen&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synConstant&quot;&gt;false&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synComment&quot;&gt;// 短い色表現を許す場合で、&lt;/span&gt;
    &lt;span class=&quot;synComment&quot;&gt;// rr/gg/bb のそれぞれの上位と下位が同一であれば&lt;/span&gt;
    &lt;span class=&quot;synStatement&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;compress&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;synStatement&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;synSpecial&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;synComment&quot;&gt;// 3桁(rgb)にする&lt;/span&gt;
        &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;synConstant&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;synSpecial&quot;&gt;]&lt;/span&gt;;
    &lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;synStatement&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;prefix&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;synStatement&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;synIdentifier&quot;&gt;tmp&lt;/span&gt;;
&lt;span class=&quot;synSpecial&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;こんなもんです。&lt;/p&gt;
</content>        
        <category term="php" label="php" />
        
        <category term="色" label="色" />
        
        <link rel="enclosure" href="https://ogimage.blog.st-hatena.com/12704346814673915484/8454420450091973355/1429416186" type="image/png" length="0" />

        <author>
            <name>ja9</name>
        </author>
    </entry>
    
  
</feed>
