OmniAICreator/Qiita-1.07M huggingface dataset:
【自分用メモ】DockerRegistry

自分用メモ
マークダウン書き方わかんない(Redmine風に書けばいいのかしら？)
とりあえず、後で整形しよう。

CentOS7上にDocker1.8.2を入れて、DockerRegistryを作ろうと思った。
しかし、DockerRegistryは非推奨になった？ような雰囲気を醸し出してるような・・・
違うか、DockerRegistryのリポジトリが非推奨になったのか。

Distribution使えってgitHubに書いてある。
https://github.com/docker/docker-registry

Dis～
https://github.com/docker/distribution
https://docs.docker.com/registry/

DockerHubは↓
https://hub.docker.com/r/distribution/registry/

米コンテナ上で動作するRegistryだけじゃなくて、yum installできるdocker registryもあるみたい。

<pre>
# yum -y update
# yum list docker
 1.8.2～って出てた
# yum -y install docker
$ systemctl start docker
</pre>

一般ユーザでDockerを起動しようとするとエラーになる。
　→当該ユーザをdockerグループに所属させないとだめっぽい。
http://tech.withsin.net/2015/08/19/permission-of-docker-socket/

■dockerグループ作成とdockeruser作成
<pre>
# group add docker
# useradd -g hoge
</pre>

■dockerRegistry設置
/home/hoge/registry　にprivate registryの永続データを格納する。(コンテナにデータ入れっぱにしとくと、コンテナ破棄したタイミングでデータも消える)
<pre>
# su - hoge
$ mkdir registry
$ systemctl start docker
$ docker run -d -p 5000:5000 -v /home/hoge/registry:/var/lib/registry --name=my-registry registry:2
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d0e5b9df6428        registry:2          "/bin/registry /etc/d"   9 seconds ago       Up 7 seconds        0.0.0.0:5000->5000/tcp   my-registry
$ docker pull busybox
$ docker tag busybox localhost:5000/busybox
$ docker push localhost:5000/busybox
The push refers to a repository [localhost:5000/busybox] (len: 1)
Sending image list
Error: Status 503 trying to push repository busybox: "{\"errors\":[{\"code\":\"UNAVAILABLE\",\"message\":\"service unavailable\",\"detail\":\"health check failed: please see /debug/health\"}]}\n"

</pre>
503が返ってきた。


気付いたことをどんどん追記していく。

自分用メモなので、タグからDockerなどを削除。
はじめてのAmazon EC2

## ログイン方法

1. Teratermを起動する
2. user: ec2-user 入力する
3. 鍵を使うでmyaws.pem（秘密鍵ファイル）を指定する
4. OKを押下する


ユーザなんてどこに書いてあった？と思いましたが
Google先生に教えてもらって解決。
StatsbotでGAサマリをSlack通知 〜通知方法と通知時の見え方一覧〜

## 概要

Statsbot は、GoogleAnalytics、NewRelic、Mixpanel と連携し
各データをSlackへ通知できるサービスです。

https://statsbot.co/

<img width="986" alt="スクリーンショット 0028-03-11 0.07.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/35162/7a625a0f-61b2-361f-ee09-1864b4a3e996.png">


連携自体は↑画面中央の `Add to Slack` ボタンを押下し
各種手続きを手順通り行えばすぐに連携できます。

※導入まで10秒ほどでした。


データホテルさんが導入法まとめていたので参考までに。
https://datahotel.io/archives/1225#anchor2


各種設定方法がありますが、どんな見え方になるかをまとめました。

設定は大きく3つあります。

|*Item*|*Detail*|
|---|---|
| Metrics | セッション数,ユーザ数,コンバージョン,直帰率,新規ユーザ, |
| Alert | ユーザ,コンバージョン,イベントが閾値を超えるor下がると通知|
| Reports | まとめ(ユーザ数, 新規ユーザ数, PV, コンバージョン数, コンバージョン率, イベント数, 平均セッション時間(秒))を通知  |

以下通知方法と通知時の見え方です。

※データは知り合いのECサイトです。  
恥ずかしいデータもありますが、Statsbotの導入を条件に快く許諾いただきました(^-^)


# Metrics

## Sessions

- セッション数

```
@Statsbot sessions [today, yesterday, this week, last week, this month, last month, this year]
```

![Imgur](http://i.imgur.com/rB8FGZE.png)

## Users

- ユーザ数

```
@Statsbot users [today, yesterday, this week, last week, this month, last month, this year]
```

![Imgur](http://i.imgur.com/20bo5fE.png)

## Conversions

- コンバージョン

```
@Statsbot conversions [today, yesterday, this week, last week, this month, last month, this year]
```

![Imgur](http://i.imgur.com/Fjv0eVD.png)

## Conversion Rate

- コンバージョン率

```
@Statsbot conversion rate [today, yesterday, this week, last week, this month, last month, this year]
```

![Imgur](http://i.imgur.com/kMrvwWk.png)

## Bounce Rate

- 直帰率

```
@Statsbot bounce rate [today, yesterday, this week, last week, this month, last month, this year]
```

![Imgur](http://i.imgur.com/FZHODZO.png)


## New Users

- 新規ユーザ

```
@Statsbot new users [today, yesterday, this week, last week, this month, last month, this year]
```

例) 今週の新規ユーザ (先週との比較)

```
@Statsbot new users this week
```

![Imgur](http://i.imgur.com/wI4RZlY.png)


例) 今日の新規ユーザ (昨日との比較)

```
@Statsbot new users today
```

![Imgur](http://i.imgur.com/6RQtQj2.png)



# Alert

## Set Alert  
- アラート設定

```
@Statsbot alert [users, conversions, events] [above, below, >, <] NUM
```

例) ユーザ数が1000人を超えたらアラート設定

```
@Statsbot alert users > 1000
```

![Imgur](http://i.imgur.com/P6Bs21b.png)

- アラート一覧 表示

```
@Statsbot list alerts 
```

![Imgur](http://i.imgur.com/t9dymX8.png)

- アラート一覧 削除

```
@Statsbot alert remove ID 
```


# Reports

## Summary

- まとめ (ユーザ数, 新規ユーザ数, PV, コンバージョン数, コンバージョン率, イベント数, 平均セッション時間(秒) )

```
@Statsbot summary [today, yesterday, this week, last week, this month, last month, this year]
```

![Imgur](http://i.imgur.com/xN05VKM.png)

## Source

- 流入

```
@Statsbot sources [today, yesterday, this week, last week, this month, last month, this year]
```

![Imgur](http://i.imgur.com/o7gpAFe.png)


## Schedule

- スケジュール 日時週・頻度設定

```
@Statsbot schedule [summary, sources, status]
```

- スケジュール一覧表示

```
@Statsbot list schedule 
```

- スケジュール設定解除

```
@Statsbot unschedule ID 
```

以上です。
ElectronでBrowserWindowやwebviewの証明書エラーに対処する

アカウント作ったのだし、なんか書きましょうかね。

Electronの`BrowserWindow`や`<webview>`でhttpsのURLを読み込む時に証明書の検証でエラーがある場合、Electronは何もせずそのまま通信失敗となります。これではアプリ内ブラウザのような機能としては使い難いので、適切にエラー処理をする必要があります。

エラーの発生時には`app`モジュールや`webContents`の`certificate-error`イベントが発生します。そこで`event.preventDefault()`で元の動作を止め、`callback(true)`を呼び出すことで証明書エラーを無視して通信を続行することができます。

```js
app.on('certificate-error', function(event, webContents, url, error, certificate, callback) {
  event.preventDefault();
  callback(true);
});
```

上のコードのように問答無用でエラーを無視してもいいですが、ユーザーにエラーを無視するか確認させたいのであれば以下のようにダイアログを表示し、`callback()`を非同期で呼び出すことができます。

```js
app.on('certificate-error', function(event, webContents, url, error, certificate, callback) {
  event.preventDefault();
  electron.dialog.showMessageBox(mainWindow, {
    title: 'Certificate error',
    message: `Do you trust certificate from "${certificate.issuerName}"?`,
    detail: `URL: ${url}\nError: ${error}`,
    type: 'warning',
    buttons: [
      'Yes',
      'No'
    ],
    cancelId: 1
  }, function(response) {
    if (response === 0) {
      callback(true);
    }
    else {
      callback(false);
    }
  });
});
```

## 参考
* App: http://electron.atom.io/docs/v0.36.8/api/app/#event-certificate-error
* Dialog: http://electron.atom.io/docs/v0.36.8/api/dialog/#dialogshowmessageboxbrowserwindow-options-callback
Pythonの勉強：リストの最初と最後に、インデックス番号を使って値を入れる

#経緯
Pythonを今更ながら学んでおり、その中での気付きです。

元々、インデックスに飛び飛びの値を使ってリスト作成しようと思ったら出来なかったので気付きました。（常識だったらすみません。）

#内容
リスト（ディクショナリーではないです）の最初と最後に値を入れます。

```lang:list_add.py
list = []

print list

print "------"

list.insert(1,'a')
list.insert(2,'b')
list.insert(3,'c')
list.insert(4,'d')
list.insert(5,'e')
list.insert(0,'f')                         # <---atama
list.insert(999999999,'g')                 # <---oshiri
list.insert(0,'h')                         # <---atama
list.insert(999999999,'i')                 # <---oshiri

print list
```

コレを実行するとどうなるでしょうか・・・？

```
$ python list_add.py 
[]
------
['h', 'f', 'a', 'b', 'c', 'd', 'e', 'g', 'i']
```

0でinsertしたものはその時点の先頭に。
999999999でinsertしたものはその時点の最後尾に。（まぁこれは処理系によるでしょうがちゃんとは見てません。）

#所感
なんというか、インデックスが同じものを何度もinsert出来るというのが気持ち悪いんですが、それで動いてしまうのなら、それはそれで使いみちがあるのかな、と。
（他の言語だと上書きもしくはエラーになりそうな気もしますがどうだったかな。）


いつ役に立つか分からないですが、お勉強してての気付きなのでメモでした。
Rでズンドコキヨシ関数を

#元ネタ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016, 3月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
#コード

```R:kiyoshi.R
kiyoshi<-function(){
  x <- c()
  repeat{
    x<-c(sample(c("ズン","ドコ"), 1,replace=T),x)
    print(x[1])
    if(length(x)>4&prod(x[1:5] == c("ドコ","ズン","ズン","ズン","ズン"))==1){
      cat("キ・ヨ・シ！(", length(x),"回ズンドコしました)\n",sep = "")
      break
    }

    if(length(x)>999){
      print("キ・ヨ・シ！はできませんでした")
      break
    }
  }
}
```

#結果(画像)
![test.JPG](https://qiita-image-store.s3.amazonaws.com/0/112637/7f57bc73-bbd2-a446-2aac-8926e6c83679.jpeg)



#要約

Rではsample関数によって復元抽出を行うことができます。
選ばれた"**ズン**" あるいは"**ドコ**" を用意したベクトルの先頭に挿入します。
"**キ・ヨ・シ！**" への分岐条件は、ベクトルの最初の5つの要素と
"**ズン**" "**ズン**" "**ズン**" "**ズン**" "**ドコ**" を逆さまにしたベクトルを比較することで行います。
この比較の結果はベクトルで返されるので、if文にあてはめるためにprod関数でベクトル内の要素を全てかけ合わせます。
TRUE = 1, FALSE = 0なので"**ズン**" "**ズン**" "**ズン**" "**ズン**" "**ドコ**" 全てがマッチしたときだけ1になります。
結果はcat関数で、せっかくなので**ズンドコ**した回数もベクトルの長さを取得して出力します。

#余談
Rはこういう仕事向いていないんじゃないかなあ

#先人
http://qiita.com/y__sama/items/7c451dfd706f9b36729d
CodeIQ「『ロング・ロング・ストリング』問題」に参加しました。

[CodeIQ「『ロング・ロング・ストリング』問題」](https://codeiq.jp/q/2683)の掲載期間が終了したということで、自分が提出したコードを公開したいと思います。なお[他の方のコードはTogetterにまとめられている](http://togetter.com/li/947393)ということで、そちらをご参照お願いします。また具体的な問題の内容はCodeIQMagazineあたりに公開されると思いますので、そのとき覚えていればリンクを張り付けたいと思います。

# 提出コード

```rb
# 問題文中のF(n)。つまりn^nの桁数を常用対数を利用して求める
def f(n)
    (Math.log10(n) * n + 1).to_i
end

# 問題文中のG(m)。つまりF(n) = m となるnを二分探索を利用して求める
def g(m, rate = 10)
    # nの上界highと下界lowをそれぞれ求める
    low = 1
    low *= rate until f(low) <= m && m <= f(low * rate)
    high = low * rate

    # mについて二分探索を実行する。見つからなければ-1が戻り値となる
    while low <= high do
        n = (low + high) / 2
        return n if f(n) == m
        f(n) < m ? low = n + 1 : high = n - 1
    end
    -1
end

# == main ==
m = gets.to_i
p g(m)
```

# 考え方

問題文中の$n$と$m$は「$m$($n$)がひとつに決定すれば$n$($m$)もまたただ一つに決まり、かつ$m$($n$)が大きくなれば$n$($m$)もまた大きくなる」関係にあります。つまり$n=2,3,4,5,6...$と大きくしたとき、対応する$m$は$1,2,3,4,5...$というようにソートされた状態ですから、二分探索が有効とわかります。つまり

1. $n$を適当に決める
2. $F(n)$を計算する
2. その値が目的の$m$より大きいときは、$n$をより小さくして2.へもどる。$m$より大きいときは、$n$をより大きくして2.へ戻る

以上を繰り返せば、目的の$m$に対応する$n$を求めることができるはずです。

このとき注意せねばならないのは$F(n)$が必要になること、つまり「$n^n$の桁数を求める処理」が求められることです。思わず`i.to_s.size`としたくなりますが、これはだめ。計算量が大きくなりすぎて、制限時間中には終わらなくなります。

したがって別の方法、つまり常用対数を利用する必要があります。たとえば$n^n$の桁数を$x$とすると

```math
10^{x-1} \leq n^n < 10^x \\
\log 10^{x-1} \leq \log n^n < \log 10^x \\
(x-1)\log 10 \leq n \log n < x\log10 \\
x-1 \leq n \log n < x
```

よって$\log n$の値がわかれば、xの値も決定するということです。センター試験の数学1Aに出てきそうな問題ですね。幸いにもRubyには`Math`モジュールに`log10`メソッドが用意されているので、常用対数を簡単に求めることができるはずです。
Android N で 注意すること (その1 : 暗黙的なintentの挙動変更)

# Overview

3/9(US時間) に、Android N Developer Previewが出ました。

と、同時に developer.android.com において、behavior change が出ましたので、少しずつ読み解いていきたいと思います。

# backgroundの最適化

http://developer.android.com/preview/behavior-changes.html#bg-opt

> Android N removes three implicit broadcasts in order to help optimize both memory use and power consumption. This change is necessary because implicit broadcasts frequently start apps that have registered to listen for them in the background. Removing these broadcasts can substantially benefit device performance and user experience.

抄訳:
```
Android Nでは、3つの暗黙的なbroadcast intentを、メモリー使用と、消費電力を最適化するために削除します。というのは、backgroundで、暗黙的なbroadcast intentをlistenしているアプリが、頻繁に起動するためです。これらを削除することによって、deviceのperformanceとユーザー体験に貢献しえます。
```

じゃぁ、何を削除するのか？ということですが、

* CONNECTIVITY_ACTION
* ACTION_NEW_PICTURE
* ACTION_NEW_VIDEO

の３つです。

* CONNECTIVITY_ACTIONは、targetSdkVersion=Nで影響します。で、AndroidManifest.xmlに、書いていても、受け取れなくなります。ただし、BroadcastReceiverをContext.registerReceiver()していた場合は、foregroundでアプリが動作しているときは、受け取ることができます。
http://developer.android.com/preview/features/background-optimization.html によると、
* ACTION_NEW_PICTURE / ACTION_NEW_VIDEOは、targetSdkVersionにはよらないです。

なお、今後、この３つに限らず、もっと増やすかもとのことです。

# 代替案は?

## CONNECTIVITY_ACTION

CONNECTIVITY_ACTIONは、前述のとおり、foregroundでだけでよければ、動的に
登録を行えば、大丈夫です。

http://developer.android.com/preview/features/background-optimization.html#sched-jobs

や、

http://developer.android.com/samples/JobScheduler/index.html

を使えとのことです。

JobSchedulerに関してはおなじみなので、むしろ、connectivity changeのbroadcast intentを使うのはどちらかというと、お作法的によろしくないので、特に目新しくはない感じです。

## NEW_PICTURE / NEW_VIDEO

これらの対策は完全に新規です。

http://developer.android.com/preview/features/background-optimization.html#media-broadcasts

> JobInfo.TriggerContentUri()
Encapsulates parameters required to trigger a job on content URI changes.

抄訳:
```
content URIの変化でjobを起動させるのに必要なパラメータを封入します。
```

と

> JobInfo.Builder.addTriggerContentUri()
Passes a TriggerContentUri object to JobInfo. A ContentObserver monitors the encapsulated content URI. If there are multiple TriggerContentUri objects associated with a job, the system provides a callback even if it reports a change in only one of the content URIs.
Add the TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS flag to trigger the job if any descendants of the given URI change. This flag corresponds to the notifyForDescendants parameter passed to registerContentObserver().

抄訳:
```
TriggerContentUri objectをJobInfoに渡します。ContentObserverは、封入されたcontent URIを監視し、システムがcallbackを提供します。これは、たとえ、複数のcontent URIのうち１つでも変化したらreportします。与えられたURIに由来するどんな変化も必要なときは、TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTSのflagをJobをtriggerするために追加してください。このflagは、registerObserverに渡すnotifyForDescendantsのparameterに対応します。
```


が追加になっています(ちなみに、定期実行はできない)。

ようは、JobSchedulerで、contentの変化をtrigger条件にして、Jobを起動できるようになったということです。

確認のためのコマンドも追加されているとのことです。

```
$ adb shell cmd appops set RUN_IN_BACKGROUND ignore
```
セマンティックバージョニング(SemanticVersioning)を扱うSwiftライブラリ

# はじめに

Swiftを勉強しており、とにかくなんでもいいので簡単なものからSwiftで自作していこうと思ってる。
まずはよくあるセマンティックバージョニングな文字列をパースして比較したりとかそういうのをよく使うので便利だし作った。

# SemanticVersion

ひとまずシンプルに実装してここにあげた。

https://github.com/radioboo/SemanticVersion

複雑な機能はほとんど実装していないけど書いたのは以下の機能

- Equatable/Comparableに準拠して、`==` `!=` `<=` `<` `>=` `>`を実装し、直感的に比較できるようにした
- Carthageでインストールできるようにした

# 追記

- 2016/03/26
    - PreReleaseに対応済み
    - Semantic Versioning 2.0.0の（spec 9~11）に対応
    - Unitテストで保証済みです
[小ネタ] iexを一発で抜ける方法


**`Ctrl+C``Ctrl+C`**と２回打つのはめんどくさい？
**`Ctrl+\`を使いましょう。**

以上。

-----

[Plataformatec社のブログ](http://elixir-lang.org/docs/stable/iex/IEx.html)に書かれていた内容です。
いやー知りませんでした…[IExの公式ドキュメントの説明](http://elixir-lang.org/docs/stable/iex/IEx.html)にも書いてないんだなあこれが。

上記ブログによれば[Erlangの公式ドキュメント](http://erlang.org/faq/getting_started.html)にはちょこっと書いてあるので正しい止め方ですとのこと。
Xcodeで「 None of the valid provisioning profiles include the devices」のようにエラーが出た場合にすること

ProvisioningProfile周りで端末にInstall出来なくなったときに確認することメモ。

# Provisioningファイルとは。
以下Qiitaに記載されている事柄を確認。

* iOSアプリのプロビジョニング周りを図にしてみる
http://qiita.com/fujisan3/items/d037e3c40a0acc46f618

* [iOS] プロビジョニングファイルと証明書の意味
http://qiita.com/edo_m18/items/6f10e57f95b25d9dab4e

# 確認したが分からないとき。

## 状態
取り敢えず「BundleIDとAppIDが一致してること」「秘密鍵と公開鍵のペアが多分正しいこと（例えばProvisioningProfileを作り直したりしてないこと）」「実行が許可された端末であること」を確認したが、原因がわからなかった。MemberCentorで登録されているProvisioningProfileを削除して、XcodeのFIX ISSUE押下で作成されなおすことをを確認したが、問題が解決しなかった。

## 対策

もう手当たり次第削除していって、空の状態からスタートしようぜという原因を特定しない根本的な解決じゃない方法。
多分よくない。

1. Xcodeで開発者としてログインしているとおもうので、ログアウト
2. キーチェンアクセスの「キーチェーン：ログイン」→「分類：自分の証明書」から関連する証明書（正規開発者証明書）を削除する
3. Deviceに保存されているProvisioningProfileを削除
4. 「Window」→「Device」→「DEVICE：HogeHoge」(任意の端末)を右クリック→「ShowProvisioningProfiles」→関連しそうなやつ全削除
5. Xcode終了
6. Macに保存されているProvisioningProfileを全削除
    * 「/Users/HogeHoge/Library/MobileDevice/Provisioning Profiles 」にある。
7. iPhoneをMacから切り離す
8. iPhoneを再起動
9. AppleDeveloper Mvember centerで関連するProvisioningProfileを削除（InvalidもValidも）
9. 開いてるウィンドウを全部とじてMac再起動　Cmd+Q　Cmd+Q　Cmd+Q　Cmd+Q
10. Mac起動したらXcode起動
11. プロジェクトを開くとログインを促すダイアログが出るので、それに従ってログイン
12. iPhone接続
13. 実行　「▶」
14. ダイアログでProvisioningProfile関係のwarningとかでた場合は「FIX ISSUE」
15. 動く！(ﾟ∀ﾟ)


これで憤りすぎて目が痛い・・・。
deviseの本人確認メールをdevise_laterにする

#はじめに
ruby on rails　でwebサービスを開発する際に、deviseを用いてユーザー管理をすることがあると思います。
ユーザー登録時の確認メールをdeliver_laterにするにはどうすればいいか、試してみたので共有します。

#やり方
下記を対象のモデルに記載すれば良いようです。

```user.rb
def send_devise_notification(notification, *args)
  devise_mailer.send(notification, self, *args).deliver_later
end
```

[公式ドキュメント](https://github.com/plataformatec/devise#activejob-integration)に記載がありました。
Rails bootstrapの導入 sassのススメ

「rails bootstrap」とかでググるとbootstrapの導入をlessでやる記事ばかり出てきました。
lessが好きな方が多いか分からないですが、sassで導入したほうが楽なのでは？と思いました。
sassでstyle書くことが多いと思うので（←ただの主観）、わざわざlessを導入する必要はないと思うのです。

sassを使う僕としてはsassがいいです。
やり方、lessもsassも書いておきます。お好みのほうをお使い下さい。

## less

```rb:Gemfile
gem 'therubyracer'
gem 'less-rails'
gem 'twitter-bootstrap-rails'
```

```
$ budle install
$ rails g bootstrap:install
```

application.css と application.js に 自動的にbootstrapの記述が追加されています。
https://github.com/seyhunak/twitter-bootstrap-rails

## sass

```rb:Gemfile
gem 'bootstrap-sass'
gem 'sass-rails'
```

```
$ bundle install
```

*application.css -> application.scss*

```sass:app/assets/stylesheets/application.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

```js:app/assets/javascripts/application.js
//= require jquery
//= require bootstrap-sprockets
```

https://github.com/seyhunak/twitter-bootstrap-rails

以上で十分ですが、こちらのカスタマイズの記事も参考になると思います。
[全部はいらないよね？bootstrap-sassをカスタマイズして使う方法](http://qiita.com/masamitsu-konya/items/e3630046774ac1fbd346)
Apache NiFi-0.5.0以降のnifi-kafka-narは微妙に壊れてます(修正中)

GYAOの窓際エンジニア　玉利です。

いま、Mac上に構築したKafkaとApache NiFiでシステム開発をしているのですが、getKafkaが動かない問題に直面し、今週一週間まるっとハマってました。


飲まなきゃやってらんねーよと、家に帰ってからセコセコ検証してたのですが、飲んでたら解決しました。

https://mail-archives.apache.org/mod_mbox/nifi-users/201602.mbox/%3CCALJK9a6r-=vYrb5Hmc_8n__gm_b57gCfVVKbqpuNnKwHKkX2rg@mail.gmail.com%3E

スーパー意訳

> I've upgraded from Nifi 0.4.1 to 0.5.0 and I am no longer able to use the GetKafka processor.

0.4.1から0.5.0にあげたらGetKafkaが動かなくなったんだけど

> Any chance to attache the app-log or relevant stack trace?

app-logかスタックトレースは？

>The only change that ’s went and relevant to your issue is the fact that we’ve upgraded client libraries to Kafka 0.9 and between 0.8 and 0.9 Kafka introduced wire protocol changes that break compatibility.
I am still digging so stay tuned.

Kafkaのクライアントライブラリを0.9に上げたんだけどプロトコル互換性がなくなったみたい。掘り返してみるから待っててね

〜　詳細なので中略　〜

> I replaced my 0.5.0 kafka nar with the 0.4.1 kakfa nar and it fixed my kafka issue. I renamed the 0.4.1 nar to be 0.5.0.nar and restart nifi and my kafka processor started reading my 0.8.2.1 stream. Not elegant but glad it worked.

0.4.1のkafka.narをリネームコピーして0.5.0にしたら、kafka 0.8.2.1のストリームを読めた。エレガントじゃないけど動いてよかった。


> All just as a point of reference we now have a live system running that is on NiFi 0.5.0 and feeding three versions of Kafka at once:
- 0.8.1
- 0.8.2.0
- 0.9.0.1

（中略)　これこれのKafkaバージョン + NiFi 0.5.0だと動いてる


brewのkafkaのバージョンは。。。。見事にハマり。
```
[btamari@MBP-15UAC-072 ~]$ brew list kafka
/usr/local/Cellar/kafka/0.8.2.2/bin/kafka-console-consumer.sh
/usr/local/Cellar/kafka/0.8.2.2/bin/kafka-console-producer.sh
```

# とりあえず、コピーしたら動いた！

お行儀わるいけど、上書きしました。

```
$ cp nifi-kafka-nar-0.5.1.nar nifi-kafka-nar-0.5.1.nar.org
$ cp ../../nifi-0.4.1/lib/nifi-kafka-nar-0.4.1.nar ./nifi-kafka-nar-0.5.1.nar
```

<img width="352" alt="NiFi_Flow.png" src="https://qiita-image-store.s3.amazonaws.com/0/113049/2b10b06e-a043-5b7d-774d-45d3b9d55d2c.png">



人柱になってしまいました。皆様お気をつけを。。。。
atomのremote-syncの鍵認証でタイムアウトする時の対処方法

（本記事は[こちら](http://businesscreators.jp/blog/9548.html)に書いた過去の記事をちょっと修正して載せたものです。）

#経緯
atomは色々とプラグインが便利ということで、remote-syncを入れてVMのLinux上にあるソースをWindowsからいじいじするとかやりやすい感じです。
SSH鍵をつかって通信させてますが、初回の接続でどうも時間が掛かってしまう時があり、タイムアウトしてしまうことが度々有りましたので、その時の対処方法を紹介します。

#前提
ちょっと特殊な環境かもですが、こういう構造になってます。

```
|             |             |             |
|  Win(atom)  |   <------>  | Linux(PHP)  |
|             | remote-sync |             |
-------------------------------------------
|               Linux(KVM)                |
```
このWindows7上にあるatomからremote-syncでPHPが入ってるLinux開発機のフォルダを持ってきてます。
Git使えばいいんじゃないかという話もあるかもですが、、、まぁ食わず嫌いで当時やってなかったのです。てへぺろ:smile:



#説明
要するにremote-syncの設定ファイルのTimeout値をいじるんですが、その場所は

```
.atom\packages\remote-sync\node_modules\ssh2\lib\Connection.js
```
の中の`opts.readyTimeout`がそれにあたります。
なので、これを10000から60000位に修正すればatom起動後の初回の通信時のタイムアウトがなくなると思います。
自分の環境にあわせて調整してみてください。

以上です。
homebrewでインストールしたmariadbをアンインストールする

こんばんは :whale2: 
今日は homebrew　でインストールした　mariadb をアンインストールしたいと思います。

## 環境

```bash:環境
# コンピュータ
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.3
BuildVersion:	15D21
```

## 事前確認

```bash:
# 稼働状況確認
$ mysql.server status
 SUCCESS! MySQL running (7525)


# 設定ファイルの場所
$ ls /usr/local/etc/my.cnf
$ ls /usr/local/etc/my.cnf.d/


#　データファイルの場所
$ mysql -uroot -proot -e'SHOW VARIABLES LIKE "datadir"'
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| datadir       | /usr/local/var/mysql/ |
+---------------+-----------------------+
```

## 削除

```bash
# サーバ停止
$ mysql.server stop
Shutting down MySQL
.. SUCCESS!


# mariadb 削除
$ brew remove mariadb
Uninstalling /usr/local/Cellar/mariadb/10.1.12... (565 files, 131.5M)


# 設定ファイル削除
$ rm -rf /usr/local/etc/my.cnf*


# データファイル削除
$ rm -rf /usr/local/var/mysql
```

おわりです :beer: 


## 参考と注釈

(とくになし)
超初心者がjavaで疑問に思ったこと

初めての投稿です！java超初心者なので疑問に思ったことを備忘録兼ねて書こうと思います。

キーボードから入力した文字を画面に出力する簡単なプログラムを書こうと思い

```lang:filename
public class test
{
    public static void main (String[] args)
    {
        InputStreamReader is = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(is);
        System.out.println("何か入力してください");
        String str = br.readLine();
        System.out.println(str);
    }
}
```
こんなコードを書いてみました。
ですがエラー！何でだろうと思い調べ・・・
例外処理をしないといけないとわかりました！

```lang:filename
public class test {
    public static void main (String[] args) {
        try {
            InputStreamReader is = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(is);
            System.out.println("何か入力してください");
            String str = br.readLine();
            System.out.println(str);
        }
        catch (IOException e) {}
    }
}
```
**try**と**catch**を書き加えました。これで問題なく動いたのですが。
tryとcatchってなに？
最初に書いてあるプログラムの場合
「IOException」という例外が発生する可能性があり、それに対しての対処を行っていないのでjavaは処理をせずエラーを返してきます。
後者のプログラムはtryで「IOException」という例外を捕捉してcatchに放り投げてcatch内の処理を実行する、という対処を行っているのでjavaはOKと判断してエラーを出さずに処理を実行する！
catchの中に数字が入ったときとかのエラー文をcatch内に書けばオッケーってことですね。

おわり
PHPの...演算子は参照つきで展開される

```php
<?php
$angels = [
    ['ら', 'く', 'や', 'ね', 'さ', 'あ'],
    ['せ', 'な', 'の', 'り', 'み', 'い'],
    ['だ', 'ち', 'あ', 'や', 'う', 'ま'],
];
array_multisort(
    [1, 1, 4, 5, 1, 4],
    [9, 3, 1, 8, 1, 0],
    ...$angels
);
print_r(array_map('implode', $angels));
```

**【注意】** HHVMでは参照つき**ではない**もよう．
shapelyのsvg出力

ああ、shapelyは流行ってないのか。まあいいや

shapelyでgeojsonから画面出力までのサンプルである。

通常はmatplotlibでやるんだろうが、せっかくsvgがあるんでこれを
使いたいなあと思って書いたコードである。とうぜんといってはなんだが
jupyter notebookでの利用が前提である。

.svg()という関数もあるんだが、こっちはあんまりうまくいかない
chromeのせいなんだろうか？

これleafletかなんかを使えばもっとシンプルにできるのかねえ？
まあ、この表示のあと、線の交点を求めるintersectionとかを使いたいので、
shapelyでないといけないんだけど、この
\_repr_svg\_()のインターフェースしかないんかねえ？
st.replaceはやりすぎかんがあるんだが、まあしかたがないよね
ソースをいじった方が早いかなあ？

```python:tokyo.py
from shapely.geometry import *
import simplejson
from IPython.display import HTML

f=open('tokyo.geojson')
jsn=simplejson.load(f)
s=[]
for i in jsn['features']:
    if(i['properties']['area_en']=='Tokubu'):
        s.append(shape(i['geometry']))

sm=MultiPolygon(s)
st=sm._repr_svg_()
st=st.replace('width="100.0"','width="300.0"')
st=st.replace('height="100.0"','height="300.0"')
st=st.replace('stroke-width="0.0076922352"','stroke-width="0.0008922352"')
#st
HTML(st)
```
Presentation Modelパターンの学習メモ



# 教材
[Presentation Model](https://msdn.microsoft.com/ja-jp/library/ff921080.aspx)を参考にします。

# 特徴

## プレゼンテーションモデルはユーザーインターフェイスの状態を持つ

```
ビジュアル表示に関する処理とユーザー インターフェイスの状態や動作に関する処理をそれぞれ個別のクラス (ビューとプレゼンテーション モデル) で行います。
```

プレゼンテーションモデルは`ユーザー インターフェイスの状態`を持ちます。
また`動作`も持ちます。分割方針は、ほぼMVVMと一緒です。
（そも、MVVMは、Presentation Modelの派生という認識です。）

## ビューはプレゼンテーションモデルを更新

```
プレゼンテーション モデル クラスは、モデルへのアクセスをカプセル化して、ビューから簡単に使用できるパブリック インターフェイスを提供する
```

ビューが更新するのはプレゼンテーションモデルです。
モデルを直接更新しません。次のような役割と考えられます。

- モデル更新の主な処理はプレゼンテーションに定義する
- ビューのイベントハンドラーでプレゼンテーションモデルを呼び出す

MVCで扱いに困る、コントローラー内の「モデルを更新するか、モデルを更新せずにビューだけ更新する」ロジックはプレゼンテーションロジックに定義できます。

## ビューはプレゼンテーションモデルの状態を見て更新

```
プレゼンテーション モデルはモデルの更新、照会、監視を行います。また、ビジュアルコンテンツ内の変更をビューに通知します。
```

プレゼンテーションモデルはモデルを監視し、状態を自身に反映し、ビューに変更を通知します。
プレゼンテーションモデルにテスト用のドライバーをつければ、プレゼンテーションモデルの状態管理をテストできます。

# 世界観

```
データ バインドは、一般に、サーバーまたはローカルの構成データをフォームやその他の UI コントロールに配置して使用します。
```

Microsoft AccessでDataGridにデータベースをつないで表示、編集する世界観の延長です。
データベースを他のモデルに拡張するためにプレゼンテーションモデルで抽象化します。

# 原始MVCとの違い
## 同じ役割分担

分け方に違いはありません。
原始MVCのコントローラーは以下の役割を持ちます。

- モデルの更新
- モデルと関わらないビューの状態管理（選択状態、下書き）
- ビューの更新

プレゼンテーションモデルの役割と一致します。

### MVCでの「モデルと関わらないビューの状態管理」
MVCでは「モデルと関わらないビューの状態管理」はモデルには入りません。
なぜならMVCでは[次の手順で役割を分けます](http://heim.ifi.uio.no/~trygver/2003/javazone-jaoo/MVC_pattern.pdf)

1. ビジネスロジックとプレゼンテーションロジックをわけ、ビジネスロジックをモデルとする
2. プレゼンテーションロジックを入力と出力にわけ、入力をコントローラー、出力をビューとする

「モデルと関わらないビューの状態」はビジネスロジックではありません。
つまりモデルではありません。

## 原始MVCに追加する制約

1. 必ず[監視コントローラー](https://msdn.microsoft.com/ja-jp/library/ff648921.aspx)を使う
2. 二つの監視コントローラー
 1. ビュー -> プレゼンテーションモデル
 2. プレゼンテーションモデル -> モデル

### MVCでは監視コントローラーは必須ではない
[The Model-View-Controller (MVC) Its Past and Present](http://heim.ifi.uio.no/~trygver/2003/javazone-jaoo/MVC_pattern.pdf)では、別のパターンとして紹介されています。

- P-7: INPUT/OUTPUT SEPARATION(MVC/1980)
- P-11: SYNCHRONIZE MODEL AND VIEW

## メリット・デメリット
メリット：「モデルと関わらないビューの状態管理」がテスト可能に
デメリット：プレゼンテーションモデルとモデルで状態を二重管理

モデルからプレゼンテーションモデルへの状態反映が自動化できれば、ノーコストで「テスト可能なビューの状態」が手に入ります。

（現実の歴史では、絵に描いた餅になります。）

## 残課題
- MVVMとPMの違いが不明
- [Presentation Model](http://martinfowler.com/eaaDev/PresentationModel.html)を通したより詳しい理解
[Memo] CentOS7でのGitBucket設定


## CentOS7でのGitBucketの設定

```
yum install tomcat
cd /var/lib/tomcat/webapps
cp ${path_to_gitbucket.war} .
chown tomcat:tomcat 
systemctl start tomcat 
systemctl enable tomcat
```

## tomcatの設定

[CentOSにGitBucketを構築してみた。](http://qiita.com/YN0314/items/d205dfed2e968bf8f408) を参考

## バックアップ

[GitBucketのバックアップ方法](http://qiita.com/tenten0213/items/27ef294193dc85661215)
OpenJDKとAndroidの標準ライブラリクラスの差分をみる

こんなスクリプトを書いた。 `chmod -x` で実行パーミッションを与えて以下のコマンドで実行できるはず。

```shell-session
./openjdk-android-diff java.lang.String
```

すると `openjdk7.java.lang.String.java.diff`のようなファイルができあがります。

```perl
#!/usr/bin/env perl
# usage: openjdk-android-diff java.lang.String
use strict;
use warnings;
use HTTP::Tiny;
use File::Temp;
use MIME::Base64;

my $name = shift(@ARGV) or die "$0 fully-qualified-class-name\n";

my $path = ($name =~ s{\.}{/}gr) . ".java";

my $branch = "master"; # may be "android-n-preview-1";

my $openjdk7_url = "http://hg.openjdk.java.net/jdk7/jdk7/jdk/raw-file/default/src/share/classes/$path";
my $openjdk8_url = ($openjdk7_url =~ s/jdk7/jdk8/gr);
my $android_url = "https://android.googlesource.com/platform/libcore/+/$branch/ojluni/src/main/java/$path?format=TEXT";

my $openjdk7 = File::Temp->new(SUFFIX => '.java');
my $openjdk8 = File::Temp->new(SUFFIX => '.java');
my $android= File::Temp->new(SUFFIX => '.java');

my $http = HTTP::Tiny->new;

my $ok = 0;
for my $url($android_url, $android_url =~ s/ojluni/luni/r) {
    my $r = `curl -L -f "$url"`;
    if ($? == 0) {
        $android->print(decode_base64($r));
        $android->flush();
        $ok = 1;
        last;
    }
}
if (!$ok) {
    die "No $android_url found.\n";
}

system qq{curl -L "$openjdk7_url" > "$openjdk7"};
system qq{curl -L "$openjdk8_url" > "$openjdk8"};

system qq{git diff -b "$openjdk7" "$android" > openjdk7.$name.java.diff};
system qq{git diff -b "$openjdk8" "$android" > openjdk8.$name.java.diff};
```
2ちゃんねるのお絵描きに画像を貼り付ける

### 2ちゃんねるのお絵描きに画像を貼り付けるツール [こちら](http://pie.karou.jp/p.html)
### 実行例
![b.jpg](https://qiita-image-store.s3.amazonaws.com/0/54926/ac8b630e-333a-521c-16a3-1076e229de01.jpeg)

ブラウザのコンソールでJavaScriptを実行して
2chのcanvasに画像を貼り付けます。
今回作ったツールはそのソースコードを作成するためのものです。
KotlinでDeprecatedなメソッドの代替への置換をサジェストする

## はじめに

ライブラリや共通で使われる処理を作っていると諸事情によりAPIをDeprecatedしたくなることがあると思います。
KotlinでもJavaと同じく`Deprecated`アノテーションが使えるのですが、Kotlinでは代替のAPIへの置換をユーザにサジェストすることが出来ます。

今回、実際にDeprecatedを書いてみて非常に便利だったので紹介します。

## 実際の例

拙作のKotlin製ライブラリ[Kotpref](https://github.com/chibatching/Kotpref)で、`Kotpref`というobjectの`bulk`をDeprecatedして、拡張関数`bulk`に置き換える例で見てみます。

```kotlin:変更前(Kotpref.kt)
object Kotpref {
    // 省略…
    
    fun <T : KotprefModel> bulk(receiver: T, f: T.() -> Unit) {
        // 省略…
    }
}
```

```kotlin:変更後(KotprefExtensions.kt)
inline fun <T : KotprefModel> T.bulk(block: T.() -> Unit) {
    // 省略…
}
```

この`bulk`は利用側では以下のようになっています。
Deprecatedアノテーションを使うことで、このソースに対して置換を行う方法について考えていきます。

```kotlin
object UserInfo : KotprefModel() {
    var name: String by stringPrefVar()
}

class Example {
   fun deprecateExample() {
        Kotpref.bulk(UserInfo) {
            name = "chibatching"
        }
   }
}
````

### Deprecatedアノテーション

KotlinのDeprecatedアノテーションは最大3つの引数を取ります。

|引数|意味|
|---|---|
|message|必須。ユーザに表示するメッセージ、空にしてもDeprecatedである旨は表示される。|
|replaceWith|今回の肝、置換の方法を指定する。次で説明。|
|level|Deprecatedのレベルを指定する。デフォルト`WARN`。<br>`HIDDEN`を指定すると単純にAPIが見えなくなってしまい置換のサジェストもできないので注意。|

#### ReplaceWith

今回の肝となる`ReplaceWith`アノテーションは次のように[定義されています](https://github.com/JetBrains/kotlin/blob/875287574f9b3252e404a25fbe6086555d6506f0/core/builtins/src/kotlin/Annotations.kt#L53)。

```kotlin
public annotation class ReplaceWith(val expression: String, vararg val imports: String)
```

この`ReplaceWith`アノテーションの一つ目の引数`expression`で置換の方法を指定することが出来ます。
利用側では下のように置換できればDeprecatedされたAPIの移行を完了できるので、この置換ができるようなexpressionを考えてみます。

```kotlin
Kotpref.bulk(UserInfo) {
    name = "chibatching"
}
// いい感じに↓のように置換したい
UserInfo.bulk {
    name = "chibatching"
}
````

### expressionを考える

ところで、あるAPIをDeprecatedして新しいAPIに移行したい時、DeprecatedしたAPIの実装はどうしてますか？
そのままというパターンもあると思いますが、新しいAPIを呼び出す実装にしていることが多いのではないでしょうか？
例えば、今回の場合だと↓こんな具合で。

```kotlin
fun <T : KotprefModel> bulk(receiver: T, f: T.() -> Unit) {
    receiver.bulk(f) // 廃止するAPIでは新設するAPIを実行する
}

inline fun <T : KotprefModel> T.bulk(block: T.() -> Unit) {
    // 省略…
}
```

なぜ突然こんなことを言い出したかというと、この新しいAPIを呼び出す部分。これがそのままexpressionとして使えるんです！
なので、DeprecatedしたいAPIの宣言はこうなります。

```kotlin
@Deprecated(
        message = "",
        replaceWith = ReplaceWith("receiver.bulk(f)")
)
fun <T : KotprefModel> bulk(receiver: T, f: T.() -> Unit) {
    receiver.bulk(f)
}
```

これだけで、IDE上でDeprecatedの警告と一緒に新しいAPIへの置換をサジェスト&自動置換ができるようになってしまいます。
実際に置換を行ってみるとAndroidStudio上では↓のようになります。

![replacewith.gif](https://qiita-image-store.s3.amazonaws.com/0/53706/020d04c3-890e-30be-f11c-553e880cbd18.gif)

このようにメソッドの引数やブロックをいい感じに展開して置換してくれていることがわかります。
また、明示的にimportを追加したい場合にも`ReplaceWith`の第2引数で指定することが可能です。

[公式ドキュメント](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-replace-with/index.html)だけではどのような書き方が出来るのかほとんどわからないので、他にどんな書き方ができるかはKotlinのソースを見てみるのがいいと思います。
[Search Results](https://github.com/JetBrains/kotlin/search?l=kotlin&q=ReplaceWith&type=Code&utf8=%E2%9C%93)

## さいごに

引数が増える場合など、今回の例のように綺麗に置換できないパターンも多いとは思いますが、うまく一発で置換できると気持ちいいです。
また、一括置換もできるので`ReplaceWith`がしっかりと機能するようにしておけば、ユーザ側の新APIへの移行もスムーズに行えるのではないでしょうか。
書籍「Programming Elixir」の Elixir 1.2 対応版が発売されたので、旧版とざっと見比べてみた

Elixir の定番の入門書「Programming Elixir」ですが、Elixir 1.2 対応版が、おととい（2016年3月8日）発売されました。

- [Programming Elixir 1.2](https://pragprog.com/book/elixir12/programming-elixir-1-2)<br/>
  Functional |> Concurrent |> Pragmatic |> Fun<br/>
  by Dave Thomas<br/>

旧版は Elixir 1.0 ベースだったので、どこが更新されたか、ざっと見比べてみました。


## クーポンが届いていないか要チェック

ちなみに私は、昨年、旧版の eBook 版（PDF, epub, Kindle mobiに対応）を、出版社 The Pragmatic Bookstore のオンラインストアから直接購入していました。そして今年の1月に、新版の eBook 版が100%オフになるクーポンをメールで受け取りました。そんなわけで、発売を楽しみにしていたのでした。（Qiita で宣伝しているのは、クーポンのお礼みたいなものです）

```
> Subject:  [Pragmatic Bookstore] New Coupon!
> Date:     Tue, 05 Jan 2016 04:30:41 +0000
> From:     The Pragmatic Bookstore <support@pragprog.com>
> To:       tatsuya@******.org
>
> Dear Tatsuya Kawano,
>
> You have a new Pragmatic Bookshelf coupon worth 100% off.
>
> Save 100% when you purchase "Programming Elixir 1.2 (eBook)"
> because you already own "Programming Elixir (eBook)".
>
> You can redeem your coupons by visiting your Bookshelf Homepage.
>
> Or begin shopping with your new coupon by visiting the store at
> http://pragprog.com/redeem/******************
```

Pragmatic Bookstore から直接購入した人は、クーポンが届いてないか、メールボックスをよく確認してくださいね！


## アップデート１： `with` スペシャルフォームの解説

全体の構成は旧版と変わっていません。PDF版（印刷版と同じレイアウト）のページ数は、旧版 323ページ、新版 335ページと少しだけ増えています。章立ては上の「Programming Elixir 1.2」のリンク先で確認できます。

第４章 Elixir Basics の Variable Scope の節に、`with` スペシャルフォームの解説とちょっとした注意点が、さらっと３ページほど追加されています。内容としては、多すぎず少なすぎず、妥当かなというところです。


## アップデート２：Elixir リリースマネージャー EXRM の解説を追加

第18章 OTP Applications に EXRM -- the Elixir Release Manager の節が追加されました。約９ページに渡って解説しています。

ここでは簡単なサンプルアプリを使って、一連の手順を紹介しています。アプリの初回リリース、アップグレード、アプリのバグをサービス無停止で修正する「ホットデプロイ」などが含まれており、なかなかいい感じです。


## アップデート３：非推奨のコレクションに関する記述を削除

Elixir 1.2 では、Erlang/OTP 18 が必須となったことに合わせて、一部のコレクションが非推奨になりました（[参考](http://qiita.com/HirofumiTamori/items/cdb9d2d46b638a38ae5a)）。そのため、第８章から、非推奨の `HashDicts` と `Dict` ビヘイビアの解説が削除されました。

- 旧版の第８章：Dictionaries: Maps, HashDicts, Keywords, Sets, and Structs
- 新版の第８章：Maps, Keyword Lists, Sets, and Structs


## まとめ

残りの部分は特に違いは見られず、全体として地味なアップデートです。もし旧版を買ったばかりで、クーポンもないようだったら、無理して新版を買う必要はないかもしれません。

もし旧版を持っていないなら、英語という問題はありますが、個人的にはお薦めの本です。Elixir 言語、主なライブラリ、OTPデザイン原則、ツール類のエコシステムといった、Elixir で開発するのに必要な基礎知識全体をカバーしています。オンラインストアの書籍目次で「excerpt」と書かれた章は、PDF形式でダウンロードできます。もし購入について悩んでいたら、それらの章を読んでみることをお勧めします。

なお、この本には、Phoenix フレームワークの解説はありません。これについては、José Valimらによる [別の本](https://pragprog.com/book/phoenix/programming-phoenix) が、今年４月に発売される予定です。（現在ベータ版が購入可能です。私は持っていませんが）
/etc/ufw/sysctl.conf 覚書

``/etc/ufw/sysctl.conf`` のコメント行の和訳。

ネットワーク環境変数の設定ファイル。

``/etc/sysctl.conf`` を上書きする。 
``/etc/sysctl.conf`` を使用する場合、 
``/etc/default/ufw`` の ``IPT_SYSCTL`` を調整すること。

ホストのインターフェイスへ許可する通信パケット

```
net/ipv4/ip_forward=1
net/ipv6/conf/default/forwarding=1
net/ipv6/conf/all/forwarding=1
```

送信元アドレスの検証を全インターフェイスで有効にし、なりすまし攻撃を防止する。

```
net/ipv4/conf/default/rp_filter=1
net/ipv4/conf/all/rp_filter=1
```

IP ソースルートパケットを受信しない。(この端末はルーターではない)

```
net/ipv4/conf/default/accept_source_route=0
net/ipv4/conf/all/accept_source_route=0
net/ipv6/conf/default/accept_source_route=0
net/ipv6/conf/all/accept_source_route=0
```

ICMP リダイレクトを無効化する。 
ICMP リダイレクトは稀に MITM (man-in-the-middle) 攻撃に使用されることがある。 
ICMP の無効化は正当な通信を混乱させることがある。

```
net/ipv4/conf/default/accept_redirects=0
net/ipv4/conf/all/accept_redirects=0
net/ipv6/conf/default/accept_redirects=0
net/ipv6/conf/all/accept_redirects=0
```

偽の ICMP エラーを無視する。

```
net/ipv4/icmp_echo_ignore_broadcasts=1
net/ipv4/icmp_ignore_bogus_error_responses=1
net/ipv4/icmp_echo_ignore_all=0
```

有り得ないパケットを記録しない。

```
net/ipv4/conf/default/log_martians=0
net/ipv4/conf/all/log_martians=0
```

* 0 = TCP Window Scaling を無効にする。
* 1 = TCP / IP SYN クッキーを有効にする。

```
net/ipv4/tcp_syncookies=0 | 1
net/ipv4/tcp_fin_timeout=30
net/ipv4/tcp_keepalive_intvl=1800
```

通常 tcp_sack の許可は OK になっている。 
しかし OpenBSD 3.8 RELEASE や 
初期の pf ファイアウォールへ接続する場合は 0 を指定すること。

```
net/ipv4/tcp_sack=0 | 1
```

ipv6 自動構成をオフにする場合はコメントを解除する。

```
net/ipv6/conf/default/autoconf=0
net/ipv6/conf/all/autoconf=0
```

ipv6 privacy addressing を有効にする場合はコメントを解除する。

```
net/ipv6/conf/default/use_tempaddr=2
net/ipv6/conf/all/use_tempaddr=2
```
ヤフーJavaScriptマップAPIのバグっぽいやつ

環境はmac、OSX

悩まされて結局解決しないのでメモ

スマホ用のページを作ってて

```
    var ymap = new Y.Map("yolp_map", {
      configure : {
        doubleClickZoom : false,
        scrollWheelZoom : false,
        singleClickPan : false,
        dragging : false
      }
    });

    ymap.bind('click', function(LatLng){ らっとらんぐほしい });

    ymap.drawMap(らっとらんぐ, 12, Y.LayerSetId.NORMAL);
```
で地図を表示したんですが、ymapのonclickイベントが取得できんのです←
具体的にはchromeのデベロッパーツールでデバイスをApple iPhone6にして検証したんですがどうやっても取得できません。
マジギレしながらjqueryのみを読み込んで地図の単体ページ作ってそれを私のAndroid(SHL22)に送って実機のchromeで表示してみましたけどそれでも発火しません。

markerとかには同じことやってクリックすればイベントが発火します。
例えば

```
    for(i = 0; i < objs.length; i++){
      var latlng = new Y.LatLng(objs[i].location.lat, objs[i].location.lon);
      var marker = new Y.Marker(latlng, {icon: icon});
      marker.bind('click', ふぁんくしょん);
      ymap.addFeature(marker);
    }
```

これだと各マーカー余裕でクリック取れる。
地図上のクリックだけがどうやっても発火しないOTL

PC表示であれば同じコードで問題なくクリックイベント取れます。

ymapのclickイベントでクリックした位置の座標がLatLng形式で取れるのでそれを使いたいんですがなんか他に良い方法ないすかね〜←

あと、スマホ表示の場合のみ

```
    var ymap = new Y.Map("yolp_map", {
      configure : {
        doubleClickZoom : false,
        scrollWheelZoom : false,
        singleClickPan : false,
        dragging : true
      }
    });
```
の場合doubleClickZoomが有効になる。つらみ。

chromeでしか確認してないけど、chromeで動作しなかったら職業上アウトなんでアウト←
stackeditでフローチャートを書きたいが

# google chromにstackeditのアプリを追加したが[Markdownテキストでシーケンス図とフローチャートを描く事が出来ない。](http://qiita.com/ka215/items/a709665cb34c505ccf1f)

flowchart.jsを使っての
`code`
```flow
st=>start: 処理開始
e=>end: 処理終了
io1=>inputoutput: データ入力
cond=>condition: 入力値が空
でない？
io2=>inputoutput: エラー出力
（※1）:>#footnote
sub1=>subroutine: 入力値の検証
（※2）:>http://www.google.com[blank]
op1=>operation: セッション開始

上記のmarkdownでもプレビュー画面でmarkdownのコードのみの表示でチャートが表示されなかった。これは、別個にflowchart.jsをインストールしないといけないのだろうか。

これは、実際は[adrai/flowchart.js](https://github.com/adrai/flowchart.js)から一応はダウンロードはしているのですが。

チャートを実際に表示をするのには、何が足りないのだろうか。
Ruby初心者がWebSocket 03.em-websocketのサンプルプログラムのconnectionの状態を判断して配列を整理する

前回のサンプルをいじってみます。

まずはcloseしたconnectionを保持しているのが良くないならそれを除去すればいい。
ということで、oncloseに以下の処理を加えてみる。

```
    ws_conn.onclose do
        i=0
        connnections.each {|conn|
                i=i+1
                pp "Index : #{i} state ? #{conn.state}"
        }
        connnections.each{|conn| conn.send("Connect New Client : #{i+1}") }
        connnections.each{|conn| conn.send("Reconnect Client : #{i}") }
    end
```

普通に考えればoncloseで呼ばれた時点で既にstatusはclosedになっているはずで、そうなればそれをcollectionから除去してあげればいいはず

では実行です。
まずはクライアント３つ接続して、２つ目を閉じます。

'''
"Index : 1 state ? connected"
"Index : 2 state ? closed"
"Index : 3 state ? connected"
'''

やはり、この時点でclosedになっているようです。
後はコレを削除すればいい。

ということで、Rubyの文法調べながら試行錯誤して以下のように変更

```
    ws_conn.onclose do
        connnections.each {|conn|
                if conn.state==:closed then
                        conn=nil
                end
        }
        connnections.compact!
    end
```

スレッドセーフであるかどうかはきちんと確認しないといけないけど、それはとりあえず、置いておくとして。。。。

Rubyの配列にはいろいろ便利な機能があって、配列の中身がnilの場合にcompactをすると
nilが除去されて、きれいになってくれるらしい。
ならば、connをnilしてしてあげればいいじゃない！

ということで、試してみる。

結果。。。。

配列が整理されていない。。。ダメポ。。。
最初と同じでブラウザ閉じてもcollectionのサイズがクリアされない。。。

なぜ？？？

とおもって、Javaらーな私が何気なく使っていた参照渡しの概念？とおもってみると
どうやら、Rubyは基本【値渡し】ということ。。。ﾏｼﾞﾃﾞｶ。

ということで、それならばということで以下のコードに変更

```
    ws_conn.onclose do
        connnections.each_with_index {|conn, i|
                if conn.state==:closed then
                        connnections.fill(nil, i, 1)
                end
        }
        connnections.compact!
    end
```

簡単に言うと、closedのものをnilにして、compactする。


３つブラウザを立ち上げて１つ閉じてもう１回開くと接続数は３と正しい数値が取れていた。
接続も切れてないし、とりあえず、これでcollectionの整理は出来たようだ。。。
行列の積のトレースの微分

機械学習の教科書の中で、
行列の積のトレースの微分が出てきたので、
とりあえず参考文献だけメモ。

参考：
・行列の微分
http://qiita.com/skitaoka/items/1bbc6d976738d3e24466#%E7%A9%8D%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%81%AE%E5%BE%AE%E5%88%86

・行列の公式集（P18）
http://sci-tech.ksc.kwansei.ac.jp/~inagai/write/stat_linear.pdf
新しいサイトを作ってみた

よく言えば、サイトというより、サービスです。 
はてなブックマークをチェックできるサイトを作りました。本格的に作ったというより、手抜きサービスです。なぜなら、RSSか。一個だけだから。
特に、頑張ったことはありません。
はてなDevの情報などで、作れました。
リンクはhttp://ushi.my.coocan.jp/hatebu.html です。
無線 LAN 覚書

hostapd.conf のコメントを和訳しながら、
何のことだか解らない単語があったので調べてみた。

# 送信出力
電波をどれくらいの強さで送信するかの設定。

# ベーシックレート
通信速度の設定。
クライアント端末がアクセスポイントへ接続すると
受信している電波の状況や、端末自身の対応規格に応じて
アクセスポイントとネゴシエーションを行い、
通信の速度(レート)を決定する。

IEEE 802.11 の無線 LAN はアクセスポイントから送信される電波を
配下のクライアント端末全体で共有する。
どれか1台のクライアントが通信を行っている時は
他のクライアントは待機状態となる。
接続しているクライアントのレートが低い(遅い)と
通信時間が長くなり、他のクライアントの待機時間も長くなって
ネットワーク全体が低速化する。

# IEEE 802.11 b / g / n
2.4 GHz 周波数帯を使用する。同時に 3 つのチャンネルまで使用することができる。
電子レンジや Bluetooth 機器などでも使用される帯域である為、
干渉を起こしやすい。

# IEEE 802.11 a / n
5 GHz 周波数帯を使用する。同時に最大 19 チャンネルまで使用することができる。

# ビームフォーミング
電波の一番強い部分をクライアント端末がいる場所で重ね合わせるように調整すること。
クライアント端末は高い受信率を維持することができる。
postgresql9.5.1でjsonの基本操作。追加更新できるようになった。

環境
postgresql 9.5.1
psql 9.5.1

マークダウンで再編集。

参考ドキュメント
https://www.postgresql.jp/document/9.5/html/functions-json.html

jsonbを基本使う。
jsonは、配列の並びが固定なので、フィールドをナンバーインデックス指定して使うなら使えそうだけど、基本はjsonb型推奨。

```sql:create
create table test (DATA JSONB);
```

```sql:insert
testuser=# insert into test values ('{"id":"0","id_old":"1"}'::jsonb) returning *;
            data            
----------------------------
 {"id": "0", "id_old": "1"}
```

9.4からJSONBデータでJSONデータに要素が含まれるか確認可能になる
存在演算子：idキーがあるかチェック

```sql:keycheck
testuser=# select data?'id' from test;
 ?column? 
----------
 t
(1 行)
```

9.5からvalueの追加更新が可能になる、


```sql:json.update
testuser=# select data||'{"id":"2"}'::jsonb from test;
          ?column?          
----------------------------
 {"id": "2", "id_old": "1"}
```

値の取得は、

```sql:value.get
testuser=# select data->'id' from test;
 ?column? 
----------
 "0"
```

値の取得は、ネストでも取れる。

```sql:value.nest.get
testuser=# select  '{"a": {"b":"foo"}}'::json->'a'->'b';
 ?column? 
----------
 "foo"
```

今日はここまで。
amazon rdsも9.5に早く対応するといいなー。
maven 3.3 java 8 な環境で jacocoを使ってコードカバレッジを出すのが大変だった

本記事は、jacocoの導入関連の記事や公式ドキュメントを読んでも、導入がうまくいかなかった人に向け解決策の1つの可能性を示すものである。

みんながうまくいくかは知らない。

なぜなら筆者自身Mavenとかよくわかってないからだ。

## 前提
javaのバージョン

```
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
```

mavenのバージョン

```
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /usr/local/apache-maven-3.3.9
Java version: 1.8.0_74, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.3", arch: "x86_64", family: "mac"
```

CIサーバ上でも同様だったのでOSは関係ないだろう。

## 関連技術
- [jacoco](http://eclemma.org/jacoco/)
    - コードカバレッジを計測してくれるライブラリ
    - [maven用のプラグイン](http://eclemma.org/jacoco/trunk/doc/maven.html)も提供している
    - 本記事ではこのmaven pluginを使う

## jacocoの導入
jacocoの[usage](http://eclemma.org/jacoco/trunk/doc/maven.html)を読もう。
[サンプルのpom.xml](http://eclemma.org/jacoco/trunk/doc/examples/build/pom.xml)もある。
Qiitaにいろんな記事があるので、タグから探るのもいいでしょう。

コレでうまく行った人はすみやかにこの記事を閉じましょう。

ちなみに自分は以下の様なエラーから無限に抜け出せなかった。
```
$ mvn jacoco:report
[ERROR] No plugin found for prefix 'jacoco' in the current project and in the plugin groups
```


## ちょくせつmvnのコマンドライン引数でゴールを指定する
最終的に[githubでコード検索した](https://github.com/search?q=jacoco-maven-plugin&ref=searchresults&type=Code&utf8=%E2%9C%93)ところ。かなりのリポジトリで**pom.xmlに書いてない**ということがわかった。

何の事はないしかるべきタイミングで`org.jacoco:jacoco-maven-plugin`というprefixをつかって指定すればいいのだ。
つまりこんな感じ

```
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent test
mvn org.jacoco:jacoco-maven-plugin:report
```



## まとめ
素直にやってダメなら、`org.jacoco:jacoco-maven-plugin`をコマンドライン引数で指定する。
RealsenseSDKとWEBカメラでキャラクターになりきる(Live2D編)

[RealsenseSDKとWEBカメラでキャラクターになりきる](http://qiita.com/akihiro01051/items/ace3a2bfd655c764caf3)方法をLive2Dのモデルにも適応してみました．

# Live2DをUnityで利用する
Live2DのSDKをダウンロードしてUnityでLive2Dモデルを利用できるようにします．
http://www.live2d.com/
からCubism SDKをダウンロードします．

今回は顔の動きと表情をLive2Dモデルに反映させるだけなので，sampleのDemoをUnityで開きます．
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/86283/08353608-a7b3-1681-950b-8fae4be33887.png)


# 下準備

1. Realsen SDKとWEBカメラを使うためのunitypackageをインポートする

ここに置いておきます．[Downloads](https://www.dropbox.com/s/7tt35lnk26ufm2x/RealsenseSDK_FaceTracking.unitypackage?dl=1)
注. sampleが動作するか確認してください．
2. Live2Dモデルを動かすためのスクリプトをインポートします．[FaceLive2D.cs](https://www.dropbox.com/s/fn0j6ipqt9s6d4v/FaceLive2D.cs?dl=1)
3. インポートしたFaceLive2D.csをLive2DModelに適応します．

Webカメラが利用できるようにSelectDeviceNumberも設定しておきます．
![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/86283/43857598-ad26-235c-981b-82e2f0bbb77e.png)

# Live2Dスクリプトの変更
FaceLive2D.csからの顔認識情報をLive2Dモデルに反映させるためにSimpleModel.csに処理を追加します．

```csharp:SampleModel.cs

    private FaceLive2D face;//追加

    void Start()
    {
        face = GetComponent<FaceLive2D>();//追加
    }

    void Update()
    {
        /*(...省略...)*/
        eyeBlink.setParam(live2DModel);
    
        //ここから追加
        live2DModel.setParamFloat("PARAM_ANGLE_X", face.GetRot(0) * 20);
        live2DModel.setParamFloat("PARAM_ANGLE_Y", face.GetRot(1) * 30);

        live2DModel.setParamFloat("PARAM_BODY_ANGLE_X", face.GetRot(0) * 10);

        live2DModel.setParamFloat("PARAM_EYE_BALL_X", -face.GetRot(0));
        live2DModel.setParamFloat("PARAM_EYE_BALL_Y", -face.GetRot(1));

        live2DModel.setParamFloat("PARAM_ANGLE_Z", face.GetRot(2) * 3000);

        live2DModel.setParamFloat("PARAM_EYE_L_OPEN", 1.0f - face.GetMorph(0));
        live2DModel.setParamFloat("PARAM_EYE_R_OPEN", 1.0f - face.GetMorph(1));

        live2DModel.setParamFloat("PARAM_MOUTH_OPEN_Y", face.GetMorph(2) * 5);
        //ここまで

        if (physics != null) physics.updateParam(live2DModel);

        live2DModel.update();
    }

```

FaceLive2DをGetComponentで取得した後，setParamFloatに適当な値を入れていきます．
設定出来たら顔認識の結果がLive2Dに反映されているか確認して，細かなパラメータの調整をしてください．
![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/86283/e99608c5-3ccc-e511-8014-46671015fa0a.png)

なりきってください．
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Live2Dのモデルになれた <a href="https://t.co/URFIr1JX9a">pic.twitter.com/URFIr1JX9a</a></p>&mdash; アキヒロ (@akihiro01051) <a href="https://twitter.com/akihiro01051/status/707849113283403776">2016, 3月 10</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
AngularJSで書いたコードをuglifyするとはまった

localで動かしていたときは普通に動いていたのに、いざ本番用にuglifyでコードを圧縮したら動かなかったのでメモ

```js
var myApp = angular.module('myApp',[]);
myApp.controller('GreetingController', function($scope, $http) {
  $scope.greeting = 'Hola!';
});
```

uglify後のコードを見てみると、
`function($scope, $http){...}` の部分が `function(a, b){...}` というように変数が１文字になっていた。
よくよく考えると当然そうなるし動くわけがない:(


正しくは

```js
var myApp = angular.module('myApp',[]);
myApp.controller('GreetingController', ['$scope', "$http", function($scope, $http) {
  $scope.greeting = 'Hola!';
}]);
```

controllerの第２引数を配列にして、中に使用する順番に依存サービスを列挙するのが正しいかった。
PHP7でメソッド(関数)を戻り値指定にしてみる

PHP7になって型宣言(タイプヒンティング)が変更になり戻り値（返し値）の型を指定できるようになりました。
PHP5.6以前は引数のみしか指定できず、型はarray、クラス型のみのでした。
こんな感じで書けます。

```php
<?php
function sum($a, $b): float {
    return $a + $b;
}

// 戻り値が float
var_dump(sum(1, 2));
?>
```
出力結果
float(3)

こんな感じでも使えますし、
PHP的な戻り値の型がまぜこぜになってるやつでも、

```php
<?php
function kansu($hoge):int {
    if ($hoge == 1) {
        return 9243;
    }
    return "あああ";
}
var_dump(kansu(1));//成功出力int(9243)

var_dump(kansu(2));//エラー
?>
```

ぜひ使ってみましょう。
Docker + KVM 上で Windows7 を動かす

# 動機
[前回](http://qiita.com/flny/items/ba1ac612d6bea11387ad)の成功を受け、調子に乗ってWindows7環境も作ってみることにしました。

# 仮想デバイスを準備する
前回と同様に、仮想ディスク100GBと Windows7のインストールイメージ(ISO)を準備します。

```shell-session
$ dd if=/dev/zero of=/mnt/vm/windows7/primary.raw bs=10M count=10k
$ ll -h /mnt/vm/windows7/
(略)
-rwxrw-r-- 1 foo bar 2.4G Feb 24 00:32 GSP1RMCHPFREO_JA_DVD.ISO*
-rw-rw-r-- 1 foo bar 100G Feb 24 22:39 primary.raw
```

# docker-compose.yml を記述する

xubuntuとの違いは 下記の通りです。大して変わってません。

- コンテナと仮想マシンに割り当てるメモリを増やした
- CPUタイプを明示的に指定した
- ポート5900はxubuntuで使っているので、5901をマッピングした
- ```-device AC97``` を追記し仮想サウンドカードを仮想マシンに加えた
- 最初から VNCでなくSPICE


```yaml:docker-compose.yml
windows7:
  image: ianblenke/kvm
  container_name: windows7
  tty: true
  privileged: true
  mem_limit: 2400000000
  ports:
    - "5901:5900"
  volumes:
    - /mnt/vm/windows7:/mnt/vm/windows7
  command: "/run.sh  \
    -name windows7 -cpu core2duo -smp 2 -m 2048  \
    -spice port=5900,disable-ticketing,agent-mouse=off \
    -vga qxl \
    -device AC97 \
    -k ja \
    -cdrom /mnt/vm/windows7/GSP1RMCHPFREO_JA_DVD.ISO \
    /mnt/vm/windows7/primary.raw"
```

# コンテナを作成し、仮想マシンにWindows7をインストールする

docker-composeでコンテナを作成し、結果を確認します

```
$ docker-compose up -d windows7
Creating windows7
$ docker-compose ps windows7
      Name             Command             State              Ports
-------------------------------------------------------------------------
windows7           /run.sh -name      Up                 3389/tcp, 0.0.0.
                   windows7 -sm ...                      0:5901->5900/tcp
```

作成できました。SPICEクライアントで <ホストのIPアドレス>:5901番ポート に接続します。
![boot.png](https://qiita-image-store.s3.amazonaws.com/0/87156/09e8a3a1-10a5-81ea-f61a-8a1a0c16ba08.png)

Windows7のインストールイメージで仮想マシンが起動しました。このまま仮想ディスクにインストールします。
(インストール作業は 他の環境と同じなので割愛)

![win7.png](https://qiita-image-store.s3.amazonaws.com/0/87156/a3b8c784-94f8-1dce-45b6-0bf6bb6b5b91.png)
特に変わったところはなく インストールが完了しました。インストールの進行は早かったのですが、動作は若干モッサリで 定常的に使うには辛いかもしれません。チューニング方法はこれから探っていきます。

以上