OmniAICreator/Qiita-1.07M huggingface dataset:
IDEを起動せずにAndroid実機ログを見る方法

Unityを使っていると、Androidの実機でのデバッグの方法について迷う時がある。通常のAndroid開発であれば、eclipse等のIDE上で完結するけれど、ログ見るためだけにIDE起動しちゃうの？という話。

方法として、2つ挙げる

1. adb logcatコマンドを使う
2. Android developer toolsを使う

# adb logcatを使う場合

時間付きでログを出す例

```shell-session
$ adb logcat -v time
````

これでもできなくはないが、端末によっては大量の変なログが吐かれてたりするので、こんなことになって辛い。

```shell-session
$ adb logcat -c | adb logcat -v time | grep -v D/SNFCCCS 2>&1 | tee debug.log
````

# Android developer toolsを使う場合
こっちがおすすめ。

Android SDKをDLした時に、付いてくるdeveloper toolsを直接起動する方法。
http://developer.android.com/sdk/index.html

例えば、以下のパスに格納されている。

````
adt-bundle-mac-x86_64/sdk/tools
````

ここで、tools以下のmonitorを起動する。

```shell-session
$ adt-bundle-mac-x86_64/sdk/tools/monitor
````

そうすると、eclipse上で操作していたようなツールを、直接起動できる。

![Screen Shot 2014-05-26 at 1.28.03 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/f6fe8a1f-f946-864e-bbd9-9808b94cfdc1.png)

Unity上のログだけを見る用に、Filterを追加しておく。
![Screen Shot 2014-05-26 at 1.46.30 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/66009620-2db9-8633-51ca-533dd8ad07f1.png)


**ちなみに、このツール上でスクリーンショットが撮れるので、端末上で撮る -> PCへ転送という手間もいらない。**


## 起動方法
以下を実行するだけで起動できるが、

```shell-session
$ adt-bundle-mac-x86_64/sdk/tools/monitor
````

パスを指定しておいたほうが便利。

.zshrcに以下の記述を追加

```shell-session
export PATH=$PATH:$HOME/src/adt-bundle-mac-x86_64-20130522/sdk/tools
````

あとはシェル上でmonitorと打つだけ！

```shell-session
$ monitor
````

## monitor起動時にJavaに関してエラーが出た時
"Java 6 SE6 runtime 入れろやー" とエラーが出た時、ウィンドウに従ってインストールしようとしたが、Network errorなる表示がされてうまく行かなかった。

以下とまさに同じ問題。
https://discussions.apple.com/message/23480816#23480816

上記スレの回答にあるように、Apple公式からインストールすると解決する。
http://support.apple.com/kb/DL1572

## 余談
同様のツールであるddmsも起動できるが、"Depricatedだからmonitorつかってね"と言われるので、monitorを使う。

```shell-session
$ ddms
The standalone version of DDMS is deprecated.
Please use Android Device Monitor (tools/monitor) instead.
````
magitのcommitモードは"git-commit-mode"だってさ

最近のmagitでは"git-commit-mode"だそうです。
以前は"magit-log-edit-mode"だったとのことですが、変わったみたいです。
https://github.com/magit/magit-log-edit

自動折り返しを切ろうとしても効かないので調べたらそういうことで。

最近はmagitさん、デフォルトで72文字で折り返してくれるんだけど、日本語でコミットメッセージ書く場合、この設定はちと不便なのですよね。。。

--------

（追記 2015.04.16）
おそらく magit のバージョンアップによって以前の設定が効かなくなっていた。
現在(magit-20150320.1639 にて確認)はこちらの設定が必要だった。（調べたところ auto-fill-mode でやっていた）

```
;; 72 文字折り返しをオミット
(add-hook 'git-commit-mode-hook (setq auto-fill-mode nil))
```
--------

（以前のバージョンでの設定）

```
;; 72 文字折り返しをオミット
(add-hook 'git-commit-mode-hook 'turn-off-auto-fill)
```
HTMLのinput type="file"を自由な見た目にする

#概要
Youtubeとかでデフォルトのとは違うボタンでファイル選択ダイアログが開く。
あれ良いなーと思って見てみたら、かなり簡単だった。
#サンプル
[完成品(Plunker)](http://plnkr.co/edit/dOtPr2?p=preview)
#説明
input type="file"って全域にクリック判定があるので、見せたいサイズにしたらopacity:0で透明にする。
そしたら、背景に自分の見せたいデザイン置けば完成。
もちろん背景側になるので、hoverとかはinput側で止まる。
なので、このサンプルでは親要素のhoverと表示要素（子要素）のクラスで見た目変えるようにしてある。
ここにドラッグ＆ドロップ捕まえるようにしたりして、[前の投稿](http://qiita.com/sashimizakana/items/23ddd656703c38626cc2)と掛け合わせれば良い感じ。
gitのユーザー名とメールの設定場所でトラブル。

# gitをインストールした最初の初期設定の後で別の名前やメールに変更したい。

## 問題
Ubuntu14.04のインストール直後gitの初期データを設定した、しかし後に別の名前とメールを変更する必要に迫られ設定を変更したが、そのデータ設定が反映されなかった。

## 原因
.zshrc（zshシェルの設定ファイル）に直接書き込んでいた。
（.zshrcをコピペしたため。）
最初gitの設定ファイルは3箇所あると調べあげ、それぞれ設定しなおしてみたがぜんぜん反映されず色々時間を使ってしまった。


* * *
## git設定ファイルは基本3箇所

+ /etc/gitconfig
	Git でこのファイルの読み書きをするには、
	--system オプションを指定します。

+ ~/.gitconfig
	ホーム直下
	Git でこのファイルの読み書きをするには、
	--global オプションを指定します。

+ .git/config
	リポジトリにある.gitディレクトリ直下
	git config 時にオプションは指定しない。

* * *
### 設定情報はgit config の -l オプションで見る事が出来る。
git config --system -l
git config --global -l
git config -l

設定データはsystem、global、ローカルリポジトリの順番に読まれ、後から読み込んだデータに上書きされる。

* * *
## git設定データ
### 名前
masakinihirota
### メール
masakinihirota@gmail.com

### 設定をいろいろ試した時のコマンド。
sudo git config --system user.name "masakinihirota"
sudo git config --system user.email "masakinihirota@gmail.com"
git config --global user.name "masakinihirota"
git config --global user.email "masakinihirota@gmail.com"
git config --local user.name "masakinihirota"
git config --local user.email "masakinihirota@gmail.com"
git config user.name "masakinihirota"
git config user.email "masakinihirota@gmail.com"

確認用のコマンド
sudo git config --system user.name
sudo git config --system user.email
git config --global user.name
git config --global user.email
git config --local user.name
git config --local user.email
git config user.name
git config user.email


```shell-session:.zshrc
GITの個人データ設定
export GIT_COMMITTER_NAME='masakinihirota'
export GIT_AUTHOR_NAME='masakinihirota'
export GIT_AUTHOR_EMAIL='masakinihirota@gmail.com'
export EMAIL='masakinihirota@gmail.com'

```
AngularJSでFormDataをPOSTする（ファイルのアップロードする）

#概要
AngularJSでFormDataをPOSTしたいときがある。
たとえばFileをアップロードするときとか、$httpをそのまま使ってもうまく行かない。
というのも、$httpのpostはデフォルトではContent-typeがapplication/jsonだからだ。
もちろんRequestはjsonにエンコードされる。
なので、適切なContent-typeとエンコードにする必要がある。
#FormData？

```js
var formData = new FormData();
formData.append('formのnameにあたる部分','内容');
```

って感じでつかうやつ。
内容の部分はファイルの場合はもちろんファイルになる。
このformDataをそのままpostの第二引数に渡す。
#ファイル？
input type="file"のchangeイベントを捕まえたり、ドラッグ＆ドロップを捕まえる。
そういうディレクティブ作るとよい。
#POSTのやり方
やっと本題。

```js
$http.post('upload先',formData,
{
    headers:{"Content-type":undefined}
    ,transformRequest: null
});
```

こんだけ。
Content-typeはundefinedにしておけば適切な形にしてくれる。
transformRequestはRequestをどんな感じに変形するかということで、この場合特に処理する必要が無い。
ので、nullにしておけばjsonにされることもなくなる。
ちなみにここをangular.indentityにして引数をそのまま返すようなサンプルがあったけど、その方が良い理由ってなんだろう？
（Requestがそのままの形であるってことが明示されてるからわかりやすいとか？）
Herokuにデプロイできない非エンジニアです。

下のRailsのチュートリアルを実践しながら勉強中です。

http://railstutorial.jp/chapters/beginning?version=4.0#code-gemfile_sqlite_version

>
> ###1.4.2 Herokuにデプロイする (1)
> Railsアプリケーションを実際にHerokuにデプロイするには、まずGitを使用してHerokuにリポジトリをプッシュします。
>
> ```
> $ git push heroku master
> ```
>

エラーが出ます。
下記、エラー内容です。

```
An error occurred while installing sqlite3 (1.3.8), and Bundler cannot continue.
       Make sure that `gem install sqlite3 -v '1.3.8'` succeeds before bundling.
 !
 !     Failed to install gems via Bundler.
 !     
 !     Detected sqlite3 gem which is not supported on Heroku.
 !     https://devcenter.heroku.com/articles/sqlite3
 !

 !     Push rejected, failed to compile Ruby app
```

色々調べて、変更してみても・・・

```ruby:Gemfile
gem 'sqlite3'
```

のところを

```ruby:Gemfile
group :development do
  gem 'sqlite3'
end

group :production do
  gem 'pg'
end
```

やっぱりエラーが出ます。

皆様の知恵をお貸しいただけますと幸いです。
RubyMotionでObjective-Cのコードをそのまま使う方法


RubyMotionでObjective-Cのコードをそのまま使うにはこんな感じでやれば良いらしい。凄い簡単だった。

やることは2つ。
vendor以下にそのまま使いたいObjective-Cのコードを追加。
次にRakefileに以下を記述。

```Rakefile
  app.vendor_project("vendor",:static)
```

これでOKらしい。


というわけで試してみた。
ちなみにvendor直下に入れてrakeをするとエラー。
僕の環境の場合だとvendor/Podsディレクトリの中のObjective-Cソースがダメらしい。
なのでvendor/Staticディレクトリを作成し、その下にObjective-Cコードを入れる。

今回はネットワーク状態を確認するためのコードを導入したかった。
調べるとAppleがサンプルコードを用意してくれてた。
https://developer.apple.com/Library/ios/samplecode/Reachability/Introduction/Intro.html

これの中のReachability.hとReachability.mをvendor/Static
の下に入れる。
Rakefileは以下のように編集。

```Rakefile
  app.vendor_project("vendor/Static",:static)
```

で使ってみると、結果が返ってくる。素晴らしい。楽。

```common.rb
Reachability.reachabilityWithHostName("www.google.com")
```
UdpClientでICMPのPort Unreachableメッセージを無視する方法


単一のUdpClientインスタンスで非同期に受信待ちしながらデータを送信する、簡易チャット中継サーバのようなシステムを作りました。
すると、閉じたポートにパケットを送信した際にUdpClientがICMPのPort Unreachableメッセージを受け取って例外を吐いてしまいます。

UDPなんだからパケットが届いたかどうかなんて気にせず投げっ放しにしたいなーと思って調べたところ、Stack Overflowにズバリ回答がありました。

[asynchronous - C# Async UDP listener SocketException - Stack Overflow](http://stackoverflow.com/questions/5199026/c-sharp-async-udp-listener-socketexception)

UdpClient.Clientプロパティ(Socketクラス)のIOControlメソッドで設定すると例外が飛んで来なくなります。

```
public const int SIO_UDP_CONNRESET = -1744830452;

var client = new UdpClient(endpoint);
client.Client.IOControl(
    (IOControlCode)SIO_UDP_CONNRESET, 
    new byte[] { 0, 0, 0, 0 }, 
    null
);
```
【jQuery】よく見るおまじない的なアレについて

##「おまじない」のパターン
例えばこれらのような形式が挙げられると思う。

```html:sample_1.html
<body>
<script>
// (1)
$(document).ready(function(){
    console.log($('#sample').text());
});
</script>
<div id="sample">foo</div>
</body>
```
```html:sample_2.html
<body>
<script>
// (2)
$(function(){
    console.log($('#sample').text());
});
</script>
<div id="sample">foo</div>
</body>
```
```html:sample_3.html
<body>
<script>
// (3)
(function($){
    console.log($('#sample').text());
})(jQuery);
</script>
<div id="sample">foo</div>
</body>
```

##これらは動作的に異なるものなのか？
結論から言えば、(1)と(2)は動作的に同じものであるが、(3)は違う。

(1)ではDOMがロードされ、操作可能になったタイミングでコールバック関数を実行する。そのためconsole.logで'foo'が正しく出力される。

また、(2)は(1)の```$(document).ready()```と同様に振る舞う関数[jQuery(callback)](http://api.jquery.com/jQuery/#jQuery3)であるため、こちらも'foo'が正常に出力されることになる。

一方で、(3)はjQueryオブジェクトを引数として渡している単なる即時関数である。
この記述は、「$というエイリアスが他のライブラリと衝突することを防ぐ」、「変数や関数のスコープを即時関数内に抑える」といった目的のために使用されており、スクリプトの実行タイミングを操作するものではない。
したがって```<div id="sample">foo</div>```がロードされる前にスクリプトが実行されるため、前に示した２つの例とは異なり、'foo'を出力することはできない。

##おまけ
なお、[jQuery(callback)のドキュメント](http://api.jquery.com/jQuery/#jQuery3)にも記載されているように、以下のような書き方をすれば$エイリアスの衝突も防ぐことができる。

```js
jQuery(function($){
    console.log($('#sample').text());
});
```
簡単にNode.jsをインストールする【windows編】



#windows環境だと色々入ってなくてめんどくさい！

そんな時に[chocolatey gallery](http://chocolatey.org/ "chocolatey gallery")というサイトを使います。

今回はNode.jsのインストールを紹介しますが、rubyとかgitとか色々インストールできます。


## 1.コマンドプロンプトを管理者権限で実行
管理者権限でないと、きちんとインストールできないことがあります。
2と3の手順はどちらもコマンドプロンプトで実行します。


## 2.パッケージをインストールするための下準備
管理者権限で起動したコマンドプロンプトで以下をコピペしてEnter

```
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
```

## 3.Node.jsをインストール
環境変数に新しく追加されるものがあるので、一度コマンドプロンプトを閉じる
そして、また管理者権限で起動したコマンドプロンプトで以下をコピペしてEnter

```
cinst nodejs.install
```

インストールするためのスクリプトを実行するか、しないか、表示するかを聞かれるので
yesを入力してEnter

```
Do you want to run the script?
 1) yes
 2) no
 3) print

yes
```

## 4.Node.jsが正しくインストールされたか確認
一度コマンドプロンプトを閉じて、再度開いて以下のコマンドを実行
バージョンが表示されたら正しくインストールできてます。

```
node -v
```


## インストールしたいパッケージを検索してインストール

[chocolatey packages検索ページ](http://chocolatey.org/packages "chocolatey gallery")
windows環境で色々インストールしたい時、まずchocolateyで探してみましょう。
見えなくなったフォルダを見えるようにする

何かの拍子にGUIからフォルダが見えなくなってしまったので、調べてみた。

```bash
sudo chflags nohidden folder
```

見えるようにしたいフォルダをfolderに指定する。

例えば
```bash
sudo chflags nohidden /Library
```
BambooでGradle+Androidビルド

#環境

bambooはインストール済みとする
さくらVPS　ubuntu 14.04

AndroidStduioのプロジェクトを、適当なレポジトリに突っ込んでいる。

ビルドシステムはgradle
テストにはrobolectricを使用

Android関係あんま詳しくないから、複雑な環境だとどうだろ。

#前準備

ひとまずビルドできる環境を整える必要がある

```bash
#add-apt-repositoryに必要
sudo apt-get install software-properties-common python-software-properties

#oracleのjavaを落とす
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get -y install oracle-java8-installer
sudo apt-get -y install oracle-java8-set-default 

#64bit版の場合はこれがないとビルドしくじる
sudo apt-get install lib32stdc++6
sudo apt-get install lib32z1
```

AndroidSDKを落としてunzip
私は以下に解凍した

/home/bamboo/android-tool

```bash
cd /home/bamboo/android-tool/sdk/tools

#必要なものを調べて…
./android list adk -a -e 
#updateコマンドで入れる
./android update sdk -u -a -t 10
```

で、レポジトリ上のソースとかを、とりあえずビルドしてみて、ビルドが通るかを確認する。
とりあえず、AndroidStudio側で入れているツール郡を入れておけば間違いはない。

もしかしたらgradleとかも入れないとダメかも。

```bash
#適当にプロジェクトをcloneなりしてVPS上に持ってくる
#Bambooを介さずビルドしてみて、正しくビルドできるかを確認しておく

cd .../android-project/hoge
./gradlew clean test
```

必要そうなものを都度落として、環境を整える…
ビルドが成功すれば、あとはBambooの設定となる

#Bambooの設定

レポジトリを指定して、正しくチェックアウトできるか確認の後、
ScriptとJunitTestをタスクとして追加する

![PigmyRabbit   worker   Default Job  Edit job configuration   Rabbit Bamboo.png](https://qiita-image-store.s3.amazonaws.com/0/23335/9a8ccc79-d3fd-aa51-a0ca-75e08d1016b9.png)



スクリプトは下記の通りとした

```bash
#!/bin/sh

#まずパス関係を設定する
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export PATH=/usr/lib/jvm/java-8-oracle/bin:$PATH
export CLASSPATH=.:/usr/lib/jvm/java-8-oracle/lib
export ANDROID_HOME=/home/bamboo/android-tool/sdk

#ignoring option MaxPermSize=256m; support was removed in 8.0を回避するためにJAVA_OPTSを設定（ここで結構コケました…）
export JAVA_OPTS="-Xms64m -Xmx128m -XX:MaxMetaspaceSize=128m"

./gradlew clean test

```

![PigmyRabbit   worker   Default Job  Edit job configuration   Rabbit Bamboo2.png](https://qiita-image-store.s3.amazonaws.com/0/23335/42710667-927b-b675-7ee5-7ce071f6a2f4.png)

で、JUnit側には
`test-results/*.xml`
を指定してやって…あとはビルドが通るか確認。

おわり！
Macでバッチ（command）ファイルを作る方法


ときどき必要だけどいつも忘れちゃうのでメモ。
Macではシェルスクリプト作ってターミナルから実行するという手がありますが、手間がかかるのでダブルクリックで実行できるようにしたい。

そんなときは普通にシェルスクリプトを作成して「.command」という拡張子に変えてあげればできます。

```shell
mv xxx.sh xxx.command
```

でもこれだけだと実行権限がないのでアクセス権を変更します.

```shell
chmod u+x xxx.command
``` 

これでFinderからダブルクリックするだけで実行されます。

##補足

###カレントディレクトリをファイルのある場所にする方法
.commandファイルを実行したときはカレントディレクトリがrootになってるので、以下のおまじないを入れてあげると、そのファイルがある場所がカレントディレクトリになります.

```shell
cd `dirname $0`
```

###実行を途中で止める方法（Enterキー入力まち状態にする）

これとかでいけます. （ a はなんでも可）

```shell
read a
```
finder から terminal を開く


# サービスを使う方法

システム環境設定 > キーボード > ショートカット > サービス > フォルダに新規ターミナルタブ

![e82c8bd2-fd4d-fb84-0602-b472c1502e34.png](https://qiita-image-store.s3.amazonaws.com/0/44184/3b24c119-93b8-8894-6130-e2a34d0d0e08.png "e82c8bd2-fd4d-fb84-0602-b472c1502e34.png")
![open_as_terminal_item_in_context_menu.png](https://qiita-image-store.s3.amazonaws.com/0/44184/0db25e69-bffe-2001-39a7-2ca223e9f4ee.png "open_as_terminal_item_in_context_menu.png")

# finder に terminal で開くボタンを追加する方法

[jbtule/cdto](https://github.com/jbtule/cdto/releases)


finder にこんな ![Kobito.13wXsA.png](https://qiita-image-store.s3.amazonaws.com/0/44184/3dc12736-1c3a-146f-8d12-46c1f48744de.png "Kobito.13wXsA.png") ボタンを追加して terminal を起動できる

![Kobito.x11ncw.png](https://qiita-image-store.s3.amazonaws.com/0/44184/bce17952-eb07-42f5-192d-a51d01d5e1d5.png "Kobito.x11ncw.png")
WebサーバとSocket.IOのポートが違う場合の注意


Webサーバが80ポートでSocket.IOが3000ポートのようにポート番号が違う場合は注意が必要。

これだとうまくいかない。
socket.io.jsを80番ポートで取得しようとしてしまう。

```html(NG)
<script src="/socket.io/socket.io.js"></script>
```

このようにポート番号を指定する必要がある。

```html(OK)
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
```
【Sublime Text 2】Haxeをコンパイルしてすぐに実行する

例えば以下のHaxeコードをコンパイル・実行して、Sublime Text2の標準出力ウィンドウに表示する方法です。

```haxe:Main.hx
package;

class Main {
	public static function main():Void {
		Sys.print("hoge!\n");
	}
}
```

そのまま Command+B しても
```
Fatal error: exception Failure("File not found build.hxml")
```
と怒られます。どうやら build.hxml が必要な様子。

なので、build.hxmlのファイルを同一ディレクトリに配置しました。

```:build.hxml
-neko main.n
-main Main
```

しかし main.n がビルドされるだけで実行はしてくれません。

試行錯誤した挙句、本家のドキュメントを読んで解決。
* http://old.haxe.org/doc/compiler

> -x \<main_class\>: shortcut for compiling and executing a neko file. (generate >\<main_class\>.n file See: --interp option)

`-x`オプションの後ろにメインクラス名を指定するみたい。
ということで、以下のたった一行のビルド設定ファイルで、実行までしてくれるようになりました。

```:build.hxml
-x Main
```
Eclipseの設定ファイルの場所


Eclipseの設定ファイルの場所を知っていると役に立つことがあります。
例えば、
[mavenですべての設定ファイルを自動生成させる方法](http://qiita.com/ko2ic/items/39be03afbc6c38c409ea "mavenですべての設定ファイルを自動生成させる方法")をやるには、どこに何の設定ファイルがあるかを知る必要があります。
また、gradleでも同様です。

ということで、それを記述しておきます。

# Java Code Styleの設定
Java  >　Code Style

    ${eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs
# save actionの設定  
Java > Editor > Save Actions

    ${eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs

# エディタ一般の設定
general  > editors  >　text editorの設定

    ${eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs

# xml関連（エディタ含む）の設定 
XML

    ${eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.xml.core.prefs

# web関連のエディタなどの設定(CSS,html,jsp)
Web
 
    ${eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.css.core.prefs
    ${eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.html.core.prefs
    ${eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jst.jsp.core.prefs

# Javaのエラー/警告
Java  >　Complier  >　Errors/Warning

    ${eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs

# checkstyleの設定ファイル
Checkstyle

    ${eclipse.workspace}/.metadata/.plugins/net.sf.eclipsecs.core/checkstyle-config.xml


# 「Run Configurations」 External Tools Configuration」
メニュー[Run] > [Run Configurations] 
メニュー[Run] > [External Tools] > [External Tools Configurations] 

	${eclipse.workspace}/.metadata/.plugins/org.eclipse.debug.core/.launches/

# プロジェクト固有の設定
全般的に以下の場所

```
<プロジェクト>/.settings/
```

たとえば、プロジェクトの文字コードの設定
プロジェクトのproperteis → Resource

    <プロジェクト>/.settings/org.eclipse.core.resources.prefs

# Eclipseのworkspaceの場所の設定

	<Eclipseのディレクトリ>/configuration/.settings/org.eclipse.ui.ide.prefs
Bonnie++でファイルシステムのI/Oパフォーマンスを測定する


Bonnie++: ファイルシステムのI/Oの早さを測定するツール

# インストール(Ubuntu 14.04)

```
apt-get install bonnie++
```

# 使い方

```
bonnie++ -d /tmp -s 512 -r 256 -u root
```

* -d：測定対象のディレクトリ
* -r：メモリサイズ(MB)
* -s：作成するファイルの最大サイズ(MB)
* -u：実行ユーザ


# 出力

出力は、実行過程・実行結果・実行結果CSVの3つのパートからなる

![ansible.png](https://qiita-image-store.s3.amazonaws.com/0/889/dacc1248-9db4-5ffe-a897-cf8aa3c7f7d7.png "ansible.png")


# HTML形式で出力する

bon_csv2htmlで実行結果CSVをHTML形式に変換可能。実行結果CSVの部分だけが標準出力になるので、パイプで繋ぐだけで良い。また `-q` オプションは実行過程を表示しないという指定。

```
bonnie++ -d /tmp-s 512 -r 256 -u root -q | bon_csv2html > result.html
```

HTML形式のレポート:

![Bonnie___Benchmark_results.png](https://qiita-image-store.s3.amazonaws.com/0/889/06816194-d49a-3ed0-8717-35dc61dd8e1e.png "Bonnie___Benchmark_results.png")
linuxbrewでopenssl-1.0.1gのmanページのインストールに失敗するときの回避策

現時点ではUbuntu 14.04でlinuxbrewを使ってopensslをインストールしようとすると、失敗してしまいます。

```shell-session
$ brew install openssl
==> Downloading https://www.openssl.org/source/openssl-1.0.1g.tar.gz
######################################################################## 100.0%
==> perl ./Configure --prefix=/home/itiut/.linuxbrew/Cellar/openssl/1.0.1g --openssldir=/home/itiut/.linuxbrew/etc/openssl zlib-dynamic shared enable-cms linux-x86_64
==> make depend
==> make
==> make test
==> make install MANDIR=/home/itiut/.linuxbrew/Cellar/openssl/1.0.1g/share/man MANSUFFIX=ssl
cms.pod around line 465: Expected text after =item, not a number
cms.pod around line 470: Expected text after =item, not a number
cms.pod around line 474: Expected text after =item, not a number
POD document had syntax errors at /usr/bin/pod2man line 71.
make: *** [install_docs] Error 255

READ THIS: https://github.com/Homebrew/homebrew/wiki/troubleshooting

These open issues may also help:
openssl failed to build on 10.9 (https://github.com/Homebrew/homebrew/issues/29238)
```

これはUbuntu 14.04でopenssl-1.0.1gのmanページのインストールにおいて不具合があるからです。
[Documentation fixes for openssl-1.0.1g (Ubuntu 14.04) · Issue #57 · openssl/openssl](https://github.com/openssl/openssl/issues/57)

この不具合は`OpenSSL_1_0_1-stable`ブランチでは修正されていて、次のバージョンのリリースには含まれるそうです。
しかし、現時点ではlinuxbrewを使ってopensslをインストールするとopenssl-1.0.1gがインストールされるので、何か別の方法が必要です。

バージョン1.0.1gでも使える回避策としては、インストール時に`make install`を実行するのではなく、`make install_sw`を実行してmanページのインストールを省略します。

その場しのぎの方法ですが、opensslのFormulaを直接編集して`make install`を`make install_sw`に書き換えることで、openssl-1.0.1gをインストールすることができました。
変更部分を示しておきます。

```diff:openssl.rb.patch
--- original/openssl.rb	2014-05-25 10:27:26.507374615 +0000
+++ fix/openssl.rb	2014-05-25 10:27:55.383373710 +0000
@@ -69,7 +69,7 @@
       end
     end
 
-    system "make", "install", "MANDIR=#{man}", "MANSUFFIX=ssl"
+    system "make", "install_sw", "MANDIR=#{man}", "MANSUFFIX=ssl"
 
     if build.universal?
       %w[libcrypto libssl].each do |libname|
```
MacBookProを買ったときにしておきたい初期設定、アプリ

<h3>クリック</h3>
初期設定ではトラックパッドに軽くふれただけでは何も反応しません。
windowsのように触れただけで反応させたい場合、
[システム環境設定] > [トラックパッド]から
[タップでクリック（1本指でタップ）]にチェックをいれます。
これでトラックパッドに軽く触れただけで、windosのように反応してくれるようになりました！
![スクリーンショット 2014-05-25 18.39.58.png](https://qiita-image-store.s3.amazonaws.com/0/44144/293341b7-5910-730f-996a-cb89c08ef568.png "スクリーンショット 2014-05-25 18.39.58.png")


<hr>

<h3>セキュリティ</h3>
・ファイアウォールをONにする
[設定] > [セキュリティーとプライバシー]にいき、
左下の鍵のボタンを押し、自分のPCのパスワードを入力してからファイアウォールをONにすると完成。
![スクリーンショット 2014-05-25 18.44.24.png](https://qiita-image-store.s3.amazonaws.com/0/44144/5e520d9b-29e7-c6ac-f333-8ab8cbfbfb1b.png "スクリーンショット 2014-05-25 18.44.24.png")
<br/>
<br/>

・AppStore以外からのアプリも入手可能にする
これはセキュリティーのレベルを下げることになるかもしれないですが、MacAppStore以外にもすばらしいアプリがたくさんあるので設定したい人はしておいて損はないと思います。
[設定] > [セキュリティーとプライバシー]にいき、
左下の鍵のボタンを押し、自分のPCのパスワードを入力してから「すべてのアプリケーションを許可」にチェックを入れればOK!
![スクリーンショット 2014-05-25 19.00.12.png](https://qiita-image-store.s3.amazonaws.com/0/44144/f940f05f-17e8-c719-b845-00cf7652c14b.png "スクリーンショット 2014-05-25 19.00.12.png")

<br/>
<br/>

<h3>Google日本語入力</h3>
Macに標準で入っているの日本語変換機能はあまりできがなくないので無料で高機能のgoolge日本語入力をいれときましょう！
さすがGoogle先生。
http://www.google.co.jp/ime/

<br/>
<br/>

<h3>Better touch tool</h3>
![スクリーンショット 2014-05-25 19.20.10.png](https://qiita-image-store.s3.amazonaws.com/0/44144/8a7382e3-5173-0ae1-84e4-dd670c4369f0.png "スクリーンショット 2014-05-25 19.20.10.png")

Macのトラックパッドはものすごく優秀です。そのトラックパッドを更に優秀にしてくれるアプリがBetter touch toolです。
色々融通が効いてくれて更にMacが使いやすくなりますよ！
使い方はググれば山のように出てきますので割愛します。
http://blog.boastr.net/

<br/>
<br/>

<h3>Memory Diag</h3>
![スクリーンショット 2014-05-25 19.19.47.png](https://qiita-image-store.s3.amazonaws.com/0/44144/8da86ba1-b938-31ea-400a-dc86c06d0063.png "スクリーンショット 2014-05-25 19.19.47.png")


Macのメモリ解放アプリで説明不要です。
１クリックするだけです。本当に笑。
https://itunes.apple.com/jp/app/memory-diag/id748212890?mt=12

<br/>
<br/>

<h3>AppCleaner</h3>
![スクリーンショット 2014-05-25 19.23.52.png](https://qiita-image-store.s3.amazonaws.com/0/44144/fa6710d7-ed68-8092-7711-5adb421b7b6e.png "スクリーンショット 2014-05-25 19.23.52.png")
普通アプリや何かファイルを削除しただけでは関連のファイルは削除されずにそのまま残ります。
しかしこのAppCleanerを使用すれば関連のファイルも自動的に削除してくれるので楽ちんです。
http://freemacsoft.net/appcleaner/

<br/>
<br/>

<h3>Onyx</h3>
![スクリーンショット 2014-05-25 19.35.35.png](https://qiita-image-store.s3.amazonaws.com/0/44144/f48242c0-07f6-8194-886f-b835b7861d87.png "スクリーンショット 2014-05-25 19.35.35.png")

はじめに注意しますが、これはちょっと初心者の方にはあまりおすすめしませんでの自己責任でお願いします。
ただ使いこなせば非常に便利です。Macの掃除アプリです。週1くらいでこのアプリを使ってMacを掃除すればいつまでもMacを快適に使えます。
http://www.titanium.free.fr/downloadonyx.php
ループ処理で変数の値がおかしい。


0,1,2になるところが、3が3回表示されてしまう。

```js
for(var i = 0; i < 3; i++) {
  setTimeout(function(){ 
    alert(i);
  }, 1000);
}
```

これで解決。

```js
for(var i = 0; i < 3; i++) {
  hoge(i);
}
function hoge(delay){
  setTimeout(function(){ 
    alert(delay);
  }, 1000);
}
```
（コマンドメモ）findの使い方

例えば **hoge** という名前のファイルがどの場所にあるのか完全に忘れてしまった（あるいは知らない）のであれば・・・

```
sudo find / -name hoge
```

こうすると管理者権限でルートディレクトリ以下（要するにマシン上の全データ）の中から **-name** 後に挙げた名前を検索してくれる。
時間はかかるが、 **実在するファイルなら確実に居場所が判明する** ので最終手段として使える（ある程度場所に見当がついているのであればそこから下で検索をかけたほうが早いが）。


###### 参考
UNIX：http://www.k-tanaka.net/unix/find.php
Linux：http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230777/
どっちも同じか？
敵キャラクターを追加して UnityChanを追いかけるようにする


はじめに
====

[前回](http://qiita.com/mokemokechicken/items/6977c8e0154d1b6b50aa) からの続きです。

今回は、敵キャラクターを追加して、UnityChanを追いかけるようにしてみます。

敵キャラクターをAssetストアからImportする
====

Assetストアで適当に敵キャラっぽいのを探します。無料で使えて足があるやつがいいですね、なんとなく。

その結果、これに決めました。
https://www.assetstore.unity3d.com/en/#!/content/2558

![demo1_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/941578b9-7444-c1e2-c7ee-12d82c94c3dd.png "demo1_unity_-_RoadRunner_-_Web_Player.png")

なかなかにキモいですね。こんなのには本能的に捕まりたくないので良い感じです。

敵キャラの設定をする
========

基本設定
------

* Prefab化する
* UnityChanと同じように、「Capsule Collider」「Rigidbody」「Animator(付属のもの)」「Scripe(EnemyControl.cs)」を設定する。

EnemyControl.cs
----------

敵キャラのControlをするに当たって、ほとんどUnityChanと同じような処理が必要です（はしごやBarの処理など）。
少し構成を整理したら以下のようになりました。

![プレゼンテーション1_pptx.png](https://qiita-image-store.s3.amazonaws.com/0/11124/c341c905-122e-c580-79a5-46262a2be76c.png "プレゼンテーション1_pptx.png")

UnityChanはPlayerのKey入力で `state`にKey Eventを送りますが、EnemyはPlayerの位置を見て `state`にEventを送るという流れにすれば良さそうです。

とりあえずアホみたいに追いかけるだけなら、以下のように書くことができました。

```csharp:EnemyControl.cs
public class EnemyControl : BaseCharacterControl
{
	// UnityChan
	public Transform target;

	// Use this for initialization
	void Start () {
		StartBase();
		moveSpeed = 0.04f;
	}
	
	void Update() {
		state.KeyLeftRight(Math.Sign(target.position.x - transform.position.x));
		state.KeyUpDown(Math.Sign(target.position.y - transform.position.y));

		animator.SetBool("isgrounded", !state.IsFalling());
		animator.SetFloat("speed", state.IsMovingLeftRight() ? 0.3f : 0f);

		state.Tick();
	}
}
```

Animatorのパラメータや定義されている動作が今のUnityChanのとは少し違います。簡単に合わせられそうなものだけ合わせておきました。

さいごに
====

こんな猛犬のように追いかけられたらすぐ死にそうですね。。。

* 今回のバージョンのWebPlayer版
	* https://dl.dropboxusercontent.com/u/21300511/UnityRoadRunner/demo1j/demo1j.html
* ソースコード
	* https://github.com/mokemokechicken/UnityChanRoadRunner/tree/demo1j
Qtで乱数を使う


1. 以下をincludeする。
	- #include \<QtGlobal>
	- #include \<QTime>
2. 乱数のシードを与える。
	- qsrand( QTime::currentTime().msec() );
3. 0-255の値を得る例：
	- int random = qrand() % 256;

[環境]
>% qmake --version
QMake version 3.0
Using Qt version 5.2.1 in /Users/xxxxx/Qt5.2.1/5.2.1/clang_64/lib
%
%
% clang --version
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.2.0
Thread model: posix
% 
%
Java例外処理_俯瞰する用


```java:
package Homework;
import turtle.*;
public class SD64 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TurtleFrame f = new TurtleFrame();
		Drawable[] hm = new Drawable[10];
		int hmp = 0;
		while(true) {
			int x = (int)(Math.random() * f.getWidth());
			int y = (int)(Math.random() * f.getHeight());
			
			switch((int)(Math.random() * 6)) {
			case 0:
				try {
					hm[hmp] = new DrawHouse();
					((Turtle)hm[hmp]).tcolor = java.awt.Color.red;
					f.add((Turtle)hm[hmp]);
					System.out.println("カメの数：" + hmp);
					hm[hmp].draw(x, y);
					//System.out.println("É^Å[ÉgÉãÇ™ÉtÉåÅ[ÉÄóÃàÊÇ©ÇÁÇÕÇ›èoÇ‹ÇµÇΩÅB");
					hmp++; break;
				} catch(ArrayIndexOutOfBoundsException e) {
					System.out.println("配列が確保しているメモリ領域を超えてアクセスしました");
				} catch(TurtleOutOfFrameException e) {
					System.out.println("タートルの座標がフレーム領域を超えました");
					hmp++;
				}
			case 1:
				try {
					hm[hmp] = new DrawStar();
					((Turtle)hm[hmp]).tcolor = java.awt.Color.blue;
					f.add((Turtle)hm[hmp]);
					hm[hmp].draw(x, y);
					hmp++;
					System.out.println("カメの数：" + hmp);
					break;
				} catch(ArrayIndexOutOfBoundsException e) {
					System.out.println("配列の確保したメモリ領域を超えてアクセスしました");
					hmp--;
					f.remove((Turtle)hm[hmp]);
				} catch(TurtleOutOfFrameException e) {
					System.out.println("タートルの座標がフレーム領域を超えました");
					hmp++;
				}
			case 2: case 3:
				try {
					hm[hmp] = new DrawGraph();
					((Turtle)hm[hmp]).tcolor = java.awt.Color.yellow;
					f.add((Turtle)hm[hmp]);
					hm[hmp].draw(x,  y);
					hmp++;
					System.out.println("カメの数：" + hmp);
					break;
				}catch(ArrayIndexOutOfBoundsException e) {
					System.out.println("配列のメモリ確保領域を超えてアクセスしました");
					hmp--;
					f.remove((Turtle)hm[hmp]);
					break;
				} catch(TurtleOutOfFrameException e) {
					System.out.println("タートルの座標がフレーム領域を超えました");
					hmp++;
				}
			case 4: case 5:
				hmp--;
				try {
					f.remove((Turtle)hm[hmp]);
					System.out.println("カメの数" + hmp);
					break;
				} catch(ArrayIndexOutOfBoundsException e) {
					hmp++;
					System.out.println("配列のメモリ確保領域を超えてアクセスしました");
				}
			}
		}
	}
}


```
復刻版サターンパッドをWindows8.1で動作させる


## 切っ掛け

Twitterで復刻版サターンパッドがWindows 8.1で動かない、という噂を聞きつけて、使う機会のないまま放置してあった復刻版サターンパッドをWindows 8.1に接続してみた。

## 現象

ゲームコントローラの設定で動作確認してみたところ、X軸 / Y軸は反応なし。
ボタンは 1, 4, 5, 7, 9 は反応するものの、2, 3, 6, 8 が押しっぱなしと判定されてどうにもならない感じ。
![GamePad.png](https://qiita-image-store.s3.amazonaws.com/0/28644/14e541e8-efa0-595e-9586-ed4efe8fb8a0.png)

## 解決

適当にぐぐると、[Windows 8.1 で一部の USB デバイスが再充電されない](http://support.microsoft.com/kb/2900614/ja)の方法でいけた、という報告があったので試してみた。

復刻版サターンパッドのプロパティから「USB 入力デバイス」の方のプロパティを開く。
「HID 準拠ゲーム コントローラー」の方ではない。
![property.png](https://qiita-image-store.s3.amazonaws.com/0/28644/2c45cbb5-f564-d757-452a-ae167a7efbf9.png)


詳細タブのプロパティで、「デバイス インスタンス パス」を選択して、値をメモしておく。
値は`\`で分割でき、`\`で区切った2つ目の部分は更に`&`で分割できるため、全体としては4つの部分からなり、
`(デバイス列挙子)\(ベンダー ID)&(製品 ID)\(インスタンス ID)`
の形式になっている。

![device instance path.png](https://qiita-image-store.s3.amazonaws.com/0/28644/6e107e68-0edc-75cd-2b7b-d4f34e418a32.png)

レジストリエディタから
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\(メモしたデバイス列挙子)\(メモした VID)&(メモした PID)\(メモしたインスタンス ID)\Device Parameters`
を開き、`EnhancedPowerManagementEnabled`のDWORD値を`0`に変更する。

後は、復刻版サターンパッドを一度 USB から外して再接続するだけで正常に動作するようになる。
Vim で 選択した領域を逆順にする方法

例えば、Vim で箇条書きでメモをしていて、一部だけを逆順にしたいときってありますよね？ありますよね？

こんな風にメモを取っていたときに

```
欲しい機能
- カメラ機能が欲しい
- 写真をアップロードしたい
- 写真にコメントをつけたい
予算xx万
```

こんな風に変更したいとかいうときですね。

```
欲しい機能
- 写真をアップロードしたい
- 写真にコメントをつけたい
- カメラ機能が欲しい
予算xx万
```

辞書順にソートしたいときは、ビジュアルモードで選択したあと次のコマンドでソートできます。

```
:'<,'>sort        # ソート（a->z）
:'<,'>sort!       # 逆ソート（z->a）
```

けれど、今回やりたいのは単純に元の順番の逆にしてほしいです。

そんなときは、同じくソートしたい領域をビジュアルモードで選択したあとに`tail`/`tac`コマンドを呼び出して逆順に並び変えることができました。

```dummy:MacOSX/*BSD
:'<,'>!tail -r
```

```dummy:GNU/Linux
:'<,'>!tac    # tac: reverse cat
```

OSのコマンドを利用しない方法としては次がありました。

```
:g/^/m0       # 0 は、ビジュアルモードで選択し始めた行-1 の数値
```

後者のほうがスマートなのかもしれませんが、ちょっと覚えにくいのとビジュアルモードで選択し始めた行を確認しないといけないので、たぶん `tail`/`tac` 版を利用すると思います。

ほかにいい方法があればぜひ教えてください。

## 参考
http://superuser.com/questions/189947/how-reverse-selected-lines-order-in-vim
os.path.joinの絶対パスの扱い

引数に絶対パスがあると、その前の引数は無視されるので注意。

(ref. https://docs.python.org/3.3/library/os.path.html#os.path.join)

```python:os.path.join
>>> os.path.join('/test', '/hoge', '/piyo')
'/piyo'

>>> os.path.join('/test', 'hoge', '/piyo')
'/piyo'

>>> os.path.join('/test', 'hoge', 'piyo')
'/test/hoge/piyo'
```
Vagrantで64bit版Ubuntuを動かすときの注意点

あるPCでvagrantを使って動かしていたUbuntu 14.04 LTS 64bit版を、別のPCでvagrantを使って動かそうとしたところ、`vagrant up`で次のエラーが出続けました。

`Warning: Connection timeout. Retrying...`

試しにVirtualBoxのGUIから起動させてみると途中でダンマリ状態になっていました。

ネットで調べてみると、BIOS設定の`VT-x`がdisableになっていると
64bit版は動かないという記事を見つけました。

さっそくBIOSの設定`Intel Virtualization Technology`の項目を確認するとdisableになっていました。
（よく見るとVirtualBoxのGUI上でGuestOS一覧は32bit版しか表示されていませんでした）

BIOS設定をenableに変更して`vagrant up`をやり直すと、今度は無事に起動できました。
（VirtualBoxのGuestOS一覧にも64bit版が表示されるようになりました）

64bit版を使う場合はBIOSの設定にも気をつけた方がよさそうです。

参考
http://laravel.io/forum/05-18-2014-trouble-getting-homestead-to-start-in-windows
PHPで連想配列を日本語エンコードしてCSV出力する

PHPでCSV出力する方法で検索すると、

以下のような添字配列が例に挙がっていることが多い。

```php
$data = array(
    array('佐藤', '東京都', '29歳'),
    array('田中', '千葉県', '31歳'),
    array('鈴木', '北海道', '54歳')
);
```

ただ実際は下のようにDBから取得した連想配列をCSVで出力するケースの方が多いと思う。今回少しハマったのでメモしておく。

```php
$assoc_data = array(
    array('name' => '佐藤', 'address' => '東京都', 'old' => '29歳'),
    array('name' => '田中', 'address' => '千葉県', 'old' => '31歳'),
    array('name' => '鈴木', 'address' => '北海道', 'old' => '54歳')
);
```

## 連想配列のデータをCSVで出力する

全体の構成としては以下の様なコードになる。

1. 連想配列で受け取ったデータをヘッダーをキーとして値のみ取得して添字配列に変換

2. 各行に相当する$assoc_row[$header_name]をmb_convert_variablesでSJIS-winに変換

3. fputcsvでCSV形式に変換

4. ブラウザから直接ダウンロードさせる

```php
  $csv_header = array(
        'name',
        'address',
        'old',
   );

    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=data.csv');

    $stream = fopen('php://output', 'w');
    fputcsv($stream, $csv_header);

    foreach($assoc_data as $key => $assoc_row){
        $numeric_row = array();
        foreach ($csv_header as $header_name) {
            mb_convert_variables('SJIS-win', 'UTF-8', $assoc_row[$header_name]);
            $numeric_row[] = $assoc_row[$header_name];
        }
        fputcsv($stream, $numeric_row);
    }
```

SJIS-winに変換しているのは、
UTF-8のままだとエクセルで読み込んだ時に、
文字化けしてしまうのと、(株)のような機種依存文字に対応するため

他のブログとか読んでると、

```
mb_convert_encording
```

で、配列をエンコードしているコードをよく見かけるけど、
この関数は対象が文字列なのでうまく動かないはず。

なので、mb_convert_variablesで配列ごとエンコードするようにしていている。

まだ文字列中に改行コード、カンマが含まれている場合のコードは書いていないので必要になった時に追記しようと思います。

後、♥マークの文字がまだどうしても「？」になってしまって
ちゃんとエンコード出来ない。。

誰か適切な文字コードをご存知の方がいたら教えていただけると幸いです！
Javaでフィールド値をループさせて出力（初心者編）

独自で作っている分析ツールのソースレビューをしててメモしようと思ったことを大したことないですが書いておきます
というより、べた書きされたソースを渡されて困ったのでメモっておきます

#背景
あるDOクラスのフィールド値を出力するテストをしていたAさん
DOクラスのフィールドをベタ書きして出力処理を書いていましたが、フィールド数が全部で数百個あり途中書きで私に渡してきました

フィールド値が数個なら問題なくベタ書きでいいのですが、それが何百個あったとしたら正直きついでしょう
私の場合めんどくさがりやなので、同じ書き方を2個書くだけでも煩わしいですが

#解決策
フィールド値をループして使えばいいだけ
ただ、自分で使うだけに留めて下さい
現場でこんなの発見したら設計がぶっ壊れてますね確実に

#参考ソース

あくまでも１つの例ですが、とりあえずAさんの目的は果たせているものになります
ベタ書きするならこっちの方がいいでしょう

```java:FieldUtil.java
https://gist.github.com/pollseed/37c9143c919d421f7e23
```

#めも
基本的に、同じ処理を書くのは極力避けたいです
subversionのワークコピー内にあるファイルの新規追加時のリビジョンを表示するワンライナー

社内で「こんなの無いですか？」と聞かれたので勢いで書いてみたヤツ
要考慮点

- 性能度外視（ファイル&ディレクトリのぶんだけsvn-logを呼ぶので）
    - 処理時間的にはO(ファイル数*HEADリビジョン番号)ぐらい？
- svn-logで出力される際のリビジョンログの区切りが'-'72文字であることを前提にしてます。
- (2014-05-25 17:48追加)かんたんな動作確認しかしてないです

``` 
$ cd /path/to/workcopy
$ for file in `svn list -R`; do echo `svn log $file | awk 'BEGIN{disp=0} /^\-{72}$/{disp=1;next;} { if (disp==1) {print $1; disp=0}}' | tail -n1` $file; done
```
お宝を追加して、お宝を取得したら、Scoreが更新されるようにする


はじめに
====

[前回](http://qiita.com/mokemokechicken/items/1c67b9aeac07de83bc03) からの続きです。

今回は、お宝Objectをステージに配置して、それをGetしたらScoreが更新されるようにしていきます。
基本的な操作はこれまでやってきたことの繰り返しなので、要点を書いていきます。

お宝Objectの追加
====

はしごなどを作った時と同じように行います。
http://qiita.com/mokemokechicken/items/f6d8bf10ce16099fc7c3

大事な点は以下のところです。

* Sphereを作って、適当にMaterialを作成して関連付ける
* Tagに Treasure を追加して、関連付ける
* Colliderは Trigger にチェックを入れる
* TreasureControl.cs を作成して、Sphere に関連付ける。

```csharp:TreasureControl.cs
public class TreasureControl : MonoBehaviour
{
	public void HitWithPlayer() {
		Destroy(gameObject.transform.parent.gameObject);
		Global.stageControler.PlayerGotTreasure();
	}

	void OnTriggerEnter(Collider other) {
		if (other.gameObject.tag == Tag.PLAYER) {
			HitWithPlayer();
		}
	}
}
```

`OnTriggerEnter()` が 何かと衝突したときに呼ばれます。もしそれがPlayerなら、Playerがお宝をGETしたと判定して、`HitWithPlayer()` を呼びます。

お宝がGETされたときの処理は、お宝を削除して、Scoreを増やしたりする処理です。

お宝を削除しているのが `Destoroy` です。

今回も "空Object" -> "Sphere" という構造を取りました。
このScriptは Sphere の Componentです(ColliderがSphereに付いているのでScriptも同じ場所につけないといけない)ので、親の"空Object"を消すために、`gameObject.transform.parent.gameObject`という長い感じになっています。

StageControllerにお宝関係の処理を追加
====

テキストデータ中のお宝を描画や、描画時に何個このステージにあるかカウントしています。
RoadRunnerは お宝全部取ると、脱出用のはしごが出現するからです。

お宝を取得した時の処理を

```csharp:StageController.cs
	public void PlayerGotTreasure() {
		numTreasure--;
		Global.score += 100;
	}
```

というような感じで追加しています。


Global Object
=======

スコアやStage番号を保持するための、static な Global Classを追加しました。

また、StageControllerにもここからアクセスできるようにしました。
Service Locatorパターン的なイメージです（あくまでイメージ）。

```csharp:Global.cs
public static class Global
{
	public static int stage = 1;
	public static int score = 0;

	private static StageController stageController_;
	public static StageController stageControler 
	{
		get { return stageController_; }
		set { stageController_ = value; }
	}
}
```

スコアの表示
=====

スコアの用に画面の同じ場所にずっと表示されているテキストを作りたいときは、 **GUI Text** というのを使います。

メニュー -> [GameObject] -> [Create Other] -> [Gui Text] として作成します。

![Stage_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/b95754d1-bde0-9bc1-f05b-993871ae3a0c.png "Stage_unity_-_RoadRunner_-_Web_Player.png")

* GUI Textの座標は 解像度に関係なく 左下が(0,0), 右上が(1,1) になります。
* Font Size を適当に設定しておきます
* Controll Script を登録します(ScoreControl とします)

`Update()` で表示する値を設定するのが一般的？のようです。なんか少し非効率な感じもしますが、こういうものなんですかね。

```csharp:ScoreControl.cs
public class ScoreControl : MonoBehaviour
{
	void Update() {
		guiText.text = "Score:" + Global.score;
	}
}
```

さいごに
=====

こんな感じになりました。少しゲームっぽくなったかな？

![Stage_unity_-_RoadRunner_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/11124/8968f3b8-a4e7-1547-7774-ca78ecd19e82.png "Stage_unity_-_RoadRunner_-_Web_Player.png")


* 今回のバージョンのWebPlayer版
	* https://dl.dropboxusercontent.com/u/21300511/UnityRoadRunner/demo1h/demo1h.html
* ソースコード
	* https://github.com/mokemokechicken/UnityChanRoadRunner/tree/demo1h
PostgreSQLのbackup, restore方法まとめ


## (1) PostgreSQLのダンプツールを利用したバックアップ

### pg_dumpコマンド
DBを運用しながらでも使えるbackupコマンド
> 中ではトランザクションブロック内でSELECT文を発行し、取得したデータを出力形式に合わせて整形した腕標準出力に出力

するらしい。

### pg_dumpの出力形式
* スクリプト形式(デフォルト)
* アーカイブ形式

が選択できる。

**スクリプト形式**
スクリプト形式の出力は、リストアに必要なSQL文の羅列が出る。
ので、`psql`コマンドでリストアする。
スクリプト形式の場合はプレーンテキストなので、リストアの際にエラーが出たら、中を見れるという利点がある。

**アーカイブ形式**
バイナリの形で出力される。リストアは`psql`コマンドでなく`pg_restore`コマンドで行う。
アーカイブ形式の利点は、 **｢指定したtableのみを選択してリストアできる｣**ことらしい。

また、アーカイブ形式には

* custom形式
* tar形式

の2種類がある。custom形式はデフォで圧縮されるのでファイルサイズが小さい。

### pg_dumpの使い方からリストアの方法まで

**スクリプト形式**
バックアップをとる

```console
$ pg_dump database名 > backup_file名
```

また、pg_dumpはローカルだけでなくリモートからも実行できる

```console
$ pg_dump -h hostname -p port database名 > backup_file名
```

リストアは次のように行う

```console
$ psql database名 < backup_file名
```

**アーカイブ形式**
バックアップをとる

```console
$ pg_dump -Fc database名 > backup_file名 
```

-Fオプションを付ければ良い。
-cはcustom形式を表す。-tとするとtar形式になる

リストアは次のように行う

```console
$ pg_restore -C -d postgres バックアップファイル名
```

　-C オプションを付けるとリストア前にデータベースを作成し、-d オプションは、その際に接続するデータベース名を指定

[使用例]
pg_restore -d support -Ft -c ./support.tar
### pg_dumpallの使い方
pg_dumpコマンドでは、globalデータと呼ばれるロールやテーブルスペースなどの情報はバックアップされないが、`pg_dumpall`を使えばそれらも全てコピーする。ただし、 **-Fオプションは使えない。**常にスクリプト形式となる。


### 詳細
```
[pg_dumpの主なオプション]
-a データのみをダンプ
-b ラージオブジェクトもダンプする。（注: デフォルトではダンプされません）
-d INSERTコマンドにてダンプ（通常はCOPYコマンド)
-D カラム名を含めたINSERTコマンドにてダンプ
-s テーブルのみダンプ
-t 特定のテーブルのみダンプ
-F アウトプットファイルの形式を指定（cがカスタム、tがtar、pがテキスト)
```
```
[pg_restoreの主なオプション]
-c データベースの作成前にテーブルなどをドロップする。
-F バックアップファイルの形式を指定（cがカスタム、tがtar、pがテキスト)
-d データベース名を指定
```


## 参考サイト
[使えば分かるPostgreSQL運用＆チューニング（4）：PostgreSQLのバックアップ＆リストア手法その1 (2/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0810/24/news135_2.html)
Rubyのスレッド周りの話

Rubyのスレッド周りを追ってみた。

最も効率が良いスレッドモデルは結論出ないんじゃないかと（物理的な環境、何を実装するか、性能以外の面でメンテナの問題とか）。

## Ruby1.8系
### 「グリーンスレッド」
Ruby1.8ではOSではなくて仮想マシン(VM)上で実装されたマルチスレッドシステムを採用した。
これを「グリーンスレッド」という。カーネルでスレッドがサポートされていなくても動作する。
つまり、OSに依存せずにマルチスレッドを実現する。

#### メリット
* スレッドの起動、並列化の性能
 Linux のネイティブスレッドの性能を上回る。つまり、ネイティブスレッドより低コストで起動、並列化を行える。
　起動については、独自のアドレス空間を確保する必要がなく、わずかな量の仮想メモリを取得するだけ。
　並列化については、カーネルレベルとユーザレベルの切り替えが必要ないことなど。

* さまざまなOS間で移植が楽

#### デメリット
* マルチコアやマルチプロセッサを全くいかせない

 複数のプロセッサに処理をわりあてるなど、OS標準の平行処理を利用する事ができない。PCのプロセッサは、動作周波数の引き上げが物理的な限界に近づくことによって、マルチコアやマルチプロセッサの波が訪れたがそれを生かせない

* 他スレッドのブロック

 I/O処理を実行する場合、他の全てのスレッドをブロックする可能性がある。
　（ただし、グリーンスレッドがI/O関連でかならずブロックされるということでなく正しく非同期IO処理を実行すれば問題ない。何かしらの原因で、ブロックするIO処理をそのまま走らせた場合にOSからは感知できないので完全にブロックされる）
* コンテキストスイッチ（というかグリーンスレッドでのスレッド切り替えは重い）
 http://subtech.g.hatena.ne.jp/mala/20090920/1253447692


## Ruby1.9系〜
### 「ネイティブスレッド」

 MRIにYARVが組み込まれ、これになった。
 いわゆる普通のスレッド処理。OSの実装を生かしたもの。
 グリーンスレッドより、I/Oやコンテキストスイッチの処理に関して、大きく上回る性能を持つ。

#####GIL(グローバルインタプリタロック）

 ただし、現Rubyのネイティブスレッド実装はGIL(または、GVL(Giant VM Lock)とされる)で処理されているので素のネイティブスレッド処理の性能をそのまま生かすことはできない。特にマルチコアとか。　
　
 GILとは、プロセス単位にスレッドセーフでないコードを他のスレッドと共有してしまうのを防ぐための排他ロック。
　ただし、VM単位でがっちりと大きなロックをしてしまうので、複数の
スレッドをもつプロセスの平行性も制限してしまう。
　プロセスをマルチプロセッサのマシンで実行させても、ほとんど（全く）速度は向上しない。
 

 そのかわり、個別のデータごとのロック処理が必要ないためシングルスレッドのパフォーマンスについては良くなる。

ただ、単純なパフォーマンスについては落ちるのでこれ採用した時に下記のような議論や意見などはいろいろあったみたく、このGILをはずしたいという意見はたびたびあがるらしい。

しかし、単純にはずすと下記のような事がおこるので今にいたるという感じみたい。

* Rubyがそもそもスレッドセーフ実装じゃない

 SEGVおきるよ。だし、これからもスレッドセーフな実装を続けるの大変すぎる。
C拡張ライブラリ側でスレッドセーフなら、それを呼ぶときはGILをはずして実行しても良い。
zlibではrb_thread_call_without_gvlをコールしてGVLをはずしている。

* C拡張ライブラリのほうだって、みんなスレッドセーフとは限らない

* 速度向上
 シングルスレッドなら、そもそも今のほうが速いから直してもなー。
どうせ遅いのって、ネットワークとかI/Oまわりでしょ？

など。

なので、Ruby1.9系からのスレッド周りのメリット、デメリットは以下のようになりそう

#### メリット
* コンテキストスイッチが高速
* 場合によって、GILを切ってパフォーマンスを上げることもできる
 http://d.ballade.jp/2013/10/ruby-ext.html

* I/O関連のシステムコールレベルなら、スレッドの並列性を担保できる（ちょっとこれあやしい）

* GIL排除への第一歩？

#### デメリット　
* これはネイティブスレッドでなくYARVのデメリットだが、現在の実装では Ruby VM は Giant VM lock (GVL) を有しており、同時に実行される ネイティブスレッドはほぼ一つ。

### 下記は参考
　
なんでGILつかうの？
 http://qa.atmarkit.co.jp/q/2814

 * C拡張ライブラリ（RubyからC実装で呼べるライブラリが今後もスレッドセーフと限らんし、そうだとしてもたぶんバグるだろう
 * 速度向上（全てのデータ構造に個別にロックを持つ必要がなくなる）
 * 同時に実行されるネイティブスレッドとしては１つ
 * ただし、ビジースレッド状態になってもタイマー管理でスレッドは切り替えられる（rubyプロセスに対して、timerのスレッドが１つある。なので、起動したrubyプロセスは　なぜか2スレッドだったり）
  http://d.hatena.ne.jp/kyab/20140215/1392485665

 * なんのためのネイティブスレッドなのよ
   I/O処理についてはちゃんと並列でやるよと(Parallelとかで
 http://lab.sonicmoov.com/development/ruby-parallel-processing/

 * Ruby のスレッド実装の改善
http://www.atdot.net/~ko1/activities/prosym2011-thread_kaizen_paper.pdf
Phalcon で CSRF 対策を行う

Phalcon で CSRF 対策を行う

## 内容

Phalcon では CSRF 対策としてワンタイムトークンを生成して用いる．

関連するメソッドは下記の通り．

- `Security#checkToken()`
- `Security#getToken()`
- `Security#getTokenKey()`
- `Security#getSessionToken()`

### 使用例

ビュー側では 下記のように生成する．

```php
<input type="hidden" name="<?php echo $this->security->getTokenKey() ?>"
    value="<?php echo $this->security->getToken() ?>"/>
```

volt の場合の例．

```twig
{{ hidden_field(security.getTokenKey(), "value": security.getToken()) }}
```

コントローラ内では以下のようにしてチェックする．

```
if ($this->security->checkToken()) {
  // TODO: CSRF トークンチェックが成功した場合
}
```

フォーム内で生成して `isValid()` したい場合は下記のようフォーム内で `Indentical` バリデーションクラスを用いてチェックするようにする例．

```php
    public function initialize() {
        // CSRF
        $csrf = new Hidden('csrf');

        $csrf->addValidator(new Identical(array(
            'value' => $this->security->getSessionToken(),
            'message' => 'CSRF validation failed'
        )));

        $this->add($csrf);
    }
```

```twig
{{ form.render('csrf', ['value': security.getToken()]) }}
```

`checkToken()` は第一引き数に名前を取るので `csrf` という名前でフォームをレンダリングした場合は `checkToken('csrf')` でもチェックできる．

### 使う場合の注意点

- ビューなどでトークンを埋め込む場合は `getToken()` を用いたほうがよい
  - `getSessionToken()` は `getToken()` を呼ばない限りはセットされないため
- `getToken()` は１ページ内で一回のみの呼び出しとしたほうがよい
  - `checkToken()` や `getSesssionToken()` で使われる値は最後に `getToken()` を呼んだ値となる
  - （追記） 最後に呼ばれた `getToken()` を使うため別タブで開いたりするとバリデーションエラーになる．認証必須なページならログインフォームで一回生成した後ずっと `getSessionToken()` を用いるような実装のほうが利便性は高そう．
- `indexAction()` の場合 `getToken()` を読んでいなくても `getSessionToken()` の値が変更されているらしく， `checkToken()` や Form クラスでの csrf トークンが正しくてもエラーになってしまう様子（詳細動作未確認）．
  -  `indexAction()` 内では csrf トークンを確認するような処理を行わないほうがよさそう． `/` でなにかやりたい場合は Route クラスを用いて別アクションに変更するようにしたほうがよさそう [参考](http://oleaass.com/phalconphp-get-csrf-working-index-page/) ．

ここらへんは [フォーラム](http://forum.phalconphp.com/category/16/security) に書かれてる事が多いのでちょっと見てみると良いかもしれない．

### 付録

一度も `getToken()` が呼ばれていないセッションで POST や GET された値が空の場合になぜか `checkToken()` が true を返す．ただし通常利用では空で送信することはないので問題ないはず．

## 参考

ドキュメント

> セキュリティ — Phalcon 1.3.1 documentation
>
> http://docs.phalconphp.com/ja/latest/reference/security.html#csrf

サンプル

> vokuro/app/forms/LoginForm.php at master · phalcon/vokuro
>
> https://github.com/phalcon/vokuro/blob/master/app/forms/LoginForm.php

volt で書いた時の例

> problems with csrf - Discussion - Phalcon Framework
>
> http://forum.phalconphp.com/discussion/1658/problems-with-csrf

`getToken()` を複数呼ぶことについて

> CSRF tokens and many forms at one page - Discussion - Phalcon Framework
>
> http://forum.phalconphp.com/discussion/345/csrf-tokens-and-many-forms-at-one-page

`checkToken()` が true を返す例外について

> checkToken() is not enough check value for CSRF Attack? - Discussion - Phalcon Framework
>
> http://forum.phalconphp.com/discussion/2388/checktoken-is-not-enough-check-value-for-csrf-attack-

indexAction で `getSessionToken()` がちゃんと動かない

> PhalconPHP - How to get CSRF working on index page | Ole Aass
>
> http://oleaass.com/phalconphp-get-csrf-working-index-page/
FirefoxのGoogle検索ではてブ数を表示(+改良)


Firefoxのはてブアドオンではできなくて、探したら
[Social bookmark counter on Google search. for Greasemonkey](http://userscripts.org:8080/scripts/show/115527)を使うのがよさそうな感じだったから入れた

ページを開いてから徐々に要素の高さが変更されるのがいやだったのとはてブ数以外特に使わなさそうだったから修正

- 修正前

![before.png](https://qiita-image-store.s3.amazonaws.com/0/32836/4f7f043f-9b8c-2f74-2444-4e166a078250.png "before.png")

- 修正後

![after.png](https://qiita-image-store.s3.amazonaws.com/0/32836/b0dcf415-68e4-e092-7841-3ed9d37a3bd0.png "after.png")

```diff
--- 115527.user.js   2014-05-25 12:47:30.000000000 +0900
+++ 115527.user.js   2014-05-25 12:48:04.000000000 +0900
@@ -261,15 +261,15 @@

   try {
     // normal
-    var s = link.parentNode.parentNode.getElementsByClassName('s')[0];
-    var ss = link.parentNode.parentNode.parentNode.getElementsByClassName('s')[0];
+    var s = link.parentNode.parentNode.getElementsByClassName('r')[0];
+    var ss = link.parentNode.parentNode.parentNode.getElementsByClassName('r')[0];
     if (s) {
       var tonode = s.childNodes[0];
-      tonode.parentNode.insertBefore(span, tonode.parentNode.firstChild);
+      tonode.parentNode.insertBefore(span, tonode.parentNode.firstChild.nextSibling);
     }
     else if (ss) {
       var tonode = ss.childNodes[0];
-      tonode.parentNode.insertBefore(span, tonode.parentNode.firstChild);
+      tonode.parentNode.insertBefore(span, tonode.parentNode.firstChild.nextSibling);
     }
     else {
       link.parentNode.insertBefore(span, link.nextSibling);
@@ -576,11 +576,11 @@
   }

   asyncProcArray(params, hatebuCountView, fin);
-  asyncProcArray(params, deliCountView, fin);
-  asyncProcArray(params, facebookCountView, fin);
-  asyncProcArray(params, twitterCountView, fin);
-  asyncProcArray(params, stumbleuponCountView, fin);
-  asyncProcArray(params, redditCountView, fin);
+  // asyncProcArray(params, deliCountView, fin);
+  // asyncProcArray(params, facebookCountView, fin);
+  // asyncProcArray(params, twitterCountView, fin);
+  // asyncProcArray(params, stumbleuponCountView, fin);
+  // asyncProcArray(params, redditCountView, fin);
   // asyncProcArray(params, diggCountView, fin);
 }
```
mac sudoを使えなくなった時の対処(sudoes書き換えの場合)

手順 1：シングルユーザモードで起動
---
` command ` + ` s ` を起動時に長押し  
閉じるときは ` reboot ` と打ってenter

手順 2：マウントしてReadOnlyを変更
---

<pre>
# mount -u /
</pre>

http://murasaki.cocolog-nifty.com/cloud/2009/11/post-d25f.html

> 追記: ここではマウントはするべきじゃなかったかもです。普通に ` chmod ` コマンドでいけたかもしれません。


手順 3：原因のファイルを元に戻す
---
マウントして書き換えできるようになったので、今回私の場合はsudoersを元に戻してあげました。修正して保存したら ` reboot ` と打ってシングルユーザモードを終了します。

手順 4：権限を戻す
---

<pre>
sudo chmod -w /private/etc/*
</pre>

/etcの中は重要なファイルなので変更前の状態の __書き込み禁止__ に戻します。


今回しようとしてたこと 「vim の設定」
---
` /etc/sudoers ` に下記を追記で vim で sudo を使ってファイルを開く時のエラー文みたいなの(直接は問題なかったが、うっとおしかった)を消す。

```file:sudoers
Defaults always_set_home
```

http://suzuyan.blogspot.jp/2013/06/sudo-vim.html

補足
---
http://ult.riise.hiroshima-u.ac.jp/~nagato/?MacOSX%A5%E1%A5%E2

マウントに関すること
---
> コンピュータに接続した周辺機器や外部記憶装置(あるいは、装置に挿入されたディスクなどの記録メディア)をOSに認識させ、利用可能な状態にすること。逆に、接続されている装置などをOSから切り離し、取り外し可能な状態にすることを「アンマウント」(unmount)という。 引用 http://e-words.jp/w/E3839EE382A6E383B3E38388.html
__備考__: 今回はマウントの意味を理解してなくてパーミッションを変える際にやってしまったが今回の様な場合にはマウントはすべきタイミングでは無かった(?)、と思った。一度目パーミッションを変える際にマウントして権限を変えることはできたが、リマウントができなくて悩んだ。形は下記のような感じだと思うのだが・・・んー

> <pre>
sudo mount -r -t msdos /dev/disk0s2 /tmp/mountpoint/
</pre>

> http://askubuntu.com/questions/175739/how-do-i-remount-a-filesystem-as-read-write
__mount: exec /System/Library/Filesystems/auto.fs/Contents/Resources/mount_auto for /: No such file or directory__
http://www.kuzuore.com/~kuzu/diary/?date=20120718

> <pre>
find /System/Library/Filesystems -type d -name '*.fs'
</pre>
mysql ユーザ作成

# すべての権限を持つユーザを追加

1. root権限でmysqlに接続
<pre>mysql -u root</pre>
　
2. ユーザ作成
<pre>GRANT ALL ON * . * TO ユーザID@"localhost"IDENTIFIED BY "パスワード";</pre>
※「*と.」の間に空白はいらないです。

3. 反映
<pre>FLUSH PRIVILEGES;</pre>
※ FLUSH PRIVILEGES でユーザ情報を反映させてるとのこと。
　反映させないままだとＤＢに接続出来ないんだってさ。

※ 参考
　http://phpspot.net/php/pgMySQLユーザの追加.html
Gistはじめてみました、そしてpukiwikiに 

### pukiwikiの設定
plugin フォルダに、「[gist.inc.php](https://gist.github.com/makotokw/231844)」ファイルを作成
pukiwiki.ini.php を編集し PKWK_ALLOW_JAVASCRIPT = 1 に設定

### pukiwikiにはりつけ
あとは、貼り付けたいGits のEmbed this gist部分のscript部分をちょいと参考にして

```lang:text
<script src="https://gist.github.com/makotokw/231844.js"></script>
↓
#gist(makotokw/231844);
とするだけ
```

### 結果
[Gistはじめてみました、そしてpukiwikiに](http://www.sea-bird.org/pukiwiki/index.php?Gist%A4%CF%A4%B8%A4%E1%A4%C6%A4%DF%A4%DE%A4%B7%A4%BF%A1%A2%A4%BD%A4%B7%A4%C6pukiwiki%A4%CB)
Viewのライフサイクル


![ef710e5d-15dc-e504-6050-95b8ae806b50.png](https://qiita-image-store.s3.amazonaws.com/0/44184/5c82f2f1-4345-f417-fff8-735a4b576fc4.png "ef710e5d-15dc-e504-6050-95b8ae806b50.png")


```Objective-C
- (void)loadView
{
    [super loadView];
    NSLog(@"loadView");
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    NSLog(@"viewWillAppear");
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    NSLog(@"viewWillLayoutSubviews");
}

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    NSLog(@"viewDidLayoutSubviews");
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:YES];
    NSLog(@"viewDidAppear");
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:YES];
    NSLog(@"viewWillDisappear");
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:YES];
    NSLog(@"viewDidDisappear");
}
```
Tig: text-mode interface for Git

#tig

コマンドラインから sourcetree みたいな感じで git リポジトリのブラウジングができるツール
https://github.com/jonas/tig

##インストール
インストールはtarボールかgit cloneでローカルにtigのコードを、持ってきて、
$make;make install;

詳細は下記参照。
https://github.com/jonas/tig/blob/master/INSTALL.adoc

##インストール（macのひと）
homebrewにtigがあるので、そちらを使う方が楽だと思います。

```
brew install tig
```