gitのpre-commitのでphpの構文チェックとmasterへのコミット禁止

対象のリポジトリで実行

$ touch .git/hooks/pre-commit
$ chmod 755 .git/hooks/pre-commit

事前準備はこれでOK

#!/bin/sh

ROOT_DIR="$(pwd)/"
LIST=$(git status | grep -e '\(modified:\|new file:\)'|  grep  '\.php' | cut -d':' -f2 )

# syntaxエラーがあるファイルはコミット禁止
ERRORS_BUFFER=""
for file in $LIST
do
    ERRORS=$(php -l $ROOT_DIR$file 2>&1 | grep "Parse error")
    if [ "$ERRORS" != "" ]; then
        if [ "$ERRORS_BUFFER" != "" ]; then
            ERRORS_BUFFER="$ERRORS_BUFFER\n$ERRORS"
        else
            ERRORS_BUFFER="$ERRORS"
        fi
        echo "Syntax errors found in file: $file "
        exit 1
    fi
done
# マスターへのコミット禁止
branch="$(git symbolic-ref HEAD 2>/dev/null)" || \
       "$(git describe --contains --all HEAD)"
if [ "${branch##refs/heads/}" = "master" ]; then
  echo "Do not commit on the master branch!"
  exit 1
fi

動かす

予め事故ってるPHPファイルを用意

$ git st
On branch master
Your branch and 'origin/master' have diverged,
and have 2 and 5 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   README.md
        new file:   index.php

$ git add . 
$ git commit -m 'test'
Syntax errors found in file: index.php

その他全然試してないから事故ってるかも

ナレッジ/ノウハウ情報共有サービスであるlodgeを動かしてみた

lodge/lodge

ロッジと呼びます。 イントラネット限定でも使える、ナレッジ/ノウハウ情報共有サービスです。
手軽に導入できて、チーム内全体の情報共有やナレッジ蓄積の手助けができることを目標としています。

スクリーンショット png

これをVagrant上で動かしてみましたが、いろいろハマったのでメモ。
まぁRailsRubyMySQLを動かすセットアップと言ってもいいかもしれない。

事前準備

  • Vagrantでとりあえずなんらかのイメージが動いている − 手元にDebianのやつがあったのでそれに入れた
  • MySQLはインストール済み

セットアップ

ruby install

sudo aptitude update
sudo aptitude safe-upgrade
sudo apt-get install ruby

gem install

$ sudo aptitude install libyaml-ruby libzlib-ruby libopenssl-ruby ruby-dev
$ wget http://production.cf.rubygems.org/rubygems/rubygems-2.4.1.zip
$ unzip rubygems-2.4.1.zip && rm rubygems-2.4.1.zip
$ cd rubygems-2.4.1
$ sudo ruby setup.rb
$ gem -v
2.4.1

$ which gem
/usr/bin/gem

$ gem env | grep 'GEM PATHS' -A2
- GEM PATHS:
    -   /usr/lib/ruby/gems/1.9.1
    - /home/vagrant/.gem/ruby/1.9.1

$ echo 'export GEM_HOME=/usr/bin/gem' >> ~/.bashrc
$ source ~/.bashrc

$ gem env | grep 'GEM PATHS' -A2
  - GEM PATHS:
     - /usr/bin/gem
     - /home/vagrant/.gem/ruby/1.9.1

bundle install

$ gem install bundler

lodgeのセットアップ

$ git clone https://github.com/m-yamashita/lodge.git
$ cd lodge
$ sudo gem install json
$ sudo bundle install

エラー対応

# bundle error出る
$ sudo apt-get install g++
$ sudo apt-get install libmysqld-dev

# mysql2が入らん
$ which mysql
/usr/bin/mysql

$ sudo gem install mysql2 --with-mysql-lib=/usr/lib/mysql

# rails server叩け無い
$ rails server -e production
/usr/lib/ruby/gems/1.9.1/gems/execjs-2.2.1/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

$ git diff
diff --git a/Gemfile b/Gemfile
index 05a476e..9d1b7c2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -10,7 +10,7 @@ gem 'uglifier', '>= 1.3.0'
 # Use CoffeeScript for .js.coffee assets and views
 gem 'coffee-rails', '~> 4.0.0'
 # See https://github.com/sstephenson/execjs#readme for more supported runtimes
-# gem 'therubyracer',  platforms: :ruby
+gem 'therubyracer',  platforms: :ruby

$ bundle install
$ echo 'export RAILS_ENV=production' >> ~/.bashrc source ~/.bashrc

rails起動後、新規ユーザーが登録できない

PCからfacebookを見た時にスタイリッシュにするツールの紹介

twitterのTLに流れてたらいいのを見つけたので紹介
普段のFacebookの画面に広告とかいろいろ入っててめんどくさいので、それを削除してクリアにしてくれるやつです。

eramdam/BetterFacebookIsBetter
ChromeFirefoxsafariで動くようですが自分はChromeでしか使ってないです。

びふぉーあふたー画像

適用後の画像がGithubに貼ってたあったので直接ここにも貼っときます。

やってることは特定のサイトのcssを上書きするアドオンに広告等に使われてるのをCSSで無理やり消してます。
自分はこれにプラスしてCSSをいじって右のサイドバーにある何時間前に誰々がログインしていたってのもついでに消してます。
okbm/BetterFacebookIsBetter

メリット

  • 見た目スッキリ
  • 色も白基調になり見やすい

デメリット

  • Facebookのイベント参加とかたまーにするときに参加者一覧が見れなくなるのでもし見たい場合は手動で一次的に無効にしないとだめ
  • またFacebookの見た目がリニューアル等で変わるとまた設定しないとだめ
  • (デメリットじゃないが…)設定は端末ごとなので複数のPC(会社と家とかとか)に同じ設定を入れないとだめ

鬱陶しい広告が消えるし、誰が何分前にログインしてたみたいなストーカーっぽい情報も見なくて済むので単純にフィードを見るだけのシンプルな使い勝手になるのでオススメです。

debianの文字化け対応メモ

何かとググって探したりしてるのでメモっておく。

前提:vagrantを使っていじってるときにgit diffやtigの日本語が化ける ※まぁvagrantの設定に入れたらいいと思うが…

swap<E7><AD><89><E3><81><AE><E3><83><95><E3><82><A1><E3><82><A4><E3><83><AB><E3><82><92><E4><BD><9C><E3><82><89><E3><81><AA><E3><81><84>

こんな感じになる

対応方法

$ sudo aptitude install locales
$ sudo dpkg-reconfigure locales
# GUIっぽい画面が立ち上がるので、ja_JP.UTF-8をスペースで選択する

# .bashrcも以下の一文入れておくこと
export LANG=ja_JP.UTF-8

多分これで治る

追記

これでも治るかも

$ sudo localedef -f UTF-8 -i ja_JP ja_JP

Consumer Service Engineer MeetUp Vol.1 ~iOS編~の参加メモ

Consumer Service Engineer MeetUp Vol.1 ~iOS編~ - dots.

コンシューマ向けのWEBサービス(アプリ)の企画・開発・運営をしている会社によるエンジニア向けの講演、パネルディスカッション、懇親会を含めたMeetUpです!

に参加してきたのでメモを晒しておきます。
※その場で一気に書いてるので、誤字脱字はあるかも。

「禁断の開発話」 ヴァズ株式会社 清田氏

  • SnapDishについて
    • 料理好きのお料理SNS
    • 開発から含めると3年で、ユーザー数は50万
  • 開発環境について
    • vim&Xcodeのハイブリッド
    • Build settings
      • マクロでDEVとかSTGに切り替えてる
    • ARC&非ARCハイブリッド
      • ARCにしたいが本音。Storyboardに移行できれば願望がある
  • テストとデバッグ
    • InstrumentsのLeaksとAutomationを利用
    • CrittercismとCrashlytics
    • A/B Testing(androidでやってる)
  • 開発スタイル
    • Github-flowとGitflowを使い分け
    • RedmineとBacklogsを利用
    • メモはとりまくる
    • Scopeベース
      • KPIに直接関係ないUXや機能拡張の長めの開発
    • KPIベース
      • KPIがあるので、その施策をイシュー単位で潰していくパターン
  • リリースサイクル
    • KPIベース 1-2週間
    • Scopeベース 2-4週間
  • サポート
    • zendeskを使ってエンジニア当番制
  • 実際の開発
    • 構成署(設計画面)を元に開発
    • 紙を使って話し合い
  • パッケージ配信
    • Testfightを利用
  • アクセス解析
    • GA、スクリーンビューやイベントを多様
    • サーバーサイドのロギングも多様

「Wantedlyを支える技術と開発フロー」ウォンテッドリー株式会社 川崎氏

  • ウォンテッドリーのCTOで、社員第1号
  • 開発フロー紹介
  • プロトタイピング
  • 開発
    • iOS
      • フルネイティブでWebviewなし
      • 定番のCocoaPodsを活用
      • StoryboardとContainerを多用
    • APIサーバー側
      • Rails4でJSONAPIを用意
      • Webと同じコードベース
      • Webと同様にHerokuで運用
    • インフラ
      • AWSとかCloudFrontやS3、PostgreSQL使ってる(図なので、文字に書き起こすのはしんどい)
  • CocoaPodsで管理するライブラリも事前に決めている
  • コード管理
    • 初期はAPIサーバーとiOSのコードを単一のレポジトリ
      • PullRequestがひとつになる
      • レビューしやすい&mergeのタイミングがある
      • クライアントとサーバーの担当が分かれてないので、一つのほうが見やすい
    • リリース後にレポジトリ分割
      • アプリのAPIサーバーのリリースサイクルの違い
    • コーディングスタイルガイドをあわせる
  • テスト
    • Rails
      • Continuas Integration
      • werckerというCIサービス
      • masterは常にdeployしてる
    • iOS
      • ユーザーテストをしっかりやる
      • 本番と別にテスト用のQAサーバーを用意
      • BuildSettingでまとめ

UICollectionViewを使った商品一覧UIの改善(BUYMAアプリ) 株式会社エニグモ 大川氏

  • アプリコンセプト
    • 趣味のあった商品の出会い
    • 好きな商品を気軽にチェックできる
    • 旬な商品を把握できる
    • 商品をリアルに感じさせるUI(Webと同じだと仕方ないので)
  • リリースして、フィードバック
    • Twitterエゴサーチするとよい反応
    • アプリにフェードバック集める機能もある
    • 商品を揃えてるので、同じ絵が続くのでしんどい
    • 大きな画像を使ってるので、1つの商品しか見れない場合がある
    • その他画像が見にくいとか画像がなんとかとかとりあえず画像がだめという感じになった。
  • 改善
    • テーブルレイアウトとグリッドレイアウトの2パターンを用意
    • VITableViewとUIConllectionViewをのハイブリッド
    • content offsetを同期させて切り替えるようにする
  • 改善した結果
    • 問題はないが、アイテムがどこに行ったかという、キュー(手がかり)がない
    • 2つのViewを作りこむ必要があるのでちょっと…
  • その結果
    • UICollectionViewのCollectionViewLayoutを使って解決した(よくわからんかったがデモがすげぇわかりやすかった)
    • テーブルレイアウトとグリッドレイアウトをCollectionVeiwで切り替えるっぽい
  • その他
    • Reveal Appというアプリがとてもよい
      • レイアウト周りで使える
  • まとめ
    • APIとの戦いとりあえず、WWDCセッションビデオ見るのが重要
    • 困ったら基本に戻る/発送を変えてみる

「Web APIを利用するiOSアプリのテスト技法株式会社はてな 加藤氏

  • id:cockscomb
  • webAPI
    • JSON
    • RESTまたはApp専用
    • APIバージョン
  • 何をテストするか
    • 期待通りのHTTPRequestが発行される
    • URL(ホストやパス、クエリ)、Http method,header,body
    • 様々なHttpResponseに対するふるまい
  • OHHTTpStubs
    • HTTPの通信をstubする
    • NSURLProtocolを利用している
  • NLTHTTPStubServer
    • アプリの内部でサーバーを動かす
    • CocoaHTTPServerを利用
    • http://localhost:12345 がデフォルト
    • 実際のサーバーのように振る舞う
    • HTTP bodyの様子を見ることができる
    • エラーは発生させられない(ネットワークエラーとか無理)
    • HTTP requestは一部使えない
  • テストのメリット
    • 自由なHTTPresponceが作れる
    • 実際にサーバーにrequestしなくいてよい
    • サーバーサイドの実装を待つ必要がない
    • サーバーサイドの変更を事前に試せる
    • いきなり壊れるのを防げる

「アンサーのグロースハックと開発手法」株式会社nanapi 小島氏

  • Twitter:kozyty
  • アンサーについて
    • 今、8人で開発
    • 限りなくフラットなチーム
  • アンサーの場合
    • 極力MTGを減らす
    • その代わり、MTGは全員参加
    • あさかい、ゆうかいはタスク進捗確認・情報共有
    • チャットでも直接ガンガン
    • 議事録やメモはQittaなどでシェア
  • ユーザーテスト
    • UIscopeを利用
    • 少しリテラシー高めだが、サービス初期はやるべき
    • 気になった結果だけを付箋なのどに書き出す
    • PMF(PdoductMarketFit)の向上に役立てる
  • 開発初期について
    • ユーザーヒアリング
    • 社内アルバイトスタッフさんに強力してもらう
  • PMFを40%以上獲得するために
    • Nの要素はあるか(スケーラブルポイント)
    • ブレないためにもステータスメントの共有必須
    • スケーラブルポイントがあるかどうかを念頭に
    • ROIドリブンで要件プライオリティを決める
    • PDCAサイクルを絶対に回す
  • マネジメント対応版のアプリ
    • 運用に便利な機能を備えたアプリを提供
    • 複アカ機能
    • 接続環境の選択
    • KPI見れるとか
  • 開発環境
    • DebugとReleaseのみ
    • TestFlightを利用
    • JenkinsなどのCIによる配布はやめた
  • 監視・解析
    • kibana3でログ監視
    • elasticsearch
    • NewRelic
    • 非エンジニアも見る見る
  • グロースハックやってる?
    • ミッション
    • 細かな改善の積み重ねでユーザー体験を最大化していく
    • ダイアログ表示、開発フロー、
  • 分析
    • 実行する前でもある程度わかる
    • 分析結果によっては仮説を変更する必要がある
    • 1%の改善に気づくための監視・解析環境は必須条件
  • 削除人ボランティア募集
    • 楽しく安全に使ってもらうために
    • ガイドラインに沿わない投稿を監視
    • 削除人というロイヤリティを得るだけ
    • 募集したところ、かなりの数の応募があった
  • 失敗体験は?
    • 打率的には2割ぐらい
  • まとめ
    • 小さなことをコツコツと
    • プレないステータスメントの共有
    • ROI観点でのプライオリティの設定
    • 最小単位での検証を行う
    • 神速PDCA

「グロースハックにおけるiOSアプリのリリースサイクル最適化について」株式会社マインドパレット 小林氏

  • Twitter:yuji_nano
  • Snapeeeという女性向け写真サービス
  • 改善サイクルの高速化
  • iOSアプリにたちはだかる問題
    • 申請から通過まで時間がかかる
    • リジェクトされることがある
  • iOSAndroidで異なる仮設検証を行う
    • 同じことをやるのは非効率
    • それぞれ効果があったものだけを移植する
  • WebViewを使う
    • メリット
      • アプリの申請なしでも仮設検証が回せる
    • デメリット
      • 初期実装が結構たいへん
      • 専任の開発が必要なことが多い
  • デバッグ用の機能を作りこんで、テストを効率化する
    • 設定変更だけでデバッグできるようにする(デバッグルームと呼んでる)
      • 国コード、言語コードの切り替え
      • 接続先のサーバー切り替え
      • チュートリアルを何度も表示
      • 自動ログインの無効化
      • アプリバージョン切り替え
    • エラーの内容をフィードバックできるようにする
    • ギブアップ宣言の導入
      • つづけても意味無いような仮説検証は早めに見切る
      • 仕組み化することで、「効果がないことに薄々きづいてるけどやめられない」ことをなくす
    • がっつりテストする前に申請する
      • 開発した箇所を中心にひと通りテスト
      • Testflightでチームメンバーに配信
      • 申請出す
      • ここでガッツリテスト
      • 申請OK
  • 毎週申請することに意味がある?
    • 細かなアップデートを目的にしてはいけない
      • アップデートのこういそのものによる一時的なアクティブ増は長続きしない
    • 勇気を出して、手を動かすのをやめましょう
      • 最低限作りこむと中途半端に作りこむは違う
  • Garbage in garbage out
  • 意識しよう
    • グロースハックは何を目的にしているのか
    • 正解に早くたどり着くため
  • まとめ
    • リリースサイクルの正解はない

まとめ

vagrant上のmysqlを5.6にUpdateしたメモ

以下の本を買ってみたけど、MySQLのバージョンが古すぎたので、Updateしたけど、いろいろ詰まったのでメモ

データベース徹底攻略 (WEB+DB PRESS plus)

データベース徹底攻略 (WEB+DB PRESS plus)

あんま人が読んでもわからないと思う。自分用メモの意味合いが強い

前提

  • vagrant上のやつをアップデート
  • mysqlのバージョンは5.1だったのを5.6.15までアップ
  • もともと入ってるデータがないに等しいので、何もバックアップしてない
  • レプリケーションは設定してない
  • slowlogの設定はした

作業メモ

$ sudo service mysql stop
$ sudo apt-get -y remove mysql-server mysql-client mysql-common
$ sudo apt-get -y autoremove
$ sudo apt-get -y autoclean
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15-debian6.0-x86_64.deb
# ↑これが数十分かかった

$ sudo dpkg -i mysql-5.6.15-debian6.0-*.deb
$ sudo sh -c 'echo "PATH=$PATH:/opt/mysql/server-5.6/bin" >> /etc/profile'
$ source /etc/profile
$ sudo vi /etc/mysql/my.cnf

basedir = /opt/mysql/server-5.6

$ sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysql
$ sudo update-rc.d mysql defaults
$ sudo ln -s /opt/mysql/server-5.6/bin/mysqld /usr/sbin/mysqld
$ mysql_upgrade 
$ sudo service mysql start

vagrant@~$ mysql -uroot -e 'status' | grep -i 'server version'
Server version:         5.6.15 MySQL Community Server (GPL)

途中でエラーった

$ sudo vi /etc/mysql/my.cnf

[mysqld]
log-error=/var/log/mysql/error.log

$ sudo chmod o+rw /var/log/mysql
$ touch /var/log/mysql/error.log
$ sudo chmod o+r /var/log/mysql.error.log
$ tail -f /var/log/mysql.error.log

基本は、/var/lib/mysql以下がおかしくなってたので、ib_logfile0やら、ibdata1を消したらOKだった。

slowlogの確認

$ sudo vi /etc/mysql/my.cnf

+ slow_query_log=ON
+ log_output=TABLE
- long_query_time = 2
+ long_query_time = 0
※0秒にすると全ログ出るので、注意

[root][localhost][(none)]> show variables like 'slow%';
+---------------------+---------------------+
| Variable_name       | Value               |
+---------------------+---------------------+
| slow_launch_time    | 2                   |
| slow_query_log      | ON                  |
| slow_query_log_file | /tmp/mysql-slow.log |
+---------------------+---------------------+
3 rows in set (0.00 sec)

[root][localhost][(none)]> show variables like 'long%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

[root][localhost][(none)]> show create table mysql.slow_log;
~~~ 長いので省略 ~~~


# 適当にcreate database&table
[root][localhost][mysql]> create database test;
[root][localhost][mysql]> use test
[root][localhost][test]> CREATE TABLE example (
         id INT,
         data INT,
       ) ENGINE=InnoDB;
[root][localhost][test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| example        |
+----------------+
1 row in set (0.01 sec)

[root][localhost][test]> select * from example;
Empty set (0.00 sec)

[root][localhost][test]> select start_time,query_time,sql_text from mysql.slow_log order by start_time desc limit 1;
+---------------------+------------+---------------------------------------------------------------+
| start_time          | query_time | sql_text                                                      |
+---------------------+------------+---------------------------------------------------------------+
| 2014-03-16 15:45:57 | 00:00:00   | select * from mysql.slow_log order by start_time desc limit 1 |
+---------------------+------------+---------------------------------------------------------------+
1 row in set (0.00 sec)

まとめ

まだまだチューニングとか全然してないので、あとでアップデートするとは思うが、とりあえず、今のmy.cnfを貼っとく

my.cnf

prompt="[\\u][\\h][\\d]> "
auto-rehash

↑のプロンプトの設定いじりと、auto-rehashによる補完は便利なので入れたおきたいところ

参考サイト