OmniAICreator/Qiita-1.07M huggingface dataset:
this()の引数内でthisキーワードを使用することができない

Java SE8 Silverの範囲

----

例えば以下のようなソースはコンパイルエラーとなる。

```java
class Sample{
  int num;

  Sample(){
    this(this.num);
    this.num = 10;
  }
  Sample(int num){
    this.num = num;
  }
}
```
白本ではしれっとthis()の引数中ではthisは使えないとか書いてあって解説もなく、不親切だった。
理由は単純で以下のとおりだろう。

#実行順序の問題
`this.num`を呼び出すためには、クラスが初期化されている必要がある。しかしながら初期化を使用とすると`this(this.num)`の呼び出しがある。`this()`を呼び出すためには`this.num`が初期化されている必要があり（正確にはthisがメモリ上に展開されている必要があり）、コンストラクタを呼び出す事もできず、`this.num`を特定することもできず、コンパイルエラーになってしまう。というところだろう。

これらについて記載された情報があれば教えて頂きたい。


#追記
コメントにて公式docから該当箇所を頂いた。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8.7.1
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3

>An explicit constructor invocation statement in a constructor body may not refer to any instance variables or instance methods or inner classes declared in this class or any superclass, or use this or super in any expression; otherwise, a compile-time error occurs.

このクラスまたはスーパークラスで宣言されたインスタンスメソッドやインスタンス変数にはアクセスできない。また、thisやsuperを使うこともできない。
という感じだろうか…。英語力の無さを恨む
お釣りの枚数を計算する

# <i class='fa fa-pencil-square-o' /> 何をしたいのか
**書籍の展示即売会**を予定しています。書籍の価格は3000円です。
購入者は、多くても50人とします。**お釣りが不足しない**ようにするには、1000円札と5000円札を何枚用意すればいいでしょうか？

# <i class='fa fa-pencil-square-o' /> 絶対に不足させない場合
可能性としては、以下の3パターンを考えます。

|支払い方法|お釣り|
|:--|:--|
|1000円札3枚|なし|
|5000円1枚|1000円2枚|
|10000円1枚|5000円1枚と1000円2枚|

1万円のパターンがすべてのパターンの枚数を包含しているので、最悪ケースは、50人とも1万円で払うときになり、1000円が100枚、5000円が50枚の合計35万円分のお釣りを用意することになります。

# <i class='fa fa-pencil-square-o' /> なるべく不足させない場合
50人ともが1万円という確率は、限りなく小さいでしょう。
[財布の中身のシミュレーション](http://qiita.com/Tsutomu-KKE@github/items/f6f34df95c9a9e98c85b)より、財布の中身を以下の確率とし、それぞれの財布の中身は独立と仮定します。

|お札の枚数|確率|
|:--|:--|
|1000円札0枚|20%|
|1000円札1枚|20%|
|1000円札2枚|20%|
|1000円札3枚|20%|
|1000円札4枚|20%|
|5000円0枚|50%|
|5000円1枚|50%|

このことから、支払いパターンの確率は次のようになります。(お札があれば使うものとします)

|支払い方法|お釣り|確率|
|:--|:--|:--|
|1000円札3枚|なし|40%|
|5000円1枚|1000円2枚|30%|
|10000円1枚|5000円1枚と1000円2枚|30%|

(1万円の確率 = 5000円0枚 × 1000円(0～2枚) = 0.5 × (0.2 + 0.2 + 0.2) = 0.3)

それぞれの支払いが独立と仮定したので、数人以上の合計は正規分布とみなせます。
シミュレーションして確かめてみます。

```py3:python
r = []
for i in range(100000):
    n = 100
    p = np.random.rand(50)
    for x in p:
        if x < 0.3:
            n += 1
        elif x < 0.6:
            n -= 1
    r.append(n)
r = np.array(r)
plt.hist(r, bins=20, range=(50, 150))
print('%.3f %.3f' % (r.std(), math.sqrt(50 * 0.6)))
>>>
5.472 5.477
```
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/593fcacb-98ce-9a17-8c0a-6a53bcaf9dcf.png)


1000円札の枚数と5000円札の枚数の分布は、以下のようになります。

1000円札の枚数分布 ~ $N(n \mu_{1000}, n \sigma^2_{1000})$
$\mu_{1000} = 0.4 ~ ~ 3 + 0.3 ~ (-2) + 0.3 ~ (-2) = 0$
$\sigma^2_{1000} = 0.4 (3-0)^2 + 0.3 (-2-0)^2 + 0.3 (-2-0)^2 = 6$

5000円札の枚数分布 ~ $N(n \mu_{5000}, n \sigma^2_{5000})$
$\mu_{5000} = 0.4 ~ ~ 0 + 0.3 ~ 1 + 0.3 ~ (-1) = 0$
$\sigma^2_{5000} = 0.4 (0-0)^2 + 0.3 (1-0)^2 + 0.3 (-1-0)^2 = 0.6$




お釣りが足りなくてもよい確率を5%とすると、両側 t分布表の(0.1, 50)のところの1.67591を使って計算できます。

```py3:python
tv = 1.67591 
print('1000円 %.3f' % (math.sqrt(50 * 6) * tv))
print('5000円 %.3f' % (math.sqrt(50 * 0.6) * tv))
>>>
1000円 29.028
5000円 9.179
```

結局、1000円が30枚、5000円が10枚の合計8万円分のお釣りを用意することになります。(途中で不足するのではなく、最後に不足するかどうかで計算しています)
このとき、どちらかが不足する確率は、単純に計算すると 約10%($=1-(1-0.05)^2$)ですが、実際には、下記のように考えられるので、5%と言えます。

|ケース|確率|意味|
|:--|--:|:--|
|1000円が余る 5000円が余る|0.9025|OK
|1000円が余る 5000円が不足|0.0475|余った1000円でも返せるのOK
|1000円が不足 5000円が余る|0.0475|NG 
|1000円が不足 5000円が不足|0.0025|NG

以上
GCP ja Night #31 いった


## Kubernetes/GKE Overview

https://speakerdeck.com/ianlewis/gke-introduction-at-gcp-ja-night-number-31

300億円の投資してKDDIと協力しながらアメリカの西海岸から日本への海底ケーブル布設したりしてる

エンドポイント・エッジロケーションはたくさんある
できるだけユーザーに近いところからGoogleのネットワークに入るようにして通信が早くなるようにしている。
ネットワークインフラはそんな感じでめっちゃ整備してる。

### Borg

Googleだけが使うのはもったいないからGCP提供してる

DockerはLinuxカーネルの機能使ってるけど、それを作ったのはGoogle

Why コンテナ？

- 軽い、早い
	- VMはOSを立ち上げるのがあるのでその分時間かかる
	- コンテナはプログラム起動する時間だけ
- ポータビリティ
- 効率性
	- 他のコンテナと影響しないようになってるので、他のプログラムの影響で動かないとかがおきにくい

Borgのホワイトペーパー出てます

Borg=データセンター全体を一つのコンピュータとして扱うためにCPUとかメモリを割り当てて実行するためのもの

### Docker

コンテナ間のネットワークをどうするか
Dockerはそこはやってくれない

それをやるためにKubernetes。
Borgみたいなもん

Borgの開発者がKubernetes作ってる

Cloud Native Computing Foundation発足

Googleだけでやってると寂しいので、Foundation作ってそこにKubernetes寄付した

GCPで提供してるHosted KubernetesがGKE

ノード上でKubeletが動いてる
Borgだったらborglet

#### レプリケーションコントローラ
#### サービス

エンドポイントの抽象化

フロントエンドとバックエンドをどうつなげるか

サービスがいい感じにラウンドロビンでバランシングしてくれる。

レプリカをスケールダウンする際、TERMシグナル送るからその間少し時間がかかる

## GKEで半年運用していた話

takusutaというサービスをGKEで運用して

http://www.slideshare.net/katsutoshinagaoka/gke-57322091

### takusuta紹介

スマホ使って簡単にライブ配信するサービス
Web版をGKEで動かしてる

最初はAWSだった

GKE採用に至るまでの流れ
S3による静的ページだったりした
NodejsでWebアプリにした
そんでGKEの上で動かした

### GKEとは

Kubernetesのフルマネージドサービス

用語の説明

- Pod
	- Dockerfileのグルーピング
	- 一つ以上のコンテナ
- Replication Controller
	- Podのレプリカを増やしたり減らしたりするやつ
- Service
	- L4のLBみたいなもん

GKEにおける構成

ServiceはL4だからSSL証明書は置けない
各Podに証明書を置く → 効率が悪い

Serviceの上にGCEのHTTP LBを置いている

GCEのLBを使うならクロスリージョンに仕様って事でクロスリージョンにした

リージョン・ゾーン選択時の注意
性能が異なるから気をつけよう（スペック違っても料金は同じ）

### GKEの構成

gcloudでクラスタ作る
kubectlでPodやら操作する

作成時にしか設定できない項目とかあるから注意
BigQueryスコープがデフォルトでOFFなので注意

### どう使ってるか

用途によってClusterを分けてる

同じポッドでまとめた方がキャパシティコントロールしやすい
高頻度でクラスタを作り直したりしてる

### GCR

GCRへのアップロードはGCEで立てたJenkinsでアップロードしてる

### Replication Controller

ローリングアップデートで無停止アップデート
RCのオートスケールは今んとこ使ってない

### Cloud Loggin によるログ管理

Cloud Logging APIを直接叩いて流してる

### Kubernetes Dashboard

標準のダッシュボードは数値が微妙だから使ってない

kubedash使ってる

### まとめ

- 簡単、安い
- ロギングもいい感じになってきた
- ドキュメント少なめ
- 使い捨てできるインフラはやっぱ便利
- シンプルに使って複雑にしないように心がけてる

## GCPで新規サービスを開発した話

### どんなプロジェクトだったか

現実世界の検知を行ういわゆるIoT的なプロジェクト

20億レコード/月

スムーズに解析できないとアカン

リソースの無駄が多かった

### GKEよかったところ

リリースしたいモジュールのバージョン管理ができているので、ローリングアップデートで前のバージョン指定すれば問題ない

最後の方はちょっと個人的にトラブってて話がほぼ聞けてない
Play In Editor 停止時に「エディタで再生中にエラー/警告が報告されました」ダイアログを出す

Play In Editor(PIE) を停止した際に以下の様なダイアログが表示されることがあります。

![image](https://qiita-image-store.s3.amazonaws.com/0/43814/86fdf9c3-c695-552c-d16d-8a9ab8274ed1.png)

これは、PIE 中に何かしらのエラーや警告が発生したことを意味します。

これはメッセージログにエラーや警告が出力されると PIE 終了時に必ず表示されるので、実行時エラーや警告の見落としを防ぐ手段として使えます。

では、どうやればここにエラーや警告を表示できるのか？
以下は、ELogVerbosity::Type の種類に応じてエラーや警告を出すためのコードです。

```cpp:
#include "Logging/MessageLog.h"

// PIE 専用コードなので、括っておく
#if WITH_EDITOR
	// 表示するメッセージ
	FString MessageString;

	// PIE はメッセージログの「Play In Editor」に出力するためのカテゴリ。
	// このカテゴリで出力しないとダイアログが表示されない。
	FMessageLog MessageLog("PIE");
	switch (VerbosityType)
	{
	case ELogVerbosity::Warning:
		// 警告として表示
		MessageLog.Warning(FText::FromString(MessageString));
		break;

	case ELogVerbosity::Error:
		// エラーとして表示
		MessageLog.Error(FText::FromString(MessageString));
		break;
	}
#endif
```

これでメッセージログにメッセージを登録すれば、先ほどのダイアログが表示されます。
expectやsshpassを使わずにシェルでSSHパスワード認証を自動化する

# はじめに
* **接続先サーバ側を変更できるのであれば公開鍵認証方式をおとなしく使いましょう。**
* どうしてもパスワード認証方式を使わないといけない場合は、接続クライアント側にソフトウェアをインストール可能なら[SSHPass](http://linux.die.net/man/1/sshpass)を使いましょう。巷には[expectコマンド](http://linux.die.net/man/1/expect)を使った方法があふれていますが、インストール可能な環境なら[SSHPass](http://linux.die.net/man/1/sshpass)のほうが良い (参考: [sshにパスワードで自動ログインするならexpectよりもsshpassを使おう]([SSHPass](http://linux.die.net/man/1/sshpass))
* サーバ側もクライアント側も変更がどうしてもできない…残念ながら大人な事情でそういうこともあります。そんな時は本記事が参考になるかと思います。

# 実現方式
sshには[SSH_ASKPASS](http://euske.github.io/openssh-jman/ssh.html#環境変数)という仕組みがあります。以下、引用。

>SSH_ASKPASS
パスフレーズを入力する際、ssh が端末から起動されているとssh はパスフレーズをその端末から要求します。ssh が制御できる端末を持っておらず、環境変数DISPLAY およびSSH_ASKPASS が設定されている場合、ssh はSSH_ASKPASS によって指定されるプログラムを起動し、X11 ウインドウを使ってパスフレーズを要求します。これはssh を.xsessionやそれに類するスクリプトから呼び出す際にとくに役に立ちます。(マシンによっては、これがうまく動くためには標準入力を/dev/nullにリダイレクトする必要があるかもしれません)

これはGUIからSSH接続のパスワードを入力させてそれを受け取ることを想定した仕組みですが、これを利用してパスワードをシェルから渡すこともできるわけです。
具体的には環境変数 SSH_ASKPASSに、パスワードを返すプログラム(シェルスクリプト)を設定すればOK。また、環境変数 DISPLAYにはダミーの値を設定しておけばOKです。

# 具体的な実装例
SSHで接続して`ls -al`を実行するだけの例です。

```bash:sshauto.sh
#!/bin/bash

# 接続先情報
SSH_USER=test
SSH_PASS=mypass
SSH_HOST=your_ssh_server
REMOTE_CMD="ls -al"


# 後述のSSH_ASKPASSで設定したプログラム(本ファイル自身)が返す内容
if [ -n "$PASSWORD" ]; then
  cat <<< "$PASSWORD"
  exit 0
fi

# SSH_ASKPASSで呼ばれるシェルにパスワードを渡すために変数を設定
export PASSWORD=$SSH_PASS

# SSH_ASKPASSに本ファイルを設定
export SSH_ASKPASS=$0
# ダミーを設定
export DISPLAY=dummy:0

# SSH接続 & リモートコマンド実行
exec setsid ssh $SSH_USER@$SSH_HOST $REMOTE_CMD
```

```bash:実行結果
[root@6a6d8eb6ad44 ~]# ./sshauto.sh
[root@6a6d8eb6ad44 ~]# total 12
drwxr-sr-x    2 test     test          4096 Jan 23 16:51 .
drwxr-xr-x    3 root     root          4096 Jan 23 16:51 ..
-rw-------    1 test     test            24 Jan 23 16:51 .ash_history
```

上記の実装例では、SSH_ASKPASS に設定するプログラムを`$0`で自分自身を設定することで1ファイルで完結していますが、別のファイルでももちろん構わないです。

最後にもう一度書きますが、**できるなら公開鍵認証方式をおとなしく使いましょう！！**。


# 参考サイト
* http://andre.frimberger.de/index.php/linux/reading-ssh-password-from-stdin-the-openssh-5-6p1-compatible-way/
* http://yyatsuo.com/?p=959
Browserify の読み方

Browserify を使うことになりそうですが、読み方がわからない。

いろいろ相談した結果、以下のコメントを頂きました。

「ネイティブさんは「Browser+rify」なので、日本語で書くと "ブラウザリファイ" が正しいのでは、と言っております。ただし、ネイティブさんに発音させると "ブラウゼリファイ" と聞こえますが・・・」

とのこと。

結論としては「ブラなんとか」でも通じるのではないかとなりました。

どうしても日本で読み方を用意つさせたい方は、以下で投票してみては。

http://yomikata.org/word/browserify
Redshiftのディスクがスペースが予想外に増えたのでVacuumした話


# 背景

最近分析で使えそうだと思って、個人アカウントでRedshiftを使ってみていろいろ検証してます。

そうすると、運営上、Diskのスペースがどのくらいなのか気になります。

これはWebコンソール上で、Clustersからたどっていきパフォーマンスのタブから確認できます。

![Redshift_·_AWS_Console.png](https://qiita-image-store.s3.amazonaws.com/0/30079/ccb96eac-1704-a029-a6ec-5a34ed68d497.png)

上記は１週間のグラフですがどんどんおおきくなってます。合計50GBくらいになってました。

RedshiftにはMySQLのデータベース内のテーブルをsyncしていれてありますが、MySQLのテーブルの合計は1GBもありません。何が起こったのでしょうか。

# 問題点

MySQL => Redshiftへのテーブルのsyncをするときに、tmpテーブルを作って、データをいれて、元のテーブルのデータをDELETEで消して、tmpテーブルからインサートしています。syncは1時間ごとです。

SELECT COUNT(*) FROM TABLEとかでみると行数はインサートされた行と同じなのに、以下のコマンドで実行すると何百倍も行数が大きくなってました。

    select
      trim(pgdb.datname) as Database,
      trim(pgn.nspname) as Schema,
      trim(a.name) as Table,
      b.mbytes,
      (CAST(b.mbytes as double precision) / 1024) as gbytes,
      (CAST(b.mbytes as double precision) / 1048576) as tbytes,
      a.rows,
      to_char(a.rows, '999,999,999,999,999') as rows_ww,
      to_char(a.rows, '9999,9999,9999,9999') as rows_jp
    from (
           select db_id, id, name, sum(rows) as rows
           from stv_tbl_perm a
           group by db_id, id, name
         ) as a
      join pg_class as pgc on pgc.oid = a.id
      join pg_namespace as pgn on pgn.oid = pgc.relnamespace
      join pg_database as pgdb on pgdb.oid = a.db_id
      join (
             select tbl, count(*) as mbytes
             from stv_blocklist
             group by tbl
           ) b on a.id = b.tbl
    order by mbytes desc, a.db_id, a.name;
http://dev.classmethod.jp/cloud/aws/amazon-redshift-convenient-sqls/#analyze_table_design_1 から引用


調べてみるとVACUUMの項目に以下の記述が。

    行の削除や更新で解放された領域を、Amazon Redshift が自動的に再利用することはありません。更新を実行するために、Amazon Redshift は元の行を削除し、更新された行を追加します。そのため、すべての更新では実質的に削除の後で挿入が行われることになります。削除を実行する場合、行には削除のマークが付けられますが、削除されません。クエリプロセッサは、削除された行と削除されていない行をスキャンする必要があるため、削除された行の数が多すぎると不必要な処理が発生します。大規模な削除や更新の後でバキューム処理を実行することで、領域を再利用してクエリのパフォーマンスを向上させる必要があります。

http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/t_Reclaiming_storage_space202.html から引用

VACUUMが必要でした。以下のように実行してみると、50GBくらいあったものが4GBくらいまで小さくなりました。実行時間は5分ほどだったので、cronで定期的にまわせばいいかなと思ってます。

# まとめ

* 大量のDELETEするときはVACUUMを使ってDiskスペースを確保しよう

ちなみに複数のデータベースを使っている場合は、データベースごとにVACUUMする必要がある。

# 参考
* http://dev.classmethod.jp/cloud/aws/amazon-redshift-useful-sql-require-tables-to-vacuum/
* http://dev.classmethod.jp/cloud/aws/amazon-redshift-convenient-sqls/#analyze_table_design_1
Pythonで地理情報をプロットする

位置情報データの解析をPythonで完結させるために下記のブログを参考に緯度経度をもとにPython内で日本地図にプロットしてみた。GDALのインストールでつまったのでメモ。

Python geopandas + Bokeh で地理情報をプロットしたい
http://sinhrks.hatenablog.com/entry/2015/07/18/215951

# GDALのインストール
位置情報データを扱う一般的（？）なライブラリのGDALをインストールする。
Macではこのサイトのパッケージを使うと簡単
http://www.kyngchaos.com/software/frameworks

このサイトからGDAL CompleteダウンロードしてインストールすればOK。
geosだけとかをbrewでインストールしたりできるが最後にgeopandasをインストールするときにgdal.hが見つからないと言われるのでパッケージで入れたほうが簡単だった。
インストールしたらPATHを設定
`export PATH=/Library/Frameworks/GDAL.framework/Programs:$PATH`
`source ~/.bash_profile`

# geopandasのインストール
geopandasはpythonのデータ解析でよく使われるpandasで位置情報を扱いやすくしたもの。pipでインストールする。
`pip install geopandas geopy`

geopyは依存ライブラリで自分で入れないとダメらしい。

# ipython (jupyter)でプロット
あとは上に書いた参考にしたブログの通りやればプロットできる。
円山公園を含むジオタグ付きツイートをプロットした結果がこんな感じ。
![plot.png](https://qiita-image-store.s3.amazonaws.com/0/37387/82ab5527-41c3-6236-90e9-85c6edb3c9aa.png)
debootstrapでubuntu最小インストール

## 参考

* [サーバ屋日記: debian jessieをdebootstrapでインストールした時のメモ](http://ktaka.blog.ccmp.jp/2015/10/debian-jessiedebootstrap.html)

## インストール

* [64-bit PC (AMD64) desktop image](cdimage.ubuntu.com/lubuntu/releases/16.04/alpha-1/)をダウンロードし、VirtualBoxで起動
* DISKイメージは750MB以上

```bash:ssh接続準備
sudo -s

apt-get update
apt-get install debootstrap ssh
passwd lubuntu
ip a s
```

```bash:パーティショニング
fdisk /dev/sda
mkfs.ext4 /dev/sda1
mount /dev/sda1 /mnt/
mkdir -p /mnt/var/cache/apt/archives/
mount --bind /var/cache/apt/archives/ /mnt/var/cache/apt/archives/
```

```bash:インストール
debootstrap --include=linux-image-generic,grub xenial /mnt http://ubuntutym.u-toyama.ac.jp/ubuntu
```

```bash:chroot準備
mount -t proc none /mnt/proc/
mount -t devtmpfs none /mnt/dev/
mount -t sysfs none /mnt/sys/
echo "/dev/sda1 / ext4 defaults 0 1" > /mnt/etc/fstab
chroot /mnt/
```

```bash:ログインユーザ作成
adduser ubuntu
visudo
```

```bash:環境設定
echo "Asia/Tokyo" > /etc/timezone
cp /usr/share/zoneinfo/Japan /etc/localtime
locale-gen ja_JP.UTF-8
```

## ブートローダー

```bash:ブートローダー
grub-install /dev/sda
yes | update-grub
exit
```

```bash:
grub-install --root-directory=/mnt/ --recheck /dev/sda
```
AWS Certificate Managerで無料SSL

Amazonが、Certificate Managerを発表しました。
[公式 AWS Certificate Manager](https://aws.amazon.com/certificate-manager/)

# 何ができるの？
AWSで使用するための**ドメイン認証(DV)**するSSL証明書を**無料**で作成できます。
ワイルドカードも、複数ホスト指定もいけます。さらに、自動で更新されます！！

メインサーバはEV証明書とか欲しいですが、ただ暗号化するだけならこれで十分そうですね。
テストサーバや、デモ用サーバも無料で暗号化できるので、SSLにしないのはエンジニアの怠慢になりますね。

# 既存の証明書をインポート
すでに証明書を取得している場合には、インポートすることも可能です。
http://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html

# 現状対応しているもの
* CloudFront
    * S3でStatic Web、CloudfrontでSSL対応という構成が簡単にできます。
* ELB
    * 2016/5/16から、東京を含む下記リージョンで使用できるようになりました。リージョンごとに証明書を生成する必要があります。
        * US West (N. California)
        * US West (Oregon)
        * EU (Ireland)
        * EU (Frankfurt)
        * Asia Pacific (Tokyo)
        * Asia Pacific (Seoul)
        * Asia Pacific (Singapore)
        * Asia Pacific (Sydney)
        * South America (Sao Paulo)
* Elastic Beanstalk
    * ELBが対応した時点で使用できたのですが、5/23から公式にサポートされました。

# 何ができないの？
証明書をダウンロードして、他のサーバで使うことはできません。
EV,OV証明書は生成できません。
http://docs.aws.amazon.com/acm/latest/userguide/acm-certificate.html


# 使い方
AWS Consoleから、Certificate Managerを開いて、ドメインを登録します。あとは、管理者に届いたメールを処理するだけです。

ちなみに、こんなメールが届きます。
管理者っぽいアドレスに勝手に送られるので、複数届く場合があります。

>Subject : Certificate approval for appbatake.com
>
>Greetings from Amazon Web Services,
>
>We received a request to issue an SSL/TLS certificate for appbatake.com.
>
>Verify that the domain, AWS account ID, and certificate identifier below correspond to a request from you or someone in your organization.
>
>Domain: appbatake.com
>AWS account number: 0000-0000-0000
>Certificate identifier: 00000000-0000-0000-0000-000000000000
>
>To approve this request, go to Amazon Certificate Approvals(https://certificates.amazon.com/approvals?code=00000000-0000-0000-0000-000000000000&context=00000000-0000-0000-0000-000000000000-000000000000000000) and follow the instructions on the page.
>
>If you choose not to approve this request, you do not need to do anything.
>
>This email is intended solely for authorized individuals for appbatake.com. To express any concerns about this email or if this email has reached you in error, forward it along with a brief explanation of your concern to validation-questions@amazon.com.
>
>Sincerely,
>Amazon Web Services

# SESを使ったドメイン検証
ドメインにメールサーバがない場合は、Amazon SESを受信用にセットアップすることで簡単にドメイン検証できました。
証明書発行後にはSESのドメインを削除しても問題ないようですが、１年後の更新時に再度設定が必要です。

# サンプル
S3 + Cloudfrontで構築してみました。
*.appbatake.com + appbatake.comで生成した証明書です。
https://temp.appbatake.com


# 更新
ACMから証明書更新の通知が来ました。初回同様メールを受信してapprove処理が必要となります。2/23日失効予定の証明書について2/9に通知が来たので、2週間前通知のようです。

管理しているAWSアカウントに「Action Required - Your certificate renewal」という再設定を求める通知が届くのですが、それよりも前にドメイン管理者に確認メールが飛びます。自分で管理していないドメインの場合には要注意ですね。
vimセッティング(自分用メモ編集中)

.vimrcの設定
#vi非互換モードに設定
if &compatible
  set nocompatible
endif

#文字エンコーディング=UTF8
if has("multi_byte_encoding")
    set encoding=utf-8
endif

#構文ハイライト機能を有効にする
syntax enable
このコマンドにより実際には次のコマンドが実行される.
source $VIMRUNTIME/syntax/syntax.vim
環境変数VIMが設定されていない場合は、Vimは別の方法(|$VIMRUNTIME|参照)でパスの
検索を試みる。通常はこれでうまくいく。うまく動作しない場合は、環境変数VIMにVim
の構成ファイルが置いてあるディレクトリの設定を試みる。例えば、構文ファイルがディ
レクトリ "/usr/vim/vim50/syntax" にあるならば、$VIMRUNTIMEに "/usr/vim/vim50"
を設定する。これはVimを起動する前に、シェルで設定しておかなければならない。

#表示色の設定（２５６色）。参照：vim doc terminal-options
set t_Co=256

#改行 (EOL) の種類を指定する。
set fileformats=unix,dos

#行頭の余白内でTabを打ったとき'shiftwidth'の値だけ空白を挿入する。
行頭以外では 'tabstop' の数だけ白が挿入される。
set smarttab

#挿入モードでTabを挿入するとき、代わりに適切な数の空白を使う。
set expandtab
また、コマンド '>' や '<' によるインデントや、オプション 'autoindent' がオンのときのインデントでも空白を使う。'expandtab' がオンのときに本当のタブを挿入するには、CTRL-V<Tab> を使うこと。

#矩形ビジュアルモードで仮想編集を有効にする。
set virtualedit=block
仮想編集とは、実際に文字がないところにもカーソルを置けるようにする。つまりタブ文字の内部や行末より後ろにカーソルを移動できる。ビジュアルモードで長方形を選択するときや、表を編集するときに便利である。

#検索パターンにおいて大文字と小文字を区別しない。タグファイル内の検索にも適用
set ignorecase

#検索パターンが大文字を含んでいたらオプション 'ignorecase' を上書きする。
set smartcase
検索パターンがキーボードから打ち込まれたときに 'ignorecase' がオンの場合にのみ使われる。適用されるコマンドは "/", "?", "n", "N", ":g", ":s"である。"*", "#", "gd" やタグ検索などには適用されない。

#検索コマンドを打ち込んでいる間にも、打ち込んだところまでのパターンがマッチするテキストを、すぐに表示する。
set incsearch

#検索がバッファの端に到達した時に、もう一方の端に移動して検索が継続されます。
set wrapscan

#タブ、改行、スペースなどの表示をカスタマイズできる。
set list
set listchars=tab:>-,trail:~

#行番号を表示する。
set number

#最下ウィンドウにいつステータス行が表示されるかを設定する。2=常に表示
set laststatus=2

#タブページのラベルを常に表示する
set showtabline=2


#クリップボードを使えるようにする
set clipboard=unnamed

#挿入モードでの BS,Del,CTRL-W,CTRL-Uの動作を設定する。
set backspace=eol,indent,start

#コマンドライン補完を拡張モードで使用する。
set wildmenu
set wildmode=list:full
set wildignore=*.o,*.obj,*.pyc,*.so,*.dll



#タグファイル関連
if has('path_extra')
    set tags& tags +=.tags,tags
endif


#Neobundleのインストール
mkdir -p ~.vim/bundle
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

.vimrcに以下

set runtimepath+=~/.vim/bundle/neobundle.vim/
call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'Shougo/unite.vim'
call neobundle#end()
NeoBundleCheck

#taglist プラグインのインストール
$sudo apt-get install exuberant-ctags

.vimrcに
NeoBundle 'vim-scripts/taglist.vim'
NeoBundle 'szw/vim-tags'
 
" taglist
set tags = tags
let Tlist_Ctags_Cmd = "/usr/bin/ctags"
let Tlist_Show_One_File = 1
let Tlist_Use_Right_Window = 1
let Tlist_Exit_OnlyWindow = 1

#ファイル形式の検出＆ファイル形式別プラグインのロード、ファイル形式別インデント、の有効化（参照：vim documentation）
filetype plugin indent on
Powershell > Link > UDPでの文字列送受信 > 送信コードを試した

PowershellからESP8266へコマンドを送信するにはどういうコードが必要か。

以下のリンクを見つけた。
http://stackoverflow.com/questions/12148666/send-and-receive-data-via-udp-in-powershell

上記に書いているリンクが
http://pshscripts.blogspot.co.uk/2008/12/send-udpdatagramps1.html
こちらに送信に関する具体例が書かれている。



## 試した

### 動作環境

実際に試してみた

```txt:動作環境
- 送信側 > Windows 8.1 pro (64bit) : (192.168.10.11)
- 受信側 > CentOS 6.5 (192.168.10.10)
```

CentOS側で以下として準備

```
$ tcpdump -n udp portrange 7000
```


### code 

以下のコードで文字列`"From powershell<LF>"`10セットをまとめて送信。
動いた。

```udpSend.ps1
# Define port and target IP address   
# Random here!   
$Port = 7000
$IP = "192.168.10.10"   
$Address = [system.net.IPAddress]::Parse( $IP )  
  
# Create IP Endpoint   
$End = New-Object System.Net.IPEndPoint $address , $port   
  
# Create Socket   
$Saddrf    = [System.Net.Sockets.AddressFamily]::InterNetwork  
$Stype    = [System.Net.Sockets.SocketType]::Dgram  
$Ptype     = [System.Net.Sockets.ProtocolType]::UDP  
$Sock      = New-Object System.Net.Sockets.Socket $saddrf , $stype , $ptype   
$Sock.TTL = 26  
  
# Connect to socket   
$sock.Connect( $end )  
  
# Create encoded buffer   
$Enc      = [System.Text.Encoding]::ASCII  
$Message = "From powershell`n" *10  
$Buffer   = $Enc.GetBytes( $Message )  
  
# Send the buffer   
$Sent   = $Sock.Send( $Buffer )  
"{0} characters sent to: {1} " -f $Sent , $IP   
"Message is:"   
$Message   
# End of Script
```
技術英語 > That should do it.

@ Star Trek Voyager > NON SEQUITUR

色々な操作の手順を踏んで効果が出そうだとキムが

> That should do it.

<hr>
関連して思い出したのは

http://qiita.com/7of9/items/1c80254602134dd2e57a
> that probably alone could <font color=red>do the job / do the trick</font>
財布の中身のシミュレーション

# <i class='fa fa-money' /> お札と小銭の分布

もし、必ず財布の重量が最小になるように支払っていたら、財布の中身はどのような分布になるでしょうか？

# <i class='fa fa-money' /> シミュレーション

シミュレーションで確かめてみましょう。

- 1万円は無限にあるものとします。
- 1万回、商品を買って分布をみます。(最初の100回は無視します)
- 商品の金額は、100円～9999円とし、[ベンフォードの法則](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%B3%E3%83%95%E3%82%A9%E3%83%BC%E3%83%89%E3%81%AE%E6%B3%95%E5%89%87)に従う分布とします。
- 乱数の発生(rand_from_prob)は、[Walker's Alias Method](http://qiita.com/Tsutomu-KKE@github/items/99d6f65fe8aaab7984f3)を用います。
- 支払い後に重量を最小化するのは、[組合せ最適化](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)で計算します。

# <i class='fa fa-money' /> Pythonで計算

まずは、ベンフォードの法則で100円～9999円の重み(wgt)を作ってみましょう。

```py3:python
import numpy as np, matplotlib.pyplot as plt
from math import log
# ベンフォードの法則
wgt = np.array([log((i+1)/i, 10000) for i in range(100, 10000)])
wgt /= sum(wgt)
plt.plot(wgt)
plt.xlabel('Price')
```
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/511b3da4-0f62-ee29-21aa-503714054b0b.png)

重量を最小化した後の個数を返すchangeを定義します。

```py3:python
from pulp import *
money_val = (1, 5, 10, 50, 100, 500, 1000, 5000)
money_wgt = (1.0, 3.7, 4.5, 4.0, 4.8, 7.0, 1.0, 1.0)
def change(price):
    m = LpProblem() # 数理モデル
    x = [LpVariable('x%d'%i, lowBound=0, cat=LpInteger)
         for i in range(len(money_val))] # 支払い後の個数
    m += lpDot(money_wgt, x) #目的関数(支払い後の重量)
    m += lpDot(money_val, x) == price # 支払い後の金額
    m.solve()
    return [int(value(i)) for i in x]
```

シミュレーションしてみましょう。試しに1000円札の分布をみてみます。

```py3:python
price = 0 # 現在の所持金
warm, nrun = 100, 10000
res = []
for i, p in enumerate(rand_from_prob(wgt, warm+nrun)):
    price -= p
    if price < 0:
        price += 10000
    if price:
        res.append(change(price))
a = np.array(res[-nrun:])
plt.hist(a[:,6], bins=5, range=(0, 5)) # 1000円札の分布
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/8d8873b7-d4e6-e6b5-9816-b182c4798809.png)

等確率ですね。他の硬貨や5000円札も同様でした。

# 結論
等確率になるようです。総額の分布も0円から9999円の等確率になります。

```py3:python
import pandas as pd
from itertools import product
r2, r5 = range(2), range(5)
ptn = [np.dot(money_val, n) for nn in 
       product(r5, r2, r5, r2, r5, r2, r5, r2)]
plt.hist(ptn)
print(pd.DataFrame(ptn).describe())
>>>
                 0
count  10000.00000
mean    4999.50000
std     2886.89568
min        0.00000
25%     2499.75000
50%     4999.50000
75%     7499.25000
max     9999.00000
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/91713088-bcac-ade1-1b50-d2228084a002.png)

以上
gulp4使おうとした時にTypeError: Cannot read property 'apply' of undefined でエラーになっていた原因

エラーは以下

```
TypeError: Cannot read property 'apply' of undefined
```


gulpのバージョンを確認すると、ローカルとグローバル（CLI）のバージョンが違っていたのでこれが原因のよう。


```
$ gulp -v
[03:27:01] Requiring external module babel-core/register
[03:27:01] CLI version 3.9.0
[03:27:01] Local version 4.0.0-alpha.2
```

そういえばgulpはグローバルとローカル両方使われるんだった。
http://nakajmg.github.io/blog/2014-09-03/gulp-structure.html


(2016/01/24現在)
npmの最新が3.9.0なので、gulp4を使いたいときはオプションなしの npm install ではダメで、インストール元をgithubに向けなければならない。
以下のコマンドでgulpをアップデートする。（再インストール）

```
npm uninstall gulp -g
npm install gulpjs/gulp-cli#4.0 -g
```

バージョンがこうなっていればOK

```
$ gulp -v
[03:33:52] Requiring external module babel-core/register
[03:33:52] CLI version 0.4.0
[03:33:52] Local version 4.0.0-alpha.2
```

0.4.0 と4.0.0違うじゃん！と思ったけどこれでいいようだ。先述のエラーは解消。
UnityでMQTTライブラリを使って、Milkcocoaに接続、さらにiPadでも動かす

# はじめに

UnityにMQTTライブラリを導入して、[Milkcocoa](https://mlkcca.com/)に接続します。最後にiPadで動作確認します。

今回使うMQTTライブラリ：https://github.com/vovacooper/Unity3d_MQTT

#導入

https://github.com/vovacooper/Unity3d_MQTT

まず、こちらのURLからzipでプロジェクトごとダウンロードし、解凍します。

<img width="692" alt="スクリーンショット 2016-01-24 2.21.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/56cc4c4b-6b1b-fa4c-a435-324a98cee634.png">

Import PackageからCustom Packageを選び、ダウンロードしたpackageファイルを選択します。

<img width="450" alt="スクリーンショット 2016-01-24 2.24.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/a2847dcb-a322-7838-afe1-7a978cf4a2b0.png">

次に、ProjectタブのAssetsの中からMQTTをドラッグして、左上のHierarchy内に持ってきます。このオブジェクトにはMqtt TestというScriptが紐付いているので。Mqtt Test Scriptを編集します。```{app-id}```のところは、MilkcocoaのAppIDです。自分のAppIDに置き換えてください。[Milkcocoa](https://mlkcca.com/)でアカウント登録後、アプリを作るとAppIDが発行されます。


```
using UnityEngine;
using System.Collections;
using System.Net;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using uPLibrary.Networking.M2Mqtt.Utility;
using uPLibrary.Networking.M2Mqtt.Exceptions;

using System;

public class mqttTest : MonoBehaviour {
	private MqttClient client;
	// Use this for initialization
	void Start () {
		// create client instance 
		client = new MqttClient("{app-id}.mlkcca.com", 1883 , false , null ); 
		
		// register to message received 
		client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; 
		
		string clientId = Guid.NewGuid().ToString(); 
		client.Connect(clientId, "sdammy", "{app-id}"); 
		
		// subscribe to the topic "/home/temperature" with QoS 2 
		client.Subscribe(new string[] { "{app-id}/unity/send" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE }); 

	}
	void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
	{ 

		Debug.Log("Received from Milkcocoa: " + System.Text.Encoding.UTF8.GetString(e.Message)  );
	} 

	void OnGUI(){
		if ( GUI.Button (new Rect (20,40,100,30), "Hello")) {
			Debug.Log("sending...");
			client.Publish("{app-id}/unity/send", System.Text.Encoding.UTF8.GetBytes("{\"message\":\"Hello\"}"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
			Debug.Log("sent to Milkcocoa");
		}
	}
	// Update is called once per frame
	void Update () {

	}
}
```




#動作確認

とりあえずUnity内のテスト実行で動くことを確認します。

<img width="792" alt="スクリーンショット 2016-01-24 2.21.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/4fe293f2-5b2d-55a8-e8d3-7ee23309b220.png">


#iOSでも動作確認

この後、iOSにビルドしても動くことを確認しました。
ちょっと手間取ったのが、[この問題](http://answers.unity3d.com/questions/1011349/failing-to-build-to-xcode-7-for-ios-9.html)。記事通りxcodeでBuild SettingsのENABLE_BITCODEを"NO"にするとビルドできました。プロジェクトをCleanするのも忘れずに。

![1355.jpg](https://qiita-image-store.s3.amazonaws.com/0/20848/2a0b15ac-62ff-423e-0851-7f2fd310bb1d.jpeg)
フロントエンドの未来

# フロントエンドの未来

この物語はフィクションです。

なんとなく僕らと職種の近い(ツインテールの)女の子が書いた、現在のフロントエンド界隈に対する感想と疑問と問題定義という設定です、登場する人物・団体・名称等は架空であり、実在のものとは関係ありませんよ

-----

最近久しぶりにフロントエンドを担当することになった。もともとマークアップエンジニア(これも死語かな？)として今の会社に就職したけれど、色々と自分で勉強してみている内にサーバーサイドにも興味が湧いて、ここ2年程フロントエンドから離れていた。だから久々にフロントエンドを触ってみて、「React？聞いたことあるかも？」、「Fluxって何？」みたいな状態で、相変わらずの技術の変性のスピード感にちょっとどぎまぎしている。

私が[React](https://facebook.github.io/react/)を知ってから3年、初めて[Backbone](http://backbonejs.org/)を触ってから6年(…年齢がばれるなぁ)、フロントエンドの世界は本来知っているべきことを知ったうえでさらに進化してきたなと思う。クライアントサイドのMVCフレームワークが生まれる前のころは、当時の私みたいなプログラムの書き方の分からない人や、JavaScriptを軽視してたプログラミングのできる人による、jQuery一辺倒の保守性にひどく欠けたプログラムの書き方が普通で、他の人の書いたWebページのコードを引き継ぐのは本当に苦痛でしかなかった。

[Backbone](http://backbonejs.org/)、[Ember](http://emberjs.com/)、[Angular](https://angularjs.org/)、[Spine](http://spinejs.com/)、[Vue](http://jp.vuejs.org/)、…本当に数えきれないほどのクライアントサイドMVCが出てきて、消えていった、そのどれも勉強してみると面白いと思った。根本を見失ってしまってはダメだと思っていて、結局のところこれらMVCフレームワークのどれもが解決したいのは、保守性の担保できるわかりやすいモジュール化、MVCという単語を生み出したSmalltalkの目指していた所と何も変わらないと思う。ただ、MVC以外にも考え方は色々とあって、その上でみんながたどり着いてとりあえずは今のところベストと考えられる一つの答えがReact + [Redux](http://redux.js.org/)なのかなと思う。

少なくとも私はReact + Reduxがとても好き。
immutableな実装を強いるフレームワークは、昔からlispが好きでしょうがない私にとってとても相性が良い…

…閑話休題

そんなReact + Reduxという現時点での素敵な組み合わせをもっても、現状のフロントエンドにはやっぱり不満がある。本当はこれが一番の問題且つ本題で、相変わらずビルドシステムは混在していてー{[gulp](http://gulpjs.com/), npm script, Makefile, grunt?!}、bundlerも然りー{[browserify](http://browserify.org/), [webpack](https://webpack.github.io/), [component](http://component.github.io/)ってのも昔あったかな？}、MVCフレームワークの混在っぷりは前述のとおり、数あるaltJSなんて数えたくもない。そしてこれらをうまく組み合わせてたかだか1ページのHTMLを作り上げるのにどれだけ労力がいるのか考えると…というか実践してみると、正直楽しくはあるけれど、若干辟易してもくる。

私は[WebAssembly](https://github.com/WebAssembly/design/blob/master/README.md)がすごく気になっている。
もともと[Emscripten](https://github.com/kripken/emscripten)が好きで、UnityによるC#->C++->LLVM-IR->JavaScriptとかみていてすごく萌えたし、WebAssemblyは最初のターゲットはC/C++と謳っているので、もしかしたら一瞬でも「HTMLとCSSとC/C++ができます」っていえるマークアップエンジニアが重宝されるときが来るのかもと考えると楽しくなってくる。

だから早くみんな面倒くさいビルドから距離をおいて、未来を見越してWebAssemblyを使ってC/C++でフロントエンドを実装しちゃえばいいのに…そう思いながら今日も大好きで大嫌いなJavaScriptを書いている私もなんだかなー
重み付きランダム抽出:Walker's Alias Method(Python)

[重み付きランダム抽出:Walker's Alias Method](http://qiita.com/ozwk/items/6d62a0717bdc8eac8184#_reference-12387ce48c71f91280d7)のPython版

```py3:python
import numpy as np
def rand_from_prob(wgt, nn=1):
    """Walker's Alias Method"""
    if not isinstance(wgt, np.ndarray):
        wgt = np.array(wgt)
    wsm = sum(wgt)
    n = len(wgt)
    p = (wgt*n/wsm).tolist()
    a, hl = [0] * n, [0] * n
    l, h = 0, n-1
    for i in range(n):
        if p[i] < 1:
            hl[l] = i
            l += 1
        else:
            hl[h] = i
            h -= 1
    while l > 0 and h < n-1:
        j, k = hl[l-1], hl[h+1]
        a[j] = k
        p[k] += p[j] - 1
        if p[k] < 1:
            hl[l-1] = k
            h += 1
        else:
            l -= 1
    rr = np.random.rand(nn) * n
    ii = np.int32(np.floor(rr))
    rr -= ii
    return np.array([i if r < p[i] else a[i] for i, r in zip(ii, rr)])
```

O(1)なので高速。計算時間の比較。

```py3:python
w = np.random.rand(2000)
w /= sum(w)
%time x = rand_from_prob(w, 100000)
>>>
Wall time: 52 ms

%time y = np.random.multinomial(1, w, 100000)
>>>
Wall time: 6.75 s
```
CarrierWaveとSimpleFormを使ってネストした複数ファイルを登録する

意外と悩んでいる人がいるようなので、carrierwaveとsimple_formは既に利用されていることを前提として、modelとcontrollerとviewについて簡単に記載する。
ちなみにroutesは以下のような感じと仮定している。
`resources :images, only: %w(new create edit update destroy)`


#modelについて
仮定として、1つのユーザーに複数の画像が紐づくと考える。

```app/models/user.rb
class User < ActiveRecord::Base
  has_many :images, dependent: :destroy
  accepts_nested_attributes_for :images, allow_destroy: true
```

```app/models/image.rb
class Image < ActiveRecord::Base
  belongs_to :user
  mount_uploader :user_image, ImageUploader
```

user:imageは1:多

#controllerについて

```app/controllers/users_controller.rb
class UsersController < ApplicationController
  def new
    @user = User.new
    @user.images.build
    respond_to do |format|
      format.html
    end
  end

  def create
    @user = User.new(user_params)
    respond_to do |format|
      if @user.save
        format.html { redirect_to hogehoge_url, notice: 'ユーザーを新規追加しました。' }
      else
        format.html { render action: 'new' }
      end
    end
  end

  def edit
    @user = User.where(id: params[:id]).first
    @user.images.build
    respond_to do |format|
      format.html
    end
  end

  def update
    @user = User.where(id: params[:id]).first
    respond_to do |format|
      if @user.update_attributes(user_params)
        format.html { redirect_to hogehoge_url, notice: 'ユーザーを更新しました。' }
      else
        format.html { render action: 'edit' }
      end
    end
  end

  def destroy
    user = User.where(id: params[:id]).first

    respond_to do |format|
      if user.destroy
        format.html { redirect_to hogehoge_url}
      else
        format.html { render action: 'edit' }
      end
    end
  end

private
  def user_params()
    params.require(:user).permit( \
      :name \
      ,images_attributes:[\
        :id \
        ,:user_image \
        ,:_destroy
      ]
    )
  end
end

```

#viewについて
new.html.hamlやedit.html.hamlではusers/_form.html.hamlを読み込む。
_form.html.hamlは以下のような感じ。

```users/_form.html.haml
= simple_form_for([@user], html: {multipart: true, class: 'form-horizontal', wrapper: :horizontal_form}) do |f|
  = f.error_notification

  = f.input :name
  - @user.images.each do |image|
    = f.simple_fields_for :images, image do |if|
      - if image.user_image?
        = image_tag image.user_image.to_s
        = if.input :_destroy, as: :boolean, label: "削除"
      - else
        = if.input :user_image, label: "画像"


```
Jenkins + JDK1.8で"Signature verification failed in update site 'default'"の対処

Jenkinsサーバを久しぶりに構築した時に発生したトラブルと対処について。

# 発生した事象

* 「プラグインマネージャー」のページで、「利用可能」欄に何も表示されない。
* データ更新ボタンを押すと、`Signature verification failed in update site 'default'` というメッセージ。
* アップデートサイト http://updates.jenkins-ci.org/update-center.json にはもちろん繋がる。
* ログには以下のようなメッセージ。

```
SEVERE: ERROR: Signature verification failed in update site &#039;default&#039; <a href='#' class='showDetails'>(show details)</a><pre style='display:none'>java.security.cert.CertPathValidatorException: Algorithm constraints check failed: MD5withRSA<br>	at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.j(略)
```

結論から言うと、JDKの影響でした。
久しぶりにインストールしたので、Jenkinsのバージョンが悪いのか、それとも設定が悪いのかで試行錯誤したのですが、まさかJDKの影響だとは…。

# 環境

* CentOS 6.6
* Jenkins 1.645
* OpenJDK 1.8.0_71

# 対処

以下のいずれか1つを行えば良さそうです。

## JDKのデフォルトシステムプロパティの変更

```/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-1.b15.el6_7.x86_64/jre/lib/security/java.security
# 変更前
# jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024

# 変更後
jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
```

「参考」のURLでは別の対処になっていますが、試した環境ではこちらの対処にしないと解消しませんでした。

## Jenkinsの起動オプションのシステムプロパティを変更

```/etc/sysconfig/jenkins
# 変更前
# JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"

# 変更後
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.model.DownloadService.noSignatureCheck=true"
```

## JDKのバージョンを落とす

JDK1.8.0-71だとダメですが、1.8.0-60ではOKでした。

# 参考

https://issues.jenkins-ci.org/browse/JENKINS-31089
Androidアプリ開発でビットマップデータをリサイズする方法

　写真などをはじめとして、最近のスマートフォンで扱うデータは技術の進歩もあって、データサイズが大きくなってしまいます。そんな時に、メモリを節約したい、データ通信量を削減したい場合は、次の方法でビットマップデータをリサイズしてデータサイズを小さくすることができます。

##Matrix型のインスタンスの生成とサイズの設定

```
Matrix varMat = new Matrix();
varMat.postScale(0.5F, 0.5F);
```

　まずMatrix型のインスタンスを生成します。そして上記では、データの縦横のサイズを2分の１にするための設定をしています。

　次に以下のコードでビットマップデータを上記で指定したサイズに変換します。なお、下記では元のデータはbmpで、リサイズ後のデータがbmp2です。

##スケーリングしたビットマップデータを生成

```
Bitmap bmp2 = Bitmap.createBitmap(
                        bmp, 0, 0,
                        bmp.getWidth(),
                        bmp.getHeight(),
                        varMat, true
                );
```

各パラメータの説明
1. 元になるビットマップデータ
2. 最初のピクセルのX座標
3. 最初のピクセルのY座標
4. 元データの幅
5. 元データの高さ
6. スケーリング情報（postscale で指定）
7. ソースをフィルタリングする必要がある場合はtrueを設定
Intellij IDEAでMACに変えたらキーボード配置が違って困った

Intellij IDEA MACでキーボード配置を変える方法について記載

Preferences > Key Map を選択

Keymaps:を「Mac OCX 10.5+」とか好きな環境にに変更して「OK」を押す。

これで、control + c でコピーみたいな状態から解放される。
【Java】2種類の基本挿入法の実装

# 基本挿入法
大きい順または小さい順に並んでいる数列に、ある数を順に 比較しながらその数列に挿入し並び替えていくソートプログラムの１つこと。

これを2種類の方法で実装。
【方法①】
・挿入すべき位置を探す（ソートされている範囲の先頭から、挿入したいデータと値を比較し、挿入したいデータより大きい値が現われるまで右に移動する）

・右側にあるデータを1つ右に移動する（ソートされている範囲のうち、挿入位置より右側にあるデータを1つ右に移動して、挿入する場所を確保する）

・データを代入する（挿入する位置が空いたので、そこにデータを代入する）

【方法②】
方法①の比較方法を後ろから比較していくこと方法で、すべてのデータにアクセスする必要がなくなるため高速化を目的とした方法。

##### 基本挿入法の実装コード

```InsertionSortTest.java
public class InsertionSortTest {
    // 方法①
    static void insertion_sort1(int[] d) {
	int i,j,k;
        for (i = 1; i < d.length; i++ ) {
            int tmp = d[i];
            for (j = 0; j < i; j++) {
		if (d[j] > tmp) break;
            }
            for (k = i; k > j; k--) {
		d[k] = d[k-1];
            }
            d[j] = tmp;
        }
    }
    // 方法②
    static void insertion_sort2(int[] d){
  int i,j,k;
      for (i = d.length-2 ;i >= 0; i-- ){
        int tmp = d[i];
        for (j = d.length-1; j > i ; j-- ){
  if (tmp > d[j]) break;
        }
        for (k = i; k < j; k++) {
          d[k] = d[k+1];
        }
          d[j] = tmp;
      }
    }

    // 配列内のデータ列を表示する
    static void print_data(int[] d) {
        for(int i = 0; i < d.length; i++) System.out.print(d[i] + " ");
    }

    static int[] random_data(int num) {
      int romdata[] = new int[num];
      for (int i=0;i<num;i++){
      romdata[i] = (int)(Math.random()*10000);
          }
      return romdata;
    }

    public static void main(String[] args) {
        int[] data = random_data(1000);

        print_data(data);
        // 方法①を実装（方法②を実装したい場合は下記を切り替える）
        insertion_sort1(random_data(1000));
        print_data(data);
    }
}

```


timeコマンドで、プログラム自体の処理時間(秒)を比較してコードの処理時間の比較も可能。
macのターミナルの背景を変更するコマンド

ターミナルで作業していて、いまだけ背景色を変更したかった。


# 設定方法

ターミナルのプロファイル変更は AppleScript で可能です。
以下の1行を `~/.bashrc` に追加します。

```bash:~/.bashrc
alias red='/usr/bin/osascript -e "tell application \"Terminal\" to set current settings of first window to settings set \"Red Sands\""'
```

設定を反映させます。

```console:設定を反映
$ source ~/.bashrc
```

以下を実行すると、プロファイルが `Red Sands` に変わります。

```console:
$ red
```


# 参考

http://labs.septeni.co.jp/entry/20141024/1414120224
[Angular2] (2016-05-30 update) Routerに使用するHTMLのBASE要素について

## いきさつ

どちらかというと、``HTML``の内容ですが
``Angular2``の勉強してて初めて知ったので、記載しておきます。

``Angular2``の``Router``については[こちら](https://angular.io/docs/ts/latest/guide/router.html#!#base-href)
``HTML``の``baseURI``については[こちら](https://developer.mozilla.org/ja/docs/Web/HTML/Element/base)


## 構成
Webサーバーの``documentroot``の下に``angular``というディレクトリを作った場合
アプリケーションURLは下記のとおり
``http://xxx.xxx.xxx.xxx/angular/index.html``

そのときの``index.html``の書き方は

```jade:index.jade
doctype html
html(lang="ja")
  head
    base(href="/angular/")
    meta(charaset="utf-8")
    meta(name="viewport" content="width=device-width,initial-scale=1")
    title Angular
  body
    my-app Loading ...
    script(src="node_modules/systemjs/dist/system.js")
    script(src="node_modules/rxjs/bundles/Rx.min.js")
    script(src="node_modules/angular2/bundles/angular2-polyfills.min.js")
    script(src="node_modules/angular2/bundles/angular2.min.js")
    script(src="node_modules/angular2/bundles/router.dev.js")
    script(src="assets/scripts/index.min.js")
```

```coffeescript:index.coffee
appDir    = "assets/scripts"
bootstrap = "bootstrap"

System
  .config
    packages :
      "#{appDir}" :
        format           : "cjs"
        defaultExtension : "js"

System
  .import "#{appDir}/#{bootstrap}"
```

## 考察
  いろいろ試した結果、下記のとおりでうまく動きました。

 * [X] href="/angular"
 * [X] href="angular"
 * [O] href="/angular/"
 * [O] href="/angular/index.html"

ちなみに``href="/angular/"``のときは

```js:console
$ console.log(document.baseURI)
"http://xxx.xxx.xxx.xxx/angular/"
```
となります。


### 追記（2016-05-30 update）

``@2.0.0-rc.1``になって、若干仕様変更したっぽいのでメモ

 * [X] href="/angular"
 * [X] href="angular"
 * [O] href="/angular/"
 * [X] href="/angular/index.html"
【Python】pandasのSeries、DataFrameとは

# pandasのSeries、DataFrame

ITエンジニアのための機械学習理論入門をやり始め、そっこーで
DataFrameが何を意味しているか分からず、嵌りました。
調べた結果です。ついでにSeriesも

## pandas 0.17.1 documentationの公式ドキュメントより

>The two primary data structures of pandas, Series (1-dimensional) and DataFrame (2-dimensional), handle the vast majority of typical use cases in finance, statistics, social science, and many areas of engineering. For R users, DataFrame provides everything that R’s data.frame provides and much more.

簡易訳
pandasは二つの主要なデータ構造がある。
**Seriesが1次元**
**DataFrameが2次元**
これらは様々な分野(金融、統計...)で使われる
R使用者の観点からだと、DataFrameはRのdata.frameが提供する以上のものを提供する。

## 使い方
```py3
#数値計算ライブラリインポート
import numpy
#データ分析ライブラリからSeriesとDataFrameをインポート
from pandas import Series, DataFrame

#Series
#data仮引数  : データ。array-like, dict, or scalar value
#index仮引数 : データの添え字。array-like or Index (1d)
#dtype仮引数 : データタイプ。numpy.dtype or None
#copy仮引数  : コピー。デフォルトはfalse
#name仮引数  : 結果につける名前
#1
print(Series(data=[0,1]))
#2
print(Series(data=[2,3], index=['x', 'y'], name='value'))

#DataFrame
#data仮引数    : データ ( numpy ndarray (structured or homogeneous), dict, or DataFrame)
#index仮引数   : 要素のインデックス。デフォルトは添え字配列みたいに数字
#columns仮引数 : 2次元のインデックス。デフォルトは数字
#dtype仮引数   : データタイプ。dtype, default None
#copy仮引数    : コピー。デフォルトはfalse。
#3
print(DataFrame(numpy.array([[0,0],[1,1]])))
#4
print(DataFrame(numpy.array([[0,0],[1,1]]), index=['a', 'b']))
#5
print(DataFrame(numpy.array([[0,0],[1,1]]), index=['a', 'b'], columns=['x', 'y']))
```

## 結果
```py3
#1
0    0
1    1
dtype: int64

#2
x    2
y    3
Name: value, dtype: int64

#3
   0  1
0  0  0
1  1  1

#4
   0  1
a  0  0
b  1  1

#5
   x  y
a  0  0
b  1  1
```
Cronをファイル単位で一時的に無効にする

# inb4 tl;dr

`/etc/cron.d` に置いてあるタスクを無効にする方法です。
ファイルの内容をコメントアウトしたり、別のディレクトリにファイルを移動させるといった方法があるのかなと思うのですが、ファイル単位で無効にする場合であれば、ファイル名を変更するだけでも可能です。

環境はCentOS6及び7で確認しています。
他のディストリビューションでも同様の動きをするかは不明ですので自己責任ということでお願い致します。


# 隠しファイルに変更する

ぶっちゃけこれをするだけです。
こうするだけで、 `/etc/cron.d` に置いてあるファイルは `crond` から認識されなくなり、処理がされなくなります。


## 実際に試してみる

実際に試してみる事にします。
`/etc/cron.d` ディレクトリに以下のようなファイルを作成します。

```bash:test
*/1 * * * * root date >> /root/date
```

1分毎に `date` コマンドを実行し、それをrootディレクトリにあるdateファイルに書き込んでいくだけのcronです。

数分経過したら `/root/date` ファイルを見てみます。

```bash:/root/date
2016年  1月 23日 土曜日 23:35:01 JST
2016年  1月 23日 土曜日 23:36:01 JST
2016年  1月 23日 土曜日 23:37:01 JST
2016年  1月 23日 土曜日 23:38:01 JST
2016年  1月 23日 土曜日 23:39:01 JST
```

ログも確認してみましょう。


```bash:/var/log/cron
Jan 23 23:35:01 example CROND[16724]: (root) CMD (date >> /root/date)
Jan 23 23:36:01 example CROND[16746]: (root) CMD (date >> /root/date)
Jan 23 23:37:01 example CROND[16760]: (root) CMD (date >> /root/date)
Jan 23 23:38:01 example CROND[16782]: (root) CMD (date >> /root/date)
Jan 23 23:39:01 example CROND[16798]: (root) CMD (date >> /root/date)
```

ちゃんと1分毎にcronが動いていることが確認できます。
では、 `mv` コマンドを使い、 `test` ファイルを `.test` の隠しファイルに変更してみましょう。

```bash
$ sudo mv -i /etc/cron.d/{,.}test
```

すると、 `/etc/cron.d` はこんな感じになります。

```bash
$ sudo ls -la /etc/cron.d/
合計 32
drwxr-xr-x.   2 root root    63  1月 23 23:39 .
drwxr-xr-x. 147 root root 12288 12月 26 20:51 ..
-rw-r--r--.   1 root root    36  1月 23 23:34 .test
-rw-r--r--.   1 root root   128  7月 27 19:57 0hourly
-rw-r--r--.   1 root root   108  9月 19 00:07 raid-check
-rw-------.   1 root root   235  3月  6  2015 sysstat
```

`test` が隠しファイルになっている事が確認できます。

数分経過したら、確認のために再度 `/root/date` ファイルを見てみます。

```bash:/root/date
2016年  1月 23日 土曜日 23:35:01 JST
2016年  1月 23日 土曜日 23:36:01 JST
2016年  1月 23日 土曜日 23:37:01 JST
2016年  1月 23日 土曜日 23:38:01 JST
2016年  1月 23日 土曜日 23:39:01 JST
```

無効にしてから一切の更新がありません。

ログも確認してみます。

```bash:/var/log/cron
Jan 23 23:35:01 example CROND[16724]: (root) CMD (date >> /root/date)
Jan 23 23:36:01 example CROND[16746]: (root) CMD (date >> /root/date)
Jan 23 23:37:01 example CROND[16760]: (root) CMD (date >> /root/date)
Jan 23 23:38:01 example CROND[16782]: (root) CMD (date >> /root/date)
Jan 23 23:39:01 example CROND[16798]: (root) CMD (date >> /root/date)
Jan 23 23:40:02 example CROND[16816]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jan 23 23:50:01 example CROND[16917]: (root) CMD (/usr/lib64/sa/sa1 1 1)
```

23:39:01 を最後に、それ以降 test の処理が動作していないことが確認できます。
<br />
以上です。
bash環境で標準入力から入力されたCプログラムをgccでコンパイルし実行するコマンド。


## 内容
小さいCプログラムの動作確認で使用したコマンドが、さくっと使えて便利だったのでメモする。

## 環境
動作を確認した環境は以下の通り。

項目|内容
---|---
OS|Mac OS X El Capitan 10.11.1
gcc|Apple LLVM version 7.0.0 (clang-700.0.72)
bash|GNU bash, バージョン 4.3.42(1)-release (x86_64-apple-darwin15.0.0)

## コマンド

▼ 動作

1. 標準入力から入力されたCプログラムのコードをgccでコンパイルし、実行ファイルを作成。
1. 実行ファイルが存在する場合、実行。
1. 実行ファイルが存在する場合、実行ファイルを削除。


▼ コード

```bash:
$ tmpfile=###一時ファイル###
$ gcc -xc - -o "$tmpfile" << EOF ; if [ -f "$tmpfile" ] ; then  "$tmpfile" ; rm -f "$tmpfile"; fi

…(Cプログラムのコード)…

EOF

```


▼ 実行例

```bash:
$ tmpfile ='/tmp/test.bin'
$ gcc -xc - -o "$tmpfile" << EOF ; if [ -f "$tmpfile" ] ; then  "$tmpfile" ; rm -f "$tmpfile"; fi
#include <stdio.h>
int main(void) {
  printf("Hello!\n");
  return 0;
}
EOF

# Hello!
```

## 関数化

bash関数"runc"として定義し、使いやすさを向上。

▼ コード

``` bash:
$ function runc(){
  # Cプログラムのコード取得
  local src=''
  [ -t 0 ] && src="$1" || src="$(cat -)"
  
  # 実行
  local tmpfile='/tmp/test.bin'         # 一時ファイル名設定
  echo "$src" | gcc -xc - -o "$tmpfile" # コンパイル
  [ ! -f "$tmpfile" ] && return 1
  "$tmpfile"                            # 一時ファイル（コンパイル済プログラム）を実行
  rm -f "$tmpfile"                      # 一時ファイルを削除
  
  # 終了処理
  return 0
}
```


▼ 実行例1

``` bash:
$ runc << EOF
#include <stdio.h>
int main(void) {
  printf("Hello!\n");
  return 0;
}
EOF

# Hello!
```

▼ 実行例2

``` bash:
$ cat test.c

# #include <stdio.h>
# int main(void) {
#   printf("Hello!\n");
#   return 0;
# }

$ cat test.c | runc

# Hello!
```

▼ 実行例3

``` bash:
$ runc '#include <stdio.h>
int main(void) { printf("Hello!\n"); return 0;}'

# Hello!
```
レンタルデータベースにMacから接続する方法

# さくらインターネットのレンタルサーバーにMacからアクセスする方法


①ssh ユーザー名@ユーザー名.sakura.ne.jp
と入力しenter

②yesと入力しenter

③パスワードを入力しenter

④mysql -u ユーザー名 -h データベースアドレス（さくらインターネットのコントロールパネルのデータベース設定から確認可＊データベース名ではなmysql＊＊＊.db.sakura.ne.jpみたいなやつ） -p
と入力し、データベースのパスワードを入力しenter

mysqlに接続完了

mysqlの終了は

exit;
PHPからRedisを使うサンプル

PHPからRedisを使うことになった。
せっかくなのでメモを残しておく

```php:sample.php
<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);
 
 //hogeをKeyにしてデータをセットする
$redis->set("hoge","hoge-redis");
 
 //データを取り出す
$res = $redis->get("hoge");
echo $res;

//その結果、ブラウザには「hoge-redis」と表示される
?>
```

参考サイト
redisドキュメント日本語訳¶
http://redis.shibu.jp/

phpredis
https://github.com/phpredis/phpredis#installation
tmux の unix ドメインソケットが消えた時の対処


## 誰かが消している

tmux を使っていると何故か tmux の unix ドメインソケット (以後「ソケット」) がいつの間にか消されることがあります。こうなると何が困るって、このソケットを読み書きしているコマンドが軒並み `error connecting to /private/var/folders/<中略>/T/tmux-501/default (No such file or directory)` というエラーメッセージを出して機能してくれなくなります。例えば[tmux使用時にmanページを新規ウィンドウ表示](http://d.hatena.ne.jp/gin135/20140507/1399463265)なんて便利なものが無粋なことにエラーメッセージを吐いて停まってしまうことになります。そして detach したら最後 `tmux attach` してもつなぎ直せなくなります。

勝手に消されることは[解決法が見つからず藁にもすがる思いで質問をしてみました](http://ja.stackoverflow.com/questions/21222/tmux%e3%81%aeunix%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e3%82%bd%e3%82%b1%e3%83%83%e3%83%88%e3%82%92%e6%b6%88%e3%81%97%e3%81%a6%e3%81%84%e3%82%8b%e7%8a%af%e4%ba%ba%e3%82%92%e7%89%b9%e5%ae%9a%e3%81%97%e3%81%9f%e3%81%84)。こちらは親切な方からの回答待ちです。

## 謎は残るがソケットは復活できる

それはそれとして、消えたソケットファイルを復活させる方法はあります。tmux のマニュアルに以下の記述があります;

> If the socket is accidentally removed, the SIGUSR1 signal may be sent to the tmux server process to recreate it (note that this will fail if any parent directories are missing).

テキトーに翻訳すると

「ソケットファイルが消えたら SIGUSR1 シグナルを tmux サーバプロセスに送ると作りなおすよ (ただし親ディレクトリがないと失敗するよ)」

とかいう意味のことが書いてあります。で、そのとおり

```shell-session:
% mkdir -m700 /private/var/folders/<中略>/T/tmux-501
% killall -SIGUSR1 tmux
```

とやってみると見事ソケットファイルが復活します。誰かが消している件は依然として解決しませんが、とりあえずなんとか使い続けることができそうです。

## zshの関数にまとめる
このソケットファイルの在処はシェル変数 `$TMUX` で参照できます。そこでこれを利用してソケットを復活させる zsh の関数を書いてみます。

```Bash:
function tmux-remake-socket () {
    if [ ! $TMUX ]; then
        return
    fi
    tmux_socket_file=`echo $TMUX|awk -F, '{print $1}'`
    if [ ! -S $tmux_socket_file ]; then
        mkdir -m700 `dirname $tmux_socket_file` 2> /dev/null
        killall -SIGUSR1 tmux
    else
        echo tmux unix domain socket exists! nothing to do.
    fi
    unset tmux_socket_file
}
```

私みたいなトラブルを抱えている人はいないとは思いますが、自分のためにもまとめておきます。