<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
   <channel>
      <title>ウノウラボ by Zynga Japan</title>
      <link>http://labs.unoh.net/</link>
      <description>Zynga Japan株式会社のデモ版サービスやTIPSなどの情報</description>
      <language>ja</language>
      <copyright>Copyright 2012</copyright>
      <lastBuildDate>Tue, 19 Apr 2011 16:41:11 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=4.261</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

      
      <item>
         <title>I love spacer</title>
         <description><![CDATA[<p>携帯向けXHTMLを書いているとバッドノウハウばかりが身について行くのですが、その中で私が愛してやまないspacerのことについて熱く語ってみようと思います。</p>

<p>私が個人的に見つけたバッドノウハウばかりですので、これら以外にもっとスマートな方法がありましたら是非ご教示ください。</p>

<h3>一般的な使い方</h3>
<div>&lt;br /&gt;&lt;br /&gt;での改行するなんてとんでもない、でも3キャリ対応しようと思ったらline-heightも使えないし。。。そんなことでお悩みの方が良く使っているのがこのspacer。</div><div>原理は簡単、1ドットの画像をimgタグのwidthとheightで大きさを好きに変えてお好みの行間を作るのがメインのお仕事です。</div>

<h4>気をつけること</h4>
<pre class="code">&lt;div&gt;&lt;img src="spacer画像のパス" width="X" height="Y" /&gt;&lt;/div&gt;</pre>
のみでももちろんその用途は果たせますが、一部機種にて必ず&lt;br /&gt;&lt;br /&gt;した時と同じだけのスペースが入ってしまうことがございます。
<div>その対策として。。。</div>
<pre class="code">&lt;div style="height:Ypx"&gt;&lt;img src="spacer画像のパス" width="X" height="Y" /&gt;&lt;/div&gt;</pre>
と外側のdivタグにも同じ高さを指定してあげることで見た目的には正しいスペースが表示されるようになります。

<h3>デザインを統一するために</h3>
<div>同じようなデザインのページなのに、スペースの開け方だけ全然違っていても気になる人なんてほとんどいないかとは思いますが、私のようなA型の人はぜひサイト全体でスペースの開け方を統一してみましょう！</div>
<ol>
    <li>3,4種類の行間スペースを決める<br />
    私が良く使っているのは、2px, 3px, 5px, 10pxの4種類です</li>
    <li>どの行間スペースをどんな時に使うのかを決める<br />
        例)
        <ul>
            <li>2px: デザイン上で必要な微妙なスペース</li>
            <li>3px; 文章と文章の間のスペース</li>
            <li>10px: フッター等で本当にいっぱい開けたい時</li>
            <li>5px: 上記以外で適当なスペースがほしい時</li>
        </ul>
    </li>
    <li>自分を含めコーディングする人がピクセル単位で指定出来ないようにする<br />
    人間は間違えるものです。自分で決めたルールでもあれ？どれだっけ？と忘れてしまうこともあります。厳密にはもちろん不可能ですが、たとえばHTMLヘルパー的なものでどの高さにするのかをピクセル単位ではなく種類を選ばせることによってミスは大分減り、より統一されたデザインのサイトに仕上がるかと思います。</li>
</ol>

<h3>height代わりに使う</h3>
<div>これまた3キャリ対応させようと思っていると、auの一部(?)機種にてtableタグのheightが効かないことに気付きました。</div>
<div>そんな時にもspacerは使えます！</div>
<pre class="code">&lt;table width="100%" cellspacing="0" cellpadding="0" border="0"&gt;
&nbsp;&nbsp;&lt;tr&gt;
&nbsp;&nbsp; &nbsp;&lt;td&gt;
&nbsp;&nbsp; &nbsp; &nbsp;何かの文章
&nbsp;&nbsp; &nbsp;&lt;/td&gt;
&nbsp;&nbsp; &nbsp;&lt;td width="1"&gt;
&nbsp;&nbsp; &nbsp; &nbsp;&lt;!-- 高さを100pxにしたい場合 --&gt;
&nbsp;&nbsp; &nbsp; &nbsp;&lt;img src="spacer画像のパス" width="1" height="100" /&gt;
&nbsp;&nbsp; &nbsp;&lt;/td&gt;
&nbsp;&nbsp;&lt;/tr&gt;
&lt;/table&gt;</pre>
<div>このような感じになります！</div>
<div>※見やすいようにtableとimgタグ両方にボーダーを入れています。</div>
<table width="100%" cellspacing="0" cellpadding="0" border="1">
  <tbody><tr>
    <td>
      何かの文章
    </td>
    <td width="1">
      <img src="http://labs.unoh.net/spacer.gif/spacer.gif" width="1" height="100" border="1" />
    </td>
  </tr>
</tbody></table>
<div>tableタグ自体のheightが使えなくても、無理やりspacerでその分の高さを出しているだけなのですが、こうすることにより、中身のテキストや画像が短くても一定の高さのtableがほしい場合のデザインを実現出来ます。</div>


<h3>ラインを表現するのに使う</h3>
<div>&lt;hr /&gt;タグの代わりに1pxの画像を横いっぱい伸ばして使っている場合が多いかと思いますが、そうすると、ローディング中にラインが表示されなかったり、機種によっては特別なことをしない限りテキストと一行分と同じだけのスペースをとってしまうので、少し見栄えが悪くなります。</div>
<div>そこでspacerの登場です。</div>
<pre class="code">&lt;div style="background-color:red;height:1px"&gt;
&nbsp;&nbsp;&lt;img src="spacer画像のパス" width="1" height="1" /&gt;
&lt;/div&gt;
</pre>
<div>以下のようになります。</div>
<div style="background-color:red;height:1px">
  <img src="http://labs.unoh.net/spacer.gif/spacer.gif" width="1" height="1" />
</div>
<div>何を隠そう行間用のspacerのdivに色を付けただけなんです。</div>
<div>しかし、こうすることにより、ローディング中でもきちんと表示されるラインの出来上がりです！</div>

<p>何かと制限の多い携帯向けXHTMLですが、spacerのように頭をひねれば意外といろいろが解決可能だということに気づくかと思います。<br />
全てがバッドノウハウですので、本当に役に立っているのか時たま分からなくなる時もありますが、みなさんもぜひspacerを愛でみてはいかがでしょうか？意外な使い方が見つかるかもしれません！</p>]]></description>
         <link>http://labs.unoh.net/2011/04/i_love_spacer.html</link>
         <guid>http://labs.unoh.net/2011/04/i_love_spacer.html</guid>
         <category></category>
         <pubDate>Tue, 19 Apr 2011 16:41:11 +0900</pubDate>
      </item>
      
      <item>
         <title>わんわん</title>
         <description><![CDATA[きゃんきゅーんわんわおんわーんばうきゃんきゃんきゃうんわおんわおんわんきゃんきゃんきゃうんきゃんきゃん!<br />
わうわーん。<br />
わんわーんわんわうわん。<br />
わんわおんわんわおんわん!<br />
きゃうんわーんわうきゅーんわおんわーんばうわおんわんわおんわん。<br />
わーんわーんきゃんわうわんわんわおん!<br />
わんきゃんきゃんわうわーんわんきゃんわおんわんわおんわん!<br />
わん。<br />
きゃうんきゃんきゅーん。<br />
わーんわんきゃんわうわーんばうわんわんわうきゅーんきゃんわんわーんわおんわん。<br />
きゃうんわおんわおんわおん!<br />
きゃんわおんわおんわんばうわおんわんばうきゃんわおんきゃうんわおん!<br />
わんわおんばうきゃん!<br />
わうきゃうんきゃんわおんきゃんきゃんわおん!<br />
わんきゃんわーんわーんわんきゃうんわんきゃんきゃんきゃんきゃんきゅーんきゅーんわおんわんわおんわーんわーんわんわんわんばうわおんわんきゃんわーん!<br />
きゃんわおんきゃんばうきゃんきゃんわーんわうわおんわーんばうわーんばうわうわんわーんわんわおんきゃんばうきゃんわーんきゃうんわん!<br />
きゃうんわおんきゃんわうきゃうんきゃんばうわーんきゃんわーんきゃんわーんわおんわうわーんきゅーんわーん。<br />
わーんわーんわうきゃんきゅーんばうわーんばうわーんわーんわうわーんわーんきゃんわーんわおんきゃうんわーんわーんきゃうんわーんわおんきゃんわーんきゃんわおんわーんわーんばうわおんわおんきゃんきゃうんきゃんきゅーんわんわおんばうわおんわおんわおんわーん。<br />
わおんわおんわーんわーんばう。<br />
わうわんきゅーんわーんきゃんきゃうんきゃうんわーんわうわーんわん。<br />
きゅーんきゃんわおんわう。<br />
きゃんわおんばうきゃんわんきゃうんばうわんきゃうんわんわんわうわーんきゃん。<br />
きゃうんわおんきゃんきゃん。<br />
わうわんきゃうん!<br />
きゃうんわおんきゃうんわんわんばうきゃうん。<br />
きゃんわう!<br />
きゃうんきゃん!<br />
きゃんわんわーんきゅーんきゃうんわん。<br />
きゃんきゃんわんわおんきゅーんわんわおんばうわーんわんばうわーんわーんわおんわおんわんわんきゃんわーんきゃうん。<br />
わおんきゅーんわおんわーんきゃうんばうわんわおんわうわおんきゃんわうわんきゃうんわんわーんきゅーんきゃうんわんきゃうんばうきゃんきゃうん!<br />
きゃんわおんわうわーんきゃんわうきゃんわーん。<br />
ばうわん。<br />
わおんばうきゃうんわおんきゅーんきゅーんわおんきゃうんわーんきゃんわーん。<br />
わう。<br />
わーんきゅーんばうきゃん。<br />
ばう。<br />
わんわん!<br />
わおんばうわんわうわおんわん!<br />
わんきゃんきゃん!<br />
わーんばうきゃん。<br />
わおんきゃん!<br />
わんきゃうんわおんわーんきゃうんわおんわんきゅーんわーん!<br />
わーんわうきゃうんわおんわーん!<br />
きゃんわーんわうわおんわーんわおんわんわおんきゃんわうきゃんきゃうんわーんわーんばうわおんわおんわんわうきゃんきゅーんわんわんばうきゃうん!<br />
きゃんきゅーんわうわおんきゃんきゃんわんきゃうんきゃうんわおんわおんきゃんわんわおんわーんわおんわおんわーんわん。<br />
わうわんわおんわおんわおんきゃんきゅーんわおんきゃんきゃん!<br />
わーんわーんきゅーんきゃんわおんきゃんばうわーんきゃうんきゃうんわんきゃうんわうわおん!<br />
わーんばうわーんわーんわんわおんわうばう。<br />
わおんばうわーんわーんきゅーんわーんわんきゃうん。<br />
わんわおんわおんきゃんきゃんわおんきゃんわおんわおんわおんわーんきゃんわんわおんわおんばうきゃんきゅーん!<br />
わうわんきゅーんきゃうんわーんきゃうんきゃんわおん!<br />
ばうわうわおんきゅーんきゃうんわーんきゃんわんきゃんきゃうん。<br />
ばうわーんきゅーんきゅーんきゃんきゃんきゃうんわおんきゃんきゅーんわおんわうわんわんばうばうわーんきゅーんわおんわんきゃんきゅーんわおんばうわおんきゃんわーんわおんわおん!<br />
わーんきゅーんわおんわーんわんわおんわんわうきゃんばうわおんわんばうわーんわんわーんきゃうんわおんきゅーんわおんわおんばうわおん。<br />
わおんわうわおんわんわおんきゅーんきゃんきゃうんきゅーんわーんきゃうんわうわんわう!<br />
わうわんきゅーんきゅーんわーん。<br />
きゅーんきゃうんわおんきゃんわんわおんわーんきゃん。<br />
わおんわーんばうわんわんわおん!<br />
わおんわうわーんきゃんきゃうんわん。<br />
きゃん!<br />
きゃうんわおんきゃんきゃんわーんわんきゃん!<br />
わうわおんきゃうんきゃうんわーんわーんきゃうんきゃんわおんわうわおんわーんわうわんわうきゅーんきゃん!<br />
わうきゃうんきゃんきゃうんわおんきゃんきゃうんきゃんわーんばう。<br />
わおんわーんわおんきゃんきゃんばうきゅーんわーん!<br />
わおんわおんわんきゅーん!<br />
きゃんわおん!<br />
わうきゃうんわおんわんきゃんわおんばうきゃんきゃんきゃんわーんわーんきゃうんわう!<br />
わおんきゃんわんわーんきゃんわおんきゃん。<br />
きゅーんきゅーんわーんきゃうんきゃうん。<br />
わおんわうきゃうんわんきゃんきゅーんわんわーんきゅーんきゃんわうばうわーんわうわうわんわんきゅーんわーんわーんわうきゃんきゃうんきゃうんわーんきゃんきゃんきゃんきゅーんきゃん<br />

<!---
<?php

class Encode_Dog
{
   protected $convert = array(
     0 => 'わん',
     1 => 'きゃん',
     2 => 'わおん',
     3 => 'わーん',
     4 => 'ばう',
     5 => 'きゃうん',
     6 => 'わう',
     7 => 'きゅーん',
   );

   public function encode($string)
   {
       $zvalue = gzcompress($string);
       $codes = unpack('C*', $zvalue);
       $result = '';
       foreach($codes as $value) {
           //base8
           $base8 = sprintf('%03s', base_convert($value, 10, 8));
           //おいこら
           for ($i = 0; strlen($base8) > $i; $i++) {
               $result .= $this->convert[$base8[$i]] . $this->addRandString();
           }
       }
       return $result;
   }

   public function addRandString()
   {
      $result = '';
      switch(mt_rand(0, 20)) {
          case 10:
              $result = "!\n";
              break;
          case 20:
              $result = "。\n";
              break;
      }
      return $result;
   }

   public function decode($value)
   {
       // 改行と「。」と「！」を削除する
       // TODO あとで実装する
   }

}
$content = <<<EOT
Keita です。
今日はエイプリルフールなので犬言に変換する簡単なプログラムを書いてみました。
デコーダーは明日くらいに実装します。
デコードできなかったら、誰か僕を抱きしめて下さい
以上、ご参考になれば幸いです。
/
EOT;

$encoder = new Encode_Dog();
$encode = $encoder->encode($content);
echo $encode;
//本当にデコードできなかったので修正しましたひれ伏してお詫びします
-->]]></description>
         <link>http://labs.unoh.net/2011/04/post_153.html</link>
         <guid>http://labs.unoh.net/2011/04/post_153.html</guid>
         <category></category>
         <pubDate>Fri, 01 Apr 2011 11:19:24 +0900</pubDate>
      </item>
      
      <item>
         <title>PHPで利用出来るテストと開発に便利なツール</title>
         <description><![CDATA[
<p>こんにちは。yukiです。</p>
<p>今日はテストや普段の開発に便利なツールのご紹介をしたいと思います。PHP限定のツールですので、ご了承下さい。</p>
<p>ZyngaJapanでは、昨日リニューアルオープンした「<a href="http://www.zynga.co.jp/service/farmvillage.html">ファームビレッジ</a>」でも、<a href="http://wiki.hudson-ci.org/display/JA/Meet+Hudson">Jenkins</a>(旧Hudson)によるCIを行って開発しており、TDDやJenkinsでのCIを利用する文化がだんだんと浸透してきています。Jenkinsのプラグインとして利用できるものも多くありますが、当然ながらコマンドラインからも利用出来ますので、コミット前に自分のコードをチェックすることもできます。</p>
<h3><a href="https://github.com/sebastianbergmann/phpcpd">phpcpd</a></h3>
<p>コードの中でコピー&amp;ペーストで記述されている部分を検出してくれます。<br />どの程度の重複から検出するかを柔軟に設定できるので、まず大きな部分から修正するなど判断ができ便利です。</p>
<pre class="code">$ phpcpd /path/to/project
phpcpd @package_version@ by Sebastian Bergmann.

Found 13 exact clones with 339 duplicated lines in 17 files:

  - hoge/fuga/Foo.php:55-104
    hoge/fuga/Bar.php:85-134

0.50% duplicated lines out of 68425 total lines of code.

Time: 10 seconds, Memory: 33.00Mb</pre>
<h3><a href="https://github.com/sebastianbergmann/phpdcd">phpdcd</a></h3>
<p>どこからもコールされていないメソッドなどを検出してくれます。リファクタリング対象として確認に役立ちます。</p>
<pre class="code">$ phpdcd /path/to/project
phpdcd 0.9.2 by Sebastian Bergmann.

  - Foo::execute()
    declared in Foo.php:42

  - Bar::getActionName()
    declared in Bar.php:27

  - Hoge::execute()
    declared in Hoge.php:34</pre>
<h3><a href="https://github.com/sebastianbergmann/phploc">phploc</a></h3>
<p>以下のようにphpファイルの構成要素を算出してくれます。(数字は全てダミーです)</p>
<pre class="code">$ phploc /path/to/project
phploc @package_version@ by Sebastian Bergmann.

Directories:                                        999
Files:                                             9999

Lines of Code (LOC):                             999999
  Cyclomatic Complexity / Lines of Code:           0.01
Comment Lines of Code (CLOC):                     99999
Non-Comment Lines of Code (NCLOC):               999999

Namespaces:                                           9
Interfaces:                                          99
Classes:                                            999
  Abstract:                                          99 (9.99%)
  Concrete:                                         999 (99.99%)
  Average Class Length (NCLOC):                     999
Methods:                                           9999
  Scope:
    Non-Static:                                    9999 (99.99%)
    Static:                                           9 (9.99%)
  Visibility:
    Public:                                        9999 (99.99%)
    Non-Public:                                     999 (99.99%)
  Average Method Length (NCLOC):                     99
  Cyclomatic Complexity / Number of Methods:       9.99

Anonymous Functions:                                 99
Functions:                                            9

Constants:                                          999
  Global constants:                                   9
  Class constants:                                  999</pre>
<h3><a href="http://phpmd.org/">phpmd</a></h3>
<p>if文のネスト階層数などの複雑さ、短すぎる、または長すぎる変数名や、使われていない変数の検出など様々な条件に応じて検出を行ってくれます。</p>
<pre class="code">$ phpmd /path/to/project text codesize,unusedcode,naming

/path/to/project/hoge/huga/AAA.php:76   Avoid unused local variables such as '$foo'.
/path/to/project/hoge/huga/AAA.php:129  Avoid unused local variables such as '$bar'.
/path/to/project/hoge/huga/AAA.php:185  Avoid unused local variables such as '$foo'.
/path/to/project/hoge/huga/BBB.class.php:29    Too many fields
/path/to/project/hoge/huga/foo/CCC.php:20 Avoid variables with short names like $a
/path/to/project/hoge/huga/foo/CCC.php:20 Avoid variables with short names like $b
/path/to/project/hoge/huga/foo/EEE.php:5     The method create() has a Cyclomatic Complexity of 12.
/path/to/project/hoge/huga/foo/EEE.php:5     The method create() has an NPath complexity of 288.
/path/to/project/hoge/huga/foo/FFF.php:10     Avoid unused local variables such as '$type'.
/path/to/project/hoge/huga/foo/GGG.php:7    Avoid unused private fields such as '$object'.
/path/to/project/hoge/huga/bar/HHH.php:64  Avoid unused parameters such as '$status'.
/path/to/project/hoge/huga/bar/HHH.php:74  Avoid unused private methods such as 'setStatus'.
/path/to/project/hoge/huga/bar/JJJ.php:26    Avoid unused parameters such as '$status'.
/path/to/project/hoge/huga/bar/KKK.php:3    This class has too many methods, consider refactoring it.
/path/to/project/hoge/huga/bar/KKK.php:13   Avoid unused parameters such as '$status'.
/path/to/project/hoge/huga/bar/LLL.php:44    Avoid unused parameters such as '$status'.</pre>
<p>上記はJenkinsのプラグインとして使えるものもありますので、是非検討してみてはいかがでしょうか。</p>
]]></description>
         <link>http://labs.unoh.net/2011/03/php_12.html</link>
         <guid>http://labs.unoh.net/2011/03/php_12.html</guid>
         <category></category>
         <pubDate>Thu, 24 Mar 2011 14:41:12 +0900</pubDate>
      </item>
      
      <item>
         <title>Puppet DashboardからExternal Nodesを利用する方法 </title>
         <description><![CDATA[入社3ヶ月目のsaekiです。<br>
今回はPuppetのGUIツール「Puppet Dashboard」でExternal Nodes機能を使用する方法を紹介しようかと思います。<br>
Puppet Dashboardのインストール方法は<a href="http://docs.puppetlabs.com/guides/installing_dashboard.html">公式ドキュメント</a>を参考にしてください。<br>
Puppetは0.25.5、Puppet Dashboardは1.0.4を使用しています。<br>

<h3 style="border-bottom:1px solid #6699CC;border-bottom-width:1px;border-bottom-style:solid;border-left:10px solid #6699CC;margin-top:25px;padding-left:10px;"> 
■できること
</h3> 
- マニフェストではなくdashboard上でnode設定ができます。<br>
- node(またはgroup)毎にclassを設定やParameterの設定ができます。<br>

<h3 style="border-bottom:1px solid #6699CC;border-bottom-width:1px;border-bottom-style:solid;border-left:10px solid #6699CC;margin-top:25px;padding-left:10px;"> 
■使用方法
</h3> 
- <strong>classを登録する</strong><br>
dashboardにclassを登録します。
<br>
<br>
1. マニフェストのclassを作成します(例はhosts)

<pre class="code">
 class hosts {
   file {
     "/etc/hosts":
       owner => 'root',
       group => 'root',
       mode  => 644,
   }
 }
</pre> 
<br>
2.dashboard上から[Add class]を選択して、作成したclassを登録します。<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="class_detail.png" src="http://labs.unoh.net/class_detail.png" width="701" height="648" class="mt-image-none" style="" /></span>
<br>
<br>

3.nodeにclassを登録するには、node編集画面から[Classes]に作成したclassを登録します。<br>
classにパラメータを渡したい場合は、[Parameters]にkeyとvalueを登録すると変数として扱えます(画像の青い囲い)<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="node_edit.png" src="http://labs.unoh.net/node_edit.png" width="890" height="657" class="mt-image-none" style="" /></span>
<br>
<br>
クライアントからpuppetdを実行してみてください。<br>
特にsite.ppなどにnodeの設定をしてなくても、hosts classのマニフェストが反映されるかと思います。<br>
<br>
<br>
- <strong>group登録をする</strong><br>
chassやnodeをgroup登録できます。サーバ機能毎やプロダクト毎にまとめたい場合に利用できるかと思います。<br><br>
1.左メニューから[Add group]を選択するとgroup編集画面になります。<br>
2.groupに登録したいclassやgroup(親group)を設定できます。group毎に使用するParameterの設定も可能です。 <br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="group_edit.png" src="http://labs.unoh.net/group_edit.png" width="899" height="633" class="mt-image-none" style="" /></span>
<br>
<br>

3.groupにnodeを登録するには、node編集画面から[Groups]に作成したgroupを登録します。 <br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="node_edit_group.png" src="http://labs.unoh.net/node_edit_group.png" width="891" height="649" class="mt-image-none" style="" /></span>

<h3 style="border-bottom:1px solid #6699CC;border-bottom-width:1px;border-bottom-style:solid;border-left:10px solid #6699CC;margin-top:25px;padding-left:10px;"> 
■利用例
</h3> 
- こんなイメージで設定ができるかと思います(webサーバgroupとして設定)
<pre class="code">
base(group)
   ├─ web(group)  
   │      ├──  httpd(class)
   │      └──  php(class)
   │
   ├── hosts(class)
   ├── ntp(class)
   └── ssh(class)
</pre> 

External NodesをGUIで扱うtoolには<a href="http://theforeman.org/projects/foreman/wiki">foreman</a>というのもあるようです。<br>
便利な機能かと思いますので、Puppet利用されている方は導入されてみてはいかがでしょうか。
]]></description>
         <link>http://labs.unoh.net/2011/03/puppet_dashboardexternal_nodes.html</link>
         <guid>http://labs.unoh.net/2011/03/puppet_dashboardexternal_nodes.html</guid>
         <category></category>
         <pubDate>Wed, 23 Mar 2011 21:01:49 +0900</pubDate>
      </item>
      
      <item>
         <title>symfonyエキスパートになるために必須の1冊</title>
         <description><![CDATA[突然ですが、symfonyのエキスパートになりませんか？[HIROKI](http://hiroki.jp)です。

PHPのフルスタックフレームワークであるsymfonyについて共著した書籍が発売されました。私はテスト駆動開発(TDD)とsymfonyによる自動テストについて執筆しました。

具体的にはLimeを利用したユニットテストをはじめ、sfBrowserを利用して、ブラウザアクセスをエミュレーションした自動テストを書くことによって、実際に人間がブラウザを通してアクセスしている内容まで自動テストにします。これを、テストファーストのアプローチで開発する内容になっています。

TDDや自動テストを書くというのは、プログラマーとして、プロとしてのスキルです。これを機会に、ばっちりテストコード書けるぜ！という人が増えることを願っております。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="sf14book-image.jpeg" src="http://labs.unoh.net/sf14book-image.jpeg" width="230" height="299" class="mt-image-none" style="" /></span>

本書は

* symfonyプロジェクトに存在するドキュメントやリファレンスを読む前に必要な前提知識
* 詳しいインストール方法
* 少しハードルの低いチュートリアルといった入門者向け

といった入門者向けの内容と

* 公式ドキュメントに目を通した人が次のレベルにステップアップする為の知識
* 実開発、実運用で役立つTips

といった上級者向けの内容が盛り込まれています。

ソースコードもダウンロードできるので、実際に手を動かしながらsymfonyを体感してください。


]]></description>
         <link>http://labs.unoh.net/2011/03/symfony14-book.html</link>
         <guid>http://labs.unoh.net/2011/03/symfony14-book.html</guid>
         <category>Tips</category>
         <pubDate>Wed, 23 Mar 2011 19:30:00 +0900</pubDate>
      </item>
      
      <item>
         <title>Varnish上でESIの機能を利用する</title>
         <description><![CDATA[<p>Keita です。</p>

<p>
サンフランシスコで開かれたSymfony Liveで、Fabien Potencier氏によるHTTP Cacheという発表がありその中でESI(Edge Side Includes)の紹介がありました。
</p>
<p>
下の画像はちょっとみずらいですが、たとえばこのラボブログのレイアウトだと大枠の部分は常によりユーザに使いフロントの所（つまりCDNやキャッシュサーバ）側でキャッシュされていてAの部分とBの部分それぞれのコンテンツを別々にインクルードする形でキャッシュ制御することができます。
</p>

<img alt="esi.png" src="http://labs.unoh.net/esi.png" width="500" height="330" class="mt-image-none" style="" />

<p>
Symfony2のサイトsymfony-reloaded.orgでも、<a href="http://docs.symfony-reloaded.org/guides/cache/http.html">マニュアル</a>がありますので、詳細はそちらを参考にしていただくとして、その中に、Varnishでもその機能が利用できることが紹介されていますので試してみたいと思います。
</p>

<p>
Varnishのインストールについては省略してとりあえず設定部分から。<a href="http://www.varnish-cache.org/trac/wiki/ESIfeatures">VarnishサイトにあるESIの説明</a>あたりを参考にして下記のような環境を構築してみました。
</p>

<h3>Apache側(port: 10080でアクセス可能）</h3>

himote.html
<pre class="code">
&lt;html&gt;
&lt;head&gt;
himote:
&lt;/head&gt;
&lt;body&gt;
&lt;esi:include src="/time.php" /&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>

time.php
<pre class="code">
&lt;?php
echo date('Y/m/d h:i:s');
</pre>


<h3>varnish側(port: 6081でアクセス可能)</h3>

default.vcl
<pre class="code">
backend default {
  .host = "127.0.0.1";
  .port = "10080"; // Apache
}

sub vcl_fetch {
    if (req.url == "/himote.html") {
            esi; // enable ESI
    }
}
</pre>

wget で確認
<pre class="code">
wget http://localhost:6081/himote.html -O -

&lt;html&gt;
&lt;head&gt;
himote:
&lt;/head&gt;
&lt;body&gt;
2011/02/22 11:07:37
&lt;/body&gt;
&lt;/html&gt;

# 二回目
wget http://localhost:6081/himote.html -O -

&lt;html&gt;
&lt;head&gt;
himote:
&lt;/head&gt;
&lt;body&gt;
2011/02/22 11:07:37
&lt;/body&gt;
&lt;/html&gt;
</pre>

<p>
2回目も時間がかわってないことから、正常にキャッシュしているようです。<br />
ただ、キャッシュの有効期限を設定していないので今度はExpireヘッダを出力してみます。
</p>

<pre class="code">
&lt;?php
$expire = 10; //10秒後
header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + $expire));
echo date('Y/m/d h:i:s');
</pre>

動作確認
<pre class="code">
wget http://localhost:6081/himote.html -O -

&lt;html&gt;
&lt;head&gt;
himote:
&lt;/head&gt;
&lt;body&gt;
2011/02/22 11:13:47
&lt;/body&gt;
&lt;/html&gt;

wget http://localhost:6081/himote.html -O -
&lt;html&gt;
&lt;head&gt;
himote:
&lt;/head&gt;
&lt;body&gt;
2011/02/22 11:13:57
&lt;/body&gt;
&lt;/html&gt;
</pre>

<p>
何回かアクセスするとちょうど10秒目くらいに時間が変更されているので正常に動作しているようです。
</p>

<p>
本家のマニュアルを写経した程度になってしまいましたが、どのようなものかイメージをつかんでいただけたのではないでしょうか。実際にプロダクトレベルで利用するにはベンチマークやログなどの詳細な検証は必要になると思いますのでご注意ください。
</p>
<p>
本記事がご参考になれば幸いです。]]></description>
         <link>http://labs.unoh.net/2011/02/varnishesi.html</link>
         <guid>http://labs.unoh.net/2011/02/varnishesi.html</guid>
         <category></category>
         <pubDate>Tue, 22 Feb 2011 11:17:33 +0900</pubDate>
      </item>
      
      <item>
         <title>サーバ情報を収集する Ruby スクリプトを書くには</title>
         <description><![CDATA[こんにちは。kyagi です。今回はサーバ情報を収集する Ruby スクリプトを書く方法をお知らせいたします。具体的にはサーバ情報収集ツール facter (※1)の紹介と使い方になります。

facter はサーバのホスト名、IP アドレス、OS、ハードウェアなど様々な情報を収集するためのツールです。RPM では「facter」というパッケージ名で提供されており 「yum install facter」 でインストールが可能です。インストール後はターミナルから 「facter」 というコマンド(※2) を実施するだけでサーバの色々な情報を一度に取得することができます。

<pre class="code">
$ facter 
(... snip ...)
architecture => x86_64
domain => local.hoge.bar.net
(... snip ...)
ipaddress_eth0 => 10.x.y.z
processor0 => Intel(R) Xeon(R) CPU           E5504  @ 2.00GHz
memorysize => 8.04 GB
(... snip ...)
</pre>

facter を rpm でインストールすると ruby 用のインターフェイスとして Facter というモジュールが /usr/lib/ruby/site_ruby/<version> 配下にインストールされます。Ruby スクリプトの中で使用するにはこの Facter モジュールを require した後に、任意のクラスに include すれば OK です。コマンドラインから取得できる情報は Facter.value(:要素名) で取得可能です。以下に基本的なサーバを示すクラスとして「BaseServer」を定義した後、そのサブクラスであるWeb サーバ専用クラス「HttpdServer」, Mysql サーバクラス「MysqldServer」を定義したコードを紹介します。

■facter を rpm でインストールすると Ruby 用に Facter module がインストールされる

<pre class="code">
$ rpm -ql facter | grep rb$ 
/usr/lib/ruby/site_ruby/1.8/facter.rb
(... snip ...)
$ grep -r Facter /usr/lib/ruby/site_ruby/1.8 | grep module
/usr/lib/ruby/site_ruby/1.8/facter.rb:module Facter
</pre>

■基本的なサーバを表すクラスとして「BaseServer」クラスを作成する

<pre class="code">
require 'facter' 
class BaseServer
  include Facter
  attr_accessor :name, :role, :ipaddress
  def initialize(*)
    @name = Facter.value(:fqdn)
    @role = self.class.name
    @ipaddress = Facter.value(:ipaddress)
  end
  def getKernel
    return Facter.value(:kernelrelease)
  end
  def getUptime
    return Facter.value(:uptime)
  end
end
</pre>

■ Web サーバクラスを「BaseServer」のサブクラスとして作成する

<pre class="code">
require 'BaseServer'
class BaseServer::HttpdServer < BaseServer
  def getApacheStatus
    (... snip ...)
  end
end
</pre>

■ Mysqld サーバクラスを「BaseServer」のサブクラスとして作成する(※別途 ruby-mysql を使用し、専用のインスタンス変数を準備する)

<pre class="code">
require 'BaseServer'
require 'mysql'
class BaseServer::MysqldServer < BaseServer
  attr_accessor :host, :user, :pass, :database
  def initialize(host, user, pass, database)
    super
    @host = host
    @user = user
    @pass = pass
    @database = database
  end
  def countTable(table)
    my = Mysql::new(host, user, pass, database)
    res = my.query("select count(*) from #{table}")
    return res
  end
end
</pre>

以上、サーバ情報収集ツールを Ruby で書いている方の参考になれば幸いです。

(※1) サーバ管理ツール Puppet も内部的に facter を使用しています。

(※2) 「要素」という意味を表す英単語としては「facter」という単語はミススペルのようです。正しくは「factor」ですが既に coreutils パッケージに因数分解をする同名のコマンドが含まれているため、故意に facter という名前にしたのではと思われます。数学に興味がある方は古い方の「factor」を使用して「seq 1 100 | factor」(=1 から 100 までを素因数分解する)、「seq 1 100 | factor | awk 'NF == 2 { print $NF }'」(=1 から 100 までの素数を抽出する) などの使い方を試してみると面白いかもしれません。]]></description>
         <link>http://labs.unoh.net/2011/02/_ruby.html</link>
         <guid>http://labs.unoh.net/2011/02/_ruby.html</guid>
         <category></category>
         <pubDate>Mon, 21 Feb 2011 10:57:51 +0900</pubDate>
      </item>
      
      <item>
         <title>家庭用ゲームのプログラマーがSNSゲームのプログラマーに転職するために必要なもの</title>
         <description>こんぬつは＆はじめまして。
１２月に入社したサカモトです。

私は元々SONYとかNintendo機向けの家庭用のゲーム開発を生業にしてきましたが、ついこの前からSNSアプリの開発をしています。

私と同じように、家庭用ゲーム機のプログラマーからSNSゲームのプログラマーに転身したいと考えている方のお役に立てればと思い、私の経験を元に　&apos;転職するために必要なもの&apos; のお話をさせていただきたいと思います。</description>
         <link>http://labs.unoh.net/2011/02/post_152.html</link>
         <guid>http://labs.unoh.net/2011/02/post_152.html</guid>
         <category>ネタ</category>
         <pubDate>Wed, 02 Feb 2011 12:45:39 +0900</pubDate>
      </item>
      
      <item>
         <title>都市伝説の検証！Flash CS5のswfはCS4よりファイル容量が大きい!?</title>
         <description><![CDATA[flashエンジニアのnaoです。

ディスカバリーチャンネルの番組に<a href="http://ja.wikipedia.org/wiki/%E6%80%AA%E3%81%97%E3%81%84%E4%BC%9D%E8%AA%AC">「怪しい伝説」(Mythbusters)</a>ってのがありますよね。そう、"ワイヤーが切れて自由落下するエレベーター、地面に衝突する寸前に中でジャンプしたら助かるんじゃね？"とか、<del>あほう</del>　希少な検証をやるあの番組です。
ちょっと考えればわかりそうな事を真面目に検証する彼らを生暖かく見守る私ですが、この度自分自身、都市伝説に遭遇いたしました。
その都市伝説というのが、標題の「Flash CS5のswfはCS4よりファイル容量が大きい!?」なワケであります。


私の所属するプロジェクトでは、前任のflashエンジニアがFlash Profesional CS4で開発を行い、私を含めた後任のチームはCS5で開発を行っております。
この時に、前任からの引き継ぎ注意事項として

<p><h2><font color = red>『swfファイルはCS4で書きだしたほうが軽くなる』</font></h2></p>

という物があり、実際に前任から引き継いだflaファイルでswfを書きだしてみると、本当にCS5とCS4で容量が違ったのです。CS5で書きだしたswfは、3KBほど容量が重い。
<b><font color=red>なにこの怪奇現象こわい</b></font>。
flash liteを利用する製品では、3KBは命取りです。
臆病風に吹かれまくって天高く舞い上がった私は、CS4のライセンスを持っているチームメンバーに依頼して書き出しをしたのですが、上空の偏西風に流されてミッドウェイあたりまで来たところで、はたと気が付きました。

<p><font color=yellow><b>同じ処理をしている100KB程度のバイトコードで、3KBもサイズが違うのって、明らかにおかしくね？</b></font></p>

100KBのうちの3KBといえば、全体の3%である。1989年に導入された当時の消費税率と同じである。当時の消費税の税収は、なんと6兆円！まぁ、金額は関係ないのですが。

flashのバイトコードは、1処理で2バイトとか3バイト程度。それに変数名が付いたって、ActionScriptの1行分の処理でもせいぜい数十バイトである。いったい、どこで容量が増えるのだろうか？
<p class="code">【実験1】
まず私が試したのは、diffコマンドによって差分を比較する実験。swfファイルの差分を取って比べてみたら、何かわかるのではなかろうか、と思ったのですが、この実験はあえなく失敗。考えてみたら、バイナリの状態のコードなんて人間が一覧して分かるわけがない。実験以前に問題だった。Mythbustersを哂えない。
</p>
<p class="code">【実験2】
次に行ったのは、swfmillをインストールしてswfファイルをテキスト化し、再びdiffを取る実験。こちらは成功。そらそうだ。
内部の構造を追っていくと、ActionScript部分は変化がない。しかし、途中で謎のベクタ描画のグラフィックスオブジェクトに遭遇する。CS4には存在しない。CS5で書きだしたswfにのみ存在するオブジェクトなのだ。<font color=red><b>犯人のしっぽをつかんだ</b></font>。
</p>
<p class="code">【実験3】
初心に返り、Flashで書き出す際にファイルサイズのレポートを出力してみる。グラフィックスオブジェクトが書き出されているなら、何か記述されているはずである。
しかし、全てのオブジェクト名をチェックしたが、見覚えのないオブジェクトは存在しない。
</p>
<p class="code">【考察】
・ActionScript部分の変化は観察されない
・内部に謎のグラフィックスオブジェクトが挿入されており、これがファイルサイズ増の原因らしい
・しかしサイズレポートには怪しいオブジェクトは記述されていない
</p>
さて、この謎のグラフィックスオブジェクトは何か。レポートには名前も出ない存在だけのデータである。が、よくよくサイズレポートを見ているうちに、重大なものに気がついた。

なんと
<p><h2><font color = red>デバイスフォントが埋め込み処理されている</font></h2></p>
のである。


-再現イメージ-
 <p class="code">_等幅 : 確たなﾃﾞりなまﾀ認しくｰ<p>

いやいやいやいや、ないわー。完全にFlash Profesional CS5のバグである。
原因がわかれば対処方法も簡単。埋めこまれてしまっているなら、再定義してやればいい。
今回は以下のような手順で修正を行いました。


<p class="code">・デバイスフォントを指定しているテキストボックスを選択
・別の日本語フォント(_明朝でも何でもいい)に変更する
・全部のデバイスフォントのテキストボックスで上記を行う
・ファイルを保存して閉じる
・ファイルをもう一度開く
・全部のデバイスフォントのテキストボックスを、もう一度、等幅などのデバイスフォントに戻す
・保存して閉じる</p>以上である。すみませんね、手動作業で。
回避方法はあるかもしれないけど知りません。だってもう、私の環境では関係ないから。

書きだしたswfファイルは、みごとCS4で書きだしたswfと完全に一致しました。
現在では無事、CS5で開発を行っております。
<b><font color=red>なお、この不具合はCS4で編集したファイルをCS5で読み込む場合に発生します。
一度対応するか、初めから CS5で製作されたファイルでは発生しません。</font></b>

こうして、Flash CS5のswfはCS4よりファイル容量が大きい!?疑惑は嘘っぱち（まぁバグっぽい物ではあったのですが）都市伝説と証明され、事なきを得ました。
何事も検証してみることが大事だよね☆

<a href="http://www.youtube.com/watch?v=PnntGTOopDE&feature=player_embedded
" target="_blank">都市伝説の例</a>
あやしい！と思った人は検証してみればいいと思うよ。

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000NO23W6/unoh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51o7q-LAOUL._SL160_.jpg" alt="Mythbusters: Collection 1 [DVD] [Import]" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000NO23W6/unoh-22/ref=nosim/" name="amazletlink" target="_blank">Mythbusters: Collection 1 [DVD] [Import]</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/B000NO23W6//ref=nosim/" title="Mythbusters: Collection 1 [DVD] [Import]" target="_blank">amazlet</a> at 11.01.28</div></div><div class="amazlet-detail">Discovery Channel (2007-05-22)<br />売り上げランキング: 79419<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000NO23W6/unoh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]></description>
         <link>http://labs.unoh.net/2011/01/flash_cs5swfcs4.html</link>
         <guid>http://labs.unoh.net/2011/01/flash_cs5swfcs4.html</guid>
         <category>ActionScript</category>
         <pubDate>Fri, 28 Jan 2011 14:32:48 +0900</pubDate>
      </item>
      
      <item>
         <title>iPhone向けのサイトを作るときのちょっとした気配り</title>
         <description><![CDATA[<p>yamaokaです。</p>

<p>だいぶiPhoneやAndroidといったスマートフォン向けのwebページを作ることが増えてきたのではないでしょうか。ちょっとした気配りで使いやすくなるケースもあるかなと思うので、いくつか使えそうな工夫について書いてみたいと思います。</p>

<p>ただし、今回はiPhone向けです。</p>


<h3>タップされた場所をハイライトする</h3>

<p>iPhoneのSafariでは「-webkit-tap-highlight-color」という拡張された属性があり、タップされた箇所に色を付けることができます。CSS3ではRGBaによる色指定ができるので、半透明の色を指定すればタップされた箇所をわかりやすく示すことができます。例えば、<pre class="code"><code>-webkit-tap-highlight-color:rgba(255,0,0,0.40);</code></pre>と指定すると薄い赤色を付けることができます。「outline:none;」と併せてリンク文字列に指定するといいかもしれませんね。</p>

<h3>数字を電話番号のリンクにしない</h3>

<p>iPhoneのSafariはHTMLに含まれる数字を電話番号として検出、自動的に電話番号のリンクにしてしまいます。タップすると電話がかけられるので便利な場面もあるのですが、「123.45」のような小数点を含む数字や「100-0001」のような郵便番号、「2001-2011」のようなcopyrightの年号表記までリンクになってしまうのです。</p>

<p>この挙動を無効にするには<pre class="code"><code>&lt;meta name=&quot;format-detection&quot; content=&quot;telephone=no&quot;&gt;</code></pre>とmeta要素を使って記述します。どうしても電話番号を表示したい場合は明示的にtelto:で指定してあげればいいので自動検出は無効にしてしまうのがオススメです。</p>

<h3>文字のサイズをコントロールする</h3>

<p>PC向けに作成されたサイトをiPhoneで見た場合、フォントの大きさがPCで表示した場合と違った比率で表示されることがあります。iPhoneのSafariは文字の大きさを自動で調整してくれるのですが、自分でコントロールしたい場合もあるのではないでしょうか。</p>

<p>自動調整を無効にしたい場合、CSSで<pre class="code"><code>-webkit-text-size-adjust:none;</code></pre>を指定します。先程の「-webkit-tap-highlight-color」と同様、iPhoneのSafariで拡張されているCSSの属性です。ただし自動調整がされなくなってしまうので、Media Queryなどを使ってスクリーンの大きさにあったfont-sizeを指定してあげる必要があります。</p>

<p>自動調整を無効にした場合でも、画面の向きが変わってローテートされた場合の表示の調整は行われます（iPhoneの場合）。</p>

<p>また、あえて自動調整にまかせるという選択肢もあると思うので、この属性を使用する場合はきちんとサイト全体の方針を決めてから使うのがいいのではないかと思います。</p>

<h3>終わりに</h3>

<p>iPhone向けの小さなtipsを3つ紹介しました。小さな画面で操作することが多い分、ちょっとした気配りで操作性が上がることも多いのではないでしょうか。少しでも気の届いたページを作っていけたらいいなと思います。</p>

<p>SafariのHTMLとCSSについてはAppleのリファレンスを見れば載っているので、参考にどうぞ。</p>
<ul>
<li><a href="http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariHTMLRef/Introduction.html">Safari HTML Reference: Introduction</a></li>
<li><a href="http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Introduction.html">Safari CSS Reference: Introduction to Safari CSS Reference</a></li>
</ul>

]]></description>
         <link>http://labs.unoh.net/2011/01/small-tips-for-iphone-web-pages.html</link>
         <guid>http://labs.unoh.net/2011/01/small-tips-for-iphone-web-pages.html</guid>
         <category></category>
         <pubDate>Mon, 24 Jan 2011 18:23:33 +0900</pubDate>
      </item>
      
      <item>
         <title>WebエンジニアにやさしいYamahaルータRTX-*** 設定方法（導入編） </title>
         <description><![CDATA[
<p>こんにちは。入社６ヶ月目のyusukeです。</p>

<p>Webエンジニアの方がルータを触る機会は、少ないと思います。<br/>
ということで、Yamahaルータを例にルータの設定方法を紹介します。</p>

<h3 style="border-bottom:1px solid #6699CC;border-bottom-width:1px;border-bottom-style:solid;border-left:10px solid #6699CC;margin-top:25px;padding-left:10px;">
1. Yamahaルータへのログインについて
</h3>

<p>
Yamahaルータへのログインは、通常以下の２つの方法いずれかでログインします。<br/>

<h3>- シリアルコンソールケーブルを使用したログイン</h3>
<p>
シリアルコンソールケーブルを直接Yamahaルータに接続します。</br>
シリアルコンソールケーブルはクロスケーブルとDSUB9 or 25 と RJ45 変換コネクタでも自作できます。(ルータの購入時に付属している場合もあります。)
</p>

<h3>- telnetまたはsshを使用したログイン</h3>
<p>これは、ご存知のようにtelnetコマンドやsshコマンドを使用したログインです。<br/>

いずれもログインした後の設定方法は同じです。<br/>
ログイン時パスワードを入れてログインしますが、設定を行うには<br/>
以下のコマンドを入力して管理者モードに移行してから行います。<br/>
</p>

<pre class="code">
 $ administrator
</pre>

<h3 style="border-bottom:1px solid #6699CC;border-bottom-width:1px;border-bottom-style:solid;border-left:10px solid #6699CC;margin-top:25px;padding-left:10px;">
2. お勧めする初期設定
</h3>

<h3>- コンソールの表示文字コードを設定する</h3>
<pre class="code">
 $ console character ascii
</pre>

<p>
 文字コードを設定します。euc, sjisなどにするとエラーなどが日本語になったりします。
</p>

<h3>- コンソールの表示行数のリミットを外す</h3>
<pre class="code">
 $ console columns infinity
</pre>

<p>
show ** 等でページ送りをしないように設定します。<br/>
show configコマンドなどを一度に表示して保存する場合などに最適です。<br/>
ページ送りを行いたい場合は、show ** | less で行えます。
</p>

<h3>- プロンプトの設定</h3>
<pre class="code">
 # console prompt zynga
</pre>
<p>
これは、プロンプトの先頭文字列を設定するコマンドです。(例： zynga$ )<br/>
bashなどの$PS1と同じようなものです。ただし、特殊変数などは使えません。
</p>

<h3 style="border-bottom:1px solid #6699CC;border-bottom-width:1px;border-bottom-style:solid;border-left:10px solid #6699CC;margin-top:25px;padding-left:10px;">
3. コマンド入力記法について
</h3>
<h3>- showコマンドとクエスチョンマーク( ? )</h3>
<p>
自分の設定した内容を見るときは $ show configと入力します。また、設定内容と現在の動作状況を見るときは $show tech または $show techinfoと入力します。<br/>
その他、show コマンドを入力後 ? を入力することでヘルプが表示されます。<br/>
</p>

<h3>- noコマンド</h3>
<pre class="code">
 $ no console character ascii
</pre>
<p>
今まで、入力したコマンドを無効にしたいときなどに使用します。<br/>
show configで表示されるコマンドの先頭に no をつけて実行することにより該当行のコマンドが無効化または、デフォルト状態に戻ります。
</p>

<h3>- 設定の一括投入</h3>
<p>
一度に行う設定が複数ある場合、設定の反映はコピペで一括で行うことができます<br/>
初期設定時やネットワークを遮断した際の設定は一括で行った方が効率がよいと思います。<br/>
今までの設定は以下で行えます。管理者モードで以下３行をコピペすることで反映されます。
</p>
<pre class="code">
console character ascii
console columns infinity
console prompt zynga
</pre>

<h3>- 設定の保存</h3>
<pre class="code">
 # save
</pre>
<p>
設定内容を不揮発性メモリに保存して、ルータの再起動後でも設定が残るようにしておきます。
</p>

<p>
最後に、オンラインでの設定変更は十分にマニュアルや設定例などを読んだ上行ってください。予期せぬ再起動。通信断を招く可能性があります。
</p>

<div style="margin:0;padding:.5em;border:2px solid #ccc">Zynga Japanでは積極的にエンジニアを採用しています。<br /> 
<a href="http://www.zynga.co.jp/recruit/recruit.php?siteid=unohlabs">採用ページ</a>をご覧になり、興味のある方はぜひご応募ください。</div> ]]></description>
         <link>http://labs.unoh.net/2011/01/webyamahartx-.html</link>
         <guid>http://labs.unoh.net/2011/01/webyamahartx-.html</guid>
         <category></category>
         <pubDate>Wed, 12 Jan 2011 19:50:35 +0900</pubDate>
      </item>
      
      <item>
         <title>30分でわかる PHP Extensionの作り方を学べる記事をかいたよー ＼(＾o＾)／</title>
         <description><![CDATA[<p>こんにちは。12月に入社した<a href="http://twitter.com/chobi_e">@chobi_e</a>です。</p>


<p>私が所属しているチームではお菓子系男子が30%を超えているという素敵チームで
毎週チーム内の漢の子がお菓子を焼いてくるという状況でハッピハッピハッピーです。
</p>

<p>今日は私が学んできたPHP Extension作成についてのノウハウの一部を
公開しようと思います。</p>

<p>PHPExtension作成についての資料はklabさんやyoyaさん
rskyさんの記事が参考になりますが私のようにPHPは書けてもCが書けない人には具体的にhello world以降何をすればいいのかがサッパリよく分かりません。</p>


<p>そこで先人達が作ってくれた偉大なライブラリをPHPで扱えるようにする為にC/MigemoのPHPバインディングを作ってみましょう</p>
]]></description>
         <link>http://labs.unoh.net/2011/01/30_php_extension_o.html</link>
         <guid>http://labs.unoh.net/2011/01/30_php_extension_o.html</guid>
         <category></category>
         <pubDate>Tue, 11 Jan 2011 16:13:02 +0900</pubDate>
      </item>
      
      <item>
         <title>flashlite1.1で文字圧縮してみた</title>
         <description><![CDATA[<p>明けましておめでとうございます＆はじめまして。12月に入社した加藤です。</p>
<p>FlashLite 2.0をやるつもりで入ってみたらバリバリ1.1だったので、出す機会を逸していたネタをここで出したいと思います。</p>
<p>FlashLite 1.1の制限にはいろいろありますが、開発する上で一番困るのは100KB制限です。<br />
  100KBと言うと、このページの右カラムに並んでいる著者一覧の写真が一つだいたい8KBくらいですので、だいたい12枚分になります。その中にグラフィックとスクリプト両方をつめ込まねばなりません。<br />
  普通のFLASHならパブリッシュ設定の「ムービーの圧縮」にチェックを入れれば圧縮が有効になるのですが、残念ながらFlashLite 1.1ではその機能はグレーアウトされて使えません。<br />
  そういうわけでFlashLite 1.1のエンジニアは日々シェイプの最適化から変数名の文字数まで、地道な作業に血道をあげています。</p>
<p>しかし、生成エンジンで変数差し込みをする場合、いくらswfを最適化したところで「100KB-swfのファイルサイズ」分のデータしか入れられません。Twitterクライアントを作っていたとき、これだと50件表示までしか出来なくて何とかして100件表示にしたいと思い辿り着いたのが文字圧縮です。</p>]]></description>
         <link>http://labs.unoh.net/2011/01/flashlite11.html</link>
         <guid>http://labs.unoh.net/2011/01/flashlite11.html</guid>
         <category>ActionScript</category>
         <pubDate>Fri, 07 Jan 2011 19:37:00 +0900</pubDate>
      </item>
      
      <item>
         <title>入社後なるべく早くキャッチアップするために心がけたこと</title>
         <description><![CDATA[<p>あけましておめでとうございます。<br />
chunoです。</p>

<p>弊社には(身内自慢になるかもしれませんが)手練のエンジニアが老若男女問わず揃っており、ギークでもスーパープログラマでもない私にとっては</p>
<div>「一番の下手くそ」</div>
<p>でいられる、成長するためには理想的な環境です。</p>
※参考「<a href="http://www.amazon.co.jp/dp/4274067939/">情熱プログラマー</a>」第一章の4</p>
<p><br /></p>
<p>とは言え、そういう状況で安穏としているわけにもいかないので、少しでも早く周囲にキャッチアップできるよう努めました。</p>
<p>それらについて、これから述べます。</p>

]]></description>
         <link>http://labs.unoh.net/2011/01/site.html</link>
         <guid>http://labs.unoh.net/2011/01/site.html</guid>
         <category></category>
         <pubDate>Thu, 06 Jan 2011 09:00:00 +0900</pubDate>
      </item>
      
      <item>
         <title>Valgrindを使って楽々PHP拡張モジュール開発のデバッグ</title>
         <description><![CDATA[<p>明けましておめでとうございます。<a href="http://twitter.com/emorins">@emorins</a>です。</p>
<p>みなさんモジュール開発ではどのようにデバッギングしていますか？モジュールになると普段使い慣れたデバッグツールが使えず、手動の動作確認だけで済まされている方もいらっしゃるのではないでしょうか。</p>
<p>今回はC/C++開発ではメジャーなメモリデバッガ『<a href="http://valgrind.org/">Valgrind</a>』をPHP拡張モジュールの開発で活用することで、普段使い慣れたツールでのデバッグの例をご紹介します。</p>

<h3>1.PHP拡張モジュールの作成</h3>
<p>まず開発用にPHPをデバッグモードでビルド。</p>
<pre class="code">#cd ./php-5.x.x
#./configure --enable-debug
#make
#make install</pre>

<p>PHP拡張モジュールを作成</p>
<pre class="code">#cd ./ext
#./ext_skel --extname=zynga_func
#cd zynga_func</pre>

<p>16行目から18行目のコメントアウトを外す</p>
<pre class="code">#emacs config.m
- dnl PHP_ARG_ENABLE(zynga_func, whether to enable zynga_func support,
- dnl Make sure that the comment is aligned:
- dnl [  --enable-zynga_func           Enable zynga_func support])
+ PHP_ARG_ENABLE(zynga_func, whether to enable zynga_func support,
+ Make sure that the comment is aligned:
+ [  --enable-zynga_func           Enable zynga_func support])</pre>

<p>拡張モジュールのビルド</p>
<pre class="code">#phpize
#./configure
#make
#make install</pre>

<p>php.iniに以下を追加</p>
<pre class="code">extension=zynga_func.so</pre>

<p>同一ディレクトリ内に生成されているテスト用PHPコードを実行</p>
<pre class="code">#php zynga_func.php</pre>

<p>以下のように出力されたらモジュールの正常な読み込みに成功。</p>
 <pre class="code">Functions available in the test extension:
confirm_zynga_func_compiled

Congratulations! You have successfully modified ext/zynga_func/config.m4.
Module zynga_func is now compiled into PHP.</pre>

<p>これで正常にPHP拡張モジュールの生成と読み込みが確認できたので、Valgrindでデバッギングしてみましょう。</p>

<h3>2.Valgrindによるデバッグ</h3>
<p>Valgrindにはいくつかのツールが付属したツール群になっていますが、まず最も使用するであろうMemcheckによるメモリーリーク、初期化・開放などのメモリ周りのデバッグログを出力してみましょう。</p>

<pre class="code">#valgrind php zynga_func.php
==2107==
==2107== HEAP SUMMARY:
==2107==     in use at exit: 104,669 bytes in 9 blocks
==2107==   total heap usage: 10,973 allocs, 10,964 frees, 2,127,924 bytes  allocated
==2107==
==2107== LEAK SUMMARY:
==2107==    definitely lost: 0 bytes in 0 blocks
==2107==    indirectly lost: 0 bytes in 0 blocks
==2107==      possibly lost: 0 bytes in 0 blocks
==2107==    still reachable: 104,669 bytes in 9 blocks
==2107==         suppressed: 0 bytes in 0 blocks
==2107== Rerun with --leak-check=full to see details of leaked memory
==2107== 
==2107== For counts of detected and suppressed errors, rerun with: -v
==2107== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)</pre>

<p>※ログの見方</p>
<ul>
<li>HEAP SUMMARY: どれだけのヒープ領域を使用し、解放したかの数値。</li>
<li>LEAK SUMMARY: メモリーリークが起きているbyte数とblock数。</li>
<li>ERROR SUMMARY: エラー数</li>
</ul>

<p>ログから、メモリーリークは一切起きておらず、ヒープ領域も僅かに開放されていない箇所もあるが、正常に動作していると言えます。</p>

<p>次にわざとメモリーリークを起こすコードを関数内に埋め込んでみます。zynga_func.c内の、PHP_FUNCTION(confirm_zynga_func_compiled)関数が、先ほどzynga_func.phpで実行された関数になるので、その中の処理を書き換えます。</p>

<p>mallocで確保しているにも関わらずfreeで開放していないため、メモリーリークが起きるコード。</p>
<pre class="code">#emacs zynga_func.c
void f(void)
{
    int* x = malloc(10 * sizeof(int));
    x[10] = 0;        // problem 1: heap block overrun
}                    // problem 2: memory leak -- x not freed
PHP_FUNCTION(confirm_zynga_func_compiled)
{
    f();
    ....</pre>
<p>ビルドして反映。</p>
<pre class="code">#make
#make install</pre>

<p>valgrindで確認。</p>
<pre class="code">#valgrind php zynga_func.php
==4934== Invalid write of size 4
==4934==    at 0x101231C14: f (in /usr/local/lib/php/extensions/debug-non-zts-20060613/zynga_func.so)
==4934==    by 0x101231C3B: zif_confirm_zynga_func_compiled (in /usr/local/lib/php/extensions/debug-non-zts-20060613/zynga_func.so)
==4934==    by 0x100308AF3: zend_do_fcall_common_helper_SPEC (in /usr/local/bin/php)
==4934==    by 0x100309A06: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER (in /usr/local/bin/php)
==4934==    by 0x1003084FB: execute (in /usr/local/bin/php)
==4934==    by 0x1002DD728: zend_execute_scripts (in /usr/local/bin/php)
==4934==    by 0x100279F64: php_execute_script (in /usr/local/bin/php)
==4934==    by 0x10036A507: main (in /usr/local/bin/php)
==4934==  Address 0x1010b1298 is 0 bytes after a block of size 40 alloc'd
==4934==    at 0x10062D79F: malloc (vg_replace_malloc.c:236)
==4934==    by 0x101231C07: f (in /usr/local/lib/php/extensions/debug-non-zts-20060613/zynga_func.so)
==4934==    by 0x101231C3B: zif_confirm_zynga_func_compiled (in /usr/local/lib/php/extensions/debug-non-zts-20060613/zynga_func.so)
==4934==    by 0x100308AF3: zend_do_fcall_common_helper_SPEC (in /usr/local/bin/php)
==4934==    by 0x100309A06: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER (in /usr/local/bin/php)
==4934==    by 0x1003084FB: execute (in /usr/local/bin/php)
==4934==    by 0x1002DD728: zend_execute_scripts (in /usr/local/bin/php)
==4934==    by 0x100279F64: php_execute_script (in /usr/local/bin/php)
==4934==    by 0x10036A507: main (in /usr/local/bin/php)
==4934==    Congratulations! You have successfully modified ext/zynga_func/config.m4. Module zynga_func is now compiled into PHP.
==4934== 
==4934== HEAP SUMMARY:
==4934==     in use at exit: 104,709 bytes in 10 blocks
==4934==   total heap usage: 10,974 allocs, 10,964 frees, 2,127,964 bytes allocated
==4934== 
==4934== LEAK SUMMARY:
==4934==    definitely lost: 40 bytes in 1 blocks
==4934==    indirectly lost: 0 bytes in 0 blocks
==4934==      possibly lost: 0 bytes in 0 blocks
==4934==    still reachable: 104,669 bytes in 9 blocks
==4934==         suppressed: 0 bytes in 0 blocks
==4934== Rerun with --leak-check=full to see details of leaked memory</pre>

<p>今度はリークしている箇所と、byte数・block数がログに出力されるのを確認できました。</p>
<p>Valgrindはメモリーリークの検出以外に、初期化されていないメモリ領域の使用、freeされたメモリ領域の使用、ヒーププロファイラ、キャッシュプロファイラなど多用の機能を備えています。</p>
<p>普段使い慣れたツールで、開発に負荷のかからないデバッグを行っていきましょう。</p>


<div style="margin:0;padding:.5em;border:2px solid #ccc">Zynga Japanでは積極的にエンジニアを採用しています。<br />
<a href="http://www.zynga.co.jp/recruit/recruit.php?siteid=unohlabs">採用ページ</a>をご覧になり、興味のある方はぜひご応募ください。</div>
]]></description>
         <link>http://labs.unoh.net/2011/01/valgrindphp.html</link>
         <guid>http://labs.unoh.net/2011/01/valgrindphp.html</guid>
         <category></category>
         <pubDate>Wed, 05 Jan 2011 17:53:18 +0900</pubDate>
      </item>
      
   </channel>
</rss>

