パズドラを20年続ける秘訣が見えた?! ダウンタウンDXの西田Pに学ぶ。負けない企画をたてる7つの方法


西田プロデューサー(西田P)「人がやらないことは、当たる確率が高い。
しかし、やれないことではなく、誰でもやれたことを丁寧に、
特別のテクニックをもって実現すれば、市場にインパクトを与えることができ、
追随を許さない負けない環境が誕生する。
負けなければ『継続』していく。」

GeNERACEでプロデューサーをしている村山です。
いつもはエンジニア系の記事をアップしているGeNERACE laboですが、
今週はSamurai Startup Islandさんのイベントに参加してとても内容に刺激を受けたので、
企画系のブログを書きます。

ダウンタウンDXは誰でも一度は見た事ある番組だと思います。
なんと20年も継続している長寿番組です。

最近ではパズドラがゲームの長寿としてありますが、それでもまだ2年目です。
競合の多いゴールデン番組のなか、20年も戦い続け、勝ち続けている番組。
それが「ダウンタウンDX」です。

今回のイベントは、起業家向けに、ダウンタウンDXの西田Pが
企画のたてかたを講演するものでした。

読売テレビ編成局・東京制作センター東京制作部所属
チーフプロデューサー・演出家
西田 二郎 氏 @jironishida

そのなかでも、業務で企画職のかたや、企画をたてる必要がある人のために、内容を抜粋し、「負けない企画をたてる7つの方法」としてまとめてお伝えしたいと思います。(西田Pの話を軸に、私の主観が入っています。

Continue reading

デザイナーの為のSass/Compassのすゝめ

三月とはいえすっかりもう桜が咲き、杉花粉で目と鼻を塞がれ
これで耳と口も塞がったらさながら『ライ麦畑でつかまえて』の主人公だななどと思っています。ゆーじろーです。

今回はSass/CompassについてのHowtoを書かせていただきます。

SASS
compass

Continue reading

CakePHPでMongoDBを使う基本

こんにちは、ピンキリエンジニアのひろゆきです。

最近は久しぶりにPHPを書いており、MongoDBも始めてみたので、CakePHPとMongoDBについて少し書いてみたいと思います。

今回はちょこっと触った程度の、CakePHPからMongoDBを使用するための内容になります。

※CakePHPは1.xの時に少し使った、MongoDBはほぼ初心者な状態です

今回使用した環境は

・AmazonEC2のRedhat
・PHP 5.3.3
・Apache 2.2.15
・MongoDB 2.2.3
・CakePHP 2.3

になってます。

これでCakePHPからMongoDBを操作してみたいと思います。

まずはMongoDBをインストールします。

リポジトリの追加

sudo vi /etc/yum.repos.d/10gen.repo

リポジトリ設定

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=0

インストール

sudo yum install mongo-10gen-server.x86_64 mongo-10gen.x86_64 --enablerepo=10gen

起動

sudo /etc/init.d/mongod start

これでMongoDBの準備はOKです。

次はこれをCakePHPから操作します。

CakePHPではデフォルトでいくつかのDBを使用でき、簡単にWEBサイトを構築出来ますが、
MongoDBについてはichikawayさんが提供しているPluginを使用することで可能になります。

https://github.com/ichikaway/cakephp-mongodb
※githubから

cloneするかもしくは別の方法で

app/Plugin/MongoDB

に配置します。

次にdatabase.phpを変更してMongoDBへの接続を定義します。

public $default = array(
	'datasource' => 'Mongodb.MongodbSource',
	'host' => 'localhost',
	'database' => 'your_database_name',
	'port' => '27017',
	'encoding' => 'utf8',
);

では、実際に操作をしてみます。

データを登録する

$data = array();
$data['value1'] = 1;
$data['value2'] = array(1,2,3);
$data['value3'] = array('a' => 1, 'b' => 2, 'c' =>3);
$data['value4'] = array('a' => array(1,2,3), 'b' => array(4,5,6));
$this->Sample->save($data);

発行されたクエリ

db.samples.insert( {"value1":1,"value2":[1,2,3],"value3":{"a":1,"b":2,"c":3},"value4":{"a":[1,2,3],"b":[4,5,6]},"modified":"MongoDate(0.39200000 1363326797)","created":"MongoDate(0.39200000 1363326797)","_id":ObjectId ("5142b74d2dc6b69371000002")} , true)

登録された内容

{ "_id" : ObjectId("5142b74d2dc6b69371000002"),
  "value1" : 1, 
  "value2" : [ 1, 2, 3 ], 
  "value3" : { "a" : 1, "b" : 2, "c" : 3 }, 
  "value4" : { "a" : [ 1, 2, 3 ], "b" : [ 4, 5, 6 ] }, 
  "modified" : ISODate("2013-03-15T05:17:21.393Z"), 
  "created" : ISODate("2013-03-15T05:17:21.393Z") }

データを取得する

$this->Sample->find('all');

発行されたクエリ

db.samples.find( [], [] ).sort( [] ).limit( 0 ).skip( 0 )

取得した内容

array(1) { 
 [0]=> array(1) {
  ["Sample"]=> array(7) { 
   ["value1"]=> int(1) 
   ["value2"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
   ["value3"]=> array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) } 
   ["value4"]=> array(2) { ["a"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["b"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } } 
   ["modified"]=> object(MongoDate)#38 (2) { ["sec"]=> int(1363325551) ["usec"]=> int(106000) } 
   ["created"]=> object(MongoDate)#39 (2) { ["sec"]=> int(1363325551) ["usec"]=> int(106000) } 
   ["id"]=> string(24) "5142b74d2dc6b69371000002"
  }
 }
}

データが作成されました。

今回はidを指定せず自動で生成しています。

データを更新する

$list = $this->Sample->find('all');
$data = $list[0]['Sample'];
$data['value1'] = 100;
$data['value5'] = 'Hello World';
$this->Sample->save($data);

発行されたクエリ

db.samples.update( {"_id":ObjectId ("5142b74d2dc6b69371000002")}, {"$set":{"value1":100,"value2":[1,2,3],"value3":{"a":1,"b":2,"c":3},"value4":{"a":[1,2,3],"b":[4,5,6]},"modified":"MongoDate(0.39200000 1363326797)","created":"MongoDate(0.39200000 1363326797)","value5":"Hello World"}}, {"multiple":false} )

変更後の内容

array(1) {
 [0]=> array(1) {
  ["Sample"]=> array(8) {
   ["created"]=> object(MongoDate)#38 (2) { ["sec"]=> int(1363326797) ["usec"]=> int(392000) } 
   ["modified"]=> object(MongoDate)#39 (2) { ["sec"]=> int(1363326797) ["usec"]=> int(392000) } 
   ["value1"]=> int(100) 
   ["value2"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
   ["value3"]=> array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) } 
   ["value4"]=> array(2) { ["a"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["b"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } } 
   ["value5"]=> string(11) "Hello World" 
   ["id"]=> string(24) "5142b74d2dc6b69371000002" } } }

CakePHPを使用しているので、同idがデータに存在する場合は更新にしてくれます。
新しく追加したカラム「value5」もちゃんと反映されています。

データを削除する

$list = $this->Sample->find('all');
$data = $list[0]['Sample'];
$this->Sample->delete($data['id']);

発行されたクエリ

db.samples.remove( {"_id":ObjectId ("5142b74d2dc6b69371000002")} )

指定されたidのデータが削除されました。

上記でCRUDについての操作が行えました。

Pluginのおかげで、これくらいであればサクッと簡単にできちゃいます。

まだまだ基本的な部分を触りながら確認している状況ですので、もう少し慣れたら詳しくメモも含めてログを残したいと思ってます。

MongoDBならではの操作方法についてとか書いておくと良いかなー、と。

以上、ありがとうございました!!

githubとAndroidとJenkinsの素敵な関係

head
こんにちは、GeNERACE CTO村松です。

GeNERACEではAndroidアプリ開発の継続的インテグレーションと企画側とのシームレスな連携の為にJenkinsを導入しています。
今回はその導入についてまとめます。
前提条件はJenkinsを導入するサーバに

  • Java 1.6がインストールされていること(Androidのビルドの関係で1.7はおすすめしない)
  • apacheがインストールされて起動していること
  • gitがインストールされていること
  • antがインストールされていること
  • androidのkeystoreが作成済みでリポジトリにコミットされていること

とします。

AndroidSDKを導入する

まず、Jenkinsを導入するサーバ上にlinux用のAndroidSDKを導入します。

$ sudo cd /var/lib/
$ sudo wget http://dl.google.com/android/android-sdk_r13-linux_x86.tgz #SDK取得
$ sudo tar zxvf android-sdk_r13-linux_x86.tgz
$ sudo mv android-sdk_r13-linux_x86 android-sdk-linux
$ sudo export PATH=$PATH:/var/lib/android-sdk-linux/tools/
$ sudo android update sdk -u #sdkアップデート

これでSDKの導入は完了。

Jenkinsを導入する

$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo yum install jenkins
#jenkinsがアクセスするディレクトリにアクセス権を割り振る
$ sudo chown -Rf jenkins /var/lib/jenkins/
$ sudo chgrp -Rf jenkins /var/lib/jenkins/
$ sudo chown -Rf jenkins /var/lib/android-sdk-linux
$ sudo chgrp -Rf jenkins /var/lib/android-sdk-linux
$ sudo service jenkins start #jenkins起動

通常はユーザー周りの設定を行ったり、セキュリティ周りの設定を行うのですが、今回は省略。

JenkinsにJenkins GIT pluginを入れる

Jenkinsを起動したら http://jenkins_hostname:8080/ にアクセス。
Jenkinsの管理>プラグインの管理>利用可能から”Jenkins GIT plugin”をインストールします。
これは、Jenkinsにデフォルトでインストールされている、”Git Client Plugin”とは別のgithubと連携する為のpluginです。

githubのリポジトリにhookの設定を行う

先ほどのJenkins GIT pluginとの連携設定をgithub上で行います。
これは、githubのリポジトリとjenkinsのジョブを繋ぐ為の設定です。
https://github.com/account_name/repository_name/settings/hooks/にアクセス。
Jenkins (Git plugin)という項目があるのでクリックし、Jenkins Urlという入力項目に以下のURLを入力します。

http://jenkins_hostname:8080/git/notifyCommit?url=git@github.com:account_name/repository_name.git

Activeにチェックを入れ、Update settingsをクリック。
以上でgithubのリポジトリとjenkinsのプロジェクトを繋ぐ設定がされます。
これで、このリポジトリに対してのプッシュやマージがあった場合、設定したURLをgithub側からキックしてくれます。

Jenkinsにプロジェクトの設定を行う

http://jenkins_hostname:8080/ にアクセス。
画像を参考にJenkinsにジョブを追加します。
Selection_003

  1. 新規ジョブ作成をクリック
  2. フリースタイル・プロジェクトのビルドを選択
  3. ジョブ名を入力
  4. OKをクリック。

画像を参考にJenkinsのジョブ設定を行います。
Selection_007

  1. ソースコード管理システム>>Git>>Repository URLに先ほどhookの設定を行ったリポジトリを入力。Branches to build>>Brannch Specifierにブランチ名を入力
  2. ビルドトリガ>>SCMをポーリングにチェック
  3. ビルド>>シェルの実行>>シェルスクリプトにビルド時に実行するshellコマンドを入力
  4. ビルド後の処理>>Email通知>>宛先に開発全体に飛ぶメールなどを設定。不安定ビルドも逐一メールを送信、ビルドを壊した個人にも別途メールを送信にチェックを入れ、保存をクリックします

項目1のリポジトリがprivateリポジトリの場合、あらかじめ以下ディレクトリにgithub認証用の鍵を置いておきます。

/var/lib/jenkins/.ssh

項目3のshellコマンドですが、GeNERACEでは以下のように設定しています。

export PATH=$PATH:/usr/apache-ant-1.8.3/bin #antのパス追加
#Android関連のパスを追加
export PATH=$PATH:/var/lib/android-sdk-linux/tools
export ANDROID_HOME=/var/lib/android-sdk-linux
export PATH=$PATH:/var/lib/android-sdk-linux/platforms
export PATH=$PATH:/var/lib/android-sdk-linux/platform-tools/
#androidアプリのプロジェクト初期設定
android update project -p /var/lib/jenkins/jobs/jenkins_job_name/workspace/
#jenkinsがgithubからcloneしたディレクトリに移動
cd /var/lib/jenkins/jobs/jenkins_job_name/workspace/
#ビルド用のantスクリプトを叩く(詳細は"アプリをAntでビルド出来るようにする"に記述)
/bin/sh build.sh
#成果物をWeb上から落とせる場所にコピーする
cp -rf ./bin/appname.apk /www/jenkins/appname.apk

アプリをAntでビルド出来るようにする

JenkinsからAntを実行しアプリをビルドする為のシェルスクリプトを追加します。

$cd /var/lib/jenkins/jobs/jenkins_job_name/workspace/
$vi build.sh #viエディタ起動、以下の内容を入力し保存する
-----ここから-----
#!/bin/sh

#リリース用ビルドを作成する
echo "build for distribution"
ant clean
ant release

cp ./bin/AppNameActivity-release-unsigned.apk ./bin/app_name.apk

#アプリのデジタル署名を行う
echo "sign apk"
jarsigner -J-Dfile.encoding=UTF-8 -verbose -keystore ./app_name.keystore -storepass keystore_password ./bin/app_name.apk keystore_area

#アプリのデジタル署名の確認を行う
echo "verify apk"
jarsigner -J-Dfile.encoding=UTF-8 -verify -verbose ./bin/app_name.apk

#パッケージの最適化
echo "zipalign apk"
zipalign -f -v 4 ./bin/app_name.apk ./bin/appname.apk

#パッケージの最適化の確認
zipalign -c -v 4 appname.apk
-----ここまで-----
#ビルドしてみる
$sh build.sh

ビルド完了後workspace/bin以下にappname.apkが出来ていることを確認します。

動作確認

設定したリポジトリ git@github.com:account_name/repository_name.gitにpushし、http://jenkins_hostname:8080/ にアクセス。
Jenkins上でビルドが実行されることを確認します。

ビルド結果確認

Jenkins上でビルド完了後、http://jenkins_hostname/appname.apk にAndroid端末でアクセス。
Android端末にダウンロードし、インストールを行い起動出来ることを確認します。

便利ツール導入

こちらのページで紹介されているJenkins Notifier for Chromeがビルド状態が分かり非常に便利なので導入します。
この時、企画側のChromeにもインストールしておくと更に良いです。

最後に

GeNERACEではこの仕組みを導入しているので、

  1. 企画側の改善提案を開発側が受ける
  2. 開発側が開発しリポジトリにpushする
  3. 企画側がjenkinsから落とし動作確認する

という流れで非常に良い連携が出来ています。
因みに、弊社アプリ宇宙上司をJenkinsでビルドした場合、EC2のt1.microだと14分、m1.smallで3分程度でした。
宇宙上司にはライブラリとしてAndEngine,AndEnginePhysicsBox2DExtension,FluctSDK,libGoogleAnalyticsV2を導入している為14分も掛かっていますが、普通のアプリであれば、恐らくt1.microで十分だと思います。
本当はAntからJUnitで行う単体テストの部分も書きたいのですが、また次の機会に書こうと思います。

ご覧いただきありがとうございました。

LinuxのシェルコマンドでFuelPHP開発環境を構築

こんにちは。金髪エンジニアのみきあらいです。今日でGeNERACEに入って2ヶ月めになります。
今回はLinuxのシェルコマンドを使ってFuelPHPの開発環境を構築する方法について書きます。

個人で開発環境を設定するのなら一人でコマンドを叩けばいいのですが、複数人で同じことをする場合、
各人がそれぞれコマンドを叩くのはあまり効率的とは言えません。
そこで、「これさえあれば一瞬で開発環境が作れる!」というシェルスクリプトを書きました。

☆下準備

  • GitのリポジトリにFuel PHPをフォークする。
  • DNSにサブドメインを設定する。
  • Apacheが入っているLinuxサーバーを準備する。
  • PHP5.3がApacheで起動していることを確認する。
  • サーバー用のssh鍵を作成する。(Git使用時に必要)
  • configファイル、xxx_setupを書いてサーバー上に置く。(注意:本物のconfigファイルではなく、あくまで別のconfigファイルを作成するためのものなので、拡張子を.confにしないこと!)

xxx_setupの中身

<VirtualHost *:80>
        ServerName 任意の名前(例:xxx)
        DocumentRoot 任意のドキュメントパス(例:/home/xxx/www/public)
        DirectoryIndex 任意のファイル(今回はindex.phpとindex.htmlを設置)
</VirtualHost>

ServerNameに記載した名前でブラウザから参照することができます。

☆今回やりたいこと

  • 作成したconfigファイル、xxx_setupの中身をコピー。
  • コピーしたファイルをもとに”各ユーザー名.conf”を作る。
  • コピー元ファイルでユーザーごとにあわせて置換したい部分を置換。(上記の例だとサーバー名やルートパス内の”xxx”を各ユーザー名に置換)
  • Gitに置いたFuelPHPをサーバーにgit cloneする。
  • Apacheを再起動する。

シェルスクリプトを書きます。
今回は”shelltest.sh”というシェルスクリプトを作成します。

vi shelltest.sh

“shelltest.sh”の編集を行います。
まず、シェルスクリプトを/bin/shで実行させます。

#!/bin/sh

echoの後ろに変数や文字列を指定します。今回はコメントを文字列として表示します。
すでに”ユーザー名.conf”がある場合も考慮し、スーパーユーザー権限で事前に削除します。-rfをつけてエラーなしで削除します。

echo "setting for httpd"
sudo rm -rf /etc/httpd/conf.d/${USER}.conf

事前に作成したxxx_setupを、”ユーザー名.conf”としてコピーします。

sudo cp -rf /etc/httpd/conf.d/xxx_setup /etc/httpd/conf.d/${USER}.conf

コピー元のxxx_setupの中には”xxx”という文字列があり、それを各ユーザー名に変えたいので、置換するためのコマンドを書きます。

sudo sed -i "s/xxx_setup/"${USER}"/g" /etc/httpd/conf.d/${USER}.conf

変数として${USER}と書くと、そのまま${USER}という文字列として置換されてしまうので、${USER}以外をダブルクオーテーションで囲みます。

次に、confで作成したDocumentRootにFuelPHPを配置します。今回は/home/ユーザー名/www以下にFuelPHPを置きます。
/home/ユーザー名/wwwが既にあることを想定して一度エラーなしで削除し、新たにディレクトリを作り直します。

echo "delete old folder"
rm -rf /home/${USER}/www
echo "settings"
mkdir /home/${USER}/www

/home/${USER}/wwwに移動し、Gitに置いたFuelPHPをサーバーにクローンします。
git@github.com:の後ろにはGithubの各人のユーザー名を書くので、変数として$1を引き渡します。

echo "clone git@github.com:"$1"/fuel.git "
cd /home/${USER}/www/
git clone git@github.com:$1/fuel.git

今回はクローンするだけとしましたが、中央リポジトリのリモートリポジトリを作成したい場合は以下のコマンドを書きます。
(例:fuel.gitのクローン元があるGithubのユーザー名=”UserXXX”、リモートリポジトリ名=”upstream”)

git remote add upstream git@github.com:UserXXX/fuel.git

例として”dev”というブランチを作成し、devブランチに切り替えてpullとpushを行います。

git checkout dev
git pull upstream dev
git push origin dev

最後に作成したconfファイルを反映させるためにApacheを再起動させます。
restartだとエラーが起きたときにApache自体が落ちてしまうので、それを避けるためにgracefulコマンドを使います。

echo "graceful httpd"
sudo /etc/rc.d/init.d/httpd graceful

“shelltest.sh”の編集モードを終了します。これで”shelltest.sh”の完成です。

☆”shelltest.sh”の実行!
早速作成した”shelltest.sh”を実行しましょう。引数$1としてLinuxに渡すGitHubの各人のユーザー名を実行時に入力します。

cd shelltest.shが格納されている場所
sh shelltest.sh GitHubの各人のユーザー名

これでシェルスクリプトを叩くだけで、FuelPHPの開発環境ができるようになります!
シェルスクリプト全体はこちらのgistを参照してください。

今回はここまでです。ご覧いただきましてありがとうございます。

参考記事一覧

【リリース】宇宙上司〜俺の上司が地球人なわけがない〜 Android版

GeNERACEのカジュアルゲーム第一弾が、
本日リリースされました!

宇宙上司〜俺の上司が地球人なわけがない〜 Android版

ダウンロードはこちらから!

playstore_large

上司とわかりあえない・・・そんな経験はありませんか?

その上司、、実は宇宙人かもしれません。

宇宙人を地球で野放しにするわけにはいかない。

主人公であるあなたは、宇宙人を惑星まで還してあげることにしました。

 

スワイプとタップで上司にアッパーを決め続け、

惑星まで送り届けてあげましょう!

2

3

殴って、なぐって、殴りまくって、感動のゲームクリアを目指してください!

宇宙上司、よろしくお願いします!!

 

宇宙上司〜俺の上司が地球人なわけがない〜 Android版

ダウンロードはこちらから!