OmniAICreator/Qiita-1.07M huggingface dataset:
MQTTブローカーサービスのsangoをgo言語でいじってみる

# はじめに
最近たまに聞くMQTTとは何かを調べる。そして折角なので、最近勉強したgo言語でいじってみる。

# MQTTとは
MQ Telemetry Transportの略。
Pub/Sub型モデルを採用したシンプルかつ軽量なプロトコル。TCP/IP上で動く。
特徴の詳細は以下。

## Pub/Sub型モデルのため、1対多でメッセージのやりとりが可能
### Publisher
メッセージを発行する役
###Subscriber
メッセージを購読する役
###Broker
PubとSubの仲介役

基本的にはPublisherとSubscriberがクライアント、Brokerがサーバーと考えて差し支えないはず。

```
Pub =(topic A)=>| Broker |<=(topic A,B)= Sub
```
###topic
メッセージ毎に設定する。Sub側は予め自分が購読したいtopicを指定しておく。Pubが該当のtopicのメッセージを発行した場合、Subはそれを購読する事ができる。

topicは/区切りで表現される。hoge/fuga/barみたいな感じ。topicの指定には下記の2種類のワイルドカードを使うことができる。

+: 該当の階層のみすべて。例 hoge/+/bar (hoge/fuga/bar、hoge/FUGA/buzz)
 # : 該当の階層以下すべて。例 hoge/# (hoge/fuga/bar、hoge/fuga/buzz、hoge/FUGA/bar)

## プロトコル仕様が簡易・軽量
固定長ヘッダーは最小で2バイト。

## Willによる不意のコネクション切断時の制御
意図せずサーバーとクライアントの接続が切れた場合に、サーバーはそれを検知してクライアントが予め設定してあったtopicとメッセージを流すことができる。これをWill(遺言)という。


## QoSによるメッセージ到達可能性の制御
メッセージの到達可能性を複数段階設定できる
>「At most once (最高 1 回)」: メッセージは基礎となる TCP/IP ネットワークのベストエフォートに従って送達されます。メッセージの消失や重複が起こる可能性があります。このレベルはアンビエント・センサーのデータなどに利用することができます (アンビエント・センサーでは、あるデータが失われても、すぐに次のデータが公開されます)。
「At least once (最低 1 回)」: メッセージは必ず到着することが保証されますが、メッセージが重複して到着する可能性があります。
「Exactly once (正確に 1 回)」: メッセージは必ず 1 回のみ到着することが保証されます。このレベルは課金システムなどに利用することができます (課金システムではメッセージの重複や消失は誤課金につながります)。

(引用 [MQ Telemetry Transport (MQTT) V3.1 プロトコル仕様](https://www.ibm.com/developerworks/jp/websphere/library/wmq/mqtt31_spec/))
上から順にQoS0,1,2。書いてあるように、通常はQoS0で課金だけQoS2とかにすればよい。

## その他
RetainやPersistent Sessionなど。今回は割愛。

# MQTTサーバーを使って見る
今回は[sango](https://sango.shiguredo.jp/)というMQTTブローカーサービスを使って、少しだけクライアント実装してみた。

といってもライブラリに使った[paho](http://www.eclipse.org/paho/clients/golang/)のほぼサンプルコードをコピーしただけ。

https://github.com/hiro-d/mqtt-sample/blob/master/pubsub.go

# 参考文献
[日本語の仕様書](http://public.dhe.ibm.com/software/dw/jp/websphere/wmq/mqtt31_spec/mqtt-v3r1_ja.pdf)
WEB+DB PRESS Vol.88 IoT時代のプロトコル [速習]MQTT
[akane](http://akane.shiguredo.jp/mqtt.html)
http://tdoc.info/blog/2014/01/27/mqtt.html
[MQTTとはなんだったのか](https://gist.github.com/voluntas/e0a90f3e22316144ed3a)
themesの追加

## 参考

* [Lubuntu/Theming - Community Help Wiki](https://help.ubuntu.com/community/Lubuntu/Theming)

## 追加方法

```bash:
mkdir ~/.themes
```

* [9 Great LXDE Themes - Make Tech Easier](https://www.maketecheasier.com/9-great-lxde-themes/)

から気に入ったthemeをダウンロード、解凍

```bash:例
~/.themes/Ambiance/
```

![img.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9f354663-64a8-ed1c-b224-0101ffd17a70.png)
leJOS 複数台制御

# leJOSの複数台制御

leJOSの無線接続による複数台の制御について調査した。複数台のEV3の制御方法としては、以下の画像のようにEV3同士でBluetooth接続を行うことで複数のEV3を制御する方法をとった。

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/20eb2f60-3b71-8380-e030-1d35ba3ddaa7.png)

# EV3同士での接続
アクセスポイントに接続するEV3を子機として設定する。leJOSの**PAN**、**BT Client**、**Select**と選び、検索されたうち親機を選択しトップ画面に戻る。すると、砂時計が表示され設定が行われる。これで複数台制御の準備は完了である。

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/99b40588-c748-c1b0-9cdd-4f9b3e32a6fc.png)

2台目以降を接続する場合も同様の手順で、EV3の子機を増やすことができる。

# 参考文献
leJOS News
https://lejosnews.wordpress.com/2015/02/27/pan-the-lejos-answer-to-daisy-chaining/
leJOS EV3 Control Center

# EV3 Control Center の利用

leJOSのインストールに伴いPCにEV3 Control CenterもしくはEV3 Controlというものがインストールされている。これを利用することで、PCからleJOSに接続しleJOS側で行っていた操作をPCから行うことができる。使用方法は、名前やアドレスからEV3を検索し接続を行う。そうすると、EV3の画面がEV3 Controlの画面下部に表示される。あとはボタンをクリックで、普段EV3を操作するのと同じ要領でEV3を操作することができる。他にも便利な機能が多くある。

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/1d473f30-1277-ffe7-edd5-751674bf8734.png)
Ubuntuでpostgresql9.5にupdateしたあとにpsqlで9.5にいくようにまでしてみた

ubunut15.10でpostgresql9.5にupdateしたあとに、
psqlが9.4をみにいってしまう。

port指定したら9.5を見に行く。

```shell-session
psql -p 5433
```

psqlはデフォルトで5432に接続するみたい。
下記confの9.4,9.5をを5433と5432で入れ替えてOK。

```text:/etc/postgresql/9.?/main/postgresql.conf
port=5433
```

いろいろ調べたら、psqlのユーザなどでバージョン指定できるらしい。
[Ubuntu で PostgreSQL を使ってみよう(続編)](http://lets.postgresql.jp/documents/tutorial/ubuntu/4)

```text:/etc/postgresql-common/user_clusters
 # USER	GROUP	VERSION	CLUSTER	DATABASE
postgres postgres 9.5 main postgres
```
Ubuntuだとinitdbとかちょっと違うらしい。
leJOS Bluetoothによるプログラムの転送

# EV3 leJOSにおけるBluetoothの利用
leJOSの無線接続によるプログラムの転送について調査した。やり方としてはWiFiドングルを利用してWiFiで接続するものと、Bluetoothで接続するものの2通りがある。今回は手軽にできるBluetoothを利用して接続する方法を選択した。

開発環境はeclipseである。

# EV3の名前変更
事前に名前を変えておくほうが混戦しなくて良い。
http://qiita.com/uchiyu/items/03a7469f4691bc95f2ca

# PCからleJOSへの接続と設定
まず、Bluetoothデバイスの追加を行う。インジケータの中のBluetoothアイコンをクリックし**Bluetooth デバイスの追加**をクリックする。そして、画面遷移語しばらく待機すると設定した名前の機体が表示される。表示された機体を選択してペアリングをクリックする。すると、デバイスのパスコードを求められるので入力する。パスコードは、デフォルトでは**1234**である。ペアリング済みになれば接続は完了である。

パスコードは、leJOSのBluetoothのChange PINから確認・変更できる。

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/cae04dd9-1736-ec3d-6ed0-f4ac7929bfa8.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/651accdd-166f-b40f-aa6c-07d487d3f3db.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/68b8476b-f866-7979-969d-49c0d3393d8d.png)

# 接続方法の設定
先ほど同様に、Bluetoothアイコンをクリックし、今回は**パーソナルエリアネットワークへの参加**を選択する。そして、デバイスを選択し**接続方法**、**アクセスポイント**をクリックする。接続完了と出たら終了である。EV3が出現しない場合は、ネットワークアダプタの設定で必要のない通信を無効にすると良い。

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/01e59bc2-dc86-cf24-c168-7b9c3ad408a0.png)

以上でセットアップは終了である。eclipseでプログラムを実行すると、EV3にプログラムが転送され実行する。無線通信なので多少タイムラグが生じ、少し時間がかかる。
leJOS 名前の変更

# EV3の名前変更
EV3の無線で表示される名前はデフォルトではEV3となっている。そのため、EV3を無線で使おうとした際、混線しかねないため名前を変更しておく。

leJOSでSystem、Change nameと進み、名前を入力後、✓を押すとしばらく砂時計のマークがでたあと名前の変更が完了する。escapeボタンでトップページに戻ると名前が変更されている。いちおう、leJOSを再起動しておいた方がいいかも

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/934182d9-76c1-fb55-cf32-4b83cd430bed.png)
とあるアドレスレンジで使われているIPの確認をワンライナーで

自宅環境等で今使われているIPをさくっと確認したいときー。\ｶｸﾆﾝｼﾀｲﾄｷ－/
> pingコマンドのパラメータ調整で信頼性が低い、かつpingの並列実行でプロセスガンガン増やすので、間違っても商用環境ではNGです。

みんな大好きxargsの出番です。
完成版は以下。もう少し短くしたかった。

```
$ echo 192.168.0.{1..254} | xargs -P 100 -n 1 -I@ ping -c 1 -W 1 @ | grep -B 1 -e '1 received' | gawk  '/^---/ {print $2}'
192.168.0.1
192.168.0.3
192.168.0.2
192.168.0.5
192.168.0.8
192.168.0.9
192.168.0.10
192.168.0.50
192.168.0.51
192.168.0.175
192.168.0.180
192.168.0.190
192.168.0.200
192.168.0.211
```
上記のうち、'**1** received' を '**0** received'に変えれば、反対に未使用のIPアドレスが取得可能。5秒以内にはおわると思います。出力順序は保証されないので、必要あればsortぶちこむなど。

## ポイント
```
echo 192.168.0.{1..254}
```
- ブレース展開使ってレンジを指定する


```
tr ' ' '\n'
```
- ~~このままだと1つのパラメータとしてxargsに渡るので、改行に変換~~
- 上記コマンドは不要。後の`xargs -n 1`で引数の最大数を1にするため。


```
xargs -P 100 -n 1 -I@ ping -c 1 -W 1 @
```
- xargsの'-P 100'で同時実行プロセス数の最大値を指定する。ここが並列実行の要。
- xargsの'-n 1'により、パイプから受け取ったアドレスを **1つずつ** pingコマンドの引数として渡す。複数渡すと挙動が変わっちゃうぜぃ。
- pingの'-c 1'で1つのIPにつき、pingを1回だけうつ。時間短縮。
- pingの'-W 1'でタイムアウト値を1秒にする。時間短縮。

```
grep -B 1 -e '1 received'
```
- '1 received'ならホストが生きてる
- grepの'-B 1'で、アドレスの記載がある前行含めて出力

```
gawk  '/^---/ {print $2}'
```
- アドレスだけとりだす。

# 2016/03/01 追記

ngyukiさんのふつくしいワンライナー。これからはこっちを使おう（汗

```
echo 192.168.0.{1..254} | xargs -P 100 -n 1 sh -c 'ping -c 1 -W 1 $1 >/dev/null 2>&1 && echo $1' --
```
pingの終了コードから、正常終了しているものはechoで出力。このとき、
shコマンドでひとくくりにしてるから、$1を参照すればechoでIPアドレスを表示できちゃう。
こちらの場合で使用されていないアドレスを調べる場合は、 "&&" -> "||"に書き換えてあげればOKです。
WindowsでEmacsをGitのエディタにする

#Gitのインストール
https://git-for-windows.github.io/ からダウンロード・インストールを行います。

#Emacsのダウンロード・バイナリ配置
こちらはインストーラはなく、適当な場所に配置するだけです。Windowsで使用できるEmacsは何種類か(CygwinかMinGWか、32bitか64bitか)ありますが、64bitWindowsでよく使用される代表的なものとしては

- [gnupackのEmacs(Cygwin)](http://gnupack.osdn.jp/docs/latest/UsersGuide.html)
- [NTEmacs(MinGW 32bit)](http://cha.la.coocan.jp/doc/NTEmacs.html)
- [NTEmacs64(MinGW 64bit)](https://github.com/chuntaro/NTEmacs64)

の3つがありますが、個人的には一番下の[NTEmacs64(MinGW 64bit)](https://github.com/chuntaro/NTEmacs64)を推奨します。(gnupackはWindowsの関連付けと相性×、真ん中は32bitなのでパス)NTEmacsにはIMEパッチを当てたものの当てていないものの2つがありますが、当てたもので大丈夫です。このリンクを踏むとGitHubのページに飛びます。Emacsのバイナリ及び必要なファイルは1つのZIPアーカイブに入っています。通常は
https://github.com/chuntaro/NTEmacs64/blob/master/emacs-24.5-IME-patched.zip
の方をダウンロードします。動かない場合は
https://github.com/chuntaro/NTEmacs64/blob/master/emacs-24.5-IME-patched-generic-cpu.zip
の方も試してみてください。ZIPファイルをダウンロードしたら解凍し、適宜ディレクトリ名を変更(`emacs`など)して好きなディレクトリに配置します。(Dドライブ直下など)

#環境変数の設定
まず、 Win + X(Windowsボタン右クリック) → システム(Y) → システムの詳細設定 → 環境変数(N) で環境変数のウインドウを開きます。

##環境変数HOMEの設定
NTEmacsは環境変数HOMEが設定されていないと、(ホームディレクトリ)\AppData\Roaming という込み入った場所をホームディレクトリとし、そこに`.emacs.d`という名前のディレクトリを作成し、設定ファイルをなどを置いてしまいます。しかし、Git Bashには予めこの環境変数が設定されているので、直接Emacsを起動することを前提に設定を行うとGit Bash越しに起動した時に初期設定で起動されてしまいます。ですので、初回起動時までに環境変数HOMEを設定します。

ユーザ環境変数側の「新規(N)」を押して、変数名に「`HOME`」、変数値に自分のホームディレクトリ(通常は`C:\Users\(自分のユーザ名)`)、または「`%USERPROFILE%`」と入力した後、OKを押します。(後者を入力した場合、前者に変換される)

すると、Emacsは普通に起動してもGit Bashから起動してもホームディレクトリの.emacs.dディレクトリから設定を読み込んでくれます。

##Emacsのパスを通す
Git BashはWindows側で通したパスにある実行ファイルも直接実行できます。ですので、ここでEmacsの実行ファイルがあるディレクトリ(最初は(解凍して出てきたディレクトリ)\bin)にパスを通します。

システム環境変数側の「Path」を選択し、「編集(I)」を押します。変数値のパスの後ろにEmacsの実行ファイルがあるパスを追記します。(前のパスとは「;」で区切る)
Unix系のパスは「:」で区切りますが、Windowsでは「;」で区切ることに注意してください。
追記したらOKを押して、環境変数・システムのプロパティダイアログもOKで閉じます。
これでパスが通りました。
これ以降コマンドプロンプト・PowershellからEmacsを別ウインドウで起動したいときは、

```ps1
start emacs
```

と入力すると起動できます。(Unix系の`emacs &`に相当)
`emacs -nw`は文字コードの面から非推奨です。

#GitのエディタをEmacsにする

予め
http://qiita.com/Tats_U_/items/cb7ee924541a58c66946
の方法でmagitを使用できるようにしておくと便利です。(設定は(ホームディレクトリ)\.emacs.d\init.elに追記)
その後、Git Bashを開き、

```bash
git config --global core.editor emacs
```

と入力します。これで設定は完了です。Git Bash内蔵のVimに戻すときは

```bash
git config --unset --global core.editor
```

と入力します。

#注意事項
- Git Bashから`emacs -nw`は使用できません。
- Emacsは新しいウインドウで立ち上がります。VimみたいにGit Bash内で完結するということはありません。
- Emacsの起動はVimと比べると結構時間がかかります。

#おまけ
GVimをGitのエディタにしたい場合も同様にWindows版バイナリをダウンロードしてパスを通してGitでエディタ設定をすればOKです。コマンド版VimはGit側が優先されるので気にしなくてOKです。
ESP8266 (ESP-WROOM-02) 工作で使う回路ライブラリ その1 (人感センサーと延長可能ワンショット)

## 概要
ESP8266 (以下 WROOM02) 工作で使う予定の回路を集めていく

## はじめに
最近、投稿が無かったがサボっていたわけではなくて、やりたい回路がなかなかうまく動かなかったからなのだ。
やっと、使えそうなものができたので忘れないうちにQiita化して残しておこう、というその１。
人感センサーを使って、人に反応したら一定時間ONになる。かつ、人がいる間は延長し続ける回路。

やりたいこと全体像 (本編は、網掛け部分)
![スクリーンショット 2016-03-05 22.02.53.png](https://qiita-image-store.s3.amazonaws.com/0/69410/09b4e1c6-aafa-ee0f-591a-f875e1de1ce6.png)
 - <a href="http://qiita.com/exabugs/items/f3b1296d78f3d14513c0" target="_blank">回路ライブラリ その1 ( 人感センサーと延長可能ワンショット )</a>
 - <a href="http://qiita.com/exabugs/items/cf410c42d644178dc612" target="_blank">回路ライブラリ その2 ( AC100VからDC12Vを作る コンバータ回路 )</a>
 - 回路ライブラリ その3
 - 回路ライブラリ その4

## 部品
 - 人感センサーは「<a href="http://qiita.com/exabugs/items/4dac3beefbe3fd512b8d" target="_blank">ESP8266 (ESP-WROOM-02) で人感センサーを使う</a>」で登場した
Panasonic の <a href="http://akizukidenshi.com/catalog/g/gM-09750/" target="_blank">焦電型赤外線センサー PaPIRs 5m EKMC160111</a>
 - タイマーIC は 一番メジャーな 555 <a href="http://akizukidenshi.com/catalog/g/gI-00130/" target="_blank">ＣＭＯＳタイマーＩＣ　ＬＭＣ５５５</a>

## ポイント
 - LMC555 はタイマー延長ができないが、それでは困る。人がいる間は切れないで欲しい。
 - タイマー延長が可能なICもある。<a href="http://www.marutsu.co.jp/pc/search/keyword=74HC123" target="_blank">74HC123</a>。何故か秋月では扱っていない。千石で見つけたが一個 (2回路) 200円。(これを使うと「負け」の気がする)
 - 2週間程、何か解決策は無いものかと、あてもなく彷徨っていると、凄いサイトを見つけた。それはここ 「<a href="http://www.kansai-event.com/kinomayoi/" target="_blank">気の迷い</a>」。(この人凄い、凄すぎる！)
 - そこの記事 「<a href="http://www.kansai-event.com/kinomayoi/post_denki_2008B.html#20081125_2" target="_blank">555ワンショットタイマーを再延長可能に</a>」を参考に、人感センサー PaPIRs を使って、最小部品点数でいい感じに動作する回路を、ついに完成させた。
 - タイマーIC555 と NPN型トランジスタ(2SC1815) 2石 と コンデンサ 1個、抵抗少々。センサー以外は、合計100円以内 なので財布に優しい。

## 回路図

upverter
<a href="https://upverter.com/exabugs/8ab76a62ecd5dfc8/censor" target="_blank">https: //upverter.com/exabugs/8ab76a62ecd5dfc8/censor</a>


![censor.png](https://qiita-image-store.s3.amazonaws.com/0/69410/8ae6c12e-9adb-5831-7670-232ea616085d.png)



 - トランジスタ Q2 は、PaPIRs の出力の位相を反転させる役割。
 - トランジスタ Q1 は、チャージ用の コンデンサ C1 を強制放電させる役割。
 - 欲しい結果は、555 の OUTPUT 端子に出る。
 - タイマー時間は、1.1 x C1 x R3 で求まる。この回路図では、1.1 x 47u x 100K = 5.17秒。
 - 人がいなくなって 5.17 秒でタイマーが切れるが、人がいる間は、ず～と延長し続ける。
 - R5 (プルダウン抵抗) は大きいほど良い。(最小は R2 の 1/5 (20KΩ)。これより大きいこと)
 - R2 は PaPIRs の仕様から、100KΩ がベスト。
    - センサー出力電圧は 5.0 - 0.5 = 4.5V
    - Q2 の ベース電圧は 0.67V
    - よって、R2 にかかる電圧は 4.5 - 0.67 = 3.83V
    - R2 が 100KΩ なら、流れる電流は 38.3μA < 100μA なので OK。
 - R1 は 色々試したところ、10KΩ がいい。(ここ理論的に出なかった。スイマセン)
 - R4 は無くてもいい。小さい値で。トランジスタが壊れないように、100Ω にしておく。
 - テスト時は、OUTPUT 端子に適当に LED (+電流制限抵抗) とか付けてみてください。
 - 書き忘れてました。電源電圧は 5V です。

## まとめ
 - この回路で、人がいる間は 555 の OUTPUT 端子 が 1 になる。
 - 今後は、ここに リレー を繋げる予定。
 - その リレー で、WROOM02 自身を動かす。究極の DeepSleep を目指すのだ！
 - あるいは、普通に 100V リレー を繋げて、照明を自動化する。(この場合、WROOM02の出番が無い)
embulk bundleだけでJavaで書かれたプラグインをインストールし利用する方法

以前[embulkのjava pluginをbundlerっぽくgithubからインストールして実行できるラッパーを作った - Qiita](http://qiita.com/joker1007/items/5360899dcbac8d19ee4f "embulkのjava pluginをbundlerっぽくgithubからインストールして実行できるラッパーを作った - Qiita")という記事を書いた。

要はJava製のプラグインをgithubから直接インストールしてリリース前のものを使いたいというものだ。
で、コマンドをラップするgemを作ってみたのだが、DSLの挙動をちゃんと制御するのは面倒だしコマンドをラップするのは色々とポータビリティが悪い。

しかし、ある時天啓が降りてきた。
「Bundlerを弄ればいいや」と。

で、ソースコード読んで、gemspecの判別がどうなってるのかとモンキーパッチを当てるのにちょうど良い場所を探して試してみた所、とてもシンプルなハックで上手くいった。
Gemfile上でBundlerにモンキーパッチを当てるというダーティさに目を瞑れば割と便利ではないだろうか。

こんな風に書く。

```rb
require 'bundler/source/git/git_proxy'

module AddGradlewHookForEmbulkPlugin
  def copy_to(destination, submodules=false)
    super
    if destination.join("./gradlew").exist?
      system("./gradlew gem", chdir: destination.to_s)

      Dir[destination.expand_path.join("{,*,*/*}", "build", "gemspec").to_s].each do |gemspec|
        system("cp", gemspec, File.expand_path("../../plugin.gemspec", gemspec))
      end
    end
  end
end

Bundler::Source::Git::GitProxy.prepend(AddGradlewHookForEmbulkPlugin)

source 'https://rubygems.org/'
gem "embulk-input-postgresql", github: "embulk/embulk-input-jdbc"
gem "embulk-output-bigquery", github: "joker1007/embulk-output-bigquery", branch: "multithread-upload"
gem "embulk-filter-column"
gem "embulk-filter-ruby_proc", path: "~/srcs/embulk-filter-ruby_proc"
```

単純にgithubからcloneしてきた後に、そのディレクトリにgradlewがあればそれでgemをビルドして出力されたgemspecを適当な名前で置き直すだけ。
この程度なら、bundlerがよっぽど大規模に書き変わらない限りさしてメンテコストもない。

この方法のメリットは、単純に-bオプションでbundleディレクトリを指定するだけで、普通にプラグインが読み込めることだ。
というわけで、拙作のembulk_javundlerは早くもお役御免になった。

embulk-coreには確かbundlerが同梱されてるはずなんだけど、そのbundlerを弄ってembulk用にこういう機能を公式で組み込んで欲しい感じはする。
しかし、やり方がやり方なのでそんなに強い要望ではないw
bundler自体にちゃんとフックポイントが用意されていれば良いんだろうけど、普通はそんな用途無いよなあ……。
10人の点数と偏差値を一覧表示

10人の点数と偏差値を一覧表示

全員が100点や0点などの分散0のときを考慮して作成した。
偏差値算出式や結果正誤確認のため、偏差値算出サイトで確認したが、
全員0点の場合の0点での偏差値はエラーになって確認できなかった。
あれ？偏差値50でないのかな？
ここでは特に問題でないので先へ。

>
1人目の点数を入力してください　60
2人目の点数を入力してください　60
3人目の点数を入力してください　60
4人目の点数を入力してください　60
5人目の点数を入力してください　60
6人目の点数を入力してください　0
7人目の点数を入力してください　0
8人目の点数を入力してください　0
9人目の点数を入力してください　0
10人目の点数を入力してください　0
1人目　素点60点  偏差値60.0
2人目　素点60点  偏差値60.0
3人目　素点60点  偏差値60.0
4人目　素点60点  偏差値60.0
5人目　素点60点  偏差値60.0
6人目　素点0点  偏差値40.0
7人目　素点0点  偏差値40.0
8人目　素点0点  偏差値40.0
9人目　素点0点  偏差値40.0
10人目　素点0点  偏差値40.0


```java:Stdscore.java
import java.util.Scanner;
class Stdscore{
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		int i,j=0,total=0,n[]=new int[10];

		for(i=0;i<n.length;i++){
			System.out.print(i+1 + "人目の点数を入力してください　");
			n[i] = scan.nextInt();
			total = total + n[i];
			j = j + (int)Math.pow(n[i],2);
		}

		double average = (double)total/n.length;
		double bunsan = (double)j/n.length - Math.pow(average,2);
		double hensachi=0;

		for(i=0;i<n.length;i++){
			if(bunsan == 0){
				hensachi = 50.0;
			}else{ 
				hensachi = (double)(n[i] - average)/Math.sqrt(bunsan) * 10 + 50; 
			}
			System.out.println(i+1 + "人目　素点"+ n[i] + "点  偏差値" + hensachi);
		}
	}
}
```

平均や分散の算出処理は、mainメソッドでなく、別メソッドに切り出す様に
手直し。
処理は適度に分けた方が見た際に理解しやすく開発時にいいらしい。

もちろん結果は変わらない。

```java:Stdscore2.java
import java.util.Scanner;
class Stdscore2{
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		int i,n[]=new int[10];

		for(i=0;i<n.length;i++){
			System.out.print(i+1 + "人目の点数を入力してください　");
			n[i] = scan.nextInt();
		}

		double average = Ave(n);
		double bunsan = Bunsan(n);
		double hensachi=0;
				
		for(i=0;i<n.length;i++){
			if(bunsan == 0){
				hensachi = 50.0;
			}else{ 
				hensachi = (double)(n[i] - average)/Math.sqrt(bunsan) * 10 + 50; 
			}
			System.out.println(i+1 + "人目　素点"+ n[i] + "点  偏差値" + hensachi);
		}
	}

	private static double Ave(int[] n){
		int total=0,i;
		for(i=0;i<n.length;i++){
			total = total + n[i];
		}
		return (double)total/n.length;
	}
	
	private static double Bunsan(int[] n){
		int j=0,i;
		for(i=0;i<n.length;i++){
			j = j + (int)Math.pow(n[i],2);
		}
		return (double)j/n.length - Math.pow(Ave(n),2);
	}
}
```

長くなった気もするが、確かに理解はしやすいかも。
でも今の私の理解だと
`private static double Ave(int[] n)`とか`return`とか忘れそう。。

あと`println`を`print`とすることで改行されないことに気づいた。
[備忘録] pyenvで無限ループが発生した場合の確認事項

## 背景
データ解析ライブラリをまとめて導入するためにanacondaをインストールしようとしたのですが、pyenv(複数バージョンのPythonを切り替えられるパッケージ)でanacondaをインストールしようとした途中でpipやpythonコマンドを実行すると無限ループが発生しました。
「pyenv 無限ループ」などで調べて、[a_yasuiさんの投稿](http://qiita.com/a_yasui/items/8cdc9be7a410e9529687)なども参考にしたのですが、.bash_profileの先頭で

```shell-session
PATH=$PATH:~/.pyenv/shims/
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
```

を追加し、.bashrcも確認したため、何か別のことに問題があるのだろうと推測しました。

## 環境
OS: Mac OSX El Capitan 10.11.3
実行環境: Mac標準のTerminal
pyenv: Build 20151210, 20160202 で確認
*pyenvはHomeBrewでインストール

## 症状と解決策
症状としては、pipコマンドなどを実行すると bash → readlink → bash というようにコマンドがループして、実行が進まなくなりました。
解決策としては、__Pythonをpyenv installコマンドでインストールして、pyenv localでpythonを適用すれば直りましたorz__。
まず、

```shell-session
>> which python
/Users/user/.pyenv/shims/python
>> which pip
/Users/user/.pyenv/shims/pip
```
となっていたのですが、pyenv version コマンドを入力すると、

```shell-session
>> pyenv version
system (set by /Users/user/.pyenv/version)
```

とだけ表示されていたので、「あれ、pyenvでPython入れてないじゃん」ということに気づき、

```shell-session
// >> pyenv install -l でインストール可能なバージョンを確認できる
>> pyenv install Python3.5.0 // Pythonのインストール
>> pyenv rehash // pyenvをリフレッシュ
>> pyenv local Python3.5.0 // pythonの適用
>> pyenv global Python3.5.0 // pythonの適用
```

と入力して、使用するPythonを変更した後に pip, pythonコマンドを実行するとうまくいきました。
おそらくですが、pyenvの環境内(/Users/user/.pyenv/)で用いるpythonにsystemのpythonが用いられると不具合があるのではないかと勝手に想像しています。

もしかすると再現性のない症状かもしれないのと、pyenvをよく理解しないで利用していたための凡ミスだと思いますが、同じような症状に偶然なられた方は pyenvで用いられているPythonがsystemのものでないかを確認してみてください。ご参考になれば幸いです。

*追記
やはり、

```shell-session
pyenv local system
pyenv global system
pip
```
と入力して、pipなど実行すると無限ループが再現しました。僕の環境のみで起こることなら良いのですが...

## appendix

そもそもなぜpythonが動かないと気付いたのかと言うと、SublimeCodeIntelを利用していて、logを見ていると

```
evaluating 'str' at hoge.py#37: no Python scan info for <Python buf 'hoge.py'>
done eval: eval error
```

と出力されてました。pythonがおかしいのではないかと当たりをつけてterminalでpythonを実行すると上の症状が発覚したという流れです。
unitQuaternionの自動設定

そういうわけで、unitQuaternionを設定していないでpositionだけを設定したczmlファイルからorientation{epoch:,unitWQuatenion:}を自動的に設定するスクリプトを作成してみた。

まだ、プログラムとしては不完全で、１個のモデルにしか対応していないのだが、まあそこは拡張できるだろう・・ということで参考に利用していただければいいなあと思う訳である。

４行目あたりの./air.czmlがオリジナルのczmlでこれを
 node  ff.fs >air2.czml
とかすれば無事unitQuaternionを追加したczmlができあがるというものである。
まあ、オリジナルのpositionはcartographicDegreesで書いてあることが前提
であったり、epochタイプで指定してあるのが前提であるとかいろんな限定があるのだが、あくまで参考である。よろしく
そうか、ソースにあるように、../../Source/Cesium.jsで動くので動かす場所によってここを操作しないといけないということなので、そこもよしなに

```js:ff,js
r=require('requirejs');

var C=r('../../Source/Cesium.js');

fs = require('fs');
fs.readFile('./air.czml', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  cz=JSON.parse(data);
  pg=cz[1].position.cartographicDegrees;
  //console.log(pg);
var po=new C.SampledPositionProperty();
var t0=C.JulianDate.fromIso8601(cz[1].position.epoch);
var t1=t0;
len=pg.length/4;
for (var i=0;i<len;i++){
    p1=C.Cartesian3.fromDegrees(pg[i*4+1],pg[i*4+2],pg[i*4+3]);
    t1=C.JulianDate.addSeconds(t0,pg[i*4],new C.JulianDate());
    po.addSample(t1,p1);
}
var ori=new C.VelocityOrientationProperty(po);
xx=[]
q1=new C.Quaternion();
for (var i=0;i<len;i++){
    t1=C.JulianDate.addSeconds(t0,pg[i*4],new C.JulianDate());
    ori.getValue(t1,q1);
    xx[i*5]=pg[i*4];
    xx[i*5+1]=q1.x;
    xx[i*5+2]=q1.y;
    xx[i*5+3]=q1.z;
    xx[i*5+4]=q1.w;
}
cz[1].orientation={epoch:cz[1].position.epoch,unitQuaternion:xx};
console.log(JSON.stringify(cz,null,'\t'));
});
```
Javaでセレクションソート

```java:SelectionSort.java
import java.util.Arrays;

public class SelectionSort {
	public static void main(String[] args) {
		int[] arr = {5, 3, 2, 4, 7, 8, 1, 9, 0, 6};
		Arrays.stream(selectionSort(arr)).forEach(e -> System.out.println(e));
	}
	public static int[] selectionSort(int[] arr) {
		for(int i=0; i<arr.length-1; i++) {
			int min = i;
			for(int j=i+1; j<arr.length; j++) {
				if(arr[min] > arr[j]) min = j;
			}
			if(min != i) {
				int tmp = arr[min];
				arr[min] = arr[i];
				arr[i] = tmp;
			}
		}
		return arr;
	}
}
ツールを使って簡単にPharを作成する

野暮用でPHPで書いたツールをPharにすることになりました。

pharというのはcomposer.**phar**とかのあれです。アプリを構成する複数のファイルを一つの実行可能なファイル（もちろん別途PHPを導入しておく必要はあります）にまとめることができるやつです。正確にはそれだけのものではありませんが、2016年においてそれ以外の用途も特に思いつかないのでそれでいいと思います（投げやり

で、[PHP: Phar - Manual ](http://php.net/manual/ja/book.phar.php)を読んでみたんですがまったく意味がわかりません。スタブってなんだよ！`__HALT_COMPILER();`とかなにそれ怖い……

でもまあ、こういう面倒なことにはなんらかツールが用意されているものだと探してみたらありました。[Box](https://github.com/box-project/box2)です。これを使えば簡単にPharを作成することができます。

[PHP: Phar - Manual ](http://php.net/manual/ja/book.phar.php)が理解できなくても大丈夫。そう、[Box](https://github.com/box-project/box2)ならね。

まずはBoxをインストールしましょう。

```
$ curl -LSs https://box-project.github.io/box2/installer.php | php
```

成功するとカレントディレクトリに`box.phar`というファイルが生成されるので、`/usr/local/bin/box`にでもコピーして、パーミッションを755に変更します。これで`box`コマンドが使えるようになりました。

さて、Phar化する対象のプロジェクトですが今どきだとだいたいこんな構成になっているかと思います。

```
.
├── composer.json
├── composer.lock
├── main.php
├── phpunit.xml
├── src/
├── tests/
└── vendor/
```

* `main.php`がコマンドのエントリポイント
* `src`にPSR0/PSR4でロードするphpファイル
* `tests`にテスト関係のファイル
* `vendor`にcomposerで導入したパッケージ

`main.php`の内容としてはこんな感じ。

```php
<?php
require_once __DIR__ . '/vendor/autoload.php';

$app = new Example\ConsoleApplication();
$app->run();
```

典型的ですね。

これをPhar化してみましょう。

まずはプロジェクトのトップディレクトリに`box.json`を用意します。Boxのデフォルトのコンフィグファイルです。内容はこのようします。

```json
{
    "directories": ["src", "vendor"],
    "main": "main.php",
    "output": "example.phar",
    "chmod": "0755",
    "stub": true
}
```

* `directories`に指定したディレクトリ以下のphpファイルがアーカイブの対象になります
* `main`に指定したphpファイルがpharを実行したときに実行されます
* `output`は生成するpharファイル名です
* 他はおまじない

とにかく、`directories`にアプリを動作させるのに必要なphpファイルの入ったディレクトリ、`main`にエントリポイントとなるphpファイルを指定すればOKです。こんな大雑把な設定では無駄なファイル（例えば各パッケージのテスト関連のファイル）も沢山入ってしまうかもしれませんが動けばいいのだ！もちろん設定次第ではアーカイブ対象のファイルを事細かに指定することもできるので、気になる人は`box help build`を熟読しましょう。

`box.json`が用意できたら`box build`を実行します。

```
$ box build
Building...
```

これで`example.phar`が生成されます。あとは、これをPATHの通ったディレクトリにコピーするなり、配布するなりお好きなように。

## 補足

PHPUnitなど`require-dev`で入るパッケージはアプリの動作には必要ないので、pharの容量を削減するためにはできれば含めたくないところかもしれません。そんなときは、`box build`を実行する前に`composer install --no-dev`でパッケージをインストールし直しましょう。[doctrine-migrationsのビルドスクリプト](https://github.com/doctrine/migrations/blob/master/build-phar.sh)が参考になるかもしれません。`box.json`で個別にPHPUnitのパッケージをexcludeすることもできるかもしれませんがこちらのほうが簡単でしょう。
Tiny Tiny RSS(tt-rss)で時刻の差分表示を絶対時間にする

この右上の所は設定ファイルじゃどーにも出来ないっぽい？ので直接phpを書き換え。バージョンはv15.7

![imgTemp-2016-02-28-23-58-35.png](https://qiita-image-store.s3.amazonaws.com/0/5825/5aa097ad-e822-b65e-e24c-0100590a1fe8.png)

```php:tt-rss/classes/feeds.php#623
$reply['content'] .= "<span class='updated' title='$date_entered_fmt'>
	$updated_fmt</span>";
```
を

```php:tt-rss/classes/feeds.php#623
$reply['content'] .= "<span class='updated' title='$date_entered_fmt'>
	".date("Y/m/d H:i:s",strtotime($line["updated"])+9*60*60)."</span>";
```

に書き換え。
UTCで入ってるのをうまく日本時間に変換出来なくて、+9時間ベタ書きなのがどーにもダサいけどどうしたもんか。ブラウザから取れないかな・・・


![imgTemp-2016-02-29-00-04-59.png](https://qiita-image-store.s3.amazonaws.com/0/5825/17bac2b1-e5b7-9b7a-3503-3dd3c943cad2.png)

全てよろし。
結局FluxやらReduxやらって何なのか個人的なまとめ

FluxやReduxがまた分からなくなったので、個人的なまとめをしました。
「これ間違ってるぜ！」ってのがあればコメント等でご指摘していただけると嬉しいです。
また何か気付きがあればちょこちょこ更新入れることもあります。

## Fluxって？

Facebookが提唱しているアーキテクチャで、JavaScriptのデータの流れを分かりやすく整理するために使われます。

JavaScriptはイベントドリブンなため、様々なデータの流れがあり複雑化しやすくなっています。
そのためFluxではその流れを一方向にまとめよう！といったことをやっています。
Dispatcherを通して状態を変化させていく様子はデザインパターンの[オブザーバーパターン](http://www.techscore.com/tech/DesignPattern/Observer.html/)と同じような形ですね。

基本的には以下の様な流れです。
![flux1.png](https://qiita-image-store.s3.amazonaws.com/0/39382/c8f099e0-d91d-77a3-297a-91584e8c91a5.png "flux1.png")

またユーザーの行動によってViewから新たにActionを発行し、Dispatcherへと伝搬させることも出来ます。
![flux2.png](https://qiita-image-store.s3.amazonaws.com/0/39382/fd535cd3-8db6-0411-2a8e-791a9bca5f1c.png "flux2.png")

それぞれが担う役割は

- Action：入力内容を元にデータを作成
- Dispatcher：データを送る（EventEmitter）
- Store：データを貯める
- View：データを表示する

## んじゃReduxって？

ReduxはFluxの派生ですが、Fluxとの違いは色々とあります。
Reduxには三原則があったり、FluxにあったDispatcherがReduxにはありません。
また、stateオブジェクトに対し直接変更を加える事はせず、新しいstateオブジェクトを作成する方法をとっています。

## ReduxとFluxのアーキテクチャ全体図
こちらはFluxの場合
![flux-arch.jpg](https://qiita-image-store.s3.amazonaws.com/0/39382/264dc67e-da65-47f3-d751-86ba75a55237.jpeg "flux-arch.jpg")

こっちはRedux
![redux-arch.jpg](https://qiita-image-store.s3.amazonaws.com/0/39382/85e09429-d9f6-0789-8d43-cda67d1f207e.jpeg "redux-arch.jpg")

※画像出典：[UNIDIRECTIONAL USER INTERFACE ARCHITECTURES](http://staltz.com/unidirectional-user-interface-architectures.html)

## Reduxの三原則

- Single source of truth
- State in read-only
- Changes are made with pure functions

[出典 : Redux - Three Principles](https://redux.js.org/introduction/three-principles)

### Single source of truth

信頼できる唯一の情報源。
アプリケーション全体のstate（状態）が一つのstoreのオブジェクトツリーで表現される。
ユニバーサルアプリ（様々なプラットフォームに対応するアプリケーション）の作成が用意になり、サーバーからのstateをシリアライズでき、余分なコーディングをクライアントに集約することができる。

一つのステートツリーに集約することで、デバッグが容易になるメリットがあり、またundo/redoの実装も容易になります。

### State in read-only

stateは常に読み取り専用にする。
stateを変更するにはactionを通じてのみに徹する。

これはViewやネットワークコールバックからの直接的な変更がないことを保証でき、actionはオブジェクトなのでデバッグやテストに利用しやすくなります。

### Changes are made with pure functions

actionがstateを変更する際にreducerを通して行います。
reducerはactionとstateを受け取り、新しいstateを返すpureな関数になっています。
うるう年によって増えたのは何曜日？

今日はうるう年によって生み出された2/29。そんな日が平日、しかもよりによって月曜日。ついてないなーと思いたいところですが、ちょっと待った。うるう年によって増えたのは本当に月曜日なのでしょうか。せっかくの2/29なのでそこをちょっとつついてみましょう。

## 各曜日のカウント（うるう年でない場合）
```
365 = 7 * 52 + 1
```
上記式より、1年は1/1を基準として7日間のまとまりが52回続いて、最後に1/1と同じ曜日が来ることが分かります。

つまり。
```
1/1と同じ曜日 ⇒ 53回 ... (1)
else ⇒ 52回
```

## 各曜日のカウント（うるう年の場合）
```
366 = 7 * 52 + 2
```
同じように考えると。
```
1/1, 1/2と同じ曜日 ⇒ 53回 ...(2)
else ⇒ 52回
```
(1), (2)を比較すると「1/2と同じ曜日」の部分で差が生じています。したがって、うるう年によって増えたのは1/2と同じ曜日と結論付けることができます。

今年2016年のカレンダーを見ると1/2は土曜日！つまりうるう年によって土曜日が一回増えた！やったー！！

## 増えた曜日はいずこに？
でも2/29は月曜日。増えた土曜日はどこにいったのよ？

結論から言うと増えた土曜日は今年の最後の日になります。1年の中で見るとうるう年には366日目というものが存在するから当然ですね。

※もし納得いかない場合は2016年のカレンダーを1月から12月まで繋げてみましょう。そして2010年（2016年と同じ1/1が金曜日の年）のカレンダーについても同じように1月から12月まで繋げて、それで両者を比較すると一目瞭然です。

かくして、うるう年では年末に1/2と同じ曜日が増えるということが分かりました。特に2016年は年末に土曜日が増えるということで。年末に土曜日…ん？

## 結論
うるう年では年末に1/2と同じ曜日が増える、ただし**年末休暇で調整される**。

そして2016-2017年の年末年始の曜日を確かめてみると。

- 12/31 : **土**
- 01/01 : **日**
- 01/02 : 月
- 01/03 : 火

増えた年末は土曜日になり翌年1/1も日曜日。oh..

（でもGWは良配置だから！）
Atomのカスタマイズ

(随時更新中。上の方が新しい)

## Atomの設定をgistで共有する

- install 'sync-settings'
- 設定方法はsync-settingsのページに書いてあるとおりですが、一通りの流れ
    - gistのアクセストークンを取得して、atomのsync-settingsのSettingに貼り付け
    - 設定用の適当なgistを作成して、gistのidをatomのsync-settingsのSettingに貼り付け
    - gistにバックアップするときは、atomのメニュー > Packages > Synchronize-Settings > Buckup。バックアップから設定を適用したいときはRestore

## マークダウンファイルを開いたら自動でプレビューも開く

- install 'markdown-preview-opener'
- マークダウンファイルを切り替えたらプレビューも切り替わってくれたらいいのに… 

## スクロールしてもマークダウンプレビューがついてくる
マークダウンのソースをスクロールやクリックした時に、マークダウンプレビューがその場所を表示してくれる

- install 'markdown-scroll-sync'

## スペルチェックをオフ
文書にドットの下線が引かれて読みにくいとき

- File > Settings > Packages
- spell-checkを検索
- Disableにする

## jsを即時実行する
- "script"パッケージをインストールする
- jsファイル上で"Ctrl + Shift + B" 
    - BuildのB

## htmlファイルをブラウザで開く
- "Open In Browser"パッケージをインストールする
- サイドメニューか編集中のHTMLファイル上で右クリックして"Open In Browser"

## MarkdownプレビューのCSSをカスタマイズ
- Settings > Packages > Markdown Preview, Use GitHub.com styleをtrue
- Settings > Themes > your stylesheet

```css
.markdown-preview.markdown-preview {
  font-family: MeiryoKe_Console, Meiryo;
}
```

ついでに.tree-view, atom-text-editorもCSSカスタマイズ

## Core Settings

### 画面下までスクロールしても止めない
- Scroll Past Endをtrue

### インデントガイド
- Show Indent Guideをtrue

### 不可視文字(スペース、タブなど)を表示
- Show Invisiblesをtrue

### 折り返し
- Soft Wrapをtrue

### タブキー押した時の文字列
- Tab Type

## HTMLやCSSを保存したら自動でリロード
- "atom-live-server"パッケージをインストールする
- メニューのPackages > Live Server > Start on port 3000 とするとブラウザが勝手にプロジェクトのドキュメントルートを開く

## minimap
- install "minimap"

## CSSのcolorに色を表示
- install 'pigments'

## JavaScriptの文法チェック
- install 'linter-jshint'

## Gitコマンド使いたい
- install 'git-plus'
- Ctrl + Shift + P のコマンドパレットからgit add all commit and push すると楽ちん
- 自分のWindows10 64bit環境のコマンドプロンプトでGitコマンドは使える状態だったが、Atomからgit pushできなかった。→ [Microsoft/Git-Credential-Manager-for-Windows: Secure Git credential storage for Windows.](https://github.com/Microsoft/Git-Credential-Manager-for-Windows)をインストールして、コマンドプロンプトで適当にpush、Atom再起動したらAtomからgit pushできるようになった。
    - [Git Push does not work · Issue #224 · akonwi/git-plus](https://github.com/akonwi/git-plus/issues/224)
JavaとKotlinにおける変性

前から気になっていたJavaの変性について、調べたことを自分の中で簡単にまとめて置きたくて。
プラスして、最近好きな言語であるKotlinと比較してみようかなと。
まだまだ勉強中の身であるため、間違いがあったら申し訳ありません。

# 不変
同じ型でなければなりません。
## Java
Javaにおける不変は**`List<T>`**

```java
List<String> strList = new ArrayList<String>();
List<Object> objList = strList; //コンパイルエラー  不変のため代入できない
```
Javaでの配列は次項の共変になります。

## Kotlin
Javaとは異なり、**配列**がこれになります。
また、Kotlinでは`listOf`や`arrayListOf`,`mutableListOf`でJavaにおけるリストを用意することができます。

```kotlin
//配列
val intArray: Array<Int> = arrayOf(1,2)
val numArray: Array<Any?> = intArray //コンパイルエラー　共変ではないため

//リスト
val strList: java.util.ArrayList<String> = arrayListOf("1st", "2nd")
```
因みに余談ですが、`Array<Int>`型を定義したが、Kotlinでは型ごとの配列も用意できるみたいです。

```kotlin
val intArray: IntArray = intArrayOf(3,4)
```



# 共変
広い定義に狭い定義のものを入れることが出来ます。
## Java
Javaでの共変は**配列**と**上限付き境界ワイルドカード**があります。
`String`型は`Object`型のサブクラスであるため、それぞれ以下の様に書くことが出来ます。

```java:
//配列
String[] strArray = {"hoge", "foo"};
Object[] objArray = strArray;

//上限付き境界ワイルドカード
List<String> strList = new ArrayList<String>();
List<? extends Object> objList = strList;
```

しかし、上記の様に全てのスーパークラスである`Object`型で定義するとJavaの配列では、

```java:
objArray[0] = 1; //ランタイムエラー
```

このように`String`型配列の中に、それ以外を入れてもコンパイルは通り、ランタイムエラーとなります。
リストの方は、`String`型であろうと`Object`型であろうと`add`メソッドで加えることは出来ませんが、`get`メソッドで`String`型や`Object`型を取得することはできます。
(`null`を`add`することはできます)

## Kotlin
Kotlinでは**`out`修飾子**によって共変を実現しています。
そしてJavaの配列のときと異なり、**出力**のみ可能とすることで安全に扱うことができます。

```kotlin
val intArray: Array<Int> = arrayOf(1,2)
val numArray: Array<out Any?> = intArray
numArray[0] = 1 //コンパイルエラー
```

# 反変
共変の逆になります。
## Java
Javaでの反変には**下限付き境界ワイルドカード**があります。
`Object`型は`String`型のサブクラスを持っているので、以下の様に書くことが出来ます。

```java:
//下限付き境界ワイルドカード
List<Object> objList = new ArrayList<Object>();
List<? super String> strList = objList;
```
下限付きになることで、この場合`String`型とそのサブクラスを`add`メソッドで加えることが可能となります。`null`も`add`出来ます。
逆に`get`メソッドで取得出来るのは全てのスーパークラスである`Object`型のみになります。

## kotlin
Kotlinでは**`in`修飾子**によって反変を実現しています。
共変とは逆に**入力**のみ可能となっており、出力はできません。

```kotlin
fun main(args: Array<String>) {
    var hoge = Hoge(1) 
    val hogeList: java.util.ArrayList<Hoge> = arrayListOf(hoge)
    val fooList: java.util.ArrayList<in Foo> = hogeList  //反変だから代入できる
    
    val foo = fooList[0]
    
    println(hoge == foo) // true
    println(hoge.a)  //1が出力される
    println(foo.a)  //コンパイルエラー
}
open class Hoge(val a: Int)
class Foo: Hoge(0)
```
PHPをやってみたいので、MySQLもやってみる(その２）

##はじめに
この記事は<a href="http://qiita.com/nogson/items/e796b773b9e1fe5b2c4b">PHPをやってみたいので、MySQLもやってみる</a>の続きです。

備忘録なので、足りない分や、もっとこうしたらよかったとかは、後から追加修正していきます。

##作業ユーザーをつくる

###なんで作業ユーザーを作るの？
rootユーザーは特別なユーザーで、すべてのデータベースにアクセスすることができる為、間違った操作を行なった場合、すべてのデータベースに影響を及ぼしてしまう。

通常はrootユーザーでの作業は行わなず、そのデータベースにだけアクセスできる作業ユーザーを作るのが一般的だそうな。

###作業ユーザー作成手順

まずはデータベースを作成。

```
//mysqlにログイン
sudo mysql -u root -p

//データベースを作成
mysql> create database test;

```

作業ユーザーを作成。

```
mysql> grant all on test.* to testuser@localhost identified by 'password';
```

上記コマンドの意味は。

>grant all on（許可を与える）<br>
test.*（testというデータベースのすべてのテーブル））<br> 
testuser@localhost(testuserというユーザーに対して））<br>identified by  'password'（パスワードは'password'））<br>


作成した作業ユーザーで、ログインできるか試す。

```
//一旦ログアウトする。
mysql> exit

//作った作業ユーザーでログインしてみる
mysql -u testuser -p

//ログインできた！
mysql>
```

##テーブルを作る

データベースも、作業ユーザーもできたところで、次はテーブルを作ってみる。

```
create table {DB名} ({フィールド名} {レコードの型});

create table mytable (
	id int,
	name varchar(100) 
)
```
もし、下記のようなエラーがでたら`` use {データベース名}``でデータベースを切り替えてください。

```
ERROR 1046 (3D000): No database selected
```

####作成したテーブルを確認する
```
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| mytable        |
+----------------+
```

####テーブルを削除する
```
mysql> drop table mytable;
```

####テーブルの構造を見る
```
//desc {table名}
mysql> desc mytable;

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------
```

##テーブルのレコードで使える型（よく使うもの）

MySQLのデータ型でよく使うものは下記のようです。下記記載以外にも沢山あります。
 
####数値
型名  | 説明　| 例
------------- | -------------| -------------
int  | 整数| 123
double  | 浮動小数点数| 1.23

####文字列
型名  | 説明　
------------- | -------------
char(n)  | 固定長の文字列(255文字以下)
varchar(n)  | 可変長文字列
text  | どのくらいの文字列が入るかわからない場合

####日付
型名  | 説明　|　例
------------- | -------------| -------------
date  | 日付| 2016-10-10
datetime | 日付と時刻|2009-10-04 15:25:07

####その他
型名  | 説明　|　例
------------- | -------------| -------------
enum('value1','value2',...)  | 文字列定数リスト| 男性　女性

##フィールドのオプション設定

###入力値を必須にする
``not null``はnullを許可しないオプション。指定することによってそのレコードを挿入する際にフィールドがnull入力ができなくなる。

```
id int not null
```

###デフォルト値

レコードのデフォルト値を設定できる。ただし、設定することができるのは **定数のみ**。

例外としてTIMESTAMP型が設定できるっぽい。


```
sex enum('male', 'female') default 'male'
```

###自動連番

auto_increment は整数型のみ指定できるオプション。
自動的に連番の値を設定してくれる。

```
id int auto_increment

```

###索引（インデックス）

インデックスをフィールドに設定しておくと、そのフィールドで検索した場合動作が早くなる。

ただし、挿入する場合はインデックスを貼り過ぎていると、インデックスを作りなおす処理が走るため動作が重くなる。

####主キー
レコード一意に特定する、idなどに使用する。
主キーとはユニークなレコードを作りたいときに使用します。

>**主キーの条件**

>* 値の重複がない
>* データは必須入力。

```
id int not null auto_increment primary key,
```

####キー

よく検索するフィールドに設定する。いくつでも設定できる。

```
//key {keyの名前} {フィールド名}
key mynumber(mynumber)
```

####ユニークキー

ユニークキーが設定されたフィールドでは値を重複設定することができない。emailなどで使われる。

```
email varchar(255) unique

```

##まとめ
フィールドの型の種類や、オプションの設定について少しわかったので、レコード設定についても調べていこうと思います。
【PostgreSQL】特定のカラムに一括で同じ文字列操作をする小技

使う機会はあまりなさそうだけど、せっかくなのでメモ。
なんらかの理由で一時的にキーワードを追加したい時とかに使えそう。

- 同じ文字列を追加する

```
UPDATE
  table1 AS t1
SET
  column1 = '追加する文字列 ' || t2.column1 FROM (SELECT id, column1 FROM table1) AS t2
WHERE
  t1.id = t2.id 
```

- 追加した文字列を削除する

```
UPDATE
  table1 AS t1
SET
  column1 = t2.column1 FROM (SELECT id, REPLACE(column1, '追加する文字列 ', '') FROM table1) AS t2
WHERE
  t1.id = t2.id 
```

t2の抽出に条件を追加すれば、もっと細かい指定も可能。
全メソッドの先頭にログを埋めこむスクリプト



**Git hubでダウンロード**
[logTrace](https://github.com/skycroso/logTrace "logTrace")

**シェル概要**
数万ステップの巨大なアプリを仕事でメンテナンス中です。

どんなメソッドがどんなタイミングで呼び出されたのか
もっと可視化したいと思い作ってみました。

プロジェクトにある全メソッドの先頭に、ログを埋め込みます。
ファイル名とクラス名が分かります。

```objc
1 -(void)sampleMethod {
2    label.text = @"hoge";
3 }
```
本シェル実施 ↓

```objc
1 -(void)sampleMethod {
2    NSLog(@"DEBUG : %s:%d", __PRETTY_FUNCTION__,__LINE__);
3    label.text = @"hoge";
4 }
```
実行で...

```
DEBUG: -[sampleClass sampleMethod:]:2
```
というログを吐き出します（クラス名、メソッド名と行数）
プロジェクトに含まれる全〜.mが対象です。

ただ、プロジェクトの規模が大きくなると「バカか」ぐらいのログが出ます。
重要なログが埋もれてしまう、実行速度にも影響します
ので、

```objc
1 -(void)sampleMethod {
2    #ifdef METHOD_TRACE_LOG
3       NSLog(@"DEBUG: %s:%d", __PRETTY_FUNCTION__,__LINE__);
4    #endif
5    label.text = @"hoge";
6 }
```
マクロで無効化できるモードもあります。
たとえば.pchファイルに

```c
 #define METHOD_TRACE_LOG
```
を追加すれば、プロジェクトファイル全体でログ有効、
消せばログ出力も終わります。
(Xcode6以降の場合、pchファイルは自動追加されないので手動で追加する必要あり）

もしくはBuild Settingの「preprocessor macros」に
DebugだけMETHOD_TRACE_LOGを定義してください。
(Debug時にログ有効、Release時にログが無効化)
初めて要件定義作成に参加し、思ったことをメモします。

※記載内容はメモとして作成しているため、修正が必要な部分があるかもしれません。


####**【バックアップ要件の決定】**

**・**顧客側が最も重要視するデータの確認
　国が制定する保管期限や企業に準じた重要資料が存在するため、詳細を確認


**・**可用性として保存が必要なデータ
　（active-active形式で可用性を実現するアーキテクチャを採用する場合、大規模震災等の
　大規模障害以外で考慮する必要はないと判断できる）
　システムのデータ、DBデータ、操作ログ、システム・アプリのログ　等

**・**セキュリティ的観点から追跡性のあるログを保存
　内部監査・セキュリティインシデント発生時に必要となるログを選定し、バックアップ

####**【可用性】**

**・**採用アーキテクチャにより、切り替え時間に差がある
　顧客の目標稼働率を確認すること

####**【運用監視の決定】**

**・**平常時のサーバの状態を把握するため、対応可能な範囲でレポートを取得
　平常時のサーバの状態を把握する目的は急激な変化を確認することができること、また、
　インシデント発生時の原因追究に使用
　負荷となるトランザクションの処理、データベースやアプリケーションのメモリを把握
　することにより、改善に使用

**・**監視項目は多岐に渡る。そのため、サーバに合わせた監視項目を選定する

　　　　例）サーバの物理状態→CPU・メモリ・ディスク容量・IO状態（wmi/snmp）

　　　　　　仮想環境における仮想ハードの状態→CPU・メモリ・ディスク容量

　　　　　　アプリケーション監視→javaVMのメモリ・データベースのメモリ
　　　　　　　　　　　　　　　　　キャッシュヒット率

　　　　　　通信トラフィックの状態→ポートごとに監視

　　　　　　死活監視→ping監視（ソフトウェアによっては独自ハートビート通信を
　　　　　　　　　　 使用しているため、考慮の上検討）

　　　　　　URL監視→定期的な疎通確認

　　　　　　メッセージ監視	→重要度・特定エラーをログから取得し監視

　　　　　　マウントポイントの監視→重要ディレクトリは検討


　　　※DMZ・運用監視LAN・社内LAN・社外接続LAN等　複数のLANを使用するので
　　　　監視に使用するプロトコルを把握し、NW機器の設定時に反映
Javaでバブルソート

```java:BubbleSort.java
import java.util.Arrays;

public class BubbleSort {
	public static void main(String[] args) {
		int[] arr = {3, 2, 1, 8, 6, 9, 7, 0, 5, 4};
		Arrays.stream(bubbleSort(arr)).forEach(e -> System.out.println(e));
	}
	
	public static int[] bubbleSort(int[] arr) {
		for(int i=arr.length-1; i>0; i--) {
			for(int j=0;j<i;j++) {
				if(arr[j] > arr[j+1]) {
					int tmp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = tmp;
				}
			}
		}
		return arr;
	}
}
```
SoftLayerのデータ消去


SoftLayerのサーバーキャンセル後、自分のデータはどうなるのか、
気になったので、調べてみました。

>Q2: Does SoftLayer destroy my data when I’ve de-provisioned a compute resource?
A: Yes. When a customer cancels any physical or virtual server, all data is erased using **Department of Defense (DoD) 5220.22-m standards**.
http://blog.softlayer.com/2014/softlayer-security-questions-and-answers

ほうほう...
...
DoD 5220.22-Mってなんだ？？

>**DoD 5220.22-M – 米国国防総省準拠規格** とは？
ハードディスクなどの記録媒体からデータを消去する際に、データが残留しないように完全削除するための規格の一つ。米国国防総省のNISPOM（国際工業セキュリティプログラム管理マニュアル）に準拠した上書き方法。データ領域を最初にゼロ(0×00)で1回上書きした後、固定値(0xff)で1回上書きし、さらに0-255までの乱数で1回上書きを行い、計3回の上書きを行った後書き込み検証を行う。

>磁気媒体からデータを完全消去するための規格化された上書き方式は、このほかにも多数存在するが、**本方式はデータ消去の確実性と処理速度の兼ね合わせによる実用性の高さから、企業内で社外秘のデータを抹消する際の削除方式として、現在世界的に最も広く使用されている方式。**
http://freesoftlab.com/word/dod-5220-22-m/

これなら使用者が企業でも個人でも安心ですね。
common-lisp 入門者が素数判定を書いた

Lispの練習で書いたのでここでは[エラトステネスの篩](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)の話はしない。

## 素直な実装

```cl
(defpackage naive-prime-search)
(in-package naive-prime-search)

;; prime-number?:: Num -> List Num -> Bool
(defun prime-number? (n primes)
  (cond
    ((atom primes)               t)
    ((eq 0 (mod n (car primes))) nil)
    (t                           (prime-number? n (cdr primes)))))

;; search-prime:: Num -> List Num -> Num -> List Num
(defun search-prime (n primes max)
  (cond
    ((> n max)                primes)
    ((prime-number? n primes) (search-prime (1+ n) (append primes (list n)) max))
                              ;; appendを使う事でリスト完全コピー。どうみても遅い
                              ;; 末尾再帰最適化されなさそうな書き方
    (t                        (search-prime (1+ n) primes max))))

(time (search-prime 3 '(2) 100000))
```

副作用のない `append` とか `cond` で末尾再帰でない書き方とか、もう見るからに遅そう。

```sh
$ clisp -c naive-prime-search.lisp
$ clisp naive-prime-search.fas
Real time: 11.719404 sec.
Run time: 11.668685 sec.
Space: 736128576 Bytes
GC: 906, GC time: 4.034319 sec.
```

GCが重たい。

## 高速化後

```cl
(defpackage optimised-naive-prime-search)
(in-package optimised-naive-prime-search)

;; リストを探索したついでに素数を追加すべき末尾ポインタを返す
;; (prime-number? n primes (cons 0 primes)) のような形で pre-primes には適当なリストを用意する
;; prime-number?:: Num -> List Num -> List Num -> (Bool, List Num)
(defun prime-number? (n primes pre-primes)
  (cond
    ((atom primes)               (cons t pre-primes))
    ((eq 0 (mod n (car primes))) (cons nil pre-primes))
    (t                           (prime-number? n (cdr primes) primes))))

;; search-prime:: Num -> List Num -> Num -> List Num
(defun search-prime (n primes max)
  (if (> n max)
    primes ;; 探索範囲を超えたら終了
    (let* ((tmp (prime-number? n primes (cons 0 primes)))
           (prime? (car tmp)) ;; prime?: boolean
           (ptr (cdr tmp)))   ;; ptr: もし素数ならcdrを書き換えるべきコンスセル
      (if prime?
        (setf (cdr ptr) (cons n nil)))    ;; setfによるコンスセル書き換え。コピーは発生しない
      (search-prime (1+ n) primes max)))) ;; clispでそのまま実行しても末尾再帰最適化されない。clisp -c hoge.lisp してバイトコードにコンパイルしておいてから clisp hoge.fas しよう

(time (search-prime 3 '(2) 100000))
```

末尾再帰と、破壊的なリストへの追加とリスト末尾ポインタを使い回すような高速化を試みる。

```sh
$ clisp -c naive-prime-search.lisp
$ clisp naive-prime-search.fas
Real time: 7.283802 sec.
Run time: 7.255682 sec.
Space: 3353536 Bytes
GC: 5, GC time: 0.022078 sec.
```

先ほどよりGC時間が少ない。

## 所感

* GC時間を考えなければループ速度はそれほど変わっていないようだ？
* clisp(GNU CLISP 2.49)の場合、 `(defun a () (cond (flag1 nil) (flag2 (a)) (t (a))))` のような複数の再帰がある場合でもgoto的な末尾再帰最適化がされているのかもしれない
MacのPythonでMongoを操作してみる


私の使っているMacはPythonのバージョンが2.7.10なので、以下の方法でバージョンを合わせてpymongoを入れる必要があります。

```cmd
sudo pip install pymongo==2.7.2
```

## コネクション取得
ローカルにあるMongoDBに接続し、hogeというDBがMongoDB上にある場合以下のように書いてコネクションを取得します。

```python
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from pymongo import Connection

# mongodbのコネクションを取得
con = Connection('localhost', 27017)
db = con.hoge
```

## コレクション取得
hoge_mstというコレクションがhogeというDBにある場合以下のようにしてコレクションを取得します。

```python
col = db.hoge_mst
```

## コレクションからデータの取得
### １件のみ取得
```python
print col.find_one()
```

### 全件取得
```python
for item in col.find():
	print item
```

### 全件取得し必要な項目だけ使いたい
```key1```というコレクション内のカラムのみ値を取得したい場合

```python
for item in col.find():
	print item['key1']
```

### 検索条件を指定して取得したい
```itemID```というキーが2のものだけ取得

```python
for item in col.find({'itemID':2}):
	print item['key1']
```
GCEにxfsマウントのdiskを追加する

Goggle Cloud PlatfomでのCompute Engineに追加Dickを入れてxfsマウントをするまでのメモ

まず、コンソールなどからdiskを追加する（今回はdataという名前で追加した）

### 追加したdiskの確認

```bash
$ ls -l /dev/disk/by-id/
lrwxrwxrwx. 1 root root  9 Feb 28 13:42 google-data -> ../../sdb
...
```

で追加したdisk名が`google-data`という感じで存在する

### xfsフォーマットさせてマウントする

```bash
$ yum -y install xfsprogs
$ mkfs.xfs -f -b size=4096 -i size=512 -l size=64m /dev/sdb
$ mkdir /mnt/data
$ mount -t xfs -o noatime,logbufs=8 /dev/sdb /mnt/data
```

確認

```bash
$ df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda1      ext4   9.8G  1.2G  8.1G  13% /
tmpfs          tmpfs   15G     0   15G   0% /dev/shm
/dev/sdb       xfs    100G   33M  100G   1% /mnt/data
```

はい、おわり。


### 追記(2016/4/6)

ダウンタイム無しでdiskをリサイズできるようになったみたい。
http://googlecloudplatform-japan.blogspot.jp/2016/04/google-cloud-persistent-disks.html

GCPの管理画面からdiskのサイズ変更が出来た。インスタンスの画面をリロードしたらサイズ変更されていた

今回は100Gから300Gに変更してみた。

拡張する (xfs形式ではxfs_growfsで行うみたい)

```bash
$ xfs_growfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=16, agsize=1638400 blks
         =                       sectsz=4096  attr=2, projid32bit=0
data     =                       bsize=4096   blocks=26214400, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=16384, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 26214400 to 78643200
```

確認

```bash
$ df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda1      ext4   9.8G  1.2G  8.1G  13% /
tmpfs          tmpfs  1.8G     0  1.8G   0% /dev/shm
/dev/sdb       xfs    300G   35M  300G   1% /mnt/data
```
Markdown記法


すっかりMarkdownにハマり、最近では何かとメモを取るのですらMarkdownです。
基本的な書き方をメモ。他にもこんな書き方が出来る等知っていたらコメント頂ければ。

##見出し
見出しには「#(シャープ)」を使う。
`<h1>〜</h6>`を表すには、見出しレベルに応じて「#」の数を増やす。

```lang:Markdown
#見出し1
##見出し2
###見出し3
####見出し4
#####見出し5
######見出し6
```

```lang:HTML
<h1>見出し1</h1>
<h2>見出し2</h2>
<h3>見出し3</h3>
<h4>見出し4</h4>
<h5>見出し5</h5>
<h6>見出し6</h6>
```



##段落
段落は空白行で分ける。

```lang:Markdown
段落1

段落2
```

```lang:HTML
<p>段落1</p>

<p>段落2</p>
```

##改行
改行をする場合は文末に半角スペースを2つ挿入する。

```lang:Markdown
あのイーハトーヴォのすきとおった風、(半角スペース2つ)
夏でも底に冷たさをもつ青いそら、(半角スペース2つ)
うつくしい森で飾られたモリーオ市、(半角スペース2つ)
郊外のぎらぎらひかる草の波。
```

```lang:HTML
あのイーハトーヴォのすきとおった風、<br />
夏でも底に冷たさをもつ青いそら、<br />
うつくしい森で飾られたモリーオ市、<br />
郊外のぎらぎらひかる草の波。
```

##強調
文字を強調する場合は「*(アスタリスク)、_(アンダーバー)」を使う。
一つで文字を囲った場合は`<em>`　2つで囲った場合は`<strong>`になる。

```lang:Markdown
あの*イーハトーヴォ*のすきとおった風、

夏でも底に冷たさをもつ**青いそら**、
```

```lang:HTML
<p>あの<em>イーハトーヴォ</em>のすきとおった風、</p>

<p>夏でも底に冷たさをもつ<strong>青いそら</strong>、</p>
```

##リスト
###箇条書き
リストにしたい場合、「*(アスタリスク)」,「-(ハイフン)」,「+(プラス)」を使用する。
上記記号を入れた後にはスペース、またはタブを入れないといけない。
また、リストを入れ子にしたい場合は、リストの途中でスペース、タブを入れて記号を変更すると、入れ子のリストとして扱われる。

```lang:Markdown
* あのイーハトーヴォの
* すきとおった風、
 - 夏でも
 - 底に冷たさをもつ
* 青いそら、
```


```lang:HTML
<ul>
	<li>あのイーハトーヴォの</li>
	<li>すきとおった風、
		<ul>
			<li>夏でも</li>
			<li>底に冷たさをもつ</li>
		</ul>
	</li>
	<li>青いそら、</li>
</ul>
```

###順序付き
順序付きリストの場合は数字の代わりに数字と「.(ピリオド)」を用いてリストにします。

```lang:Markdown
1.あのイーハトーヴォの
2.すきとおった風、
3.夏でも
4.底に冷たさをもつ
5.青いそら、
```

```lang:HTML
<ol>
	<li>あのイーハトーヴォの</li>
	<li>すきとおった風、</li>
	<li>夏でも</li>
	<li>底に冷たさをもつ</li>
	<li>青いそら、</li>
</ol>
```



##水平線
「- (ハイフン)」,「*(アスタリスク)」, または 「_ (アンダーバー)」を3つ以上並べます。

```lang:Markkdown
あのイーハトーヴォの
----------------------
すきとおった風、
```

```lang:HTML
あのイーハトーヴォの
<hr>
すきとおった風、
```

##引用
先頭に「>(山括弧)」を付けます。また、入れ子にもできます。

```lang:Markkdown
>あのイーハトーヴォの
```

```lang:HTML
<blockquote>あのイーハトーヴォの</blockquote>
```

##コード
「'(バッククォート) 」で囲みます。また複数行の場合は先頭にタブかスペースを4つ以上つけます。

```lang:Markkdown
`あのイーハトーヴォの`
```

```lang:HTML
<code>あのイーハトーヴォの</code>
```

##リンク
リンクを貼りたいテキストを「[]角括弧」で囲み、「()丸括弧」にリンク先URLを記述します。


```lang:Markkdown
[World Wide Web Consortium](https://www.w3.org/)
```

```lang:HTML
<a href="https://www.w3.org/">World Wide Web Consortium</a>
```


## 余談
WordPressのテキストエディタでMarkdownを有効にするプラグイン。
[JP Markdown](https://wordpress.org/plugins/jetpack-markdown/)

これは超便利！wpの更新モチベを上げてくれること間違いなし！
Genymotionでソフトキーボードを使う

# AndroidのエミュレータGenymotionでソフトキーボードを使う(4系)

## デフォルトだとソフトキーボードは出ない。
<img width="585" alt="スクリーンショット 2016-02-28 21.38.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/115431/f97c1102-f511-f551-b414-909f5c7fd223.png">

## 次のように設定

### 設定アプリを開いて文字と入力をタップ
<img width="585" alt="スクリーンショット 2016-02-28 21.40.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/115431/2449a697-9bb1-6756-b6f1-4dd984d57f15.png">

### キーボードの設定をタップ
<img width="585" alt="スクリーンショット 2016-02-28 21.40.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/115431/2b0138f2-08be-878e-0408-a3e2f86556a7.png">

### HardwareをOFFにする
<img width="585" alt="スクリーンショット 2016-02-28 21.40.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/115431/7733c0ca-1b12-9934-d0f9-e86a901d60bf.png">

### 他実際の入力画面では
ブラウザなどで何か入力するとき、4系などでは左上にキーボードがでているので、通知バーを下にして同じような箇所を設定すればOK。

ロリポやマシュマロも多少違えどだいたい同じ場所にあるはず。
Rubyアプリの環境変数設定(ローカル・Heroku)

環境変数の持たせ方と呼び出し方に困ったので。

# Herokuの場合の持たせ方
addをrmにすれば削除もできるらしい

```bash
$ heroku config:add CONSUMER_KEY="hogehogehoge"
```

# ローカルの場合の持たせ方
何かシェルファイルに持たせて
sourceコマンド等で一括適用すればよさそう。

```bash
$ export CONSUMER_KEY="hogehogehoge"
```

# 呼び出し方

```ruby
config.consumer_key = ENV['CONSUMER_KEY']
```

# Herokuでまとまった環境変数を読みたい場合
下記のようなデータをファイルに書き込んでおき、ワンライナーで一気に設定する。
ローカル用にexportでもやりたかったのですが、xargsに渡した後だとexportコマンドの参照がうまくいかず。

```
CONSUMER_KEY="hogehogehoge"
```

```bash
cat set_env.txt | sed -e "s/\n/ /g"  | xargs heroku config:add
```
参考：[設定ファイルの値をまとめて Heroku に設定するコマンド](http://qiita.com/ymmtmsys/items/b59f945265145f8c26a9)