ラベル TeckBlog の投稿を表示しています。 すべての投稿を表示
ラベル TeckBlog の投稿を表示しています。 すべての投稿を表示

2012年6月27日水曜日

CakePHP HTML Cache Plugin の2.x対応と追加機能とか

@mon_sat です。
CakePHP HTML Cache Plugin についてメモしておきます。

CakePHPにはキャッシュの機能がありますが、純粋な静的ファイルを書き出すもっと強力なキャッシュをおこなうためのプラグインがあります。
(symfonyでは sfSuperCache 、Fuel PHP ではfuel-pagecacheという同様のプラグイン等があるそうです)

仕組みは、mod_rewriteの機能を利用し、webroot/cache以下に、該当するhtmlやrss等のファイルがあれば、それを直接表示し、無ければ、CakePHPが通常の描画後、webroot/cache以下にページを書き出すというもの。

一度作成するとphpすら使われませんので当然速いわけです。

ただしそのファイルを消さないと永遠にCakePHPが再表示しませんので、以下のコマンドのようなことでファイルを消してあげる必要がありますが。

find /full/path/to/app/webroot/cache -mmin +360 | xargs rm -f

さてこのプラグイン、もともとはMatt Curry氏が作成したプラグインです。
その後CakePHP2.x系への対応がまだのようでしたので、forkして作成したのが、こちらです。

インストールと準備

ダウンロード後、APP/Plugin/HtmlCacheとなるように配置してください。
bootstrap.phpでPluginをloadします。

# APP/Config/bootstrap.php
CakePlugin::load('HtmlCache');

webroot/.htaccess を修正します。
(修正内容は extras/.htaccess のようにします)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^GET$
    RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
    RewriteRule ^(.*)$ /cache/$1/index.html [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

プラグインの使用

あとは、Controllerで $helpers = array('HtmlCache.HtmlCache'); のようにします。
ただ特定のactionだけ使用するというケースがほとんどでしょう。ですので。
viewファイル内で使用する場合は、次のようにします。

$this->Helpers->load('HtmlCache.HtmlCache');
$this->HtmlCache->options($options);    // 必要に応じて

オプションの指定

オプションは配列で指定します。
# view
$this->HtmlCache->options(array('cache_dir' => 'statics'));

オプション(デフォルト)
  • 'test_mode' => false,
    • trueにするとdebug level が1以上でもキャッシュファイルを書き出します
  • 'host' => null,
  • 'domain' => false,
    • trueにすると、複数ドメインで運用している場合にhostごとに書き出すことができます
    • $_SERVER['HTTP_HOST']もしくはhostオプションの値が使用されます
  • 'www_root' => APP . WEBROOT_DIR,
    • webルートのフォルダをフルパスで指定します
  • 'cache_dir' => 'cache',
    • デフォルトでは webroot/cache 以下にキャッシュファイルが作られます
    • ここを修正した場合は webroot/.htaccess も適宜修正しましょう
  • 'filename' => 'index.html',
    • 拡張子なしでCakePHPにアクセスしたときに書き出すファイル名です
    • index.htm や index.php を使用したいという場合はここを書き換えます
  • 'file_path' => null,
    • まったく別のURL(パス)で書き出したいという場合は、ここを編集します
    • 例) 'file_path' => $this->webroot . DS . $item['Item']['filename'],
というわけでRSS等の出力に絶大な効力を発揮する HtmlCache Plugin を紹介しました。

ぜひご活用ください

MontBlanc-Sucks/HtmlCache
ご意見・ご要望・ご質問は、 @mon_sat までお願いします。
このエントリーをはてなブックマークに追加

2012年6月26日火曜日

CakePHP OGP Plugin つくりました

@mon_sat です。

OGPタグというものがあります。
facebookとかでシェアしたときに、任意のタイトルやdescription、画像等を設定するmetaタグです。
このブログの場合は、次のようになります。

さて、このOGPタグと、titleタグ、metaタグの一部(description)等は、内容が重なります。

これらを、view等から簡単に設定できると良いですね。
というわけで @yando さんのアドバイスを受け、プラグインにしてみました。

CakePHP OGP Plugin

インストールと設定

プラグインをダウンロードし、 APP/Plugin/Ogp となるように設置します。

git で clone / submodule add する場合は、次のような感じで
cd your_app
git clone git://github.com/monsat/Ogp.git Plugin/Ogp

CakePHP2.xではプラグインを明示的に読み出す必要があるので

# APP/Config/bootstrap.php
CakePlugin::load('Ogp');
とし、Controllerで、OgpHelperを読み出します。

# APP/Controller/AppController.php
public $helpers = array( 'Html', 'Form', 'Ogp.Ogp');
これで準備完了です。

次に、サイトの設定をします。
# APP/Config/bootstrap.php
Configure::write('Site', array(
  'site_name' => 'サイトのタイトル',
  'description' => 'サイトの説明',
  'image' => '/img/image.png',  // サイトの画像
  'type' => 'website',                 // サイトの種類(blog等)
  'separator' => ' - ',                 // ページタイトルとサイトタイトルの間の文字列
));
Configure::write('Ogp.settings', array(
  'base' => 'Site.',
  'autoKeys' => array('type', 'site_name', 'description', 'image'),   // viewで設定しなくても必ず書き出すOGPタグ
));

Configureで Ogp.settings.base で設定しているので、
Configure::read('Site.site_name') や Configure::read('Site.description') などが利用されます。

使い方

layoutファイルの次の記述の箇所に、他のmetaタグと一緒に書き出されます。

# layout
echo $this->fetch('meta');

viewファイルでは、以下のように使います。
# view
// <title>タグ($title_for_layout)も同時に設定されます。
$this->Ogp->title('ページのタイトル');
// フルURLで書き出されます。
$this->Ogp->image($post['Post']['author_image_url']);
// その他は、ogpタグのname(og:無し)とcontent
$this->Ogp->set(
  'description',
  "stripped \n and <b>tags</b>",
  // options
  array(
    'meta' => true,
  ),
);

contentに使用される文字列は、タブ・改行文字およびhtmlタグを除去します。
※ stripTagsオプションを false にすると、htmlタグの除去は行われません

metaオプションを true にすると、通常のmetaタグも同時に書き出されます。

この記事の例では、次のようなタグが出力されるでしょう。(順番は変えてあります)

<title>ページのタイトル - サイトのタイトル</title>
<meta property="og:title" content="ページのタイトル - サイトのタイトル" />
<meta property="og:site_name" content="サイトのタイトル" />';

<meta name="description" content="サイトの説明" />
<meta property="og:description" content="サイトの説明" />
<meta property="og:type" content="website" />

<meta property="og:image" content="http://example.com/img/author_image_example.png" />

という具合です。
$this->Ogp->title()を設定しなければ、Site.site_nameの値がtitleタグとog:titleに使用されます。

ぜひご活用ください

monsat/Ogp · GitHub
ご意見・ご要望・ご質問があれば、 @mon_sat までお願いいたします。
このエントリーをはてなブックマークに追加

2012年6月25日月曜日

jQuery Link Box プラグイン作りました

@mon_sat です。
非常に車輪の再発明的ではありますが、jQuery Link Box プラグインを作りました。
(jquery 1.7以上に対応しています)


簡単に言うと、リンクの外側のボックス(div等)全体をクリック可能にするためのプラグインです。

使用例は以下およびsample/index.htmlをご覧ください

使い方


jqueryを読み込みます

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="../jquery.linkbox.js"></script>
</body>の直前に記述するか、<head></head>内に記述してください。

クリック可能にするbox(div等)にdata-click="linkbox"を記述します

<div data-click="linkbox" class="sample">
    <p>sample <a href="/">最初のリンク</a> が使用されます。</p>
    <p>sample <a href="/p/blog-page.html">このリンク</a> は直接クリックする必要があります。</p>
</div>
[data-click="linkbox"]が書かれた属性内の最初のリンクが使用され、ボックスをクリックしたときに遷移します。

(オプション)必要に応じて、ボックスにスタイルを設定します

ボックスがクリック可能であることを示すようなstyleを記述しましょう。
.linkbox {
    background-color: #eee;
}
div.sample {
    cursor: pointer;
}
デフォルトでは .linkbox というクラスが使用されます。
※ 追記(2012-06-29):iPad等で有効にするためには、cursor: pointer をあらかじめ指定しておく必要があります。

(オプション)任意のaタグのリンク先を使用したい場合

[data-linkbox="target"]という属性が存在するリンクは、優先して使用されます。
<div data-click="linkbox">
    <p>sample <a href="/">最初のリンク</a> ですが、直接クリックする必要があります。</p>
    <p>sample <a href="/p/blog-page.html" data-linkbox="target">このリンク</a> は優先して使用されます。</p>
</div>


デモ


サンプル2
https://github.com/monsat/jquery.linkbox

<a href="/" data-linkbox="target">このようなリンク</a>の場合、優先して使用されます
https://github.com/monsat/

ぜひご活用ください

monsat/jquery.linkbox · GitHub
ご意見ご要望ご質問は、@mon_satまでお願いします。
このエントリーをはてなブックマークに追加

2012年6月24日日曜日

Webデベロッパ ハッカソン at PoRTAL Shibuya に参加してきました

@mon_sat です。
金曜日から土曜日にかけて行われた Webデベロッパ ハッカソン at PoRTAL Shibuya というイベントに参加してきました。

金曜日の夜に開始し、翌午前中まで開発そして成果発表をして終了という、比較的負担の少ないハッカソンです。

ちなみにハッカソンとは hack + marathon ということで、各自が開発をしつづけるというイベントです。たいていは夜通しおこなわれるところがマラソンっぽく体力勝負なわけです。

デザイナー向けCakePHP勉強会でも使わせていただいた PoRTAL Shibuya に10名以上の開発者が集まり、それぞれ普段ではなかなかできないようなことを中心に開発してました。
CakePHPの勉強会等で知り合った方も何人か参加していて、CakePHPに関する質問をしあったりする光景も。

わたしも前日から開発していた monsat/jquery.linkbox に加え monsat/Ogp · GitHub と、 MontBlanc-Sucks/HtmlCache の追加機能を作りました。じつは来週の仕事の準備なんですけど(笑)

HtmlCacheは、もともとMatt Curry氏が作成したHTML等の静的ページを書き出すためのプラグインです。
その後 sams 氏がCakePHP2.0対応を試みていたようなので、forkしてその続きをすでに開発していたのですが。
この日は「任意のディレクトリやファイルを削除する機能」を実装しました。
これによりサイト全体のキャッシュを削除したり、任意のフォルダ以下のキャッシュを削除というような利用が可能になります。

詳しくは別途ブログにまとめたいと思いますが。

話をハッカソンに戻し。
やはり、こういうイベントで他の方と開発をおこなうというのは、非常に刺激になります。
詰まったときに他の方と話をすることで解決の糸口を見つけたりもできますし。

そして、成果発表する時間があるので、「何かしら作る」というモチベーションも高まることでしょう。
どんなに些細なことでも、それが自分にとって有益であれば良いのだと思います。
こういうイベントに積極的に参加することで、開発スキルや、開発の基礎体力がついていくのかもしれません。

まだ参加されてない方は、事前に登録しておくと良いですね。
というわけで次回のイベントでお会いしましょう。

他の参加者のブログ記事

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

2012年5月30日水曜日

8時間耐久でPHPUnitについて勉強してきたよ

というわけで @mon_sat です!

PHPUnitについてのセッションということで気合い充分で参加してきました。
この8時間耐久シリーズはノマドのなかのノマドであり、安藤の中の安藤である@yandoさんが、無償で行っているセミナー(?)です。
コワーキングスペースのなかのコワーキングスペースである下北沢オープンソースカフェにて、午前中から夕方まで、みっちりPHPUnitについて学んできました。

PHPUnit使ってますか?
普段テストを書いていないとは言えませんが、胸を張って言えるレベルではないわたし。
独習でやってきていると基礎体力の点で充分とは言えないもの。今回はみっちりと筋トレしてこようと思い参加した次第。


午前中はPHPUnitのインストールが中心。
しかしそこはサービス精神旺盛の@yandoさん、普通にインストールするだけではありません。
PyrusというPEARの環境を整えるソフトの説明とそれを利用するメリットも教えてくれます。

わたしが理解したところによると、PEARでいろいろinstallしようとすると、全ユーザーに影響する形でインストールされてしまうという問題があるそうです。
自分の環境のみで特定のバージョンのPEARを使用したいといった場合など、普通にPEARを使用すると生じる問題を解決してくれるナイスなツールですね。

午後からいよいよ本格的にテストについてのお話。
まず簡単なclassのファイルを見て、それに対しテストを書いていきます。

基本的なPHPUnitによるテストの書き方は

という具合。
これでSmapleクラスのanyMethod()メソッドが実行され、期待する値(ここでは'正しい値')と比較されます。
assartEquals()というアサーションは == を用いた比較をおこない、同値であればめでたくpassedとなります。
実行は、コマンドラインから次のように行います。
$ phpunit tests/Sample.php
ちなみにこうすると、結果が緑(赤)のバーで表示され見やすくなります。
$ phpunit --colors tests/Sample.php
テストに失敗した場合は、失敗したというメッセージとともに「最後の引数で与えたコメント」が表示されます。
複数のテストを書く場合に分かりやすくなりますね。

その後さまざまなアサーションの種類を教えてもらいました。バージョンアップのたびに増殖中とのこと。
$this->assertCount()とか。

また setUp() と tearDown() を利用して、共通処理の説明も。
上記のサンプルであれば。

という具合。これでテストメソッドがtestOther(), testAnother()のように増えていってもそれぞれのメソッド内でいちいちインスタンスを生成するという重複が避けられます。DRYですね。

ちなみにtearDown()の 'tear' は、涙の「ティア」ではなく、破るという意味の「テア」だそうです。
tear down で「建物等を取り壊す」という意味になるそう。
いやあ勉強になります。こんなこと自分で勉強してたら絶対に分からないですからね。
(この後、休憩中にmacのsayコマンドでいろいろ発音させて遊びました)

その後聞いたことも無い機能を次々と教えてもらいました。

まずはアノテーション。
テストメソッドの前に、指定された内容を書くことで、テストの実行を制限したり、特殊なテストを実行できるようになるとのこと。

他にもこんなアノテーションも。かなりDRYに記述できますね。(テストについてはDRYすぎるのも善し悪しだと思いますが、こういうのであれば何をテストしているかも分かりやすく活用したいところです)


PHPUnitの @dataProvider アノテーションを使用することで配列内のデータでテストを反復して実行可能

@mon_sat@mon_sat
テストの書き方(@は半角)
合計4回のテストが実行される

<?php
class DataTest extends PHPUnit_Framework_TestCase
{
/**
* @dataProvider provider
*/
public function testAdd($a, $b, $c)
{
$this->assertEquals($c, $a + $b);
}

public function provider()
{
return array(
array(0, 0, 0),
array(0, 1, 1),
array(1, 0, 1),
array(1, 1, 3)
);
}
}

#phpunit


続いて、PHPUnitが行う気の利いた機能。
なんとPHPUnitではテスト実行前にスーパーグローバル変数を退避させ、テスト実行後に書き戻してくれるのです!
テストケース内で書き換えても影響は無いんだそう。毎度setUp()とtearDown()で $this->_session = $_SESSION; して $_SESSION = $this->_session; する必要はまったくないんだって。驚愕です。

で、ふと気になって、CakePHPのConfigure::read()できる設定はどうなんだろうと、CakePHPのソースを見てみると!




案の定、同じように処理をしていました。
これは便利すぎますね。


この会では、実際に手を動かして何も無いところからテストを書いていったり、逆にテストが与えられclassを作っていくというプチテスト駆動開発を体験できたりと、非常に盛りだくさんの内容でした。

というわけでまた血になり肉になったようです。
@yando さんどうもありがとうございました!
このエントリーをはてなブックマークに追加

2012年4月26日木曜日

第2回Webデザイナー向けCakePHP勉強会とワークショップ #3

今回の勉強会では、CakePHPの使用が初めてという方も何人かいたため、ワークショップを開催しました。

講師は、WebデザイナーのためのCakePHPビューコーディング入門 の著者の滝下 真玄さん、原 一浩さんのおふたり。

今回のポイントは、何といってもインストールから指導しCakePHPの簡単なアプリを作るところまでフォローしたという点。

なにごとも始めの一歩が一番躊躇します。
右も左も分からないまま、とりあえず試そうと思っても、インストールでつまずいてしまい、本質のところまで到達せずに終了というのは良くあることです。

CakePHPはRuby on Rails と違い、その名の通りPHP製ですから、インストールも簡単です。
とはいえそれすらままならないユーザーのために、今回はインストール指導のコースも用意しました。


そしてインストール後はいっきにアプリの作成へ。
今回は本ではフォローされていない、カラムの追加といった実践的な内容も学べたようです。
本に書かれた内容だけでは物足りないという方でも満足できる内容ですね。

今回使用したテキストは、もちろんこちら。



好評なだけに、事前購入者が多かったです。

ワークショップの雰囲気を知りたい方は、PoRTAL Shibuyaのfacebookページの写真をご覧ください。

今後も定期的に開催していこうと思います。
このエントリーをはてなブックマークに追加

2012年4月24日火曜日

第2回Webデザイナー向けCakePHP勉強会とワークショップ #2

昨日途中になった勉強会とワークショップのお話です。

今回も勉強会後は恒例の懇親会を行いました。
会場を提供していただいた PoRTAL 渋谷 さんより20時以降であればということで勉強会会場でのビアバッシュを許可していただきました。

勉強会の模様と懇親会の模様はPoRTALさんのfacebookページで見られます。

わたしが主催する勉強会では、基本的に懇親会を行うようにしています。

理由のひとつは、勉強会は単に勉強する場ではないということです。
勉強がしたいのであれば、ひとりで図書館や喫茶店でも可能です。
勉強会というスタイルは、有志によるスピーカーがいて、そして、そこに集まる参加者がいて成り立つもの。

最近では勉強会をUstream等で配信することが多いですが、それらを見てもかなわないことが、参加者やスタッフとの交流です。

わたしが過去参加してきた勉強会では多くのケースで交流する場を設けていました。
この交流こそ、勉強会に参加する、ひとつの意義だと思うのです。

そして可能であれば、懇親会会場は勉強会会場と同一が望ましいですよね。
立派なお店を予約して行うのも良いのですが、会場をささっと片付け、缶ビールとピザなどで手作りに実施するのも良いのです。

なかなかそういう会場をご提供いただく機会は多くありませんので、今回は大変助かりました。

おかげで和気あいあいとした雰囲気で和やかに交流することができました。
勉強会中は参加者の方々に気を配ることが難しいことが多いので、懇親会でようやく参加者の方々の顔を見られることもしばしば。

今回は普段良く利用するセミナー形式の会場ではなく、アトリエのような場所で、より交流しやすかったと思います。
こういう場所で仕事をしてみたいという方は、今ならキャンペーン料金で申し込めるそうですので、ぜひどうぞ。

あら、ワークショップについては、また明日にでも。それでは。
このエントリーをはてなブックマークに追加

2012年4月23日月曜日

第2回Webデザイナー向けCakePHP勉強会とワークショップ

土曜日の勉強会の余韻の残る @mon_sat です。

4月21日(土)に第2回Webデザイナー向けCakePHP勉強会を開催しました。
昨年7月の第1回から随分と間が空いてしまいましたが、本当はずっとやりたかったんです。

もともとこの勉強会はふたつの狙いがあります。
ひとつは、CakePHPに興味がある方に対しCakePHPを知ってもらって、もっとたくさんのひとに使ってもらいたいというもの。
もうひとつはプログラマーとデザイナーが一緒に(CakePHPで)Webアプリを作成するときに、デザイナーさんがCakePHPについて知ることで、より良いものが作りやすくなるだろうと、その橋渡しをするというもの。

後者はたとえば、デザイナーさんが作成したHTMLをCakePHPのビューに変換した後、クライアントからデザインの修正依頼がはいったとき、元のHTMLではなくCakePHPのビューを編集できたら全体の仕事量は減るでしょう。
同じHTMLの修正にも関わらず全体として2重の作業が発生してしまうと、本来するべき他の作業に影響がでないとも限りません。

反対にデザインのベストプラクティスが分かればCakePHPに取り込むこともできるかもしれません。

デザイナー/プログラマーというのは関係なく、CakePHPに興味のある誰しもがCakePHPのコミュニティの一員でありコミュニティを支えていると思うのです。

このコミュニティこそがCakePHPの強みのひとつであり、興味のある方が気軽に参加できるイベントになれば良いなと思っています。
もし勉強会自体に不慣れな方がいても、そういう人にも参加してもらいたいですし。


今回は勉強会の初っ端に「座談会」ということで「これからCakePHPを利用して何かを作りたい」というかたを交え、CakePHPについての疑問を解決するという試みを行いました。
CakePHPに限らずフレームワークは、まずその思想に惚れ込むというのが効率的に学習していく秘訣です。
今回はあまりご紹介できませんでしたが、Ruby on RailsやCakePHPの思想を意識することは学習の手助けになることでしょう。
(以前紹介した、37signalsのGetting Realも同様に読んでおくと良いですね)


セッションの方はあまり準備期間の無いままに行ってしまって反省点の多いところです。
とはいえその限られた時間で用意したとは思えない素晴らしい出来でしたので、ぜひご参加されなかった方も見てください。


第2回Webデザイナー向けCakePHP勉強会(ビューの基本) | ZENPRE(ゼンプレ)
No Helper No Life | ZENPRE(ゼンプレ)
第2回Webデザイナー向けCakePHP勉強会(テーマ機能) | ZENPRE(ゼンプレ)


懇親会とワークショップについてはまた明日書きたいと思います。

よろしければ次回もやりたいと思いますので、ご参加ください。それでは。
このエントリーをはてなブックマークに追加

2011年10月6日木曜日

むしろ、PHP祭りには「行ってはいけない」

まずはこちらの写真をご覧ください。(2010年のPHP祭りにて。写真は@lllnorikolllさんより拝借)
CakePHP、Symfony2、Lithiumの各コアデベロッパーがにこやかに並んでいるように見えます。
が、実は全員無表情な写真を「高度な写真加工技術」で修正しています。
実際に拡大すると修正された箇所が確認できることでしょう。





というわけで、タイトルは釣りです。本当にありがとうございました。





こんにちは。
@sio_19851001 さんからバトンが来ました @mon_sat です。
昨年PCも持たずにハッカソンに参加した @sio_19851001 さんの記事(PHPMatsuriは、怖いところじゃないんだよ。)を読むと、確かに怖いものは無くなります(笑)

phpmatsuri2011バナー




「以前は勉強会すら参加してなかった私」が、個人的にこのイベントでどんなふうに変わったかを、書いていきたいと思います。
(なお正式表記はおそらく phpmatsuri ですが、ここでは「PHP祭り」と表記します)


リレーブログを読んでみると、PHP祭りで行われることが「去年以上に」盛りだくさんだと気づきます。
よしおかひろたか氏の基調講演、各セッション(増井雄一郎さんによる Titanium Mobile 、Graham Weldon による CakePHP 2.0 、Fabien Potencier による Symfony2 、Garrett Woodworth  による Lithium )および、ニフティクラウドを始めとした各スポンサーのセッション、テストワークショップ、夜に開催されるという「謎の」闇PHPMatsuri(って何??)、そして各所で開かれるワークショップ諸々。

そのうえで、メインはもちろんハッカソンですから、次の日の発表会(LT大会)があるのです。


えーーっと。あれ?却って、お腹いっぱい???


考えてみれば去年も同じくらい内容が濃かった訳です。
しかし参加してみたら「すごく楽しかった。明日も明後日も続いたら良いのに」と、思ったことを覚えています。

tweetを拾ってきました。

こんなにエキサイティングな2日間は久しぶりです。お会いした方々、本当にどうもありがとうございました。そしてお疲れさまでした! #phpmatsuriSun Oct 03 13:22:48 via HootSuite


「こんなに盛りだくさんでも、自分が興味があるのは、ひとつかふたつだしなあ。参加するメリットはあるのだろうか?」と思っている方はいませんか?

なぜPHP祭りは参加者 *みんな* が楽しめるお祭りなのか?
この疑問に答える前に、私の経験を少しだけ。

勉強会というものに参加したことの無かった私が、初めて参加したのが2009年に開催されたCakePHP祭り(CakeMatsuri)でした。
ワークショップとカンファレンスの(金・土)二日間の構成で、わたしはカンファレンスのみに参加し、CakePHPについていろんな情報収集をしたものです。
ワークショップの方はコミュニティのメンバーが講師やサポート役となり、実際に手を動かして勉強するタイプで、カンファレンスの方は主にコアデベロッパーの方々を海外から呼びCakePHPの新バージョン等の話を聞いたりCakePHPとは直接関係のないトピック(NoSQL等)の話を聞きました。

CakePHP以外の話も聞けたことで、カンファレンスはものすごくためになったのですが、わたしがそれ以上に印象に残っているのは「カンファレンス後の懇親会」
パーティ形式の懇親会で参加者が交流するのですが、初参加でもすぐに馴染める、和気あいあいとした雰囲気がありました。素敵なコミュニティがCakePHPの良さを象徴しているような気がします。

CakePHP自体の知識を得つつ、コミュニティの方々との交流も図れ、さらにはコアデベロッパーと「日本で」話をすることができるという。
こんな素敵なイベントに参加するチャンスは滅多に無いでしょう。


そして翌2010年。CakePHP以外にもsymfony、Lithium、CodeIgniter、Zend Framework等など。枠組みを一気に拡げ、名前がPHP祭り(PHP Matsuri)と改まりました。
さらには「ハッカソン」ということで、一気にイベントの内容がパワーアップ。
このころには勉強会にはいくつも参加していたのですが、ハッカソンについては参加する機会が無く、またまた絶好のタイミングで開催されることに。

会場が私の自宅から比較的近かったこともあり、2010年はスタッフとして当日、受付け等でお手伝いいたしました。

ひとりハッカソンして作ったアプリがCakePHP賞の2位となり、Pocket詳解 CakePHP辞典とNiftyクラウドの無料券もゲットしたり、それがきっかけでLithiumのイケメンコアデベロッパーのjoelに「プレゼンよかったよ」と言われたり。ええ。お世辞だとは思いますが、それが何か?

ハッカソンが初めてなら、勉強会のような場所でLTとはいえ発表するのも初めてでした。
にもかかわらず、こんな光栄な結果となり嬉しい限り。
今年初めて参加される方も、おそらくちゃんと準備できれば注目されます。目立てば私のように良いことあります。場合によっては参加費取り返すような商品だってありますし。

これは後に別勉強会ででてきた言葉ですが「せっかくイベントに参加するなら、目立たないともったいない」とのこと。


1年目で「こんなチャンス滅多に無いから参加しないともったいない」と知り、2年目で「どーせなら、ある程度は、目立たないともったいない」と分かりました。



でも、今思えば、もっと積極的になれば良かったと後悔しています。
初参加だから、とか、初ハッカソンだから、とか、関係ないのです。
参加している以上、有名人も初めての人も一緒。
せっかくコード書いたなら、発表しないともったいないです。
(失敗したってどーせ誰も気にしてないし、運良くはまったら商品もらえたりするしね)



一昨年のCakePHP祭りのときは、ワークショップとカンファレンス(お弁当と懇親会付き)で19,425円でした。(わたしはカンファレンスのみなので8,925円)
昨年のPHP祭りのときは、2日間のセッション等に食事宿泊付きで、22,000円でした。

そして今年のPHP祭りも22,000円です。(食事4回+宿泊込み)

イギリスで行われたCakeFestが4日間で$950(2日間のカンファレンスでも$420)ですので、それと比べたら激安な訳ですが、それ以上に、わたしは「この22,000円を払わないのはもったいない」と思っています。

わたしは、今仕事で使っているツール等の多くは、CakePHPのコミュニティを通してその良さを知り使い始めました。
CakePHPがgitで管理されるようになったと知ってはgitを使い始め、テストの書き方を知ってはテストを書き始め、英語が使えないと生きれないと聞いては英語の勉強を始めました。

そのいずれも「今では、無いとやっていけない」必需品です。
ほかにも、この一連のイベントがきっかけで知ったこと、始めたことは枚挙に暇がありません。
それらのきっかけは、すべてこのイベントからなのです。
(slywalkerさんのいう「種を拾いに行くべし」という言葉の意味は深いと思います)

さらに。
今は、コミュニティで知り合ったメンバーとプロジェクトを組む機会が増えました。
仕事の幅が、何倍にも広がったのです。

どれだけ、本業で利益を生んでいることでしょう。



仕事の幅が広がったといえば。
PHP祭りとなって面白いのは、他のフレームワークを使っている方が多く参加されるのです。普段なかなか交流できない方々と話ができ、一般的な勉強会では決して聞けなかったであろう話をたくさん聞くことができます。
(Fusicさんのブログでも「他のフレームワークは使いやすいのだろうか?」の答えが得られるメリットが書かれています)

参加者のなかで、CakePHPもsymfony2もLithiumもTitanium Mobileも全部使っている人はあまりいないでしょう。もしかしたらゼロだと思います。
では、なぜ、それでも参加するのか。
各FW使いが交流することで生まれるメリットがあるからだと思うのです。


ここに「なぜPHP祭りは参加者 *みんな* が楽しめるお祭りなのか?」の答えがあります。
積極的に交流すれば、化学反応が起き、すべての人が今より前に進めると思うのです。



参加者の一覧を見てください。
そうそうたるメンバーです。

ああ、私も参加したいなあ、、、

え?

え?

ええ、、参加未定です。そして微妙です。
4歳のムスメの運動会があるのです。土曜日に。東京で。

それが判明しても行こうと思ってました。終わってから。
でも、万が一雨が降ったら日曜日になるらしく、、、雨乞いに成功して台風が直撃しない限り行けません。


うん、みなさんは、行かなくて良いんじゃないかな?PHP祭り。
楽しくないよ、多分。いや、間違いなく。
むしろ、PHP祭りには「行ってはいけない」


つまんないと思うからお勧めしないけど、どーしても行きたい人は止めないから。
チケットは以下のページで販売中だよ。
http://2011.phpmatsuri.net/phpmatsuri/paypal
Paypalアカウントがあっても無くても買えるって。(他の方を紹介したらキャッシュバックもあるって)

まずは、↑のページで、twitterによる認証をして基本情報を書き込みましょう。


あ、最後に注意点が。
2009年のCakePHP祭り。わたしがワークショップに参加してない理由だけ。
それは、油断してたら、いつのまにか売り切れてたから。泣く泣くワークショップ諦めました。
興味のある人は面倒くさがらず、とっとと購入しておくと良いと思います。
駆け込み需要で売り切れてしまっても「後の祭り」ですから(お、上手いこと言った)


もうひとつ蛇足ながら、誤解の無いように。
冒頭の画像は、加工されたものではありません。コアデベロッパーが本当に楽しんでいるのが分かります。
(冒頭の釣り画像ではなく)ちゃんとサイズ変更した画像を置いておきますのでぜひご確認を。



というわけで??リレーブログを終了します。
今日は19時からCakePHP2.0勉強会を株式会社VOYAGE GROUPさん(株式会社ECナビより社名変更)で行います。
※ @konsan と @hiromi2424 、@cakephper さんとともに開催します(その他多くの方に協力してもらっています)

明日は、その @cakephper さんです。
(二日酔いに気をつけて)更新よろしくお願いしますー。

phpmatsuri公式サイト

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

2010年10月19日火曜日

jQuery Mobile を使ってみました

mon_sat です。
( @mon_sat is my account as a developer. )

jQuery Mobile の alpha 版がリリースされたようです。
というわけで、早速使ってみました。


まず、ソースをダウンロード・・・しません。
え???
いきなり、HTMLを書いていきましょう。
<html>
<head>
  <meta charset="utf-8">
  <title>jQuery Mobile テスト</title>
  <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.css" />
  <script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
  <script src="http://code.jquery.com/mobile/1.0a1/jquery.mobile-1.0a1.min.js"></script>
</head>
<body>
</body>
</html>

これで、準備完了です。
コードはホストされているので、リンクを貼るだけです。
あとは、bodyの中に、HTMLタグを書いていきます。
(ドキュメントがデモ 1.0α になっています)
。ドキュメント内では、divタグを使って書く例が示されていますが、せっかくなのでHTML5のタグを使用しましょう
<section data-role="page" data-theme="b" id="ds-home">
  <header data-role="header" data-theme="b"> 
    <h1>Header</h1>
  </header><!-- /header -->
  <article data-role="content">
    <div>This is a test page.</div>
    <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
      <li data-role="list-divider">Category</li>
      <li><a href="#ds-page-1">First Child</a></li>
      <li><a href="#ds-page-2">Second Child</a></li>
    </ul>
    <ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">
      <li data-role="list-divider">Category 2</li>
      <li><a href="#ds-page-3">First Child 2</a></li>
      <li><a href="#ds-page-4">Second Child 2</a></li>
    </ul>
  </article><!-- /content -->
  <header data-role="footer" data-theme="b"> 
    <h2>Footer</h2>
  </header><!-- /footer -->
</section><!-- /page -->
body内だけ記述しています。その他は不変です。
これで、スクリーンショットの左側のようになります。

なお、2行目と18行目の data-theme="b" を "a" に、7行目と12行目の data-dividertheme="b" を "a" にすると、右のスクリーンショットのようにテーマは変更できます。
テーマの種類も豊富にあるようです。


jQuery Mobile では、ひとつのHTMLに、複数のページを記述します。
上記の例では、sectionタグの分だけ、ページを作ることになります。
id="ds-home"という任意のidを与えたsection(div等)のタグに、 data-role="page" とすることで、jQuery Mobile がページとして認識します。

ページ内のリンクは、 <a href="#foo">foo</a> とします。
この場合、 <section data-role="page" id="foo"></section>が存在すれば、リンクをタップ(クリック)することで、そのページへ遷移します。

ページの遷移はすべてajaxで行われ、ページが存在しなければ、そのようなメッセージが表示されます。(右図)

また、 <a href="bar.html">bar</a> というリンクも可能で、この場合は外部ファイルから section が読み込まれます。(data-role="page"となっているsectionやdivが読み込まれます)
なおこの場合は、bar.html内に複数のページ要素がある場合、最後の物が読み込まれるようです。
いろいろ試したのですが、外部ページの指定のIDというようには行きませんでした。


なお、遷移についてはその履歴をjQuery Mobileが記録しています。
それに応じて、自動的に、左上に「back」というリンク(ボタン)が作られます。
(動きとしては history.back のような動きとなります)

<a href="foo.html" rel="external">foo</a> のように記述すると、ページはajaxではなく、1から読み込まれます。
そのため、履歴も無くなり、左上のリンクも表示されません。
(ほかにもtargetが指定されていると同様の扱いのようです)


とりあえず、今日はここまでです。

via jQuery Mobile
このエントリーをはてなブックマークに追加

2010年9月4日土曜日

[Teck] App Store にiOS(iPhone)アプリを申請する

ども、mon_sat です。
iOSアプリをApp Store に申請したのですが、ちょっとだけ手こずったので、メモがてら。

まず、iTunes Connectを表示します。
下段右側の Manage Your Applications をクリックします。

Add New Application より、まず、App Information を入力します。
SKU Number は、任意の英数字のようです。
Bundle ID は、Provisioning Portal にて、Profile を作成するときに使ったものを入力します。
ワイルドカードの場合、suffixを指定することになりますので、任意の文字列を指定し、Bundle IDが確定します。(これは後ほど使用します)

次の画面で。
言語は、今回はEnglish(+Japanese)なので、English を選択します。
以降はよく分からないままとりあえず入力してみました。

アプリが暗号化されているかいないかはNoで。(今回の場合)
Overview も適宜入力します。

アイコンのLargeは、iTunes Store で表示されるもののようですので、512px四方で用意してアップロード。
スクリーンショットは、iPhone-Simulator Cropperというアプリで撮ると便利です。

アップロードは、Application Loader というソフトを使用します。

でもその前に。
申請が初めての場合は、申請用のProvisioning Profile を作成します。
iPhone Provisioning Portal の Certificates 内の Distribution タブをクリックします。
以前作成した、CertificateSigningRequest.certSigningRequest にて、Request します。
しばらくして、Download可能になったら、ダウンロードしインストールします。

Provisioning より Distribution タブを選択し Distribution Provisioning Profile を作成します。
App Store を選択し、任意のProfile Nameを付け、以前と同様の(ワイルドカード指定の)App ID を選択します。

しばらくして、Download可能になったら、ダウンロードしインストールします。

その後、Xcode上のプロジェクト設定の編集にて、構成タブ内のReleaseをコピーしDistributionと名称変更します。
ビルドタブで構成をDistributionにし、コード署名IDにあるAny iPhone OS Device の項目で、企業名のついたプロビジョニングを選択します。
(弊社の場合、iPhone Distribution: Direct Search Japan Inc. となりました)

info.plist内の Bundle identifier を、iTunes Connect で設定した Bundle ID に変更します。

ビルドする前にDevice/Simulatorを選択するところで、アクティブな構成をDistributionにし、ビルドメニューのビルドをクリックします。

このとき、ビルド結果で「警告」が出ている場合は、上記までの設定で何らかのミスがあります。
(わたしは結局Certificateから作り直しましたorz)

あと、対応するOSも間違えると、Application Loader で指摘され、何度も作り直しさせられますので、ご注意ください。
(このとき下記ディレクトリ内のファイルをすべて削除する必要があるようです)

ビルドしたファイルは、build/Distribution-iphoneos内に作成されます。
ファイルが日本語になっていたので、念のため英語(名)に変更し、右クリック(controll+click)から圧縮を行ないます。

/Developer/Applications/Utilities/Application\ Loader.app を起動します。
アプリケーションを選び、アップロードに成功すると、iTunes Connect 内が、Waiting For Review となって一旦終了です。

お疲れ様でしたー!
このエントリーをはてなブックマークに追加

2010年8月12日木曜日

[Teck] iPhone Developer Program に法人名義で登録する #4

mon_sat です。
4回目になります、iPhone Developer Program に法人名義で登録するお話です。
今回は、実際に実機にアプリを転送するところを説明するので、以後アプリを作成するごとに行なう作業が中心です。

(過去3回のリンク: #1 #2 #3)

Xcodeを起動し、プロジェクトを開きます。
概要というプルダウンを開き、Device を選択し、開発機で実行されるようにします。

左ペイン「グループとファイル」より、「ターゲット」でプロジェクト名をクリックすると、概要が表示されます。

プロパティタブの識別子を「jp.direct-search.${PRODUCT_NAME.....}」のようにします。
ビルドタブの「Code Signing」「コード署名ID」「Any iPhone OS Device」で、iPhone Developer: TANAKA Kohji (xxxxx) のようなものを選択します。

ウインドウを閉じ、いつものように、ビルドと実行でビルドします。
初回のみパスワードを要求されるので入力し、「常に許可」を選択。

うまくいけば、開発機にアプリが転送され起動します。
インストール後は、USBを抜いて構いません。


なお、シミュレーターで動いて開発機で動かないという場合は、コンソールでエラーが出ているはずなので確認しましょう。

では、Let's Touch !
このエントリーをはてなブックマークに追加

2010年8月11日水曜日

[Teck] iPhone Developer Program に法人名義で登録する #3

mon_sat です。
前々回、前回に引き続き、iPhone Developer Program に法人名義で登録するお話です。

まず、証明書を作成します。

Macのアプリケーションからユーティリティ内にあるキーチェーンアクセス.appを起動します。
「証明書アシスタント」より「認証局に証明書を要求」を選び、登録したメールアドレスと英語表記の法人名を入力します。
「ディスクに保存」と「鍵ペア情報を指定」をチェックし進み、任意の保存場所を指定します。
(ファイルが保存されます)

iPhone Dev Center の右上のリンクより、iPhone Provisioning Portal へ入り、Certificates を開きます。
保存したファイルをアップロードし申請します。

Certificate Request Requires Your Approval と書かれたメールが届くので、Certificates のページでApprove し、Downloadします。
ダウンロードしたファイルをダブルクリックすると、キーチェーンアクセスにインストールされます。


つぎは、開発機(iPhone/iPod touch)を登録。
Xcodeを起動し、開発機を繋ぎます。
「ウインドウ」の「オーガナイザ」を開き、DEVICESの開発機の名称をクリックします。
40桁のIdentifier をコピーし、iPhone Provisioning Portal のDevices よりAdd Devices します。


続いて、App ID を作成。
iPhone Provisioning Portal のApp IDs より、New App ID をクリックします。
任意のDescriptionを設定し、Bundle Identifier には、 jp.direct-search.* のようにワイルドカードで指定します。

Provisioning よりNew profile を選択します。
任意のProfile Name を設定し、Certificatesで証明書をチェック、App IDで作成したApp ID を選択、Devices で開発機をチェックします。

ほどなくして、Provisioning のActions にDownload リンクより、ダウンロードが可能になります。
ダウンロードしたファイルをダブルクリックします。


と、ここまででようやく、実機にアプリを転送するための準備が整いました。
いよいよ次回は実機へ転送します。
このエントリーをはてなブックマークに追加

2010年8月10日火曜日

[Teck] iPhone Developer Program に法人名義で登録する #2

mon_sat です。
前回の続き、になります。

翌日、iPhone Developer Program - Enrollment #XXXXXXXX という件名のメールが送られてきました。
Please fax the official Certificate of the Corporation from Company/Business Register of identity for your business based on your company form. The fax number for submission of this information is 408-974-1053.
PLEASE INCLUDE YOUR MAIN COMPANY CORPORATE TELEPHONE NUMBER WITH YOUR FAXED DOCUMENTS.
When faxing this information to Apple, please refer to your Enrollment ID number XXXXXXXX that was provided to you upon submission.
1段落目で、408-974-1053にFAXしてねと言われています。
2段落目で、FAXするときは、『会社の電話番号』を入れてくれと言われています。
3段落目で、Enrollment ID 番号の XXXXXXXX を書類のなかに入れてね、と言われています。

何をファックスするのか分からなかったので、一旦アップルに電話したところ、「登記簿謄本のコピー」か「印鑑証明書のコピー」と言われました。会社名と住所の分かるもののようです。

書類の有効期限はないため、記載内容に変化がなければ、設立時に取得したものを使っても構いません。
わたしの場合、印鑑証明書だけ1枚残っていたので、スキャナで読み込み、上記の注意を守りながら送付状を作ります。

このとき、記載の電話番号へアップルから電話があるため、(どこからかかってくるのか知りませんが)一応国番号付きで記述。 +81-3-6426-2191のように

FAX時に、アメリカの国番号を指定するのを忘れないようにしなくてはなりません。(+1-408-974-1053 だったかな?)

念のため送付書類をPDF化し、PC上のFAXのUIを操作して送信しました。

そして5日後。
「Information Received Regarding Your Enrollment」という件名のメールが届き、このあと、代表者に申請内容に間違いがないか確認する電話が来るようです。
ですが、実は、申請した英語表記の間違いがあり、何度かメールや電話でやりとりがあったりしまして、、、その件でいろいろとAppleの方と話をしていたので、このステップはおそらく省略されました。

ほどなくして。
Apple Developer Program Enrollment Update という件名のHTMLメールが届き、そのなかで、 「Program License Agreement というのに同意してね」と書かれているので、リンク先より指示に従います。

その後、購入(カードによる支払)のステップになります。
ここは通常のECサイトの要領で購入手続きを行なうと、ついに↓のメールが!
「Apple Store ご注文内容の確認 (Your Apple Store Order)」

しかし。
これは単なる注文内容の確認メールのようなもの。
翌日届く、↓が待ち望んでいたやつ。
「Thank You for Joining an Apple Developer Program」
確かにサンキューフォージョイニングって書いてあります!

指示に従いログインすると、待ちに待った iPhone Developer Portal に入れます。


このあと、実機テストするために必要な証明書作ったり、いろいろ残っているので、それはまた次回。
ということで、では。
このエントリーをはてなブックマークに追加

2010年8月9日月曜日

[Teck] iPhone Developer Program に法人名義で登録する #1

mon_sat です。
株式会社ダイレクトサーチジャパンが、iPhone Developer Program に登録して約1ヶ月が過ぎました。
iPhone Developer Program は、ご存知の通り、iOS(iPhone/iPad)アプリケーションをApple Store で販売するために行う開発者登録のことですが、これをしないと、製作したアプリケーションを実機でテストすることもできません。

今回から数回にわたり、法人名義でiPhone Developer Program に登録するための手順を記したいと思います。

その前に、法人名義で登録することのメリットを。
これは、先日出席した勉強会で知ったことなのですが、個人ではなく法人名義で登録した場合、ひとつの登録で複数の開発者が利用することができ、その数に制限は(今のところ)なさそうだということです。
つまり、企業名でアプリケーションを製作するのであれば、登録費用の負担が一人分ですむ、法人名義による登録のほうがメリットが大きいのです。

というわけで、現在開発者はわたしひとりではありますが、法人名義による登録にチャレンジしました。

登録手続きを進めていく中で、登記簿謄本か印鑑証明書のどちらかが必要になります。
内容に変更がなければどんなに古くても良いのですが、もし手元にないということであれば、今のうちに請求しておくと良いでしょう。

ではいよいよ登録です。
まずは、Apple ID の作成です。
すでにIDを所有している方も、開発用に新たに取得することをお勧めします。
とくに漢字を氏名に使用しているであろう日本人の場合、英字のみの氏名で登録する必要があり、後々「別の名義で登録しなおしてね」と言われる前に、素直に作成すると吉です。

の Enroll Now をクリックしてください。

つづいて手順説明のページが表示されますので、 continue をクリックして次に進みます。

Are you new or a registered Apple developer?
というページで、New Apple Developer の下にある I need to create a new account for an Apple Developer Program. のラジオボタンをチェックし、 continue をクリックします。
(ここではあなたが過去にMacOS等のDeveloper として登録されていないことを想定しています)

Are you Enrolling as an Individual or Company?
というページで、「個人ですか?法人ですか?」と聞かれるので、Company をクリックして次へ進みましょう。

その後、Complete your personal profile 等々、入力フォームが現れますので、順次入力していきましょう。
そのとき名前をすべてアルファベットで入力することを忘れないようにしてください。
また、メールアドレスは別IDで使用しているものとは分けなくてはなりません。

もしGmailやGoogle Apps によるメールを使用しているのであれば、mon+apple@example.com のように、+をつけて別名にしておくと良いでしょう。

登録が終わると、お決まりの確認メールが届きますので、メールに記載の(おそらく数字の書かれた)リンクをクリックして確認終了です。

その後、You are now registered as an Apple Developer というメールで続きを促されますので、指定した通りに進めますと、Thank You for Submitting Your Enrollment というメールを受信し、一旦作業が終了します。

ここで企業名について注意点を。
弊社のように英語表記の企業名を登記していない場合、日本語の会社名を英語にする必要があります。
当初、サーバー証明書発行申請等で使用していた Direct Search Jp Inc. という表記で申し込んだのですが、後日「それじゃ駄目よ」と言われました。
Direct Search Japan Inc. に修正して登録することに。修正自体はメールで済んだのですが、ちょっとだけやりとりが発生してしまいました。


というわけで続きは次回。
このエントリーをはてなブックマークに追加

Facebookへの「いいね!」ありがとうございます