SkypeからSlackにした理由

プログラマの西川です。

今回の記事では、チャットツールのSlackについてお話します。最近各所で使いはじめたよーというお話がチラホラと出てきていますが、弊社でも大体4ヶ月ほど便利に使っています。

僕が入社した頃、弊社ではSkypeを社内チャットツールとして使っていました。僕は何年か前から、会社など管理が必要な組織でSkypeの利用は適さないと思っており、これは改善しなければと思いました。そこでSlackを利用できる状態を先に作り、社内メンバーに多少強引に使いはじめてもらい、便利さを実感してもらってそのまま社内のチャットツールとして定着させました。
とても便利なので、基本機能、連携機能等を紹介し、他社等でもより便利なコミュニケーションのためのきっかけになれば良いなと思います。

Continue reading

あなたのコード、激遅ぷんぷん丸?今すぐできる7つのチェック項目 PHP編

php_logo

みなさん、こんにちは。

GeNERACEのピンキリエンジニアこと、ひろゆきです。

ここのところPHPを書いてるんですが、同じ処理を書くとしても、どの関数を使えば良いのか分からないことがありました。

たとえば、繰り返し処理を書くにしてもfor, foreach, whileと3種類もあります。

いったいどれを使えば良いの?(´・ω・`)

分からないなら調べれば良い。

ということで、弊社環境にて処理速度の検証してみました。

(この辺ってググってみても、ソースが古かったりしてたので、あえて調べました)

Continue reading

Ruby on Rails を用いて爆速構築

初めまして、新人エンジニアまーしーです。
今回は前職でRailsを用いて開発をしていたので軽く紹介をさせていただきます。
ruby-on-rails

railsはコマンド一つでソースの骨子を作ってくれるので
ファイル、ディレクトリ追加はコマンド1つで可能です。
また、migrationを行うことでテーブル生成を行えます。

Continue reading

PHP初心者向けのコードの最適化

php_code_image

こんにちは。GeNERACEのみきあらいです。
今回はPHP初心者の方に向けて、コードの最適化について書かせて頂きました。初めにコードを書くにあたって意識したことをまとめ、その後に実際にどのようなコードを書いたのか、サンプルコードをご紹介します。

Continue reading

大規模サービスでプログラマが注意すること(基礎)

blog_20130517

みなさん、こんにちは。

GeNERACEのピンキリエンジニアのひろゆきです。

いきなりですが、少しだけ自己紹介をしますと、前職やら何やらで比較的、大規模とよばれるサービスの開発、運用していました。

今回はその経験から得たノウハウ的なものをご紹介させて頂きたいと思います。

既にそういったサービスを経験されている方には当たり前のことかもしれませんが、これから参加される方、または、参加したばかりの方のお役に少しでもなれば幸いです。
Continue reading

俺のコントローラのprotectedがpublicなわけがない

こんにちは。
最近、東北TECH道場(仙台道場)でAndroidの講師してます、GeNERACE CTOけんたろです。
今回は東北TECH道場で行なっている活動やハックについて書こうと思いましたが、弊社の仕事でCakePHP(v2.3.1)を使っていて気になったことについてメモします。

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分間集中しないとペアプログラミングではなく単独でコードを書くことになってしまうためです。)
  • コードを書いてる人のミスを発見したときは、「なぜそのような実装をしたのか」を見ている人が質問します。
    質問に答えることによって、コードを書いている側も「自分が本来やりたかった実装」と「今自分が書いてる実装」の違いに気付き、ミスの解決が速くなります。
    また、不要なメソッドの有無、変数名の付け方、インスタンスの生成の場所などに関しても指摘事項があればすぐにそれを共有します。
  • 書いてる人は見てる人の言う通りにコードを書くのではなく、見てる人にアドバイスをもらいつつも主体的にコードを書きます。
    これも当たり前のことのようですが、見てる人の方が書いてる人より経験がある場合、書いてる人はつい見てる人の指示通りにコードを書いてしまうようなこともありえます。が、それだと結局二人ではなく、見てる人が一人で書いているのとほぼ同じになってしまうため、ペアプログラミングの意味がなくなってしまいます。
  • コードを書くことからは少し外れますが、コードを書いてる人が自分よりも技術力がある人の場合、その人が調査してるときのやり方も見るべきポイントとなります。自分が一人でコードを書いていて調査するときの参考になります。

まとめました。

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

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

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

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

    SASS
    compass

    Continue reading

    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で行う単体テストの部分も書きたいのですが、また次の機会に書こうと思います。

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