OmniAICreator/Qiita-1.07M huggingface dataset:
「等比？ 等差？ フィボナッチ？？」の解説（フィボナッチ数判定）

@Nabetani さんが出題していた「[等比？ 等差？ フィボナッチ？？](https://codeiq.jp/q/2889)」を解いてみました。
与えられた5つの部分数列が**等比数列**か**等差数列**か、はたまた**フィボナッチ数列**か（またはそれ以外か）を当てる問題でした。以下では、それぞれの判別方法について解説していきます。なお、第$i$項を$a_i$としています。

### 等比数列の判定
隣り合う項の比をとってやり、それが全て等しければ等比数列と判断できます。
比のままでは少し扱いづらいので、積の形に変形しています。

```math
a_{i} : a_{i+1} = a_{i+1} : a_{i+2} \\
a_{i+1}a_{i+1} = a_{i}a_{i+2}
```

### 等差数列の判定
隣り合う項の差が全て等しければ等差数列と判断できます。これは特に説明は不要でしょう。

### フィボナッチ数列の判定
これがこの問題のキモだったのではないでしょうか。フィボナッチ数列っぽくなってるかどうかは等式$a_{i+2}=a_{i+1}+a_{i}$が満たされていることを確認すればいいのですが、$a_i$、$a_{i+1}$（$=A$とします）自体がフィボナッチ数ではない場合、いくら前述の等式が満たされているからといって、与えられた部分数列はフィボナッチ数列になり得ません。（追記：さらに、$a_i < a_{i+1}$かつ$a_{i+1} = a_{i-1}+a_{i} < a_i + a_i = 2a_i$、または$a_1=a_2=1$である必要もある。）
では、どうやって$a_i$がフィボナッチ数かを判断すればよいのでしょうか。結論から言うと、$5A^2 + 4$または$5A^2 - 4$が完全平方数（ルートをとってもなお整数であるような整数$:1,4,9,16,25,49,...$）であれば$A$はフィボナッチ数となります。

#### 定理
$5A^2 \pm 4 = B^2 $ ならば $A$ は フィボナッチ数である。

#### 証明
$5A^2 \pm 4 = B^2 $を次のように変形する。

```math
\begin{eqnarray}
5A^2 \pm 4 = B^2 \\
B^2 - 5A^2 = \pm 4 \\
(B+\sqrt{5}A)(B-\sqrt{5}A)=\pm 4 \\
\left(\frac{B+\sqrt{5}A}{2}\right)\left(\frac{B-\sqrt{5}A}{2}\right)=\pm 1
\end{eqnarray}
```
ここで、整数$l$を用いて

```math
\frac{B+\sqrt{5}A}{2} = \left(\frac{1+\sqrt{5}}{2}\right)^l \\
\frac{B-\sqrt{5}A}{2} = \left(\frac{1-\sqrt{5}}{2}\right)^l
```
と書けるので（参考[1]参照）、

```math
\begin{eqnarray}
A = \frac{1}{\sqrt{5}}\left(\frac{B+\sqrt{5}A}{2} - \frac{B-\sqrt{5}A}{2} \right) \\
=\frac{1}{\sqrt{5}}\left(\left(\frac{1+\sqrt{5}}{2}\right)^l - \left(\frac{1-\sqrt{5}}{2}\right)^l \right) \\
= F_l
\end{eqnarray}
```

となり、$A$はフィボナッチ数$F_l$であることが分かる。$\blacksquare$

## 提出コード
提出コードはGolangで書きました。解答は特に晒すほどのものでもないので、リポジトリの[リンク](https://bitbucket.org/snippets/cia_rana/6j4ba)だけ載せておきます。

## 参考
1. [ディリクレの単数定理とペル方程式 - tsujimotterの下書きノート](http://tsujimotter-sub.hatenablog.com/entry/dirichlets-unit-theorem)
2. [Why does this test for Fibonacci work? - math.stackexchange.com](http://math.stackexchange.com/questions/1100943/why-does-this-test-for-fibonacci-work)
多国籍チームでのチームビルディング

アメリカ、バングラ、ニュージランドの異種混合チームと日本イスラエルチームで仕事をした経験を経て、
多国籍チームでの成功と大失敗の両方について、反省も兼ねて分析したいと思います。

## はじめに
チームビルディングで日本人と外国人の大きな違いを感じた点は報酬の価値観の違いとコミュニケーションの優先度です。
日本人エンジニアには**Projectの成功=会社の成功=個人の成功**という図式が比較的簡単に成立しますが、外国エンジニアは個人やアーキテクチャを重視するので成立しない事が多いと感じます。これを怠慢であるとか協調性がないとかいう形にして村八分にしてしまう事が事態を悪化させ、チームビルディングをより困難にします。
また、コミュニケーションに関しては日本人エンジニアはドキュメントベースのコミュニケーションが非常に得意で細部まで読みこみ理解をした上で次のステップに進むのですが、外国人エンジニアの場合はverbal(口頭)でのコミュニケーションに非常に長けており柔軟に解釈を変え最適化案を提案できたり、口頭で話をした決定事項をドキュメントより優先させ素早く対応できる傾向にあります。
得意な仕事の傾向はやはり、

**日本人エンジニア　→　積み上げ型のウォーターフォール**
**外国人エンジニア　→　柔軟なアジャイル**
といった雰囲気です。

## 項目ごとのギャップ
| 項目 | 日本人エンジニア | 外国人エンジニア |
|:-:|:-:|:-:|
| コミュニケーション | 文章やダイアグラム | ディスカッション |
| プロジェクトへの参加姿勢 | 受動的 | 積極的 |
| チームワーク | 和をもって尊しとなす | 個人主義 |
| 成功の定義 | プロジェクト無事完遂 | 個人の出世 |
| 仕様変更への考え方 | 慎重 | 柔軟 |
| 品質に関する考え方 | 非常に厳しい | 非常にゆるい |
| 完成までのスピード | 遅い | 早い |
| バグへの認識 | 重大な欠陥として認知 | 当然起こる事象として認知 |
| バグ対応速度 | 迅速に対応 | FutherUpdateで対応 |
| 納期意識 | 高い | 低い |
| 仕事の効率性に対する考え方 | 低い | 高い |
| プロジェクト先導力　| ほぼなし | 非常に優れている |
| コミットメント意識 | 無駄と思われても言われたらやる | 無駄な仕事と判断すればやらない |
| 語学力 | 英語表現の乏しさ | 英語表現の豊さ、日本語力の欠如 |

上記のFit&Gapを分析すると
**日本人エンジニア -> 下請けお客様至上主義**
**外国人エンジニア -> カリスマビジネスリーダー**
という説明がいろいろな所でされるのがよく分かります。

適材適所に人材配置をしてこそプロジェクトが成功すると思われるので、
カリスマを下請けのポジションに置いてしまったり、
お客様至上主義をリーダーにする事でプロジェクトに歪みが生まれるというのが容易に想像が付きます。カリスマ特性だからといって下積みが必要ない訳ではないし、お客様至上主義だからといって経験不足な訳でもないので日本側が上流工程に立つにはポジショニングが非常に難しくなります。
カリスマ特性の人に対して下流工程だからただ受け入れさせるというのは拷問してるみたいなもんですね。

## 外部要因
プロジェクトの規模が違うので一概に比較はできませんが、組織の組み方は参考になると思います。

| 項目 | 成功 | 失敗 |
|:-:|:-:|:-:|
| 参画企業 | 日本の大手開発系SI | 利害の一致しないマルチベンダー |
| マネージメント | 日本側に絶対的に権力のあるPM | PMの所在不明 |
| 品質管理 | 日本式のQAを外部の専門組織で２段階で行う | 各社独自で実施 |
| ロケーション | オンサイト | オフサイト |

### 成功要因
1. 上流工程を日本の大手ベンダーが完全にまとめて開発のみに集中可能な体制を構築
2. QAを2段階にして外国人エンジニアサイドで要件の汲み取りが難しかった部分を補填

### 失敗要因
1.要件部分の品質の低さに加え外国人エンジニアのリーダーシップとクリエイティビティが裏目にでて、仕様が確定せず衝突
2.要件部分の品質が低く、トランスレーションをすると全く伝わらない文章になるので余計な会議でのコミュニケーションが多発
3.地理的条件でホワイトボードディスカッションができないのでより要件が伝わらない状態になる

## 今後の作戦
### プロジェクトマネージメント
一番強い所と弱い所を考えます。

|  | 強み | 弱み |
|:-:|:-:|:-:|
| 日本人エンジニア  | 積み上げ力 | 積極性 |
| 外国人エンジニア  | 柔軟性 | コミットメント力 |

**日本人エンジニア** -> 着実に積み上げる系の仕事と外国人エンジニアのサポート体制を作る
**外国人エンジニア** -> 柔軟性、積極性を活かした戦略部門を担当するか専門性を活かしたハイスピード開発を担当

どちらにせよ、気の弱い日本人がリーダシップを持ってオフサイトメンバーなどをコントロールをするのは相当難しいので、スケジュール管理手法、品質管理手法、提供するドキュメントの品質などを徹底して外堀を埋める必要があるというのを痛感しています。日本工業製品のトップを長い間牽引していた文化なので、こういった手腕は優れていると思います。ただ、遠慮しすぎや優柔不断で要件が決められないという事があるので、そういう所で外国人エンジニアが的確にソリューションを提案してバスっと切ってくれた時にはかっこいいなあと思いました。無駄にオーバースペックな要件やタスクなどはガツガツ削ってくれそうなので、工数がかかりすぎる部分などは効率化してキレイにしてくれると思います。

### 人材マネージメント
日本人エンジニアはみんなで頑張った→楽しく飲むでなんとなく片付く事が多いのかなと・・・・
そういう昭和な雰囲気に馴染んでくれる外国人エンジニアの方も少数ながらいますが・・・。
外国人エンジニアには個人の時間を尊重、労働基準の整備、成功時報酬の設定などきちんとメリットがある事をロジカルに理解してもらうのがモチベーションアップにつながりやすい気がしています。個人のプライドを尊重したいですね。
これは見込み残業とかいう制度で労働時間すら有耶無耶になり長時間労働に苦しむ日本人は見習わないといけないと思います。
日本ではCEOの名前は前にでてこないので、それだけ個人が際立たないという社会システムです。そういう社会に個人を尊重する外国人のエンジニアを入れるのは酷だなあと思います。

### 最後に
色々苦しみましたし、喧嘩もありえないくらい沢山しましたが、
優秀な方とも一緒に仕事ができ、良い考え方も沢山学びました。
溝が埋まらず挫折もしましたが成功例と失敗例を両方経験できて良かったです。
CentOS 7 に Symfony 3.1 をインストールする

### PHP のインストール
```bash
yum install yum-utils http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum-config-manager --enable remi remi-php70
yum install php-cli php-intl php-mbstring php-opcache php-pdo php-pecl-apcu php-pecl-xdebug php-process php-xml
sed -i 's|;date.timezone =|date.timezone = Asia/Tokyo|' /etc/php.ini
```

### Symfony コマンドのインストール
```bash
curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony
chmod a+x /usr/local/bin/symfony
```

### Firewalld の設定
```bash
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
```

### MySQL Community Server のインストール
```bash
yum install http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
yum install mysql-community-server php-mysqlnd
echo -e '\ncharacter-set-server = utf8' >> /etc/my.cnf
systemctl start mysqld && systemctl enable mysqld
```
必要に応じて。

### Symfony Demo Application のインストール
```bash
symfony demo
cd symfony_demo
php bin/console server:run 192.168.56.101:80
```

### Symfony 3.1 の新規プロジェクトの作成
```bash
symfony new my-project
cd my-project
php bin/symfony_requirements
php bin/console server:run 192.168.56.101:80
```

### Symfony 2.8 のプロジェクトの作成
```bash
symfony new my-project28 2.8
cd my-project28
php app/check.php
php app/console server:run 192.168.56.101:80
```

### Symfony 2.x と Symfony 3.x のディレクトリやコマンドの相違
|Symfony 2	|Symfony 3|
|---|---|
|app/console	|bin/console|
|app/check.php	|bin/symfony_requirements|
|app/cache	|var/cache|
|app/logs	|var/logs|
HTML/CSS初心者がきれいなCSSをかきたいとき

自己流でCSSを書いていると、綺麗な再利用できるCSSをちゃんと書きたい、レスポンシブ対応をもっと簡単にシンプルにしたい、と思いますよね。
でもいまいちやり方がわからない。なんかよくわからないけど方法がいっぱいあってよくわからない。
そんなときに少しでも役立つようなツールをメモしていきたいと思います。

# TwitterBootstrapを使う
TwitterBootstrapを使ってみると、CSSをこう書けばいいのかな、ということがなんとなくわかります　

[デザイン知識がなくてもOK！Bootstrapの使い方【入門者向け】 | TechAcademyマガジン](http://techacademy.jp/magazine/6270)
これを参考にしながらTwitterBootstrapのCSSの書き方を研究してみるとよいかもしれないです。
Launch4j: おそらく最小限設定の使い方

久しぶりにRDBMSを扱う仕事をすることになり今更ながら [Execute Query](http://executequery.org/index.php) を使おうと思い立つ。
なお自分のメイン環境は今のところ64bit版Windows且つ64bit版jvm。
以下はすべて64bit版Windows環境での話。macOS、Linuxそして32bit版Windowsの方は特に悩むこともなくExecute Queryライフを送ってください。

Execute Queryのパッケージ(今回はexecutequery-v4.3.3.zip)をダウンロード・展開した後「eq.exe」を実行するも「The registry refers to a nonexistent Java Runtime Environment installation or the runtime is corrupted.」などというエラーに遭遇。
検索するとやたらとMinecraftでの症例がヒットするがまああまり役に立たない。

似た事例に遭遇したことはあったのでまずは試しにコマンドラインにてjavaコマンドを使って直接「eq.jar」を叩いてみる。
無事に起動。

というわけでこの症例は 64bit版jvm だと発生すると言うことでほぼ確定。

Execute Queryのサイトに記述があるがWindows環境でexeファイルに見立てて起動する処理のために [Launch4j](http://launch4j.sourceforge.net/index.html) を使用しているとのこと。
Launch4jのサイトを見ると32bit/64bitの両環境に対応していると書かれている。
で、起動しないと言うことはExecute Queryに同梱されているexeを作成したときのLaunch4jが古く32bit環境にしか対応していないと推測される。

ところで自分の場合はeq.jarを直接起動する運用で別に困りはしない。
だが、せっかくなのでLaunch4jを使ったexeファイルの作成に挑戦してみる。

まずはLaunch4jのパッケージ(今回はlaunch4j-3.9-win32.zipを使用)をサイトからダウンロードして任意のフォルダへ展開する。

そしてLaunch4jの機能をいきなり体験できるのだけれど展開したフォルダ内にある「Launch4j.exe」を実行。

するとLaunch4jコンパイラに渡す設定ファイルを作成するエディタが起動する。

ここに次の図のように(1)へ「exeファイル名」、(2)へ「起動するjarファイル名」を入力し、(3)のチェックボックスをチェックする。
![Launch4jの設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/67680/7c35a259-d57b-33b3-8eb4-4fe5fb3579ba.png)

なお(3)のチェックボックスをチェックしなければjarファイルを含めた状態のexeファイルを生成することができる。この場合は(2)に入力するjarファイルはビルド済みの実体のファイルを指すようにすること。なおパスを含めて指定可能。

生成後のexeファイルにアイコンを指定したい場合は(4)へアイコンファイルへのパスを入力する。

次に「JRE」タブへ切り替えて実行環境の下限バージョンを(1)へ上限バージョンを(2)へ入力する。
![Launch4jの設定-2.png](https://qiita-image-store.s3.amazonaws.com/0/67680/b2769e0f-98bb-fd69-d99a-ccd99e66af27.png)

Execute Queryをソースからビルドする際にはJava 7以上が必要なようなのでここではMin JREも合わせている。

ここまで設定できたらツールバーにあるフロッピーディスク(!)のアイコンをクリックしてファイルを保存する。
今回は「config.xml」として保存したものとして説明を続ける。

config.xmlを保存できたら、コマンドラインでxmlファイルを引数としてLaunch4jコンパイラを起動する。（ツールのフォルダへパスを通すと言った説明は省略）

launch4jc.exe config.xml

設定内容に問題がなければあっさりとeq.exeが生成されていることと思う。
生成されたeq.exeを元のExecute Queryのeq.exeと差し替えて実行する…無事に起動！
お疲れ様でした。
簡単にShell上でバーグラフを表示するためのワンライナー

サーバーでのログ解析の結果を視覚的にしたい場合に便利です。

```
$ echo -ne "hoge 4\nfuga 5\npiyo 6" | perl -anle 'print "$F[0] "."▇"x$F[1]." $F[1]"'
hoge ▇▇▇▇ 4
fuga ▇▇▇▇▇ 5
piyo ▇▇▇▇▇▇ 6
```

大きい数字のときは雑に割り算してやればいい。

```
$ echo -ne "hoge 69\nfuga 511\npiyo 1195" | perl -anle 'print "$F[0] "."▇"x($F[1]/30)." $F[1]"'
hoge ▇▇ 69
fuga ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 511
piyo ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 1195
```

実際にログ解析してみる（圧縮されているLTSVな1日分のログ）

```
$ zcat access.log-20161018 | grep login | perl -F'\t' -nale '%h=map{split/:/,$_,2}@F;print"$h{time}"' | cut -c8-14 | sort | uniq -c
10 2016:00
5 2016:01
0 2016:02
0 2016:03
2 2016:04
0 2016:05
0 2016:06
4 2016:07
5 2016:08
50 2016:09
100 2016:10
120 2016:11
150 2016:12
300 2016:13
250 2016:14
150 2016:15
100 2016:16
40 2016:17
40 2016:18
140 2016:19
300 2016:20
100 2016:21
100 2016:22
50 2016:23
```

などとして、1時間ごとのアクセス数を出すとする。これの末尾に `perl -anle 'print "$F[1] "."▇"x($F[0]/5)." $F[0]"'` を追加してやると

```
$ zcat access.log-20161018 | grep login | perl -F'\t' -nale '%h=map{split/:/,$_,2}@F;print"$h{time}"' | cut -c8-14 | sort | uniq -c | perl -anle 'print "$F[1] "."▇"x($F[0]/5)." $F[0]"'
2016:00 ▇▇ 10
2016:01 ▇ 5
2016:02  0
2016:03  0
2016:04  2
2016:05  0
2016:06  0
2016:07  4
2016:08 ▇ 5
2016:09 ▇▇▇▇▇▇▇▇▇▇ 50
2016:10 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 100
2016:11 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 120
2016:12 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 150
2016:13 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 300
2016:14 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 250
2016:15 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 150
2016:16 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 100
2016:17 ▇▇▇▇▇▇▇▇ 40
2016:18 ▇▇▇▇▇▇▇▇ 40
2016:19 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 140
2016:20 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 300
2016:21 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 100
2016:22 ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 100
2016:23 ▇▇▇▇▇▇▇▇▇▇ 50
```

はい、便利ー
Juliaで画像の拡大縮小を行う

# 概要

- Julia で画像の拡大縮小を行います
- 環境は version 0.4.6 です

# Images.jl

- [timholy/Images.jl](https://github.com/timholy/Images.jl)
- GitHub でスターが多いと思われる Julia の画像処理のライブラリです
- テスト画像が入った [JuliaImages/TestImages.jl](https://github.com/JuliaImages/TestImages.jl) もついでに入れます

```bash
$ julia
julia> Pkg.add("Images")
julia> Pkg.add("TestImages")
```

# 拡大縮小する

- `Images.imresize` を使います
- `export` はされていないようです

```julia
using Images, TestImages
img = testimage("mandrill")

half = Images.imresize(img, (width(img)>>1, height(img)>>1))
twice = Images.imresize(img, (width(img)<<1, height(img)<<1))
save("./half.png", half)
save("./twice.png", twice)
```

- 拡大縮小された `mandrill` が保存されます
anbt-sql-formatter gem で SQLを整形する

anbt-sql-formatter gem で SQLを整形してみます。

## <i class='fa fa-download'></i> インストール
```sh
$ gem install anbt-sql-formatter gem で SQLを整形する
```

## <i class='fa fa-flask'></i> サンプル1
### <i class='fa fa-frown-o'></i> Before

```sql
SELECT name, age FROM users WHERE age >= 20 and name like '田中%' order by name
```

### <i class='fa fa-smile-o'></i> After

```sql
SELECT
        name
        ,age
    FROM
        users
    WHERE
        age >= 20
        AND name LIKE '田中%'
    ORDER BY
        name
```

## <i class='fa fa-flask'></i> サンプル2
### <i class='fa fa-frown-o'></i> Before

```sql
SELECT * FROM users WHERE sex = 'male' OR (age <= 20 AND sex = 'female')
```

### <i class='fa fa-smile-o'></i> After

```sql
SELECT
        *
    FROM
        users
    WHERE
        sex = 'male'
        OR (
            age <= 20
            AND sex = 'female'
        )
```

## <i class='fa fa-flask'></i> サンプル3
### <i class='fa fa-frown-o'></i> Before

```sql
select * from order as o
  inner join order_detail as od on od.order_id = o.id
    inner join items as i on od.item_id = i.id
    left join comments as c on c.order_detail_id = o.id
where i.price > 1000 and od.quantity > 10
```

### <i class='fa fa-smile-o'></i> After

```sql
SELECT
        *
    FROM
        ORDER AS o INNER JOIN order_detail AS od
            ON od.order_id = o.id INNER JOIN items AS i
            ON od.item_id = i.id LEFT JOIN comments AS c
            ON c.order_detail_id = o.id
    WHERE
        i.price > 1000
        AND od.quantity > 10
```

## <i class='fa fa-flask'></i> サンプル4
### <i class='fa fa-frown-o'></i> Before

```sql
SELECT name, age
FROM users
WHERE age >= (
    SELECT AVG(age)
    FROM users
)
```

### <i class='fa fa-smile-o'></i> After

```sql
SELECT
        name
        ,age
    FROM
        users
    WHERE
        age >= (
            SELECT
                    AVG (age)
                FROM
                    users
        )
```

## <i class='fa fa-flask'></i> サンプル5
### <i class='fa fa-frown-o'></i> Before

```sql
SELECT
  sex, avg(avg_age)
FROM
(
  SELECT sex, AVG(age) as avg_age
  FROM users
  group by sex
  UNION
  SELECT sex, AVG(age) as avg_age
  FROM customers
  group by sex
) as a
group by  sex
```

### <i class='fa fa-smile-o'></i> After

```sql
SELECT
        sex
        ,AVG (avg_age)
    FROM
        (
            SELECT
                    sex
                    ,AVG (age) AS avg_age
                FROM
                    users
                GROUP BY
                    sex
            UNION
            SELECT
                    sex
                    ,AVG (age) AS avg_age
                FROM
                    customers
                GROUP BY
                    sex
        ) AS a
    GROUP BY
        sex
```

## <i class='fa fa-book'></i> 参考資料
* [anbt-sql-formatter - GitHub](https://github.com/sonota88/anbt-sql-formatter)
* [anbt-sql-formatter - RubyGems](https://rubygems.org/gems/anbt-sql-formatter)
SPA のログインフォームでパスワード保存確認ダイアログを出す条件

結論から言うと、シングルページアプリケーション（SPA）でブラウザ標準のID・パスワード保存機能に依存しない方が無難。セキュリティ的な観点を無視するなら LocalStorage を使って独自実装するのが良いかもしれない。


全ブラウザ共通
--------------

- プライベートモードでない
- フォームに ID およびパスワード入力欄が含まれている
  -  `<input type="text" />` または `<input type="email" />`
  -  `<input type="password" />`
  - 保存される項目は上記の 2 つのみ。これ以外は cookie 等を用いて工夫する

ブラウザごと
------------

### Chrome (Win / Mac / Android) 

- submit または click イベント発火
- フォームの DOM が削除される
- URL 遷移（History API を用いて同じ URL に履歴書換でも可）
- 備考
    - 保存確認ダイアログが出なくなったら、ユーザー切替機能を使って新規ユーザーで再度試す

### Chrome (iOS)

- **SPA では不可能かもしれない**
- 完全なページ読み込みが必須（`window.location` ではなく、form の action 指定による遷移）
- onLoad 後に動的に生成または変更されたフォーム不可

### IE 11 / Edge (Win)

- フォームの submit イベント発火（click イベント不可）
- パスワード欄の value 属性を書き換えてはいけない（キーやマウス入力に応じて JavaScript から value を代入する方法など）

### Safari (Mac / iOS)

- submit または click イベント発火
- URL 遷移（History API を用いて同じ URL に履歴書換でも可）
- 備考
    - iOS 10 以降だけかも。iOS 9 ではダイアログを出せず

### Firefox (Win / Mac / iOS / Android)

- フォームの submit イベント発火（click イベント不可）

### Android 標準ブラウザ

- **SPA では不可能かもしれない**
- 完全なページ読み込みが必須（History API 不可）
実機内データベースファイルを、引っこ抜くときのコマンドをメモした。

USBデバッグ中、Android実機内に作成されたデータベースファイルを、開発マシンに持ってきて、中身を[DB browser for SQLite]( http://sqlitebrowser.org/)で見ました。

その時のコマンドメモです。


# 環境
* MacBook Pro (Retina 13-inch、Early 2015)
* OS X El Capitan 10.11.6
* Java 1.8.0_102
* Android Studio 2.1.3
* HTC J butterfly HTL21

# 実施したこと

* adb起動
    + パスを通しておくと便利。
    + 通していないと、当然フルパス指定です…。
    + Android/sdk/platform-tools/adb にあります。

```
<Project root>$adb shell
```

* adb shellでアクセスできる場所へ、データベースファイルを移動
    + 端末依存

```
<Project root>$run-as {アプリパッケージ名} cat databases/{データベースファイル名}.db > sdcard/{データベースファイル名}.db
```

* adb shellを終了

```
<Project root>$exit
```
* 開発マシンにデータベースファイルを移動

```
<Project root>adb pull /sdcard/{データベースファイル名}.db /Users/{開発マシンの任意のパス}/{データベースファイル名}.db
```

# 結果
* 開発マシンに実機内のデータベースファイルを持ってくることができた。
* [DB browser for SQLite]( http://sqlitebrowser.org/)で、グラフィカルに中身を確認した。

# 参考にさせて頂きました
https://akira-watson.com/android/adb_run-as.html
数値の型が扱える範囲 Javaの問題をTypeScriptにしてみる　3-3

次のプログラムの中からコンパイルエラーにならないものを選びなさい

A. byte a = 0b10000000;
B. short b = 128 + 128;
C. int c = 2 * 3L;
D. float d = 10.0;

答えは、Bです。

byte型は-128〜127の範囲の値しか扱えません。0b10000000は128のためbyteの範囲を超えています。よってコンパイルエラーとなります。
Lがつくとlong型のためint型には代入できないためコンパイルエラーとなります。
実数はdoubleで扱われます。floatはdoubleよりも範囲が狭いためキャストを行わないと代入できません。よってコンパイルエラーになります。

これをTypeScriptにすると、

A.var a:number = 0b10000000;
B.var b:number = 128 + 128;
C.var c:number = 2 * 3;
D.var d:number = 10.0;

このようになります。TypeScriptには数字を扱う型は、numberしかありません。
number型はjavaのdouble型と同じ桁数を扱えます。そのため全てのコンパイルが通ります。
Aの2進数は文字列で表現してparseInt("10000000",2);というように変換することも見かけます。バイトコードは文字列で受け取ることが多からかもしれません。
iOS Creators' Meetup vol.2 まとめ

##はじめに
[iOS Creators' Meetup vol.2](http://oi-study.connpass.com/event/40049/)が2016年10月14日、オイシックス株式会社にて開催されました。

この勉強会は、iOSならどんな内容でもOKというもので、デザイナー、開発者などが交流する趣旨になっています。また、Slackが用意されていて、勉強会の後もつながりを維持できるようになっています。

##LT1. @akatsuki174 「AutoLayoutのデバッグを試みる」
発表スライド
https://speakerdeck.com/akatsuki174/autolayoutfalsedebatuguwoshi-miru

[AutoLayoutのデバッグをする（1）]
(http://qiita.com/akatsuki174/items/6935bb6ff64f4df51c5a)

Symbolic breakpointとLLDBを使うと、Autolayoutのデバックがしやすくなるお話です。

*Autolayoutの制約の矛盾を見つけるのはハマると大変だったりするので、こういう方法を使うとわかりやすくなってよいですね。*

##LT2. @grachroさん 「RxSwiftやってみた（仮）」

RxSwiftを使うと非同期処理をシンプルに記述できたというお話。
RxCocoaを使うとUIKitとの連携がしやすすい。

RxSwiftSample
https://github.com/grachro/RxSwiftSample

*観察者が観察対象を購読するというフレームワークで理解するとRxSwiftを理解しやすいのですね。*

##LT3. @kurikazuさん 「アプリ開発ディレクターが考えていること」

発表スライド
http://www.slideshare.net/kurikazu/ss-67173388

現場でアプリ開発ディレクターが考えていることの紹介です。

*その機能が必要なのかを問う、Webでまず試す、アプリはインストールさせる必要があるのでweb:appは7:3などの話が印象に残りました。*

##LT4. @kinyoKouさん 「Realm Mobile Platformをさわってみた」
発表スライド
http://www.slideshare.net/kinyokou/realm-mobile-platform

Realm Mobile PlatformをAWS EC2で利用したときの、特にコンフリクト解決で実際に起きた現象の話。

*updateで更新時間順という原則が徹底できていないケースが発生するという実践で知った現象をわかりやすく説明されていた。今後、公式ドキュメントでロジックが公開される予定だというので、待ちたいですね。デフォルトではプロパティ単位で更新されるという話も印象に残りました。*

##LT5. @としさん 「iOSアプリにおけるリリースフローとCI環境」
発表スライド
http://www.slideshare.net/tarappo/iosci-67173057

開発検証〜バイナリ提出までの段階を素早く回すためにCI環境としてどんなリリースフローになるかのお話。

*書けるところはテストを書いておけば一定の品質は担保できるので書きましょう、MacProでビルド時間がトータル1/3になった、コードレビュー前に機械でできることは潰すという話が印象に残りました。集中すべきことだけに集中したら理想ですよね。*

[iOS Test Night](http://testnight.connpass.com/event/41323/)を主催されているとのこと。

##LT6. @jollyjoesterさん 「iOS10からのプッシュ通知再入門」

iOS10のプッシュのUIを見て、どんなJSONのパラメータを扱えるのか、仕組みの話。

*バッヂは6桁いくと真ん中がtrailingされるんですね。100,000→10...000みたいな。 Reproはプッシュ通知を送るのに良いらしいですね。笑*


##ゲストTalk. 三瓶亮さん 「コンテキストを意識したアプリデザイン」

発表スライド
https://speakerdeck.com/3mp/kontekisutowoyi-shi-sitaapuridezain

文脈を意識して、既存のアプリを正しく模倣していくことで認知的負荷を低減させていくという話。
変なこだわりは捨てて、トレンドに従おう。その上でオリジナリティを盛り込む(メインのUXを損なわない程度に)。

Web/AppクリエイターのためのUXメディア
http://uxmilk.jp

*アプリのアイデンティティをパクるとか、同じアプリからパクリまくるのはよくなくていろんなアプリがちょっとずつ模倣するのがよい、という実践的な話が印象に残りました。*
Apigee APP services - create an API proxy

GYAOのtsです。
我々のチームは、オールパブリッククラウドで、[Microservice Architecture](http://microservices.io/patterns/microservices.html)を採用した次期バックエンドを設計中です。

# 経緯
[前回の投稿](http://qiita.com/tstakano-yj/items/da0542c83a4d784de932)でGoogleの営業の方にApigeeをご紹介いただいたと投稿しましたが、本日は[在宅勤務](http://yahoojapanpr.tumblr.com/post/128300523587/dokodemooffice)なので、ゆっくりと集中できる。
早速使い勝手を調査してみた。

GYAOの我々のチーム（テクニカルドライブteam）は、定期的にプロトタイピングイベントなるものを行っている。
誰かが先行して調査を行い、それをもとに全員でプロダクトをプロトタイピングする。
分からないことは、その場で声を掛け合って手分けして調べながらすすめる。

ときにはつまずいたままになることもあるが、特に別途時間を設けなくても問題点の共有もでき、やりながら自由に発言できるので問題の発見もし易い。

個人的には問題は解決するよりも発見するほうが数段難易度が高いと思うので、このイベントは気に入っている。

もう10回以上やっているが、メンバー全員に高評価なので、チームとして続けていこうと思います。
このネタもプロトタイピングにもっていこっと。

# create a proxy
様々なタイプのproxyを作れる模様。
早速前回と同様、ブリッジ先は[mockbin](http://mockbin.org/)を使用。
前回の投稿は[こちら](http://qiita.com/tstakano-yj/items/da0542c83a4d784de932)を参照。

<img width="676" alt="スクリーンショット 2016-10-14 20.10.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/6254ed1a-4462-2563-5a0b-bb07fe48af22.png">
Build an API proxy から作成。

<img width="611" alt="スクリーンショット 2016-10-14 20.11.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/1190bf34-ca36-5c5c-e537-6ef95b72d947.png">
様々なタイプのproxyが作成可能。とりあえず most commonである Reverse proxyで作る。
SOAP気になるな。。。

<img width="1077" alt="スクリーンショット 2016-10-14 20.12.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/57ba3945-f102-7e39-be38-43c13790e98f.png">
pathや ブリッジ先のエンドポイントを指定する。

<img width="636" alt="スクリーンショット 2016-10-14 20.13.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/f0b5404c-96da-f793-796f-e1ff473b3079.png">
今回は認証をかけないで Path throughで。うーん直感的。

<img width="848" alt="スクリーンショット 2016-10-14 20.13.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/e221c150-2d3e-16e5-0eb3-9b00c60b93a5.png">
デフォルトでプロダクション環境と、テスト環境を用意してくれる。なかなか直感的でいいですね。

<img width="1019" alt="スクリーンショット 2016-10-14 20.14.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/7a766470-f941-0304-8c55-4d83ffe2de73.png">
確認と共に、どちらの環境にDeployするかの選択。今回はテスト環境にdeploy。

<img width="1088" alt="スクリーンショット 2016-10-14 20.14.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/34a13482-8750-27bc-682a-3643ca2ec297.png">
上記のようになったら作成完了。リンクからマネジメントコンソール画面に飛べます。

<img width="1587" alt="スクリーンショット 2016-10-14 20.19.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/015791b0-0527-bd89-be8a-8877d992c13f.png">
すんなりAPIができました。まだ良く調べていないが、APIの情報はすべてxmlとして保存される模様。
ダウンロードしておいて、uploadや、editorで直に編集できる。
パラメータのバインド等は調べていないが、上記のeditorでできそう。試しにエンドポイントのurlを変更してみたらリアルタイムにテスト環境にDeployされて即座に挙動が変わった。

#所感
API Gatewayよりも直感的。howto等は一切読まない状態で上記をつまずくことなくできた。
メンテナンス性も高そうだし、これを採用する方向でいいんじゃないかな？
Googleが買収したらしいけど、GoogleCloudのサブセットで入ってくるのだろうか？
マイグレーションは走るのかな？
まあ、プロトタイピングイベント開催してチームのみんなの意見も聞いた上でこれにしようかな
って思いました。

ではまた。
MonacaバックエンドAPI ユーザーについて

アプリを開発する際、ユーザーの登録やデーターの管理などユーザー管理機能を実装するケースがあります。
Monacaには、Monacaバックエンドというクラウドサービスがあります。

このMonacaバックエンドを利用することで、開発側でサーバーを作りこむ必要がなくなります。
Monacaバックエンドについては、[こちら](https://docs.monaca.io/ja/manual/backend/)を参照してください。

Monacaバックエンドに登録するユーザー情報は、MonacaクラウドIDE上の「Monaca バックエンド管理」パネル上で行うこともできますが、Monacaで用意しているMonacaバックエンドAPIを利用することで、Monacaで開発するアプリからも利用することができます。
MonacaバックエンドAPIについては、[こちら](https://docs.monaca.io/ja/reference/monaca_api/cloud/)を参照してください。


# ユーザー
MonacaバックエンドAPIのユーザーアカウントについては、`monaca.cloud.User`が、用意されています。

## ユーザーの登録
Monacaバックエンドにユーザーを登録する場合は、`monaca.cloud.User.register()`メソッドを使用します。

```js
monaca.cloud.User.register("user01", "password", {age:20, mail:"user01@example.com"})
.done(function(result) {
    console.log('Registration is success!: ' + result.user._username);
    console.log('Registration is success!: ' + result.user.age);
    console.log('Registration is success!: ' + result.user.mail);
})
.fail(function(err) {
    console.log("Err#" + err.code +": " + err.message);
});
```

## ログイン
Monacaバックエンドにログインする場合は、`monaca.cloud.User.login()`メソッドを使用します。

```js
monaca.cloud.User.login("user01", "password")
.done(function(result) {
    console.log("Hello, " + result.user._username);
})
.fail(function(err) {
    console.log("Err#" + err.code +": " + err.message);
});
```

## プロパティの取得
プロパティを取得する場合は、`monaca.cloud.User.getProperty()`メソッドを使用します。
プロパティを取得する対象ユーザーでログインしている必要があります。

```js
monaca.cloud.User.login("user01", "password")
.then(function() {
    return monaca.cloud.User.getProperty("age");
})
.then(function(age) {
    console.log("age: " + age);
});
```

## プロパティの変更
プロパティを変更する場合は、`monaca.cloud.User.saveProperty()`メソッドを使用します。
プロパティを変更する対象ユーザーでログインしている必要があります。

```js
monaca.cloud.User.login("user01", "password")
.then(function() {
    return monaca.cloud.User.saveProperty("age", "30");
})
.then(function() {
    console.log("Your property was changed");
});
```

このほかにも、パスワード変更や登録しているプロパティを一括で取得、変更するメソッドも用意されています。
これらの機能を使用することで、アプリ内にユーザー管理画面を作成し、アプリを使用しているユーザーが、自分のユーザー情報を管理することが可能になります。
Monacaで開発するアプリでユーザー管理機能を実装する際は、一度Monacaバックエンドをお試しください。
MatlabでlibSVM (&libnlinear) を導入，fisher data に適用する

# SVMとは
他にいろんな人がちゃんと書いてるのでそこ読んだ方が良い．分かるパターン認識とかも良い．

# 導入
## windows 
[公式サイト](https://www.csie.ntu.edu.tw/~cjlin/libsvm/) または [github](https://github.com/cjlin1/libsvm)
から引っ張ってきてパスを通す．

```
>> addpath(genpath('path¥to¥libsvm')) 
```

てかんじに startup.m に書くと良い．hogeはlibsvmのおいてる場所．windowsの場合はビルド済バイナリが既に入ってますのでもうこのまま使える．

## Mac OSXなどunix系
Matlabのシェル内で

```
>> cd('path¥to¥libsvm¥matlab')
>> make
```

して mex コンパイルすればよかったはずなのに

```
>> mex -setup
エラー: mex
サポートされているコンパイラまたは SDK が見つかりません。オプションについては、
http://www.mathworks.com/support/compilers/R2015a/maci64.html を参照してください。
```

とmexのセットアップ段階でこけた．xcode 7.0 以上に私のmatlab2015aが対応していないせいらしい．[公式のFAQ](http://jp.mathworks.com/matlabcentral/answers/246507-why-can-t-mex-find-a-supported-compiler-in-matlab-r2015b-after-i-upgraded-to-xcode-7-0#answer_194526) にあるように xcode7.0用対応のファイルと設定ファイルを入れ替えてやったらちゃんとmakeできた．

# 使用法

[フィッシャーのアヤメデータ](https://jp.mathworks.com/help/stats/examples/classification.html)を用いてテストする．オプションを使えば勝手に交差検定してくれるけどあえて手動でtest用データと学習用dataを分けた．

```
load('fisheriris.mat')

labels = unique(species);
specIdx = zeros(150,1);
for i = 1:length(labels)
	specIdx(find(strcmp(species, labels{i})))=i; % クラスを数字にする
end

randsort = randperm(150);
test = randsort(1:15); % テストデータのインデックス
trn = randsort(16:end); % 学習データのインデックス

% - test 5 featuress
% for i = 5:100
% 	meas(:,i) = meas(:,1)+randn(150,1);
% end
testDS = meas(test, :);
trnDS = meas(trn, :);
```

学習と予測は二行でできる．

```
model_svm = svmtrain(specIdx(trn), trnDS, '-t 0')
svmpredict(specIdx(test), testDS, model_svm);
```

 - svmtrain(ラベル，データ，オプション)
 - svmpredict(ラベル，データ，モデル，オプション)

という感じ．以上導入とテストについて簡単にまとめてみた．元気があったらそのうち可視化や次元圧縮について書きたい．

# よく使うオプション
 - t: カーネル
 - q: 出力停止
 - v: 交差検定
MySQLで構築初期の時によく使うコマンド

MySQLでよく使うコマンドなど（自分用メモです）

# インストール後の初期設定

```bash
$ mysql_secure_installation
```

# データベースと、そのデータベースの全権限を持つユーザを作成する
```sql
mysql> CREATE DATABASE hogedb DEFAULT CHARACTER SET utf8;
mysql> GRANT ALL ON hogedb.* TO 'hogeuser'@'localhost' IDENTIFIED BY 'hogepass';
```

# データベースをコピーする
別名のデータベースを作成する。

```sql
mysql> CREATE DATABASE hogedb_new DEFAULT CHARACTER SET utf8;
mysql> GRANT ALL ON hogedb_new.* TO 'hogeuser'@'localhost';
```

コマンドラインで、ダンプデータを取得してそれを流す。

```bash
$ mysqldump -u hogeuser -phogepass hogedb > hogedb.dump.sql
$ mysql -u hogeuser -phogepass hogedb_new < hogedb.dump.sql
```

# テーブルをコピーする
コピー元テーブルと同じ構造のテーブルを作成してから、データをインサートする

```sql
mysql> CREATE TABLE new_tables LIKE tables;
mysql> INSERT INTO new_tables SELECT * FROM tables;
```


# 不要なユーザを削除する
権限を削除してから、ユーザを削除する

```sql
mysql> REVOKE ALL PRIVILEGES ON *.* FROM 'hogehoge'@'localhost';
mysql> DROP USER 'hogehoge'@'localhost';
```
「Unity入門者の会」に行ってきた

http://web3dj.connpass.com/event/39683/

Unityで最速でモックを作ってその場で一次納品した話 @enmanga 
---

その場でスマホアプリのモックを作って一次納品した

「歌入れて」もAudioSourceで追加して追加料金頂いた

書けない話多いｗ

Unityでスマホ向けVRを作った話 @FSyou
---

### 戸惑った話

* JSとC#で書けると言いながら、実質C#でしか書けない
    * C#にしかない機能がある
* 実機に移すと別物になる
    * terrainとか水の処理が重くて処理できないっぽい



個人Unity開発でのgit活用 @sekikatsu36
---

* Unityのプロジェクトをpublicなリポジトリに入れるのはAssetsの規約に違反するので注意
* BitBucket使いましょう
    * 2GBの壁がある

### 2GBの壁対策

* アセットインポート時に必要なものだけインポートする

### 複数環境でのUnity開発

* 環境を揃える
    * Unityとアセットのバージョンを揃える
    * ターゲットプラットフォームも揃える
* 同じファイルを同時編集しない（マージが発生しないようにする）
    * 特にSceneファイルはマージ出来る気がしない


俺（私）達が人権（Humanoid）を得るまでの物語 @m2wasabi 
---

好きなキャラクターを動かすために

3Dフィールドを動き回りたい

StandardAssetsでだいたい出来る

灰色のキャラクターだと寂しい

* Unityちゃん
* プロ生ちゃん
* 東北ずん子
* 中野シスターズ
* クエリちゃん

そのまま置き換えると棒立ちのまま動く

Rig > Animation Type を Humanoid にする。

TPSのMotionをインポートすると、人間らしく動く。

### Tips

外部エディタはVisualStudioCodeがオススメ。
Unity5.5からは色々設定してくれる。

FBXReviewがプチ便利

困ったときは[テラシュールブログ](http://tsubakit1.hateblo.jp)を見るとだいたい解決できる。
3分くらいで分かるdockerのdata volume

参考: https://docs.docker.com/engine/tutorials/dockervolumes/


## docker create, runでの`-v`オプション指定時

```shell
$ docker create -v /usr/src/app --name ${container_name} busybox
```

などど実行した際に、`-v`オプションで指定したパスへのdata volumeが暗黙的に作成される。

## data volumeを明示的に作成

```shell
$ docker volume create --name hoge_volume
```

この時、data volumeに使用するdriver pluginがインストール済みであればそれを指定することができ、NFS等を利用したdata volumeの作成も可能になる。(ただしdriverがその環境でinstallできるかは別なので注意)
SEE: https://docs.docker.com/engine/extend/legacy_plugins/#/volume-plugins

## data volumeの確認

`docker volume ls`で一覧

コンテナを指定して使用しているdata volumeを調べたい場合は以下のようにすれば、volumeの名前を取得できる。

```shell
$ docker inspect -f  "{{range .Mounts}}{{.Name}}{{end}}" ${container_name}
a0a725e99b55e150ecedafc2f2bcc51f4780d728695a2d5b20d70647eabea74e
```

## data volumeの削除

`docker rm ${container_name}`の際に`-v`オプションを付けない場合、data volumeは削除されない。
つまり、存在が残るので、`docker create`等の際に`-v ${data_volume_name}:/usr/src/app`などと指定すれば再度マウントすることも可能。
data volume自体を指定して削除する場合は`docker volume rm ${data_volume_name}`とする。

## docker composeで使う

`docker-compose.yml`をversion 2形式にした場合、`volumes`というkey以下に、data volumeを定義することができる。
これを利用して、永続化したdata volumeを各サービスにマウントすることができる。

```yaml
version: '2'
volumes:
    app:
        driver: 'local'
    mysql:
        driver: 'local'
services:
    mysql:
        # 中略
        volumes:
            # ${volumesに定義したkey}:{マウントパス}
            - mysql:/var/lib/mysql
    app:
        # 中略
        volumes:
            - app:/usr/src/app/
```

上記で`create`を実行した際に、以下のようなdata volume群が作成される。

```shell
$ docker volume ls
local               ${compose_name}_app
local               ${compose_name}_mysql
```

また、この場合もdata volumeは暗黙的に削除されることはなく、`docker-compose down -v`, `docker-compose rm -v`など`-v`オプションを指定することによって削除される。

---

data volumeを使えば永続化するためのdata containerは不必要。
ただし、data containerを使用すればdata volumeをまとめておいて、あとで一括で削除、というのもできる(っていうニーズがあるか…？)ので、状況によっては作る必要性はありそう。
Facebook Custom Audience API を利用したリスト更新

Faceboook Marketing API 
  https://developers.facebook.com/docs/marketing-api/custom-audience-api/v2.8

これを利用して、日々変わる広告対象のユーザー情報を自動更新していた。
しかし、2016年7月に作成したカスタムオーディエンスの枠組みと、2016年10月に作成した際、画面側の仕様が変わり、登録される情報が変更された。

# 何が起こったか

- 実行

```
curl -F 'payload={ "schema": "EMAIL_SHA256", "data": ["EMAIL","EMAIL"]  
  }' \
  -F 'access_token=<AccessToken>'
```

- 結果


> {"error":{"message":"(#2650) Failed to update the custom audience: This audience was created from data source FILE_IMPORTED.MULTI_HASHES, which does not support data source FILE_IMPORTED.HASHES_OR_USER_IDS.","type":"OAuthException","code":2650,"fbtrace_id":""}}

data source が違うよって

# 変更された情報の確認

```
curl -G \
-d 'access_token=<AccessToken>' \
https://graph.facebook.com/v2.8/<CustomAudienceID>\?fields\=data_source | jq
```

- 旧作成の枠組み確認結果

```json
{
"data_source": {
  "type": "FILE_IMPORTED",
  "sub_type": "HASHES_OR_USER_IDS", 
  "creation_params": "[]"
},
"id": "<CustomAudienceID>"
}
```

- 新規作成の枠組み確認結果
 
```json
{
"data_source": {
  "type": "FILE_IMPORTED",
  "sub_type": "MULTI_HASHES",
  "creation_params": "[]"
},
"id": "<CustomAudienceID>"
}

```

HASHES_OR_USER_IDS → MULTI_HASHES


さすが Facebook！ 仕様変更なんてがんがんやっちゃう！そこにしびれるあこ・・・
どこにも解決方法載ってないし、つらすぎ


# 解決策
いろいろ試した結果、以下のようにださーい方法で解決できた。


```
curl -F 'payload={ "schema": ["EMAIL_SHA256"], "data": [  
  ["EMAIL"],["EMAIL"]]  
  }' \
  -F 'access_token=<AccessToken>' \
```

EMAIL 1列しか使っていないにも関わらず、新たな仕様では1列でも `MULTI_HASHES` として認識される仕様へ変わった。
その為、全て `[]` で囲めばいいじゃんってことらしい。

これに気づくのに2時間もかかった・・・。


Marketing API を利用した事例が少なすぎるので、みんな使って事例欲しい
10倍速いらしい！NoSQLデータベース「Aerospike」のインストール方法

## Aerospikeとは

高速な処理を得意とする分散KVS。
SSDに最適化されたインメモリ高パフォーマンスNoSQLデータベース・KVSであり、高速性・スケーラビリティ・高可用性を誇る、NoSQLソリューション。

インストールだけなら、10〜15分ほどでできたので、手順をメモ。

## インストール先環境

```
cat /etc/system-release
Amazon Linux AMI release 2016.09
```

## Aerospikeインストール

```
wget -O aerospike.tgz http://aerospike.com/download/server/latest/artifact/el6
tar -xvf aerospike.tgz
cd aerospike-server-community-3.10.0.1-el6/
./asinstall
```

## 起動

```
service aerospike start

Increasing read socket buffer limit (/proc/sys/net/core/rmem_max): 212992 -> 15728640
Increasing write socket buffer limit (/proc/sys/net/core/wmem_max): 212992 -> 5242880
Starting and checking aerospike:                           [  OK  ]
```

## 各種ファイル

* ログファイル

```
cat /var/log/aerospike/aerospike.log
cat /var/log/aerospike/telemetry.log
```

* 設定ファイル

```
cat /etc/aerospike/aerospike.conf
```

## Aerospike Management Console（AMC） インストール

```
wget -O aerospike-amc.rpm http://www.aerospike.com/download/amc/latest/artifact/el6
rpm -Uvh aerospike-amc.rpm
```

## AMCの起動

```
service amc start
Starting AMC....
AMC is started.
```

## web管理画面にアクセス

```
http://<グローバルIPアドレス>:8081
```

> デフォルト設定のままであれば、8081番でアクセス

## 画面確認

<img width="1279" alt="スクリーンショット 2016-10-14 19.35.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/143284/12e8764b-c9c9-faf5-d45e-473074968c2c.png">


無事、つながった。疎通を確認


## その他、設定

```
memory-size - メモリの搭載量に応じて、設定値を変更
storage-engine memory - インメモリで捌く場合に設定
```

細かい設定や、conf周りなど、ベンチマークを取りながら、
今後チューニングをかけていきたい

参考文献：http://www.aerospike.com/docs/operations/configure/namespace
brew cask install firefox-ja ができなくなった問題の解決方法

# 解決方法

```
$ brew cask install firefox --language=ja
```

# 原因

- [https://github.com/caskroom/homebrew-versions/pull/2737](update firefox-beta to 50.0b5; add more languages.)
    - --language パラメータを新設したから firefox-ja が必要なくった模様。


# それにしても

```
$ brew cask info firefox-ja
firefox-ja:
/usr/local/Caskroom/firefox-ja/49.0 (68B)
Error: Invalid tap name '/'Most likely, this means you have an outdated version of Homebrew-Cask. Please run:
  brew uninstall --force brew-cask; brew untap phinze/cask; brew untap caskroom/cask; brew update; brew cleanup; brew cask cleanup

If this doesn’t fix the problem, please report this bug:
  https://github.com/caskroom/homebrew-cask#reporting-bugs

/usr/local/Homebrew/Library/Homebrew/tap.rb:29:in `fetch'
/usr/local/Homebrew/Library/Homebrew/cask/lib/hbc/cli/info.rb:55:in `github_info'
/usr/local/Homebrew/Library/Homebrew/cask/lib/hbc/cli/info.rb:23:in `info'
/usr/local/Homebrew/Library/Homebrew/cask/lib/hbc/cli/info.rb:11:in `block in run'
/usr/local/Homebrew/Library/Homebrew/cask/lib/hbc/cli/info.rb:7:in `each'
/usr/local/Homebrew/Library/Homebrew/cask/lib/hbc/cli/info.rb:7:in `run'
/usr/local/Homebrew/Library/Homebrew/cask/lib/hbc/cli.rb:109:in `run_command'
/usr/local/Homebrew/Library/Homebrew/cask/lib/hbc/cli.rb:148:in `process'
/usr/local/Homebrew/Library/Homebrew/cask/cmd/brew-cask.rb:8:in `<top (required)>'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/usr/local/Homebrew/Library/Homebrew/brew.rb:24:in `require?'
/usr/local/Homebrew/Library/Homebrew/brew.rb:100:in `<main>'
```

`brew cask info` で該当する Cask がなくなった際のエラーメッセージがこれではわかりづらいよ…。
一次元配列をテーブルに出力する時の書き方

一次元配列のデータをテーブルに出力する。

```php
$list = [
    'Alpha',
    'Bravo',
    'Charlie',
    'Delta',
    'Echo',
    'Foxtrot',
    'Golf',
    'Hotel',
    'India',
    'Juliet ',
];
```

```html
<table>
    <tr>
        <td>Alpha</td>
        <td>Bravo</td>
        <td>Charlie</td>
        <td>Delta</td>
    </tr>
    <tr>
        <td>Echo</td>
        <td>Foxtrot</td>
        <td>Golf</td>
        <td>Hotel</td>
    </tr>
    <tr>
        <td>India</td>
        <td>Juliet</td>
        <td></td>
        <td></td>
    </tr>
</table>
```

# 素直にループと条件分岐で書く

```php
<table>
<? foreach ($list as $key => $value): ?>
<? if ($key % 4 === 0): ?>
    <tr>
<? endif ?>
        <td><?= $value ?></td>
<? if ($key === count($list) - 1): ?>
<? while(++$key % 4): ?>
        <td></td>
<? endwhile ?>
<? $key-- ?>
<? endif ?>
<? if ($key % 4 === 4 - 1): ?>
    </tr>
<? endif ?>
<? endforeach ?>
</table>
```

とても読みにくいし、マジックナンバーの4がわんさか。
whileの空白行の処理が気持ち悪くてなんだか怪しい。

# array_chunkで書く

そもそもこのようなテーブルは、二重ループで処理するのがベター。
Viewでごちゃごちゃせずにテンプレートに合わせた形でデータを用意すべき。

それが難しい場合はarray_chunkで二次元配列にする。

[PHP: array_chunk - Manual](http://php.net/manual/ja/function.array-chunk.php)

```php
<table>
<? foreach (array_chunk($list, 4) as $row): ?>
    <tr>
<? foreach (array_pad($row, 4, null) as $value): ?>
        <td><?= $value ?></td>
<? endforeach ?>
    </tr>
<? endforeach ?>
</table>
```

array_padのnull埋めがクール。
いろいろな言語での Map, Dictionary 的なものの名前

いろいろな言語で、キーと値とを対応づけるデータ構造、いわゆる連想配列、辞書、……たちがどのように呼ばれているか、気になったので調べてみた。

おおよそ、対応表（map）、辞書（dictionary）、実装の名前をそのまま（hash-table）、 Perl風（hash）に分けられると思う。

<dl>
<dt>Common Lisp:</dt>
<dd>hash-table</dd>
<dt>Scheme:</dt>
<dd>hash-table (SRFI-69, SRFI-125 → R7RS-large), hashtable (R6RS Scheme, SRFI-126), map (SRFI-44), mapping (SRFI-146)</dd>
<dt>Haskell:</dt>
<dd>Map</dd>
<dt>OCaml:</dt>
<dd>Hashtbl, Map</dd>
<dt>SML:</dt>
<dd>hash_table (sml-nj-lib)</dd>
<dt>C++:</dt>
<dd>map, multimap, unordered_map, unordered_multimap</dd>
<dt>Java:</dt>
<dd>Map, HashMap, Hashtable, LinkedHashMap, TreeMap, WeakHashMap, ...</dd>
<dt>Scala:</dt>
<dd>Map, HashMap, ListMap, SortedMap, TreeMap, LinkedHashMap, MultiMap, OpenHashMap, WeakHashMap, ...</dd>
<dt>ECMAScript:</dt>
<dd>Object, Map</dd>
<dt>Perl:</dt>
<dd>hash</dd>
<dt>Ruby:</dt>
<dd>Hash</dd>
<dt>Smalltalk:</dt>
<dd>Dictionary</dd>
<dt>Python:</dt>
<dd>dict</dd>
<dt>PHP:</dt>
<dd><a href="http://php.net/manual/en/language.types.array.php">array</a></dd>
</dl>

この他に、配列/リストにキー・値の対応関係を格納したものを連想配列/連想リストとよび、それらに対する操作を提供している言語もある（例えば、 Ruby の `Array#assoc`、 Lisp の `assoc`、 OCaml の `List.assoc`）。

その他の言語での呼び名や、構造を操作する関数/メソッドの名前、リテラル表記、等々の比較については、 [syntax across languages per category / dictionary](http://rigaux.org/language-study/syntax-across-languages/VrsDatTps.html#VrsDatTpsDctnr) も参照。

---

Scheme の [SRFI-44](http://srfi.schemers.org/srfi-44/srfi-44.html#futurework) では M:1 のもの（<var>M</var> 個のキーをそれぞれ1つの値に対応づける）を map と呼び、 M:N のもの（<var>M</var> 個のキーをそれぞれ複数個の値に対応づける）を dictionary と呼んでいる。

[SRFI-146](https://srfi.schemers.org/srfi-146/srfi-146.html) では高階関数の `map` との[名前の衝突を嫌い](https://srfi-email.schemers.org/srfi-146/msg/4849431) map ではなく mapping という名前を採用している（Schemeでは手続きの名前を データ型-操作 の形式で付ける慣習があるため、 map データ型に対する map 操作は `map-map` という名前になってしまう)。

---

ちなみに、『プログラミング Perl 改訂版』（Larry Wall, Tom Christiansen, Randal L. Schwartz 共著、近藤嘉雪訳、オライリー・ジャパン、  1997） p.8 ではhashという名前の由来について以下のように解説している:

> そのためハッシュは「連想配列」（associative array）と呼ばれることもある。しかし、これは怠惰なタイピストにとってタイプするのが面倒だし、頻繁に使われるので、私たちはもっと短かくて、ぴりっとした（snappy）呼び名を付けることにしたのだ。「ハッシュ」という名前を選んだ別の理由は、中身が順番付けされていないことを強調するためである（ハッシュは、内部的にはハッシュ表を使って実装されている。ハッシュに値をどんなにたくさん格納しても、動作が速いのは、ハッシュ表のおかげである）。

---

さらにちなみに太古の Ruby は `Dictionary` や `Dict` という名前を使っていた時期があるようである。 [Index of /pub/ruby/1.0/](https://cache.ruby-lang.org/pub/ruby/1.0/) で公開されている ruby-0.49.tar.gz の ChangeLog には以下のような記述がある。

```
Thu Jul 14 11:18:07 1994  Yukihiro Matsumoto  (matz@ix-02)

        * autoexec.c: 削除. autoload関係の機能は今後検討しよう.

        * dict.c: 辞書クラスの正式名称をDictに変更した. 別名としてHashを用
          意した. 今までDictionaryなどと長い名前にしていたが誰も使っていな
          かったしね. *BACKWARD INCOMPATIBILITY*
```

この時期の Ruby には `dict.c` というファイルが存在する。

ruby-0.71.tar.gz の ChangeLog には以下のような記述がある。

```
Mon Mar 27 15:41:43 1995  Yukihiro Matsumoto  (matz@ix-02)

        * dict.c: Dict->Hashに全面的に移行．
```

0.71 にはもう `dict.c` は存在しない。
Ruby on Rails 環境構築メモ - Windows版 -

#Ruby on Rails 環境構築メモ
proxy環境とgemでハマったのでメモ
## 構築環境
Windows 7 64bit SP 1
## Ruby のインストール
- RubyInstallerをダウンロード
<br> http://rubyinstaller.org/downloads/
<br> 32bit版と64bit版を間違えないように。間違えるとDevKitのインストールでハマる。
- インストーラ実行
<br>インストールオプションの「Rubyの実行ファイルへ環境変数PATHを設定する」はONほかはお好きに。
- コマンドプロンプトで
<br>```> ruby -v```
<br>を実行。
<br>```ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32]```
<br>みたいにバージョンが表示されればOK

## DevKitのインストール
- DEVELOPMENT KITのダウンロード
<br> http://rubyinstaller.org/downloads/
<br> 32bit版と64bit版を間違えないように。間違えるとハマる。
- Rubyのルートディレクトリにでも解凍する
- DevKitのインストール
<br> コマンドプロンプト(管理者？)で次の通りに実行
<br>解凍したディレクトリに移動
<br>```> cd {RUBY_ROOT}\DevKit```
<br> インストール
<br>```> ruby dk.rb init```
<br>```> ruby dk.rb install```
<br> 次のように表示されればOK
<br>```> [INFO] Updating convenience notice gem override for ~~~~~```
<br>```> [INFO] Installing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~```
<br>上記の続きで次のコマンド入力 (環境変数に追加してくれる)
<br>```> devkitvars.bat```

## 自分の環境だとgemができなかったので次をやった
SSL関連の記事をよく見かけるが、次のように対処可能

- gemの最新をダウンロード  
  https://rubygems.org/pages/download
- C直下にでも置いとく
- インストール

```
> gem install --local C:\rubygems-update-2.6.7.gem
> C:>update_rubygems --no-ri --no-rdoc
> C:>gem uninstall rubygems-update -x
```
次のように表示されればOK

```
> Removing update_rubygems
> Successfully uninstalled rubygems-update-2.6.7
```

## Railsのインストール
- Bundlerインストール
<br>これやっておかないと失敗した
<br>```> gem install bundler -p http://プロキシアドレス:ポート```
- Railsのインストール
<br>```> gem install rails -p http://プロキシアドレス:ポート```
- 確認
<br>```> rails -v``` 

## 感想
SSL関連でAddTrustExternalCARoot-2048.pemの記事をよくみるけど、リンク先が404 NOT FOUNDになってる。
gemを更新するだけでできるようになるようだ。
asp.netをlinuxで


http://d.hatena.ne.jp/eco31/20101024/1287881179


http://www.thegeekstuff.com/2014/03/mssql-to-mysql-stored-procedure

http://www.sqlines.com/sql-server-to-mysql#transact-sql-statements


http://tkuchiki.hatenablog.com/entry/2013/09/12/171755
```shell-session
yum -y install yum-utils
yum-config-manager --enable REPOSITORY
```

http://qiita.com/kodamacom/items/3ab2acbdee7424c0c910

```shell-session
yum-config-manager --add-repo http://download.mono-project.com/repo/centos/
yum install mono-complete
yum install mono-basic
yum install xsp
```

nginx
*説明https://academy.gmocloud.com/qa/20160616/2761
http://qiita.com/ksugawara61/items/0fcf3f72cc905bb6d654

```shell-session
$ sudo groupadd hoge
$ sudo useradd -g hoge hoge
$ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ sudo yum -y update nginx-release-centos
$ sudo yum -y --enablerepo=nginx install nginx
$ nginx -v
```


```shell-session
 systemctl daemon-reload
 systemctl restart mono-server
 systemctl restart nginx
```




systemctl stop httpd
所有者を：httpd
ユーザを：apache

追記
listen = /var/run/php-fpm/php-fpm.socket

systemctl start php-fpm
systemctl enable php-fpm

インストール
rpm --import "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF"
yum-config-manager --add-repo http://download.mono-project.com/repo/centos/
yum install mono-complete
yum install xsp
yum install mono-basic

確認
fastcgi-mono-server4 --version
xsp4 --version


以下のファイル作成
/etc/systemd/system/mono-server.service

[Unit]
Description=Mono Server
Before=nginx.service
After=nss-user-lookup.target

[Service]
EnvironmentFile=
Type=simple
ExecStart=/usr/bin/fastcgi-mono-server4 /applications=/:/home/httpd/www/aspx/ /socket=unix:/var/run/mono/fastcgi-mono.socket
User=httpd
Group=apache

[Install]
WantedBy=multi-user.target

aspxのファイル入れる
Web.configのDBパスワード変更

mono-serverサービス化

*ソケットを作るために権限をつける
chown -R httpd:apache /var/run/mono
systemctl start mono-server
systemctl enable mono-server

nginxをインストール
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y update nginx-release-centos
yum -y --enablerepo=nginx install nginx
nginx -v

設定編集
実行ユーザ編集
vim /etc/nginx/nginx.conf

vim /etc/nginx/conf.d/default.conf

systemctl enable nginx.service

systemctl enable php-fpm.service

systemctl disenable httpd.service


8080ポート止める
firewall-cmd --remove-service=tomcat
firewall-cmd --permanent --remove-service=tomcat


https

SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCertificateFile /etc/pki/tls/certs/server.crt

listen              443 ssl;
ssl on;
ssl_certificate     /etc/pki/tls/certs/server.crt;
ssl_certificate_key /etc/pki/tls/private/server.key;
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         HIGH:!aNULL:!MD5;


エラーがが出た
 error VBNC30451
 以下のコマンドする
```shell-session
yum install libmono-system-design4.0-cil
```
環境変数の設定を間違えてほとんどのコマンドが command not found になってしまったときの対処法

# はじめに
先日、サーバの設定をいじっていたときにやらかしてしまい冷汗を書いたので、いざというときに焦らずに対処できるようにするためにここにメモしておきます。

# 原因
自分の中で得られた結論を先に言ってしまうと、**環境変数のexportは複数箇所に書くべきではない**です。

`.bash_profile`等に`export PATH="パス"`を追加することで環境変数が使えるようになります。たとえば`ls`コマンドは本来なら`/bin/ls`や`/usr/bin/ls`としなければ実行できませんが、`/bin`や`/usr/bin`を環境変数として登録しておけば単に`ls`と打つだけで実行できるようになります。

今回の問題の原因は、`export PATH="/path/to/something:/path/to/anything:$PATH"`となっている行の下に`export PATH="/path/to/badthing"`を追加してしまったことです。`PATH`への代入が複数ある場合は下に書いた代入文によって上書きされます（プログラムを書くときと同じです）。なので、今回の例だと`/path/to/badthing`にしかパスが通っていない状態となり、ほとんどのコマンドが環境変数から参照できなくなりました...（これが`"/path/to/thing:$PATH"`とかならまだ良かったんですがね...）

```bash
$ source ~/.bashrc
-bash: rbenv: command not found
$ vi ~/.bashrc
-bash: vi: command not found
$ ls -a
-bash: ls: command not found
```

パスが通っていないのなら、絶対パスから参照すればいいんだ！ とひらめきコマンドのパスを確認しようとするも...

```bash
$ which vi
-bash: which: command not found
```

(￣△￣；）

# 解決法
このサーバだけではもう手の打ちようがないので、同じOSのテストサーバで確認しました。

```bash
$ which vi
/usr/bin/vi
```

ということで、`vi`の絶対パスは`/usr/bin/vi`ということがわかりました。CentOSでもUbuntuでも同じでした。

パスがわかったところで再び問題発生中のサーバに戻り`vi`を起動

```bash
$ /usr/bin/vi ~/.bashrc
```

そして、パスを一行にまとめます。

```bash:~/.bashrc
export PATH="/path/to/something:/path/to/anything:/path/to/goodthing:$PATH"
```

パスは左から順に参照していきますので、たとえば`ls`の場合、`/path/to/something/ls`がなければ`/path/to/anything/ls`を調べ、それがなければ`/path/to/goodthing/ls`を調べ、それもなければ`$PATH`にあるパスを調べていきます。

ちなみにパス一覧は以下のコマンドで確認できます。

```bash
$ echo $PATH
/path/to/something:/path/to/anything:/path/to/goodthing:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

また、ホームディレクトリ内のディレクトリをパスに指定したい場合は`$HOME`を使用することで`$HOME`の箇所がホームディレクトリまでのパスとして認識されます。

```bash
# $HOME/.binはホームディレクトリ以下の.binディレクトリを参照する
export PATH="$HOME/.bin:/path/to/something:/path/to/anything:/path/to/goodthing:$PATH"
```

環境変数を正しく設定できたので再読込しようとします。ところが...

```bash
$ source ~/.bashrc
-bash: env: command not found
```

となり再読込もできませんでした。この場合、`source`コマンドは利用できますが、内部的に使用されている(?)`env`コマンドのパスが通っていないので実行できませんでした。

どうしたものかと少し悩みましたが、そういえば`.bashrc`の中身は`source`コマンドを使わなくてもシェルに再接続すれば新しい設定で読み込まれるので、一旦切断してしまえばいいことに気づきました。

ローカルの場合はシェルの終了、リモートの場合はSSHのコネクションを切断します。いずれにしても

```bash
$ exit
```

として、再びログインすることで`.bashrc`の中身が新しく読み込まれます。これで設定が間違っていなければちゃんと元に戻ります。

```bash
$ which vi
/usr/bin/vi
$ ls
file1 file2 file3 file4 file5
```

めでたしめでたし:smile:

# 結論
繰り返しになりますが、パスは一行にまとめるのがベターです。一行にまとめなくても

```bash
export PATH="/path/to/something:/path/to/anything:$PATH"
export PATH="/path/to/anotherthing:$PATH"
```

となっていれば、2行目の`$PATH`は1行目のパスの内容を参照するので、この記事のような問題は発生しませんが、冗長的ですし思わぬところでミスをしてしまう可能性があります。

サイトの説明によっては

```bash
$ echo 'export PATH="/path/to/something:$PATH"' >> ~/.bashrc
```

などと書かれていることがあり（現に自分が他の記事で使っています...）一行でまとめておくのはめんどうかもしれませんが、せめて本番サーバ等ではそうしておくほうが無難かな、と今回の反省を踏まえて感じました。
HTMLのフォームで全角数字を半角数字に変換するサンプル


### HTML

```html
<input type="text" class="convertHalfWidthNumeric" >
```

### JavaScript

```javascript
$(function(){
    $('input.convertHalfWidthNumeric').on('change', function(){
    var converted = $(this).val().replace(/[０-９]/g, function(s) { // (1)
    	return String.fromCharCode(s.charCodeAt(0) - 65248); // (2)
	});
	$(this).val(converted);
});
```

(1) ```[０-９]```の箇所を変えれば、変換したい全角文字の対象を変えられる。

(2) 半角文字の文字コードから65248番目の文字コードが全角文字になるため、このロジックを使う