OmniAICreator/Qiita-1.07M huggingface dataset:
レジストリファイル (UTF-16) をdiffやGitで扱う

# はじめに

```console
$ file foo.reg
foo.reg: Little-endian UTF-16 Unicode text, with CRLF line terminators
```

レジストリファイル (.reg) はテキストファイルであるが,
__UTF-16__ は, 以下のようにバイナリとして認識されてしまうため, 適切に処理できない.

```console
$ less foo.reg
"foo.reg" may be a binary file.  See it anyway?

$ grep HKEY foo.reg # 何も出力されない

$ sed 's/HKEY/hkey/g' foo.reg # 変換されない

$ diff foo.reg bar.reg
Binary files foo.reg and bar.reg differ

$ git grep HKEY # 何も出力されない

$ git diff
Binary files a/foo.reg and b/foo.reg differ
```

テキスト処理したり, Gitで管理できるようにするためには, `nkf`でUTF-8に変換すればいい.


# UTF-16をdiff

プロセス置換でUTF-8に変換してから, `diff`に渡す.

```console
$ diff <( nkf -w foo.reg ) <( nkf -w bar.reg )
```

なお, `vim`はUTF-16のファイルを見ることができるので, `vimdiff`を使ってもいい.


# UTF-16でGit

まず, 以下のように, UTF-8に変換する[フィルタ](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt-diffltdrivergttextconv)を設定する.

```console
$ git config --global diff.to_utf8.textconv 'nkf -w'
```

そうすると, `~/.gitconfig`に以下のような行が追加されている.

```~/.gitconfig
[diff "to_utf8"]
    textconv = nkf -w
```

このフィルタを`*.reg`に適用したい場合は, [`.gitattributes`](https://git-scm.com/docs/gitattributes#_performing_text_diffs_of_binary_files)に以下の行を追加する.

```:.gitattributes
*.reg diff=to_utf8
```

以上により, `git diff`する前に, `*.reg`のファイルは`nkf`でUTF-8に変換されるため,
レジストリファイルも`git diff`で見ることができるようになる.

`git grep`も[`--textconv`](https://git-scm.com/docs/git-grep#Documentation/git-grep.txt---textconv)オプションで見ることができる.

```console
$ git grep --textconv HKEY # 出力される
```

# 参考

https://git-scm.com/docs/gitattributes#_performing_text_diffs_of_binary_files

https://blog.tkeo.info/blog/2015/02/26/git-diff-utf-16/

https://genjiapp.com/blog/2014/07/26/git-diff-utf-16-text-files.html
Windows10で開発環境構築 [失敗編]

[人柱の結果]:３時間弱(調査時間含む)で、中古Windows 7機にwindows１０を入れて、chocolateyとvirtualboxなどが無事動作。windows 7を最新版に更新するまでの待ち時間よりたぶん短い(2015年８月時点)。windows 7から移行した場合の違和感は少なく、windows 10、いずれは~~無難な~~選択肢の一つとなっていくのでは。

[その後気づいたこと]:virtualboxやboot2dockerが動かず、"??"となったところで、windows 10 32bit版がアップデート・インストールされていることに気がつく。そもそもwindows 10にほとんど関心がなかったので、いまだにwindows 10に32bit版があることを想像していなかった。。意味なき難作業の予感。。=>[Windows 10(64bit版)での開発環境構築[再挑戦]](http://qiita.com/kmry@github/items/545cb4399617eac538a7)に続く。。。

#用意したもの:中古のWindows 7マシン(Core i5, 8GB)。
約3.3万円。明細(Be-Stockから購入):
- ThinkPad T520  = 28,512円(本体価格 26,400円)　*#音割れ不都合特価*
- PC3-10600 4GB (増設RAM) = 5,400円(本体価格 5,000円)

スペック的は、十分な開発マシンを構築できるはず。ということで、spark関係の開発環境構築を目指す試行錯誤を記録。
# Windows10を手っ取り早くインストールする方法。
[Windows 10 アップグレード通知を待たずに直接ダウンロードする方法](http://tanweb.net/2015/08/07/4598/)
なるほど。MSのサイトからexeを落として直接インストールすることで、windows7のアップグレードなどを回避し最短でWIndows10を立ち上げられる、と。

ISO化しておく方が無難かと思うが:
[今日からWindows10を使う方法](http://qiita.com/tonkotsuboy_com/items/fc0c0c974f27a88309a7)
#windows10直接インストール
- 1回目:失敗(更新の確認で固まる)。 => とりあえず、画面をクラシックに変えてみると:
- ２回目:成功(時間１時間程度)。=>　何度か再起動が入るので、とりあえず放置。

##[参考] *このあたりはPC環境に依存しうる話*
###　ダウンロード待ち時間にしてみたこと、しなかったこと
- ThinkPad T520に最初から入っていたchromeにログインしてみる　=> 　=> 設定は無事引き継がれている
- dropboxのインストール&同期　=> 設定は無事引き継がれている
- Google日本語入力のインストールは後回し => windows10インストール後に不都合が起こっている模様のため。

###　Windows10インストール直後の不都合
- 解像度がXGAに固定された。。=> 「ディスプレイの詳細設定」->"識別"でFull HD画面に戻せた。

###Windows10インストール後にやってみたこと
- MS　アカウントでのログインに切り替える => 無難に成功
- Google日本語入力+やまぶきR(親指シフト) => 無難に成功

# パッケージ管理ツールは、OnegetでなくChocolatey
[Windows10のパッケージ管理を試した（仮）](http://qiita.com/Zero_Kohaku/items/302055fdd40595ea7199)
> Windows10にあげてパッケージ管理ができるようになった。
> Chocolateyが簡単に使えるようになった！

とのこと。
*#すなわち、windows10には、chocolateyリポジトリを使えるパッケージ管理ツールOnegetがディフォルトで入っているらしい。・・のだが、とりあえず、メジャーなchocolateyで作業を進めたほうが無難と判断。*

## インストール手順
+ コマンドプロンプト立ち上げ : "WebとWindowsを検索"に'cmd'と入力して立ち上げ*(Windowsロゴキー+R"ショートカット相当)*
+ その後の作業は、[Windows用パッケージ管理ソフトChocolateyは神](http://qiita.com/hachi8833/items/5f7412e3daddddc60574)とか[Chocolatey + VirtualBox + Vagrant の簡単セットアップ ](http://qiita.com/murachi1208/items/5b429cb7cedf76164e67)とかを見つつ。

## Chocolateyでアプリをインストール(cinst -y)してみる
- virtualbox => 最新版が入った
- github (GitHub for Windows) => 最新版が入ったが、インストール後にコマンドプロントに戻らず。 
- atom => 最新版が入った
- vagrant　=> コマンドラインから起動できない。とりあえずuninstallしておく。
- その他、どんなアプリが入るのかは、choco listで一覧を確認できる。 
*インストールしたアプリの起動は、"WebとWindowsを検索"からアプリ名の冒頭数文字を入れて行える(ふつうに便利)*

# あとはお好きに。
ここまでくれば、あとは各自のやりたい開発環境構築、だいたいできるでしょう。cinstで入らなかったvagrantは普通にサイトからインストールして、再起動したら、普通に立ち上がったので、良しとする。
Rubyでベンチマークを取る


## はじめに

RubyでベンチマークするのはRuby標準の[benchmarkライブラリ][benchmark]を使えば簡単にできます。

さらに、より簡単にベンチマークを取れる[benchmark-ips][ips]というGemもあります。
このGemは、RailsにContributionする際にベンチマークを取る方法として、公式に指定されてもいます。

http://railsguides.jp/contributing_to_ruby_on_rails.html#ベンチマークを行う

以下ではこの2つの使い方を簡単に見ていきます。

## [benchmark-ips][ips]

### 概要

ipsとは"iterations per second"の略になります。

このGemでベンチマークすると「処理回数（イテレーション回数）/秒」を計測してくれます。
次の項で説明するRuby標準のbenchmarkライブラリは自分で実行回数を指定しなければならないのですが、こちらはその手間がなく、かつ処理ごとに何倍の速度差があるかを出してくれるので便利です。

### 使い方

まずはインストールしましょう

```sh:console
$ gem i benchmark-ips
```

コードの書き方は以下のとおり。（[公式](https://github.com/evanphx/benchmark-ips#benchmark-ips)から引用・整形）

```ruby:計測コード
require 'benchmark/ips'

Benchmark.ips do |x|
  x.report("addition") { 1 + 2 }
  x.report("addition2") do |times|
    i = 0
    while i < times
      1 + 2
      i += 1
    end
  end
  x.report("addition3", "1 + 2")
  x.report("addition-test-long-label") { 1 + 2 }

  x.compare!
end
```

実行結果は以下のようになります

```bash:結果
Calculating -------------------------------------
            addition    71.254k i/100ms
           addition2    68.658k i/100ms
           addition3    83.079k i/100ms
addition-test-long-label
                        70.129k i/100ms
-------------------------------------------------
            addition     4.955M (± 8.7%) i/s -     24.155M
           addition2    24.011M (± 9.5%) i/s -    114.246M
           addition3    23.958M (±10.1%) i/s -    115.064M
addition-test-long-label
                         5.014M (± 9.1%) i/s -     24.545M

Comparison:
           addition2: 24011974.8 i/s
           addition3: 23958619.8 i/s - 1.00x slower
addition-test-long-label:  5014756.0 i/s - 4.79x slower
            addition:  4955278.9 i/s - 4.85x slower
```

`report`メソッドにテストの名前（必須ではない）と計測したい処理を渡します。
`compare!`は必須ではないですが、書いておくと結果に"Comparison"という項目が出来て、
一目で最速の処理や遅い処理は何倍遅いかを表示してくれるので便利です。


#### 設定

細かい挙動は正直よくわかってないのですが、実行時に2つ指定できる設定があります。
`time`は計測する時間、`warmup`はおそらく処理のオーバーヘッドを少なくするために前処理（ウォーミングアップ）の時間を与えるものだと思います。多分

指定方法は以下の2通りのどちらかでやればOK

```ruby:
Benchmark.ips do |x|
  
  x.config(
  	time: 8, # default 5
  	warmup: 3 # default 2
  )

  # or

  x.time = 5
  x.warmup = 2
  
  ## 後略 ##
end
```

#### GC

ベンチマークをしている時だけGCを無効にしたい場合も多々あると思いますが、その時は以下のリンク先のコードをコピペしてやれば大体OK

https://github.com/evanphx/benchmark-ips#custom-suite

## [Benchmark][benchmark]

Ruby標準ベンチマークライブラリの使い方は以下のとおり

ipsとの違いはイテレーション回数を指定しなければいけないことと、`Benchmark.bm`を呼び出すことでしょうか。
基本的にはipsの方が便利なので、そっち使いましょう。

```ruby:計測コード
require 'benchmark'

n = 10000000
Benchmark.bm(7) do |x| # 引数の7は結果の表示を揃えるためで必須ではないです
  x.report("for:")   { for i in 1..n; a = "1"; end }
  x.report("times:") { n.times do   ; a = "1"; end }
  x.report("upto:")  { 1.upto(n) do ; a = "1"; end }
end
```

```bash:結果
              user     system      total        real
for:      1.100000   0.010000   1.110000 (  1.098665)
times:    1.080000   0.000000   1.080000 (  1.085871)
upto:     1.070000   0.000000   1.070000 (  1.065394)
```


[ips]:https://github.com/evanphx/benchmark-ips
[benchmark]:http://docs.ruby-lang.org/ja/2.2.0/class/Benchmark.html
ruby の後置き if に注意

ruby 見習い中ですが、後置き if 関して思わぬことにハマってしまいましたので情報共有します。

```ruby:例1
a = 1 if true
a = 2 if false
p a
結果 => 1
```

このコードの動作は、つぎのように解釈できます。1行目にて a = 1 の代入が実行される。2行目にて a = 2 の代入が実行されない。その結果、１行目で代入した値が残っている。

では、このコードの代入式の右辺をカッコで囲んでみます。

```ruby:例2
a = (1 if true)
a = (2 if false)
p a
結果 => nil
```

実行結果が例1と異なることが分かります。

これは、つぎのように解釈できます。1行目にて (1 if true) を評価した値 1 が a に代入される。2行目にて (2 if false) を評価した値 nil が a に代入される。その結果、nil になった。

つぎに、if より前の部分をカッコで囲んでみます。

```ruby:例3
(a = 1) if true
(a = 2) if false
p a
結果 => 1
```

今度は例1と同じになりました。つまり、ruby は「a = 2 if false」を代入式「a = (2 if false)」ではなく if 式「(a = 2) if false」として解釈していることに注意が必要です。

ではつぎはどうでしょうか？

```ruby:例4
a = if true then 1 end
a = if false then 2 end
p a
結果 => nil
```

これは「代入式」として解釈されています。つまり、以下と同じです。

```ruby:
a = (if true then 1 end)
a = (if false then 2 end)
```

後置きの if を使うときは、このあたりのことを理解しておかないと思わぬ結果になることがあるので注意が必要です。
755非公開API

# 残念ながらもう使えません

# 過去の産物です。

# 昔はこんなこともできました

[755](http://7gogo.jp/)のAPIは公開されていませんが、PC向けサイトのソースから、ある程度、APIを読み取ることは可能です。パケットキャプチャすれば鬼に金棒。

[そのAPIを使ってアーカイブサイトを作ると訴えられるという事例もある](http://blog.livedoor.jp/kojimaharunaurawa/archives/20232597.html)ため、使い方は限定的になると思いますが、読み取れる範囲のAPIをまとめます。

利用は自己責任でお願いします。また、本記事のサンプルでは、[HKT48の下野由貴さんのトーク](http://7gogo.jp/lp/_bQqqWI-gQoWkVIvojdMdG==)を例にしてご紹介します。なぜなら僕の推しメンｒｙ

なお、返却されるJSONの内容につきましては、別途、機会があれば。

## talk/info

トークに関する情報を取得します。

### パラメータ

|パラメータ名 | 必須任意 | 値の内容 | 値の内容 |
|:-----------|:-----------:|:-------------------|:--------------------|
| talkIds | 必須 | トークID | x4U1h5ChFX89GtN76wEuUm== |

### 使用例

http://7gogo.jp/api/talk/info?talkIds=x4U1h5ChFX89GtN76wEuUm==

## talk/post/list

トークのリストを出力します。

### パラメータ

|パラメータ名 | 必須任意 | 値の内容 | 値の内容 |
|:-----------|:-----------:|:-------------------|:--------------------|
| talkId | 必須 | トークID | x4U1h5ChFX89GtN76wEuUm== |
| postId | 必須 | 起点となるポストID | 345 |
| limit | 必須 | 取得件数(1～100) | 50 | 
| direction | 必須 | 表示順(PREF or NEXT) | NEXT |

postId件目の投稿からdirection順にlimit件分を取得するというイメージ。上の表を例にとると、345件目の投稿より後ろにある50件分の投稿を取得します。

(例)5件のデータのpostIdが[1,2,5,6,7]となっている場合

+ 検索条件：{postId:1,limit:3,direction='NEXT'}  
⇒postIdが1,2,5の投稿を取得
+ 検索条件：{postId:6,limit:3,direction='PREF'}  
  ⇒postIdが6,5,2の投稿を取得

### 使用例

http://7gogo.jp/api/talk/post/list?direction=NEXT&limit=50&postId=345&talkId=x4U1h5ChFX89GtN76wEuUm==

## talk/post/detail

1件のトークの詳細を取得します。

### パラメータ

talkIdとpostIdをURLに含めて使います。

talk/post/detail/**talkId**/**postId**


### 使用例

http://7gogo.jp/api/talk/post/detail/x4U1h5ChFX89GtN76wEuUm==/189

## published/hotOfficial/random

公式トークをランダムで表示します。

### パラメータ

|パラメータ名 | 必須任意 | 値の内容 | 値の内容 |
|:-----------|:-----------:|:-------------------|:--------------------|
| limit | 任意 | 取得件数(1～10) | 5 |
| offset | 任意 | 起点となる件数 | 10 |

### 使用例

http://7gogo.jp/published/hotOfficial/random?limit=10

## published/totalWatchOfficial/public

ウオッチ数が多い順に公式トークを表示します。

### パラメータ

|パラメータ名 | 必須任意 | 値の内容 | 値の内容 |
|:-----------|:-----------:|:-------------------|:--------------------|
| limit | 任意 | 取得件数(1～20) | 5 |
| offset | 任意 | 起点となる件数 | 10 |

### 使用例

http://7gogo.jp/published/totalWatchOfficial/public?limit=20

## published/rankingYesterdayOfficial/public

昨日のウォッチ数が多い順に公式トークを表示します。

### パラメータ

|パラメータ名 | 必須任意 | 値の内容 | 値の内容 |
|:-----------|:-----------:|:-------------------|:--------------------|
| limit | 任意 | 取得件数(1～20) | 5 |
| offset | 任意 | 起点となる件数 | 10 |

### 使用例

http://7gogo.jp/published/rankingYesterdayOfficial/public?limit=20

## published/hotGeneral/random

人気の一般トークをランダムで表示します。

### パラメータ

|パラメータ名 | 必須任意 | 値の内容 | 値の内容 |
|:-----------|:-----------:|:-------------------|:--------------------|
| limit | 任意 | 取得件数(1～10) | 5 |
| offset | 任意 | 起点となる件数 | 10 |

### 使用例

http://7gogo.jp/published/hotGeneral/random?limit=10

## おまけ

post取得系のAPI実行結果の中に投稿の種類を表す「postType」という属性があります。僕自身が意味をよく忘れてしまうので、備忘として書き残します。

### postType

1. 引用無しのテキスト
2. スタンプ
3. 画像
4. 引用ありのテキスト
5. リトーク
6. 動画
Boot2Docker on WindowsでMinGWのパス変換を回避する

WindowsのBoot2Dockerで`docker exec`のようなパスを渡すコマンドを実行すると以下のように失敗してしまいます。

```
$ docker exec -it 500e4b38e0fd /bin/bash
exec: "C:/Program Files (x86)/Git/bin/bash": stat C:/Program Files (x86)/Git/bin/bash: no such file or directory
```

これはMinGWの[Posix path conversion](http://www.mingw.org/wiki/Posix_path_conversion)によってパスがいい感じに変換されてしまうためです。
このルールとエラーメッセージから`/bin/bash`は`C:/Program Files (x86)/Git/bin/bash`に変換されている事が分かります。
それではどうすればいいのかと言えば、パスの先頭の`/`を二重にすることで変換を抑制できます。

```
$ docker exec -it 500e4b38e0fd //bin/bash
root@500e4b38e0fd:/data#
```

MinGWの[Posix path conversion](http://www.mingw.org/wiki/Posix_path_conversion)はコマンドライン文字列のすべてに影響するので`-f`オプションなどでファイルのパスを指定する際も同様に対処が必要になります。
unity > transformからGameObjectを得る > transform.gameObject

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

transformがわかっている時、それからGameObjectを得る例

```csharp
foreach(Transform child in prefabBase.transform) {
    Destroy(child.gameObject);
}
```

上記の例ではprefaBaseのchild全てをDestoryする。
SwiftでAAMFeedbackを実装する

基本的にObj-Cから脳内変換できる場合には問題ないがSwiftでコピペしたい人向け

podfileに記載
```
pod "AAMFeedback"
```

インストール
```
pod install
```

Swiftでのコード

```
 let avc = AAMFeedbackViewController()
 avc.toRecipients = ["mail@send.to"]
 avc.ccRecipients = nil
 self.navigationController?.pushViewController(avc, animated: true)
```

ボタンのaction等に上記コードを設定すれば、navigationController以下でフォームが開く
機械彫刻用標準書体フォント

http://font.kim/
> 機械彫刻用標準書体は、工業的な彫刻によって文字を作製するときの標準として日本工業規格（JIS）に定められた書体です。工業彫刻における技術的制約から、独特な機能美を持っています。
unity > 粒子を倍々にしていく (失敗編)

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

倍々ゲームをしたい。
最初１つの粒子がある。そこに１つ足す。
次は２つ足す。
次は４つ足す。
。。。

PrefabUtilyを使えばよさそうだが、うまくいかなかった。
とりあえず動くコードは以下。Main Cameraに関連付ける。
prefabBaseにはSphere(Rigidbodyつき）を関連付けた。

```csharp:ButtonPushed.cs
using UnityEngine;
using System.Collections;
//using UnityEditor; // for PrefabUtility

public class ButtonPushed : MonoBehaviour {

	public GameObject prefabBase;
	private GameObject GOmonomer;
	
	private GameObject sphGroup; // for grouping
	private const string kGroupName = "UnitedSphere";
	
	void Start () {
		GameObject sphGroup = new GameObject (kGroupName);
		Vector3 pos1 = new Vector3(0.0f, 0.0f, 0.0f);
		GOmonomer = Instantiate(prefabBase, pos1, Quaternion.identity) as GameObject;
		GOmonomer.name = "monomer";
		GOmonomer.transform.parent = sphGroup.transform;
	}

	void OnGUI() {
		if (GUI.Button (new Rect (10, 10, 100, 40), "Generate")) {
			Vector3 pos1 = new Vector3(0.0f, 2.0f, 0.0f);

			// replace of prfabBase
			prefabBase = GameObject.Find (kGroupName);		

			GOmonomer = Instantiate(prefabBase, pos1, Quaternion.identity) as GameObject;
			GOmonomer.name = "monomer1";

			GOmonomer.transform.parent = GameObject.Find(kGroupName).transform;
		}
	}

}
```

![Untitled_-_150809_unitePrefab_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/06e37dc8-7d0b-1125-06ad-99cc71aec352.jpeg)

うまく行ってない点は左側の階層構造に重複ができている点。

parentを整理しなおしたらいいのだろうか？
iPhoneアプリ作ってるからメモ。

#表示するアイコンを作る
画像をトップ用のアイコンに変換してくれる
[makeappicon](http://makeappicon.com/)

#現在地を取得する

[Swiftで現在地を取得してみた](http://qiita.com/ftsan/items/b3a04d30cd91c11aeea1)

#経路を検索する
[SwiftとMapKitで経路検索アプリを作成する](http://qiita.com/oggata/items/18ce281d5818269c7281)

#マップにピンをたてる
[MKMapKitでとにかくピンを突き立てるサンプル](http://qiita.com/woxtu/items/8594cb37830571a47d4a)

#[[iOS] アプリ名を変更する](http://qiita.com/hiroo0529/items/24b027b9708d14200b56)
chocolateyでwindowsパッケージ管理

# chocolatey
https://chocolatey.org/

# windwos 2012 R2で使う
## 準備
全部PowerShell
1.Set-ExecutePolicy
`Set-ExecutePolicy remotesigned`
2.Install Choholately
`iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))`
3.お好きに
```ps1
choco install notepadlplusplus -y
choco install git.install -y
```
GAEのFiles API終了で対応したこと

# Files APIとは？
GAEに付属しているBlobstoreに対して、プログラムから操作を行うために用意されたAPIです。
Blobstoreには[Blobstore API](https://cloud.google.com/appengine/docs/java/blobstore/)と呼ばれるモノも用意されていますが、このAPIでBlobstoreにデータを保存するには、ユーザーにWeb Formを提示して、そこからローカルファイルをUploadするといった手順が必要になり、プログラマブルにデータの保管ができません。
# Files APIの終了スケジュール
詳細は以下のURLに掲載されています。
https://cloud.google.com/appengine/docs/deprecations/files_api

この記事を書いた日(2015/8/9)の状況は以下になります。

* 既に新規アプリケーションではFiles APIを使用不可
* 既存アプリケーションからの使用について、日本時間で1時と18時からそれぞれ1時間の間、時々使用不可
* 8/26からは24時間にわたって時々使用不可
* **9/9には完全シャットダウン**

# 既存プログラムコード(Java)
実際に手を入れる必要があったコードは以下になります。

```
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile("text/tab-separated-values", filename);
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
int size = writeChannel.write(ByteBuffer.wrap(requestData.getRequestBytes()));
writeChannel.close();
writeChannel.closeFinally();
```

Files APIを使用して、リクエストに含まれたデータをBlobstoreに保管するまでの処理です。
# 改修後のプログラムコード(Java)
改修後のコードは以下になります。

```
GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename gcsFileName = new GcsFilename(BUCKET_NAME, gcsObjectName);
GcsFileOptions options = new GcsFileOptions.Builder().mimeType("text/tab-separated-values").build();
GcsOutputChannel gcsWriteChannel = gcsService.createOrReplace(gcsFileName, options);
int size = gcsWriteChannel.write(ByteBuffer.wrap(requestData.getRequestBytes()));
gcsWriteChannel.close();
```

Files APIの後継として用意された[GCSライブラリ](https://cloud.google.com/appengine/docs/java/googlecloudstorageclient/)を使用しています。
リクエストに含まれたデータをGCSに保管するまでの処理です。
# おわりに
データの保管先がBlobstoreからGCSに変わりましたが、比較的簡単に移行できました。
各種APIの終了という事態は避けられないものですが、皆で情報共有しながら乗り越えていければと思います。
Visual Studio 2015 Community の日本語化

以前の Express 版(日本語版)は最初から日本語が使えましたが、Community 版は英語版しかありませんね。
でも、Language Pack というのを入れれば日本語が使えるようになります。
ここからダウンロードできます。
[Microsoft Visual Studio 2015 Language Pack](http://www.microsoft.com/ja-jp/download/details.aspx?id=48157)

あるいは、"Microsoft Visual Studio 2015 Language Pack" でググってください。

![LangPack2015.png](https://qiita-image-store.s3.amazonaws.com/0/62802/157e0277-9b23-a807-590f-d866a1eb45ea.png)


vs_langpack.exe というファイルがダウンロードできるので、実行するだけです。もし、Visual Studio が立ち上がっていたら閉じておいた方がいいかもしれません。

完了したら、Visual Studio 2015 を起動します。このときは、まだ英語版のままです。

メニューバーの Tool / Options で Options ダイアログを開き、International Settings を変更します。これは Visual Studio 2013 Community と同じですね。結局、違うのは Language Pack のダウンロード先だけということです。
Visual Studio 2013 Community の日本語化については、たくさん記事があるので適当なものをググってみてください。例えば、下のような記事とやり方は同じです。

[Visual Studio Community 2013を日本語化する方法](http://biz-crew.com/archives/1165)

*
2015年上半期ベストBMS解凍ソフト

# まとめ

**BMSの解凍にはExplzhがおすすめです！**

# はじめに

さ～てBMSをダウンロードしてきたぞ～

よ～し早速解凍するか～～

![c1_2t.png](https://qiita-image-store.s3.amazonaws.com/0/78152/95cf39f1-5e7e-dde8-7183-1c2d5a759a04.png)

右クリックから・・・解凍・・・っと

![c3.png](https://qiita-image-store.s3.amazonaws.com/0/78152/825a7b75-31d8-ed0c-bb92-e5d1e4143041.png)

**！？！？**

![c4.png](https://qiita-image-store.s3.amazonaws.com/0/78152/1729ad91-2d70-9bea-5634-5f98d6b55dde.png)

**うわあああああああああああああああああ**

#“だばぁ” 現象について

新しいフォルダの中ではなく、圧縮ファイルと同じ階層に、.bmsファイルや.oggファイルが展開されてしまいました。この現象のことを、BMS界隈（の一部の人達の間）では、**だばぁ**と呼ぶようです。（ペヤングだばぁのアレです）

さて、これを防ぐために、「圧縮ファイル内にフォルダがひとつしかない場合は新たにフォルダを作成しない」というオプションがある解凍ソフトがあります。

#比較

| | WinRAR | Lhaplus | Explzh |
|:-:|:-:|:-:|:-:|
| **だばぁ回避** | × | ◯ |  ◯ |
| **2GB以上のファイル** | ◯ | × | ◯ |
| 価格 | 有料<br>（試用は無料）| 無料 | 個人利用は無料 |
| アイコン | 普通 | きれい | 普通 |
| zipの解凍 | ◯ | ◯ | ◯ |
| rarの解凍 | ◯ | ◯ | ◯ |
| 7z (7zip)の解凍 | ◯ | ◯<br>（dllが必要） | ◯ |

#おまけ

インストールしたら、メニューバーのツール→オプションから

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/ff83526c-6eff-817a-5592-95ec877a11b1.png)

と、

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/47f8e73d-63ee-19a4-216c-11b0a90bcdad.png)

にチェックを入れておくと良いかもしれません。(**2017/4/18追記：最近のバージョンでは「NTFSのZoneIDを維持して展開」という項目が追加されたようなので、このチェックも外しておきましょう。**)
また、BMSを解凍するときに、

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/9ada1cb5-e0b0-11d8-b138-9487b74c87f9.png)

のチェックを外すと、すこし心が穏やかになると思います。
androidでposition: abosolute; & 全画面表示


Android端末にて、

```
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
```

とすると、上部バーが消え、windowのheightがjavascriptで正しくとれなくなる端末がある。
スクロール発生させない1枚画のサイトでは結構大きな問題になってきたりするので気をつけたい。
udp > 冗長データによる再送信でパケットロスもなんのその

引用: オンラインゲームのしくみ: Unityで覚えるネットワークプログラミング by 河田匡稔（まさとし）さん
7.3 通信方式を考えよう

> 冗長データを用いた再送信処理では、過去に送信したフレームの入力情報も一緒に送信します。そうすることによって、現在のフレームよりも過去のフレームの入力情報が届いていない場合でも、その過去の入力情報を取り出すことができます。

例として以下の送信が挙げられていた。
- 1フレーム目: K1
- ２フレーム目: K2, K1
- 3フレーム目:K3, K2, K1
- 4フレーム目:K4, K3, K2

仮に2フレーム目でK2のパケットをとりこぼしても、3フレーム目か４フレーム目にもK2のパケットが含まれているので、そこから取ればいいとのこと。

送信側は受信側のACKを確認しなくてもいいので、ACK受信を待つ必要がないのがいいと思われる。
Docker Private Regisrty2.0をさくっと動かす


# 概要

Macのboot2docker上でregistry2.0をさくっと動かす。
https://docs.docker.com/registry/deploying/ を参考に作業

ApacheやNginxを立ててBasic認証はここではしない。
Basic認証をする場合は下記を参考にする

* [Apache HTTPd sample for Registry v1, v2 and mirror](https://github.com/docker/distribution/tree/master/contrib/apache)
* [認証付きのDocker Private registryを立てる](http://deeeet.com/writing/2014/10/02/docker-private-registry-auth/)

# 簡単に認証用意できるみたいなので書いた
http://qiita.com/otmb/items/55b733daf6c52e61a671

# reg.loというHostで準備していく
```
$ mkdir registry
$ cd registry
$ sudo vi /etc/hosts
192.168.59.103 reg.lo
$ boot2docker start
$ eval "$(boot2docker shellinit)"
```

# 鍵作成、CN=reg.loを設定する

```
$ mkdir -p certs && openssl req \
	-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
	-x509 -days 365 -out certs/domain.crt

Generating a 4096 bit RSA private key
.....................................++
..................................................................................................++
writing new private key to 'certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:reg.lo
Email Address []:
```

# 鍵を指定してregistry起動(Serverへの設定)
```
$ mkdir data
$ docker run -d -p 5000:5000 \
	-v `pwd`/certs:/certs \
	-v `pwd`/data:/var/lib/registry \
	-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
	-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
	--restart=always --name registry \
	registry:2.0
```

# 接続Test
```
$ curl -IL https://reg.lo:5000/v2/ --cacert certs/domain.crt
HTTP/1.1 200 OK
Content-Length: 2
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
Date: Sat, 08 Aug 2015 21:50:11 GMT
```

# 鍵をboot2dockerに設置(クライアントのdockerへの設定)
```
$ boot2docker ssh
$ sudo vi /etc/hosts
192.168.59.103 reg.lo

// boot2dockerはUsersがMountされているのでそこから取得
$ sudo cp /Users/xxx/registry/certs/domain.crt /etc/ssl/certs/reg.lo.pem
$ sudo chmod 0600 /etc/ssl/certs/reg.lo.pem
$ exit
$ boot2docker ssh sudo /etc/init.d/docker restart
```

# 接続Test
```
$ docker pull hello-world
$ docker tag hello-world reg.lo:5000/hello-world
$ docker push reg.lo:5000/hello-world
```
技術英語 > I'll [have it ready] for you.

@ Star Trek Voyager > EX POST FACTO

診断結果を欲しいと言うTuvokに対してドクターが言った言葉

> I'll have it ready for you. (用意しよう)

<hr>
http://ejje.weblio.jp/sentence/content/have+ready

> Please have it ready in the morning.
それは午前中でお願いします。

<hr>
AudioSpriteを作る際は、1音源が短くなりすぎないように注意


boombox.jsやSoundJSでaudioSpriteを再生する際、1音源の秒数が短すぎるとAndroid端末で正しく再生されない場合がある。
末尾に無音を入れるなどして、少なくとも5秒くらいの秒数を確保しておいたほうが安全。
C#6.0時代のイベント実装方法

# はじめに

C#6.0では、以前から望まれていた機能が多く実装され、以前よりも「かゆいところに手が届く」言語になりました。それによって、以前は意外と面倒だったイベントの実装も、C#6.0からはスマートに実装できるようになりました。

本投稿では、C#6.0時代のスマートなイベント実装方法を解説します。

# 従来のやり方

## データを持たないイベント

```csharp
public event EventHandler MyEvent;
protected virtual void OnMyEvent(EventArgs e)
{
  if(e != null)
    MyEvent(this, e);
}
```

## データを持つイベント

```csharp
public event EventHandler<MyEventArgs MyEvent;
protected virtual void OnMyEvent(MyEventArgs e)
{
  if(e != null)
    MyEvent(this, e);
}
```

# c#6.0時代のイベント


## データを持たないイベント

```csharp
public event EventHandler MyEvent;
protected virtual void OnMyEvent()
{
  MyEvent?.Invoke(this, EventArgs.Empty);
}
```

## データを持つイベント

```csharp
public event EventHandler<MyEventArgs MyEvent;
protected virtual void OnMyEvent(MyEventArgs e)
{
  MyEvent?.Invoke(this, e);
}
```

# 解説

C#6.0でのイベントの実装は、null条件演算子の登場によって簡潔になりました。

まずは、C#6.0とは関係ない部分ではありますが、`OnMyEvent`の引数について。イベントがデータを持つ必要がない場合、`EventArgs`を使用することになります。この場合、EventArgsをわざわざ引数に取る必要はなく、`EventArgs.Empty`を使用すれば十分です

`new EventArgs()`を使用してもよいのですが、`EventArgs.Empty`は`static readonly`なフィールドであり、インスタンスを一つしか作成しないため、こちらのほうがパフォーマンスに優れています。

次に、今回のメインとなるnull条件演算子についてです。null条件演算子は単なるメンバへのアクセスに非常に似ていおり、違いは、レシーバがnullの場合にメンバへのアクセスを行わずnullを返す、ということのみです。これにより「nullでなければxxxする」という処理が完結に記述できるようになりました。

```
// C#6.0より前
if(obj != null)
  obj.hoge()
// C#6.0
obj?.hoge()
```

しかし、イベントの呼び出しは`MyEvent(e)`のように行うため、このままではnull条件演算子が使用できません。これに対する解決策は以下の二通りが考えられます。なお、ReSharperが後者のコードを生成するため、私は後者を使用しています。

```
this?.MyEvent(e)
MyEvent.Invoke(this, e);
```

# まとめ

ここで紹介したように、C#6.0からはイベントが簡潔に実装できるようになりました。C#6.0には他にも、例外フィルタや自動実装プロパティの初期化など、ちょっと面倒だったコードが簡潔に記述できるようになりました。

まずます便利になったC#で、楽しいプログラミングライフを!
CentOS 7 インストールされている全パッケージのrpmをダウンロードする

今動いているシステムと同じ環境を別マシンに作りたい場合など、今の環境にインストールされている全パッケージをダウンロードする方法です。

# 手順

まず`yumdownloader`を含んでいるパッケージ`yum-utils`をインストールします。

```
# yum install -y yum-utils
```

`yumdownloader`を実行します。

```
$ yumdownloader `rpm -qa`
```

カレントディレクトリにrpmがダウンロードされます。

# GPG公開鍵

実際に手元のマシンで実行してみたところ、gpg-pubkey-f4a80eb5-53a7ff4bだけはダウンロードされませんでした。`gpg-pubkey-*`はrpmの署名確認に使う公開鍵を含むダミーのパッケージで、ファイルは１個も含んでいません。rpmの公開鍵をインポートするには`rpm --import`を使います。

インポートしている公開鍵のリスト：

```
# rpm -qa "gpg-pubkey*"
```

公開鍵をファイルにエクスポート：

```
# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b > backup
```

インポートしている公開鍵を削除：

```
# rpm -e gpg-pubkey-f4a80eb5-53a7ff4b
```

さっきエクスポートしたファイルから再インポート：

```
# rpm --import backup
```


参考：
[B.3. パッケージの署名確認](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/s1-check-rpm-sig.html)
[What are gpg-pubkey packages](http://unix.stackexchange.com/questions/190203/what-are-gpg-pubkey-packages)

# yum installしたときrpmを消さずに残しておく
なお、あらかじめ`/etc/yum.conf`で

```
keepcache=1
```

と書いておくと、`yum install`したときダウンロードしたrpmが消されずに残るようになります（場所は`/var/cache/yum/`以下のどこか）。
JenkinsからHerokuへデプロイする


Jenkinsを使って、ローカルの変更をリモートのdevelopブランチへpushした段階で、ボタン一つでHerokuへデプロイしてくれる環境を作った。
構成はこんなかんじ。
![Untitled drawing.png](https://qiita-image-store.s3.amazonaws.com/0/12603/26079d5d-214c-a4f7-5adb-c2a9722a8fa1.png "Untitled drawing.png")



Jenkinsはすでにインストール済みで、Gitプラグインが導入されているのが前提。
ソースのリポジトリはBitbcketを使用。
JenkinsはCentOSで動いている状態。


## Jenkinsユーザの設定変更
yumでjenkinsをインストールした場合、デフォルトではコマンドラインでjenkinsユーザに切り替えられないため、/etc/passwdを以下のように書き換える。

```
jenkins:x:496:497:Jenkins Continuous Build server:/var/lib/jenkins:/bin/bash
```
[Jenkins環境構築でのメモ](http://qiita.com/yk-nakamura/items/ae4b3ec8c9532ab25544)

## heroku toolbeltのインストール

heroku toolbeltをインストールして、herokuへloginする。

```
$ su - jenkins
$ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

# .bash_profileに設定を追加
$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

$ heroku login
# Email: 
# Password:
# Authentication successful.
```
[heroku toolbelt](https://toolbelt.heroku.com/debian)

## Jenkinsの設定

### 事前準備
ブラウザからherokuデプロイ用のプロジェクトを作っておく。
コマンドラインから以下のコマンドを実行しておき、gitのherokuのリポジトリの設定をしておく。

```
$ su - jenkins
$ cd workspace/<your-project>
# herokuのgitリポジトリを指定
$ heroku git:remote -a <your-app>
```

### Jenkinsプロジェクトの設定
Jenkinsプロジェクトの設定からデプロイ用の設定を記述する。

![スクリーンショット 2015-08-08 23.36.24.png](https://qiita-image-store.s3.amazonaws.com/0/12603/f1cd7c45-e3f6-8772-87eb-9d5ed4dcac7f.png "スクリーンショット 2015-08-08 23.36.24.png")


Bitbucketからdevelopブランチを取得してくるところは以下のURLを参照。
[Bitbucketのprivate repositoryとJenkinsの連携について](http://yuizho.hatenablog.com/entry/2013/11/24/172246)

シェルの実行のシェルスクリプトをこんな感じで書く。

```
git checkout develop
git pull --rebase origin develop

git checkout master
git merge develop

# masterブランチをリポジトリにpush
# origin(git@bitbucket.org:xxx/xxx.git)でpushすると"deployment key is read-only."で失敗するので、httpsでpushする。
# パスワードの入力が求められるので、expectで実行する。
expect -c "
spawn git push https://<your-name>@bitbucket.org/<your-name>/<your-project>.git master
expect \"Password:\"
send \"<your-password>\"
"

# heroku へデプロイ
git push heroku master
```
[Hubot と Jenkins をつかって heroku への Deploy 環境を用意した](http://qiita.com/sasarkyz/items/7fde53e01d90b57a48df)
[Bitbucket git push as user](http://stackoverflow.com/questions/15166932/bitbucket-git-push-as-user)
[対話式のコマンドをスクリプト化する方法](http://qiita.com/dogyear/items/e58ddab9a49bf82ed43f)

ここまでの設定を行いビルドを実行すると、Bitbucketからdevelopブランチを取得して、masterブランチへmergeし、Bitbucketへmasterブランチをpushした後、herokuへデプロイしてくれる。


追記：expectでBitbucketのmasterにpushしている箇所が上手くいっていなかったみたい。なにかよいやり方があるだろうか？


### herokuコマンドの実行

デプロイ後にherokuのrunコマンドなどをたたきたい場合は、Heroku Plugin for Jenkinsを導入する。

Jenkinsの管理 > プラグインの管理からHeroku Plugin for Jenkinsをインストールする。
※プラグインの管理メニューのフィルターにherokuと打ち込めば表示されるはず。

インストールすると、Jenkinsプロジェクトの設定のビルド後の手順の追加にHeroku用のメニューが追加される。

![スクリーンショット 2015-08-09 0.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/12603/b1b871b3-c7f1-83ce-3dac-0f554ce95343.png "スクリーンショット 2015-08-09 0.51.34.png")

AppName、Command、高度な設定からAPI Keyなどの情報を設定すれば任意の処理が実行される。

![スクリーンショット 2015-08-09 1.36.07.png](https://qiita-image-store.s3.amazonaws.com/0/12603/47423b7f-c2db-6d39-5237-c982d0e5e9e2.png "スクリーンショット 2015-08-09 1.36.07.png")
gitで他ブランチをチェックアウトできないとおもったらshallow repositoryだった


Gitで他のブランチにチェックアウトしようとおもったのだけどなぜかできない。
よくよく考えたらテストサーバで全履歴をとってくるのは無駄なので最新の履歴しか取得してないんだった。

以下の感じに取得したリポジトリだ。

```
$ git clone --depth 1  git@github.com:eiel/hoge.git
```

`.git/config`をのぞいてみた。

```
[remote "origin"]
	url = git@github.com:eiel/hoge.git
	fetch = +refs/heads/master:refs/remotes/origin/master
```

masterしかとれないわけだ。
そんなわけで以下のコマンドをたたいた。

```
git remote set-branches  origin master goro
git fetch
git checkout goro
```

`.git/config`は以下のようになっていた。

```
[remote "origin"]
	url = git@github.com:eiel/hoge.git
	fetch = +refs/heads/master:refs/remotes/origin/master
	fetch = +refs/heads/goro:refs/remotes/origin/goro
```
PHP5.2でCSVファイル取り込み

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/PHP5.2%E3%81%A7CSV%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%8F%96%E3%82%8A%E8%BE%BC%E3%81%BF/)をご覧ください😀

CSVファイルを解析して配列にする。
これが意外と簡単に出来なかったのでメモ。

よくexplode()を使ったサンプルがあるけど、値にカンマがある場合にダメなので注意。

今回は下記のようにカンマやダブルコーテーションが含まれている場合もしっかり対応します。

```text:csv
あああ,“いい,いい”,“うう""うう”
```
↓ゴール

```php:php
$data[0] = 'あああ';
$data[1] = 'いい,いい';
$data[2] = 'うう"うう';
```

# PHP5.3以上の場合
まず、5.3以降であれば下記のように簡単に書けるっぽい。（動作は未確認）

```php:php5.3〜
$file = new SplFileObject($csv_file_path);
foreach ($file as $line) {
    $line = mb_convert_encoding($line, 'UTF-8', 'sjis-win');
    $data[] = str_getcsv($line);
}
```

# PHP5.2の場合
今回の本題、今後は下記のようにしようと思います。

```php:php5.2
if (($fp = fopen($csv_file_path, "r")) === FALSE) {
    //TODO:エラー処理
}


// CSVの中身がダブルクオーテーションで囲われていない場合に一文字目が化けるのを回避
setlocale(LC_ALL, 'ja_JP');

$i=0;
while (($csv_data = fgetcsv($fp)) !== FALSE) {
    mb_convert_variables('UTF-8', 'sjis-win', $csv_data);
    if($i == 0){
        // タイトル行
        $header = $csv_data;
        $i++;
        continue;
    }

    $data[] = $csv_data;
    
    $i++;
}

fclose($fp);
```

## メモ
### setlocale(LC_ALL, 'ja_JP');
CSVファイルの値がダブルコーテーションで囲まれていない場合に
一文字目が文字化けする問題があったため下記URLを参考に対応。
http://happyparasol.com/?p=544

ほんとは
setlocale(LC_ALL, 'ja_JP.Shift_JIS');
にしたかったのだけど、サーバが対応されておらず設定できなかった。
下記コマンドで確認可能。

```shell-session
>locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```
気軽に Hipchat に通知する方法

# [デプロイ自動化とServerspec](http://deeeet.com/writing/2015/03/17/serverspec-for-automation/)

> 例えばHipChatの場合は以下のようなスクリプトを準備しておくと良い．シェルスクリプトなので何にでも組み込める．

```
notify() {
  local USER=$1
  local MESSAGE=$2
    
  JSON="{
    \"message_format\": \"text\",
    \"message\": \"@${USER} ${MESSAGE}\",
    \"notify\": true
  }"
    
  curl -X POST \
      -H "Content-Type: application/json" \
      -d "${JSON}" \
      https://api.hipchat.com/v2/room/...
}
```

> 以下のように使う．

```
$ notify Taichi "Service out is done!"
```
ScalaでMinecraftのModを作るまで

# 前提

Minecraft 1.8
Minecraft Forge 1.8
Java 1.7
Ubuntu 14.04(WindowsでもMacでも多分同じです)

編集画面からソフトのバージョンを書く欄が消えてた

# 手順

1. http://scala-ide.org/ からScala IDEをダウンロードして適当なところに展開
2. http://files.minecraftforge.net/ からSrcをダウンロードしてこれも適当なところに展開(以下_WORKSPACE_)
3. _WORKSPACE_内のbuild.gradleの

    ```groovy
    apply plugin: 'forge'
    ```

    の上に

    ```groovy
    apply plugin: 'scala'
    ```

    を追加

4. コマンドプロンプトなりターミナルなりを開いてから_WORKSPACE_に移動して、

    ```
    $ ./gradlew setupDecompWorkspace
    $ ./gradlew eclipse
    ```

    を実行(README.txtに書いてある通り)

5. 1.でダウンロードしたeclipseを実行。Workspaceは_WORKSPACE_内のeclipseを指定。
6. `Help` -> `Eclipse Marketplace...`でGradle IDE Packをインストールする(要らないかもしれない)
7. プロジェクトを右クリックして、`Build Path` -> `New Source Folder...`で`src/main/scala`を作成する
8. `src/main/java`を削除
9. (任意)`src/main/resources`内のmcmod.infoを編集する
10. `src/main/scala`で右クリック、`New` -> `Scala Class`でScalaのソースを追加して、以下のように書く

    ```scala
    package com.xxx //ここはそのままにしておく

    import net.minecraft.init.Blocks;
    import net.minecraftforge.fml.common.Mod;
    import net.minecraftforge.fml.common.Mod.EventHandler;
    import net.minecraftforge.fml.common.event.FMLInitializationEvent;

    @Mod(modid = "MODの名前を任意で", version = "1.0")
    class TestMod {
        @EventHandler
        def init(event : FMLInitializationEvent) : Unit = {
            System.out.println("DIRT BLOCK >> "+Blocks.dirt.getUnlocalizedName());
        }
    }
    ```

11. 上辺りの再生ボタンで`Client`をクリックするとModが入っている状態でMinecraftが起動すると思います

    ![run.png](https://qiita-image-store.s3.amazonaws.com/0/16790/7141a785-d895-9106-9b89-babbfeea225c.png)

12. Let's enjoy scala life!
2015-08-05 Growth Hack 入門新法班 心得


![](https://farm1.staticflickr.com/329/20404382251_d8a4c76180_o.png)

星期三 (2015-08-05) 參加了 [Xdite](http://blog.xdite.net/) 的 [Growth Hack 心法班](http://www.growthschool.com/courses/intro_to_growth_hack
) ，演講中有非常多精彩的內容，直接用結論開頭吧！

# 結論

- Growth hack 就是要<span style="color:red;">把產品做好</span>
- <span style="color:red;">降低疑慮、增強信心</span>
- Call to action

# 背景

目前是個 app 工程師，過去的因為待過非常小的公司 (都介於 3~5 人左右) ，接觸過規劃產品、計畫推銷產品。當時也沒有前輩可以學，因此都是自己上網學、自己看，真正做起來也不知道對不對、適不適合。最後因為各種原因，產品也失敗、或是腰斬沒有上線。

即使到了比較大的公司，從旁看營銷團隊非常不合理的策略，雖然直覺上就覺得做錯了，團隊反應不好的決策後，還是沒有被採用。

後續就有上過 business model, lean 相關課程，學習如何擬定及安排一個商業模型、如何執行 Lean 等等。

## 實務上的經歷

- 初步做的東西根本不是 MVP ，想要把所有想做的東西全部塞進第一版
- 在產品還沒做完，或是遇到規劃根本有問題的時候，老闆拼命想做 referral 的規劃
- 產品發佈初期就想要做條件嚴峻的 referral 
- App 上的 call to action 要做的手續的太過麻煩，需要填過多資料、或是不合理的隱私資料。

經歷過這些，不是待過的公司收收起來；還在的話，就是做的產品就直接被腰斬放生、或是根本沒什麼用，無法讓公司獲利。

## 看到 Growth Hack

一開始在 Xdite 的牆上漸漸看到 GH 相關的動態，因為當時也剛好碰到一些不合理的行銷方式、還有過去的經驗，所以開始對這個領域有了興趣

於是自己也找些資料看、也有看一些 Xdite 分享的 YC 講座的影片

但是 ...

看不懂啊、很難理解啊、以目前有辦法取得的資源和時間，也沒有辦法打通了解 growth hack 到底在做什麼

什麼是 AARRR ，既然大家有在講這個東西，到底跟傳統在做差在哪裡？

會做 Landing Page ，但是不知道要怎麼幫 landing Page 增加 call to action 的成功率？

6 月底本來有報第一場，因為臨時有事而沒有辦法前往而向隅，這次看這個課程，<del>因為也有龍蝦塔，</del> 馬上就排時間報名。

# Growth Hack 的任督二脈

一整個講座之中，基本上沒有廢話。雖然講解的速度超快，卻一招一招的打通我的任督二脈。

又以<strong>非常貼近生活</strong>和<strong>非常容易理解的實例</strong>的方式，轉換 GH 裡面所看到的生澀的詞彙，在原先幾乎有看沒有懂的東西，聽了、消化後馬上就通了。

## 和現有已學習知識的連結，如 UX

在一開始的時候，直接滑過 Growth 的定義，簡單明瞭的說：

> Growth Hack 就是要把產品做好

在過去學的知識，像是設計 business model 、 agile development 、 lean startup 以及使用者經驗等領域的觀念，都能夠相通

原本有點害怕聽了會不懂，就有了自信繼續聽下去。

## 什麼是成長

> Growth: Conversion - Churn

成長就是在 AARRR 階段轉換中，成功轉化留下的客戶大於流失的客戶

# Growth Hack 的幾個重點

> 降低疑慮
> 增強信心 

這兩個原則還是核心心法，也就是盡力改善 Conversion Rate Optimization

- 為了要把產品做好，則是可以透過 **數據分析** 和 **量化指標** ，去了解
- 自己覺得產品完成度高，客戶可能也會覺得完成度還沒到掏錢買的程度
- 要做 MVP 。要擺攤，至少要有一道菜
- 一定要有 PMF* ，找到可行、不會賠錢的模式
- 不是所有的東西都可以套 GH
- AARRR 中，不要只著力在 AA ，也要往 RRR 出力
- 一定要做好 landing page ，可以參考現有的網站
- 要做好 Landing Page ，藉由這個頁面，降低疑慮、增強信心，達成 call to action
- 時機到再做 referral (Uber, Airbnb, Dropbox)
- 加入線上客服，即時回應客戶的需求
- 客服並不是惱人的成本，有客戶投訴，才能知道哪邊可以改進

# CRO

這個是貫穿一整個講座的一個概念

讓客戶 **<span style="color:red;">降低疑慮、增強信心</span>**

並讓他可以不用多想兩眼一昏、把卡刷下去

# 結語

<strong><span style="color:red;">去聽吧！</span></strong> >> [Intro to Growth Hack 講座](http://www.growthschool.com/courses/intro_to_growth_hack)

聽完之後就會知道，得到的價值，比龍蝦塔的價值高太多了啦！


# 同步發佈

- [熊屋 - 技術小記](http://blog.kumaya.co/2015/08/08/growth-hack-after-class/)
Raspberry PiをWLI-UC-GNMEで無線LANに接続する


# はじめに
Raspberry Piを無線LANに接続して、SSHでログインできるようにします。
無線LANの子機には[WLI-UC-GNME](http://www.amazon.co.jp/dp/B010EGTPVY)というBUFFALOのWi-Fi子機を使います。

Raspberry PiへのOSインストールなど初期設定は済んでいるものとします。

参考: [MacOSXでRasberry PiにRaspbianをインストールする](http://qiita.com/nownabe/items/e16b962fcdb1a702093e)

# Wi-Fi子機の設定
まずはとにかくネットワークにつなげましょう。

USBに子機を挿します。
`lsusb`コマンドを打つと、Wi-Fi子機を認識しているはずです。

次のコマンドでWi-Fiの設定を設定ファイルに書き込みます。
SSIDとPASSPHRASEは接続したいネットワークのものを入力してください。

```bash
wpa_passphrase SSID PASSPHRASE | sudo tee -a /etc/wpa_supplicant/myhome.conf
```

今作ったファイルを編集します。

```:/etc/wpa_supplicant/myhome.conf
network={
        ssid="SSID"
        psk=hogehogehogehoge
        proto=WPA WPA2
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP
        priority=2
}
```

次は、`/etc/network/interfaces`を編集します。

サーバとして使うときなど固定IPを使いたい場合は、次のように設定します。
`wlan0`の部分がWi-Fiの設定です。

```:/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.11.99
    netmask 255.255.255.0
    network 192.168.11.0
    broadcast 192.168.11.255
    gateway 192.168.11.254
    dns-nameservers 192.168.11.100
    wireless-essid SSID
    wpa-conf /etc/wpa_supplicant/myhome.conf
```

DHCPを使いたい場合は、次のようにします。

```:/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
    wireless-essid SSID
    wpa-conf /etc/wpa_supplicant/myhome.conf
```

設定ができたら、ネットワークを再起動します。

```bash
sudo service networking restart
```

たまにFailedと出ますが、何回かやると成功する場合もあります。
再起動できたら、適当にpingでもしてみましょう。

```bash
pi@raspberrypi ~ $ ping yahoo.co.jp
PING yahoo.co.jp (183.79.135.206) 56(84) bytes of data.
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_req=1 ttl=56 time=27.0 ms
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_req=2 ttl=56 time=18.2 ms
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_req=3 ttl=56 time=19.9 ms
^C
--- yahoo.co.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 18.254/21.723/27.004/3.798 ms
```

# SSH設定
SSHの設定をします。設定というか、公開鍵を`~/.ssh/authorized_keys`に置いて公開鍵認証でログインできるようにするだけです。
今回はGithubから公開鍵をダウンロードしてきます。

```bash
mkdir .ssh
curl -o .ssh/authorized_keys https://github.com/nownabe.keys
chmod 600 .ssh/authorized_keys
chmod 700 .ssh
```

手元のPCからSSHでログインしてみます。

```bash
$ ssh pi@192.168.11.99
Linux raspberrypi 3.18.11+ #781 PREEMPT Tue Apr 21 18:02:18 BST 2015 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Aug  8 21:05:45 2015 from nownabe.local
pi@raspberrypi ~ $
```

ログインできました！

# おわりに
これでHDMIケーブルもUSBキーボードも抜いてOKです！すっきり！！ :satisfied: 
電源ケーブルもなんとかしたいですね :bulb:
WebStormの起動時にアップデートのチェックを抑止する

以下のチェックを外す。
![128DEDB5-12A2-4ECF-83D2-959C7B5DF0CB.png](https://qiita-image-store.s3.amazonaws.com/0/51291/566c66fe-a0d0-fd1f-64c0-bbcd12bf9dd4.png)
Unity5+windows10+Oculus Rift DK2を使って今すぐ遊びたい人のためのガイド（2015/08/08版)

# とりあえずWindows10にOculus Rift Runtimeを入れたい #
[Oculus Rift DK2のWindows10での動作](http://windowsiot.azurewebsites.net/?p=641)
上記記事でじゅうぶんです。
私も引っかかったところをコメントしました。私はOculus Rift Runtimeのバージョンは0.5.0.1を使用しました。

# Virtual Reality Supportedが使えたらこんな記事いらないのに… #
この記事を読むからには試したと思いますけど、だいたい以下のように言われるので
PlayerのVisual Reality Supportedチェックは外しましょうね。
![2015_08_08_だめっぽい.png](https://qiita-image-store.s3.amazonaws.com/0/75653/d99f7ce9-e04f-737f-5b01-65f7bb78b38f.png)

# ではどうすればいいのか？ #
そこで**Unity4 Integration**ですよ。ということでOculus Developersにログインしてみましょう。そこには―――
![2015_08_08_ないねえ.png](https://qiita-image-store.s3.amazonaws.com/0/75653/b21e3dc6-3129-104f-02ce-e10d062981fc.png)
最新しかありません。
でもあわてる必要はありません。ちゃんとほしいバージョンもありますよ。

『DOWNLOADS』をクリックします。
![2015_08_08_ダウンロードから.png](https://qiita-image-store.s3.amazonaws.com/0/75653/0c7a97af-9701-ba44-6fe8-2440b3fe3688.png)

PlatformにPlatform:PCを、Latestに0.5.0.1beta（0.6.0.1で行ったのなら0.6.0.1betaを選ぶべきです）を設定します。
![2015_08_08_Platform.png](https://qiita-image-store.s3.amazonaws.com/0/75653/69398aed-e4f9-5761-e5d1-275a874f44bd.png)

目的のファイルがありました。Detailsをクリックします。
![2015_08_08_あったよ！.png](https://qiita-image-store.s3.amazonaws.com/0/75653/e7b99746-68b1-56cb-4e23-3745ca8a2c37.png)

ねえ、これ解説しないといけないんですか？はい、EULAを読んだらチェックボックスにチェックを入れて
ダウンロードボタンをクリックすれば目的のファイルは手に入ったも同然です！
![2015_08_08_なにか？.png](https://qiita-image-store.s3.amazonaws.com/0/75653/2970a027-6b9b-fbdc-3fdc-ec80e9b114fd.png)

# ちょこっとだけ手を入れるんじゃ #
事情は分かりませんが、どうやらプリプロセッサに変更があったらしく、
unitypackageをインポートしてコンバートを行ってもエラーが出ます。
そこでAsset/OVR/Editor/OVRShimLoader.cs の52行目を\#if (UNITY_5_0)から\#if (UNITY_5)に変更します。
これであとはAsset/OVR/Prefab/OVRCameraRigを放り込めばあなたのプロジェクトでOculus Riftを使うことができます。
Visual Studio 2015でゲームボーイ開発をやってみる

#はじめに
ゲームボーイ開発をすごくやりたくなってしまったのですが，さすがにテキストエディタで開発するのはつらいなと思いました．
なので，Visual Studioで開発できるように環境構築してみました．

#コンパイラの準備
ゲームボーイ開発に使われるコンパイラとしてGBDKが有名です．
コンパイラのダウンロードについては，下記のエントリを参考にしてください．
[開発環境の導入（GBDK / Windows）](http://qiita.com/syano/items/838d94299d29c73fce30)

#エミュレータの準備
エミュレータは好きなものを使ってください．VisualBoyAdvanceが国産なのでお勧めです．

#Visual Studioでの環境構築
面倒くさいのでVisual Studio用のプロジェクトテンプレート作りました．
[GBDK用のプロジェクトテンプレート](https://dl.dropboxusercontent.com/u/11035113/GBDK.zip)

##各種パスを通す
テンプレートで使用しているパスは，GBDK_PATHとGB_EMULATOR_PATHの2種類です．この2つを環境変数に追加してください．

GBDK_PATHには，GBDKをインストールしたフォルダを指定してください．

GB_EMULATOR_PATHには，エミュレータの実行ファイルの絶対パスを指定してください．

##プロジェクトテンプレートの配置
プロジェクトテンプレートは，```C:\Users\%ユーザ名%\Documents\Visual Studio 2015\Templates\ProjectTemplates```に置かれています．
ダウンロードしたテンプレートをそこに入れてください．

##Makefileの書き換え
一応，メイクファイル プロジェクトということになっているので，Makefileの書き換えが必須です．
Makefileを開くと，だいたい以下のようなソースになっています．

```mf
LCC = lcc -Wa-l -Wl-m -Wl-j -DUSE_SFR_FOR_REG

# 変更すると面倒くさいので変更しないで！
TARGET = output.gb

# コンパイルしたいCファイルを全て書く
SOURCES = main.c test.c

OBJECTS = $(SOURCES:.c=.o)
source_to_objs:
	$(LCC) -c $(SOURCES) -o $(OBJECTS)
	$(LCC) -o $(TARGET) $(OBJECTS)

clean:
	rm -f *.o *.lst *.map *.gb *~ *.rel *.cdb *.ihx *.lnk *.sym *.asm
```

このプロジェクトは，VCみたいにすべて自動的にコンパイルすることができません．SOURCESマクロを適宜書き換えて使用することになります．

例えば，hoge.c，test.c，main.cみたいな感じでCファイルがあってヘッダファイルなどで参照されていたりしたら，

```mf
SOURCES = main.c test.c hoge.c
```

みたいな形で書き換えて使ってください．
もし，もっとスマートな方法があれば教えて下さい．

##デバッグする
デバッガは付いていませんが，F5を押すとエミュレータが起動するようになっています．ただし，コマンドを書いておいたのですが出力されないので手動で設定する必要があります．
まず，プロジェクトのプロパティを開いて，[構成プロパティ]-[デバッグ]-[コマンド]に```$(GB_EMULATOR_PATH)```を追加します．
次に，[コマンド引数]に```output.gb```を追加します．

これで，デバッグ時にエミュレータが起動するようになります．
中にはVisual Studioと連携できるエミュレータもあるかもしれません．オプションを変更したりして遊んでみてください．

#おわりに
これでGBDKでゲームボーイ開発ができるようになります．アセンブラはmakefileのほうに書いてないので，使いたい人は適宜追加してください．
nmakeがあまりにもわがままで使えないので疲れました．nmakeでのMakefileのいい書き方があれば教えて下さい．それではさようなら．
angularjs値の変更監視

# 環境
angularjs1.3

# 値の変更監視

ある値の変更を監視して、変更したら、◯◯するというときに便利な<code>$scope.$watch と $scope.$warchGroup</code> について


1.単一の値を変更監視するとき=> ```$scope.$watch```を使用

以下はサンプル。
$scope.messageの変更を監視して、変更があればngと表示する。

```
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
</head>
<body ng-app='app'>

<div ng-controller="WatchController">
{{result}}<br>
{{message}}<br>
<input type="button" ng-click="change()" value="change">
</div>

<script type="text/javascript">

	angular.module('app', [])
		.controller('WatchController', ['$scope', function($scope) {
			$scope.message = 'Hello World!';
			$scope.result  = '';
			$scope.change = function() {
				$scope.message = 'change!!';
			};
			$scope.$watch('message', function(newValue, oldValue, scope) {
				if(angular.equals(newValue, oldValue)) {
					scope.result = 'ok';
				} else {
					scope.result = 'ng';
				}
			});
		}]);
</script>
</body>
</html>
```


2.複数の値の変化をまとめて監視する場合=>```$scope.$watchGroup```を使用

```
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
</head>
<body ng-app='app'>
<div ng-controller="WatchGroupController">
{{result}}<br>
<input type="button" ng-click="change1()" value="change1">
<input type="button" ng-click="change2()" value="change2">
<input type="button" ng-click="change3()" value="change3">
</div>


<script type="text/javascript">

angular.module('app', [])
	.controller('WatchGroupController', ['$scope', function($scope) {
		$scope.greeting = 'Hello, World1';
		$scope.message2 = 'Hello, World2';
		$scope.message3 = 'Hello, World3';
		$scope.change1 = function() {
			$scope.greeting = 'change!!';
		};
		$scope.change2 = function() {
			$scope.message2 = 'change!!';
		};
		$scope.change3 = function() {
			$scope.message3 = 'change!!';
		};
		$scope.result = '';
		$scope.$watchGroup([
			function() {
				return $scope.greeting;
			},
			function() {
				return $scope.message2;
			},
			function() {
				return $scope.message3;
			}
			], function(newValue, oldValue, scope) {
				scope.result = angular.toJson(newValue);
			});
	}]);
</script>
</body>
</html>
```
angularjs カスタムディレクティブについて

# カスタムディレクティブについて

カスタムディレクティブの作成方法
基本形

```lang:JS例
var app - angular.module('app');

app.directive('myDirective', function(){
　　　　　　　　//↑ディレクティブの名称(キャメルケースにする)
 return{
    replace:true
  , restruct:'E'
  , scope:{
       title:'@'
    }
  , template:'<div style="width:100%">{{title}}</div>'
  , link:function(scope,element,attr){
     console.log(scope.title);
    };
 };
)};
```
```lang:HTML例
<my-directive title="タイトル"></my-directive>
　//↑全て小文字で、キャメルケースの大文字の前にハイフンを入れる
```
```lang:実行時のHTML
<div title="タイトル" style="width:100%">タイトル</div>
```

上記はあまりいい例ではないですが、ディレクティブの基本形です。
scopeには@,=,&の三種類が指定でき、それぞれ以下となります。
・ @:1wayバインディング
・ =:2wayバインディング
・ &:親スコープ関数

つまり、ディレクティブ内で変更した値を親スコープに反映させたい場合は、
=を使用する事で実現できます。

細かい設定値等は下記が参考になると思います。
[何となく分かった気持ちになる AngularJS のカスタムディレクティブ](http://qiita.com/damele0n/items/4ba7269cf575e81a588a)
[AngularJSカスタムディレクティブのスコープ設定方法](http://wordpress.honobono-life.info/code/angularjs%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95/)

カスタムディレクティブは色々な用途で使用できます。
(例えば、共通ヘッダや独自の入力用部品等)

以前、業務で使用した時は、チェックタイミングの仕様で
angularで用意されているバリデーション機能を使えなかったり、
独自のフィルター機能、変更されたかどうかのステータスを保持するために
専用のinputディレクティブを作成しました。
ここまでくると本当にangularを使う意味があったのか、という話にもなりますが・・・

独自のinputを作成する場合で、イベントを拾いたい時はlink内でbindしてやれば良いと思います。

```lang:JS例
var app - angular.module('app');

app.directive('myInput', function(){
　　　　　　　　//↑ディレクティブの名称(キャメルケースにする)
 return{
    replace:false
  , restruct:'A'
  , link:function(scope,element,attr){
     element.bind('keydown', function(){
       scope.apply(function(){

          処理

       });
     )};
 };
)};
```
bindしたイベント内でscopeを使用したい場合は、
scope.apply内に処理を記述しないと、scopeがundefinedとなってしまうので気を付けて下さい。
unity/csharp > 書式指定子 > 数値6を006とする > string.Format("{0:000}", val);

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

数値６を"006"という表記にしたい。

http://answers.unity3d.com/questions/326311/formatting-a-tostring-for-time.html

```
int val = 6;
print (string.Format("{0:000}", val));
```
でできた。
dockerコンテナをsystemdで管理させる

dockerコンテナをサービス化しようと思って、systemdで自動起動するようにsystemdのサービスを書いた。

方法自体は、公式にも書いてある。

[Docker Docs Automatically start containers](https://docs.docker.com/articles/host_integration/)

要約すると、コンテナを`docker run`して作って、そのコンテナを`docker start`、`docker stop`するサービスを作ってねという。

じゃあ、`docker pull`からしようと思うとどうすんねんというあたりは、以下のブログに、詳しく書かれていた。

[Running Docker Containers with Systemd - Container Solutions](http://container-solutions.com/running-docker-containers-with-systemd/)

試しに、registryを起動するのを以下のとおり作った。


```:/usr/lib/systemd/system/docker-registry.service
[Unit]
Description=Docker Registry
Documentation=https://github.com/74th/systemd-docker-registry
Requires=docker.service
After=docker.service

[Service]
Type=simple
ExecStartPre=-/usr/bin/docker stop registry
ExecStartPre=-/usr/bin/docker rm registry
ExecStartPre=/usr/bin/docker pull registry
ExecStart=/usr/bin/docker run --name registry -p 5000:5000 library/registry

[Install]
WantedBy=multi-user.target
```

* `docker.service`が起動後に実行するようにする。`After=docker.service`とする。
* サービスの`Type`は、コマンドが動いている間を起動していると判定する、`Type=simple`を使う。そのため、コンテナの起動自体は、`docker run -d`ではなく、ただの`docker run`で良い。
* 起動時実行時コマンドである、`ExecStart`に`docker run`をやらせる。
* その前に、`docker pull`とか停止とか削除とかを`ExecStartPre`でやらせる。

このファイルを作成して、以下のとおり有効化する。

```bash
sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl enable docker-registry
```

これで再起動させたところ、自動起動されていた。

一つはまったのは、この`docker-registry.service`のファイルをgitで管理しようと、`/usr/lib/systemd/system/`内にはシンボリックリンクで格納していた。すると、上記コマンドを入れても、`Failed to issue method call: No such file or directory`と言われてしまった。`/usr/lib/systemd/system/`内には、実ファイルを置かなければならないらしい。

ワンライナーでできるのを、githubにあげておきました。

https://github.com/74th/systemd-docker-registry