OmniAICreator/Qiita-1.07M huggingface dataset:
SQLアンチパターン：インプリシットカラム(暗黙の列)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- タイプ数を減らす
  - select の指定にタイプ数を減らしたいために「*」を使う

# アンチパターン

- ショートカットの罠に陥る
- 「*」を使うと多くの列をフェッチするようになるのでパフォーマンスに影響が出ることがある

## 用いてもいいパターン

- 1回しか使用しないSQL

# 解決策

- 列名を明示的に指定しよう
  - 明示的に指定することでエラーや混乱が少なくなる
  - 不要なデータを取得しなくなる
  - YAGNI（ You Ain’t Gonna Need it ）

# まとめ

必要な列だけを指定するようにしましょう。

# 感想

Rails を使い出すと、明示的に指定することが減るけれど、指定した方がいいんだろうなあ、と思いつつしていない

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
WhalebrewでパッケージをDockerイメージで管理する

# Whalebrewとは？

> Homebrew, but with Docker images
> [bfirsh/whalebrew: Homebrew, but with Docker images](https://github.com/bfirsh/whalebrew)

とある通り、Homebrewのようなパッケージ管理ツールです。
Golangで書かれています。
Homebrewはコマンドをネイティブにインストールするのに対し、
Whalebrewではコマンドを含むDockerイメージを落として来て、コマンドを実行するとDockerコンテナが立ち上がって実行します。
Dockerイメージパッケージ管理ツールみたいなイメージですかね？(混乱)

コマンドをインストールする際に依存するパッケージをインストールしまくるという煩わしさから解放され、環境を汚さないで良いという嬉しさあります。

イケてる感じがしますね。

# 環境を整える

何はともあれDockerを使用するのだからDockerの環境が必要です。

以降、Mac向けに説明していきます。

## Docker を install する

* [Get started with Docker for Mac - Docker](https://docs.docker.com/docker-for-mac/)

Docker for Macを使いましょう。

## Whalebrew を install する

```
curl -L "https://github.com/bfirsh/whalebrew/releases/download/0.0.4/whalebrew-$(uname -s)-$(uname -m)" -o /usr/local/bin/whalebrew; chmod +x /usr/local/bin/whalebrew
```

README に書いているまま、楽ですね。

# 試してみる

## どんなパッケージがあるのか調べる

```
whalebrew search [TERM]
```

で検索することができます。
TERMを省略すると全てのパッケージを表示してくれるらしい。

## whalesay コマンド

```
$ whalebrew install whalebrew/whalesay
Unable to find image 'whalebrew/whalesay' locally
Using default tag: latest
latest: Pulling from whalebrew/whalesay
0a8490d0dfd3: Pull complete
9ea6bd635aac: Pull complete
a316b39d5e68: Pull complete
f8547c673373: Pull complete
Digest: sha256:817f551e81a73da066ed9d2ff4e1b9359a11aa87502d71116d15687da950582b
Status: Downloaded newer image for whalebrew/whalesay:latest
🐳  Installed whalebrew/whalesay to /usr/local/bin/whalesay
```

クジラのemojiが可愛いですね。

```
$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
whalebrew/whalesay   latest              7d7121620799        2 weeks ago         46 MB
```

確かにDockerイメージがDLされているようです。

```
$ whalesay hello world
 _____________
< hello world >
 -------------
    \
     \
      \
                    ##         .
              ## ## ##        ==
           ## ## ## ## ##    ===
       /"""""""""""""""""\___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
       \______ o           __/
         \    \         __/
          \____\_______/
```

やったぜ。

## awscli

```
$ whalebrew install whalebrew/awscli
```

ちょっとどこを参照しているのか見てみましょう。

```
$ which aws
/usr/local/bin/aws

$ cat /usr/local/bin/aws
#!/usr/bin/env whalebrew
environment:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_DEFAULT_REGION
image: whalebrew/awscli
```

実行するイメージ、コンテナに渡してくれる環境変数がYAMLで記述されています。
これらの環境変数を渡してあげれば動いてくれるようですね。
詳しくは https://github.com/bfirsh/whalebrew#how-it-works を参照すると良いかと思います。

環境変数を設定して、実行してみます。

```
$ AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxx\
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\
AWS_DEFAULT_REGION=ap-northeast-1\
aws s3 ls s3://static.xxxx-sandbox.xxxxx.jp/
                           PRE assets/
                           PRE images/
```

いい感じですね。

# 所感

結構いい感じです。
どんどん対応するツールが出てくると嬉しいですね。
Jupyter / matplotlib > y軸の範囲を設定する > ax1.set_ylim(0, 0.2)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

Jupyterにて作図している時に、y軸方向を２つのグラフで合わせたかった。

ylimを使うだろうと思ったが、そのAPIがすぐに出てこなかった。

set_ylim()を使って以下でできた。
参考 http://stackoverflow.com/questions/41990104/matplotlib-inline-rescale-figure-after-xlim-ylim-on-hist2d-plot

### code

```py:check_result_170215.ipynb
%matplotlib inline

# Feb. 16, 2017

import numpy as np
import matplotlib.pyplot as plt

data1 = np.loadtxt('res.learn.170215', delimiter=',')
# data1 = np.loadtxt('res.learn.N=1000_170216', delimiter=',')
data2 = np.loadtxt('res.learn.N=1000_dropout@output_170218', delimiter=',')

input1 = data1[:,0]
output1 = data1[:,1]
input2 = data2[:,0]
output2 = data2[:,1]

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

ax1.scatter(input1,output1)
ax2.scatter(input2,output2)


ax1.set_xlabel('step')
ax1.set_ylabel('Error')
ax1.set_ylim(0, 0.2)
ax1.grid(True)

ax2.set_xlabel('step')
ax2.set_ylabel('Error')
ax2.set_ylim(0, 0.2)
ax2.grid(True)

fig.show()
```

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c54b6dfb-d0fb-4068-10b5-30c96f68e5a3.png)

上のグラフはdropoutなしで7x7x7のhidden layerでのNeural Network学習結果。
下のグラフはoutput layerだけdropoutを設定した場合。
改善はほとんど見られない。


<!--
### 検索用キーワード

ylimで検索しても結果に出てこなかったと思うので

- ylim
- ylim()
-->
GitHubに自作yumリポジトリを公開する方法

# GitHubに自作yumリポジトリを公開する方法

## 概要

自作したRPMパッケージをGitHubに公開することで保守・管理が容易になると思った。

## 1. 環境

- CentOS6.x
- GitHubアカウント取得済

## 2. 手順の概要

1. createrepoのインストール
2. GitHub上にリポジトリの作成
3. yumリポジトリ用ディレクトリの作成
4. yumリポジトリの作成
5. repoファイルの作成
6. 動作確認

## 3. 詳細手順

#### 1. createrepoのインストール

```shell-session
# yum install createrepo
```

#### 2. GitHub上にリポジトリの作成

```
GitHub上にリポジトリを作成する
```

#### 3. yumリポジトリ用ディレクトリの作成

```shell-session
# git clone <作成したリポジトリのURL>
```

#### 4. yumリポジトリの作成

ここでは rpm.repo がリポジトリ名とする

```shell-session
# mkdir -p rpm.repo/el6/
# cp -p *rpm rpm.repo/el6/
# createrepo rpm.repo/el6/
# git push origin master
```

##### 5. repoファイル作成

```shell-session
# vi /etc/yum.repos.d/<リポジトリ名(任意)>.repo
```

以下とした

```bash
[<リポジトリID任意)]
name=リポジトリ名(任意)
baseurl=https://github.com/<GitHubアカウント名>/rpm.repo/raw/master/el6/
enabled=1
gpgcheck=0
```

#### 6. 動作確認

```shell-session
# yum clean all
# yum repolist
```

以下を確認

* 作成したリポジトリID、リポジトリ名が表示されること  
* 状態にリポジトリに含めたRPMパッケージ数が表示されること
RiotのカスタムタグにJSONを渡す

Riotのタグに値を渡すにはいくつかの方法がありますが、JSONを渡そうとして少し引っかかりました。

# おことわり
あらかじめコメントしますが、本来あまりよろしくない使い方だ、というのはよく承知しています。できれば、別な手段を使ってください。

# Riotへの値の渡し方
Riotのタグに必要な値を供給するには、大きく分けて3つの方法があります。

0. タグ内部に書いたコードから（APIなどを叩いて）直接取ってくる
1. RiotをマウントしたJavaScriptコードから、タグインスタンスに値を直接渡す
2. タグに属性として書いておく

なお、カスタムタグ同士をネストする場合は、`attr={value}`のように書けば、JavaScriptの変数として値も渡されるようになっています。

# 外側から渡そうとして失敗
PHPで書いていた周辺のプログラムとの関係もあって、カスタムタグの引数にJSONを渡したくなりました。ところが、受け取ったデータは渡したものといても似つかぬものとなっていました。

## JSONで渡せる値の種類
JSONには、以下の種類の値があります。

* 文字列（`"String"`）
* 数値（`5.8`）
* `true`・`false`・`null`
* 配列（`[]`）
* 連想配列（`{}`）

Riotに渡したときにうまく動かなくなったのは、連想配列でした。

## 原因が判明
Riot.jsには、条件のかかるクラス名を`class={foo: true, bar: false}`のような形で簡潔に書けるようにする[構文があります](http://riotjs.com/ja/guide/#section-1)が、これが外部から渡したJSONにも効いてしまった、というのが真相でした。

とりあえず、外から渡すときに余計な文字を先頭に追加して中カッコのパースを避けて、それからタグ内で余計な文字を除去して`JSON.parse`とすることで、回避はできるようになりました。
GradleでローカルのMavenアーティファクトを参照する

# GradleでローカルのMavenアーティファクトを参照する

ソースは公開されているものの、アーティファクトが公開リポジトリに登録されていないMavenアーティファクトをGradleで依存関係に設定する方法を検討する。

- 例）AzureのNotificationHub: [Azure/azure-notificationhubs-java-backend](https://github.com/Azure/azure-notificationhubs-java-backend)
  - groupId - `com.windowsazure`
  - artifactId - `NotificationHubs`
  - version - `0.0.4`

- 利用すべき方法
  - 外部依存のないプレーンなjar -> 方法１
  - 外部依存なしのMaven jar -> 方法2/3
  - 外部依存ありのMaven jar -> 方法3

## 方法1 - files

- プロジェクト構成

```
- gradle-project
  - build.gradle
  - lib
    - NotificationHubs-0.0.4.jar
```

```groovy:build.gradle
dependencies {
    compile files ('lib/NotificationHubs-0.0.4.jar') // ファイルパスで指定する
}
```

### 問題点

- 外部のモジュール参照を行っていないjarファイルに限定される。
  - jarファイルがMavenアーティファクトの場合、`files`で指定したモジュールが利用している依存関係が解決されない。実行時にランタイムエラーとなる。
    - jarのソースファイルが参照できる場合は、対象のMavenアーティファクトを`assemby`か`shade`Mavenプラグインでfat jarにすればいい。

## 方法2 - repositories flatDir

- プロジェクト構成
  - 方法1と変わらず

```groovy:build.gradle
repositories {
    flatDir {
        dirs "lib" // このファオルダに置いたjarを通常のdependencies表記で参照できる
    }
}

dependencies {
    compile('com.windowsazure:NotificationHubs:0.0.4') // groupId/artifactId/version
}
```
- `NotificationHubs`が持つ外部依存が解決されていない。コンパイルはできても実行時にクラスが見つからなくてエラーになる。

![NotificationHubsの依存先が出てこない](https://qiita-image-store.s3.amazonaws.com/0/59517/71ab9ed6-5bb5-875b-01bb-33ffe7705bb1.png)

### 問題点

- 方法1と同様に、参照したモジュールが更に外部依存を持っている場合、依存関係が解決されない。
- マルチプロジェクトでの利用は注意
  - 参照されるサブプロジェクトで自身の`lib`を指定した`flatDir`を定義すると、参照を行ったサブプロジェクトは自身の`lib`を参照してしまい依存関係の解決に失敗する
    - [GRADLE-1940 Unresolved dependencies when project A depends on project B and A does not have a reference to the repository used by B](https://issues.gradle.org/browse/GRADLE-1940)
  - ルートプロジェクトに`lib`を配置し、サブプロジェクトではルートプロジェクトの`lib`を必ず参照するようにする。

```groovy:build.gradle
subprojects {
    repositories {
        flatDir {
            dirs "${rootProject.projectDir}/lib"
        }
    }
}
```

## 方法3 repositories maven (Maven ローカルフォルダ構成)

- プロジェクト構成
  - Mavenのローカルリポジトリのフォルダ構成を利用する

```
- gradle-project
  - build.gradle
  - lib
    - com
      - windowsazure
        -  NotificationHubs
          -  0.0.4
            - NotificationHubs-0.0.4.jar
            - NotificationHubs-0.0.4.pom
```

```groovy:build.gradle
repositories {
    maven {
        url "lib"
    }
}

dependencies {
    compile('com.windowsazure:NotificationHubs:0.0.4') // groupId/artifactId/version
}
```

- `NotificationHubs`が持つ外部依存が解決されている。

![NotificationHubsの依存先があり全然に利用できる](https://qiita-image-store.s3.amazonaws.com/0/59517/744bcccb-d16e-bd85-8565-3a244aebc009.png)


### 問題点

- マルチプロジェクト構成においては、方法2と同様の問題があるので注意。
MySQLでCSV出力しようとしたら --secure-file-priv option のエラーになった


## エラー内容
下記コマンドでCSVファイルを出力しようとした。

```
SELECT *
  FROM table
  INTO OUTFILE '/tmp/file.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
;
```

そうしたら次のエラー内容が出力された。

```
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```

secure-file-priv optionという、データの入出力を制限するオプションのエラー。

## 解決策 (Mac OS X)
取りあえずどういう設定がされているのかを確認。

```
mysql> SELECT @@global.secure_file_priv;

+---------------------------+
| @@global.secure_file_priv |
+---------------------------+
| NULL                      |
+---------------------------+
```

ここがNULLのせいのよう。
この設定をmy.cnfで調整する。

### my.cnfが読み込まれる場所を確認

```
$ mysql --help | grep my.cnf

order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
```

/usr/local/etc/my.cnf に設定ファイルを置くことにする。

### Homebrewで入れたMySQLのmy-xxx.cnfの場所を確認

```
$ find /usr/local/Cellar/mysql -name "my*.cnf"

/usr/local/Cellar/mysql/5.7.17/support-files/my-default.cnf
```

### 設定ファイルをコピー
```
$ cp /usr/local/Cellar/mysql/5.7.17/support-files/my-default.cnf /usr/local/etc/my.cnf
```

### 設定を変更する
/usr/local/etc/my.cnf に下記設定を追加する。

```
[mysqld]
secure-file-priv = ""
```

これでCSV出力をしてもエラーが出なくなった。

## 参考
* [How should I tackle --secure-file-priv in MySQL?](http://stackoverflow.com/questions/32737478/how-should-i-tackle-secure-file-priv-in-mysql)
* [Hemebrewで入れたMySQLのmy.cnfを設定](http://starzero.hatenablog.com/entry/2012/11/10/103047)
Windowsに、オフラインでディープラーニング環境をインストールする(Tensorflow, Keras) ・・・「オフライン環境でのpipインストール方法」と言ってもいいかも・・・

## なぜWindows? なぜオフライン？
機械学習・ディープラーニングの環境は、インターネットに接続できるMacやLunuxで構築するのが一般的だと思います。しかし、事情により「オフライン（インターネット非接続）」の「Windows7マシン」に環境構築しなければならなくなりました。
Windowsとういだけで警戒しますが、さらにオフライン。
なぜこんなしばりかというと、データ分析案件でかなり機密度の高いデータを扱う必要があり、自社にデータを持ってくることも、クラウドにアップすることも許されないため、すべてお客様先で完結させる必要があるためです。ディープラーニングをデータ分析用途に使おうとする場合には、考えられる状況ではないでしょうか。
ちょっと調べてみると、結構面倒そうな情報ばかりで、はまりそうな予感がします。   

結論を先に書いておくと、**あっさり簡単にできました。**

Tensorflowの**Windowsへのインストール**自体は、オンライン環境下であれば特筆すべき事はなく、普通に`pip`や`conda`を使ってインストール可能です。proxy環境下でも、環境変数やAnacondaの設定ファイルにproxy設定をしてやれば問題ありません。（調べればすぐ情報は見つかると思うので、ここでは割愛します）
2016年11月、Tensorflowが 0.12になってから、Windowsを正式サポートしたことは大きいかもしれません。
なので、**オフラインインストールをどうするか**、ということがポイントになります。

## ディープラーニングだけ？
この後の手順を見て頂ければ分かる通り、結局は「pipインストールのオフライン実行」というだけでしたので、ディープラーニングライブラリに限らず、**pipインストール可能なパッケージ全般** で有効です。

## 環境
以下、インストールに必要なファイルを用意するためのマシンを「オンライン機」、インストール対象のマシンを「オフライン機」と呼ぶことにします。
オンライン機、オフライン機は、Windowsであることと、Pythonの2系・3系が合っていれば良いのではないかと思います。（多分）

- Windows7(GPU非搭載)
- Anaconda3-4.2.0(Python3.5)   
最近、Python3.6がリリースされ、Anacondaも最新はPython3.6です。   
Tensorflowは、2017/2/16現在、Python3.6はサポートしていないので、[こちら](https://repo.continuum.io/archive/.winzip/)から過去バージョンのインストーラをダウンロードしてください。
- Tensorflow0.12   
**注意 ：**
この記事を書いていた2017/2/16にTensorflow1.0がリリースされました。
1.0でも同じ手順でエラーなくインストールが出来ますが、従来のコードで稼働確認をしたところエラーが発生します。これがインストールや環境の問題なのか、仕様が変わってコードを書き換えるべきな問題なのか、現時点で確認できていません。   
1.0をインストールする場合は、そのようなリスクがある事を考慮してください。
原因が分かったら、記事を更新します。

オフライン機では、あらかじめAnacondaをインストールしておき、Python, pipが使える状態にしておいてください。Anacondaは、インストーラを使って特に問題なくオフラインインストールすることができますので、手順は割愛します。


## 手順
### １．オンライン機での作業
**作業１**
対象のライブラリ、パッケージは、まとめて処理できるようにファイルに記しておきます。

```packages.txt
tensorflow
Keras
```
**注意：** 前述の通り、執筆時点のTensorflowの最新版は1.0ですので、上記のようにバージョンを指定しないと最新の1.0をインストールする事になります。過去のバージョンを指定する場合は以下のようにしてください。

```packages.txt
tensorflow==0.12.0
Keras==1.1.2
```

依存関係は勝手に解決してくれるので、直接必要なものだけ書いておけば良いです。
もちろん、ディープラーニングに関わらず、他のパッケージもインストールでるので、必要なものがあれば適宜一緒に書いておいてください。インストールしたいものが多い場合は、以下の実行結果ファイルを編集すると効率的です。

```bat
pip freeze > packages.txt
```

**作業２**
以下の`pip`コマンドを実行します。ここでは、ライブラリのインストールは行わずにダウンロードだけ行います。

```bat
REM pip install --download だと警告が出る
pip download -d <ファイル出力先ディレクトリ> -r packages.txt
```
これにより、指定したものだけでなく、依存関係があるものもまとめて.whlや.tar.gz のファイルとしてダウンロードされます。



### ２．オフライン機での作業
**作業１**
オンライン機でダウンロードしたファイルとpackages.txtを、オフライン機にコピーします。

**作業２**
以下のコマンドを実行します。

```bat
REM C:\temp\aaa\bbb のようなWindowsの一般的なパスの記法でOK
set package_dir=<ダウンロードしたパッケージファイルのディレクトリ>
pip install --no-index --find-links=file://%package_dir% -r packages.txt
```
Anacondaをあらかじめインストールしておけば、それ以上になにかをインストールしておく必要はありません。
ビルド環境などは不要でした。   
   

## Chainerは？
ChainerはWindowsを正式サポートしていませんが、きっとビルド環境など他の条件を整えておけば同様に出来ると思われます。現時点では未確認なので、近いうちに確認します。
ただ、業務で使用するなら、単に使えるかどうかだけでなく、正式にサポートされたものかが条件になる場合もあります。サポート外のものを使用して、わからないところでちゃんと機能しないと困りますからね。
技術英語 > Dictionaries were in Python first and [took posession] of the curly brackets. / the early bird gets the worm

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1720 / 12833)

> Dictionaries were in Python first and **took posession** of the curly brackets.

本の他の部分の意訳「`[]`はempty listを作るので、`{}`はempty setを作ると思うでしょう。しかしながら、実際には`{}`はempty dictionaryを作ります。」

その理由というのが上記の文章。

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

> the early bird catches the worm

某手続きのために、とある場所に早めにいったら１時間早すぎて寒空の下待つはめに。。。

the early bird gets a cold
template の一致度早見表[c++11 or newer]

# templateの一致度とオーバーロード
SFINAE を用いたライブラリの作成を手伝う機会があり、そのときtemplateの一致度について理解してもらうのに2時間ほどかかった。その後、一致度の違いによって関数が選択されるところに食いつかれて更に1時間かかったので、templateの一致度がより高まる順に表にしてまとめる。
これを使えばオーバーロードするときにどれが選ばれるか把握したり、同じ一致度のものを作って多重定義になる問題を避けられる。
わかってる人が早見に使いたいとき用ということでtemplateの細かい説明は省略する。

## 説明環境
解説用のコードはc++11を理解できる人を想定している。早見表自体はc++03からc++14まで利用できる(はず)。

## 一致度早見表(クラス)

1. 仮引数の一致
2. 特殊化の一致
3. 部分特殊化の一致

## 一度早見表(関数)

1. 仮引数の一致
2. テンプレートの解釈の手間が少ないやつ(?)
3. テンプレートが関係しない中でキャストして選べるもの

## 早見表の解釈
テンプレートはコンパイル時にすべて解釈されるので、解釈後の型の状態を思い浮かべる。
そこから1.で一つに決まらなければ2.で決めていくという動作をする。
例えば、次のように仮引数が同じ関数が三つあるとする。

```cpp
template<typename T, typename S>
bool func(const T& lhs, const S& rhs); // (1)

template<typename T>
bool func(const T& lhs, const T& rhs); // (2)

template<>
bool func(const int& lhs, const int& rhs); // (3)
```

それぞれきちんと定義すれば上はコンパイル可能であり正常に動作する。
よって、次のコードは期待通り動作する。

```cpp
const int a1 {0}, a2 {1};
func(a1, a2); // call (3)

const double b1 {0.1}, b2 {3.2};
func(b1, b2); // call (2)

func(a1, b2); // call (1)
```

# 陥りやすい問題例
## const lvalue と Universal reference の一致度
早見表にあるように仮引数が一致した場合はその時点で関数が絞り込まれる。
次の例ようにあらゆる型を受け取るが、実際の処理はある型に変換してから行う場合には直観に反しやすい。
特にconst lvalueはどのような参照でも受け取ることができるが、一致度の解釈では珍しい型const lvalueに限定して解釈される。

```cpp
#include <string>

template<typename charT>
func(const std::basic_string<typename charT>&); // (4)

template<typename T>
func(T&& value)
{
  func(std::string(std::forward<T>(value))) // expect calling (4) ... Miss [1]
}

std::string incorrect("except call (4)");
func(incorrect); // Miss [2]

const std::string correct("call (4) correctly");
func(correct); // call (4)
```

残念ながらMissの結果はユニバーサル参照の無限呼び出しで終わってしまう。

### Miss [1]
(4)が `const std::string&` (const の string の左辺値参照)の仮引数と解釈するのに対して、
ユニバーサル参照の方は `std::string&&` (string の右辺値参照)の仮引数を持ってしまう。
Miss [1] の呼び出しはその場で `std::string` を呼び出しているので右辺値であるし、constでもない。
このため、仮引数の一致するユニバーサル参照の関数が再帰されてしまう。

### Miss [2]
(4)が `const std::string&` (const の string の左辺値参照)の仮引数と解釈するのに対して、
ユニバーサル参照の方は `std::string&` (string の左辺値参照)の仮引数を持ってしまう。
Miss [2] の呼び出しはstd::stringの左辺値で行っているが、(4)の仮引数にはconstがついている。
このため、仮引数の一致するユニバーサル参照が選ばれてしまう。

## templateクラスと部分特殊化見間違い
SFINAEではtemplateクラスと部分特殊化を利用して書いてゆくが、templateクラスと部分特殊化の構文が似ていて勘違いされてしまった。

```cpp
#include <type_traits>

template <typename T, typename = void>
class has_value_type
  : public std::false_type
{};

template <typename T>
class has_value_type<T, typename std::conditional<false, typename T::value_type, void>::type>
  : public std::true_type
{};
```

この例で、上はtemplateクラス `has_value_type` の定義であり、下はその部分特殊化 `has_value_type<T, void>`の定義である。
テンプレート引数Tを一つだけ与えて `has_value_type<T>` を具現化すると、
上のtemplateクラスの定義によって `has_value_type<T, void>` と解釈される。
この型は下の部分特殊化によって具体化を試みられ、`T::value_type` が存在すれば具体化に成功し、true_typeを継承する。
`T::value_type` が存在しなければSFINAEによって下が無視され、残ったtemplateクラスの定義によってfalse_typeを継承する。

部分特殊化が見づらいのは、教えていた相手曰くtemplateの片方がデフォルト値を利用していて解釈後がどちらも同じに見えるかららしい。特殊化によるオーバーロード分岐はよく使うテクニックであるが、SFINAEに慣れていないと全ての場合を上書きしているように見えるようだ。実際には同じでなければ困るが。
それはさておき見極め方は名前の後ろに特殊化の指定があるかどうかである。templateと連続で並んでいると目が滑りがちなので注意して読むとよい。


この内容を通話越しに教えるのに1時間かかってしまったので、次回からは一致度の高い関数が選ばれるという部分の理解を確かめてから教えるよう心がけたい。
thor の option の alias 指定時のハイフン有無について

thor では option に alias を設定できます。
この alias にハイフンを付けた場合と付けない場合の動作について確認します。

## <i class='fa fa-check'></i> ハイフンなしの場合
### <i class='fa fa-code'></i> コード
```ruby
require 'thor'
class SampleCLI < Thor
  desc "command usage", "command desc"
  option "opt", aliases: "o", type: :boolean
  def command(name)
    puts "opt on" if options['opt']
    puts "command #{name}"
  end
end

SampleCLI.start(ARGV)
```

### <i class='fa fa-terminal'></i> 動作確認
`--opt` , `-o` の両方で呼び出すことができます。

```sh
$ ruby sample1.rb command hoge
command hoge
$ ruby sample1.rb command -o hoge
opt on
command hoge
$ ruby sample1.rb command --opt hoge
opt on
command hoge
```

### <i class='fa fa-book'></i> ヘルプの確認
`o` alias はハイフンが省略されて表示されます

```sh
ruby sample1.rb help command
Usage:
  sample.rb1 command usage

Options:
  o, [--opt], [--no-opt]

command desc
```

## <i class='fa fa-check'></i> ハイフンありの場合
### <i class='fa fa-code'></i> コード
```ruby
require 'thor'
class SampleCLI < Thor
  desc "command usage", "command desc"
  option "opt", aliases: "-o", type: :boolean
  def command(name)
    puts "opt on" if options['opt']
    puts "command #{name}"
  end
end

SampleCLI.start(ARGV)
```

### <i class='fa fa-terminal'></i> 動作確認

```sh
$ ruby sample2.rb command hoge
command hoge
$ ruby sample2.rb command -o hoge
opt on
command hoge
$ ruby sample2.rb command --opt hoge
opt on
command hoge
```

### <i class='fa fa-book'></i> ヘルプの確認
`-o` alias はハイフンつきで表示されます

```sh
$ ruby sample2.rb help command
  sample2.rb command usage

Options:
  -o, [--opt], [--no-opt]

command desc
```

## <i class='fa fa-flash'></i> thor のコードを確認
### spec/fixtures/group.thor
thor のfixtureです。
ハイフンありもハイフンなしも想定しているようです。

```ruby
# 略
class_option :third,    :type => :numeric, :desc => "The third argument", :default => 3,
                        :banner => "THREE", :aliases => "-t"
class_option :fourth,   :type => :numeric, :desc => "The fourth argument"
class_option :simple,   :type => :numeric, :aliases => 'z'
class_option :symbolic, :type => :numeric, :aliases => [:y, :r]
# 略
```

## <i class="fa fa-comments-o" style="font-size:1em;"></i> 雑感
本当はハイフンなしで指定したときに help はハイフンありで表示されるのが正しいのかな？と予想しました。
Haskell 順列・組み合わせ・べき集合・直積

# 順列

```hs
>>> import Data.List
>>> permutations [1,2,3]
[[1,2,3],[2,1,3],[3,2,1],[2,3,1],[3,1,2],[1,3,2]]
```

# 組み合わせ

```hs
comb :: Int -> [a] -> [[a]]
comb 0 xs = [[]]
comb _ [] = []
comb n (x:xs) = [x:y | y <- comb (n-1) xs] ++ comb n xs
```

```
>>> comb 2 [1,2,3,4,5]
[[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[2,5],[3,4],[3,5],[4,5]]
```

# n種類のものから重複を許してr個選ぶ

```hs
>>> import Control.Monad
>>> replicateM 5 ["a", "b", "c"]
[["a","a","a","a","a"],["a","a","a","a","b"],["a","a","a","a","c"],["a","a","a","b","a"],["a","a","a","b","b"],["a","a","a","b","c"],["a","a","a","c","a"],["a","a","a","c","b"],["a","a","a","c","c"],["a","a","b","a","a"],["a","a","b","a","b"],["a","a","b","a","c"],["a","a","b","b","a"],["a","a","b","b","b"],["a","a","b","b","c"]...]
```

# べき集合

```hs
powerset :: [a] -> [[a]]
powerset [] = [[]]
powerset (x:xs) = [x:ps | ps <- powerset xs] ++ powerset xs
```

または

```hs
import Control.Monad

powerset :: [a] -> [[a]]  
powerset xs = filterM (\x -> [True, False]) xs
```

```hs
>>> powerset [1,2,3]
[[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[]]
```

# 直積

3個の集合の直積。何個でもOK。

```hs
>>> import Control.Monad
>>> sequence [[1,2], [3,4], [5,6]]
[[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]]
```
Google Chrome バージョン 56.0.2924.87 デフォルトフォントが変更

なんかWebのデザインが崩れるなーと思っていたら、どうも最近のアップデートで基本フォントが変更されているようです。
![Clipboard01.png](https://qiita-image-store.s3.amazonaws.com/0/102207/45239974-8ea4-e6dd-b643-f56cebce5707.png)

おそらくWindows10に配慮したのでしょうが、ピッチや幅などが全く違うのでフォントに合わせてデザインしているとずれたりして困ります。
元の設定に戻すにはこんな感じにすればいいようです。
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/722843b2-6a58-24d0-b29c-db6d83e01eef.png)
vim 設定ファイルの読み込み順

次のコマンドを実行して確認。
 :version

手元のWindows環境では，

$VIM\vimrc
$HOME\_vimrc
$HOME\vimfiles\vimrc
$VIM\_vimrc
$HOME\_exrc
$VIM\_exrc
$VIM\gvimrc
$HOME\_gvimrc
$HOME\vimfiles\gvimrc
$VIM\_gvimrc
$VIMRUnTIme\menu.vim
【Java】S3アップロード・ダウンロードのテストを"S3 ninja"を使って行う

[S3](https://aws.amazon.com/jp/documentation/s3/)のテスト用ダミーサーバーは[Fake S3](https://github.com/jubos/fake-s3)というのがあると聞きましたがRubyらしく、私Java屋なのでJavaでも無いかなーと探したら[S3 ninja](http://s3ninja.net/)というのがありました。

[S3 ninja](http://s3ninja.net/)

![ninja.jpg](http://s3ninja.net/assets/images/ninja.jpg)

というわけで使ってみましょう。そうしましょう。
[Fake S3](https://github.com/jubos/fake-s3)はまた今度。

# テストコードを書いてみる

通常はダウンロードして使うようですが、面倒なので、今回はmavenでインストールして、Junitで無理やり起動させます。

## pom.xml  

```xml:pom.xml
		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk-s3</artifactId>
			<version>1.11.91</version>
		</dependency>
		<dependency>
			<groupId>com.scireum</groupId>
			<artifactId>s3ninja</artifactId>
			<version>2.7</version>
		</dependency>
```

## JUnitコード

```java:Test.java
	static {
		//必要なフォルダを掘る
		try {
			Files.createDirectories(Paths.get("data/s3"));
		} catch (IOException e) {
		}

		//s3ninja起動
		Thread thread = new Thread(() -> {
			try {
				Method main = Class.forName("IPL").getMethod("main", new Class[] { String[].class });
				main.invoke(null, (Object) new String[0]);
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		});
		thread.start();

		try {
			Thread.sleep(1000);//念のため
		} catch (InterruptedException e) {
		}

	}

	@Test
	public void test() throws IOException {
		AmazonS3 s3 = AmazonS3Client.builder()
				.withEndpointConfiguration(new EndpointConfiguration("http://localhost:9444/s3", null))
				.withCredentials(new AWSStaticCredentialsProvider(
						new BasicAWSCredentials("AKIAIOSFODNN7EXAMPLE", "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY")))
				.withPathStyleAccessEnabled(true)
				.withClientConfiguration(new ClientConfiguration().withSignerOverride("S3SignerType"))
				.build();

		//アップロード
		s3.putObject(new PutObjectRequest("bucket", "s3test.txt", new File("test.txt")));

		//ダウンロード
		try (S3Object s3Object = s3.getObject(new GetObjectRequest("bucket", "s3test.txt"));
				InputStream input = s3Object.getObjectContent()) {
			assertThat(IOUtils.toByteArray(input), is(Files.readAllBytes(Paths.get("test.txt"))));
		}

	}
```

## 説明

* 初期処理
    * 利用するには`./data/s3`というフォルダが必要らしいので掘ります。
    * **S3 ninja**を起動するために、IPL#mainを呼びたいのですが、デフォルトパッケージのクラスはimport出来ないのでreflectionで呼び出します。
* AmazonS3Client生成
    * endpoint設定します。
    * Credentialsに必要な値はソースコードを参考にしてください。**S3 ninja**を普通に起動してweb画面開いたら書いてあります。
    * PathStyleAccessEnabledをtrueにしないとダメみたいです。
    * "S3SignerType"というのを設定しないとダメみたいです。
* テスト
    * ファイルをアップロードして、それをダウンロードして元ファイルと比べてます。



---

参考：
[ローカルS3なるninjaを入れてみた](https://www.walksocket.com/archives/387)
[OF] 便利なofFbo

こんにちは
OF触り始めて１年が経とうとしている者です。
ようやくプログラムがどういうもので何ができるのか少しつかみ始めた程度のど素人です。
そんなど素人が１年触ってみて、つまづいた点や便利だなと思った点をど素人なりにど素人にまとめていこう、ということで初記事になります。生暖かい目で見守ってください。

#ofFboってなんぞや
ofFboってなんだ？そう、Fboとか言われてもピンときません。
Fboとはフレームバッファーオブジェクトの略で、簡単に言えばバッファをひとまとめに保持できるものです。うん、ピンときません。
要は画像とか動画とかをメモリに置いていつでも取り出せる状態にするようなもんです。
本当はもっと複雑なんですが、最初はそんな理解なくて大丈夫だと思います。理論より先に使って慣れろです！（よくわかってない）


#使ってみよう
ヘッダーファイルに宣言！

```ruby:ofApp.h
ofFbo fbo;
```
続いてcppファイル！

```ruby:ofApp.cpp
void ofApp::setup(){

//setup関数内でまず使用する領域を確保する
fbo.allocate(横幅サイズ, 縦幅サイズ);

}
```
はいでました。最初のポイント、allocate関数です。日本語訳で"割り振り"ですね。ofImageとかにもあります。
要は「この枠分使いたいですよ」という宣言を先にしてあげないといけません。
ちなみに第三引数でフォーマットを選べますが最初は無視していいと思います。デフォルトでGL_RGBAというアルファチャンネル（透明度あり）の状態になっているので。
もしフォーマットも指定するならこんな感じ

```
//アルファチャンネル無し設定
fbo.allocate(横幅, 縦幅, GL_RGB);

//アルファチャンネルあり設定(デフォルトはこれ)
fbo.allocate(横幅, 縦幅, GL_RGBA);

//Rチャンネルのみ
fbo.allocate(横幅, 縦幅, GL_R);
```
という感じです。"GL_"と打つと候補がかなり多く出てきますので色々試してみてください。ただ全部が全部使えるわけじゃないのでご注意を。面倒くさそうだったら気にしないでください（笑）

続いてupdate関数。

```ruby:ofApp.cpp
void ofApp::update(){

fbo.begin();

ofClear(0);//重要！

//ここにひとまとめで描画させたい項目を記述
ofSetColor(255,0,0);
ofDrawRectangle(0, 0, 100, 100);

ofSetColor(0,255,0);
ofDrawRectangle(0, 200, 100, 100);

ofSetColor(0,0,255);
ofDrawRectangle(200,0 , 100, 100);

fbo.end();

}
```
draw系の記述をupdate関数に記述してもいいの？と思われるかもしれませんが、OFの作法なのかこちらが一般的な感じがします。sampleでもupdate関数内に書かれています。
さて、重要と書かれたofClear()という関数に気付かれましたか？重要です。
これを宣言してあげないともし動画や動くものを描画した場合どんどん上書きで描画されて見た目が大変なことになります。


そして最後、draw関数。

```ruby:ofApp.cpp
//draw(描画するx軸,描画するy軸,サイズx,サイズy);
fbo.draw(0, 0, ofGetWidth(), ofGetHeight());

```

以上です！簡単ですね^ - ^
これでfbo.begin()とfbo.end()内に記述したものを一括で扱えるようにようになりました。
試しにx軸とy軸の値を変更して描画位置を変えてみたりサイズを変更してグニャグニャ動かしてみてください。

#主な用途
使用するメリットとしては最初で言ったように描画されているものをひとまとめで画像と同じように扱えることです。
これを使えば好きな画像や動画、円や四角、パーティクルなどもすべて一つにまとめて扱えます。まとめてサイズを変更したり縦横比を変えてみたりgetTexture関数でtextureとして扱ったり。
僕がよくするのはクロスフェードさせるときに出したいものと消したいものを別々のfboにまとめて互いをフェードイン、フェードアウトさせたりしています。
ただ結構FBOって重い処理らしいので調子に乗って使いまくるのはご注意を...。

良いプログラミングライフを！
[Python] dict型にパスっぽくアクセスできるユーティリティ作ってみた

# 追記(2017.02.27)
執筆当時は知りませんでしたが、dictを属性でアクセスする目的だけなら[attrdict](https://pypi.python.org/pypi/attrdict)がドンピシャです。

以下のように利用できます（公式ドキュメントより引用）
>```python
> from attrdict import AttrDict
> a = AttrDict({'foo': 'bar'})
> a.foo
'bar'
> a['foo']
'bar'
```

# 概要と動機
jsonを返すWeb-APIのレスポンスをpythonで扱う時のこと。
だいたいは階層が深く、一階層ごとに値をチェックしながら参照するのがめんどくさい。
なので、以下のような実行結果が得られる _parse_ 関数があったら便利だなと思った次第です。

```python
some_dict = {
	"path":{
		"to":{
			"target": 
				"key": 1 }}}

# expected return: 1
parse(some_dict, "/path/to/target/key")

# expected return: None
parse(some_dict, "/fake/key")

```

動作的には一種のクエリパーサ...っぽい感じもする。

# 検討

- 再帰使えばそれなりにサクッと書けそう
- パス形式っぽく参照できれば...と思ってたけど、要は辞書型対応したsplitを書けばよい
- デリミタが "/" 固定だと、キーが "a/b" とかだと破綻する
	- ならばデリミタはkwarg形式で指定できればOK

# 実装
最低限の実装。

```python
d = {
	'a': 1,
	'b': [1, 2, 3],
	'c': {
		'ca': 1,	
		'cb': [2, 3, 4] }}

d2 = {
	'a': 1,
	'a/x': 2,
	'b': {
		'ba': 100 }}

def dparse(dic, p, sep="/", default=None):
	lis = p.split(sep)
	def _(dic, lis, sep, default):
		if len(lis) == 0:
			return default
		if len(lis) == 1:
			return dic.get(lis[0], default)
		else:
			return _(dic.get(lis[0], {}), lis[1:], sep, default)
	return _(dic, lis, sep=sep, default=None)

if __name__=="__main__":
	print dparse(d, "a") # 1
	print dparse(d, "c/cb") # [2, 3, 4]
	print dparse(d2, "a/x", sep=":") # 2
	print dparse(d2, "b:ba", sep=":") # 100
```
_dict_ を _parse_ する感じのイメージで _dparse_ と、適当に命名。

# 後記的なもの
色々と抜け穴はあるはずなので、そのあたりはツッコミ待ちです。
すぐ思いつくところだと、「valueとしてのNone」が含まれているとこの関数は破綻します。「存在しない」と、「値としてのNone」を区別できないので論理的なエラーの元。
_default_ 引数をNone以外に指定したことろで、本質は同じ。

「存在しない」のケースは素直にraiseするのがいいのかもしれません。

# これを読んだ方へ
この程度のユーティリティなら多分車輪の再発明だと思うので、今回の目的に叶う既存の良い手段があれば知りたいです。

コード or 設計がダサい、こう書け！のご指摘も歓迎。

関数名も、適切なネーミングが思いつかなくてひとまず _dparse_ としましたが、名は体を表す的な表現ができてないのでそのへんもいいアイデアがあれば。
NginxのサブディレクトリでNetCommons3(CakePHP2)を動かす


いろいろ試行錯誤したけど最終的にこれ。
（MAMP Pro使った例です）

```
location ^~ /dashboard {

	location ~ ^/dashboard/(img|css|js|files|components)/(.+)$ {
        root /Applications/MAMP/htdocs/dashboard/app/webroot;
        try_files /$1/$2 =404;
    }
    location ~ ^/dashboard/(.*)$ {
        index  index.php index.html;
        set $new_uri /dashboard/app/webroot/$1;
        try_files $new_uri $new_uri/ /dashboard/index.php?$args;
        fastcgi_pass     unix:/Applications/MAMP/Library/logs/fastcgi/nginxFastCGI_php7.0.12.sock;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         /Applications/MAMP/conf/nginx/fastcgi_params;
    }


}
```

いろんなブログ記事を参考にしたけど、MAMP Proだとnginxのphpについてのlocation設定がデフォルトで先に書いてあったりして、ホスト毎の設定はその後だったため、MAMP Proのホスト毎のNginx設定は優先度が下がってうまいこといかないのがほとんどでした。
でもってlocationの優先順位について改めてちゃんと調べてデフォルトで書いてあるPHPのlocation設定よりも優先度高くなるように　```^~``` を使いました。

ここにたどり着くまでにいったい何時間ムダにしたんだろうか…orz

## 参考

- [URLリライティング](https://book.cakephp.org/2.0/ja/installation/url-rewriting.html#nginx-url)
- [Nginx で location の判定方法と優先順位を調べる | レンタルサーバー・自宅サーバー設定・構築のヒント](http://server-setting.info/centos/nginx-location-check.html)
json_encodeに関するテスト

# json_encodeに関するテスト
phpの `json_encode` 関数の返り値について気になったので、メモ。

## 目次
- [`json_encode` とは](#zero)
- [空行列を引数に与えたとき](#first)
- 引数に `array_push` 関数を用いたとき
    + [１次元配列の場合](#second)
    + [２次元配列の場合](#third)
    + [添字配列の場合](#fourth)

## `json_encode` とは
<div id = "zero"></div> <!-- アンカー -->
データをJSON形式に変換してくれる，PHPにデフォルトで入ってる関数<br>
（公式リファレンスは<a href = http://php.net/manual/ja/function.json-encode.php>こちら</a>）

<br><br>
<h4>JSON（JavaScript Object Notation）形式とは</h4>
データを表現する手段の１つ<br>
対応している言語は多く，あちこちでデータを使い回すのに便利だとか

<br><br><span></span>
[] ← 添字配列（0以上の整数で値を呼ぶ）を表す<br>
{} ← 連想配列（自分がつけた名前で値を呼ぶ）を表す

<br>
<div id = "first"></div>
## 空行列を引数に与えたとき

``` php:sample1.php
print_r(json_encode(array()));
```
``` :実行結果
[]
```

## `array_push`内で配列を与えたとき
<h3 id = "second">１次元配列</h3>

``` php:sample2.php
echo "array_push: a<br>";
$a = array(); // 初期化

// 配列aの最後に、３つの値を追加
array_push(
	$a,
	array(
		'image' => 'aaa',
		'title' => 'bbb',
		'comment' => 'ccc',
	)
);
var_dump($a); // 配列aについての情報を詳しく表示

echo "<br><br>aをjson形式化<br>";
print_r(json_encode($a)); // 配列aをJSON形式に変換した結果を（var_dumpより簡単に）表示
```

``` :実行結果
array_push: a
array(1) { 
 [0]=> array(3) { 
  ["image"]=> string(3) "aaa"
  ["title"]=> string(3) "bbb" 
  ["comment"]=> string(3) "ccc" 
 } 
} 

aをjson形式化
[{"image":"aaa","title":"bbb","comment":"ccc"}]
```

<h3 id = "third">２次元配列</h3>
sample2.phpを実行した後で，sample3.phpを実行

``` php:sample3.php
echo "array_push: a（２回目）<br>";
array_push(
	$a,
	array(
		'image' => 'ddd',
		'title' => null,
		'comment' => '',
	)
);
var_dump($a);

echo "<br><br>aをjson形式化（２回目）<br>";
print_r(json_encode($a));
```

``` :実行結果
array_push: a（２回目）
array(2) { 
 [0]=> array(3) { 
  ["image"]=> string(3) "aaa" 
  ["title"]=> string(3) "bbb" 
  ["comment"]=> string(3) "ccc" 
 } 
 [1]=> array(3) { 
  ["image"]=> string(3) "ddd" 
  ["title"]=> NULL 
  ["comment"]=> string(0) "" 
 } 
} 

aをjson形式化（２回目）
[{"image":"aaa","title":"bbb","comment":"ccc"},{"image":"ddd","title":null,"comment":""}]
```

<h3 id = "fourth">添字配列</h3>
C言語とかで使われてる一般的な配列
「0番目（一番最初）の値は何？」という聞き方をするやつ

``` php
echo "array_push: z<br>";
$z = array();
array_push(
	$z,
	'aaa',
	'bbb',
	'ccc'
);
var_dump($z);

echo "<br><br>zをjsonに<br>";
print_r(json_encode($z));
```

``` :実行結果
array_push: z
array(3) { 
 [0]=> string(3) "aaa" 
 [1]=> string(3) "bbb" 
 [2]=> string(3) "ccc" 
} 

zをjsonに
["aaa","bbb","ccc"]
```

## まとめ
- nullと空文字は区別される
- 配列の入れ子になっている時，末尾に必ず「,」がつくわけではない
- ２つ目の要素を追加した時，その先頭に「,」が出現する
- []は添字配列，{}は連想配列を表す
- ~~JSON形式で表現すると，データたちは必ず[]で囲まれる~~
[Objective-c] Stringに関して

#Strings

##1.Creating Strings

NSString* aString = [[NSString alloc] init];
NSString* aString = @"Hello, world!";

NSInteger sizeOfString = [@"Hello, world!" length];

##2.Capitalization and working with paths
NSString* originalString = @"This is An EXAMPLE";

// "THIS IS AN EXAMPLE"
NSString* upperCaseString = [originalString uppercaseString];

// "this is an example"
NSString* lowerCaseString = [originalString lowercaseString];

// "This Is An Example"
NSString* capitalizedString = [originalString capitalizedString]; 

##3.Finding substrings
NSString* startSubstring = [originalString substringToIndex:5];   // "This "
NSString* endSubstring = [originalString substringFromIndex:5];   // "is An EXAMPLE"

NSRange theRange = NSMakeRange(2, 5);
NSString* substring = [originalString substringWithRange:theRange]; // "is is"

##4.Comparing Strings
if(firstString == secondString) {
    // Do something
}

if ([firstString isEqualToString:secondString]) {
    // Do something
}

##5.Searching Strings
NSString* sourceString = @"Four score and seven years ago";
NSRange range = [sourceString rangeOfString:@"seven"];

if (range.location == NSNotFound) {
    // the string was not found
} else {
    // the string was found; 'range' variable contains info on where it is
}


NSRange range = [sourceString rangeOfString:@"SEVEN" options:NSCaseInsensitiveSearch];

##6.Arrays
NSArray* myArray = @[@"one, @"two", @"tree"];
NSString* oneString = myArray[0];
NSString* twoString = myArray[1];

NSString* oneString = [myArray objectAtIndex:0];
int count = myArray.count;
int index = [myArray indexOfObject:@"two"]; // should be equal to 1
if (index == NSNotFound) [
    NSLog(@"Couldn't find the object!");
}

NSRange subArrayRange = NSMakeRange(1,2);
NSArray* subArray = [myArray subArrayWithRange:subArrayRange];  
//subArray now contains "two", "three"

##7.Fast Enumeration
for (NSString* string in myArray) {
    // this code is repeated 3 times, one for each item in the array
}

##8.Mutable Arrays
NSMutableArray* myArray = [NSMutableArray arrayWithArray:@[@"One", @"Two"]];

// Add "Three" to the end
[myArray addObject:@"Three"];

// Add "Zero" to the start
[myArray insertObject:@"Zero" atIndex:0];

// The array now contains "Zero", "One", "Two", "Three".

[myArray removeObject:@"One"];   // removes "One"
[myArray removeObjectAtIndex:1]; // removes "Three", the second

// The array now contains "Zero","Three"

[myArray replaceObjectAtIndex:1 withObject:@"One"]; // myArray is now "Zero", "One"

##9.Dictionaries
NSDictionary* translationDictionary = @{ 
@"greeting": @"Hello", 
@"farewell":@"Goodbye"
};


NSDictionary* translationDictionary = @{@"greeting" : @"Hello"};
NSString* greeting = translationDictionary[@"greeting"];

// Here, aDictionary is an NSDictionary
for (NSString* key in aDictionary) {
  NSObject* theValue = aDictionary[key];
  // do something with theValue
}


NSMutableDictionary* aDictionary = @{};
aDictionary[@"greeting"] = @"Hello";
aDictionary[@"farewell"] = @"Goodbye";

##10.NSValue and NSNumber
NSNumber* theNumber = @123;
int myValue = [theNumber intValue];

int a = 100;
NSNumber* number = @(a+1);  // 'number' contains 101
OpenSSHでポート番号を間違えたら、Connection refusedではなくNo route to hostになる

# ポート番号を間違える
…と、TCPのRSTをフィルタしていない場合、Connection refusedですよねぇ。

```
$ ssh -p 24 foo.example.com
ssh: connect to host foo.example.com port 24: Connection refused
```
ところが、時々、

```
$ ssh -p 24 bar.example.com
ssh: connect to host bar.example.com port 24: No route to host
```
となるんですよ。なんで? なんでなの??
`tcpdump`しても、どちらもTCPのRSTが来ているだけで、全く差が無いのに…。

# 答え
```
$ telnet bar.example.com 24
Trying 192.0.2.1...
telnet: connect to address 192.0.2.1: Connection refused
Trying 2001:db8::1...
telnet: connect to address 2001:db8::1: No route to host
telnet: Unable to connect to remote host
```

AAAAあるのにv6が来ていない時、OpenSSHは、最後のエラーだけを表示している模様。
telnetは、途中経過も表示してくれるのね。

# 参考文献
本題と全然関係ない、ドキュメント用IPアドレスとドメイン名について書かれている、[RFC6890](https://tools.ietf.org/html/rfc6890)と[RFC2606](https://tools.ietf.org/html/rfc2606)
CentOS6でidcf cloudstack-apiを使うまで

IDCFで公開しているcloudstack-apiを利用するために入れなきゃいけないパッケージなどが
各サイトでまちまちだったりしたので以下まとめてみました。

###必要なパッケージをインストール
```bash
$ sudo yum install git gcc gcc-c++ kernel-devel python-devel libxslt-devel
```

###pip(python管理パッケージ)をインストール
```bash
$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
```

###cloudstack-apiをインストール
```bash
$ sudo pip install git+https://github.com/idcf/cloudstack-api
```


あとは[こちら](http://blog.idcf.jp/entry/cloud/api_autoscale2/)の【Step2:API-Key/Secret-Keyの取得】から
なぞれば利用できるようになります。
The Basic - Tuples


*タプル* とは複数の値を一つの値にまとめる機能。
タプルの制限は特になく、

* 型の制限なし
* 異なる型の値どうしでも良い。

## タプルの宣言

下記例、(404, "Not Found") は HTTPステータスコード を示すタプルである。

```swift
let http404Error = (404, "Not Found")
// http404Error は (Int, String)型であり、(404, "Not Found")の値を持つ。
```

(404, "Not Found")を持つタプルは「Int型 と String型 のタプル」と言い表す。

タプルにおいて順番の規則は特になく、また必要なだけ異なる型の値を格納できる。例えば(Int, Int, Int)でも、(String, Bool)でもよい。

## タプルの値にアクセスするには

タプルが持つ値をそれぞれ定数・変数に格納してアクセスするには下記のような手法を取る。

```swift
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// "The status code is 404" とプリント

print("The status message is \(statusMessage)")
// "The status message is Not Found" とプリント
```

複数ある値のうち幾つかだけを定数・変数に格納したい場合は、不要な値にあたるタプル値の順を _ で埋めておく。

```swift
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// "The status code is 404" とプリント。
```
### インデックスを使ってタプルの値にアクセスするには

もしくは、タプルが持つ値のうち特定の値にアクセスするにはゼロで始まるインデックス番号を添えてアクセスできる。

```swift
print("The status code is \(http404Error.0)")
// "The status code is 404" とプリント。

print("The status message is (http404Error.1)")
// "The status message is Not Found" とプリント
```
## 値に名前を付けてタプルを宣言するには

もしくは、タプルを宣言する際に値に名前をつけておくこともできる。

```swift
let http200Status = (statusCode: 200, description: "OK")
```
### 名前を持つタプルの値にアクセスするには

名前を指定してタプルの値にアクセスするには下記手法を取る。

```swift
print("The status code is \(http200Status.statusCode)")
// "The status code is 200" とプリント。

print("The status message is \(http200Status.description)")
// "The status message is OK" とプリント。
```

タプルは関数の戻り値を取得する際が特に有効。
関数の仕組みとして、関数は戻り値に一つの値しか返せないが、タプルが複数の値を一つに取りまとめられるので、タプルを戻り値とすれば複数の値を得ることができるようになる。

例えば、ウェブサイトの状態を確認して、ステータスコードとメッセージを関数の戻り値としたい場合、タプルが必要になる。

この詳細については、 *Functions with Multiple Return Values* にて。

```
タプルは関連性のある複数の値をテンポラリで扱う際に利用すべき。
それはタプルが複雑なデータ構造を作ることに向いてないため。もし取り扱おうとしている複数の値がテンポラリなものでなく永続的な
ものであるならば、「クラス」か「構造体」を使うべき。詳細は *Classes and Structures* を参考にすること。
```
AtCoder Beginner Contest 054

2017年2月11日のAtCoderの記録。言語はRubyです。

問題はこちら：[AtCoder Beginner Contest 054](http://abc054.contest.atcoder.jp/)
私の回答一覧はこちら：[自分の結果](http://abc054.contest.atcoder.jp/submissions/all?user_screen_name=Linus)

問題開始前に寝落ちしてしまい、寝ぼけ眼でのスタートとなった。

#A問題
1を14に変換したあと大小比較。

#B問題
単純に1つずつ見ていっても計算量はたかだか50^4なので、時間は間に合うだろうと判断できた。

```ruby
n,m = gets.split(" ").map{|v|
	v.to_i
}
 
pic = []
n.times do
	pic << gets.chomp
end
template = []
m.times do
	template << gets.chomp
end
 
fl =0
for i in 0..n-m
	for j in 0..n-m
		# picの[i,j]成分を左上隅とした部分が、templateと一致するか
		fl = 0
		for k in 0 .. m-1
			if pic[i+k][j..j+m-1] != template[k]
				fl = 1
				break
			end
		end
		if fl == 0 then
			puts "Yes"
			
			exit
		end
	end
end
puts "No"
```

最初に書いたときは変数```fl```を導入するのを忘れていて、どんな場合でも```puts "Yes"```が実行されるように書いてしまった。

このフラグの使い方はあんまりスマートじゃないから、使わずに切り抜けられないかと思って他の人の解答を見てみたけど、使わざるを得ないようだ。
なお、1回のマッチング部分を別の関数に切り出せば、フラグを使わなくとも書ける。[参考：他の人の結果](http://abc054.contest.atcoder.jp/submissions/1103607)


#C問題
深さ優先探索。再帰的に関数を呼び出す。
頂点の数は最高8とずいぶん少ない。だから[以前の回答](http://qiita.com/Linus_MK/items/87330e2f6902ef1397a1)のようにスタックを使いすぎて失敗することもないだろう。と踏んで書いた。

問題内のテストケースは通ったのに不正解になること2回、正解になった。
1回目は始点の指定ミス。問題文中の頂点は1から始まるが、プログラム中では全て0からに直していた。始点(頂点1)を呼ぶときは0なのに、間違って1を引数に入れてしまった。**グラフ系の問題はこの添え字を1間違えるミスをしやすいので、書くときは気をつける。**
2回目は辺の情報を読むときに、辺の数はmなのでm回読み込むのが正解なのに、間違ってn回にしていた(頂点の個数)。
とはいえ、この手の「問題内のテストケースは通ったのに不正解」ってどうやって回避するのが良いんだろう。自分でテストケースを作るとか？


```ruby
n,m = gets.split(" ").map{|v|
	v.to_i
}
 
$nbr = []
for i in 0..n-1
	$nbr[i] = []
end
 
#接続関係を配列に直す
m.times do
	a,b = gets.split(" ").map{|v|
		v.to_i
	}
	$nbr[a-1] << b-1
	$nbr[b-1] << a-1
end
 
def CountPath(cur, prevs, n)	
	if prevs.length == n-1
		return 1
	end
 
	sum = 0
	for v in $nbr[cur]
#		if v is not in prevs
		if !(prevs.include?(v))
			prevs << cur
			sum = sum + CountPath(v, prevs, n)
			prevs.delete_at(-1)
 
		end
	end
	
	return sum
end
 
if $nbr[0].length == 0
	# 頂点1からの辺がない
	puts 0
	exit
end
 
puts CountPath(0, [], n)
```
CakePHP３ で 重いシェルを分割実行する

##PHPでバッチ処理は辛い

PHP7でどうかは未検証ですが、5系の場合は数万件回すとメモリを
使いすぎだいだい落ちてしまいます。

モデル側にロジックがある場合でやむなく数万件回したい場合によく使用する方法です。

サブループが終了すればメモリは都度開放されるため、
瞬間的なメモリ使用量を減らす事ができます。

##メインのループからサブループを呼び出して処理する


``` php
<?php
namespace App\Shell;

use Cake\Console\Shell;
use Cake\ORM\TableRegistry;
use Cake\ORM\Table;

/**
 * Heavy shell command.
 */
class HeavyShell extends Shell
{

    /**
     * Manage the available sub-commands along with their arguments and help
     *
     * @see http://book.cakephp.org/3.0/en/console-and-shells.html#configuring-options-and-generating-help
     *
     * @return \Cake\Console\ConsoleOptionParser
     */
    public function getOptionParser()
    {
        $parser = parent::getOptionParser();

        return $parser;
    }
    private $select = ["Users.id","Users.name"];    
    private $where = ["Users.id >" => 0];
    Private $limit = 500; //ここの値はサーバーのメモリと相談する
    /**
     * main() method.
     *
     * @return bool|int|null Success or error code.
     */
    public function main()
    {
        $limit = $this->limit;
        $where = $this->where;
        $usersTable = TableRegistry::get('Users');
        $total = $usersTable
            ->find("all")
            ->where($where)
            ->count();
        

        $loop = $total / $limit;
        
        for($page = 1 ; $page <= $loop;$page++){
            exec( ROOT . DS . "bin" . DS . "cake heavy sub " . $page);
        }
    }


    public function sub($page){
        $limit = $this->limit;
        $where = $this->where;
        $usersTable = TableRegistry::get('Users');

        $users = $usersTable
            ->find("all")
            ->where($where)
            ->limit($limit)
            ->page($page);
        
        foreach($users as $user ){
            //なんかの処理
            $user->name = "bat de save" . $user->name;
        }
        $usersTable->saveMany($users);

    }


}

```
Sublime Text 3 のCtagsプラグインfork版公開中

# プルリクに反応してくれなかった…
そんなわけで、いくつか変更した機能があるのでそれをfork版として公開しておきます。
github で公開中: <a href="https://github.com/naoyukik/CTags" target="_blank">naoyukik/CTags</a>

# 変更内容
## Fork: 0.5.0 リリース(2017-02-14)

- .sublime-projectファイルからCTagsの設定を読み込めるように変更
- このバージョンからmasterリポジトリをDefaultとし、タグを追加

## developmentにて実装(2016-12-09)

- Sublime Text 3 で実装された関数ジャンプ(Goto Definition)とクイックパネルでのファイルパスと同等の機能を実装
- ctagsのオプションファイルをプロジェクトのルートフォルダから読み込めるように実装
- Ctagファイルの自動更新に対応

上記ともに、セッティングファイルに使用フラグを追加してあるのでそれぞれ設定してからご使用ください。

たぶんST2でも使える…かな。

CTagsのプラグイン(本家): <a href="https://github.com/SublimeText/CTags" target="_blank">https://github.com/SublimeText/CTags</a>
わーい、すごーい、モナドがたくさんあるねー！

元ネタ
[わーい、すごーい](http://qiita.com/t_ishida/items/bae7e62950d81f427f13)

タイトルの元ネタ
4話のサーバルちゃんの「砂がたくさんあるねー！」
[『けものフレンズ』4話、サーバルちゃんのあるセリフがすごく深い「見落としてるものを気づかせてくれる」](https://togetter.com/li/1081364)

### Stateモナド

戻り値と一緒に返した状態を引き回せるモナドなんだね！すごーい！

```hs

import Control.Monad.State (State, modify, execState)

type Friends = State String ()

wai :: Friends
wai = modify (++ "わーい！\n")

sugoi :: Friends
sugoi = modify (++ "すごーい！\n")

tanoshii :: Friends
tanoshii = modify (++ "たーのしー！\n")

friends :: String -> Friends
friends skill = modify (++ "君は" ++ skill ++ "が得意なフレンズなんだね！\n")

main :: IO ()
main = putStrLn $ flip execState "" $ do
  wai
  sugoi
  tanoshii
  friends "クソコード"
```

### Writerモナド

ログをどんどん追記できるモナドなんだね！すごーい！

```hs

import Control.Monad.Writer (Writer, tell, execWriter)

type Friends = Writer String ()

wai :: Friends
wai = tell "わーい！\n"

sugoi :: Friends
sugoi = tell "すごーい！\n"

tanoshii :: Friends
tanoshii = tell "たーのしー！\n"

friends :: String -> Friends
friends skill = tell $ "君は" ++ skill ++ "が得意なフレンズなんだね！\n"

main :: IO ()
main = putStrLn $ execWriter $ do
  wai
  sugoi
  tanoshii
  friends "クソコード"

```

### Readerモナド

読み取り専用の値を共有できるモナドなんだね！すごーい！

```hs

import Control.Monad.Reader (Reader, ask, local, runReader)

type Friends = Reader String String

wai :: Friends
wai = do
  message <- ask
  return $ message ++ "わーい！\n"

sugoi :: Friends
sugoi = do
  message <- ask
  return $ message ++ "すごーい！\n"

tanoshii :: Friends
tanoshii = do
  message <- ask
  return $ message ++ "たーのしー！\n"

friends :: String -> Friends
friends skill = do
  message <- ask
  return $ message ++ "君は" ++ skill ++ "が得意なフレンズなんだね！\n"

main :: IO ()
main = putStrLn $ flip runReader "" $ do
  message1 <- wai
  message2 <- local (const message1) sugoi
  message3 <- local (const message2) tanoshii
  local (const message3) (friends "クソコード")

```

### STモナド

破壊的代入ができるモナドなんだね！すごーい！

```hs

import Control.Monad.ST (ST, runST)
import Data.STRef (STRef, newSTRef, modifySTRef, readSTRef)

type Friends s = STRef s String -> ST s ()

wai :: Friends s
wai = flip modifySTRef (++ "わーい！\n")

sugoi :: Friends s
sugoi = flip modifySTRef (++ "すごーい！\n")

tanoshii :: Friends s
tanoshii = flip modifySTRef (++ "たーのしー！\n")

friends :: String -> Friends s
friends skill = flip modifySTRef (++ "君は" ++ skill ++ "が得意なフレンズなんだね！\n")

main :: IO ()
main =  putStrLn $ runST $ do
  message <- newSTRef ""
  wai message
  sugoi message
  tanoshii message
  friends "クソコード" message
  readSTRef message

```
テキトー実装だとハッカー攻撃の恰好の的になりがちなRubyライブラリopen-uri

open-uriってちゃんと実装しないとなにかと危険な香りがしますな、という話。

[Ruby 2.4.0 リファレンスマニュアル module OpenURI](https://docs.ruby-lang.org/ja/latest/class/OpenURI.html)

例えば外部のAPIを叩く必要があって

```ruby:
require "open-uri"
```

として使っていたとする。
フォームから受け取ったパラメータを入れてopen(なんやら)とする場合、そのままなんでもopen()の中に入れるとかなり危険。

例えばこれはフォームに入れたURLにしたがって、そのウェブサイトに行ってなんか取ってくる例。

<img width="400" alt="Screen Shot 2017-02-16 at 17.54.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/17ab1e92-c307-a2ac-cf5d-8e87622213c3.png">


コードで言うとこんな感じ。

```ruby
require "open-air"

class PagesController < ApplicationController
  def search
    @page = open(search_params[:url])
  end

  private

  def search_params
    params.permit(:url)
  end
end
```

おそらくこんなセキュリティー開きっぱなしな実装はしないと思うが、これをハックしてみるとこうなる。

<img width="400" alt="Screen Shot 2017-02-16 at 17.54.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/682b1b81-21e4-8423-18b2-15ac8db6b6bd.png">


Rubyの場合、パイプを渡せばそのまま外部コマンドが実行できる。

```
| ls
```

結果がこれ

<img width="400" alt="Screen Shot 2017-02-16 at 17.55.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/981acd80-59ff-0445-f21f-9ad4a25cdbbe.png">



ちゃんとlsコマンドの結果としてGemfileやらが見えてますな。ハッカー達がlsコマンドの結果を見ただけで立ち去る、なんてお行儀がいい訳ない。コマンドが実行できると分かればアレもこれもやられことは想像に難くない。

そこで対策としてparamsをチェックしましょう、と。でもそれが単に「正規表現とかでhttpを含んでいる場合だけopenを実行」だと突破はカンタン

このように||をつければOk

<img width="400" alt="Screen Shot 2017-02-16 at 17.59.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/8213900f-0dbc-a74d-7816-b8c5c6c36e6a.png">


```
| cat /etc/passwd || http://son_of_a_bxxxh
```

A || B の意味はAを実行してエラーが出た場合にだけBを実行しなさい、という意味。言うまでもなくコマンドの意図はhttp....は単なるURL風の見せかけで/etc/passwdを見せなさい、と。

その結果がこれ。

<img width="400" alt="Screen Shot 2017-02-16 at 17.59.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/c46e9151-65ee-6512-d477-6ed4fe20d207.png">


見事に/etc/passwdが見えたりして香ばしい。

別にopen-uriがダメなライブラリと言いたい訳ではない。要はどんなライブラリでもその使い次第ということで十分気をつけましょう、と。

以前にこういうハッカー的なテクニックを使ったパズルを作ろうと考えていて、結果的にできたパズルがこれ。

[ほとんどのエンジニアには解けるが、下位10％のダメなエンジニアにだけ解けないパズル?](http://tango-ruby.hatenablog.com/entry/2015/11/30/122814)

このパズルにご登録いただいた解答者数がやっと５３００を超えたあたりか。。。もっと伸ばす方法ないのかなー。