OmniAICreator/Qiita-1.07M huggingface dataset:
Bluemixで自作のDockerコンテナを動かす

概要
====

IBM BluemixはDockerのprivate registryが用意されます

Bluemix上でDockerコンテナを動かしたい場合は、Bluemix上のprivate registryにpushして、そのimageをrunする形になります

Private registryの準備
---------------------

Bluemixのコンソールで [ダッシュボード] - [コンテナ / コンテナの開始] - [独自のものを追加] を選びます

registry.ng.bluemix.net に対するネームスペース(パス)の入力を求められます

**注意: このネームスペース、よく考えて入力してください**

というのは registry.ng.bluemix.net/**YOUR_CONTAINER_REGISTRY_PATH** とした場合、`docker tag` や `docker push` が *registry.ng.bluemix.net/YOUR_CONTAINER_REGISTRY_PATH/image_name:image_tag*
 となります

またこのprivate registryのネームスペースはBluemix全体でユニークである必要があり、またアカウント1つに1つだけ割り当てることができる、極めて貴重なリソースです。また一度作成すると変更や削除できないので、ネーミングは計画的にしましょう (要出典)

同じ操作は `cf ic namespace set YOUR_CONTAINER_REGISTRY_PATH` というコマンドでも行えます

docker tag & push
-----------------

`docker build`までは普通にDockerの操作になりますので省略

`docker push` は、先のprivate registryに向けて行いますので、当該のIMAGE_IDにtagを割り当てて、pushできる状態にします

```
$ docker tag TARGET_IMAGE_ID registry.ng.bluemix.net/YOUR_CONTAINER_REGISTRY_PATH/NEW_IMAGE_NAME
$ docker push registry.ng.bluemix.net/YOUR_CONTAINER_REGISTRY_PATH/NEW_IMAGE_NAME
```

run
---

`cf ic run` でコンテナ開始できます

```
$ cf ic run registry.ng.bluemix.net/YOUR_CONTAINER_REGISTRY_PATH/NEW_IMAGE_NAME
```

cf icコマンドについて
------------------

`docker`コマンドを`cf ic`に置き換えれば、大体同じ操作ができます

- `docker images` => `cf ic images`
- `docker ps` => `cf ic ps`

あとがき
-------

超絶にダサいnamespaceを設定してしまった、黒歴史
編集リクエストって

編集リクエストが目立つようになったみたいだけど悪手じゃないかな。

現状実質パブリック共有ブログなQiitaが編集リクエストを活性化させるということはブログに書いた過去の記事の修正を継続的に要求されるということだよ？

1年2年前に書いた記事の修正を延々要求され続ける、記事の数が増えれば増えるほど修正の要求も増す。

そんなブログを誰が使いたがるだろう。

みんな修正要求を疎ましがって他のブログに逃げるだけだよ。

普通は非効率で無意味だからやらない記事の維持管理を要求しそのコストを執筆者に押し付けながら利益はすべてもっていく。

自分たちがどんな構図を作っているかくらい考えたほうがいいんじゃないかな。

WikipediaやStackOverflowのようにボランティアに納得してもらえる環境を整備するというのは生半可じゃないよ。

ポエム。
kubernetes: オフライン環境でのクラスタ構築

インターネット接続の制限のあるオフライン環境でkubernetesクラスタを構築する。
今回はAWS上にクローズドな環境を構築して試す。
※OSはCentOS7

※worker nodeは初期はminionという名称でしたが、workerに記載統一

各クラスタ(master/worker)のセットアップは、基本的に以下を参照
http://qiita.com/suzukihi724/items/d3270121009120f9c9f0

セットアップファイルをオフラインで持ち込み、完全手動でインストールする方法もあるが、yumなどを利用してオンライン環境でインストールした後に、オフライン環境へ持ち込む（もしくはクローズドな環境でyumを利用できるように設定する）手段が容易。

AWSの場合は、オンライン環境でセットアップ後に、AMIを作成し、クローズドなネットワーク内で該当のAMIをベースにインスタンスを起動する。

上記方法でkubernetesクラスタのセットアップはでき、kubectl get nodesコマンドでworkerノードを正しく認識できるようになったが、Podを作成すると、ステータスがRunningにならず正常にPodを生成できない事象に遭遇。
※CreatingContainerから遷移しない。

このような場合のデバッグには、以下のコマンドが有効。

`kubectl logs [Pod名]`
`kubectl describe pod [Pod名]`

ログを確認すると、beta.gcr.io/google_containers/pause:2.0というイメージの取得に失敗していた。
クローズドな環境のため、外部レジストリの通信が拒否されるためである。そもそもpauseって？？と思ったが、Pod内のコンテナのネットワーク接続用のコンテナらしい。

クローズドな環境の場合、このコンテナイメージをオンライン環境で取得（docker pull）し、オフライン環境内のPrivate Docker RegistryにPushしておく必要がある。
さらに、kubernetesクラスタが、pauseのイメージをbeta.gcr.ioではなく、プライベートレジストリから取得するための設定が必要。

kubernetesでprivate docker registryを利用する方法は以下参照

http://qiita.com/suzukihi724/items/ca76d3ec77c97cf571b1

さらに、kubeletの設定でpauseの取得先を指定する必要がある。

`sudo vi /etc/kubernetes/kubelet`

以下がpauseコンテナの取得先設定。
デフォルトはbeta.gcr.io/google_containers/pause:2.0の模様

```
# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image="[PrivateRegistryのパス]/pause:2.0"
```
【PHP】0埋め


```
echo sprintf('%02d', 1); // 01
echo sprintf('%03d', 1); // 001
echo sprintf('あなたのIDは%04dです', 1); // あなたのIDは0001です
```

参考
[PHPで0埋めをする2つの方法- sprintf関数とstr_pad関数](http://wp.tech-style.info/archives/582)
CSVをエクセルでも見れる文字コードUTF-16LE(リトルエンディアン）で出力するメモ


## UTF-16のBOM(リトルエンディアン）を挿入するワンライナー

```bash
ruby -i -e 'print ARGF.read.sub(/\A/, "\u{FFFE#}")' file.csv
```



## UTF-16LEのBOM(リトルエンディアン）を挿入するFileクラス拡張

UTF-8のファイルからUTF-16LEへの変換前提

```ruby
class File
  def self.insert_bom(input_filename, output_filename)
    src = File.read(input_filename)
    File.open(output_filename, "w:UTF-16") do |f|
      src = '  ' + src
      src.setbyte(0, 0xFF)
      src.setbyte(1, 0xFE)
      f.print src
    end
  end
end
```



## UTF-8のファイルをUTF-16LEに変換する


```ruby
File.write "file_utf16.csv", NKF.nkf('-w16L',File.read("file_utf8.csv")) 
File.insert_bom("file_utf16.csv", "file_utf16_bom.csv")
```

実行結果

```bash
$ nkf --guess file_utf8.csv
UTF-8 (CRLF)

$ nkf --guess file_utf16.csv
BINARY

$ nkf --guess file_utf16_bom.csv
UTF-16 LE (BOM) (CRLF)
```


### 参考
http://magazine.rubyist.net/?0009-BundledLibraries#l7
http://tbpgr.hatenablog.com/entry/20140204/1391517653
Let's Encrypt で証明書の更新

# 概要
Public Beta である [Let's Encrypt](https://letsencrypt.org/) の証明証は３ヶ月で有効期限が切れる．言い換えれば，３ヶ月ごとに更新手続きが必要なので，備忘録としてまとめる．

# 証明書の更新
`letsencrypt-auto` コマンドに `renew` サブコマンドが用意されているが，証明書の取得に用いる `certonly` サブコマンドで更新も行える．今回は `certaonly` コマンドを使用した．

ドメインが `sample.com` でドキュメントルートが `/var/www` の時，証明書の更新（というか再発行）は，

```shell-session
$ letsencrypt-auto certonly --webroot -w /var/www -d sample.com
```

で行える．`/var/www` にアクセス権がある状態で実行すること．

## letsencrypt-auto コマンドがない場合

```shell-session
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto certonly --webroot -w /var/www -d sample.com
```

# 注意
`letsencrypt-auto certainly` は `-w` オプションで指定した場所に `.well-known` というフォルダを作る．このフォルダが Web から見えていないと認証されない．なので，リバースプロキシを設定している場合でも，このフォルダだけは転送しないようにしておく．

```nginx
server {
    listen 80;
    server_name sample.com;
    rewrite (.*) https://sample.com$1 redirect;
}
server {
    listen 443 ssl;
    server_name sample.com;
    ......
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
    location /.well-known/ {
        root /var/www;
    }
}
```
Smarty3でnl2brしつつXSSを避ける書き方

Smarty3で改行を含むユーザ入力テキストを、画面に出すときは`<br>`で改行して出してあげたい、そんな場合に`nl2br`と`nofiler`を使うといいのですが、普通の書き方をするとXSSの脆弱性になりえます。

## XSSできてしまう書き方

```
{$xss_string|nl2br nofiler}
```

## XSSできない書き方

```smarty
{{$xss_string}|nl2br nofiler}
```

闇コードっぽい・・・
dockerコマンド一覧

よく使うdockerコマンド一覧

## 0) dockerコンテナを起動し、ログイン

`docker run -i -t [イメージ名] /bin/bash`

※-u [ユーザ名]　で起動時のユーザを指定できる

##1) dockerイメージをtar.gz形式で保存する

`docker save [イメージ名] > [ファイル名].tar.gz`


##2) tar.gz形式のdockerイメージを取り込む

`docker load < [ファイル名].tar.gz`


##3) dockerイメージのコピー（タグ名変更）

`docker tag [対象イメージ名:タグ] [変更後イメージ名:タグ]`


##4) 起動中コンテナにログイン

`docker exec -it [コンテナID] bash`


##5) 起動中コンテナにホストからファイルコピー

`docker cp [ホストファイルパス] [コンテナID]:[コンテナコピー先パス]`


##6) 起動中コンテナをイメージとして保存

`docker commit [編集したコンテナID] [保存するコンテナ名]`

##7) コンテナに外部からアクセスする（ポートフォワーディング）

`docker run -p [外部ポート]:[コンテナポート]`

※-pオプションは複数指定可能


##8) dockerfileからイメージを作成
 
`docker build -t [イメージ名]:[タグ名] [Dockerfileのあるディレクトリパス]`


##9) statusがexitedなdockerイメージのみ一括削除

`docker rm $(docker ps -a --filter 'status=exited' -q)`

### 処理終了時にコンテナ自動削除

起動時に--rmオプションをつけておけば、そもそもゴミは残らない

`docker run --rm  以下省略`

##10) コンテナのボリュームをホストにマウントする

`docker run -v [ホストボリュームパス]:[コンテナ内パス] [コンテナイメージ]`

##11) コンテナを開始/停止/再起動

`docker start/stop/restart [コンテナ名]`

ホスト上の全コンテナを一括停止したい場合は

`docker stop $(docker ps -q)`

##12) コンテナイメージをregistryにpush

`docker push [コンテナ名]`

##13) docker registry上のイメージ一覧を確認

`curl https://[レジストリドメイン名]:5000/v2/_catalog`

自己証明書など、SSLの設定が正しくない場合エラーとなる。

Error例

```
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: https://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
```

この時は、--cacertオプションでcrtファイルのパスを指定する。

`curl --cacert [crtファイルのパス] https://[レジストリドメイン名]:5000/v2/_catalog`

※以下でErrorの場合は、sudoで実行してみる。
`curl: (77) Problem with the SSL CA cert (path? access rights?)`

また、暫定対処で-kオプションをつける方法もある。

`curl -k https://[レジストリドメイン名]:5000/v2/_catalog`


##14) docker registry上のイメージのタグを確認する

`v2/_catalog`コマンドでタグも確認できれば良いのだが、タグの確認は、リポジトリを指定して以下の通り実行。

`curl https://[レジストリドメイン名]:5000/v2/[リポジトリ名]/tags/list`

`{"name":"[リポジトリ名]","tags":["latest"]}`

##15) コンテナを自動再起動
ホスト再起動や意図しないコンテナの停止の時に、自動的に再起動してくれるオプション。
docker stopコマンドで明示的に終了した場合は除く、

`docker run --restart=always`

alwaysの代わりに on-failure[:max-retries] で、異常終了時のリトライ回数指定での再起動も設定できる。

##16) コンテナ名の変更（rename）

docker runオプションの --name で指定したコンテナ名を変更できる

`docker rename [変更前] [変更後]`

##17) 各種コンテナ情報の取得

`docker inspect`

IPアドレス、ポート、マウント情報など

##18) 通常ユーザでdockerコマンドを使えるようにする

dockerグループに、通常ユーザを追加するコマンド

`sudo usermod -a -G docker [ユーザ名]`
androidの操作を自動化したときの覚書

androidで色々と自動化したくなったのでその覚書

# 端末の確認
`adb devices`
`adb -s 端末のID`で端末を指定して実行

# タップとスワイプ
## タップ
`adb shell input touchscreen tap x y`

例によって左上が(0, 0)

## スワイプ
`adb shell input swipe x1 y1 x2 y2`

# タッチイベントを拾う
`adb shell getevent /dev/input/event0`

`event0`の部分はandroidのデバイスファイルのパス

`-i`オプションを付けると人が見やすい形式で出力してくれる。

# ファイルの転送
## PCからandroidへ
`adb push PCのファイル 端末のファイル`

## androidからPCへ
`adb pull 端末のファイル PCのファイル`

# androidのシェルを起動
`adb shell`

シェルの中ではタップなどのコマンドは`adb shell`を除いた部分だけで実行できる。

# タッチイベントを記録&再現

```record.rb
time = Time.now

while true
  if gets =~ /([a-f\d]+) ([a-f\d]+) ([a-f\d]+)/
    arr = [$1.to_i(16), $2.to_i(16), $3.to_i(16)]
    _time = Time.now
    puts "sleep #{_time - time}" if _time - time > 0.1
    puts "sendevent /dev/input/event0 #{arr[0]} #{arr[1]} #{arr[2]}"
  end
end
```

`adb shell getevent /dev/input/event0 | ruby record.rb > touch.txt`で記録。
`adb push touch.txt /storage/sdcard0/`で転送
`adb shell`でシェルに入って、`sh /storage/sdcard0/touch.txt`で実行

> 参考 [getevent/sendeventでAndroid端末の操作自動化](http://techblog.qoncept.jp/?p=356)
artisan serve で任意のhost,portを指定する方法

最近laravelを触り始めました。

php のbuilt-in server で確認する事が多かったんですが、
artisanには serveオプションがあって超便利。

でもdefaultでは host:localhost port:8000 が採用されます。
vendor/laravel/framework/src/illuminate/Foundation/Console/server.php
で初期値が設定されているからですね。

上記getOptionsでもあるように --host --port で指定する事ができるようです。

```bash
$ php artisan --host=127.0.0.1 --port=9999
```

私のようによく使うようなら、以下のようにshellを書いておいてもいいかもしれません。

start_serve.sh

```bash
#!/usr/bin/env bash
$php artisan --host=127.0.0.1 --port=9999 &
```

via http://laravel.io/forum/09-05-2014-php-artisan-serve-on-another-adress?page=1
【Docker運用】データコンテナがコンテナの一括削除で削除されないようにする方法

Dockerを運用していると次第に終了したコンテナが溜まっていくので、定期的に終了したコンテナを一括削除する必要があります。

色々なサイトで紹介されている下記のコマンドを使うと一括で終了したコンテナを削除できます。

```bash
docker rm $(docker ps -aq)
```

しかし、データコンテナを使っている場合は、このコマンドは使えません。データコンテナはコンテナとしてはアクティブではないので、このコマンドを使うと削除されてしまうからです。
もし削除されてもデータが消えてしまうわけではありませんが、コンテナ名やIDでアクセスできなくなったりと、色々と面倒なことになります。

##コンテナのステータスでフィルタリングする
docker createコマンドによってデータコンテナが作られている場合であれば、下記のようにstatus=exitedでフィルタすることによって、この問題を回避できます。なお、docker createコマンドを使ってコンテナを作った場合はstatusはcreatedとなります。

```bash
docker rm $(docker ps -aq -f status=exited)
```

##ラベルとシェルスクリプトを使って削除対象から外す
しかし、レアケースかもしれませんが、docker runを使ってデータコンテナを作る必要があったり、誤ってdocker startしてステータスがexitedになるといったケースも考えると、ラベルを使ってデータコンテナを識別することで削除対象から除けた方がより安全です。

ラベルはDockerfile、docker create/runコマンドのオプションで設定できます。

＊ラベルをdocker create時に設定する例

```bash
docker create --name my-data --label "container-type=data" -v /data busybox
```

例では "containert-type=data" というラベルを付けています。

ラベルを付けておくことで docker ps コマンドの --filter オプションでフィルタリングが可能になります。これでデータコンテナを区別することができます。

ただし、--filterオプションでは「〜以外」という条件設定はできないようなので、シェルスクリプトを使ってなんとかする必要があります。

＊データコンテナだけを残してコンテナを削除するスクリプト

"container-type=data"のラベルがついたコンテナを除いて削除を実行します。

```bash
#!/bin/bash

data_containers=`mktemp -t data-containers-`
docker ps -a --filter "label=container-type=data" -q  | sort > $data_containers
exited_containers=`mktemp -t exited-containers-`
docker ps -a -f status=exited -q  | sort > $exited_containers

remove_targets=$(comm -23 $exited_containers $data_containers)
docker rm $remove_targets
```

###そのほかの方法
あとは、何かしらプロセスを立ち上げてデータコンテナを起動状態にしておくという方法もあると思います。

#追記

最近ではボリュームを個別に管理できるのでそもそもデータコンテナを使う必要性がなさそうです。
docker volume系のコマンドを使って管理するのがよいと思います。
Jupyter (旧IPython notebook)でのR環境構築 (on OS X El Capitan 10.11.3)

http://qiita.com/tanemaki/items/7c74b35505dc372bc9c6
こちらを拝見して、”ごにょごにょ”せずにIpython Notebook上でRを使用できるような環境を作ろうと試行錯誤した経緯です。初投稿です。

IPython Notebookは、他言語に対応した[Jupyter](http://jupyter.org/)になったようです。

#設定環境
MacOS X El Capitan (10.11.3)
Python (2.7.11)環境は`pyenv install anaconda-2.3.0`で作成されたもの
R (3.2.2)


#試行錯誤

[R kernel for Jupyter](http://irkernel.github.io/)を読みながらMac OS Xへのデフォルトのインストール手順に従う。

TerminalでRを立ち上げ、

````> install.packages(c('repr', 'IRkernel', 'IRdisplay'), repos = c('http://irkernel.github.io/', getOption('repos')))````

すると
````> ---　このセッションで使うために、CRAN のミラーサイトを選んでください ---　````

と表示されXQuartzが立ち上がるのでCRAN mirrorを選択する。
好きなmirror（Japan (Tokyo) [https]とか）を選んでOKしたが、

````> ERROR: lazy loading failed for package 'IRkernel' ````

:persevere: インストールできなかった。
rzmqが他のバージョンで設定されているため、"BINARY"ではなく"SOURCE"を参照してインストールしなければならないらしい。
（参照；http://irkernel.github.io/installation/）

#IRkernelの環境作成
私はHomebrewを使用しているのでTerminalで
````$ brew install zmq ````
してからRを立ち上げ、

````
> install.packages(c('rzmq','repr','IRkernel','IRdisplay'),
                 repos = c('http://irkernel.github.io/', getOption('repos')),
                 type = 'source')
````
前述のように好きなCRAN mirrorを選択。インストールが終わったら

````> IRkernel::installspec()````

でJupyter内でRカーネルが動くように設定。`> q()`でRを抜けてからterminalで

````$ jupyter notebook````

NewにRが出れば成功。
Cocoapodsでpod installできなくなった場合

これはもう皆が皆同じ原因でpod install出来なくなるわけではないと思うので、あんまり参考にならないかもしれない。

`$ bundle exec pod install --verbose`

でpod installすれば進捗を見ることが出来る。
この時点でどうにもPodSpecのpullに超時間がかかっているっぽかった。

とにかく
`/Users/O_o/.cocoapods/repos/master`
にPodSpecがあれば良さそうな雰囲気だったのでreposディレクトリで
`git clone https://github.com/CocoaPods/Specs`
してディレクトリ名をmasterに変えたら動くようになった。
SPSS Modeler 17.1 で dashDB や Redshift への接続をサポート

去年発表になってるみたいなんですが、マニュアル等へのリンクをすぐに見つけられなかったので備忘録的にシェア。

dashDBとSPSSの組み合わせですが、昨年まではSPSS Statsのみのサポートでした。
Modelerがサポートとなり、SQL Pushback : SPSSの処理をDB側にオフロードする機能が使えるようになったみたいです。

https://developer.ibm.com/predictiveanalytics/2015/10/02/new-spss-modeler-17-1-and-analytic-server-2-1/

(上記リンク先より転載)
>Modeler 17.1
  …
>    Updated Platform Support
>        RHEL 7 & Canonical Ubuntu on Power Linux little endian
>        **dashDB (SQL Pushback)** :blush: 
>        Amazon Redshift (SQL Pushback)
ajaxSetup()でajax処理共通のデフォルトオプションを設定する


恥ずかしながらこのやり方を最近知った。

```javascript
$.ajaxSetup({
  cache: false,
  timeout: 10000, // 10sec
});
```
みないな感じで書くと、ajax処理に共通のオプションを設定できる。
タイムアウト秒数とかはある程度統一させたりするだろうから、結構便利。

個々の処理でオプションを設定した場合は、そっちが優先される。

```javascript
$.ajax({
  url: '/hoge',
  type: 'GET',
  timeout: 600000, // こっちが優先される
}),
....
```

ちなみに、`$.get()`メソッドでも`ajaxSetup()`で設定したオプションは適用される。
いまさらリーダブルコードまとめ (第2章)

# はじめに
チーム内リーダブルコード輪読会の第2章。
第1章は[こちら](http://qiita.com/IsaoTakahashi/items/1eca3723df4fa3d1f4a9)

# 第2章 名前に情報を詰め込む

## どんな内容？
- クラス、メソッド、変数の名前をつけるときは、その名前から機能・格納されている情報が分かるような名前にしよう
- 一時変数や短いスコープ内でしか使われない変数であれば、`tmp`や`n`といった短くて抽象的な名前でもいいんじゃない？

## 読んだ感想
コードレビューで自分がよく指摘するのが、この"名付け"の部分。
もっとちゃんと名前つけて欲しいっていつも思ってる。
(自分は自分で、レビュワーから「変数名長すぎ」って突っ込まれたりして直すこともあるけどw)

文中では`send`や`find`などのシソーラスが例示されていて「適宜適切な単語を選ぼう」ってなってるけど英語スキルがあまりないチームでは、シソーラス表見てどれが正しいか悩んだ挙句に適切なものを選んでも、他の人にその単語のニュアンスが通じないことがある。
なので、
「こういうときは`send`よりも`distribute`のが適切」
とかいったことを共通認識として広めていく必要があるなーと。


## 例を挙げて議論してみよう
### 適切な単語を選ぶ
- どういうメソッド名が、より適切？

```java:1-1
// 名前がtargetNameと一致するユーザを取得する
// *命名についての話なので、このメソッドの妥当性については無視してください
User getUser(List<User> users, String targetName) {
  for(User user : users) {
    if (user.getName().equals(targetName)) {
      return user;
    }   
  }
  return null;
}

List<User> getUsers(List<User> users, String targetName) {
  List<User> matchedUsers = new ArrayList<>;
  for(User user : users) {
    if (user.getName().equals(targetName)) {
      matchedUsers.add(user);
    }   
  }
  return matchedUsers;
}
```

- -> `get`より`filter`のが適切？
- -> 名前を元に取得するんだったら`...fomName`とかつけたほうがいい？
- -> `getXXXUser`とか`getYYYUser`のように、より具体的な属性をつけたほうがいい？


### 名前の長さを決める
何をどこまで省略する？

- 変数名長すぎ？

```java:2-1
void someFunc(AccountInfo accountInfo) {
  String userNameOfAccountInfo = accountInfo.getUser().getName();
}
```

- メソッド名冗長すぎ？

```java:2-2
Class SomeConverter {
  public static String convertIntToString(int num) {
    ...
  }
}
```

- Converterクラスのconvertメソッドってどうなの？
- 引数をintで取ってるのに、convertIntってIntを明示する意味はあるのか？
いまさらリーダブルコードまとめ (第1章)

# はじめに

今更ながらチーム内でリーダブルコード輪読会をすることになった(っていうかすることにした)ので、自分の担当分についてまとめたり感想書いたり。

# 第1章 理解しやすいコード
## どんな内容？

- コードは理解しやすく書かれているべきである
- コードは、_他の人_が素早く理解できるようになっているべきである

## 読んだ感想
うんまぁそうだよね、って話なんだけど、
「_他の人_が素早く理解できる」であろうコードを_自分_が書くことはなかなか難しい。
自分のレベルのプログラマーにとっては当たり前な記法でも、他の人にはそうでなかったり。
(これは自分のレベル＞他人のレベルでも、その逆でも起こり得る)

後の章でも出てくるんだけど、三項演算子とか短絡評価らへんは、
人によってはすごく読みづらく感じるものなので要注意。
チーム内で、
「この書き方ならチームメンバー全員に分かりやすい」
っていう共通見解を持っていた方がいいな。
=> __それってつまりコーディング規約。__

## 例を挙げて議論してみよう

### どちらが・何故読みやすい？
どちらかが必ず優れていることを示すのではなく、
「チーム内の皆がどう考えているか」
を知るのが目的。

- ガード節の記述

```java:1-1
int funcForPositive(int num) {
  if(num < 0) return 0;
  
  ...
}
```

```java:1-2
int funcForPositive(int num) {
  if(num < 0) {
    return 0;
  }

  ...
}
```

- ifとswitchの使い分け

```java:2-1
if (num == 1 || num == 2) {
  someFunction(num);
} else {
  anotherFunction(num);
}
```

```java:2-2
switch(num) {
  case 1:
  case 2:
    someFunction(num);
    break;
  default:
    anotherFunction(num);
}
redux-formのaddField()のバグ？うまく動かないときは初期値を設定する

もしかしたら`react-bootstrap`と併用しているのが原因かもしれないけど検証する時間がないので一旦メモ。
初期値を未設定にしたり、nullを設定すると、前の初期値が設定されてしまったりするバグ？があるので、初期値はちゃんと設定しておく。

```js
// NG
items.addField()

// NG
items.addField({foo: null, bar: null})

// OK
items.addField({foo: 0, bar: 'xxx'})
```
windows 10でhostsを編集した後、windows defenderで検出される

## 対応

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/9a08882a-7975-5531-2d9a-a1a0ec8ec6ee.png)

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/ca35150b-0815-9cf8-6bb7-42d993b3c86d.png)

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/62ae9016-4bd2-9a8f-2030-efc68977c63a.png)

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/ce8a86c2-bd21-7385-e6bf-e9d04d0d32dd.png)
また備忘録 iPhone接続時にiPhoto起動されたくない / 起動してほしい

起動されたくない
`defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool YES`

起動してほしい
`defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool NO`

defaultsコマンドは忘れがちだから書いとく。
はじめてのAndroid Studio

`追記：書いたまま放置してましたが下書きがいっぱいになったので放出します。２０１５年末頃の作業ログです。`

久々にAndroidを触る必要が出てきたので開発を始めてみようと思います。
経験はあるもののEclipseが主流だった頃以来なので浦島状態。
今はAndroid Studioが定番ということだけは知っていたのでとりあえず使ってみることにしました。

# Android Studioの準備
## ダウンロード
Android Developersからインストーラーをダウンロードします。
https://developer.android.com/intl/ja/sdk/index.html

## インストール
古い環境などからのインポートの必要もないので流れに従ってそのままインストール。
何かのインストールがうまくいかなかったけどとりあえず気にしない。

## Complete Installation
前のバージョンをインストールしたことがあれば
`You can import your settings from a previous version of Studio.`
と聞かれる。
データを引き継ぐ場合は
`I want to import my settings from a previous version (~/Library/Preferences/AndroidStudio1.4)`
を選択。

## Preferencesの変更
### Appearance & Behavior > Appearance
`Theme: Darcula`に変更。目に優しい。

### Editor > Colors & Fonts > Font
Schemeを新規作成。
フォントを`Iconsolata`、サイズを`18`に変更。

### Editor > General > Appearance
以下にチェックを入れました
- `Show line numberes` 行番号表示
- `Show whitespaces` 空白表示

## vim化したい
普段はvimを使っているのでどうしてもやりたくなります。
調べたところ一応プラグインはあるようです。

IdeaVim
https://github.com/JetBrains/ideavim

ですが、[それなりに使えはするものの完璧ではないらしい](http://gihyo.jp/dev/serial/01/android_studio/0044)のと、
IDEでわざわざ使うのもどうなんだろうと思い素直に慣れることにしました。

# プロジェクトの作成

Android Studio 1.4になり以前と変わったようですが、初めてなので気にせず進めます。

## Configure your new project
`Application name`や`Company Domain`などはお好み。特に変えなくても進められました。

## Target Android Devices
ここも特に変える必要はないですが、最近は4.2以上のほうが何かとよいらしいので
`API 17: Android 4.2 (Jelly Bean)`を選択しました。

## Add an activity to Mobile
お作法を知るためにスタンダードな
`Navigation Drawer Activity`を追加して始めてみることにしました。

## Customize the Activity
最初は特に変える必要はなかったです。
がっつり開発する際にはFragmentは必須のようですが、
最初は気にせず`Use a Fragment`にはチェックは入れません。

# 開発

## Rendering Probrems

レイアウトのプレビューで何やらエラーが出るので
ちょっと調べてみるとdeplicatedなActionbarを使おうとしていたらしい。
[情報元](http://stackoverflow.com/questions/33742114/rendering-problems-the-following-classes-could-not-be-found-android-support-v7)と同じ対応で解決。

```java:res>values>styles.xml
<!-- ThemeにBaseを追加 -->
<style name "AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
```

# ビルド
上の三角ボタンでできます。
Terminalから直接ビルドすることもできます。

```
$ ./gradlew
```

## Build Variant
Build TypesとFlavorによりビルドのバリエーションを作ることができます。
この２つの詳細については[こちら](http://iti.hatenablog.jp/entry/2015/06/22/084303)の記事を参考にさせていただきました。
ビルド時に切り替える場合は左下のBuild Variantsで設定できるようです。

# その他
## Android SDKのアップデート
`Tools > Android > SDK Manager`からアップデートできます。
他にも必要なライブラリの追加などもできます。
参考：http://qiita.com/labeneko/items/f6c46f9a21f321827d88

## 参考リンク
Android アプリ開発の基礎知識と実務スキルを身に付けるトレーニングコース
http://mixi-inc.github.io/AndroidTraining/
Rspec3 カスタムフォーマットの例（CSV出力）

# Rspec3のカスタムフォーマットについて

さるやんごとない理由により、Selenium Webdriverのテスト結果をCSVファイルに残す必要が出てきた。
色々調べたけれど、「フォーマットを書く人はソースコード読むだろうから後はKIAIとKONJOでがんば」みたいに書かれており、
MAJIかよハードルたけえな、と思ったので、備忘録。
Rspec3+Selenium Webdriverで、結果としてCSVファイルを吐き出させる。

環境
 * Ruby 2.2.4
 * Rspec 3.4.3
 * Selenium-webdriver

## カスタムフォーマッタ

以下のように記載。registerで書いてあげないといけない、と。

```rb
# -*- coding: utf-8 -*-
require 'pp'
require 'csv'
require 'rspec'
RSpec::Support.require_rspec_core "formatters/base_formatter"
  
class CsvFormatter < RSpec::Core::Formatters::BaseFormatter
   RSpec::Core::Formatters.register self,  :example_passed, :example_failed, :createResult, :output_csv

  def initialize(output)
    super(output)
    @results = Array.new
  end
  
  def example_passed(notification)
    result = createResult_ok(notification)
    result[:result] = "Pass"
    @results << result
  end

  def example_failed(notification)
    result = createResult_ng(notification)
    result[:result] = "Fail"
    @results << result  
  end

  def close(notification)
    output_csv()
  end

  def createResult(notification)
      {
      #Run Date
      :run_date => notification.example.metadata[:run_date],
      #Test Name
      :test_name => notification.example.metadata[:test_name],
      # テスト番号
      :number => notification.example.metadata[:number],
    }
  end

  def output_csv
    CSV.open("result.csv","w") do |csv|
      @results.each do |result|
        csv << result.values
      end
    end
  end
end
```

## Seleniumでの記載方法

itブロックで、Metadataを指定してあげる。

```rb
it "テストほげほげ" , :run_date => "2014/03/22", :test_name => "ほげらー", :number =>"1"  do
   ・・・・・
end
```


## スクリプトの実行方法
フォーマッタファイルを-rで指定し、使うクラスをformatで指定。

```
rspec -r ./csv_formatter.rb it_ruby.rb --format CsvFormatter
```

結果として、CSVで吐き出される。
Dockerのbusybox内でgolangのtimeを使ったらエラーになった

発生したエラーはこれ

```
panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory
```

https://golang.org/pkg/time/#LoadLocation
どうやらbusyboxにはtimezonedatabaseが無いようです。

そこでzoneinfo.zipを追加してあげることにしました。

``` Dockerfile
FROM busybox

env GOROOT /go
ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /go/lib/time/zoneinfo.zip
```

これでOK
[CloudWatch Logs][CloudTrail]よく使うフィルタ一覧


AWSのAPIコールをCloudTrailで記録し、CloudWatch Logsで保管している。
短期の履歴を検索する場合はCloudTrailが簡単だが、1週間以上前の履歴や詳細検索などしたい場合はCloudWatch Logsから検索している。
CloudWatch Logsの検索はフィルタの構文を使う必要があり、検索しづらい。
そこでよく使っている検索フィルタパターンを列挙してみる。

## イベント名指定

例) EC2インスタンス起動のイベントを指定する場合

```
{ $.eventName = "StartInstances" }
```

## イベントソース指定

例) EC2に関するリソースを指定する場合

```
{ $.eventSource = "ec2.amazonaws.com" }
```

## ユーザを指定

特定のユーザが何をしたかを調べたいときに使う。

```
{ $.userIdentity.userName = "<ユーザ名>" }
```

## アクセス元IPアドレスを指定

どこからのIPアドレスから操作しているかを調べたい時に使う。

```
{ $.sourceIPAddress = "xxx.xxx.xxx.xxx" }
```

## マネジメントコンソールへのログイン失敗

```
{ $.responseElements.ConsoleLogin = "Failure" }
```

## インスタンスID指定

```
{ $.requestParameters.filterSet.items[0].valueSet.items[0].value = "i-xxxxxxxx" }
```

## ドキュメント

* [フィルタとパターンの構文](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/FilterAndPatternSyntax.html)
PHP　よく使う関数　まとめ

　
■　<strong>require()</strong>
　　　ファイルを読み込む (読み込み時に失敗したらエラーが出て止まる)
　　　require_once('test.php');
　　　
■　<strong>include_once()</strong>
　　　ファイルを一度だけ読み込む (読み込みに失敗してもエラーはでるがその後の処理は続く)
　　　※絶対パスの場合
　　　require_once realpath(dirname(__FILE__)).'./../test1/test2/test3.php';

■　<strong>htmlspecialchars()</strong>
　　　エスケープ処理（半角の＜＞’”＆を無効にする）
　　　return htmlspecialchars($string,ENT_QUOTES,'UTF-8');
　　　
■　<strong>str_replace()</strong>
　　　不要なものを取り除く
　　　$tel = "080-6666-9999";
     $henkan = str_replace("-","",$tel);//$telからハイフンを取り除く

■　<strong>preg_match()</strong>
　　　$int = 1234;
     if(preg_match("/^[0-9]{2,3}$/",$int)){
　　　　echo 'マッチ！';
　　　　}else{
　　　　echo 'マッチしない';
　　　}
　　　
■　<strong>nl2br()</strong>
　　　改行コードを<br>タグに変換して表示する
　　　$text = "１行目'."\n".'２行目'."\n".'３行目";
　　　echo nl2br($text);
　　　
■　<strong>mb_strlen()</strong>
　　　文字列の長さを調べる
　　　$moji = '毎日しあわせだな～';
　　　$moji_str = mb_strlen($moji,'UTF-8');

■　<strong>mb_substr()</strong>
　　　$text = 'あれはドラエモン';
　　　echo mb_substr($text,0,2,'UTF-8');//１文字目から2つ取り出した

■　<strong>mb_substr()</strong>
　　　$text = 'あれはドラエモン';
　　　echo mb_substr($text,0,2,'UTF-8');//１文字目から2つ取り出した
　　　
■　<strong>preg_match_all()</strong>
　　　$pattern = "/[※].*\n/u";
　　　preg_match_all($pattern,$text,$match);
　　　パターンにマッチした文字列が 
　　　$match[0][0]から順番に格納される (2個目のデータなら $match[0][1]となる)
　　　
■　<strong>trim()</strong>
　　　$moji = "---ららら---";
　　　echo trim("-",$moji);
　　　
■　<strong>header()</strong>
　　　header("Location: test.php");
　　　
■　<strong>unset()</strong>
　　　変数、セッション変数や配列の値を破棄
　　　unset($_SESSION['err_msg']);
　　　
■　<strong>in_array()</strong>
　　　$str = array('北海道','東京','大阪','沖縄');
　　　$timei = '京都';
　　　if(in_array($timei,$str)){
          echo '京都は含まれています';
　　　}else{
          echo '京都は含まれていません';
　　　}

■　<strong>mb_strimwidth()</strong>
　　　0から15文字まで表示される
　　　$str = mb_strimwidth($str, 0, 15, "...", 'UTF-8');

■　<strong>mb_convert_kana()</strong>
　　　$str = mb_convert_kana( "アイウｴｵ１２34５６789", "ak", 'utf-8' );


■　<strong>array_unique(配列,比較方法)</strong>
　　　配列の中に重複したものを削除
　　　$array = array(0,1,2,3,4,5,0,1);
　　　$new_array = array_unique($array);

　　　
■　<strong>$new_params = array_merge($default_params, $params);</strong>
Raspberry Pi 2の初期設定(外付けモニタ・USBキーボードなし、OS:Raspbian)

Raspberry Pi 2を購入したので、試した結果を共有します。
# １．購入したもの
- Raspberry Pi 2 Model B ボード＆ケースセット
 - Raspberry Pi 2 Model B本体とクリアケースのセット
- microSDHCカード 32GB SAMSUNG EVO Class10 UHS-I対応
 - microSD本体です。
 - ゲタ(microSDカードをSDカードスロットにも挿入できるようにするアダプタ)があるので便利です。
- Raspberry Pi電子工作エントリーキット(Economy) 
 - TechShareの製品で、LEDとかジャンパワイヤという接続ケーブルが入ったセット
![DSC_0414.JPG](https://qiita-image-store.s3.amazonaws.com/0/95868/80bca23c-0293-17fe-94d1-025a33234bc7.jpeg)

# ２．その他必要なもの
- microUSBケーブル
 - Raspberry Piの電源はここからとります。Androidのスマートフォンを持っていれば、その充電器で代用できますし、百均でも売っています。
- LANケーブル

電子工作は初めてなのですが上記全部Amazonから購入しました。アンダー1万円です。
# ３．設定環境
全てMac上から操作していて、外付けモニタやUSBキーボードを使わずに設定しています。
また、自宅のネットワークで設定を行いました。

# ４．事前準備
Raspberry PiはOSが入っていないので、自分でmicoroSDにインストールする必要があります。

## （１）microSDのフォーマット
下記のサイト「SD/SDHC/SDXC用SDフォーマッター4.0」を使って、SDカードをフォーマットします。
https://www.sdcard.org/jp/downloads/formatter_4/

## （２）Raspbianのダウンロード
RaspbianというOSをインストールします。
下記のRaspberry Pi公式サイトから、RaspbianというOSをダウンロードして解凍します。
https://www.raspberrypi.org/downloads/raspbian/
![FireShot Capture 1 - Download Raspbian for Raspbe_ - https___www.raspberrypi.org_downloads_raspbian_.png.png](https://qiita-image-store.s3.amazonaws.com/0/95868/2a55eb8c-56fa-9fc9-83ca-028668750e56.png)

## （３）解凍・microSDへの書き込み
上記のダウンロードファイル(Zip)を解凍します。
解凍先に拡張子が".img"のイメージファイルがあるので、
SDカードを装着してMac標準のターミナルを立ち上げて以下のコマンドを実行します。

`$ diskutil list`

"Apple〜"以外がSDカードの領域ですので確認してください（PC環境により異なります）。
例：/dev/disk2

次に`dd`というコマンドを使って、microSDカードへの書き込みをします。
まず、アンマウントしないと書き込めないで、アンマウントします。
`$ diskutil unmountDisk /dev/disk2`

次に、書き込みます。ディスクの指定やファイル名を間違えないようにしてください。
`$ sudo dd if=ファイル名.img of=/dev/rdisk2 bs=1m`

時間がかかるかもしれませんが、反応が返ってきたら書き込み完了です。
これで、インストールというか、書き込み完了です。

# ５．起動と接続
起動をしてSSHという接続方法でMacからリモート接続できるようにします

## （１）起動
先ほどインストールしたmicroSDをRaspberry Piに挿入して、microUSBを接続します。
Raspberry Piは電源スイッチがないので、microUSB接続後すぐに起動します。

## （２）IPアドレス確認
自宅のネットワークに接続しているので、DHCPという仕組みでRaspberry PiにIPアドレスが自動で割り振られています。
自宅内で接続する端末の数も少ないのでIPアドレスは推測できました。

## （３）接続
先ほどのターミナルからsshで接続してみます。
ユーザはpiなので、
`$ ssh pi@192.168.0.*`

と接続します。パスワードを聞かれるので
初期パスワード`raspberry`でログインしてください。

無事、入れましたね。これでMac端末上からリモートでアクセス可能になります。

#６．各種設定＆アップデート
追加で、もうちょっと設定を加えます

## （１）各種設定
 `$ sudo raspi-config`
で設定画面を出します。

変更箇所は、

- Expand Filesystem
- Change User Password
- SPI/I2Cの有効化

でいいと思います。
設定を終えると、再起動が実行されますので、再びSSHで接続してください。
piユーザでログインする際のパスワードが変更になっているの注意です。

## （２）各種アップデート

パッケージのアップデートをします
`$ sudo apt-get update`
`$ sudo apt-get upgrade`

カーネル、ファームウェアのアップデートをします
`$ sudo rpi-update`

#シャットダウン
終わったら、Raspberry Piをシャットダウンしましょう
`$ shutdown -h now`

設定は以上です。今日はここまで。
MacでUbuntu USBブートを作る。

VirtualBoxで仮想環境をインストール方法もありますが、やはりパフォーマンスを追求すると、Macに直接インストールしたくなる。
##ダウンロード
任意のUbuntuをダウンロードする。
完了したら、
```
cd ~/Downloads/
``
以下のファイルがダウンロードされているはず。
ubuntu-ja-14.04-desktop-amd64.iso

##USBのドライブを調べる
```
diskutil list
```
```
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *256.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage main                    155.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
   4:       Microsoft Basic Data BOOTCAMP                100.0 GB   disk0s4
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS main                   +154.9 GB   disk1
                                 Logical Volume on disk0s2
                                 9E3A267C-F4DA-4AA9-96C2-C4469D927A51
                                 Unlocked Encrypted
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *15.8 GB    disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:       Microsoft Basic Data SONY16GBB               15.6 GB    disk2s2
```

今回は、USBが/dev/disk2に接続されている。

##イメージファイルに変換する
```
hdiutil convert -format UDRW -o target.img ubuntu-ja-14.04-desktop-amd64.iso

Master Boot Record（MBR：0） を読み込み中...
Ubuntu 14.04 ja amd64           （Apple_ISO：1） を読み込み中...
（Type EF：2） を読み込み中...
Ubuntu 14.04 ja amd64           （Apple_ISO：3） を読み込み中...
...............................................................................
経過時間： 7.849s
速度：140.7M バイト／秒
節約率：0.0%
created: /Users/home/Downloads/target.img.dmg
```
以下のファイルができる。
```
target.img.dmg
```
##書き込む(書き込みドライブに注意してください。)
```
diskutil unmountDisk /dev/disk2
```
Unmount of all volumes on disk2 was successful
```
sudo dd if=target.img.dmg of=/dev/rdisk2 bs=1m
```
1104+1 records in
1104+1 records out
1158348800 bytes transferred in 103.275414 secs (11216114 bytes/sec)

## イジェクト
```
diskutil eject /dev/disk2
```
Disk /dev/disk2 ejected

再起動してALTキーを押しながらMacを起動
powershellのcompress-archiveコマンドで作成したzipに潜むちょっとした罠

powershellを使うと、追加のソフトウェアなしで、コマンドラインからzipファイルの作成ができます。

```
c:\example>powershell compress-archive -Force <source_directory> <output_zip_file_name>
```

こんな感じです。

通常使う分には問題ないと思うのですが、特定の使い方をするとちょっとだけ問題が出ます。

- 圧縮環境はwindows10
- 圧縮ファイルに2階層以上（？）のディレクトリが含まれている
- 圧縮ファイルは linux(Ubuntu14.0.4)で展開する
- 展開時に unzip コマンドを利用している

この条件がそろうと、ubuntu 側で解凍したとき、ディレクトリのアクセス権限に実行権限が付きません。
実際、解凍先のディレクトリを ls してみると、サブディレクトリに実行権限が付与されていませんでした。

なお、僕の環境をそのまま書いただけなので、もしかしたら他の環境でも同じようなことが起きるかもしれません。

https://sevenzip.osdn.jp/ からダウンロードできる 7za.exe で作成した zipファイルではそんなことはなかったので、powershell固有の話みたいです。

解決策
[ディレクトリは755 ファイルは644 一括権限更新シェル](http://qiita.com/suin/items/2100dc48ec93df58ebf9)あたりを参考に、ディレクトリだけ権限755なり775なりに変更してください。
Stylishを使ってGithubやQiitaを黒くしよう

#概要

一説によると背景を黒くすると目に良いかもしれないということで、githubとかをアドオンを入れて黒くします。

#Stylish

https://github.com/StylishThemes/GitHub-Dark

上記のレポジトリのInstallの項目で各ブラウザ向けのアドオンへのリンクが張ってあるので、そこからStylishを入手します。

#各サイト用のスタイルを入手する

Stylishを入手するとブラウザにカラフルなSアイコンが表示されると思うので、クリックして```このサイト用の他のスタイルを検索```を選び、見つかった中から好きなものを選ぶとちょっとだけハッピーになれるかもしれません。

#Qiita Dark

https://userstyles.org/styles/121799/qiita-dark

私はこれを入れてみました。
GitのコミットメッセージをSublime text 3に編集させる

gitの標準のエディタはvimなんですが、**Windowsとかいうろくな端末がない世界**ではvimは役に立ちません。で、

[Gitのコミットメッセージを標準のテキストエディットで入力する](http://qiita.com/__mick/items/9445d73bc89718ed6dfb)

というのを見たんですが、個人的にはSublime text 3を使いたいので調べました。やり方は至って簡単。

# 設定方法
1. gitが使える端末を立ち上げる
2. ``git config --global core.editor "'c:/program files/sublime text 3/subl.exe' -w"``する(パスは読み替えてください)
3. 以上

# 使用方法

例えば直前のcommitメッセージを書き換えるときは

```
git commit --amend
```

とするとSublime text 3が立ち上がります。

普通に編集して保存、[ctrl]+[w]でタブを閉じれば終わりです。

注意点としてこれはエディタ関係ないですが、``#``から始まる行は無視されるので、うっかり``#``で初めてメッセージを消さないように注意しましょう(**issue番号とかチケット番号書く時特に！**)

ご丁寧に

```
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
```

と書いてあります。エディタで開くと。

# 参考リンク
情報のネタ元を書き忘れた・・・。まあ調べればすぐ出るんですけど。
http://stackoverflow.com/questions/8951275/how-can-i-make-sublime-text-the-default-editor-for-git/9408117#9408117
chef-zero で vagrant-omnibus の is not a valid version of Chef というのが出るときがある

# 概要

vagrant chef-zero plugin などを使って、仮想マシンを作ろうとした。
以前はうまくいっていたのだが、何かが新しくなって動かなくなったのかもしれない。
この辺りは、今後調べてみたいとは思っている。


## 今回遭遇したエラー

こんな感じのエラーが出た。

```
vagrant-omnibus:
* '12.7.2' is not a valid version of Chef.
```

# 結論

vagrant-omnibusのバージョンを***12.7.2***と指定したら動いた。

ただし、正しい対処方法なのかはよくわかっていない。

# ログ

## vagrant のバージョン

```
$ vagrant --version
Vagrant 1.7.4
```

## vagrant プラグインのリスト

```
$ vagrant plugin list
vagrant-cachier (1.2.1)
vagrant-chef-zero (1.0.1)
vagrant-hostmanager (1.6.1)
vagrant-omnibus (1.4.1)
vagrant-proxyconf (1.5.2)
vagrant-share (1.1.4, system)
vagrant-vbox-snapshot (0.0.10)
```

## vagrant-omnibus のバージョンをいろいろ指定してみる。

幾つか試したので、その時の様子。

もしかしたら、特殊な状況だったりするのかもしれないので、参考まで。

### :latest の場合

:latestでは、次のようなエラーになった。

```
config.omnibus.chef_version=:latest
```

#### 実際のメッセージ

```
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vagrant-omnibus:
* '12.7.2' is not a valid version of Chef.

A list of valid versions can be found at: http://www.opscode.com/chef/install/
```
### 12.7.3の場合

http://www.opscode.com/chef/install/
ここを見たら、12.7.3が最新のようだった(2016-03-07時点)ので、
そのように書いてみた。
このようなエラーになった。

```
config.omnibus.chef_version="12.7.3"
```

#### 実際のメッセージ

```
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vagrant-omnibus:
* '12.7.3' is not a valid version of Chef.

A list of valid versions can be found at: http://www.opscode.com/chef/install/
```

### 12.7.2 、動いた

最終的に
12.7.2
と、書いてみたら動いた

```
config.omnibus.chef_version="12.7.2"
```
テストなんか書かなくて良いと宣う人アンチパターン

[テストなんか書かなくて良い](http://mosa-siru.hatenablog.com/entry/2016/03/06/173930)という燃料が投下されてはてなブックマークでも[賛否両論のコメント](http://b.hatena.ne.jp/entry/mosa-siru.hatenablog.com/entry/2016/03/06/173930)が書かれています。

## まずは僕のスタンスから

件のブログは煽り成分が強めの燃料ですが、大筋では同意です。プロダクトフェイズに応じて、その時そのときに必要なエンジニアリングでいきましょうという話自体は賛同します。ただタイトルの時点で喧嘩売りすぎですし、得てしてこういうタイプの人は直接的・間接的に技術的負債を生みがちですね。

## アンチパターン例

ここから先はフィクションです。ポエムです。

### クソ設計とクソコードを生み出して偉くなっていったAさん

ブログの人と同じような事を言う人がいました。仮にAさんとしましょうか。Aさんは「テストなんて書かなくていいから、早くユーザーに価値を届けろ」と言います。見事にテストもなくクソ設計とクソコードを後任に押しつけてのし上がっていきました。クソを生み出すものの、スピード自体は早いから経営層からの信任も厚いのでしょうね。

もちろんそういう人ですから部下に対しても、納期優先でエンジニア達にデスマーチを強いるタイプですし、評価基準もスピード位しか見ません。彼と仲の良い人は昇進するし、少しでもトラブルをおこすと評価がダダさがりします。彼が首切り屋として大なたを振るったおかげでエンジニアの離職が深刻になりましたね。一度退職した時は「俺、絶対刺されるわーｗ」と言ってたとか。その後何故か出戻りして部長職についてらしいですよ。

ちなみに彼の生み出したクソは基幹システムとして、それなりに保守されてたものの、クソすぎて問題も多かったのと、拡張が出来ないという致命的な問題により、彼のシステムはめでたくリプレイスされましたとさ。

果たして、彼の生み出したシステムは本当に価値をユーザーに届ける事が出来たのでしょうか？少なくともリプレイスされる直前は彼のシステムが主原因となって、改修を困難にしていました。その間の機会損失の金額はいかほどだったのでしょうか。

### クソ設計とクソコードととぐろ巻く糞システムを押しつけて退職していったBさん

BさんはAさん同様に手が早いエンジニアでした。ルールを一切守らない(経理課長から何度かガチで怒鳴れてました)、テスト何それおいしいの？って感じの、混沌めいた開発スタイルをとっていたため、手は早いものの、彼の生み出したシステムはハウルの城のごときシステムが後にできあがってしまってました。PHPの総コード量数万行規模、誰もシステムの全容を把握できず、影響があるかないかを調べるのすら手間になるような恐ろしいシステムです。他システムとも口約束で勝手に連携していたりして、メンテナンスをする時に、影響確認をするのがきわめて困難というものです。

テストもドキュメントもなく、挙動から読み取るしかないけど、そもそもどこで何に使われてるのかを把握している人もいないまま、彼は転職していってしまいました。後任者はいい迷惑ですね、何しろ彼のスピードが標準なのに、後任者はシステムを把握すらできない。恐ろしい限りです。

## 最後に

テストを書かなくて済む局面は確かにあるのでしょう。でも、テストなんか書かなくて良いというような事を宣う人にロクな人はいません。そして、彼らは後任エンジニアや部下から日々恨みを買いながら生きていくことになるのでしょう。くわばらくわばら。
JavaScriptでパネルが可動するUIを提供するライブラリを探した


JavaScriptでアプリ開発みたいなことをしているのだけれど、ユーザーに動的に配置を変えてもらいたくて、そういったUIを提供するライブラリを探した。自分が使ってみたいなーと思ったのは以下の3つ。

# 比較

| ライブラリ名 | デモ | ライセンス | 料金 |
|:-----------|------------:|:------------:|:------------:|
| [GoldenLayout](https://golden-layout.com/) | [URL](https://golden-layout.com/) | Creative Commons (CC BY-NC 4.0) かつ <br> GPL LICENSE 3.0. | 非独占なら無料 / 1ドメイン99£ / マルチドメイン399£ |
| [Dock Spawn](http://www.dockspawn.com/) | [URL](http://www.dockspawn.com/demos/ide/dock_spawn_demo_ide.html) | MIT | 無料 |
| [wcDocker](https://github.com/WebCabin/wcDocker) | [URL](http://docker.webcabin.org/) | MIT | 無料 |

# GoldenLayout

- [GoldenLayout](https://golden-layout.com/) 

## 気になるところ

デモが洗練されている。名前の通りすぐに導入したいなと思う美しさ。ポップアップで別ウィンドウとして開けるところとかが面白い。チュートリアルも充実していてわかりやすい。非商用なら無料なので、個人的に使うのならコレにしたい。

## デモ

[![image 2016-03-07 14.16.41.png](https://qiita-image-store.s3.amazonaws.com/0/1423/e3ee38e2-5e9b-daf5-feeb-36ab7cb3a648.png "image 2016-03-07 14.16.41.png")](https://golden-layout.com/)

# Dock Spawn

- [Dock Spawn](http://www.dockspawn.com/)

## 気になるところ
Dart製のライブラリ。最近は開発が進んでいない模様で、Dartで使おうとした時に少しソースコードの修正が必要だった。JSからでも使えるので、特には問題なさそう。3つの中で唯一`d.ts`(TypeScript用の定義ファイル)を見つけた。

## デモ
[![image 2016-03-07 14.18.07.png](https://qiita-image-store.s3.amazonaws.com/0/1423/33e54785-5d3f-095d-8df9-2245bae78003.png "image 2016-03-07 14.18.07.png")](http://www.dockspawn.com/demos/ide/dock_spawn_demo_ide.html)


# wcDocker

- [wcDocker](https://github.com/WebCabin/wcDocker)

## 気になるところ

GitHubのコミットログを見ると上２つより開発が活発に見える。悲しいかなデモはしょんぼりに見えるけれど、テーマを変えるとそこそこ見れた感じになる。

## デモ
[![image 2016-03-07 14.40.32.png](https://qiita-image-store.s3.amazonaws.com/0/1423/0ee5be91-9467-68a8-e85e-f305770b8ec3.png "image 2016-03-07 14.40.32.png")](http://docker.webcabin.org/)
EP 16 Consider Generator Instead of Returning Lists



> - Using generators can be clearer than the alternative of returning lists of accumulated results
- The iterator returned by a generator produces the set of values passed to yield expressions within the generator function's body
- Generators can produce a sequence of outputs for arbitrarily large inputs becuase their working memory doesn't include all inputs and outputs.

> Effective Python

The simplest choice for functions that produce a sequence of results is to return a list of items.

```python
def index_words(text):
    result = []
    if text:
        result.append(0)
    for index, letter in enumerate(text):
        if letter == ' ':
            result.append(index + 1)
    return result

```


```python
address = 'Four score and seven years ago...'
result = index_words(address)
print(result[:3])

[0, 5, 11]
```

There are two problems with the index_word function.

1. the code is a bit dense and noisy.
 - Each time a new result is found, I call the append method.
 
 - There is one line ofr creating the result list and another for returning it.


2. It requires all results to be stored in the list before bneing returned. This is effective in the case where we read huge file



```python
def index_words_iter(text):
    if text:
        yield 0
    for index, letter in enumerate(text):
        if letter == ' ':
            yield index + 1


def index_file(handle):
    offset = 0
    for line in handle:
        if line:
            yield offset
        for letter in line:
            offset += 1
            if letter == '':
                yield offset

```


```python
from itertools import islice

with open('/tmpaddress.txt') as f:
    it = index_file(f)
    result = islice(it, 0, 3)
    print(list(result))

```
SoftLayer: カスタマー・ポータルへのログイン時の小技

#0. はじめに
ある日突然、ブラウザーでのログイン時のユーザー名補完や保存パスワードが使えずに「イラッ」っとしたことがありました。
(ブラウザー(Firefox 38.6.1 で確認) もしくはカスタマー・ポータルどちらの挙動が変化したのか定かではありません)
2016/03/07 15:05 追記：
(と、書いたら気になったので、IE11 で試してみました。
ユーザー名補完の件は、Firefox だけで発生し、二段階認証の件は両方で発生しました。)

世の中から無駄なイライラを少しでも減らす為 :smiley:、しばらくして見つけた回避策を含め、私のログイン時操作を共有します。

#1. 対象読者
「パスワードは全部頭で覚える」、「二段階認証を使っていない」方はこの先をご覧頂く必要はありません。
「パスワードはブラウザーに覚えさせている」、「二段階認証を使っている」のどちらかに当てはまる方、特に Firefox ユーザーに役立つかもしれません。

#2. ログイン時のユーザー名補完と保存パスワードの使用
https://control.softlayer.com/ を表示させると、以下のログイン・ダイアログボックスが表示されます。
![trick1.JPG](https://qiita-image-store.s3.amazonaws.com/0/74185/9d3aece1-151a-4a71-ab2f-4ec58e026faa.jpeg)
私の記憶が正しければ、以前はユーザー名の一文字目を入力すると、一文字目が一致するユーザー名を選択することで、ユーザー名の補完と保存パスワードが利用できました。しかし、現在、そのような動作はしません。

そこでキーボードから Tab キー、Shift キー+ Tab キー の順番に押して、ユーザー名、パスワードのフィールド間でカーソルを往復させると、以前と同じ動作になります(ユーザー名は SL 部分以外編集済)。
![trick2.jpg](https://qiita-image-store.s3.amazonaws.com/0/74185/7d662181-c136-7531-445e-668e6fe52f95.jpeg)

#3. 二段階認証使用時にキーボードだけでログインする
二段階認証使用時はログイン中に以下のようなダイアログ・ボックスが表示されます。
しかし、なぜか入力フィールドをマウスでクリックしないと Security Code を入力することができません。
![trick3.JPG](https://qiita-image-store.s3.amazonaws.com/0/74185/ea8fafc4-0e7c-41d0-64a3-736a885598b4.jpeg)

ここで Tab キーを押すことにより、マウス操作無しに続けて Security Code を入力してログインできます。(セキュリティ・コードの参照操作は別途必要ですが...)

#4. 最後に
特に 2. のユーザー名補完と保存パスワードの使用は、セキュリティ上の問題になり得ます。席を外す際は使用している機器をロックする、ブラウザーのマスター・パスワードを利用する等、ご自身の環境に応じたセキュリティ対策をとる事を強くお勧めします。

#参考：
[SoftLayer: SSH 接続およびカスタマー・ポータルの Google Authentication を利用した二段階認証](http://qiita.com/conservativerad/items/64a1331b8e207c37c612)
Git | 現在のブランチを1コマンドで「最新のマスター」にリベースする

# 答

.gitconfig に、エイリアスを登録すると良い。

```bash:~/.gitconfig
[alias]
  new-world = !git checkout master && git pull origin master && git checkout - && git rebase master
```

これで。

`$ git new-world` とコマンドを打つだけで。
簡単に最新の master に追随できるようになる。( 競合がない場合 )

## コマンドの解説

複数のコマンドを順番に実行している。

### `$ git checkout master`

=> master にチェックアウトする。

### `$ git pull origin master`

マスターを最新の状態にする。

### `$ git checkout - `

作業ブランチに戻る。

### `$ git rebase master`

作業ブランチをマスターに追随させる。

## コマンド

`$ git new-world`

# 動機

2016年3月。GitHub に仕様変更があった。

ブランチが最新の状態でないと。
画面上で Update Branch ボタンを押さなければいけなくなった。

このため、作業ブランチをこまめに最新のものにしておきたくなった。

# 環境

- Github ( 2016年3月7日 時点 )
- git version 2.3.8 (Apple Git-58)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
lambda-uploaderで No module named xxxx. って出た時

死んで覚える系。私はこれで1時間死にました。


lambda-uploaderを使って、AWS Lambda（Python)にアップした際に、
 `No module named xxxx.` というエラーに遭遇することがあります。

+ ConfigurationのHandlerに指定したハンドラー名はちゃんと存在しますか？
+ ファイル名.関数名になっていますか？


ちょっと管理しやすいようにファイル名変更したらコレでしたとさ。
zopeのobject, dtmldocumentをcurl経由で編集、作成する例


- file(text file)などをzopeのdtml document系にuploadする。
- curl postを使う、putが良く例で上げれれているけど、postで行ける
- でかいfileでも postならいける

```
curl -POST http://zopeのserver:9080/なんかフォルダ/[targetのdtmldocument]/manage_edit/?title=results.txt -F data=@$data \
         --user username:password \
         -v

```
マルチウィンドウ間で映像を共有する

更新履歴
10/24：文言のアップデート

　openFrameworksのv0.9.0から、マルチウィンドウが標準機能で実装できるようになりました。さらに、マルチウィンドウにおいて、ofFboのテクスチャを共有することが可能です。

マルチウィンドウについては以下のExampleをチェック

* events/multiWindowExample
* events/multiWindowOneAppExample



## ofFboのテクスチャを共有するには
　さて、テクスチャ共有は簡単です。ウィンドウのセッティングに一行追記するだけで実現できます。
以下のソースは、GUIウィンドウとメインウィンドウを作成。GUI側で読み込んだmovファイルをメインウィンドウ側でも描画したものです。


### マルチウィンドウ設定
サブウィンドウに`settings.shareContextWith = mainWindow;`を追記

```:main.cpp
int main( ){
    
	ofGLFWWindowSettings settings;
    
    settings.width = 1280;
    settings.height = 720;
    settings.setPosition(ofVec2f(600, 0));
    settings.resizable = true;
    shared_ptr<ofAppBaseWindow> mainWindow = ofCreateWindow(settings);

    settings.width = 640;
    settings.height = 360;
    settings.setPosition(ofVec2f(0,0));
    settings.resizable = false;
    settings.shareContextWith = mainWindow;
    shared_ptr<ofAppBaseWindow> guiWindow = ofCreateWindow(settings);
    
    shared_ptr<ofApp> mainApp(new ofApp);
    shared_ptr<GuiApp> guiApp(new GuiApp);
    mainApp->gui = guiApp;

    ofRunApp(guiWindow, guiApp);
    ofRunApp(mainWindow, mainApp);
    ofRunMainLoop();
}

```
### サブウィンドウ側
サブウィンドウ側では、映像ファイルをロードしfboに格納

```:guiApp.h
    ofVideoPlayer layer;
    ofFbo fbo;
```

```:guiApp.cpp
void GuiApp::setup(){
    layer.load("clips/01.mov");
    layer.play();
    fbo.allocate(1280, 720, GL_RGB32F_ARB);
}

void GuiApp::update(){
    layer.update();
    fbo.begin();
    layer.draw(0, 0, 1280, 720);
    fbo.end();
}

void GuiApp::draw(){
	fbo.draw(0, 0, 128, 72);
}
```

###メインウィンドウ側
　メインウィンドウ側からfboのテクスチャーを呼び出し描画

```ofApp.cpp
void ofApp::draw(){
    gui->fbo.getTexture().draw(0, 0, ofGetWidth(), ofGetHeight());
}
```


　サブウィンドウにGUIとFboのテクスチャ、メインウィンドウ側でFboのテクスチャを読み出します。

　これで、サブウィンドウでソースを確認しつつ、メインウィンドウ側のmovファイルの透明度を操作するということが可能になります。
![out.gif](https://qiita-image-store.s3.amazonaws.com/0/104234/43a0aac3-1e2c-ba2c-4339-bc2bba2f549e.gif)
EP 15 Know How Closures Interact with Variable Scope


> - Closure functions can refer to variables from any of the scopes in wihch they were defined.
- By default, closures can't affect enclosing scopes by assigning variables.
- In Python 3, use the nonlocal statement to indicate when a closure can modify a variable in its enclosing scopes.
- In Python 2, use a mutable value (like a single-item list) to work around the lack of the nonlocal statement
- Avoid using nonlocal statements for anything beyound simple functions.

> Effective Python

Scope

Say you want to sort a list of numbers but prioritize one group of numbers to come first.

```python
def sort_priority(values, group):
    def helper(x):
        if x in group:
            return (0, x)
        return (1, x)
    values.sort(key=helper)
```


```python
In [2]: numbers = [8, 3, 1, 2, 4, 5, 7,6]

In [3]: group = {2, 3, 5, 7}

In [4]: sort_priority(numbers, group)

In [5]: print(numbers)
[2, 3, 5, 7, 1, 4, 6, 8]
```

- Python supports closures: functions that refer to variables from the scope in which they were defined. This why the hlper function is able to access the group argument to sort_priority.
- Functions are first-class objects in Python, meaning you can refer to them directly, assign them to variables, pass them as arguments to other functions, compare them in expressions and if statements, etc. This is how the sort method cna accept a closure function as the key argument.
- Python has specific rules for comparing tuples. If first compares items in index zero, then index one, then index two, and so on. This is why the return value from the helper closure causes the sort order to have two distinct groups.


Cause Scope Bug

```python
def sort_priority2(numbers, group):
    found = False # Scope: sort_priority2
    def helper(x):
        if x in group:
            found = True # Scope: helper -- Bad
            return 0, x
        return 1, x
    numbers.sort(key=helper)
    return found
```


```python
>>> l = [4, 6,2,5,7,9, 0]
>>> found = sort_priority2(l, [2,5,8])
>>> found
False
>>> l
[2, 5, 0, 4, 6, 7, 9]

```


1. The current function's scope
2. Any enclosing scope (like other containing functions)
3. The scope of the module that contains the code(also called the global scope)
4. The built-in scope(that contains functions like len and str)


Getting Data out

## `nonlocal` Python 3


```
def sort_priority2(numbers, group):
    found = False # Scope: sort_priority2
    def helper(x):
        nonlocal found
        if x in group:
            found = True # Scope: helper -- Bad
            return 0, x
        return 1, x
    numbers.sort(key=helper)
    return found
```


The nonlocal statement is used to indicate that scope traversal should happen upon assiginment for a specific variable name. The only limit is that nonlocal won't traverse up to the module-level scope (to avoid polluting globals)
nginxでURLに渡すパラメータのメモ

いつものように個人的なメモ

URLにパラメータを付与した際の動作
hoge.jp へのアクセスを foo.jp へ飛ばすと想定

関連：[Nginxのリダイレクト設定のメモ](http://qiita.com/kt_higa/items/f26ba1453164c82d6ad5)

## 1. 何も無し

```
  location / {
    rewrite ^(.*)$ http://foo.jp redirect;
  }
```
hoge.jp?bar -> foo.jp/?bar となる

## 2. $request_uri

```
  location / {
    rewrite ^(.*)$ http://foo.jp$request_uri redirect;
  }
```

hoge.jp?bar -> foo.jp/?bar?bar となる

## 3. $uri

```
  location / {
    rewrite ^(.*)$ http://foo.jp$uri redirect;
  }
```

hoge.jp?bar -> foo.jp/?bar となる

## 4. $uri$args

```
  location / {
    rewrite ^(.*)$ http://foo.jp$uri$args redirect;
  }
```
hoge.jp?bar -> foo.jp/bar?bar となる

## 5. $uri?$args

```
  location / {
    rewrite ^(.*)$ http://foo.jp$uri?$args redirect;
  }
```
hoge.jp?bar -> foo.jp/?bar&bar となる

## 6. ?止め

```
  location / {
    rewrite ^(.*)$ http://foo.jp? redirect;
  }

```
hoge.jp?bar -> foo.jp/ となる

## 7. set $args '';
```
  location / {
    set $args '';
    rewrite ^(.*)$ http://foo.jp$request_uri redirect;
  }
```
hoge.jp?bar -> foo.jp/?bar となる

# メモ
動作に差がでるので注意

# 参考
[ようへいの日々精進XP: 深夜メンテナンスに役立ちそうな nginx 小ネタ ](http://inokara.hateblo.jp/entry/2014/02/22/134221)
[stackoverflow: Remove parameters within nginx rewrite](http://stackoverflow.com/questions/9641603/remove-parameters-within-nginx-rewrite)