【2週間で3万円!!】無課金から課金ユーザになるまで ~ソーシャルゲーム体験記~

kunshiro

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

本日は技術的な話ではなく身近にソーシャルゲームにハマってた人@弊社プロデューサーがいたので、どうやってそういった状態になったかを聞いてきた話を書いてみます。

ユーザー心理的なもので何かのお役に立てたら幸いです。

ちなみに僕は前職でソーシャルゲーム開発をしていたため、純粋なユーザー目線というのは持てなくなってる気がしていましたが

今回の話を聞いて、忘れていた気持ちを思い出しました。

ソーシャルゲームをそれほどやりこんでいない状態から、ついつい課金までしてしまうところまでいっちゃう感じが新鮮でした。

回復する時間に合わせて、タイマーをかけてプレイしている様子はハマってるなーって感じです。

さて、以下からが聞いてきた話です

Continue reading

Ubuntuのススメ ver 2013/04

20090433-11

こんにちは、GeNERACE CTO けんたろです。

僕のメインの開発環境のOSはUbuntu 12.10です。
Ubuntuをメインの開発環境にしてから約2年。
今回はUbuntu 12.10で僕がよく使っている便利なソフトやツールについて書こうと思います。

Continue reading

効率が良いペアプログラミング

こんにちは。エンジニアのみきあらいです。今回はペアプログラミングについて書きます。

「ペアプログラミング」「ペアプロ」などといった単語でgoogle検索すると様々な記事が紹介されますが、今回は初めてのペアプログラミングを行ったときのやり方と気づいたメリットをまとめていきます。

    ☆ペアプログラミングしたときの状況

  • ペアを組んでもらった人:自分よりも経験があり技術力もある(コードを書くのが速い、知識が豊富なため問題解決が速い)人
  • Gitでソースコードを管理しました。コードを書くときは各自のPCを使用しました。
    ☆メリット
    実は効率が良い:「二人で一つのコードを書くので効率が悪い」と思われがちですが、以下のメリットがあります。

  • 良い実装方法を共有しやすい:自分よりも経験があり技術力がある人に見てもらってペアプログラミングをすることにより、一人でコードを書くよりも良い実装ができます。
    さらに技術力がある人がコードを書くのを見てるとコーディングの勉強になる上に、開発を行う際にもどのように実装されたかをリアルタイムで見ているので情報共有がしやすいです。

  • 手戻りが少なくなる:一人がコードを書いてもう一人がそのコードを同時に見ているので、問題点があればその場で指摘でき、解決もその場でできます。
  • ソースコードを確認する時間が短縮できる:例えばGitでソースコードを管理しているときにもメリットがあります。GitでPull Requestを送って第三者にマージしてもらう場合、その第三者がリクエストした人とペアプログラミングをしていれば、リクエストされたコードを読むのに時間をかけなくてもどういう実装がされているのかがわかるので、すぐにマージをすることができます。
  • コーディングとコードレビューをほぼ同時に行うことができる:一人がコードを書き、もう一人がそのコードをほぼリアルタイムでレビューすることができるので、実は効率が良いです。
  • コードに責任を持てる:チーム開発ではつい自分の書いたコードに集中し、他の人が書いたコードに注意が向かなくなりかねないこともなきにしもあらずですが、それを回避するためにも「二人以上の人が書いて確認する」ことにより、そのコードに対して責任を持ちやすくなります。従って万が一障害などが起こった場合も、責任を持っているコードならより対処がしやすくなります。
    ☆今回のペアプログラミングのやり方とポイント

  • コードを書く人と書いてるのを見る人の2人で行います。30分交代でコードを書きます。
    その際は時間配分を計算して「どの処理まで書いたら交代」ということをあらかじめ決めておきます。
    具体的には、今回ペアプログラミングでやる実装の範囲を決めて、その中で行う実装をわけて作業をするとスムーズです。
  • コードを書くときはそれぞれのPCを使います。交代の段階でGitにコミットし、相手に引き継ぎます。
  • コードを書くときは「今どういう処理を書くのか」「何のためにこの条件分岐を行うのか」などを発言しながら書きます。
    実際にコードを読めばどういうことをしているのかわかるといえば確かにそうなのですが、ペアプログラミングで重要なのは「常に認識合わせを行うこと」なので、常に会話をしてコードを書くようにします。
    認識が少しでも合わなくなると二人でコードを書いている意味がなくなってしまいます。ただ会話すればいいという訳ではなく、コードを書く人も見る人も互いに認識確認をすることが大切です。
  • デバッグをこまめに行います。これはペアプログラミングに限った話ではないですが、バグを未然に防ぐためにもこまめに行います。
    ペアプログラミングならデバッグも一人ではなく事実上二人で行うため、より確実にデバッグを行うことができます。
  • コードを見る人は、書いてる人のモニターに張り付く勢いで30分間見ることに集中します。
    (当たり前のことのようですが、本当に30分間なら30分間集中しないとペアプログラミングではなく単独でコードを書くことになってしまうためです。)
  • コードを書いてる人のミスを発見したときは、「なぜそのような実装をしたのか」を見ている人が質問します。
    質問に答えることによって、コードを書いている側も「自分が本来やりたかった実装」と「今自分が書いてる実装」の違いに気付き、ミスの解決が速くなります。
    また、不要なメソッドの有無、変数名の付け方、インスタンスの生成の場所などに関しても指摘事項があればすぐにそれを共有します。
  • 書いてる人は見てる人の言う通りにコードを書くのではなく、見てる人にアドバイスをもらいつつも主体的にコードを書きます。
    これも当たり前のことのようですが、見てる人の方が書いてる人より経験がある場合、書いてる人はつい見てる人の指示通りにコードを書いてしまうようなこともありえます。が、それだと結局二人ではなく、見てる人が一人で書いているのとほぼ同じになってしまうため、ペアプログラミングの意味がなくなってしまいます。
  • コードを書くことからは少し外れますが、コードを書いてる人が自分よりも技術力がある人の場合、その人が調査してるときのやり方も見るべきポイントとなります。自分が一人でコードを書いていて調査するときの参考になります。

まとめました。

  • コードを書く人と見る人は交代制
  • 常に認識合わせをすること
  • 「一人」ではなく「二人」でコードを書くという認識を忘れずに!
  • 今回のペアプログラミングに関するメリットとポイントについては以上です。今回は具体的なコードの公開などは割愛させていただきました。
    最後まで読んでいただきまして、ありがとうございます。

    パズドラを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版

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

    Andengineで使うスプライトアニメーション素材作成

    皆様はじめまして、今月からGeNERACEに参画してます。マークアップエンジニアのユージローです。

    さて、いくつか前のポストでも紹介されてる通り、弊社ではAndengineを使用して開発を行っています。

    Andengine = java

    マークアップエンジニア = html,css,javascript,etc

    仕事が無い!(待て

    そんなこんなで慣れないjavaを少し触りつつ、僕は現在キャラクターなどの画面素材を担当しています。

    Andengineはjavaですので、アニメーションの実装方法もcssアニメーションなどではなく、javaを用いてのアニメーションが主になりますが、スプライトアニメーションは昔ながらのフィルムビデオと同じ形式です。

    全てのコマを一枚の画像として書き出さなければなりません。

    スプライトシートは縦横に繰り返すものもありますが、単純なものであれば
    縦もしくは横のみの繰り返しで済みます。

    このスプライトシートですがアナログな作業でやるのは効率的ではないのでツールを使います。
    作成ツールも下記のように幾つかあるのですが、Flash Pro CS6からFlashでもスプライトシートの作成が可能になりました。

    インストールタイプのツール:http://www.codeandweb.com/texturepacker
    ブラウザアプリ:http://draeton.github.com/stitches/

    ということで今回はFlash Pro CS6を使用した場合のスプライトシート作成手順です。

    ステップ1:Flashアニメの書き出し

    Flashアニメの作成方法は端折るとして、ここでは作成したFlashアニメをpng画像に書き出します。キャプチャのようにメニューの『ファイル』➡『書き出し』➡『ムービーの書き出し』を選択します。

    ss2013-02-22-12.40.08

    フォーマットは今回背景有の為jpegでもgifでも良いのですが、変更で透過させる可能性も考えてpngシーケンスを選択しました。ss2013-02-22-12.58.30

    保存するとタイムラインに沿った画像が全て吐き出されこのようになります。
    無事に書き出せました。

    スクリーンショット-2013-02-22-13.07.54

    ステップ2:ライブラリへの取り込み

    ここでまたFlash Proで新規ファイルを作成します。
    新規ファイルを作成したら、メニューの『ファイル』➡『読み込み』➡『ライブラリに読み込み』を選択し、先ほど書き出したpng画像を全て読み込みます。
    スクリーンショット-2013-02-22-13.22.39

    ステップ3:スプライトシートの生成

    読み込みが完了したら、今度はライブラリウインドウから全ての素材を選択して右クリック➡『スプライトシートを生成』を選択します。

    スクリーンショット-2013-02-22-13.55.21

    最後です。
    スプライトシートの出力と書かれている部分でシートの幅と高さや、素材間の距離、背景色などの調整を行い書き出して完了です。
    スクリーンショット-2013-02-22-14.01.50

    シートの大きさなどは実際の実装にも影響する為、事前に認識のずれが無いかなどの確認が必要です。

    また今回は新規ファイルを作成しましたが、Flashアニメーションの任意のキーフレームシンボルからスプライトを生成することも可能になっています。

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