2011年4月19日

I love spacer
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

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

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

一般的な使い方

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

気をつけること

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

デザインを統一するために

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

height代わりに使う

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

ラインを表現するのに使う

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

何かと制限の多い携帯向けXHTMLですが、spacerのように頭をひねれば意外といろいろが解決可能だということに気づくかと思います。
全てがバッドノウハウですので、本当に役に立っているのか時たま分からなくなる時もありますが、みなさんもぜひspacerを愛でみてはいかがでしょうか?意外な使い方が見つかるかもしれません!

2011年4月 1日

わんわん
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

きゃんきゅーんわんわおんわーんばうきゃんきゃんきゃうんわおんわおんわんきゃんきゃんきゃうんきゃんきゃん!
わうわーん。
わんわーんわんわうわん。
わんわおんわんわおんわん!
きゃうんわーんわうきゅーんわおんわーんばうわおんわんわおんわん。
わーんわーんきゃんわうわんわんわおん!
わんきゃんきゃんわうわーんわんきゃんわおんわんわおんわん!
わん。
きゃうんきゃんきゅーん。
わーんわんきゃんわうわーんばうわんわんわうきゅーんきゃんわんわーんわおんわん。
きゃうんわおんわおんわおん!
きゃんわおんわおんわんばうわおんわんばうきゃんわおんきゃうんわおん!
わんわおんばうきゃん!
わうきゃうんきゃんわおんきゃんきゃんわおん!
わんきゃんわーんわーんわんきゃうんわんきゃんきゃんきゃんきゃんきゅーんきゅーんわおんわんわおんわーんわーんわんわんわんばうわおんわんきゃんわーん!
きゃんわおんきゃんばうきゃんきゃんわーんわうわおんわーんばうわーんばうわうわんわーんわんわおんきゃんばうきゃんわーんきゃうんわん!
きゃうんわおんきゃんわうきゃうんきゃんばうわーんきゃんわーんきゃんわーんわおんわうわーんきゅーんわーん。
わーんわーんわうきゃんきゅーんばうわーんばうわーんわーんわうわーんわーんきゃんわーんわおんきゃうんわーんわーんきゃうんわーんわおんきゃんわーんきゃんわおんわーんわーんばうわおんわおんきゃんきゃうんきゃんきゅーんわんわおんばうわおんわおんわおんわーん。
わおんわおんわーんわーんばう。
わうわんきゅーんわーんきゃんきゃうんきゃうんわーんわうわーんわん。
きゅーんきゃんわおんわう。
きゃんわおんばうきゃんわんきゃうんばうわんきゃうんわんわんわうわーんきゃん。
きゃうんわおんきゃんきゃん。
わうわんきゃうん!
きゃうんわおんきゃうんわんわんばうきゃうん。
きゃんわう!
きゃうんきゃん!
きゃんわんわーんきゅーんきゃうんわん。
きゃんきゃんわんわおんきゅーんわんわおんばうわーんわんばうわーんわーんわおんわおんわんわんきゃんわーんきゃうん。
わおんきゅーんわおんわーんきゃうんばうわんわおんわうわおんきゃんわうわんきゃうんわんわーんきゅーんきゃうんわんきゃうんばうきゃんきゃうん!
きゃんわおんわうわーんきゃんわうきゃんわーん。
ばうわん。
わおんばうきゃうんわおんきゅーんきゅーんわおんきゃうんわーんきゃんわーん。
わう。
わーんきゅーんばうきゃん。
ばう。
わんわん!
わおんばうわんわうわおんわん!
わんきゃんきゃん!
わーんばうきゃん。
わおんきゃん!
わんきゃうんわおんわーんきゃうんわおんわんきゅーんわーん!
わーんわうきゃうんわおんわーん!
きゃんわーんわうわおんわーんわおんわんわおんきゃんわうきゃんきゃうんわーんわーんばうわおんわおんわんわうきゃんきゅーんわんわんばうきゃうん!
きゃんきゅーんわうわおんきゃんきゃんわんきゃうんきゃうんわおんわおんきゃんわんわおんわーんわおんわおんわーんわん。
わうわんわおんわおんわおんきゃんきゅーんわおんきゃんきゃん!
わーんわーんきゅーんきゃんわおんきゃんばうわーんきゃうんきゃうんわんきゃうんわうわおん!
わーんばうわーんわーんわんわおんわうばう。
わおんばうわーんわーんきゅーんわーんわんきゃうん。
わんわおんわおんきゃんきゃんわおんきゃんわおんわおんわおんわーんきゃんわんわおんわおんばうきゃんきゅーん!
わうわんきゅーんきゃうんわーんきゃうんきゃんわおん!
ばうわうわおんきゅーんきゃうんわーんきゃんわんきゃんきゃうん。
ばうわーんきゅーんきゅーんきゃんきゃんきゃうんわおんきゃんきゅーんわおんわうわんわんばうばうわーんきゅーんわおんわんきゃんきゅーんわおんばうわおんきゃんわーんわおんわおん!
わーんきゅーんわおんわーんわんわおんわんわうきゃんばうわおんわんばうわーんわんわーんきゃうんわおんきゅーんわおんわおんばうわおん。
わおんわうわおんわんわおんきゅーんきゃんきゃうんきゅーんわーんきゃうんわうわんわう!
わうわんきゅーんきゅーんわーん。
きゅーんきゃうんわおんきゃんわんわおんわーんきゃん。
わおんわーんばうわんわんわおん!
わおんわうわーんきゃんきゃうんわん。
きゃん!
きゃうんわおんきゃんきゃんわーんわんきゃん!
わうわおんきゃうんきゃうんわーんわーんきゃうんきゃんわおんわうわおんわーんわうわんわうきゅーんきゃん!
わうきゃうんきゃんきゃうんわおんきゃんきゃうんきゃんわーんばう。
わおんわーんわおんきゃんきゃんばうきゅーんわーん!
わおんわおんわんきゅーん!
きゃんわおん!
わうきゃうんわおんわんきゃんわおんばうきゃんきゃんきゃんわーんわーんきゃうんわう!
わおんきゃんわんわーんきゃんわおんきゃん。
きゅーんきゅーんわーんきゃうんきゃうん。
わおんわうきゃうんわんきゃんきゅーんわんわーんきゅーんきゃんわうばうわーんわうわうわんわんきゅーんわーんわーんわうきゃんきゃうんきゃうんわーんきゃんきゃんきゃんきゅーんきゃん

2011年3月24日

PHPで利用出来るテストと開発に便利なツール
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは。yukiです。

今日はテストや普段の開発に便利なツールのご紹介をしたいと思います。PHP限定のツールですので、ご了承下さい。

ZyngaJapanでは、昨日リニューアルオープンした「ファームビレッジ」でも、Jenkins(旧Hudson)によるCIを行って開発しており、TDDやJenkinsでのCIを利用する文化がだんだんと浸透してきています。Jenkinsのプラグインとして利用できるものも多くありますが、当然ながらコマンドラインからも利用出来ますので、コミット前に自分のコードをチェックすることもできます。

phpcpd

コードの中でコピー&ペーストで記述されている部分を検出してくれます。
どの程度の重複から検出するかを柔軟に設定できるので、まず大きな部分から修正するなど判断ができ便利です。

$ 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

phpdcd

どこからもコールされていないメソッドなどを検出してくれます。リファクタリング対象として確認に役立ちます。

$ 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

phploc

以下のようにphpファイルの構成要素を算出してくれます。(数字は全てダミーです)

$ 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

phpmd

if文のネスト階層数などの複雑さ、短すぎる、または長すぎる変数名や、使われていない変数の検出など様々な条件に応じて検出を行ってくれます。

$ 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'.

上記はJenkinsのプラグインとして使えるものもありますので、是非検討してみてはいかがでしょうか。

2011年3月23日

Puppet DashboardからExternal Nodesを利用する方法
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

入社3ヶ月目のsaekiです。
今回はPuppetのGUIツール「Puppet Dashboard」でExternal Nodes機能を使用する方法を紹介しようかと思います。
Puppet Dashboardのインストール方法は公式ドキュメントを参考にしてください。
Puppetは0.25.5、Puppet Dashboardは1.0.4を使用しています。

■できること

- マニフェストではなくdashboard上でnode設定ができます。
- node(またはgroup)毎にclassを設定やParameterの設定ができます。

■使用方法

- classを登録する
dashboardにclassを登録します。

1. マニフェストのclassを作成します(例はhosts)
 class hosts {
   file {
     "/etc/hosts":
       owner => 'root',
       group => 'root',
       mode  => 644,
   }
 }

2.dashboard上から[Add class]を選択して、作成したclassを登録します。
class_detail.png

3.nodeにclassを登録するには、node編集画面から[Classes]に作成したclassを登録します。
classにパラメータを渡したい場合は、[Parameters]にkeyとvalueを登録すると変数として扱えます(画像の青い囲い)
node_edit.png

クライアントからpuppetdを実行してみてください。
特にsite.ppなどにnodeの設定をしてなくても、hosts classのマニフェストが反映されるかと思います。


- group登録をする
chassやnodeをgroup登録できます。サーバ機能毎やプロダクト毎にまとめたい場合に利用できるかと思います。

1.左メニューから[Add group]を選択するとgroup編集画面になります。
2.groupに登録したいclassやgroup(親group)を設定できます。group毎に使用するParameterの設定も可能です。
group_edit.png

3.groupにnodeを登録するには、node編集画面から[Groups]に作成したgroupを登録します。
node_edit_group.png

■利用例

- こんなイメージで設定ができるかと思います(webサーバgroupとして設定)
base(group)
   ├─ web(group)  
   │      ├──  httpd(class)
   │      └──  php(class)
   │
   ├── hosts(class)
   ├── ntp(class)
   └── ssh(class)
External NodesをGUIで扱うtoolにはforemanというのもあるようです。
便利な機能かと思いますので、Puppet利用されている方は導入されてみてはいかがでしょうか。

symfonyエキスパートになるために必須の1冊
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

突然ですが、symfonyのエキスパートになりませんか?HIROKIです。

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

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

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

sf14book-image.jpeg

本書は

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

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

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

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

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

続きを読む "symfonyエキスパートになるために必須の1冊" »

2011年2月22日

Varnish上でESIの機能を利用する
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

Keita です。

サンフランシスコで開かれたSymfony Liveで、Fabien Potencier氏によるHTTP Cacheという発表がありその中でESI(Edge Side Includes)の紹介がありました。

下の画像はちょっとみずらいですが、たとえばこのラボブログのレイアウトだと大枠の部分は常によりユーザに使いフロントの所(つまりCDNやキャッシュサーバ)側でキャッシュされていてAの部分とBの部分それぞれのコンテンツを別々にインクルードする形でキャッシュ制御することができます。

esi.png

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

Varnishのインストールについては省略してとりあえず設定部分から。VarnishサイトにあるESIの説明あたりを参考にして下記のような環境を構築してみました。

Apache側(port: 10080でアクセス可能)

himote.html
<html>
<head>
himote:
</head>
<body>
<esi:include src="/time.php" />
</body>
</html>
time.php
<?php
echo date('Y/m/d h:i:s');

varnish側(port: 6081でアクセス可能)

default.vcl
backend default {
  .host = "127.0.0.1";
  .port = "10080"; // Apache
}

sub vcl_fetch {
    if (req.url == "/himote.html") {
            esi; // enable ESI
    }
}
wget で確認
wget http://localhost:6081/himote.html -O -

<html>
<head>
himote:
</head>
<body>
2011/02/22 11:07:37
</body>
</html>

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

<html>
<head>
himote:
</head>
<body>
2011/02/22 11:07:37
</body>
</html>

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

<?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');
動作確認
wget http://localhost:6081/himote.html -O -

<html>
<head>
himote:
</head>
<body>
2011/02/22 11:13:47
</body>
</html>

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

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

本家のマニュアルを写経した程度になってしまいましたが、どのようなものかイメージをつかんでいただけたのではないでしょうか。実際にプロダクトレベルで利用するにはベンチマークやログなどの詳細な検証は必要になると思いますのでご注意ください。

本記事がご参考になれば幸いです。

2011年2月21日

サーバ情報を収集する Ruby スクリプトを書くには
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは。kyagi です。今回はサーバ情報を収集する Ruby スクリプトを書く方法をお知らせいたします。具体的にはサーバ情報収集ツール facter (※1)の紹介と使い方になります。

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

$ 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 ...)

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

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

$ 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

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

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

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

require 'BaseServer'
class BaseServer::HttpdServer < BaseServer
  def getApacheStatus
    (... snip ...)
  end
end

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

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

以上、サーバ情報収集ツールを 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 までの素数を抽出する) などの使い方を試してみると面白いかもしれません。

ウノウラボはZynga Japan株式会社のエンジニア/デザイナーによる大小のアウトプットを行っていく場です。

著者一覧

keita yamaoka yuki isogawa cloned chihiro sawa murahashi tomohisa yuzo hanada taka jhoshina emorins shinichi fei rkato

デモサービス

ライブラリなど

ライセンスについて

ウノウラボで配布しているソースコードのご利用につきましては、基本的に修正BSDライセンスに従うものとします。 それ以外のライセンスを指定させていただく場合は記事中で個別に記載いたします。

Zynga Japan

Powered by
Movable Type 4.261