OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語の作業ディレクトリをドキュメントに従って作り直してみた

今までとりあえず.goファイルを作ってgo runしたりgo buildしたりしていたけど、[How to write Go guide](http://golang.org/doc/code.html)の"Code organization"を読んで改めて開発環境を作り直してみた。


#とりあえず作業ディレクトリを決める
作業ディレクトリはひとまずどこでも良さそう。
> Your workspace can be located wherever you like

今回は/usr/local/workdir/goで作る。

```
$ mkdir /usr/local/workdir
$ mkdir /usr/local/workdir/go
```

#パスを通す
>The GOPATH environment variable specifies the location of your workspace. It is likely the only environment variable you'll need to set when developing Go code.

なのと、

>For convenience, add the workspace's bin subdirectory to your PATH:

だそうなので、作った作業ディレクトリにパスを通す。

```
$ vi ~/.bash_profile
```

以下を追記

```
export GOPATH=/usr/local/workdir/go
export PATH=$PATH:$GOPATH/bin
```

で

```
$ source ~/.bash_profile
```

#所定のディレクトリを作る

>Go code must be kept inside a workspace. A workspace is a directory hierarchy with three directories at its root:

>　・src contains Go source files organized into packages (one package per directory),
>　・pkg contains package objects, and
>　・bin contains executable commands.

なので、

```
$ cd $GOPATH
$ mkdir src pkg bin
```

で、

> If you keep your code in a source repository somewhere, then you should use the root of that source repository as your base path.

ということなので、Githubを使っている僕の場合は

```
$ mkdir src/github.com
$ mkdir src/github.com/chooyan
```

とディレクトリを作って、その下にパッケージを作っていく。


#改めてHello Worldしてみる

```
$ cd src/github.com/chooyan
$ mkdir hello ; cd hello
$ vi hello.go
```

以下のHelloWorldをコピペして保存

```go:hello.go
package main

import "fmt"

func main() {
	fmt.Printf("Hello, world.\n")
}
```

ファイルができたら、

```
$ go install github.com/chooyan/hello
```

特に何も出力はされないが、

>This command builds the hello command, producing an executable binary. It then installs that binary to the workspace's bin directory as hello (or, under Windows, hello.exe)

というわけで、binフォルダの中に実行ファイルが生成される。

```
ll $GOPATH/bin
total 3752
-rwxr-xr-x  1 chooyan  staff  1919504  8 26 22:47 hello
```

先ほどここにパスを通したので、

```
$ hello
Hello, world.
```

できたできた。


あとはここからライブラリのパッケージを作ったり、~~Githubにpush~~ gitにコミットしたり、他の人がpushしたライブラリをとってきたり、テストコード書いたりといろいろ続くのだけど、それはまた次で。


#ポイント
Go言語のディレクトリ構成は、Githubのようなオープンな場でソースコードを共有することに最適化されていることと、

> The go tool is designed to work with open source code maintained in public repositories.

すべてのソースコードを１つの作業ディレクトリで管理することが推奨されているらしい。

> Most Go programmers keep all their Go source code and dependencies in a single workspace.

会社なんかで、閉じたソース管理システム使って複数人で作業ディレクトリを共有して開発、という場合だとどうなるんだろうか。。。
Failed at the electron-prebuilt@0.xx.xx install script 'node install.js' の対応

electronのインストールを実行して失敗する。
```
sudo npm install electron-prebuilt -g
```

```
/usr/local/lib/node_modules/electron-prebuilt/install.js:15
  throw err
        ^
Error: EACCES, rename '/usr/local/lib/node_modules/electron-prebuilt/electron-tmp-download-3875-1440596181526/electron-v0.30.6-darwin-x64.zip'
    at Error (native)
npm ERR! Darwin 14.5.0
npm ERR! argv "node" "/usr/local/bin/npm" "install" "-g" "electron-prebuilt"
npm ERR! node v0.12.7
npm ERR! npm  v2.11.3
npm ERR! code ELIFECYCLE

npm ERR! electron-prebuilt@0.30.6 postinstall: `node install.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the electron-prebuilt@0.30.6 postinstall script 'node install.js'.
npm ERR! This is most likely a problem with the electron-prebuilt package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node install.js
npm ERR! You can get their info via:
npm ERR!     npm owner ls electron-prebuilt
npm ERR! There is likely additional logging output above.

```

node install.jsでエラーになっている。パーミッションの問題？

対応方法は下記参照
[https://github.com/mafintosh/electron-prebuilt/issues/27](https://github.com/mafintosh/electron-prebuilt/issues/27)

```
chmod 777 ~/.electron
mkdir test
cd test
npm init # use default values
npm i electron-prebuilt
cd node_modules/electron-prebuilt
sudo npm link
```

これでelectronコマンド実行出来るようになった。

ただ-gオプションつけてないのでグローバルでインストール出来てないかもしれないので一次対応として考える。
WindowsでSourceTreeのGitを変えたら

WindowsでSourceTreeのGitを変えたら速くなったという話し。

Windows10が出てクリーンインストールしてからSourceTreeでは内蔵のGitを使っていたのだが、もの凄くSourceTreeの起動に待たされる感じがあった。
そこで、ちょっと前に Git for Windows がプレビューを抜けて正式版になったということで、インストールしつつも、放置していたので内蔵のGitから Git for Windows の方に切替たところ・・・。
起動が格段に速くなった！！

OSXのSourceTreeは速いのに…と思っていたら、原因はSourceTree自体というよりもGitの方だったとは。

変更はSourceTreeのメニューから
「ツール」→「オプション」でオプションダイアログを表示して、Gitタブに移動。
ダイアログの下段にある「Gitバージョン」でシステム「Gitを使用」を選択するだけ。
![SourceTree-Git.png](https://qiita-image-store.s3.amazonaws.com/0/85034/0b37f335-55b4-99a4-9f86-5ef9dbe971af.png)

と、勢いで書いてみたけど…常識だったりして。。。
enumでコードの集まりを作ってみる

#はじめに
Javaのenumは、メソッドや値を持つことが可能です。
それを利用して、コードの集合を作ることができますので、作ってみたいと思います。

#よく見るソース
定数を使ってコード値を表しているものがあります。

```java
public static final int SAFARI = 10;
public static final int CHROME = 20;
public static final int FIREFOX = 30;
public static final int OTHER = 99;
```

また、集まりを表すために、クラスに記載してみたり。

```java
public class Browser {
    public static final int SAFARI = 10;
    public static final int CHROME = 20;
    public static final int FIREFOX = 30;
    public static final int OTHER = 99;
}
```

#enumでの実装
記述は定数で記載するよりも増えてしまいますが、switch文を使用できる様になる。
また、interfaceを継承することができるので、列挙子毎に振る舞いを加えることもできます。

```java
public enum BrowserKinds {
    Safari(10), Chrome(20), FireFox(30), Other(99);

    private final int code;

    private BrowserKinds(int _code) {
        this.code = _code;
    }

    public int getCode() {
        return this.code;
    }

    public static BrowserKinds valueOf(final int _code) {
        for (BrowserKinds kind : BrowserKinds.values()) {
            if (kind.code == _code) {
                return kind;
            }
        }

        return BrowserKinds.Other;
    }
}
```

DBFluteの区分値がenumを使ってますね。自動生成してくれるんでこの部分だけ使うのもアリだなぁと思います。
連番ファイルをコマンド一発で生成する


`test_1.txt`, `test_2.txt`...`test_30.txt`のような連番のファイルを作りたくなる時があります。
そんな時、1つ1つcpコマンドでコピーとかしてるようでは超絶だるいですよね。
そんな悩みをコマンド一発で解決する方法を紹介します。

* 実践

```bash
[riki@hoge]$ touch test_{1..30}.txt
[riki@hoge]$ ls
test_1.txt   test_11.txt  test_13.txt  test_15.txt  test_17.txt  test_19.txt  test_20.txt  test_22.txt  test_24.txt  test_26.txt  test_28.txt  test_3.txt   test_4.txt  test_6.txt  test_8.txt
test_10.txt  test_12.txt  test_14.txt  test_16.txt  test_18.txt  test_2.txt   test_21.txt  test_23.txt  test_25.txt  test_27.txt  test_29.txt  test_30.txt  test_5.txt  test_7.txt  test_9.txt
```

出来ました。

### 書式

```sh
{開始番号..終了番号}
```

記号|意味
---|---
{|開始を意味する
開始番号|連番の最初の数字(1~30で作りたいなら1)
終了番号|連番の最後の数字(1~30で作りたいなら30)
}|終了を意味する

### 応用してみる

#### アルファベットでも使ってみる

a~zとかも楽勝

```bash
[riki@hoge]$ touch test_{a..z}.txt
[riki@hoge]$ ls
test_a.txt  test_c.txt  test_e.txt  test_g.txt  test_i.txt  test_k.txt  test_m.txt  test_o.txt  test_q.txt  test_s.txt  test_u.txt  test_w.txt  test_y.txt
test_b.txt  test_d.txt  test_f.txt  test_h.txt  test_j.txt  test_l.txt  test_n.txt  test_p.txt  test_r.txt  test_t.txt  test_v.txt  test_x.txt  test_z.txt
```

#### 桁を揃えてみる

ゼロを先頭に書くと、いい感じにゼロ埋めしてくれる

```bash
[riki@hoge]$ touch foo_{01..100}.txt
[riki@hoge]$ ls
foo_001.txt  foo_009.txt  foo_017.txt  foo_025.txt  foo_033.txt  foo_041.txt  foo_049.txt  foo_057.txt  foo_065.txt  foo_073.txt  foo_081.txt  foo_089.txt  foo_097.txt
foo_002.txt  foo_010.txt  foo_018.txt  foo_026.txt  foo_034.txt  foo_042.txt  foo_050.txt  foo_058.txt  foo_066.txt  foo_074.txt  foo_082.txt  foo_090.txt  foo_098.txt
foo_003.txt  foo_011.txt  foo_019.txt  foo_027.txt  foo_035.txt  foo_043.txt  foo_051.txt  foo_059.txt  foo_067.txt  foo_075.txt  foo_083.txt  foo_091.txt  foo_099.txt
foo_004.txt  foo_012.txt  foo_020.txt  foo_028.txt  foo_036.txt  foo_044.txt  foo_052.txt  foo_060.txt  foo_068.txt  foo_076.txt  foo_084.txt  foo_092.txt  foo_100.txt
foo_005.txt  foo_013.txt  foo_021.txt  foo_029.txt  foo_037.txt  foo_045.txt  foo_053.txt  foo_061.txt  foo_069.txt  foo_077.txt  foo_085.txt  foo_093.txt
foo_006.txt  foo_014.txt  foo_022.txt  foo_030.txt  foo_038.txt  foo_046.txt  foo_054.txt  foo_062.txt  foo_070.txt  foo_078.txt  foo_086.txt  foo_094.txt
foo_007.txt  foo_015.txt  foo_023.txt  foo_031.txt  foo_039.txt  foo_047.txt  foo_055.txt  foo_063.txt  foo_071.txt  foo_079.txt  foo_087.txt  foo_095.txt
foo_008.txt  foo_016.txt  foo_024.txt  foo_032.txt  foo_040.txt  foo_048.txt  foo_056.txt  foo_064.txt  foo_072.txt  foo_080.txt  foo_088.txt  foo_096.txt
```
Twitter ウィジェットが Chrome で表示されない場合

特定のページに設置したTwitterウィジェットが表示されず、「@～さんのツイート」という文字だけが表示される症状が発生。IE や Firefox では問題なく、Google Chrome でのみ起こるようです。

ページの文字コードがUTF-8でない場合は&lt;script&gt;にcharset="utf-8"を追加する必要があるとか、Avast!などのブラウザのアドオンがウィジェットをブロックしてしまうことがあるとか、ドメイン設定が間違っている（今のTwitterウィジェットにそのような設定はないのでこれは過去の話）とか、そういった情報はヒットするのですが、どれも解決につながりませんでした。

ウィジェットの JavaScript は圧縮されており、どのような処理を行っているのかよくわからない（解析するのが面倒）ので、細かい原因はよくわかりませんが、Twitter ウィジェットのコードにある &lt;script&gt;～&lt;/script&gt; を &lt;head&gt;～&lt;/head&gt; に移動すると、常に表示されるようになりました。
machinery用のbrew formula

docker-machineのクラスタを管理するツールで[machinery](https://github.com/efrecon/machinery)という面白そうなものがあるのですが、インストールが面倒そうな感じなので homebrew 用のformula を

```rb
class Machinery < Formula
  desc ""
  homepage ""
  url "https://github.com/efrecon/machinery/releases/download/v0.5.1/machinery-0
.5.1-macosx-x86_64"
  version "0.5.1"
  sha256 "9232ae62c88009185e78f45c4e99384c0a55744b1983f43a8e5187a27285ea39"
  depends_on :arch => :x86_64

  def install
    mv 'machinery-0.5.1-macosx-x86_64', 'machinery'
    bin.install 'machinery'
  end           
end             
```

gistに置いてあるので以下のコマンドで導入できます。

```shell-session
brew install https://gist.githubusercontent.com/genki/086b4121ab165186b3a8/raw/1b9d31f02a171a8b87e909d1f2c48ce28504eeb2/machinery.rb
```
Three.jsのOrbitControls.jsの導入


OrbitControls.jsとは、マウスを使って視点を自由に動かせるようにするものです。

OrbitControlsはThree.jsに記述されているクラスではなく、OrbitControls.jsに書かれています。

sample
http://codepen.io/taku/pen/oXKrQe?editors=001

##解説
追加するのは２つだけです。
<br>

```
var controls = new THREE.OrbitControls(camera);
```
カメラがあるところに、これを追加します。
<br>

```
controls.update();
```
そして、毎回描画がされる際によびだします。
RESTとは何か

RESTには3つの意味がある。
1. Roy Fieldingによって提唱されたアーキテクチャスタイル
    - 原論文 https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
    - Mr. Fieldingのブログ http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
    - 解説記事 https://xtech.nikkei.com/atcl/nxt/column/18/00138/092100882/
    - 必要条件の一つにHATEOAS（ヘイタスなどと発音される。レスポンスに関連するリソースのURLを含めるという規約）があり、世の中のAPIのほとんどはそれを満たしていないので、この意味のRESTと言えない
2. 複雑なSOAPに対抗して提唱された、より軽量なAPIのスタイル
    - 現在はSOAPが死滅したため、この意味で使われることは稀
3. Rails等のフレームワークによって広められた、CRUD操作をHTTPのメソッドに対応させるスタイル
    - しかしこのスタイルも明文化されて広く合意されているものではない。人によって意見が異なることが多々ある
    - Create = POST, Read = GET, Update = PUT（全体置換）/PATCH（部分更新）, Delete = DELETE
    - 原則的に全てのAPIをリソースのCRUDに見立てるが、どうしてもCRUDに当てはまらない処理はPOSTを利用する
        - 2024年現在、この意味で使われることが多い
        - 例えば、ログインはセッションの作成に見立てPOST /sessionsとされるが、現実にはPOST /loginとされることもある。承認はPOST /approveなどとなる。同期するAPIは冪等なのでPUTのイメージがあるが、[PUTはリソースの置き換えだけに利用されるものなのでPOSTを利用するという意見](https://stackoverflow.com/questions/29802872/in-rest-what-method-to-use-for-the-sync-operation)がある
    - [CRUDをメソッドに対応させるのは本来の（1の）RESTではない](https://stackoverflow.com/a/19844272/5209556)
    - GET, HEAD, PUT, DELETEは冪等性が要求される。この**冪等とはリソースが変わらないことを意味し**、レスポンスは変わっても良い。例えば、[DELETEの2回目は404になっても良い](https://developer.mozilla.org/ja/docs/Glossary/Idempotent)
    - [冪等と安全に関する誤解 #API - Qiita](https://qiita.com/KyojiOsada/items/9c8db9714a0c9c72823c)

この記事では、60〜70人のエンジニアを面接して、誰一人RESTの定義を正しく答えられなかったと書かれている。
https://whizmodo.wordpress.com/2015/01/10/will-the-real-restful-api-please-stand-up/

この記事では、なぜRESTは宗教的になりがちなのか考察されている。要は一人の創始者があいまいかつわずかな言葉でお告げを語ってそれっきりになってしまったため、他の人による「解釈学」が発達しているということ。
http://mikeschinkel.com/blog/why-rest-is-more-like-religion-than-most-technologies/

RESTの6大規約（原論文のCHAPTER 5より）

1. クライアント・サーバー（当然）
2. ステートレス（クッキーやCSRF対策のトークンを入れるとステートフルになってしまう…）
3. キャッシュ（サーバはレスポンスのキャッシュ可否を明示すべし）
4. ユニフォームインターフェイス（これが重要。URL、HTTPメソッド、メディアタイプ）
5. レイヤー（OSI参照モデルのように？レイヤー構成にすべし）
6. コード・オン・デマンド（クライアントサイドスクリプト）



リチャードソンによるマチュリティモデル（RESTの4段階モデル）とマーティン・ファウラーによる解説。マーティン・ファウラーの説明は分かりやすい。
http://martinfowler.com/articles/richardsonMaturityModel.html
http://www.crummy.com/writing/speaking/2008-QCon/act3.html

Level 0 Plain Old XML（昔ながらの単純にXMLを返すやり方）
Level 1 URLでリソースを表すようにする（リソースを動詞でなく名詞で表す）
Level 2 HTTPメソッドGET, POST, PUT, DELETE等を正しく使い分ける
Level 3 レスポンスの中に関連するリンクを含める
![overview.png](https://qiita-image-store.s3.amazonaws.com/0/79394/09226688-9b3f-2c47-b666-556daf385aab.png)


[There is No REST API : programming](https://www.reddit.com/r/programming/comments/5318oz/there_is_no_rest_api/)
CLIコマンドはautoload.phpをどのように探せばよいのか

phpunitでは、autoload.phpを以下の3か所から探している。

* `__DIR__ . '/../../autoload.php'`
* `__DIR__ . '/../vendor/autoload.php'`
* `__DIR__ . '/vendor/autoload.php'`

https://github.com/sebastianbergmann/phpunit/blob/master/phpunit

```php
foreach (array(__DIR__ . '/../../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/vendor/autoload.php') as $file) {
    if (file_exists($file)) {
        define('PHPUNIT_COMPOSER_INSTALL', $file);

        break;
    }
}
```

ざっくりいうと、普通にインストールしたとき用と、composer.jsonで`bin-dir`を`bin`にしたとき用と、あとは開発時用みたいなことなんだけど、細かく言うとcomposer installがbinに対して何をやっているのか、シンボリックリンクが使える場合と使えない場合についての説明が必要なのでそのうち書くかも。


参考：
https://github.com/sebastianbergmann/phpunit/pull/1333
Three.jsで大量のオブジェクトを描画する時の最適化


##
大量のオブジェクトを描画する時はオブジェクトのジオメトリを結合することでドローコールを少なくすることができ、結果的にパフォーマンスの向上につながります。


sample
http://codepen.io/taku/pen/xGvoPO?editors=001


##解説
上のサンプルについて
<br>

```
var geometry = new THREE.Geometry;
var meshItem = new THREE.Mesh(new THREE.BoxGeometry(3, 3, 3));
```
まず始めに空のジオメトリを用意し、一つ一つのオブジェクトを設定します。
<br><br>

```
for(var i=0; i<10; i++){
  for(var j=0; j<10; j++){
    for(var k=0; k<10; k++){
      meshItem.position.x = k*6 + k*1;
      meshItem.position.y = j*6 + j*1;
      meshItem.position.z = i*6 + i*1;
      
      geometry.mergeMesh(meshItem);
    }
  }
}
```

そして、一つ一つのオブジェクトを始めに作成した空のジオメトリにmergeしていきます。
<br><br>

```
var material = new THREE.MeshPhongMaterial({color: 0xaaaaaa});

var mesh = new THREE.Mesh(geometry, material);
```

後はいつもと同じようにジオメトリとマテリアルからオブジェクトを作成します。
<br><br>

ただしこの方法ではオブジェクトにそれぞれことなったマテリアルを設定することはできません。
まるでHHKBのような打鍵音を演出するzen-typing

こんにちは。
まるでHHKBのように軽快な打鍵音を演出するzen-typingというものを作ったのでご紹介します。

https://github.com/smurakami/zen-typing

# つかいかた

1. できるだけ高級なイヤフォンを用意します。
2. Macにイヤフォンを接続します。
3. 上のリポジトリをクローンしましょう。
4. ZenTyping.playgroundをXcodeで開きます。
5. 数秒待ったら、タイピングしてましょう。
6. カチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャカチャ

7. ッターーーーーーーーーーーーーン

いやーーーーーーーー気持ちいい！！！！！

# カスタマイズしよう

実はこのプログラム、とても短いので自分でも簡単に作ることができます。

まず、Xcodeでplaygroundを作ります。

![スクリーンショット 2015-08-26 20.16.10.png](https://qiita-image-store.s3.amazonaws.com/0/33933/1aa81e23-2bbd-a212-85df-6121dc1f23fc.png)


ポイントは、platformをOSXにすることです。こうしないとうまく動いてくれません。

![スクリーンショット 2015-08-26 20.16.40.png](https://qiita-image-store.s3.amazonaws.com/0/33933/ab87b902-99bc-9886-3930-54433026f715.png)

プレイグラウンドを開いたら、下のコードを貼り付けます。
たったこれだけでOK。数秒待つと動作します。

```swift
//: Playground - noun: a place where people can play

import AVFoundation

var engine = AVAudioEngine()
var input = engine.inputNode
var output = engine.outputNode
var format = input.inputFormatForBus(0)
var error:NSError?

engine.connect(input, to: output, format: format)

while true {
    engine.startAndReturnError(&error)
    sleep(10000)
}
```

![スクリーンショット 2015-08-26 20.17.28.png](https://qiita-image-store.s3.amazonaws.com/0/33933/088b75d1-baed-9bfc-bb21-083fbcb9883b.png)

このプログラム、簡単にサウンドエフェクトなどを追加できます。
たとえば、下のコードを貼り付けると、まるで銭湯でタイピングしているような感覚になります。

```swift
//: Playground - noun: a place where people can play

import AVFoundation

var engine = AVAudioEngine()
var input = engine.inputNode
var output = engine.outputNode
var format = input.inputFormatForBus(0)
var error:NSError?

var reverb = AVAudioUnitReverb()
reverb.loadFactoryPreset(.LargeHall2)
reverb.wetDryMix = 50
engine.attachNode(reverb)

engine.connect(input, to: reverb, format: format)
engine.connect(reverb, to: output, format: format)

while true {
    engine.startAndReturnError(&error)
    sleep(10000)
}
```

.LargeHall2を別の部屋に変えてみたり、wetDryMixの値を変えてみるといろいろとカスタマイズできます。
AVAudioUnitReverb以外にも、AVAudioUnitDelayなどいろいろ使えます。

みなさんのとっておきの打鍵音を作ったら、ぜひぜひ上のリポジトリにプルリクエストを送ってくださいね。

それでは。enjoy coding!
【SourceTreeメモ】SourceTreeで「リポジトリは移動または削除されています」というエラーが出て困った　そんな時

例えばsamba経由で作業リポジトリを登録しているとこんな現象に見舞われる。
そもそもsamba経由でSourceTreeを操作すると激重なのでこれをなんとかする方法を是非教えていただきたいところです。

## 作業リポジトリをおいているサーバーにアクセスする
macならfinderから、windowsの場合はエクスプローラーから作業リポジトリをおいているサーバーにアクセスをしてみましょう ※完全にsambaアクセスを想定しています。
ここでwindowsの場合はサーバーにアクセスできた時点で「リポジトリは移動または削除されています」現象が解消されていることがあるので一度アプリを再起動してみても良いかもしれません。

## 作業リポジトリの再登録
SourceTreeに移動し、一覧からエラーの出ているリポジトリをダブルクリックします。
すると警告文がでるので「フォルダを変更」を選択します。
表示されたファインダーから移動した(実際には移動はしていませんが)リポジトリの場所を指定します。
金額とか、カンマ区切りの数値をJSで（正規表現を説明してもらった件）。

※下記、「整数で」という前提ですのでご了承くださいませ★
~~（後日、小数についても考えてみます。）~~
（[JavaScript - 「金額とか、カンマ区切りの数値をJSで。」のつづき。小数点も考えてみたんだけどね...。 - Qiita](http://qiita.com/ariyo13/items/ec74de3cd721a68767fc)　に、検討結果を書いてみました。よろしければご参考まで...。（2015.12.22））

金額とかで数値を使う場合、受け取ったデータそのままではなく、3桁区切りでカンマ区切りしないとですよね。
数値をカンマ区切りにする場合、JSで正規表現でやろうとするとこうなるそうで。

```js

[該当する数値].toString().replace(/(\d)(?=(\d{3})+$)/g , '$1,');
```

私がわからなかったのが

```js

/(?=(hoge))/
```
の部分。
で、エンジニアさんたちによってたかって詳しく解説してもらいました。

## ```?=```で、「間」を拾う
そもそもの区切りは、

```js

/(fuga)(?=(hoge))/
```

なんだそう。
上記の書き方で、```?=```が、```fuga```と```hoge```の間を拾ってくれるそうです。
なので、

```js

/(\d)(?=(\d{3}))/
```

で、「数字1桁」と「数字3桁」の間を拾ってもらえます。

##後ろから、再帰的に拾う
あとは後ろから区切っていけばよいわけで。

```js

/(fuga)(?=(hoge)+$)/

```

末尾が```$```なので、```fuga```と、1個以上の```hoge```で終わってる場合に、間を拾ってくれます。


```js

/(\d)(?=(\d{3})+$)/
```

「数字1桁」間「数字3桁」終。
コレをリピしたいから、

```js

/(\d)(?=(\d{3})+$)/g
```

「数字1桁」（間「数字3桁」）←ココくりかえし　終。
みたいな感じ（わかりやすい書き方できないかなコレ...）。

##最後に、置き換える
ということで拾えたら、

```js

replace(/(\d)(?=(\d{3})+$)/g , '$1,');
```

この場合の```$1```は```(\d)```。
リピートが入っちゃってるのでわかりにくいけど、「間の前の数字」が```$1```に入ってる感じです。
なので
「数字1桁」(,「数字3桁」）←ココくりかえし　終。
という感じで、間に「,」を入れることに成功するのでした。

あ。正規表現使うので、ココは文字列じゃないとダメです。数値型だとNG。
なので、最終的には

```js

[該当する数値].toString().replace(/(\d)(?=(\d{3})+$)/g , '$1,');
```

という形になるのでした。
４人掛かりで教えてくださったエンジニアのみなさん、ありがとうございました♪
【SourceTreeメモ】SourceTreeで「index.lock': File exists.」というエラーが出て困った　そんな時

SourceTreeを使っていて、いざ変更内容をindexにステージするぞ、という肝心な時に
「index.lock': File exists.」というエラーが出ることがある。
日頃頻繁に出くわす人はまだしも、久しぶりに使ってこの現象が起きた時のためにメモ

## 対象リポジトリに移動
macならファインダーなり、windowsならエクスプローラーなり、今回のエラーが発生したリポジトリの場所に移動する。もちろんコマンドでもOK

##「.git」に移動
対象リポジトリに「.git」があるのでそれに移動
※macだと表示されなかったような...なのでターミナルで操作されることをオススメします。

## 「index.lock」を削除
「.git」に移動したら「index.lock」というディレクトリがあるのでそれを削除
再びindexにステージを試してみよう。
SwiftでUIViewの下に線を引きたい

## やりたいこと

- 対象はUICollectionViewCell
- やんごとなき事情からcollectionViewのセル同士のマージンはゼロ
- collectionViewの中に一部だけtableViewみたいな並びになるところがある
- セル同士のマージンがゼロなので境界がわからない、くっついて見えちゃう

## やること

```swift
    let bottomBorder = CALayer()
    let borderWidth = CGFloat(0.4) // <- 線の太さ
    bottomBorder.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, borderWidth)
    bottomBorder.backgroundColor = UIColor(red: 0.8, green: 0.8, blue: 0.8, alpha: 1).CGColor // <- 線の色
    self.layer.addSublayer(bottomBorder)
```

## 結果

やんごとなき事情からスクショはなし。

線は引けました。

## 所感

セル同士くっついて見えて境界がわからない！→じゃセルに線を引こう！ってのは間違ってる気がします
一旦見た目優先で作ってあとで綺麗にしよう。。。
Javascriptでサロゲートペアを含む文字列を扱う


Twitterのような文字数チェックを作成ようとした備忘録

文字数を取得して、サロゲートペアだった場合は、
1引いて、処理をする。

ただ、これだと文字を入力された度に呼び出すと、
正規表現がその都度実行をされて少し重いと感じた。

実装はシンプルなので、
作成が非常に楽だった。

```javascript
function tweetLength(input) {
	var str = input.val();
	var len = str.length;
	var surrogate_num = str.split( /[\uD800-\uDBFF][\uDC00-\uDFFF]/g ).length - 1;
	return len - surrogate_num ;
}
```
FacebookSDK v4.x／Graph API2.xへの移行

## はじめに
自分用メモです。調査が進み次第追記します。
FacebookのGraph APIは去年から2.xできたから移行してね〜とアナウンスしておりましたが、まだその時点では1.xのAPIも使用することができました。
しかしついにその期限も切れ、昔のAPIをそのまま使うことはもはやできません。

SDK v3.xから移行した部分は[旧クラス] -> [新クラス] で記述してます。
SDKのver3.xから4.xへの移行については以下の公式ページに記載されています。
https://developers.facebook.com/docs/ios/upgrading-4.x
Graph APIの1.0から2.0への移行は以下の公式ページに記載されています。
https://developers.facebook.com/docs/apps/upgrading?locale=ja_JP

## ログイン
SDKで提供されるログインボタンを使わず、アプリ内で自前のコードでログインする場合、**FBSDKLoginManager**で処理を行います。

```lang:ログイン
- (void)logInWithReadPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler;
- (void)logInWithPublishPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler
```

また操作の途中で権限を追加したい場合は上記メソッドをその時呼び直せばOKです。
ログインに成功するとFBSDKAccessTokenが取得されてアクセスできるようになります。

## アクセストークン
**FBSession -> FBSDKAccessToken**
ユーザの権限やIDはFBSDKAccessTokenが保持しています。ログインの項でも書きましたが、ログインが成功した段階でこのトークンが保存され、各情報を取得できるようになります。

FBSessionではactiveSessionというセッションが有効か調べるプロパティがありましたがFBSDKAccessTokenにはその類のものがありません。FBSDKAccessTokenとLoginManagerで制御するようにと書かれています。

## リクエスト
**FBRequest -> FBSDKGraphRequest**
Graph APIへのリクエストはFBSDKGraphRequestを使います。

```lang:リクエスト
- (FBSDKGraphRequestConnection *)startWithCompletionHandler:(FBSDKGraphRequestHandler)handler;
```

ここはあまり変更なく、従来の記述からクラス・メソッド名を最新のものに修正すればいいくらいかと思います。

## セッション確認
**[FBSession openActiveSessionWithReadPermissions:::]**
**[FBSession openActiveSessionWithPublishPermissions:permissions:::]**
-> **ログインメソッドで代用**

従来のメソッドはセッションがopenかcloseか取得できましたが、FBSession削除に伴い、この概念が現在はありません。
代わりに行うとすれば、先述のFBSDKLoginManagerのログインメソッドを用いればよさそうです。
ログイン処理し直せばTokenも更新されるので必要ないということかも。

## ダイアログ
**FBWebDialogs**
FBSDKGameRequestDialog,FBSDKAppGroupAddDialog,FBSDKAppGroupJoinDialogという３つのダイアログが追加されており、これらで置き換えるそうです。
（要調査）

## Tips
### 取得できるユーザIDがアプリ固有で割り振られるものになっている
Facebookアプリとユーザを紐付け、そこからユーザIDを取得すると、本来のユーザIDを取得できません。
**App Scoped User Id**という概念が追加されたそうで、Facebookアプリと紐付ける毎に固有のIDが割り振られ、アプリ内から取得できるIDはこの固有のIDになってしまいます。

### usernameは取得できなくなった
/meですらusernameを取得することができません。そもそも削除なのでリクエストに含めるとエラーが返ってきてしまいます。
一意なIDの取得はかなり制限されているようです。

###友人リストがAPI2.0からデフォルトでは取れない
これまでは特に権限が必要ありませんでしたが、user_friendsを権限に追加する必要があります。
また、同じアプリと連携している友人しか取れないようになっているそうです。なのでこのアプリを始めよう！みたいな招待ができないということですね…。
>v1.0では、利用者の友達の「いいね！」や誕生日など、限られた量の友達データをアプリから閲覧ことができる権限を要求できました。
>v2.0では、これらの権限はすべて削除されました。 今後は、利用者の友達が同じアプリにログインし、データを閲覧する権限を許可している場合を除いて、アプリから利用者の友達のデータを閲覧することはできなくなりました。

とあるように、友達関連の取得もかなり厳しくなっているようです。

### Graph API 2.0 及び FQLは2016年に使えなくなるらしい
複雑な情報を取得したい場合に有用と思われるFQLですが、最速で2016年4月に使えなくなるそうです。
これはGraph API2.0を使えなくするタイミングで行われる模様です。
https://developers.facebook.com/docs/apps/changelog?locale=ja_JP

### エラー
エラーコードとエラーサブコードがあり分類されています。
NSError形式で返ってくるので、[error userInfo]内のDictionalyから定数Keyを使って取得します。
公式情報は以下。ここに記載されてないコードでも来たりするので要調査。
https://developers.facebook.com/docs/graph-api/using-graph-api/v2.4

*** メモ ***
12 : 正しくないパラメータを含む
100: 正しくないfieldを含む
190 : OAuthエラー

### その他
調査中です。。。
error: RPC failed; result=22, HTTP code = 501


よく自分でGitBucketにpushするときに起こるエラー
正直よくわからないんだけど，pushできる容量が足りてないっぽい

##エラー
```
error: RPC failed; result=22, HTTP code = 501
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
```

##解決

[ググってきたらでてきたページ](https://confluence.atlassian.com/display/FISHKB/Git+PUSH+results+in+RPC+failed,+result%3D22,+HTTP+code+%3D+411)によると，

```git config http.postBuffer 524288000```

とりあえずこうすると治る

```bash:.git/config
・
・
・
・
・
[http]
        postBuffer = 524288000
```

確認したらpostBufferの記述が追加されてた．

実際にpushしたらちゃんとpushされた

## 計算方法

```指定したいByte数[MByte] * 1024 * 1024```

|指定したいMbyte|式|値|
|:---:|:---:|:---:|
|1|1*1024*1024|1048576|
|50|50*1024*1024|54288000|
|500|500*1024*1024|524288000|

## 捕捉
解決しちゃったから試してないけど

```bash:.git/config
[http]
        postBuffer = 500M
```

でもできるかも？
カスタムIcon Fontsのfontelloをさらに便利に使うために


今更ですが、Icon Font使ってますか？

[font-awesome](https://fortawesome.github.io/Font-Awesome/) や [ionicon](http://ionicons.com/), [glyphicons](http://glyphicons.com/) 等など、便利なIcon Fontのセットも色々ありますね.

複数のIcon Fontからglyphを選んで自分用のIcon Fontとしたい場合, [fontello](http://fontello.com/) が便利です。僕も普段からお世話になっています。

## <span class="fa fa-flag" /> fontelloの設定ファイルからmixinを作る

fontelloでは、自分のカスタムweb font(.eot, .svg, .ttf, .woff)と、それを利用するCSSファイルが生成されます。

一方、iconをCSSのクラスではなく、Sassの中から利用したいシーンも存在します.
例えば、 <span class="fa fa-plus"></span> と <span class="fa fa-minus"></span> を使って、開閉状態を表現するclassを生成したい、といったシーンを想像してみてください[^1]。
htmlから、`<span class="icon-minus" ></span>` を意図的に別のCSSクラス(この例の場合、`opened`)の裏側に隠蔽したいケースです.

```scss:こんな感じで.scssを書きたい
.some-element {
  &:before {
    @include icon-plus;
  }
  &.opened:bedore {
    @include icon-minus;
  }
}
```

```html:利用側のhtml
<div class="some-element">...</div>
<div class="some-element opened">...</div>
```

fontelloの生成ファイルには、mixin(というかscss関連のファイルは何も)は用意されないため、自分で用意します。

下記のようにfontelloのconfig.jsonを読み込み、mixinをまとめた.scssファイルを出力するスクリプトが簡単に作成できます。

```js:createMixins.js
var fs = require('fs'), conf = require("./fontello/config.json");
var mixins = conf.glyphs
  .filter(function (f) {return f.selected != false;})
  .map(function (f) {
    return '@mixin aicon-' + f.css + '} {@include icon-_base; content: "\\' + f.code.toString(16) + '";}' ;
  });
fs.writeFileSync('_mixins_fontello_fonts.scss', mixins.join('\n'));
```

```bash
node createMixins.js
```

実行すると、下記のように`@mixin`の列挙を得ることができます。8行程度のscriptで`fs`にしか依存していないscriptなので、gruntやgulp等のタスクランナーにも容易に組み込むことができます。

```scss:_mixins_fontello_fonts.scss
@mixin icon-plus {@include icon-_base; content: '\e823';}
@mixin icon-minus {@include icon-_base; content: '\e89d';}
@mixin icon-arrow-down {@include icon-_base; content: '\e89e';}
@mixin icon-arrow-forward {@include icon-_base; content: '\e89f';}
@mixin icon-arrow-left {@include icon-_base; content: '\e8a0';}
...
```

なお、それぞれのmixinが共通してincludeする`icon-_base`は別途下記のように作成して`@import`しましょう.

```scss
@mixin icon-_base {
  font-family: "fontello";
  font-style: normal;
  font-weight: normal;
  speak: none;
  display: inline-block;
  text-decoration: inherit;
  width: 1em;
  margin-right: .2em;
  text-align: center;
  font-variant: normal;
  text-transform: none;
  line-height: 1em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
```


## <span class="fa fa-flag" /> おまけ: 一度に大量のfontをimportする

つい最近まで知らなかったのですが、glyphの選択画面ではDrag&Dropすると、範囲選択できるようになってました。一気にfontをimportする時などに地味に便利です。
(画面の端っこのほうだと、ドラッグの開始判定がされないので注意).

![Fontello_-_icon_fonts_generator.png](https://qiita-image-store.s3.amazonaws.com/0/8808/310c44a8-32c5-0eb1-9e79-e5a9b9e13522.png)

[^1]: 本文とはあまり関係ないですが、Qiitaの文中では、`<span class="fa fa-plus"/>` のように書くと、font-awesomeのiconが使えたりします.
Gitlab Merge Request Builderを適用する

Gitlab Merge Request Builder Pluginは、GitlabにMergeRequestが作られたことを検出してジョブを実行するJenkinsプラグインです。

MRがマージされた後のソースコードをワークスペースに作成してからビルド（テスト）を実行できるため、マージ元ブランチだけに行うよりも精度の高いCIができます。

また、該当のMRのコメント欄に結果を投稿してくれる機能もあります。（このへんの魅力は後述のくりにっきさんを見るとわかりやすいです）

Reference
--------------------

* [J( 'ｰ`)し「たかしへ。Gitlab Merge Request Builder Pluginを入れてみたわよ」 - くりにっき](http://sue445.hatenablog.com/entry/2014/10/10/111601)
* [本家ドキュメント](https://github.com/timols/jenkins-gitlab-merge-request-builder-plugin/blob/master/README.md)

この記事で説明しないこと
--------------------

[くりにっき](http://sue445.hatenablog.com/entry/2014/10/10/111601)さんで説明されていることは極力説明しません。

本記事では、くりにっきさんと本家のドキュメントを見比べながら試行した内容について説明します。

書き終わってから気づいたこと
--------------------

中途半端に日本語化されたJenkinsを元に書いたので、フル英語のJenkinsをお使いの皆様は適宜読み替えてください。ごめんなさい。

対象システム
--------------------

JenkinsとGitLab両方に設定を行います。

このドキュメント内では

* Jenkins内でMR処理のために作成したジョブのことを「ジョブX」
* GitLab内でMRを作成するプロジェクトのことを「プロジェクトX」
    - `GroupX/ProjectX`の場合も

と呼称します。

バージョン
--------------------

* Jenkins 1.626
* Gitlab: 7.13.4
* Gitlab Merge Request Builder: 1.2.2

前提条件
--------------------

1. プロジェクトXのVisibility Levelが`Internal`または`Public`になっていること
    - Privateなリポジトリが相手だと動き出しませんでした。
2. ジョブXでGitLabからソースコードをフェッチしてくるときの認証は、GitLabのDeployKeyの仕組みを使って行われていること
    - まあセキュアならなんでもいいとは思います
3. JenkinsへのGitlab Merge Request Builder Pluginの導入は済んでいること
4. Jenkinsのシステム設定画面で、Gitlabのホスト名の指定やアカウントやAPIキーの登録が済んでいること

プロジェクトXの設定
--------------------

1. ジョブXで使っているDeployKeyを、プロジェクトXでEnableにする
2. Jenkinsのシステム設定で入力したGitLabアカウントを、プロジェクトXのメンバーに入れる
    - このとき、権限は`Guest`で構わない

以上。

ジョブXの設定
--------------------

### ソースコード管理

* Git
* Repositories
    - Repository URL: `${gitlabSourceRepository}`
    - Credentials: プロジェクトAでEnableにしたやつ
    - Name: `${gitlabSourceName}`
* Branches to Build
    - Branch Specifier: `refs/remotes/${gitlabSourceName}/${gitlabSourceBranch}`
* Additional Behaviors: `Merge Before Build`
    - Name of repository: `origin`
    - Branch to merge to: `${gitlabTargetBranch}`
    - Merge Strategy: `default`
    - Fast-forward mode: `--no-ff`(筆者の好みです。お好きにどうぞ。)

### ビルド・トリガ

* Gitlab Merge Requests Builder
    - Gitlab Project Path: `GroupX/ProjectX`
    - Crontab line: `H/2 * * * *`(筆者の好みです。お好きにどうぞ。)

### ビルド

お好きにどうぞ。

### ビルド後の処理

お好きにどうぞ。

ジョブを実行する
--------------------

1. プロジェクトXにMergeRequestを作成する
2. 最大2分待つ
3. 1で作ったMergeRequestにビルド状況のコメントが付く
4. ☆-(ノﾟДﾟ)八(ﾟДﾟ )ノｲｴｰｲ

オマケ: ジョブ単体の動作確認をしたい
--------------------

通常、マージリクエストを検出した上で実行されたジョブの中では、`${gitlabSourceBranch}`や`${gitlabTargetBranch}`などの変数はマージリクエストから得られた情報によって解決されます。一方、任意のタイミングでビルドを実行したい場合には変数の解決ができません。

そんな場合は、「ビルドのパラメータ化」で下記の値を設定することで、任意のタイミングでのビルド実行ができます。

* gitlabSourceRepository: マージ元リポジトリ（フォークしている場合）
* gitlabSourceName: マージ元リポジトリのリモート名（originみたいなやつ）
* gitlabSourceBranch: マージ元ブランチ
* gitlabTargetBranch: マージ先ブランチ
* gitlabMergeRequestId: マージリクエストのID（`!999`の数字部分）

`gitlabSourceName`は１つのリポジトリ内でMRを作っている場合は`origin`ですが、フォークしたブランチからマージリクエストを作成した場合にどんな名前になるのか追いきれませんでした。（誰か教えて）

まとめ
--------------------

ほぼ本家のREADMEのつまみ食いみたいな感じになりました。プロジェクトのVisibility Levelが`Internal`または`Public`じゃないと動かないのはしばらくハマりましたね。。。

それにしても、botがMergeRequestのコメント欄で動き出すと楽しいですね！　Let's自動化！！！
Redmine github_hook オレオレヘルパースクリプト

（前回までのあらすじ
Redmineを使ってみようと思いインストールし、github_hookプラグインもインストールしたものの、Githubとの連携手順に泣きそうになった俺氏はオレオレヘルパースクリプトの開発に着手したのだった・・・

※前回とかありません。これが初回です。

## 環境

```
CentOS release 6.7 (Final)

Environment:
  Redmine version                3.1.0.stable.14520
  Ruby version                   2.2.3-p173 (2015-08-18) [x86_64-linux]
  Rails version                  4.2.3
  Environment                    production
  Database adapter               Mysql2
SCM:
  Subversion                     1.6.11
  Git                            1.7.1
  Filesystem                     
Redmine plugins:
  redmine_github_hook            2.2.0
```

というわけで作りました。
使う場合はパスなど適宜変更をお願いします。

**.ssh/config をいじります！注意してください！**

複数のリポジトリを扱う場合は、違う鍵が必要になるらしいので、そこらへんまで含めて毎回手作業はしんどかったのが作ったきっかけ。

正直ちょっとまだよくわからなくて、Rootで実行する前提です。
sudoだとなんでか上手くいかない箇所があったのでRootユーザー限定ですが、そのうちちゃんと調べてそこら辺修正したい。

もしこのスクリプトをコピペって使う場合は、先に```su -```とかでRootになっておいてください。

```shell-session
# 
# 引数確認
# 
if [ $# -ne 2 ]; then
  echo "myGithubHelper.sh <repos_owner> <repos_name>" 1>&2
  exit 1
fi

# 
# 鍵を作成
# 
ssh-keygen -t rsa -f /var/www/.ssh/${1}-${2}

echo ----
cat /var/www/.ssh/${1}-${2}.pub
echo ----

# 
# 鍵を使うホスト設定
# 
touch /var/www/.ssh/config

echo "
Host github-${1}-${2}
  User git
  Port 22
  HostName github.com
  IdentityFile /var/www/.ssh/${1}-${2}
  TCPKeepAlive yes
  IdentitiesOnly yes
" >> /var/www/.ssh/config

chown -R apache:apache /var/www/.ssh/config
chown -R apache:apache /var/www/.ssh/${1}-${2}
chown -R apache:apache /var/www/.ssh/${1}-${2}.pub


# 
# Cloneするスクリプトの生成
# 
echo "
cd /opt/repos

sudo -u apache git clone --bare git@github-${1}-${2}:${1}/${2}.git
chown -R apache:apache /opt/repos/${2}.git

cd -
cd /opt/repos/${2}.git

sudo -u apache git remote add origin git@github-${1}-${2}:${1}/${2}.git

cd -

echo ----
echo /opt/repos/${2}.git
echo ----
" > ./clone-${1}-${2}.sh

chmod 755 ./clone-${1}-${2}.sh

```

これをRootになってから、下記のように実行します。

```
myGithubHelper.sh github_user github_repo
```

すると、公開鍵が表示されます

```
----
ssh-rsa qwertyuiklxrctvybuhnjimk..........
----
```

これをコピーして、GithubのDeploy Keysに追加します。

実行したディレクトリに

```
clone-github_user-github_repo.sh
```

も作成されているので、実行してGithubからCloneします。

```
----
/opt/repos/github_repo.git
----
```

と表示されるので、Redmineのリポジトリに設定します。

最後に、GithubのWeb hookを設定して完了です。
初心者ならでは、github登録する

＜作業目的＞
・作業端末「Mac」からgitコマンドにて対象ファイルをgithubに登録し、みんなに公開する

-------
＜前提条件＞
・githubのアカウントを登録（取得）しておく。

-----
＜作業手順＞
1. macにbrewを使用してgitインストール
```
$ brew install git
```

1. macのgitにユーザ登録
```
$ git config --global user.name "ユーザ"
$ git config --global user.email "メールアドレス"
```

1. その他設定(任意でどうぞ)　出力カラーリング、gitコマンドのエイリアス設定
```
$ git config --global color.ui auto
$ git config --global alias.co checkout
```

1. ローカルリポジトリ作成（任意のディレクトリ配下に：例github）
```
$ git init
Initialized empty Git repository in /〜任意〜/github/.git/
```

1. 今回の対象ファイルをコミット
```
対象ファイルを、上述手順で作成された「github」ディレクトリに配置。
```

1. コピー後のステータス確認
```
$ git status
```
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed
	対象ファイル
nothing added to commit but untracked files present (use "git add" to track)

1. インデックスに登録
```
$ git add 対象ファイル
```

1. 登録後のステータス確認
```
$ git status
```
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file:   対象ファイル

1. インデックスのファイルをコミット
```
$ git commit -m "first commit"
```
[master (root-commit) cbb5a29] first commit
 1 file changed, 45 insertions(+)
 create mode 100644 対象ファイル

1. コミット後のステータス確認
```
$ git status
On branch master
nothing to commit, working directory clean
```

1. コミット後のログ確認
```
$ git log
```
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ※羅列
Author: "アカウント" <"メールアドレス">
Date:   Wed Aug 26 02:01:26 2015 +0900
first commit

1. githubに接続できるように、mac上でssh-keyの作成
```
$ ssh-keygen
```
いろいろ聞かれるが、全て空白エンターを入力

1. ssh-keyの作成確認 　※何も指示しなければ（空白エンター）、「~/.ssh/」配下にできます
```
ls -l ~/.ssh/
id_rsa
id_rsa.pub　→こちらを「github」に登録
```

1. 「github」にログインし、GUIにて「id_rsa.pub」を「github」に登録。
```
ユーザの「setting」を押下
「SSH key」を選択。
「add SSH key」を押下し、「title」と「key」を入力。
　　・title : 自分が忘れないように、任意で入力
　　・key   : id_rsa.pubを開いて、内容をコピーして貼り付け
「Add key」を押下
```

1. 「github」にて新規のリモートレポジトリを作成
```
「new repository」に選択
「Repository name」を任意で入力し、「Public」にチェックを入れ、「create repository」を押下
```

1. リモートレポジトリのURLをローカルに登録
```
$ git remote add origin git@github.com:"githubアカウント名"/xxxxx.git
```
→作成したリモートレポジトリが「xxxxx.git」となります。

1. リモートレポジトリに登録（push）
```
$ git push -u origin master
```
The authenticity of host 'github.com (192.30.252.130)' can't be established.
RSA key fingerprint is "xx:xx:xx（省略）"
Are you sure you want to continue connecting (yes/no)? →yesを入力
Warning: Permanently added 'github.com,192.30.252.130' (RSA) to the list of known hosts.
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 780 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:"githubのアカウント名"/xxxx.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.


1. これにて完了。お疲れ様でした。
Java サロゲートペア文字数カウント


JavaでTwitterのような140文字制限をかけようとするときに考える必要がある。
サロゲートペアについて。

## サロゲートペアとは
サロゲートペアとは、16 ビット符号単位の組による単一の抽象文字の表現である。 UTF-16 でのみ用いられる。
Unicode番号が16進数で10000以上の文字を、UTF-8(およびUTF-16)では1 符号単位で表現することができない。 
そのため、Unicode番号D800〜DBFFとDC00〜DFFFの組み合わせで表現した仕組み。
たとえば「𩸽(ほっけ)」のUnicode番号は16進数で29E3Dであるのに対して、
実際のコードとしてはD867とDE3Dのふたつの文字から構成された文字になる。

これを知らずに、

```javascript
str.val().length();
```

とかやると1文字あたり2カウントしてハマった。


## 実装
シンプルに1文字ずつバリデーションをかけて、
カウントアップすることで文字入力のチェックを行った。

今回は

```java
BreakIterator bi = BreakIterator.getCharacterInstance();
bi.setText(string);
int count = 0;
while (bi.next() != BreakIterator.DONE) {
	count ++;
}
System.out.println(count);
```

実際にプログラムに組み込む際は、
static メソッドにして、他メソッドからよびだせるようにして
実装をしました。

## 補足
####サロゲートペアにあたる文字一覧
𠀋 𡈽 𡌛 𡑮 𡢽 𠮟 𡚴 𡸴 𣇄 𣗄 𣜿 𣝣 𣳾 𤟱 𥒎 𥔎 𥝱 𥧄 𥶡 𦫿 𦹀 𧃴 𧚄 𨉷 𨏍 𪆐 𠂉 𠂢 𠂤 𠆢 𠈓 𠌫 𠎁 𠍱 𠏹 𠑊 𠔉 𠗖 𠘨 𠝏 𠠇 𠠺 𠢹 𠥼 𠦝 𠫓 𠬝 𠵅 𠷡 𠺕 𠹭 𠹤 𠽟 𡈁 𡉕 𡉻 𡉴 𡋤 𡋗 𡋽 𡌶 𡍄 𡏄 𡑭 𡗗 𦰩 𡙇 𡜆 𡝂 𡧃 𡱖 𡴭 𡵅 𡵸 𡵢 𡶡 𡶜 𡶒 𡶷 𡷠 𡸳 𡼞 𡽶 𡿺 𢅻 𢌞 𢎭 𢛳 𢡛 𢢫 𢦏 𢪸 𢭏 𢭐 𢭆 𢰝 𢮦 𢰤 𢷡 𣇃 𣇵 𣆶 𣍲 𣏓 𣏒 𣏐 𣏤 𣏕 𣏚 𣏟 𣑊 𣑑 𣑋 𣑥 𣓤 𣕚 𣖔 𣘹 𣙇 𣘸 𣘺 𣜜 𣜌 𣝤 𣟿 𣟧 𣠤 𣠽 𣪘 𣱿 𣴀 𣵀 𣷺 𣷹 𣷓 𣽾 𤂖 𤄃 𤇆 𤇾 𤎼 𤘩 𤚥 𤢖 𤩍 𤭖 𤭯 𤰖 𤴔 𤸎 𤸷 𤹪 𤺋 𥁊 𥁕 𥄢 𥆩 𥇥 𥇍 𥈞 𥉌 𥐮 𥓙 𥖧 𥞩 𥞴 𥧔 𥫤 𥫣 𥫱 𥮲 𥱋 𥱤 𥸮 𥹖 𥹥 𥹢 𥻘 𥻂 𥻨 𥼣 𥽜 𥿠 𥿔 𦀌 𥿻 𦀗 𦁠 𦃭 𦉰 𦊆 𦍌 𣴎 𦐂 𦙾 𦚰 𦜝 𦣝 𦣪 𦥑 𦥯 𦧝 𦨞 𦩘 𦪌 𦪷 𦱳 𦳝 𦹥 𦾔 𦿸 𦿶 𦿷 𧄍 𧄹 𧏛 𧏚 𧏾 𧐐 𧑉 𧘕 𧘔 𧘱 𧚓 𧜎 𧜣 𧝒 𧦅 𧪄 𧮳 𧮾 𧯇 𧲸 𧶠 𧸐 𧾷 𨂊 𨂻 𨊂 𨋳 𨐌 𨑕 𨕫 𨗈 𨗉 𨛗 𨛺 𨥉 𨥆 𨥫 𨦇 𨦈 𨦺 𨦻 𨨞 𨨩 𨩱 𨩃 𨪙 𨫍 𨫤 𨫝 𨯁 𨯯 𨴐 𨵱 𨷻 𨸟 𨸶 𨺉 𨻫 𨼲 𨿸 𩊠 𩊱 𩒐 𩗏 𩙿 𩛰 𩜙 𩝐 𩣆 𩩲 𩷛 𩸽 𩸕 𩺊 𩹉 𩻄 𩻩 𩻛 𩿎 𪀯 𪀚 𪃹 𪂂 𢈘 𪎌 𪐷 𪗱 𪘂 𪘚 𪚲
AnsibleでLVS(DSR構成)をお手軽に構築する


LVSの作成をAnsibleのPlaybookでお手軽に作成してみた。
Ansibleを動かす為の準備は[こちら](http://kobitosan.hatenablog.com/entry/2015/08/21/222104)参照

##Playbookでやる事リスト

- SELinux無効化

|項目|内容|
|---|---|
|パッケージのインストール|libselinux-python|
|selinux 無効化|/etc/selinux/config<br>SELINUX=disabled|


- LVSに必要な設定

|項目|内容|
|---|---|
|パッケージのインストール|ipvsadm,keepalived|
|自動起動|keepalived|
|sysctl|net.ipv4.ip_forward = 1|

##実際のPlaybook

core moduleでほとんどの事がカバー出来るので楽!!

[ansibleのモジュール一覧](http://docs.ansible.com/ansible/list_of_all_modules.html)

```lvs.yml
- hosts: testgrp
  remote_user: vagrant
  sudo: yes
  tasks:
  - name: Install libselinux-python
    yum: name=libselinux-python state=present

  - name: Permissive selinux
    selinux: state=disabled

  - name: reboot!
    command: shutdown -r now

  - name: wait for SSH port down
    local_action: wait_for host={{ inventory_hostname }} port=22 state=stopped

  - name: wait for SSH port up
    local_action: wait_for host={{ inventory_hostname }} port=22 state=started delay=30

  - name: Install ipvsadm keepalived
    yum: name={{ item }} state=present
    with_items:
      - keepalived
      - ipvsadm

  - name: keepalived chkconfig on
    service: name=keepalived enabled=yes

  - name: ip fowarding setting
    sysctl: name="net.ipv4.ip_forward" value=1 sysctl_set=yes
```

##デバックしてみる(Syntax Check)

####正常終了時

```
$ ansible-playbook lvs.yml --syntax-check

playbook: lvs.yml

```


####あえてエラーを出してみる

```
$ ansible-playbook lvs.yml --syntax-check
ERROR: Syntax Error while loading YAML script, lvs.yml
Note: The error may actually appear before this position: line 5, column 11

  tasks:aaa
    - name: Install ipvsadm keepalived
          ^
```

##実行

全部通ったー！

![1__tmux.jpg](https://qiita-image-store.s3.amazonaws.com/0/40850/935f5bac-e18a-cb30-f9b7-9645679431d9.jpeg "1__tmux.jpg")

後は、[こちら](http://qiita.com/nagais/items/b9b1940cdaf9a17b4088)参考にkeepalivedのconfig入れればあっという間にLVSの出来上がり。

Ansible触り始めたばっかりだけど、手軽でとてもいい感じな気がする。

##参考
[Ansibleの事例とちょっとしたTips](http://qiita.com/volanja/items/d38fe0678848bae6902f)
配列内の空白で区切られた文字列を処理する

配列内の文字列を処理したいと思いました．文字列は空白で区切られています．ここから最頻値を出します．

今回は動物データの最頻値を出すという前提にしました．

```
$list = array("犬 柴犬",  "犬 ポメラニアン",  "猫",  "ライオン",  "熊 シロクマ", "猫 雑種", .......);
```

文字列は "動物名 種類" といったような形式です．しかし，種類が入っていないもの，曖昧なものもあります．ものによっては "鳥 カラス ハシボソガラス" と文字列内に含まれる情報量が多いものもあります．これを考慮し， この最頻値の区切り前の一つ目の動物名を出し，その動物名を取り除いてリストを再構成し，再帰的に処理していきます．


```php
<?php

function ModeLocation($list) {

  // リストを昇順ソート
  sort($list);

  // 配列の要素を' '区切りで分割し、配列にする
  // キーは別で重複を削除して保存する
  // array_uniqueがキーを振り直さないことを利用する
  // e.g. "犬 柴犬" -> array("犬", "柴犬")
  $once = array();
  foreach ($list as $key => $value) {
    $list[$key] = explode(' ', $value);
    $once[] = $list[$key][0];
  }
  $once = array_unique($once);

  // 同じデータのキーを保存しておく
  $same_data_key = array();
  foreach ($once as $once_key => $once_value) {
    $same_data_key[] = $once_key;
  }

  // キーを保存したので，キーを振りなおす
  // （カウント関数のキーと対応を取るため）
  $once = array_values($once);

  // 最頻値を求めるためのカウント処理
  // 正規表現を使って "犬" といったキーワードのものを探す
  // list配列の1つ目の要素に文字列ないの上位のものがくるので，それをカウントする
  // e.g. array("犬", "柴犬")とあったら，"犬"が上位となる
  $data_count = array_fill(0, count($once), 0);
  foreach ($once as $once_key => $once_value) {
    foreach ($list as $list_key => $list_value) {
      if (isset($list_value[0]) && preg_match("/".$once_value."/u", $list_value[0])) {
        $data_count[$once_key]++;
        array_shift($list[$list_key]);
      }
    }
  }

  // 最頻値を出す．
  // max関数ではキーを取り出せないので，降順ソートして先頭のキーを取り出す
  arsort($data_count);
  $max_loc = $once[reset(array_keys($data_count))];

  // 再帰をするための前処理
  // listはソートされており，同じ上位の単語のものが並んでいる
  // same_data_keyにはそのキーが保存されている
  // 同じ上位の単語のキーを取り出す
  // start_key ~ end_key までが同じ上位の単語となる
  $start_key = $same_data_key[array_search($max_loc, $once)];
  $end_key = $same_data_key[array_search($start_key, $same_data_key)+1];

  // 次のリストを作成する
  // 再帰的に処理を行うので，引数の形式を揃えておく
  // 配列が空のものは除いておく
  $next_list = array();
  for ($i = $start_key; $i < $end_key-1; $i++) {
    if (!empty($list[$i])) {
      $next_list[] = implode(' ', $list[$i]);
    }
  }


  // 配列が空の場合は，再帰処理を行わずに現在の最頻値の値を返す
  if (!empty($next_list)) {
    return $max_loc . " " . ModeLocation($next_list);
  } else {
    return $max_loc;
  }
}
?>
```

自分のプロジェクトに合わせて作ったので，下位の用語がないものでも他の下位のものがあれば調べるようになっています．例えば，"猫"と"猫 雑種"などの要素があり，データ量が "猫" > "猫 雑種" でも回答は"猫 雑種"となってしまいます．やりたいことは単純なのですが，オーバーヘッドが大きいので，どうにか改良したいですね．
AWSのキーペア(PEMファイル)から共有鍵を表示する

よくつかうけどコマンドを忘れてしまって、
毎回検索してしまっているので、
書き留めておきます。


```
$ ssh-keygen -y -f keypair.pem

ssh-rsa AAAABDSNADJNSJDNSDNSNDJNJDSNDGSo+Y97547tBYMiLhqrljnb5+RnaXUuf14x1/b99b+9WJH5aCI8kxAjMcDg7WehedasdashdjasdjKXKSANXKASNDKNASKNASKDNSAKJKDSNSAwIOEiFY5R2ZucacPXaKxKH+wai4A7aIMndM1QXx82UE13hJW6viq1p91Z+jlQcfpMIU/jnRfaGKIYYe6bscIa37t/16Cdv0YZ2/dsadhasdhas

```

これだけです。
あとは、共有鍵を設定したいサーバのauthorized_keys に追加してあげるだけでOKです。

```
$ vim ~/.ssh/authorized_keys 
```

以上！！
Gitリポジトリをバックアップする

## 手順

```bash:backup_git_repository.sh
set -eu

WORK_DIR="/path/to/work/directory"
GITHUB_USERNAME="artifactsauce"
REPOSITORY="hogehoge"

[ -d $WORK_DIR ] || mkdir $WORK_DIR
cd $WORK_DIR
git clone --mirror git@github.com:${GITHUB_USERNAME}/${REPOSITORY}.git
cd ${REPOSITORY}.git
git fetch --all
git remote remove origin
cd $WORK_DIR
tar zcvf ${REPOSITORY}.tar.gz ${REPOSITORY}.git
```

どこでホストされているリポジトリでも基本的には同じですが、ここではGitHubでホストされたリポジトリを例にしています。

## 補足

ローカルシステム上のリポジトリをバックアップする場合は、Unixファイルシステム上のPATHを指定します。また `--no-local` オプションをつけることでハードリンクを作成させないようにします。
SVGをcss/jsで操作するときに知っておきたいこと

# はじめに
**※SVG初心者向きの記事です**

SVGはスケーラブルでベクターなグラフィックスです。レスポンシブや高解像度ディスプレイに対応する時にはとても頼もしい存在です。htmlと同じようにcssやjsでの制御も可能なため、インタラクティブなコンテンツもお手の物です。

そんなSVGは表示だけであれば簡単ですが、cssやjsを利用する際には知っておきたい基本知識があります。
これ以上、私のように時間を浪費してしまう哀れな子鳥たちを増やさぬようメモしたいと思います。ｱｰﾒﾝ



# 目次
- 表示のさせかたに気をつけろ！
- cssに気をつけろ！
- fill: none;に気をつけろ！
- viewBoxに気をつけろ！
- jQueryに気をつけろ！
- サーバーの設定に気をつけろ！




# 表示のさせかたに気をつけろ！
SVGの表示方法は複数あります。

1. `<img>`のsrcでファイルを読み込む
2. background-imageプロパティでファイルを読み込む
3. htmlにインラインで直接SVGタグを記述する
4. object要素のdata属性でファイルを読み込む

- 1, 2は画像要素となり、SVGタグ内のpathに対して**css, jsが効きません**
- 4はiframeのように**別documentになりcss, jsはそのdocumentに対して適用させる**必要があります

```1.html
<img src="hoge.svg">
```
```2.css
div {
  background-image:url("hoge.svg");
}
```
```3.html
<div>
  <svg width="" height="" viewBox="">
    <!-- 略 -->
  </svg>
</div>
```
```4.html
<object id="mySvg" data="hoge.svg" type="image/svg+xml"></object>
```
```4を操作する.js
var svg_doc = document.getElementById('mySvg').contentDocument;
var $svg = $(svg_doc).find('svg');
```


## 追記: ajax()で追加する
後で気づきましたが、ajax()でhtml内にSVGタグを動的に追加しても問題なく動きました。
同じdocument内に追加しているためcssもそのまま適用されました。

> 環境によって動作が異なるかもしれません

```ajaxでsvgタグを追加する.js
$.ajax({
    type: 'get',
    url: './xxx.svg',
  })
  .done(function(returnData) {
    var svg = $(returnData).find('svg');
    $('#addArea').append(svg);
});
```

# cssに気をつけろ！
SVGのcssはいわゆるあの**cssとは異なります**。
共有して使用できるプロパティも多くありますが、独自のものや逆に使えないものもあります。

> スタイル付け – SVG 1.1 （第２版）
> https://triple-underscore.github.io/SVG11/styling.html
> > （原文） http://www.w3.org/TR/SVG/styling.html#SVGStylingProperties




# fill: none;に気をつけろ！
fill: none;はそのpathの塗りつぶし色を透明にします。
ただし**イベント自体も無効**にしてしまいます。
そのため`fill: none;`が効いている場合は`path:hover {fill: <color>;}`と指定しても動作しません。
特にIllustratorなどツールで書きだした時には、意図しないでnone属性がタグに付いているかもしれません。

回避策としては`pointer-events`を設定してやるか、noneではなくrgbaのalpha0で色を透明にしてやります。

```イベント無効対策.css
path {
  pointer-events: all;
}
/* もしくは */
path {
  fill: rgba(0,0,0,0);  /* fill: none; の代わり */
}
```




# viewBoxに気をつけろ！
SVGのviewPortとviewBoxがズレていると**見た目上のサイズ（比率）や位置が異なることがあります**。意図が無ければviewPortとviewBoxのwidth, heightは揃えておいた方が良いかと思います。

> ※viewBoxに関しては以前記事を書きました
> [SVGのViewBoxがよく分からないアナタとワタシへ](http://qiita.com/nekoneko-wanwan/items/75e13cd02caeb3dc9ad6)




# jQueryに気をつけろ！
jQueryの手にかかれば、SVGもDOM操作のように簡単に制御ができます。
ですが**一部メソッドについては、同じようには使えません**。
上手く動作しないものがあれば、そもそも同じように使用できるのか調べると良いかと思います。

> jQueryのバージョンによっては解決されているかもしれません
> 動作はjQuery-2.1.4で確認しました

## attr('viewBox', '')
jQuery側で属性が**lower case**に変換されてしまい動作しません。
`setAttribute()`を使いましょう。

```.js
$(obj)[0].setAttribute('viewBox', '')
```


## addClass() / removeClass()
`.attr('class', )`などを使いましょう。


※他にもあるかもしれません。



# サーバーの設定に気をつけろ！
**本番サイトでSVGが表示されない！**
そんな時は焦らずサーバー側でsvgが許可されているか確認しましょう。
特にsvgをgzipしていた場合は見落としがちかもしれません。

```.htaccess
AddType image/svg+xml .svg .svgz
AddEncoding gzip .svgz
```

> 反映されない場合は、キャッシュのクリアを試しましょう

※これはSVGに限ったことではなくcss/jsにも関係ありませんが、痛い目見たので......



# おわりに

まだまだ経験が少ないので、もっと色々と出てきそうです。気づいたら更新していければと思います。
通信ミドルウェア「モノビットリアルタイム通信エンジン」のCocos2d-x版が無料に


■URL：http://www.4gamer.net/games/313/G031389/20150824064/

通信系に疎い自分にはすごい助かります。
なんかできたらまた投稿します(´・ω・`)
PHP用のMarkdownパーサーライブラリ比較

# PHPでMarkdownをパースする

訳あってPHPでMarkdownファイルをパースする必要が出てきましたので、ライブラリを比較してみました。

結論から言うと、[cebe/markdown](http://markdown.cebe.cc/)が一番良さそうに感じました。

比較用にリポジトリを作りました。
https://github.com/naga3/markdown-comparison
composer installしてからindex.phpを開くといろいろなモードでREADME.mdをパースします。

# 比較ライブラリ

PHP Markdown / cebe/markdown / Parsedown

この3つがよく使われているようです。

## Benckmark

https://github.com/kzykhys/Markbench
Parsedown > cebe/markdown > PHP Markdown 的な感じです。

# PHP Markdown

Homepage | GitHub
---|---
https://michelf.ca/projects/php-markdown/ | https://github.com/michelf/php-markdown

## インストール

```
composer require michelf/php-markdown
```

## 標準でサポートしているMarkdownの種類

* [Traditional Markdown](http://daringfireball.net/projects/markdown/syntax)
* [Markdown Extra](http://michelf.ca/projects/php-markdown/extra/)

# cebe/markdown

Homepage | GitHub
---|---
http://markdown.cebe.cc/ | https://github.com/cebe/markdown

## インストール

```
composer require cebe/markdown
```

## 標準でサポートしているMarkdownの種類

* [Traditional Markdown](http://daringfireball.net/projects/markdown/syntax)
* [Github flavored Markdown](https://help.github.com/articles/github-flavored-markdown/)
* [Markdown Extra](http://michelf.ca/projects/php-markdown/extra/)

## その他特徴

* 改行をbrタグにする機能がある（Qiitaみたい）。
* 機能拡張が簡単に出来る。

# Parsedown

Homepage | GitHub
---|---
http://parsedown.org/ | https://github.com/erusev/parsedown

## インストール

```
composer require erusev/parsedown
```

## 標準でサポートしているMarkdownの種類

* [Github flavored Markdown](https://help.github.com/articles/github-flavored-markdown/)+[Markdown Extra](http://michelf.ca/projects/php-markdown/extra/)

# まとめ

速度もそこそこで、改行の扱いや拡張がたやすい[cebe/markdown](http://markdown.cebe.cc/)がオススメかなと思いました。
[Android]音量変更でWarningが出ない時の対応

# AudioManagerを使った音量変更

[AudioManager](http://developer.android.com/reference/android/media/AudioManager.html)を使うと、指定したStreamの音量を変更することもできます。

```java:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, nextVol, 0);

// nextVolの上限は端末やストリームによって異なります。
int max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
```

変更できる範囲は0~maxまでです。

## 指定できるフラグ

[AudioManager.setStreamVolume](http://developer.android.com/reference/android/media/AudioManager.html#setStreamVolume(int,%20int,%20int))などに設定できるフラグには以下のようなものがあります。

* [FLAG_PLAY_SOUND](http://developer.android.com/reference/android/media/AudioManager.html#FLAG_PLAY_SOUND)
  Whether to play a sound when changing the volume. 
  変更時にピッピッと音がなる。

* [FLAG_REMOVE_SOUND_AND_VIBRATE](http://developer.android.com/reference/android/media/AudioManager.html#FLAG_REMOVE_SOUND_AND_VIBRATE)
  Removes any sounds/vibrate that may be in the queue, or are playing (related to changing volume).
  サウンドも振動もさせない。

* [FLAG_SHOW_UI](http://developer.android.com/reference/android/media/AudioManager.html#FLAG_SHOW_UI)
  Show a toast containing the current volume.
  UIを表示させる。

* [FLAG_VIBRATE](http://developer.android.com/reference/android/media/AudioManager.html#FLAG_VIBRATE)
  Whether to vibrate if going into the vibrate ringer mode. 
  変更時に振動させる。

これらを使うことでユーザに音量調整のフィードバックを与えたり、逆になくしたりと可能になっています。

# 音量警告画面が表示されない

イヤホン挿入時に音量を一定以上にあげるとwarning画面が表示されます。
この警告画面で承認を得ないと、最大まで音量を上げることができません。
この仕組みは自動なので特に気にする必要はないかと思います。

しかし、特定環境でこの警告画面が表示されないことがあります。
AudioManager.FLAG_SHOW_UIを使えば表示されますが、音量変化のダイアログも出てしまうので、意図したものと少し違ってしまいます。

調べてみると、Android5.0以降は隠しフラグが追加されていました。
[AudioManager.FLAG_SHOW_UI_WARNINGS](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/media/AudioManager.java#AudioManager.0FLAG_SHOW_UI_WARNINGS)

```java:
    /**
     * Like FLAG_SHOW_UI, but only dialog warnings and confirmations, no
     * sliders.
     */
    public static final int FLAG_SHOW_UI_WARNINGS = 1 << 10;
```

こちらのフラグを追加すると警告ダイアログだけ表示されるようになりました。


おそらくFLAG_SHOW_UIを使って欲しいのだと思いますが、同じ問題に遭遇された方は参考になれば幸いです。