OmniAICreator/Qiita-1.07M huggingface dataset:
Java Bronze対策メモ2

### for文のネスト

2つ目のfor文はfalseになるまで実行される

```Main.java
class Main {
  public static void main(String[] args) {
    int[] array1 = {1, 2, 3};
    int[] array2 = {4, 5};
    for (int x = 0; x < array1.length; x++) {
      System.out.print(array1[x] + " ");
      for (int y = 0; x < array2.length; y++) {
        System.out.print(array2[y] + " ");
      }
    }
  }
}
```

###### 実行結果

```
145245345
```


### オーバーライド

・サブクラスでオーバーライドするには

メソッド名、引数リストが同じであること
戻り値は同じか戻り値の型がサブクラスであればOK
アクセス修飾子はスーパークラスと同じかそれよりも公開範囲が広いもの
スーパークラスのクラス、メソッドにfinalが付いている場合はオーバーライドできない

アクセス修飾子　戻り値の型　メソッド名(引数リスト) { }

### this
自分自身のオブジェクトを指す
オブジェクトが保持する変数、メソッド、コンストラクタを明示的にしていする際に使う


this.変数名


### thisでコンストラクタを呼ぶ

```Main.java
class Main {
  String s;
  int i;
  public Main() {
    this("hello");
  }
  public Main(String s) {
    this("hello", 3);
  }
  public Main(String s, int i) {
    this.s = s; this.i = i;
    System.out.println(this.s + this.i);
  }
}
```

### super

サブクラスから明示的にスーパークラスを呼び出すときに使う

super.メソッド名

superでコンストラクタを呼び出す

サブクラスをインスタンス化するとまずスーパークラスのコンストラクタが実行される


### 抽象クラス

[修飾子] abstract class クラス名 { }

・特徴
インスタンス化はできない
サブクラスでオーバーライドして利用
・抽象クラスをもとにサブクラスを定義するときはextendsキーワードを使う

### 抽象メソッド

[修飾子] abstract 戻り値の型 メソッド名(引数リスト);

* 特徴
修飾子、戻り値の型、メソッド名、引数リストには通常のメソッドと同様に記述する
処理はもたないためメソッドの後ろに<b>「;」(セミコロン)</b>で終わる
継承したクラスは必ず抽象メソッドを実装しなくてはいけない

### インターフェイス

[修飾子] interface インタフェイス名 { }

* 特徴
変数は定数しか定義できない
メソッドは抽象メソッドしか宣言できない
インスタンス化はできず使用する場合は実装クラスを定義する
実装クラス側では抽象メソッドをすべてオーバーライドする
実装クラスを定義するには<b>implementsキーワード</b>を使う
インターフェイスをもとにサブインターフェイスを宣言する場合は<b>extendsキーワード</b>を使う

* インターフェイスでの変数とメソッド
インターフェイス内で変数を定義すると暗黙的に<b>public static final</b> 修飾子が付与される
staticな変数で変数の宣言と同時に<b>初期化</b>しなければコンパイルエラーとなる
アクセス修飾子は<b>public</b>のみです。

* インターフェイスの実装クラス

[修飾子] class クラス名 implements インターフェイス名 { }

implementsで指定したインターフェイスのメソッドをオーバーライドしなくてはいけない
またオーバーライドする際には<b>public修飾子</b>をつける必要がある

### パッケージ化

package パッケージ名;
class Main { }

* 特徴
ｿｰｽﾌｧｲﾙの先頭にpackageキーワードを使う
コメントなどの下に記述でもOK

* 異なるパッケージに所属するクラスを利用する
import文をｿｰｽﾌｧｲﾙの先頭行で記述する

◆ひとつのクラスを利用する場合
import パッケージ名.クラス名;

◆複数のクラスを利用する場合
import パッケージ名 *;
Windows上のRubyでHTTPSのURLを開こうとするとエラーになる

RubyでHTTPS接続をしようとしたらエラーが出たのでメモ。
どうやら、Windows上でEasyInstallを使ってインストールしたrubyに特有の現象のようである。

```
環境：
OS: Windows 7
> ruby --version
ruby 2.2.4p230 (2015-12-16 revision 53155) [x64-mingw32]
```
#問題
サンプルコード

```ruby
require 'open-uri'
url = 'https://example.com/'
html = open(url)
```
これを実行するとエラーが発生する。

```
C:/Ruby22-x64/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
```
httpsなのがポイントで、httpだとエラーにならない。
#原因の特定
エラーメッセージで検索して以下のページを見つけたので、その通り調べてみる。
http://d.hatena.ne.jp/komiyak/20130508/1367993536

irbを立ち上げて以下の通り打ち込んだ。

```irb
irb(main):001:0> require 'openssl'
=> true
irb(main):002:0> p OpenSSL::X509::DEFAULT_CERT_FILE
"C:/Users/Justin/Projects/knap-build/var/knapsack/software/x64-windows/openssl/1
.0.1l/ssl/cert.pem"
=> "C:/Users/Justin/Projects/knap-build/var/knapsack/software/x64-windows/openss
l/1.0.1l/ssl/cert.pem"
```

上記のフォルダに証明書cert.pemがあることになっているが……いや、そんなフォルダはないぞ。
「SSL証明書のファイルがこの場所にあると言われているが、実際には証明書が存在しない」という状態なのでエラーが出ている。

#解決法
https://mcrn.jp/blog/2015/10/28/205049.html に記載の通りに、certified gemを導入した。
証明書のあるフォルダの情報は、dll内に埋め込まれているから書き換えるのは無理みたいだ。
1. gem install certified を実行する。
2. コード内に```require 'certified'```を追加する。
以上の変更をすると、正常に動作する。

余談だが、http://qiita.com/akaneko3/items/a162def655ce791e356f にも同様の事例があった。ただしこの記事の場合は、

```
"C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x64-windows/openssl/1.0.0o/ssl/cert.pem"
```

というフォルダが指定されていた。JustinじゃなくてLuisの場合もあるらしい。EasyInstallでインストールした時期の違いだろうか。
(どちらも、EasyInstallの開発者の名前らしい)


Qiita初投稿なので、拙いですが大目に見ていただければ幸い。
【数C】文系卒社会人が統計・機械学習を理解するために勉強した

#サマリ
統計・機械学習を理解するために数学の知識が足らず勉強を始めました。その経緯などは[「文系卒が統計・機械学習を理解するための数学勉強方法」](http://qiita.com/FukuharaYohei/items/0a66c37091dc27c71fe6)を参照ください。
参考リンク
- 数Ⅰ:[「【数Ⅰ】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/78ec8690043b34d39020)
- 数A:[「【数A】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/c62e042762fb017cef6b)
- 数Ⅱ: [「【数Ⅱ】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/5647cde590902cc42ec4)
- 数B: [「【数B】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/d6f54bcb533209638e20)
- 数Ⅲ: [「【数Ⅲ】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/a623a6948a190fc55a38)
※2003年以前の学習指導要領に準拠しています。

|項目|内容 |
|:-----------------|:------------------|
| 総勉強時間        |            **16.5h**(約1.5か月) |
| 使用教材        |[長岡先生の授業が聞ける高校数学の教科書数学 (考える大人の学び直しシリーズ)](http://amzn.to/2nueRau) <br> 数Ⅲは約160ページの内容です(うち、約30ページは付属DVD内のPDFファイルにしかありません)。|
| 勉強開始前の状態 |数学の勉強は高校以来やっていない状態。数学は嫌いではないが、高校2年生くらいで授業についていくのが辛くなり始めていました。ちなみに高校が付属校なので大学受験はしていません。<br>数Ⅰ、数A、数Ⅱ、数B、数Ⅲは同じ教材で学習済み。|
#やった内容
###1. 行列とその応用
プログラミングで配列をやっている人からすると馴染みやすいです。↓のように数を行と列で並べたっ物を行列と呼びます。

>```math
\left(
\begin{array}{cc}
1 & 22 \\
333 & 4 \\
\end{array}
\right)
```

行列を足したり、掛けたりをしていきます。行列の積では、通常の数同士の席と異なり、順序性により計算結果が変わるので注意が必要です。
そして、行列を使って連立1次方程式を解いたりグラフ上の対称移動・回転移動をします。
###2. 式と曲線
####2次曲線
$y=f(x)$を満たす点の集合体として、軌跡という考え方で方程式を捉えます。放物線、楕円、双曲線をここでは学びます。
####媒介変数表示と極座標
$x=f(t), \; y=f(t)$のように媒介変数$t$を介して関数を表示する場合、**媒介変数表示**と言います。
今まで平面上の点の位置を表すのに直交座標を使っていましたが、ここでは極座標という考え方を学びます。詳しくは[リンク先](http://mathtrain.jp/kyokuzahyo)を参照ください。また、極座標における$r$と$\theta$を使った**極方程式**で直線や曲線を表すこともできる(例：$r=1, \; \theta$は任意で半径1の円を示す)。
###3. 確率分布
####確率の計算
**まずは基本の和事象($A\cup B$)、積事象($A\cap B$)です。**AまたはBの和集合で表されるのが和事象、AかつBの場合が積事象です。
**条件つき確率**$P_A(B)$や*確率の乗法定義**$P(A\cap B)=P(A)P_A(B)$を学びます。
####確率分布
確率変数とその平均・分散・標準偏差は、それぞれ以下の式で表します。

>```math
平均：E(X)=m\\
分散：V(X)=E((X-m)^2)=\sum_{k=1}^n(x_k-m)^2p_k\\
標準偏差：\sigma(X)=\sqrt{V(X)}
```

####二項分布
二項分布は2種類の確率にわけられた場合の確率分布です。数学Aでやった二項定理の発展版です。二項分布$B(n,p)$の平均・分散・標準偏差はそれぞれ以下の式で表します。

>```math
平均：E(X)=np\\
分散：V(X)=npq\\
標準偏差：\sigma(X)=\sqrt{npq}\\
*q=1-p
```

###4. 統計処理
####標本調査
この辺りは統計学の初歩として学ぶ内容です。標本平均の平均・分散・標準偏差を学びます。
####正規分布
正規分布について学びます。平均$m$と標準偏差$\sigma$とする確率密度関数は以下の式となります(残念ながら、証明まではテキストに載っていませんでした・・・)。

>```math
f(x)=\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{(x-m)^2}{2\sigma^2}}
```

そして、平均0、標準偏差が1の**標準正規分布**は上記の式が簡便になって以下の式で表せます。

>```math
h(x)=\frac{1}{\sqrt{2\pi}}e^{-\frac{x^2}{2}}
```

また、正規分布の標準化$N(m,\sigma^2)$に従うとき、$Z=\frac{X-m}{\sigma}$で計算される確率変数$Z$は、標準正規分布$N(0,1)$に従います。
####推定
母平均の推定をします。信頼区間を使って区間推定をします。よく使われる信頼度95%では$\overline{X}\pm1.96\frac{\sigma}{\sqrt n}$の範囲が母平均$m$の信頼区間となります。
そして、母比率の推定もします。大きさ$n$の標本の標本比率が$\overline{p}$であるとき、母比率$p$の信頼区間は95%の信頼度で、$\overline{p}\pm1.96\sqrt{\frac{\overline{p}(1-\overline{p})}{n}}$となります。
#感想
第2章の式と曲線は難しかったですが、**他はそんなにも難しく感じませんでした。**ようやく、**高校数学から統計学につながった**と思いましたが、正規分布の式がなぜ$f(x)=\frac{1}{\sqrt{2\pi\sigma}}e^{-\frac{(x-m)^2}{2\sigma^2}}$となるかが理解できていません。どうもガウス積分というものを前提として理解しないといけないようです・・・
#「文系卒社会人が統計・機械学習を理解するために勉強した」シリーズの最後に
ようやく数学Cを終えて、高校数学の勉強を終えました:grinning:
ひとつの達成感を得ました。その結果、どうなったかは、また別途記事を投稿しようかと思います。そして、まだまだ勉強を続けているのでその内容も投稿します。
AngularJS1.x系の$resource型問題を素敵に解消する


## $resource型問題
素のjavascriptで書いてる場合なら[この](https://github.com/angular/angular.js/issues/9807)対応で問題無いが、

```
var notes = $resource('/notes/:id', null, {
  'update': { method:'PUT' }
});
```

TypeScriptの場合は`ng.resource.IResourceClass<T>`型の制約で`update`なんてメソッド無いぞボケって怒られてしまうよね。

```
this.getResource('publish').update({},
	project,
	()=> {
		success()
	},
	(e)=> {
		error ? error() : null
	}
)
```


するとこのように`any`への変換を強いられ型って一体なんだっけ？という気持ちになる。

```
(this.getResource('delete') as any).update({},
	project,
	()=> {
		success()
	},
	(e)=> {
		error ? error() : null
	}
)
```

## 解決方法
この問題を解消するためにresourceクラスの基底クラスに`ng.resource.IResourceClass<T>`型を拡張して返すFactoryメソッドを定義するというアプローチを取りました。
(といいつつ内部で`any`への変換をしています。。。いい方法あるかな？)

```resource.ts
// extendsしてupdateメソッドを定義する
export interface IResourceClass<T> extends ng.resource.IResourceClass<T> {
	update: angular.resource.IResourceMethod<T>;
}

export default class Resource<T> {
	constructor(protected resource: ng.resource.IResourceService,
				protected path: string) {
	}

	protected getResource(query?: string): IResourceClass<T> {
	    // 結局ここはany変換してしまった。。。
		return <any>this.resource(`/api/${this.path}` + (query ? `/${query}` : ''), null, {
			'update': { method:'PUT' }
		})
	}
}
```

使い方

```user.ts
export default class UserResource extends Resource<User> {
	static $inject = ['$resource']
	constructor(protected resource: ng.resource.IResourceService) {
		super(resource, 'users')
	}

	// 'GET /api/users/:userId'
	get(userId: string, success: (user: User)=>void, error?: ()=> void) {
		let res = this.getResource(':userId').get({
				userId: userId
			},
			()=> {
				success(res)
			},
			(e)=> {
				error ? error() : null
			}
		)
	}

	// 'GET /api/users'
	list(success: (users: Array<User>)=> void, error?: ()=> void) {
		let res = this.getResource().query({},
			()=> {
				success(res)
			},
			(e)=> {
				error ? error() : null
			}
		)
	}

	// GET /api/users/search'
	search(condition: User, success: (users: Array<User>)=> void, error?: ()=> void) {
		this.getResource('search').query(
			condition,
			()=> {
				success()
			},
			(e)=> {
				error ? error() : null
			}
		)
	}

	// POST /api/users'
	create(user: User, success: (user: User)=> void, error?: ()=> void) {
		this.getResource().save({},
			user,
			()=> {
				success(user)
			},
			()=> {
				error ? error() : null
		})
	}

	// PUT /api/users'
	save(id: number,user: User, success: ()=> void, error?: ()=> void) {
		this.getResource().update({
				id: id
			},
			user,
			()=> {
				success()
			},
			()=> {
				error ? error() : null
			})
	}

	// DELETE /api/users'
	delete(user: User, success: ()=> void, error?: ()=> void) {
		this.getResource().delete({},
			user,
			()=> {
				success()
			},
			(e)=> {
				error ? error() : null
			}
		)
	}
}
```


あまりTypeScript版のサンプルが落ちていないのと、日本語情報を見かけないのでメモをば。
16進数のテキストファイルからバイナリファイルを作成する


組み込み系の開発をしているとダンプした記録などからバイナリファイルを作成したいことが、たまにあります。

その度にそれっぽいプログラムを作成したりしているのですが、いつでも使えるように汎用的なプログラムを作成してみました。

https://github.com/imtnd/hex_to_binary

需要があるのかどうかわかりませんが、テキストのファイルからバイナリファイルを作成するプログラムです。

# 使い方

```
git clone https://github.com/imtnd/hex_to_binary.git
ruby hex_to_binary.rb sample.txt
```
Dockerでnginx

#はじめに
Dockerで、centos7立ち上げて、nginxをいれる。
そして、ブラウザで表示されるところまで。

#環境
Dockerはインストール済みということで。
foderaでやってます

cat /etc/redhat-release
->Fedora release 24 (Twenty Four)

#Dockerfile

```
FROM centos:7
RUN yum -y update && \

   #nginxリポジトリ追加
   rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm && \
   #nginxインストール
   yum install nginx -y 


EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
```

いまさらながら、フォアグラウンドでしないとすぐ停止するということを知った。。

buildとrun

```
docker build -t a ./
docker run -d -p 8000:80 --name ab a 
```

#ブラウザで表示
http://localhost:8000/
よし！

#次回
php-fpmコンテナをやるつもり!

#おまけめも
コンテナー削除、
イメージ削除、
コンテナーのシェル、
nginxのバージョン

```
docker rm ab -f
docker rmi a
docker exec -it ab /bin/bash
nginx -v
```


#参考
[Dockerでつくる開発環境【nginxコンテナ編】]
(http://blog.flup.jp/2016/02/12/devenv_nginx_with_docker/)
[そろそろMacでDockerを。その2]
(http://domesticlion.net/blog/2016/04/%E3%81%9D%E3%82%8D%E3%81%9D%E3%82%8Dmac%E3%81%A7docker%E3%82%92%E3%80%82%E3%81%9D%E3%81%AE2/)
[nginxをdockerで動かす時のTips 3選]
(https://heartbeats.jp/hbblog/2014/07/3-tips-for-nginx-on-docker.html)
マルコフ連鎖×形態素解析でテキストを自動生成するライブラリを作った

形態素解析とマルコフ連鎖を使って文章を自動生成するPHPのライブラリを作ってみました。

https://github.com/YuzuruS/Markovchain

[packagist](https://packagist.org/packages/yuzuru-s/markovchain)に登録したので、composerで簡単にインストールできます。

### 事前準備
1. MeCabをインストール ([公式サイト](http://taku910.github.io/mecab/))
2. php-mecabをインストール ([公式サイト](https://github.com/rsky/php-mecab))


### マルコフ連鎖ライブラリをインストール
```
composer require 'yuzuru-s/markovchain:dev-master'
```

これでインストール完了です。

### 使い方
```

require __DIR__ . '/vendor/autoload.php';
use YuzuruS\Mecab\Markovchain;

$mc = new Markovchain();
$text = 'ある村むらから、毎日まいにち町まちへ仕事しごとにいく男おとこがありました。どんな日ひでも、さびしい道みちを歩あるかなければならなかったのです。ある日ひのこと、男おとこはいつものごとく考かんがえながら歩あるいてきました。寒さむい朝あさで、自分じぶんの口くちや、鼻はなから出でる息いきが白しろく凍こおって見みえました。また田圃たんぼには、霜しもが真まっ白しろに降おりていて、ちょうど雪ゆきの降ふったような、ながめでありました。';
$markovText = $mc->makeMarkovText($text);

echo $text."\n";
echo '↓'."\n";
echo $markovText."\n";
```


### 実行結果

```
ある村むらから、毎日まいにち町まちへ仕事しごとにいく男おとこがありました。どんな日ひでも、さびしい道みちを歩あるかなければならなかったのです。ある日ひのこと、男おとこはいつものごとく考かんがえながら歩あるいてきました。寒さむい朝あさで、自分じぶんの口くちや、鼻はなから出でる息いきが白しろく凍こおって見みえました。また田圃たんぼには、霜しもが真まっ白しろに降おりていて、ちょうど雪ゆきの降ふったような、ながめでありました。
↓
ある村むらから、ちょうど雪ゆきのごとく考かんがえながら歩あるいてきました。寒さむい朝あさで、さびしい道みちを歩あるかなければならなかったの口くちや、毎日まいに降ふった。ある村むらから、鼻は、鼻はなから出でる息いきが白しろく凍こおっていて、ちょうど雪ゆきのごとく考かんがえながら歩ある日ひでも、毎日まいには、男おとこはなから出でる息いきが白しろく凍こおってきました。ある日ひのごとく考かんがえながら歩あるいて、ちょうど雪ゆきの降おりていていて見みえました。
```

うまく自動生成できていますね。

### まとめ
マルコフ連鎖はいわゆる「人工無能」に分類されます。
SEOの文書自動生成に使えそうですが、昨今のGoogleのスパムサイト発見技術の向上により、通用しにくくなっております。
悪用厳禁です。
AndroidStudio minSDKのレベルを下げる

作ったアプリの実機テストの際に、API23以下は動かせないよと言われてしまった。minSDK API22を指定したと思ったのだけど・・・。そのため設定を変更したのですが、なかなかググっても答えが出なかったためメモします。

###手順

**File>Project Structure>左側app>タブ内Flavors>Min Sdk Versionを対象とするものに変更する。**



これでOK。マニフェストを変更する方法やグレイドルを変更する方法がWeb上には記述されていましたがうまくいかなかった。そもそもこの設定はアプリケーションを作成する際のAndroidStudio側の設定なのか？これをやる事によってソースファイル側でどこか記述が変更されるかもわからない。もしかしたらアプリ側の記述がマニュフェストだったとか？もう少し自分の知識が進んだら色々試そうと思う。
Androidでグローバル変数を扱う

## はじめに
現在私が開発しているAndroidアプリケーションでグローバル変数を利用したいときがあったので、今回のエントリでは、Androidでグローバル変数を扱う方法を備忘録として投稿します。

1. android.app.Applicationを継承したクラスを作成
2. AndroidManifest.xmlへ上記のクラスを追記

大まかな手順としては上記内容を実装することで対応できます。
具体的な手順については以下で説明していきます。

## 1. android.app.Applicationを継承したクラスを作成
まず、android.app.Applicationを継承したクラスを作成していきます。
android.app.Applicationの詳細については、[リファレンス](https://developer.android.com/reference/android/app/Application.html)に記載されていますので、そちらを参照してください。
私もあまり詳しくないので間違っているかもしれませんが、大雑把に言ってしまうとアプリケーション全体の状態を管理するためのクラスのようです。ですので、アクティビティ間で使いたい共通変数（グローバル変数）などを定義するのに使われるようです。
以下では、android.app.Applicationを継承した UtilCommonクラスを作成し、グローバル変数として boolean型の変数を扱う例を載せています。


```Java:UtilCommon.java
import android.app.Application;
import android.util.Log;

/**
 * グローバル変数を扱うクラス
 * Created by sample on 2016/11/18.
 */
public class UtilCommon extends Application {

    private static final String TAG = "UtilCommon";
    private boolean mGlobal;  // boolean型のグローバル変数

    /**
     * アプリケーションの起動時に呼び出される
     */
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
        mGlobal = false;
    }

    /**
     * アプリケーション終了時に呼び出される
     */
    @Override
    public void onTerminate() {
        super.onTerminate();
        Log.d(TAG, "onTerminate");
        mGlobal = false;
    }

    /**
     * グローバル変数の値を変更
     * @param global 変更する値
     */
    public void setGlobal(boolean global) {
        Log.d(TAG, "setGlobal");
        mGlobal = scanFlag;
    }

    /**
     * グローバル変数の値を取得
     * @return グローバル変数（mGlobal）
     */
    public boolean getGlobal() {
        Log.d(TAG, "getGlobal");
        return mGlobal;
    }

}
```

## 2. AndroidManifest.xmlへ記述
続いて、AndroidManifest.xmlのApplication属性に以下を追記します。

```xml
android:name="UtilCommon"
```

リファレンスによると android:name属性に手順1で作成した、Applicationクラスのサブクラス UtilCommonを指定することで、アプリケーションのプロセスが作成されるときにインスタンス化されるようになるそうです。

```xml:AndroidManifest.xml
    ・
    ・
    ・
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="${appName}"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name=".Util.UtilCommon">
        ・
        ・
        ・
    </application>
    ・
    ・
    ・
```

## 3. おわりに
以上が Androidにてグローバル変数を利用するための手順です。
具体的にアクティビティでグローバル変数を利用するためには、以下のように記述する必要があります。

* アクティビティで最初に宣言（必須）

```Java
UtilCommon common = (UtilCommon)getApplication();
```

* グローバル変数の値を変更

```Java
common.setGlobal(true);
```

* グローバル変数の値を取得

```Java
common.getGlobal();
```

## 参考文献
1. Application _ Android Developers, https://developer.android.com/reference/android/app/Application.html, Online; accessed 19-November-2016.
2. [Android] グローバル変数を使ってActivity間でデータを渡す, https://akira-watson.com/android/global-val.html, Online; accessed 19-November-2016.
3. Applicationクラスを継承して、データの共有をする。 « Tech Booster, http://techbooster.jpn.org/andriod/application/2353/, Online; accessed 19-November-2016.
RLoginやTera Termでタブを押すとなる音を消す

RLoginなどのビープ音を消すには、`~/.inputrc`に`set bell-style none`の設定を追加して再ログインする。
```
echo "set bell-style none" >>~/.inputrc
```


~~以下はwindows10環境でしか確認していません。~~


~~1. ファイル名を指定して実行~~
~~win + r~~
~~2. 名前に`mmsys.cpl`を入力する~~  
~~3. 「サウンド」タブを選択する~~
~~4. プログラムイベント内にある”一般の警告音”を選択する~~
~~5. サウンドを"Windows Background.wav"から"なし"に変更する~~
~~6. OKをクリックする~~  

### 画面イメージ
![image](https://qiita-image-store.s3.amazonaws.com/0/141266/fd1aa614-02d3-e694-af4b-b5bf4e5ae62d.png)
TypeScriptでEither 型の実装

タイトルそのまま

FP in Scala読んだのでTypeScriptで実装して理解を深めたかった。
Fp in Scala 読んでない人には何のことかわからない謎投稿です

全ソースは [gist](https://gist.github.com/1984weed/e7318cd38f160237089b05304fb39de6) におきました。

# 目標👻

`mkAge` : 年齢がゼロより下の場合はエラー
`mkPerson`: 名前がnull or からの場合はエラー

この二つの関数から`mkPerson`　でPersonオブジェクトを生成するロジック。
scalaのコードは以下のような感じ

```scala
case class Person(name: Name, age: Age)
sealed class Name(val value: String)
sealed class Age(val value: Int)

def mkName(name: String): Either[String, Name] =
  if (name == "" || name == null) Left("Name is empty.")
  else Right(new Name(name))

def mkAge(age: Int): Either[String, Age] =
  if (age < 0) Left("Age is out of range.")
  else Right(new Age(age))

def mkPerson(name: String, age: String): Either[String, Person] =
  mkName(name).map2(mkAge(age))(Person(_, _))
```

Either 型を使用することでエラー処理とエラーに対する情報を提供することができます。

# 実装

Either をabstract として作成した。
TSではパターンマッチがないのでfold関数を用意して右と左の判定を行います。

またScalaの *共変アノテーション* で解決している部分は　any　に　一回キャストしてもう一回親クラスの型に合うようにキャストし直すというちょっと残念な感じになりました。。。

Scalaではmap2のcurry化して柔軟に使えますが、curry化するの面倒だったので引数に加えることにしました。

```ts
export abstract class Either<T, U>{
    abstract isRight(): boolean;
    abstract fold<X>(l: (t: T) => X, r: (u: U) => X): X;

    isLeft(): boolean{
        return !this.isRight();
    }

    map<B>(f: (U) => B): Either<T, B>{
        return this.fold(
            (l) => <Either<T, B>><any> this, (r) => new Right(f(r))
        )
    }

    flatMap<B>(f: (U) => Either<T, B>): Either<T, B>{
        return this.fold(
            (l) => <Either<T, B>><any> this, (r) => f(r)
        )
    }

    map2<B, C>(b: Either<T, B>, f: (a: U, b: B) => C): Either<T, C>{
        return this.fold(
            (l) => <Either<T, C>><any> this, (r) => b.flatMap((bb) => new Right(f(r, bb)))
        )
    }
}
```

# 実行する

```ts
import {Either, Right, Left} from './Either'

type Name = string;
type Age = number;
type Person = {readonly name: Name, readonly age: Age };

const mkName = (name: string): Either<string, Name> => {
    if(name === "" || name == null) return new Left("Name is empty")
    else return new Right<string, Name>(name)
}

const mkAge = (age: number): Either<string, Age> => {
    if(age < 0) return new Left("Age is out of range")
    else return new Right<string, Age>(age)
}

const mkPerson = (name: string, age: number): Either<string, Person> => mkName(name).map2(mkAge(age), (a,b) => {return {name: a, age: b}})

console.log(mkAge(9))
console.log(mkAge(-99))
console.log(mkPerson("knhr__", -99))
console.log(mkPerson("", 99))
console.log(mkPerson("knhr__", 27))

// output 

Right { u: 9 }
Left { t: 'Age is out of range' }
Right { u: 'knhr__' }
Left { t: 'Name is empty' }
Left { t: 'Age is out of range' }
Left { t: 'Name is empty' }
Right { u: { name: 'knhr__', age: 27 } }
```

とりあえず目標達成。
t とか u とかのプロパティがかなりいけてないのでここら辺は改善の余地がありそうですが、Eitherを使ってやりたいことは実装できました。

# 感想

またRight や Left はclassとしてexportしているけれども、使用する際には　new 演算子なしで `Left(9)` みたいな感じで使いたいので関数で提供した方がベターかもなっと感じました。

あとEither理解できた!!!
Vagrant 1.8.7 vagrant box add でエラーが発生

WordPressやサイトディレクションの仕事は引く手あまたの実力社会。
最悪の状況になっても仕事を取れるよう準備を始めておこう、
と、やり始めてみました。

普通に考えて、コマンド一発で環境構築できるようなツールは、もうあるだろう、と探してみたら、この分野の人達なら、皆さんがやってそうな手順に到達。

#### FYI:開発環境の構築・共有を簡単にするVagrant入門
https://thinkit.co.jp/story/2015/03/19/5740

Vagrant + WordPressを小一時間でデビューできるぜー！と意気込んでいたところ…


なんじゃこりゃー！
手順通りにやっても全然アクセスできないじゃないか…

```sh
$vagrant box add puphpet/centos65-x64

The box 'puphpet/centos65-x64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/puphpet/centos65-x64"]
Error: 
```

他のboxでも同様。

戦いを始める前に逃亡してしまいそうになりました。

くじけない事は大事！どうせvagrantのバージョンかなんかだろ、と思い調べたら、いい記事が見つかりました。

##### Vagrantのインストール（macOS編）
http://qiita.com/shimitei/items/11c072383195e5830b6e

##### 1.8.7 fails to download or update boxes #7969
https://github.com/mitchellh/vagrant/issues/7969

**ビンゴ！**

```
$ sudo rm -rf /opt/vagrant/embedded/bin/curl
```

これをやったらあっさりすぎるほど簡単に、動作するようになりました。
Vagrant1.8.8 ではこのバグはFIXするようなので、とりあえず消しちゃったファイルはそのままでも気にしない気にしない…
Xcode8.1,Swift3.0.1のCarthage対応

# 概要
最近Xcode8からXcode8.1にあげましてSwiftのバージョンも3.0から3.0.1に上がっていました。Xcode8,Swift3.0では問題なかったのがXcode8.1,Swift3.0.1にあげたことでCarthageで入れているライブラリが一部エラーになったので解決方法を軽くまとめます。

# エラー：Module compiled with swift 3.0 cannot be imported in Swift 3.0.1
このエラーが出ました。
Carthageを使ってい入れているライブラリがSwift3.0.1に対応されてないのかなーと思い、
ライブラリ作成者にissueでも投げようかなーと思ったのですが、どうもその必要はなさそうでした。

# 対応方法
原因としては読んだ通りで、Swift3.0でコンパイルされたモジュールのためSwift3.0.1では動きませんとのことです。
なのでローカルの3.0.1の環境でライブラリをコンパイルしてあげれば解決するようです。

```
$ carthage bootstrap --platform iOS --no-use-binaries
or 
$ carthage update --platform iOS --no-use-binaries
```

`--no-use-binaries`はビルド済みのバイナリのダウンロードをせず、必ずローカルでビルドさせるとうオプションのようです。
なのでこのオプションをいれてローカルのSwift3.0.1の環境でビルドさせれば大丈夫みたいです。

この後cleanしてビルドしたら無事にビルド通りました :smiley: 


# 参考
* [Carthageについて知りたいn個のこと](http://www.slideshare.net/syoikeda/carthagen)
* [Module compiled with swift 3.0 cannot be imported in Swift 3.0.1](Module compiled with swift 3.0 cannot be imported in Swift 3.0.1
http://stackoverflow.com/questions/40250381/module-compiled-with-swift-3-0-cannot-be-imported-in-swift-3-0-1)
Webアプリのバグ調査方法

会社でWebアプリを開発しています。
新人よりバグ

* 知識によるものもあるのですが、
* エラーメッセージを理解していない
* 検討違いのところでデバッグしている

私のバグ調査方法をまとめてみました。

ここでいうバグとは「開発者が期待した通りに動かない」こととします。

開発環境

* Terasolunaフレームワーク(strutsベース, iBatis, spring)
* Tomcat8
* Java8
* Eclipse4.5
* HTML, JavaScript, CSS
* PostgresSQL9.5


# 1. コードが最新の状態であることを確認
キャッシュが残っていたり、古いコードがデプロイされているなど、そもそもコードが新しくない場合があります。
まずはコードが最新であることを確認しましょう。

### サーバ上のファイル(Java, JSP, XML, properties)
1. プロジェクトのリフレッシュ
2. サーバの再起動
3. `%TOMCAT_HOME%/work/`フォルダ内のclass,jspファイルの更新日時が、最新であることを確認
4. テスト環境/本番環境の場合は、`%TOMCAT_HOME%/webapps/[warファイル名]/WEB-INF/classes`


### クライアント上のファイル（HTML, JavaScript, CSS）
1. ブラウザのキャッシュをクリア
    - [Ctrl+F5]を押す(IEの場合クリアされないときがある）
    - ブラウザの設定からキャッシュクリア
    - 対象ファイルのURLに、URLクエリを付与して最新のコードを表示（URLが変わるのでキャッシュしたコードは表示されない）
2. ブラウザの開発者ツールなどで、対象のファイルが最新であることを確認

   
 
# 2. 再現条件を探す

再現条件が分からないと、デバッガなどを使った調査ができません。
  「Aボタンを２回押したときバグが発生する」のような、ざっくりとした条件でよいので、再現条件を探しましょう。

この段階では、「バグが発生しない条件」は探す必要はありません。
たとえば「ブラウザAではバグが起こるけど、ブラウザBでは起こらない」などです。
知っているに越したことはありませんが、知らなくてもエラーメッセージやデバッガを使えば、解決できるバグがほとんどです。
ここでの再現条件は、「エラーメッセージの確認」や「デバッガを使った調査」ができる程度の条件でよいです。

再現しないバグもたまにはありますが、直接メモリを操作しないJavaを使っているので、そうそうないでしょう。
 
 
# 3. エラーメッセージを確認する
 
 エラーメッセージをよく読み、何が原因かを考えましょう。
 また、エラーメッセージに「答えとなる原因」が書いてあるときが、意外に多いです。
 英語メッセージのため理解しづらいかもしれませんが、斜め読みせずによく読みましょう。
 
### サーバ側のエラーメッセージを確認
以下のいずれかで、エラーメッセージを確認します。

* Eclipseのコンソールウィンドウ
* テスト環境/本番環境の場合は、`%TOMCAT_HOME%/log/*stdout*.log`,`%TOMCAT_HOME%/log/*stderr*.log` 
 
 
 Exceptionのスタックトレースが出力されていなければ、出力するようにしましょう。
 スタックトレースでは、どのメソッドから呼ばれて、ソースの何行目でエラーが発生したという、情報が分かります。
 スタックトレースの読み方は、下記サイトが参考になります。
 http://www.atmarkit.co.jp/ait/articles/0605/20/news012.html
 
 
 わんさかエラーが出ている場合、一番最初に出力されたエラーメッセージを確認してください。
 そこがエラーメッセージの「元」です。それ以降のエラーメッセージは、エラーが発生したことによる別のエラーメッセージで、確認してもあまり意味はありません。
 
 

#### SQL関係のエラーが発生した場合
 
 * データベースに接続できていない
    - データベースは起動しているか。OSのサービスなどを確認。
    - ホスト名、ユーザ名、パスワードを間違っていないか？
 * 呼び出すSQL文が存在していない
    - 呼び出すSQL文のID名は、Java側とXML側(SQL外部ファイル)で一致しているか？`namespace`属性も確認。
    - SQL文を書いた外部ファイルが読み込まれているか。`webapps/WEB-INF/sqlMapConfig.xml`を確認。

* parameter mapでエラー（JavaからSQL側に入力値を渡す部分）
  - `parameterClass `属性に書いたクラス名は存在しているか
  - `<parameter>`タグの`property`属性値は、Java側と一致するか？またJava側でpublicのgetterが用意されているか？

* result mapでエラー(SELECT文の結果をJava側に渡す部分)
   - `resultClass`属性に書いたクラス名は存在しているか 
   - `<result>`タグの`property`属性値は、Java側と一致するか。またJava側でpublicのsetterが用意されているか？
   
   
### クライアント側（JavaScript）のエラーメッセージを確認する   
ブラウザの開発ツールからコンソールを開いて、エラーメッセージを確認しましょう。
なお、クライアント側のエラーメッセージは、通常スタックトレースではなく「～ is not defined」のような一文なので、サーバ側と比べると分かりづらいです。
（try-catchを使えばスタックトレースを出力できるが、一般的ではない？）

 
# 4. デバッガを使って
エラーメッセージを読んでも理解できなかった場合は、デバッガを使ってバグの原因を調査しましょう。


 
 # 参考サイト
 http://qiita.com/jkr_2255/items/4b8a8245a48a1df29b3e
 http://www.avnet.co.jp/embedded/column/Theme5/04.aspx
初心者がオブジェクト指向について考える！

初めまして！
kazuhiと申します。

最近プログラミングの勉強を始めまして、絶賛勉強中です。
outputする機会がないので、Qiitaで週一くらいで勉強した事を書いていこうと思います！

現在Javaを勉強しており、オブジェクト指向について自分なりに
解釈したことをざっくり書いていこうと思います。

*見当違いな事が書いてそうだけども、書くことが大事！・・なはず*

#・オブジェクト指向ってそもそも何のために使うんよ？

確かに利点がわからないものを使う気にはなれませんね！
目的と手段が逆になっては意味がありません。

ざっくり言うと
1.『仕様を変える必要がある時に、楽に変えるためテンプレートを作っておく』と、
2.『何かを作る時の思考方法の固定(流れの把握)』
と個人的には考えております。

#　オブジェクト指向のいい点

１．オブジェクトからの視点で考えるため変更に強い

継承やカプセル化やらなんやら色々ありますが、
初心者の観点からざっくりジャンケンで例えてみます。

◆登場人物を考える

・プレイヤー１
・プレイヤー２
・審判

上記3人がぱっと思いつきます。

------------------------------------------------------------
####・プレイヤー１、２について
ざっくり言うとプレイヤー1と２は大体同じ行動を取ります。

例)グー、チョキ、パー、どれかを出す。

では、元となるプレイヤーのテンプレート(テンプレA)を作っておくことで、
例えばバトー、タチコマ、トグサ等の名前のプレイヤーを簡単に作る事ができます。
・・・・コントラクタ

また、『タチコマ、お前ジャンケン買ったら天然オイルやるよ』と
某バトーさんに言われても、元のテンプレートがあるのですぐに追加できます。
・・・・継承

------------------------------------------------------------

------------------------------------------------------------
####・審判について

審判の観点からは、タチコマだろうとトグサだろうとジャンケンするのには変わりがないので、
勝敗の結果、タチコマが天然オイルを貰っても、負けた腹いせに某バトーさんが筋トレグッズを大人買いしても
審判から見て何もすることは変わりません。

また変わったとしても審判のテンプレ(テンプレB)があるのですぐに追加できます。

審判視点から言うと、『テンプレAの一人目(バトー)』と『テンプレAの二人目(トグサ)』の
出した手を判定するので、気にすることはない。

------------------------------------------------------------

###◆テンプレートを作成しそれを基本にする利点要約
・ある程度の拡張幅がある
・処理をする側もテンプレを元に判断しているので、書き換える必要がない

まず、利点１を自分なりに書きました、細かい処理とかはたくさん解説している書籍、サイトが
あると思うのでそれを見ていただければと思います。
Debian8.6 ThinkPadX200 TrackPadスクロール用ドライバインストール方法

1 . xipnutをインストールする。 $ sudo apt-get install xinput

2 . ~/.bashrcに追記する。

# capslock to ctrl
setxkbmap -option ctrl:nocaps

# To enable vertical scrolling
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation" 1
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Button" 2
xinput set-prop "TPPS/2 IBM TrackPoint" "Evdev Wheel Emulation Timeout" 200

3 . $ source ~/.bashrc
【PostgreSQL】【障害】WAL破損

◆破損
echo "test">000000070000000000000017

◆ログ
cp: cannot create regular file ‘/tmp/pg_bkup_data/archdir/000000070000000000000017’: No such file or directory
LOG:  archive command failed with exit code 1
DETAIL:  The failed archive command was: cp pg_xlog/000000070000000000000017 /tmp/pg_bkup_data/archdir/000000070000000000000017

※DB操作は更新処理含め、普通に継続できる。
　上記ログが定期的に出力される。

◆DB停止
pg_ctl stop

◆ログリセット
・トランザクションID調査
-bash-4.2$ cd pg_clog/
-bash-4.2$ ls -lrt
total 8
-rw-------. 1 postgres postgres 8192 Oct 30 05:05 0000
-bash-4.2$

・リセット
IDに1を足して後ろにゼロを5つ
pg_resetxlog -x 0x100000 ${PGDATA}

◆DB起動
pg_ctl start
Visual Studio for MacでXamarinのチュートリアルアプリを作ってみた

##概要

[Visual Studio for Mac PREVIEWをインストールしてみた](http://qiita.com/BlackCat/items/f3fc674ea6b6724f3132)で、チュートリアルは別記事にするって書いたので、その別記事。
つまづいたところなど、手が止まったところをメモして残す。

参照：
[Xamarin.Forms Quickstart](https://developer.xamarin.com/guides/xamarin-forms/getting-started/hello-xamarin-forms/quickstart/)

##XAMLつらい

チュートリアルの最初の一歩でいきなりつまづく。
なにこれ、つらい。

つらいポイント。
ずばり **補完が効かないものがある**、これに尽きる。
`OnPlatform`タグってよく使うんじゃないの？
`StackLayout`タグってよく使うんじゃないの？
なんで補完効かないの？

同じようにXMLでレイアウトを行うAndroidではちゃんと補完効くよね（Android Studio）。

つらいなぁ。

##コードスニペットが動作していない

コードスニペットは、例えば

```cs:コード
if
```

と入力した際に

```cs:コード
if ($expression$) {
	$selected$$end$
}
```

こんな風にテンプレートを入力してくれる機能。

これが動作していない模様。
ユーザー設定の中には登録されていて、入力中にサジェストもされるんだけどね。

ツールボックスパレットからスニペットを選択するとスニペットが動作した。

##新規ファイルの追加時にパス指定が動作していない？

* using Foundation;
* using UIKit;

に`using ディレクティブは不要`とサジェストが表示されていた。
サンプルでは書いてあるし、他のサンプルを見ても書いてあるので、これは必要だろうと判断。
いろいろ調べてもわからず、「なんでやー」とお手上げ状態でボーッと画面を見てたら、気づいた。
ファイルの追加されているパスが違う。
`〜.iOS`内にファイルを追加したつもりが、違うところに生成されている。
ファイル作成ダイアログでちゃんと参照したはずなのに。

ショートカットを使わずに、ソリューションパネルからファイルを生成したいディレクトリを選んで、コンテクストメニューの追加から、ファイルを追加したほうがいいかも。
これだと思ったところにファイルが作成された。

##チュートリアル記事との差異

以下、見出し行頭の数字はチュートリアル内の項番と連動

###13. In App.xaml.cs, 〜 

下記の行は必要ないみたい。
新規でソリューションを作成した際に追加されていなかったので。

* using Xamarin.Forms.Xaml;
* [assembly: XamlCompilation(XamlCompilationOptions.Compile)]
* InitializeComponent(); 
	* これのみ、書くとエラーになった

##iOSの実機ではデバッグできない？

ブレークポイント設置しても止まらない。
シミュレーターでは止まる。
挙動も不安定。
あとiOSだけなのか、数分すると勝手にデバッグが終了してしまう。

iOS10.0.2
iPhone 6

##Androidでは特に問題ない模様

Nexus7
4.4.2 

##ソースコード

あげときます。
[https://github.com/macneko-ayu/XamarinTutorial](https://github.com/macneko-ayu/XamarinTutorial)

##まとめ

チュートリアルを写経したものの、Xamarinが使いやすいかそうでないかの判断はつかなかった。
共有UIでどこまでいけるのか、が肝なのかなー。
UIを各OSにあわせて独自でゴリゴリするんだと、ネイティブのほうがいいかも。
Visual Studio for Macは動作がもっさりしている印象なので。
ビジネスロジックを一回書けばいいのは大きな魅力なんだけどな。
次は通信を絡めたサンプルを作るつもり。
【しずおかアプリ部】活動ログ　第29回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)


##■タイトル##
第２９回


##■開催日##
２０１６年１１月１９日（土）　１６：００～１８：００


##■参加者##
９名


##■活動内容（概要）##
・菅原プレゼン「Unityはじめるよ～NavMesh応用～」
・部員さんプレゼン「Gitでバージョン管理～リベース編～」
・部員さんプレゼン「リバーシを作ってみた」
・部員さん提供「PS4ProによるVR体験&OculusRiftによるVR体験」
・雑談

##■活動内容（詳細）##

【実演・プレゼン】

**・菅原プレゼン「Unityはじめるよ～NavMesh応用～」**

　　前回のプレゼンで解決できなかった、オフメッシュリンクにまつわる問題の調査結果を発表。

　　・オフメッシュリンク間を不自然な動きで移動してしまう問題
　　　スクリプトを使って解決する。
　　　手順
　　　　　1、自動でオフメッシュリンクを超えないように NavMeshAgentの設定を変更する
　　　　　2、NavMeshAgentがオフメッシュリンクにたどり着いたか調べる
　　　　　3、NavMeshAgentからオフメッシュの始点と終点情報を受け取り、
　　　　　　　　スクリプトでオフメッシュリンクの終点まで移動
　　　　　4、NavMeshAgentにオフメッシュリンクを超えたことを通知
　　　手順３の移動処理に関しては、ゲームごと異なる実装になる。

　　・オフメッシュリンクを自動で作成した場合、飛び乗るオフメッシュリンクが作成されない問題
　　　　結論：手動で作るしかない。
　　　　自動でオフメッシュリンクを作成するGeneratedOffMeshLinksの設定項目「JumpDistance」は
　　　　飛び乗る高さを表しているものではなく 飛び越える距離を表すプロパティでした。
　

　　資料：[第29回_プレゼン資料(Unityはじめるよ～NavMesh応用～).pdf](http://monolizm.com/sab/pdf/第29回_プレゼン資料(Unityはじめるよ～NavMesh応用～).pdf)
　　プロジェクト一式：[NavMeshTest(応用編2)完成版.zip](http://monolizm.com/sab/src/NavMeshTest(応用編2)完成版.zip)
![スクリーンショット 2016-12-03 19.53.26.png](https://qiita-image-store.s3.amazonaws.com/0/88105/bd17a9ce-3880-db36-389e-d6f8e88594a7.png)


<hr>
　
**・部員さんプレゼン「Gitでバージョン管理～リベース編～」**

　今回の目的１　「リベースを覚える」
　　リベースとは、
　　　最新に対して再コミット (rebase) すること。
　　自分のブランチで行ったコミットを、別のブランチ(任意のコミット地点)に対して全てコミットし直す。
　　複数ブランチで運用中の履歴がキレイになる。

　今回の目的２　「競合の解決」
　　　リベースやマージを行った際に、他人と同じ箇所を変更してコミットし合った場合に競合がおこる。
　　　どちらの変更を適用するか、または手動で編集して競合を解決する必要がある。
　　　同じファイルを同時に変更しない予防が大切。


　　今回は部員が体験する部分が多く、やりごたえのある内容でした。
　　やはり「見る・聞く」だけより「体験」した方が覚えやすいですね。


　　資料：[第30回_プレゼン資料(Gitでバージョン管理～リベース編～).pdf](http://monolizm.com/sab/pdf/第30回_プレゼン資料(Gitでバージョン管理～リベース編～).pdf)
　　プロジェクト一式：[Git_Rebase.zip](http://monolizm.com/sab/src/Git_Rebase.zip)

<hr>


**・部員さんプレゼン「リバーシを作ってみた」**

　スクラッチで作ったリバーシについて。

　　CPUの手をAIで実現。
　　AIとして有名なのが、
　　・ディープラーニング
　　・先読み
　　・評価
　　という方法がある。

　　今回は評価という方法を実装。
　　盤面上に得点をつけ、その手を打った場合の得点を計算し、一番高得点になる手を選択するという方法。


　　一手しか読まないので強いAIにはならないが、リバーシ初心者なら良い勝負ができる。

　　これをスクラッチで実装してしまうのだからスゴイ。

　　資料：[第29回_プレゼン資料(リバーシを作ってみた).pdf](http://monolizm.com/sab/pdf/第29回_プレゼン資料(リバーシを作ってみ)た.pdf)



<hr>
　
**・部員さん提供「PS4ProによるVR体験&OculusRiftによるVR体験」**

　　「PS４Pro + PSVR」　と 「PC + OculusRift」の２種類のVRを体験

　　　PS4Proでは性能が上がった分、よりリアルなVR体験を提供。
　　　Kitchenというホラーゲームは本当に怖い。
　　　体験者にしかわからないが、その世界に入り込む没入感がすごい。

　　　Oculusの方ではミクラスという初音ミクを眺めるVR体験。
　　　製作者が１年以上かけて仕上げたミクだけあって、非常に高精細で綺麗なモデルだった。
　　　そこにいる感は圧倒的。
Android Studioでの外部ライブラリの読み込み方と注意点

Android Studioで外部ライブラリを利用する際にはまったのでメモ.
ついでにライブラリの利用方法についてまとめてみた.

### 環境
* Android Studio 2.2.2
* gradle 2.14

# 問題点
Android Studioで外部ライブラリを利用するには, 2つの方法があります.

1. ツールバーのFile→Project Structureから指定
2. build.gradleに直接記入

今回は2番のやり方をした際にインポートが行われず, 外部モジュールの参照が原因でビルドでエラーがおきました.

#ライブラリのインポート方法
ハマったのは2番のやり方ですが, ついでに1番のやり方もメモ.

## 1. ツールバーのFile→Project Structureから指定する場合

ツールバーのFile→Project Structure→dependenciesタブを選択.
+ボタンを押してLibrary Dependenciesを選択.

<img width="720" alt="SS 2016-11-19 19.39.05.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/135313/dffd7252-7208-ea43-fb4b-602d27944f18.jpeg">

読み込みたいライブラリを検索して選択.
![SS 2016-11-19 19.40.02.jpg](https://qiita-image-store.s3.amazonaws.com/0/135313/ca966092-3042-414e-d786-f1e74a6bedc1.jpeg)


# 2. Gradleに記述する場合
`build.gradle`に外部ライブラリの以下の情報を記述.

 * groupId
 * artifactId
 * version

実際の例はこんな感じ

``` gradle
dependencies {
    compile files('libs/protobuf-java-2.6.1-javadoc.jar')
    compile files('libs/protobuf-java-2.6.1.jar')
    compile 'org.apache.mina:mina-core:2.0.15'
    compile 'org.mongodb:bson:3.2.2'
}
```

`build.gradle`を編集した後にツールーに**syncボタン**が表示される場合はクリック.


## 外部ライブラリが読み込まれない場合の対処法.
私の場合はsyncボタンが表示されず, ビルドしてもエラーが.

的当に触っていたら,以下の方法で解決.

1番のやり方同様に, ツールバーのFile→Project Structure→dependenciesタブを選択.
`build.gradle`で指定したライブラリが表示されているはずなので, 適切なものを選択してから, もう一度**Comple**を選択.

<img width="720" alt="SS 2016-11-18 21.49.48.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/135313/1f2b8497-bffc-508e-eabf-dc20f8e6fe6d.jpeg">

あとはOKを押すと自動的に外部ライブラリの読み込みが始まります.
CentOS 7で公式リポジトリから入れたMariaDB 10.1に最新のMroongaをインストールする

# 前提

- MariaDB公式リポジトリからMariaDB 10.1をインストールしている
- Groonga公式リポジトリからGroongaをインストールしている
- Mroongaのビルド環境が準備されている
- CMake、Clangがインストールされている

# MariaDBソースの展開
インストールされているMariaDBのソースをダウンロードし展開します。

	cd /usr/local/src
	sudo curl -L -O http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/mariadb-10.1.19/source/mariadb-10.1.19.tar.gz
	sudo tar xvfz mariadb-10.1.19.tar.gz

このままだとMroongaのビルド時にprobes_mysql_nodtrace.hが無いと言われてしまうので生成します。
なお、CentOS 7標準のGCCだとCMakeの途中でエラーになったのでClangを指定しています。

	cd /usr/local/src/mariadb-10.1.19
	sudo CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake . -DENABLE_DTRACE=0

# Mroongaのインストール
Mroongaのソースをダウンロードし、先ほど展開したMariaDBのソースを指定してビルド&インストールします。

	cd /usr/local/src
	sudo curl -L -O http://packages.groonga.org/source/mroonga/mroonga-6.10.tar.gz
	sudo tar xvfz mroonga-6.10.tar.gz
	cd /usr/local/src/mroonga-6.10
	sudo ./configure --with-mysql-source="/usr/local/src/mariadb-10.1.19/"
	sudo make
	sudo make install
Windows10 で、スクロールバーの幅を太くする方法

Windows10は、スクロールバーの幅が狭いです。
レジストリを変更することで、幅の調整を行います。

キー HKEY_CURRENT_USERのControl Panel\Desktop\WindowMetrics
値の名前 ScrollWidth
種類 REG_SZ（文字列型）
値のデータ -252（デフォルト）→ 変更後 -400

以上
Raspberry Piで音声認識 (Julius)



* 準備: [raspberry pi で USBカメラ(c270)から画像/音声入力/出力](http://qiita.com/kummn/items/6eaf7b1cbb8435c78f12)
* (参考) [Juliusによる音声認識～国産オープンソースライブラリの活用](http://www.feijoa.jp/laboratory/raspberrypi/julius/)
* (参考) [Raspberry Piで音声認識](http://qiita.com/t_oginogin/items/f0ba9d2eb622c05558f4)
* (参考) [Raspberry piで日本語音声合成(Open JTalk)を試してみる。](ttp://qiita.com/lutecia16v/items/8d220885082e40ace252)


## [julius](http://julius.osdn.jp/index.php)をinstall


[Julius本体](https://github.com/julius-speech/julius/releases) のインストール

```shell-session
$ wget https://github.com/julius-speech/julius/archive/v4.4.2.tar.gz
$ ./configure
$ make
$ make install
$ julius -version
```

/dev/dspを使えるようにする．(起動時にも)
```
$ sudo modprobe snd-pcm-oss
$ sudo sh -c "echo snd-pcm-oss >> /etc/modules"  
```

[Juliusディクテーション実行キット](http://julius.osdn.jp/index.php?q=dictation-kit.html) : サイズが2G超えるようです.
```
$ wget https://osdn.net/frs/redir.php?m=iij&f=%2Fjulius%2F66544%2Fdictation-kit-v4.4.zip
```

[記述文法音声認識実行キット](http://julius.osdn.jp/index.php?q=grammar-kit.html)
```
$ wget https://github.com/julius-speech/grammar-kit/archive/v4.3.1.zip
```

## juliusを動かす

自由認識のデモ : dictationを使った自由文章．遅い．
```
$ cd dictation-kit-v4.4
$ julius -C main.jconf -C am-gmm.jconf -demo
```

snd-pcm-ossを入れて/dev/dspが見えているのに，エラーになる場合は，マイクのデバイスが /dev/dsp1 などになっている．AUDIODEVで設定．

```
$ export AUDIODEV=/dev/dsp1
$ julius -C main.jconf -C am-gmm.jconf -demo
```

文法音声認識キットのサンプル : リンゴやミカンの個数に限った認識．
```
$ cd grammer-kit-v4.4
$ julius -C testmic.jconf -charconv SJIS UTF-8
```

## juliusの辞書作成

* [ラズパイで音声認識をしてみる](http://usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi_Julius.html)
*
Automatorでスクショ画像一括リサイズ

# リサイズをGUIでやりたい

よくmarkdownなどで貼る画像を一括リサイズしたい時がある.
コマンドラインをいちいち起動するのが面倒、
Automatorでスクリプト書くと便利だったのでメモ.

# Automatorの作成

## 1. Serviceを選択

<img width="1106" alt="スクリーンショット 2016-11-19 20.11.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/f7981c3d-81a9-6724-aeb7-32e9874f8fe8.png">

## 2. シェルスクリプトをワークフローに

![スクリーンショット 2016-11-19 20.11.58.png](https://qiita-image-store.s3.amazonaws.com/0/15000/6b9cf1ef-e11d-96e8-bb01-48a23d9e0917.png)

## 3. パラメータの設定

イメージファイルを受け取り、検索対象はFinderに。
入力の引き渡しを「引数として」
スクリプトには下記を登録。
convertが登録されていない場合は、`brew install imagemagick`

```zsh
count=0

for filename in "$@"
do
    count=$(( count + 1 ))
    extension="${filename##*.}"
    /usr/local/bin/convert -geometry 480x480 "$filename" $(dirname $filename)/${count}_480.${extension} 2>/tmp/automator.error
done
```

<img width="605" alt="スクリーンショット 2016-11-19 20.15.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/95de4947-d492-e08f-5fa4-2657467f419c.png">

スクリプト名は適当に Resize480 とした。

# 実行

スクショを複数選択して右クリック.
Resize480を選択.

<img width="342" alt="スクリーンショット 2016-11-19 20.32.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/92f892e1-f818-d132-1ec3-0fe04269e348.png">

こんな感じで一気にリサイズできて便利.

<img width="270" alt="スクリーンショット 2016-11-19 20.25.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/07b788c3-134b-8abc-326a-4a575bf29a19.png">
WordPressとCakePHPを連携させる

##何が出来るか
+ CakePHPで書いた処理をWordPress側で呼び出すことが出来る
+ WordPressの機能・Pluginでは取得できないデータを取得することが出来る
+ 自分好みに取得したいデータをCakePHPで記述できる

##開発環境
+ WordPress 4.5.3
+ CakePHP 2.8.4


##ディレクトリ構成

```
root/
　├ wordpress/　//WordPressのインストール先
　├ cakephp/
　│　└ app/
　│　　　└ webroot/
　│			└ index.php
　│			└ test.php //新たに作成するファイル
```


##CakePHPの設定

/cakephp/app/webroot/index.phpの下記の記述を削除したtest.phpを作成する

```/cakephp/app/webroot/test.php

//この記述を削除した、新たなファイルを作成

App::uses('Dispatcher', 'Routing');

$Dispatcher = new Dispatcher();
$Dispatcher->dispatch(
	new CakeRequest(),
	new CakeResponse()
);

```

WordPressで呼び出す処理を記述する

```UsersController.php

function getUsers(){
	
	//Modelでユーザー情報を取得する処理を記述
	$users = $this->Tests->getUsers();
	
	return 	$users;
}

```

##WordPressの設定

プラグインに呼び出すコントローラーの処理を記述する

プラグインの入れ方は公式Wikiにて
[プラグインの入れ方](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E7%AE%A1%E7%90%86)


先程記述を変えた、test.phpを読み込む

```testcake.php

class WPCakePHP{
	var $controller;
	
	function getUsers()
	  {
	    require_once ($_SERVER["DOCUMENT_ROOT"].'/cakephp/app/webroot/test.php');
	    /*こちらの記述でも可能
			require(ABSPATH.'../cakephp/app/webroot/test.php');
		*/
	    App::import('Controller', 'Users');
	    $this->controller = new UsersController();
	    $users = $this->controller->getUsers();
	    return $users;
	  }

```

これをプラグインに入れて有効化する。

##WordPressでの呼び出し方

好きなテンプレート内で先のプラグインの処理を呼び出す

```(呼び出したいテンプレート)page.php

function getUsers()
{
    require_once ($_SERVER["DOCUMENT_ROOT"].'/wordpress/wp-content/plugins/testcake/testcake.php');
    /*こちらの記述でも可能
	    require_once(ABSPATH.'/wp-content/plugins/testcake/testcake.php');
    */
    $cakeObj = new WPCakePHP();
    $users = $cakeObj->getUsers();
    return $users;
}

	$users = getUsers();

	echo '<ol>';
	foreach($users as $user){
		echo '<li>'.$user['Users']['name'].'</li>';
	}
	echo '<ol>';

```
WPFの画像相互コンバーター。System.Drawing.BitmapからSystem.Windows.Controls.Imageへの変換。

WPFで画像を扱おうとしたら、とても種類が多いことがわかったので、相互コンバーターを作ることにした。
まず最初は定番のSystem.Drawing.BitmapからSystem.Windows.Controls.Imageへの変換。


		[System.Runtime.InteropServices.DllImport("gdi32.dll")]
		public static extern bool DeleteObject(IntPtr hObject);
		public static System.Windows.Controls.Image
			SystemDrawingBitmap2SystemWindowsControlsImage(System.Drawing.Bitmap original) {

			IntPtr hBitmap = original.GetHbitmap();
			var newimage = new System.Windows.Controls.Image();
			try {
				newimage.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
					hBitmap,
					IntPtr.Zero,
					Int32Rect.Empty,
					System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
			}
			finally {
				DeleteObject(hBitmap);
			}
			return newimage;
		}
Lambdaで環境変数が使えるようになった

# 概要

[New for AWS Lambda – Environment Variables and Serverless Application Model (SAM)](https://aws.amazon.com/jp/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-application-model/)

これ、Lambderにとっては結構なニュースです。今までLambdaで環境変数を使うとしたら次のような手法を取るしかありませんでした。

* API Gatewayからステージ環境変数を渡す
* Lambdaの `Description` に環境変数を書いてアプリケーション側でパースする
* 環境変数ファイルをCIで動的生成

それがついに公式に環境変数がサポートされたので、このような対応は今後不要になりました。

# 使い方

とても簡単。Lambdaファンクションの `Code` タブに環境変数の項目が追加されてるので、キーと値のペアを入れるだけ。
<img width="1312" alt="スクリーンショット_2016-11-19_19_59_30.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/27454/464e29c0-912f-8a15-11ce-972e71660c5f.jpeg">


NodeJSで環境変数を取得してみる (上図参照)。

```
console.log(`NODE_ENV: ${process.env.NODE_ENV}`)
```

# CloudFormationで環境変数をセットする

最近趣味でサーバレスな [ヘルスケアアプリ](https://github.com/naomichi-y/dokidoki_watch) を作ってるんですが、デプロイにCloudFormationを利用していたので、デプロイ時に環境変数がセットされるよう対応してみました (今まではAPI Gatewayのステージ変数を使ってた)。
CloudFormation経由でLambdaに環境変数をセットするには [Environment](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-environment.html#cfn-lambda-function-environment-variables) プロパティを使えば良いらしいです。[テンプレートの修正例はこちら](https://github.com/naomichi-y/dokidoki_watch/blob/develop/config/cloudformation/cloudformation.json#L133)。
【決定版】VBRのエンコードパラメーター (Opus, qAAC, Vorbis, LAME)

- CBR(固定ビットレート)は無駄が多い
    - エントロピーが低い音声であっても無駄な（音質には寄与しない）サイズになる
        - その部分は、無意味なデータでパディングされているので本当に単にサイズがデカくなるだけ
    - 極端な話、無音ファイルだったとしても、固定でビットレートを利用する
- この記事ではVBR(可変ビットレート)で低エントロピーな音声でもサイズが増えない最強の設定をさがす

| Codec | <96k | 96k-160k | 160k-192k | 192k-256k |
|:-:|:-:|:-:|:-:|:-:|
| Opus | ◎ | ◎ | ◎ | 〇 |
| Vorbis | △ | 〇 | ◎ | ◎ |
| LAME | × | × | × | ◎ |
| LC-AAC | × | △ | ◎ | ◎ |
| HE-AACv1 | 〇 | × | × | × |

# flac 1.3
文句なしの `-8`

- ほかにもマニュアルでいろいろパラメータが指定できるが、非常に時間がかかる割に、サイズが縮まなかったり、逆に増える音声もある
- また、FLACでは `-1` や `-8` でデコードの負荷はほとんど差がないため、`-8` で良い

無音ファイル = **79kbps**

# Opus 1.1
おすすめ設定: 多くの音楽で **96 - 128kbps**、静かな曲ではないなら **160kbps** も可

## Opus: 音楽
- `--bitrate 96 --vbr` ～ `--bitrate 160 --vbr`
  - 96～160kbps がおいしいゾーン
  - YouTubeは 160kbps を利用。Googleなりに結論が出たんだろう。
- 160～240 にしても良いが、静かな音楽や無音ファイルでVBRのMP3やAACより大きなファイルが出来上がるので推奨できない
- このビットレートではCELTが使われる

無音ファイル = **35kbps** (bitrate 96)

## Opus: ボイスonly
- `--bitrate 24 --vbr --framesize 60 --downmix-mono`
    - Framesizeを 60ms 固定にすることで、オーバーヘッドをなくし、音質向上のビットレートに割くことができる
        - リアルタイム性が重要でレイテンシを減らしたければFramesize指定を削除か、20ms以下にする（音質は下がる）
    - このビットレートでは、コーデックとしてSILKが使われる

# qAAC
おすすめ設定: **True VBR q109 - q127**

- q91 (192kbps) でキラーサンプルがあって聴取可能
    - さらに下の q82 (160kbps) 以下はABXで判別できることがある
- よって `-V 109` ～ `-V 127` がベスト設定
    - TrueVBRで使うなら、ガツンと q109-q127 (256kbps-320kbps) のような大きな値でかまわない
    - このような指定であっても静かな音声になると、すごく縮む
- TVBRで利用すると一番、ビットレートの幅が広いコーデック
- Apple AAC 256kbpsは、相当優秀です → http://qiita.com/keiya/items/70ed223c85e72b6bfdda#aac-qaac-apple-vbr-q109

無音ファイル = **23kbps** (q127)

# Vorbis
おすすめ設定: **VBR q4 - q7.5**

- q8だと、約256kbpsであり、LAMEよりも大きくなる場合がある
    - 推奨はしない
- q7.5 でLAME V0と同等ビットレート（音質は当然Vorbisが上）
- というわけで `q4` ～ `q7.5` が美味しいゾーン
    - q3 112kbps で判別できる音があった
- `-Q -q7.000000 -S 0` 
    - S 0 はリサンプラを最高音質にする設定    

無音ファイル = **72kbps** (q7.5)

# LAME
おすすめ設定: **V0**

- 320kbpsにするのは無駄が多い (無音ファイルでも320kbpsコンスタント…)
    - そもそも、320kですらアーティファクトが出るキラーサンプルもあるので、MP3で音質はあきらめろ
- `-V 0` (240kbps) だけが最適な解

無音ファイル = **74kbps** (V0)

# TAK (可逆)
- `-e -pMax -md5 -silent -ihs -lp`
    - 無音ファイルで **75kbps**
        - 無音ではちょっとFLACより効率が良い
        - 普通の曲でもFLACよりよく縮む

http://qiita.com/keiya/items/7d14adff689207a63b4b
http://qiita.com/keiya/items/70ed223c85e72b6bfdda
今からでもtig入門

Gitの基本的なコマンドは使えるようになったので、
軽快さを求めてtig(git cui browser)を導入します。

SourceTreeやその他GUIツールから移行を検討されている方や
Gitを少し触り始めたけどルーティン操作が慣れない私向けの内容です。

# インストール
macならbrewからinstallできます。

```
$ brew install tig
$ tig -v
tig version 2.1.1
```
# main view
まずはgitのプロジェクトに移動してmain viewを表示させましょう。
mainviewは通常のgit log --graphよりも履歴を綺麗に表示してくれます。

```
$ tig
```

![スクリーンショット 2016-11-19 18.24.36.png](https://qiita-image-store.s3.amazonaws.com/0/25180/03b4fb62-0a32-6259-7fbc-eec65597d676.png)

## main viewのキーバインド

| key | 説明 |補足|
|:-:|:-:|:-:|
| q  | 終了  |viewを閉じる際の共通|
| Enter  | 選択中のコミットのdiff viewを表示  |diff viewは後述|
| Ctrl + n  | 下の履歴に移動  |-|
| Ctrl + p  | 上の履歴に移動  |-|
| j  | 下の履歴に移動  |-|
| k  | 上の履歴に移動  |-|
| s  | status viewを表示  |後述|
| t  | tree viewを表示  |後述|
| h  | help viewを表示  |tigのヘルプは見易い|


# tree view

プロジェクトの構成とファイルの内容を見ながら履歴を探りたいときは
tree viewが便利です。

main viewからtを押せば下記のようにファイルとフォルダ単位で表示してくれます

![スクリーンショット 2016-11-19 19.36.29.png](https://qiita-image-store.s3.amazonaws.com/0/25180/ea442fa9-8307-8823-8b2c-bcb08b79ec11.png)

## tree viewのキーバインド

| key | 説明 |
|:-:|:-:|
| Enter  | ファイルの内容を表示 |
| b  | 選択しているファイルのblame表示|

# diff viewとtigの設定変更について
main viewからEnterで選択中の差分表示現れ、diff viewと言います。
ただ、垂直分割だと表示領域が狭く辛いので水平分割にするために設定を変更します。

~/.tigrcに記述して、もう一度tigを実行すれば設定が反映されます。

```conf:~/.tigrc
set vertical-split = no
set split-view-height = 70%
```

![スクリーンショット 2016-11-19 18.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/25180/74436859-0ee6-76f6-e277-c979c126dbbc.png)


水平分割で表示されました。

## diff viewのキーバインド

Ctrlを押したままにしてn,p,u,dを組み合わせればサクサク確認できます。

| key | 説明 |
|:-:|:-:|:-:|
|  Ctrl + d |  diffview内を下に移動 |
|  Ctrl + u |  diffview内を上に移動 |
|  Ctrl + n |  main view内を下に移動 |
|  Ctrl + p |  main view内を上に移動 |

# status view
git stで確認していた内容はstatus viewから確認できます。

<img width="314" alt="スクリーンショット 2016-11-13 14.27.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/25180/90680c14-1b6d-abfc-7686-042cb68cb00f.png">

## Add
status-view-text.txtがUntrackedとして表示されています。
jとkキーでファイルを選択し、`u`を押下でaddすることができます。

| key | 説明 |
|:-:|:-:|:-:|
|  j |  下に移動 |
|  k |  上に移動 |
|  u |  add |
|  shift + c |  commit |


<img width="236" alt="スクリーンショット 2016-11-13 14.48.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/25180/9c25966f-504f-0dea-318b-780e90af5dcb.png">

## statusviewの表示内容について注意

tigを起動中に追加・削除されたファイルはtigを一度終了しないと認識されないのに注意してください。たとえば大量の一時ファイルがUntrackedに表示されてるので別窓のterminalからrmしても、tigには即時反映されません。
tigを一度閉じて再実行すれば認識してくれます。

## Commit
stageされたファイルがある状態で 
shift + c でコミットメッセージ記述のため、editorが起動します。

このくだりは通常のGitと変わりがないので省略します。

## Untrackedな編集の削除
!で消せます。消す前には以下のように確認のステップが入ります。

<img width="455" alt="スクリーンショット 2016-11-13 15.28.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/25180/78ff5bf0-5253-7eeb-8ce8-fa60f1f16365.png">

# 起動時オプション

起動時のオプションによって色々できるのでよく使いそうなものをご紹介します

| key | 説明 |
|:-:|:-:|
| tig xxx.txt| 指定ファイルのみの履歴を表示  |
| tig blame xxx.txt| 通常のblameより見やすく捗ります  |
|  tig branchA..branchB| [ダブルドット 詳細](http://qiita.com/mhimuro/items/e225d26f6b59aeed2e27#ダブルドット)  |


# 最後に
全ての操作をtigでやるのではなく、ルーティンなaddやコミットなどはtig。複雑な操作は通常のgitで操作するのが易しくて良いと思います。
プログラム間のデータ受け渡しをCSVからSqliteにするといいコトがあるよ。

プログラム間でデータの受け渡しをCSVファイルでやること、よくありますよね。

でも、CSVは地雷の山でもあります。

- データに`,`が入って、カラムが増えてしまう。
- データに改行が入って、レコードが分割されてしまう。
- デリミタが`,`ではなくて、実はタブ(TSV)だったりする。
- 括り記号が`'`か`"`で一致しなかった。
- `\`の扱いが微妙。
- データ内のデリミタ、制御文字のエスケープし忘れ。
- ライブラリによっては、何故か文字化けすることがある。
- 空行の扱いをどうするかが不明。（特にファイル末尾の空行）
- バイナリデータが直接扱えない。

ここで一つご提案。
**CSVやめちゃえ。**

CSVの代わりにSqliteを使いましょう。Sqliteなら

- カラムが勝手に増減することはない。
- データに`,`、`'`、`"`、`\`、タブ、改行が入っていても問題なし。
- （構造的な）不正データが入っている可能性がほぼゼロ。
- 中のデータが勝手に書き換わることもない。
- 空行問題なし。
- バイナリデータ(`BLOB`型)も直接扱える。
- どんなOS/言語でも標準的に使える。
- データの読み書きはSQL叩けばOKなので、自前で読み書きルーチンを書く必要なし。
- データの加工、抽出や集計だってSQLで一発。
- オープンソース（パブリックドメイン）なので、ライセンス上の問題もベンダーロックインの問題もなし。

あくまでも個人の意見としてですが、人間が読まない前提であればCSVファイルでのデータの受け渡しはアンチパターンだとさえ思ってます。
踏まなくて良い地雷は上手に回避しましょう。

PostgreSqlのFDW(Foreign data wrappers)でsqliteの対応がこなれてくれば、
PostgreSqlのデータを`COPY`や`insert into ... select`構文で1発でsqliteにimport / exportできるようになって、益々便利になりますね。
（まだ、実装がこなれてないので非実現的ですが…。）