開発中つまずいたこととその対処色々

# はじめに

開発中大小様々なことで困るので困ったこととその対処

# 一覧

## データ管理

データ入力者が慣れているのはExcel
以下の問題あり

- git管理しにくい
    - 差分わかりにくい
    - マージしにくい
- Validationチェック書くの面倒
    - いちいちVBAマクロ書く？
    - いい方法があるのかも
- 結局はExcelからCSVなんなりでExportして使う

Google Spreadsheetもよく見かけるが、諸事情により外部サーバーに
データ置けなかったり速度問題があったり

入力しやすければなんでもいいけどWebなエディタ作るのもあれ。
以下構成がいい感じ？

- MongoDB
    - JSONでデータ構築
    - GUIで要素編集できる
    - MongoDB Compassで柔軟にValidation Ruleかけそう
    - JSONはgit管理しやすい

ビルド時はMongoDB->JSON->FlatBufferして使うと思う。
UniRx作者作のZeroFormatterもよさげ

案なので実際にまだ試していない。

## ビルド成果物管理

- アセットから復元可能といえば可能だが、ビルドした時点成果物まんまがあるとよい
    - gitに保存すると、gitリポジトリサイズでえらいことになる
        - 初回チェックアウトでひどい目にあう

ファイルサーバーに日付で分けて保存したりしがちだけど
バックアップとか考え出すとめんどい。
amazon s3とかに置く方がいいと思う。

## 連絡手段

Slackが使いたくても使えない
RocketChatでいい感じ

Skypeダメだと思う

## ファイルサーバーへCtrl+Vファイルコピーに時間がかかる

```
rsync -av --delete src dst
```
転送ファイル数が多いときファイルサーバーにExplorerでCtrl+Vすると泣くことがある。

Bash on Ubuntu on WindowsでWindowsも使える

## windowsのgitGUI環境

- SourceTree
    - 見やすい綺麗
    - 遅いしよくコマンド失敗する
    - terminalもよく失敗する。.lockで怒られまくり
        - mac版使ったら快適さの違いに驚く。windowsいじめ
- 本家git
    - 速い安定
    - ちょっとGUI癖がある
- gitkraken
    - おしゃれ開発活発使ったことない
    - 業務利用有償

## git fetchすると毎回sshパスワードを聞かれる

- 環境：mac
- 対処：`ssh-add`コマンド叩けば直った
- 参考：http://stackoverflow.com/questions/17846529/could-not-open-a-connection-to-your-authentication-agent

## git status叩くと大量の変更ファイルが出た。消したい。

- 対処：`git reset --hard HEAD`

## git status叩くと大量の未管理ファイルが出た。消したい。
   
- 対処：`git clean -fd`

## gitのログが汚い

mergeせず、rebaseで他の更新の後に自分の変更を置くと綺麗
rebaseしていいかはプロジェクト次第

- 作業用ブランチ切る
- 作業用ブランチで編集 git checkout feature/work
- git fetch -pで更新情報取得
- git checkout develop
- git pullでdevelop更新
- git checkout feature/workで作業用ブランチに移動
- git rebase developで作業用フォルダの変更を他の変更の後に移す
- git checkout develop
- git merge --no-ff feature/workでdevelopに変更取り込み
- git push origin developで変更を公開

## 特定のファイルだけフィルタリングして検索かけたい

- findコマンド, xargコマンド, grepの組み合わせ
- `find -name *.hoge | xarg -i grep -H pattern "{}"`

git on windowsのターミナルで叩くと妙に遅い気がする

## ログ分析

Elasticsearch+kibanaがいい感じ。
Elasticsearchにログ入れてkibanaでグラフ化

開発初期からkibana使うことを見越してログフォーマットを決めておくとよさげ

## WindowsでLinuxコマンド使いたい

- MSYS2
    - とてもいいものを教えてもらいました
    - http://qiita.com/Ted-HM/items/4f2feb9fdacb6c72083c
- 本家bash
    - http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html
- Cygwin
    - いわずもがな
    - gnupackが便利
- BusyBox
    - exeにコマンド渡せばいい感じ。
    - https://busybox.net/

## ログファイルが更新されるたびにログファイルを開き直して見るのが面倒くさい

- less -r <file>で開いた後Shift+f同時押しでファイル更新待ち状態に入る
- tail -f <file>

## スクリプトからXCodeプロジェクトをビルドしたい

- `xcodebuild -schema <schema-name>`すればOK
    - .xcodeprojを指定したい場合は`xcodebuild -project <xcodeproj-path>`
- schema-nameを知りたい場合は`xcodebuild -showBuildSettings`
- 作業フォルダを変えたい場合は`xcodebuild -derivedDataPath ${BUILD_DIR}`
- Code Sign errorのビルドエラーがでるときはxcodebuild叩く前に`security unlock-keychain -p <password>`

## ボット導入

ローカルネットワークならhubot一択

- nvmインストール　https://github.com/creationix/nvm
- nvm ls-remoteでインストール可能なnode.jsのバージョン一覧取得
- nvm install でnode.jsインストール
- .bash_profileにsource ~/.nvm/nvm.shを書いておく
- hubotインストール　https://hubot.github.com/docs/
- hubot-script.jsonを削除
- external-scripts.jsonからheroicスクリプトを削除(設定しないとエラー出る)
- ${HUBOT_DIR}/bin/hubotに各種環境変数exportを記載
- ${HUBOT_DIR}/bin/hubotを実行して接続確認. 
- npm install -g foreverでデーモン補助ツールインストール
- forever start -l hoge.log -c bash ${HUBOT_DIR}/bin/hubot -a slack

久々に触ったら、最新版(2016/6)はhubot-scripts.jsonを使わないらしい
Heroku連携スクリプトもデフォルトで入ってるので使わないなら消す

## hubotとjenkins連携

PORTとか設定は${HUBOT_DIR}/bin/hubotにexport書いてる

- hubot -> jenkins
    - http://qiita.com/AkitsuguHirano/items/e768e3823bbdbafe7e4b
- jenkins -> hubot
    - http://qiita.com/kounoike/items/bb2768309cbaaaa51196


## ビルド

Rakeが使い易い。
RubyがインストールされていなくてもリポジトリにRumix2を入れておけば他メンバもなんとかなる

Ruby環境がまんま使えるのでYAML解析してなんたらとか楽。
アセットはXML形式データで依存ファイルが記述されてたりする。
OMakeでXMLパースやらなんやらやったときは死ぬかと思った。

Gradleも使いやすそう。最速はninja。
- Rakeで解析してninjaビルド設定出力
- ninjaでリビルド
がいいかも。ninjaはマジで速い

## Rubyエディタ

なんだかんだでdd,yyが使いたくてvimに戻った
NetBeans+RubyかAtom+Ruby+RSenseが平和そう

vimで補完使うなら2017年時点では.vimrcにvim-pack向けに
```
Plug 'vim-ruby/vim-ruby'
```
してCtrl+x,Ctrl+oするとサクッと補完が使える。

vim+rubyで調べるとrsenseとかneocompleteとか色々出てきて宝探し

```
$ gem install rubocop
```
と.vimrcで
```
Plug 'vim-syntastic/syntastic'
```
で文法チェックもよさげ

## Jenkins

- コマンドプロンプトで動くのにJenkinsでこける
    - 環境変数がずれてるかも。Jenkins再起動で機嫌なおるかも
- SCM CheckoutでPipelineスクリプト動かすとSandboxになって使いにくい

```
def hoge(){ 
  stage("fuga") {
    ...
  }
}
return this;
```
と外部ファイル化しておき、
Pipelineジョブで非Sandboxなジョブ直書きで
```
pipeline = load 'hoge.groovy'
pipeline.hoge()
```
と呼び出すと楽

- Slaveで動作させるときでも環境変数は全てMaster側Jenkinsの設定が使われる
    - 最初Slaveマシン内でテストしたときとMasterからSlaveに仕事させたときで動作が違ってびびった
    - SlaveにJenkinsを入れる必要がない
    - Masterの環境が渡されるとSlaveで動かないときはSlaveにJenkins入れてHTTPリクエストでJobを発行するほうが楽
- HTTPリクエストはParameterized Trigger Pluginで投げると終了まで監視出来て楽
    - 使う際はシステム設定で宛先URLを登録する
    - 宛先JenkinsのグローバルセキュリティでCRLFがあると動かない様子
    - 宛先Jenkinsログインでuser/passwordが必要ならHTTPリクエスト投げるときもAuthorize設定が必要
    - Pipelineから呼びたいときは一手間多いがHTTPを投げるジョブを用意すると楽
- Pipelineジョブ
    - Pluginによってはgroovyからの呼び出し方が不明なものがいる
        - Plugin呼び出し用ジョブを作ってbuildで呼ぶと楽
    - Java関数importして使おうとするとセキュリティ例外が出る
        - Jenkins設定からいちいち関数実行許可を出さないとダメ
        - Java関数importして使うくらいならsh "rake task"とかsh呼び出し経由したほうが楽
    - stage 'hoge'は非推奨になったそうなのでstage('hoge){...}で
    - if(...){ stage(...){} }するとビルド履歴の表示が切れる。stage(){ if(){} }のほうがよさげ
    - env.LANG=ja_JP.UTF-8とか環境変数仕込みを忘れずに
    - 真偽値パラメータはgroovy上"true"/"false"と文字列で見える。
        - でもbuildに渡すときはtrue/falseと真偽値じゃないとだめ

## ローカル環境なgithubが欲しい

- gitlabが使いやすかった
- golang製も出たらしい

## 設定ファイル

- 最近はYAML推し。
    - コメントをかけるのがでかい。
    - JSONはコメントがかけない。JSONを使いたい場合はYAML->JSONに変換でいいと思う。変換ライブラリもいっぱいある
- C++ならCSVがメモリ効率がよい
    - メモリに置いた後セパレータを¥0に置換すれば文字列取得できる

## ツール作成

- Golangがよさげ。けど有識者が少ないので導入してない。
- Rubyもサクッと作れてよい。複数OSでも動かしやすい。慣れてる人も多い。
    - Rumixがいい感じ
    - たまにCygwin-Rubyと混ざって？？？となることがある。
- Perlは人によって書き方の癖がすごかったりするのでおすすめしない。
    - 痛い目見る人が多かった。
- exeはWinに縛られるのでよくない。
- 大きなbatもメンテ性に欠ける。かといってファイル分割されても困る。
- node.jsは環境変化が速くバージョン管理で痛い目見ることがある

## 設計あれこれ

- コンポジットパターン大事超大事
    - 継承でクラスが肥大化すると誰かが勝手に基底クラスに処理追加したりして激おこ
    - 分離できるものは分離。
- 非同期処理呼び出しで完了時コールバックを引数にとったら地獄の始まり
    - 完了時コールバックの完了時コールバックとかよくある
    - Unityでよくある非同期進捗クラスを返してIsDoneで見てから完了処理書くと平和
    - Reactive Programmingすごいっぽい
- UIは表示と設定をクラスで分ける。
    - データ拾って設定とかモックで一緒くたに書きがち。毎回後で痛い目見る
    - ViewにUIのSetterとコールバック登録API
    - Viewの表示管理でUI設定とコールバック時の処理
    - これは最初からサボらずやる。

## C#あれこれ

- デバッグ用関数はSystem.Diagnostics.Conditionalをつける
    - 関数呼び出し部分を#if #endifでくくらなくてよくなる
    - Conditionalつけた関数のコンパイルは走るのでデバッグ用パラメータは#if #endifでくくらないとダメ
- YAMLパーサー
    - https://github.com/aaubry/YamlDotNet
- コマンドラインオプションパーサー
    - http://wiki.dobon.net/index.php?.NET%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%A6%B5%E6%2F108
- Excel読み書き
    - ClosedXML
        - 使いやすいけど数式に弱い気がする
    - NPOI
        - 数式に強い気がする
    - ExcelのデータはJSON化しておいてExcelはただのエディタにするほうがバージョン管理とか共同編集とかマージとか平和になれそう
        - JSONスキーマ読んでJSON開いたら綺麗に表示とか
- C#を行指定で開く
    - devenv.exe /Edit hoge.cs /command "Edit.Goto 100"
    - VS2015で試したら失敗。旧バージョンではこれ使えるらしい。
- LINQ素晴らしい。負荷を気にしなくていい箇所ならガンガン使うべき
    - Whereで条件一致するものだけ取り出し
    - Selectで変換。ファイルパスからファイルストリームとか
    - SelectManyで変換結果が1対多になっても次段で1つずつ処理できる
        - ```SelectMany( ディレクトリパス => ディレクトリ内ファイルパス群 ).Select( ファイルパス => ファイルストリーム )```とか

## Unityあれこれ

長くなったので別ページにうつした
http://qiita.com/Oyayubi/items/c6d44b33276ba93d73a2