OmniAICreator/Qiita-1.07M huggingface dataset:
MoodleのGET/POSTパラメータ取得

#Moodleのリクエスト変数用関数
MoodleではGET/POSTされた変数に直接アクセスしないように決められている。
https://docs.moodle.org/dev/Security#Don.27t_trust_any_input_from_users
そのためmoodleforms以外で利用する場合は`required_param()`/`optional_param()`を利用する必要があるが、どのようなオプションが利用が出来るかは公式に記載が見つからないので以下にまとめる。

##メモ
以下の内容はMoodle 3.2.3のソースを見て纏めたもの。

##関数とパラメータの種類
###required_param($parname, $type)
指定した\$parnameの変数名のGET/POST値を取得する。存在しない(undefined)場合はエラーとなるため、処理の続行に必須の変数名を指定するときに使用する。
Moodle 2.2以降から取得した値がarray()型だった場合はエラーとなるはずだが実際にはrequired_param_array()を呼び出して処理続行となっている…

###required_param_array($parname, $type)
required_param()のarray()版。array()型ではない場合はエラーとなる。

###optional_param($parname, $default, $type)
required_param()と異なり、指定した\$parnameがない場合は\$defaultが利用される。
Moodle 2.2以降から取得した値がarray()型だった場合はエラーとなるはずだが実際にはoptional_param_array()を呼び出して処理続行となっている…

###optional_param_array($parname, $default, $type)
optional_param()のarray()版。

###$typeパラメータ
上記の全ての関数で共通して以下の$typeパラメータに対応する。**許可する**とある場合、許可されない時は返り値は空文字となる。
**英字**とある場合は大文字/小文字のアルファベット([a-zA-Z])*、**英数字**とある場合は英字と数字([a-zA-Z0-9])とする。

| $type | 内容 |
|:--|:--|
| PARAM_RAW | 特になにもしない |
| PARAM_RAW_TRIMMED | trim()により前後のスペース、改行等を取り除く |
| PARAM_CLEAN | HTMLPurifierで処理する。*とりあえずコレ使っとけ的な奴？* |
| PARAM_CLEANHTML | HTMLPurifierで処理したあとtrim()する |
| PARAM_INT | intにキャストする |
| PARAM_FLOAT | floatにキャストする |
| PARAM_ALPHA | 英字以外を取り除く |
| PARAM_ALPHAEXT | 英字、`_`、`-`以外を取り除く |
| PARAM_ALPHANUM | 英数字以外を取り除く |
| PARAM_ALPHANUMEXT | 英数字、`_`、`-`以外を取り除く |
| PARAM_SEQUENCE | 数字以外を取り除く |
| PARAM_BOOL | `on`/`yes`/`true`/`!empty($parname)`を1に、`off`/`no`/`false`/`empty($parname)`を0にして返す |
| PARAM_NOTAGS | striptags()でタグを除去する | 
| PARAM_TEXT | [multilang filter](https://docs.moodle.org/33/en/Multi-language_content_filter)用以外のタグを除去する |
| PARAM_COMPONENT | Moodle用プラグインの命名ルールに則っているもののみ許可する。*この部分の記述で`mod_alpha_beta`のようにアンダースコアが2つ以上ある活動モジュール名が許されていないことが分かる。* |
| PARAM_PLUGIN, PARAM_AREA | プラグインの命名ルールに則っているもののみ許可する。*PARAM_COMPONENTと異なり活動モジュール名の変則ルールに対応していない* |
| PARAM_SAFEDIR | **PARAM_ALPHANUMEXT**と同じく英数字と`_`、`-`以外を取り除く |
| PARAM_SAFEPATH | **PARAM_SAFEDIR**に加え`/`以外を取り除く |
| PARAM_FILE | ファイル名として怪しい文字を取り除く |
| PARAM_PATH | `/`で区切られた文字列からディレクトリ名やファイル名として怪しい文字を取り除く |
| PARAM_HOST | ホスト名またはIPv4アドレスのみ許可する |
| PARAM_URL | （スキーマを含めて）URLが有効なフォーマットの場合のみ許可する |
| PARAM_LOCALURL | サイト内URLとして有効なフォーマットの場合のみ許可する |
| PARAM_PEM | 有効なBASE64フォーマットのPEMファイルの場合のみ許可する |
| PARAM_BASE64 | 有効なBASE64フォーマットの場合のみ許可する |
| PARAM_TAG | 制御文字等を取り除き、連続する半角スペースを1つに置換する。*HTMLタグが残るので出力時にサニタイズする必要がある* |
| PARAM_TAGLIST | `,`で区切られたHTMLタグのリストから不正なものを取り除く |
| PARAM_CAPABILITY | MoodleのCapabilityとして有効な場合のみ許可する |
| PARAM_PERMISSION | `CAP_INHERIT`、`CAP_ALLOW`、 `CAP_PREVENT`、 `CAP_PROHIBIT`のリスト中にあるかチェックする。リストに無い場合は`CAP_INHERIT`を返す |
| PARAM_AUTH | 導入済み認証プラグインの場合のみ許可する |
| PARAM_LANG | 導入済み言語パックの場合のみ許可する |
| PARAM_THEME | 導入済みテーマの場合のみ許可する |
| PARAM_USERNAME | ユーザ名のルールに則っているもののみ許可する。*実在の有無はチェックしない* |
| PARAM_EMAIL | e-mailアドレスとして有効なフォーマットの場合のみ許可する |
| PARAM_STRINGID | 英字で始まり、英数字、`\`、`.`、`:`、`/`、`_`、`-`を含む文字列のみ許可する |
| PARAM_TIMEZONE | タイムゾーンとして有効なフォーマット（`+9.0`、`Asia/Tokyo`）のみ許可する |
reveal.jsのRuby版reveal-ckを使ってMarkdownでスライドを書く

# reveal.jsとは

次のようなスライドをHTML/CSSで手軽に書くことができるツールです。

http://lab.hakim.se/reveal-js/#/

# reveal-ckとは

reveal.jsをmarkdownで書けるようにrubyで作られたツールです。

https://github.com/jedcn/reveal-ck
http://jedcn.github.io/reveal-ck/

# 基本的な使い方

reveal-ckのインストール

```console
$ gem install reveal-ck
```

`slides.md`にスライドを書く

generateコマンドでスライドを生成。 `slides`ディレクトリが作成されその下に`index.html`などが生成されます。

```console
$ reveal-ck generate
```

serveコマンドでサーバーを立ち上げてブラウザでスライドをプレビュー。

```console
$ reveal-ck serve
```

http://localhost:10000 でプレビューできます。
`slides.md`の変更を自動検知してlive reloadしてくれるので、`generate`コマンドを再実行したり、サーバーを再起動する必要はありません

:warning: ただ、うまくいかないときもあるのでそういうときは、サーバー再起動したり、`slides`ディレクトリを消して再度`generate`コマンドを実行してみてください。

# Github Pagesとして公開する

Github Pagesとして公開するにはいくつか方法があると思いますが、そのうちの一つです。
リポジトリの`Settings`の中に以下の設定項目があるのですが、`Source`を`master branch`にしてください。

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/26310/89faa0db-df41-36f6-0900-55b224a49694.png)

Github側の設定はこれで終わりです。
Github Pagesの仕組みなのですが、
`https://github.com/{username}/{repository}/`のgitディレクトリ直下に`index.html`があると`https://{username}.github.io/{repository}/`にアクセスするとその内容が見れます。
`foo/index.html`というように`foo`ディレクトリ以下に`index.html`があるのであれば`https://{username}.github.io/{repository}/foo/`にアクセスすれとその内容が見ることができます。

上記の「基本的な使い方」に書いた場合だと以下のようになってると思いますが、

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/26310/f531171f-5b3f-88e2-e3f3-ced207045b8a.png)

これをそのままpushすれば `https://{username}.github.io/{repository}/slides/` でスライドを見ることができます。

# スライド表示中のキーボードショットカット

ブラウザでスライド表示しているときに`shift + ?`を押すとキーボードショットカット一覧が表示されます。
`s`を押すとスピーカーノートが別ウィンドウで表示されます。

# スライドをカスタマイズする

## スライドを区切る

```markdown
foo

---

bar
```

というように 

```
---
```

でページを区切れます。
また `reveal.js`はスライドを横に移動するだけでなく縦に移動することも特徴なのですが、
縦に区切るのは

```markdown
foo

***

bar

***

baz
```

のように

```
***
```

をかけば縦に区切れます。

## スピーカーノート

```markdown
# ```note
# foo
# ```
```

先頭の`# `は取り除いてください。 ＞＜ 

## config.yml

slides.mdと同じディレクトリに`config.yml`を置いておくと, `reveal-ck` `reveal.js`のカスタマイズができます。
設定項目は http://jedcn.github.io/reveal-ck/config/ を参照してください。
僕は次のように設定しています。

```yaml
theme: "night"
author: "vivid_muimui"
title: "foo title" # スライドごとに変えています。
revealjs_config: 
  slideNumber: true
  history: true
  controls: true
```

## cssでスライドの見た目を変える

`css/custom.css`のように`css`ディレクトリに`css`ファイルを置いておくと、`reveal-ck generate`時にそのディレクトリが読み込まれて生成される`slides`ディレクトリにも反映されます。
`js` `image` `media`ディレクトリも同様にコピーされるようです。(試してないです＞＜)

### クラス名をつける

```markdown
foo

<p class='some-class'>
bar
</p>
```

のようにHTMLをmarkdownの中に直接書いてしまうか

```markdown
foo
{:.some-class}
bar
```

のような特殊な書き方をする方法があります。どちらも同じ結果になります

### fragments

スライドの1ページの内容を段階的に表示したする機能です。

http://lab.hakim.se/reveal-js/#/fragments
https://github.com/hakimel/reveal.js/#fragments

```markdown
foo

<p class='fragment'>
bar
</p>

{:.fragment}
baz
```

という感じに書きます

# emoji

markdown中に `:emoji:`でスライドにemojiを表示できます。

```markdown
:smile:
```

# おわりに

他にも画像などを埋め込んだり背景画像を変えたり色んな機能があります(よくわかってないです)
また、`reveal-ck generate`コマンドで`reveal.js`関連のファイルもまるごと生成されますし、ディレクトリの中をみればhtml, js, cssなどがあるので知識があれば幾らでもカスタマイズができます。

僕はこんな感じでslideを書くリポジトリを用意しています。
https://github.com/vividmuimui/slides
MySQLのLOAD DATA INFILEを使って登録または更新する方法 

# 初投稿
できるエンジニアは良質なアウトプットをしてるな～と感じたので、僭越ながら投稿させていただきます。
# やりたいこと
CSVファイルをテーブルに一括で取り込む際に、PRIMARY KEYまたはUNIQUEな値がすでに存在していたら、更新処理を行い、なければ登録処理を行う。
(ちなみにバージョンはPHP5.6、MySQL5.6)
# 実現方法
##### ◆PDOのfetch使って一件一件ゴリゴリやる？
> まず最初に思いついたのがこれ。
ループさせながら、一行とっては「ON DUPLICATE KEY UPDATE」構文を使って登録/更新していく。
う～ん、データ量が小さければいいけど、多くなると遅いなー。もっと効率よくできないものか。

##### ◆「LOAD DATA INFILE」 構文という便利なものがあった！
> [参考1](https://dev.mysql.com/doc/refman/5.6/ja/load-data.html) [参考2](http://ftp.tcrc.edu.tw/MySQL/doc/refman/4.1/ja/insert-speed.html)
リファレンスマニュアルによると、「INSERT ステートメントを多数使用する場合と比較して、20 倍速度が上がる。」らしい。
これはすごい。あれ、でもこれって登録処理できても更新処理できなくない？

##### ◆「REPLACE」 構文を使えばできそう？
> [参考3](https://dev.mysql.com/doc/refman/5.6/ja/replace.html)
あ、なんだ、「LOAD DATA INFILE」の中に「REPLACE」指定すれば、PRIMARY KEYまたはUNIQUEな値がテーブルに存在していなければ登録、存在していれば更し、、、あれ、更新じゃなくてDELETEしてINSERTされるっぽいぞ！！！
これでは更新処理で更新したくない値（データの新規登録日など）も更新されてしまう、、

##### ◆構文を組み合わせてなんとか実現できた！
> ちょっと面倒だが、以下の手順を踏めば、「やりたいこと」が満たせた。
1. 一時的に取り込み用のテーブルを用意する
`CREATE TABLE tmp_table LIKE main_table;`
→一時的に取り込むテーブルがすでに用意されている場合は、中身を消しておく
`TRUNCATE TABLE tmp_table;`
2. 一時的に取り込むテーブルに「LOAD DATA INFILE」して取り込む
`LOAD DATA INFILE 'file.csv' INTO TABLE tmp_table FIELDS TERMINATED BY ',' ;`
3. 取り込みたいテーブルに「ON DUPLICATE KEY UPDATE」して取り込む
`INSERT INTO main_table SELECT * FROM tmp_table ON DUPLICATE KEY UPDATE main_field1 = VALUES(field1), main_field2 = VALUES(field2);`

##### ◆おわりに
最後まで読んでくださり有難うございました。
内容に不備などありましたら、ご指導お願いします。

それでは、またなんか内容見つけて投稿しよ～
さようなら～
接続したことのある無線LAN(Wi-FI)のパスワードをWindowsのコマンドプロンプトから確認する方法の備忘録


#接続したことのある無線LAN(Wi-FI)のパスワードをWindowsコマンドプロンプトから確認する方法の備忘録


接続したことのある無線LANのパスワードを第三者にも教えようとした時にSSID名とパスワードを忘れてしまったので、コマンドプロンプト上からさくっと確認して共有する時のやり方について書き残した備忘録です
今回はwindowsが対象です（が一応macについても一言載せました）



###X.要約
---

windows
cmd
netsh wlan show profiles
netsh wlan show profiles name=[profille] key=clear

略文
netsh wl sh p
netsh wl sh p n=[profile] k=clear








###0.環境
---

windowsであり、なおかつnetshコマンドが使えればなんでもいけると思う






###1.方法
---


①コマンドプロンプトを開く（管理者権限不要）
（windowsキー + R => cmd => enter)

![cmdwinr.png](https://qiita-image-store.s3.amazonaws.com/0/132105/ba7e2c62-c3ef-1ec0-6b3d-35d1a6ef44fd.png)




②以下のコマンドを入力する

`netsh wlan show profiles`


すると、ずらずらっと今まで接続したことのあるWi-Fi一覧が表示される


```text:

C:\Users\esesesesescup>netsh wlan show profiles

インターフェイス Wi-Fi のプロファイル:

グループ ポリシー プロファイル (読み取り専用)
---------------------------------------------
    <なし>

ユーザー プロファイル
---------------------
    すべてのユーザー プロファイル     : WI-FI_1
    すべてのユーザー プロファイル     : WI-FI_2
    すべてのユーザー プロファイル     : WI-FI_3
    すべてのユーザー プロファイル     : WI-FI_4
    すべてのユーザー プロファイル     : WI-FI_5
    すべてのユーザー プロファイル     : WI-FI_6
    すべてのユーザー プロファイル     : WI-FI_7

```
表示されたSSID（Wi-Fiの名前）を覚えておく



③以下のコマンドを入力する
`netsh wlan show profiles name=[SSID名] key=clear`

先程覚えたSSID(Wi-Fi)名を一字一句違えず上のコマンドの[SSID名]に代入して入力する
ずらずらっと表示されるので、その中から　セキュリティ　キー　：　W1F1_n0_pAssw0rd
を探す。そこに書かれているのがパスワードです。




②のコマンドで確認したWI-FI_3のパスワードを確認してみる

```text:
C:\Users\esesesesescup>netsh wlan show profiles name=WI-FI_3 key=clear

インターフェイス Wi-Fi のプロファイル WI-FI_3:
=======================================================================

適用先: すべてのユーザー プロファイル

プロファイル情報
-------------------
    バージョン             : 1
    種類                   : ワイヤレス LAN
    名前                   : WI-FI_3
    コントロール オプション        :
        接続モード    : 自動接続
        ネットワーク ブロードキャスト  : ネットワークがブロードキャスト配信して
                                          いなくても接続します
        AutoSwitch         : 他のネットワークに切り替えません
        MAC ランダム化  : 無効

接続の設定
---------------------
    SSID の数        : 1
    SSID 名             : "WI-FI_3"
    ネットワークの種類           : インフラストラクチャ
    無線の種類          : [ 任意の無線の種類 ]
    ベンダー拡張          : 存在しません

セキュリティの設定
-----------------
    認証                : WPA2-パーソナル
    暗号                : CCMP
    認証                : WPA2-パーソナル
    暗号                : 不明
    セキュリティ キー      : あり
    主要なコンテンツ       : W1F1_n0_pAssw0rd

コスト設定
-------------
    コスト                   : 制限なし
    混雑                   : いいえ
    データ制限間近         : いいえ
    データ制限超過         : いいえ

    ローミング             : いいえ
    コスト ソース          : 既定


```




###2.まとめ・補足
---



意外と簡単である
他にもGUI上から確認する方法もあるがこちらの方が圧倒的に早く確認できる
windows10でのみ確認したが、netshコマンドが使えれば確認は可能だと思う（根拠はない）
netsh コマンドはwindows7でも使えたと記憶している
使えるかどうかはcmd上で`netsh`　とだけ入力してエラーがでなければ使える証拠だと思う
エラーかどうか分からない時は存在しないコマンド （例えば `aiueo` とか）を入力した挙動と明らかに異なればあると考えてもいいと思う
netsh のモードから抜けるにはウィンドウを✕印で閉じるか、　ctrl + c で解除できる


因みにMac OS の場合は（手元に環境がなく未検証である）
`security find-generic-password -ga SSID | grep password`
でいけるらしい（適当）




###3.Reference
---




###4.Tag
---

wi-fi
無線LAN
password
パスワード
SSID
確認
見る
cmd
コマンド
コマンドプロンプト
さくっと
windows
netsh
方法
やりかた
忘れた
光ディスクとロード時間 @ゲームプログラマの小話[開発:IO]

# 光ディスクとロード時間

2017年現在、光ディスクをメインメディアとして扱うゲーム機は昔と比べて減ってきました。国内で浸透している現役ハードだとPS4、（Switchに移行しつつありますが）WiiUぐらいですね。それ以外はフラッシュカード。

BDディスクを扱うPS4もHDDにデータインストールして基本はそこから読むソフトが主流だったりして、今回扱うトピックはもはや役に立たない時代になりかけています。

時代的にそんなあんまり重要じゃないトピックですが、知っておくと光ディスクのロード時間最適化の役に立つかもしれません。

## 光ディスクとは

DVDやBD（ブルーレイディスク）のことを今回は光ディスクと呼ぶことにします。

光ディスクはレーザー光をディスクに照射し、反射された光をレンズで読み取りデータをロードします。レーザー光を出したり、それを読み取ったりするのはDVDドライブやBDドライブが行っています。

光ディスクには2層と呼ばれる形式のものがあり、2層式だと1層式よりも多くデータを格納することができるようです。照射するレーザー光を変えることで反射するデータを1層目か2層目かを切り替えているようです。

## 円周とデータ格納量の関係

さてそんな光ディスク。ご存じの通り円盤でその円盤にデータが格納されています。

円盤にはレコード盤のように何周ものデータの列があります。

また、円盤ですから内側に行くほど円周の長さは短くなり、外側に行くほど長くなります。光ディスクのデータの格納量はこの円周の長さに比例します。

つまり、1周という単位で見ると、**円盤の内側よりも外側の周のほうがデータをより多く格納**できます。ここがポイント。

## 読み取りヘッドとシーク時間

円周の話はいったんおいておきまして、もう１つ大事な話。ドライブ側の話です。

レーザー光を出してディスクに反射させデータを読み取るパーツをヘッドと呼んだりピックアップと呼んだりします。ディスクの内側のデータを読む場合はこのヘッドを内側に移動させ、外側のデータを読む場合は外側に移動させます。

このヘッドが移動する時間をシーク時間と呼びます。シーク時間は実際にデータを読んでいる時間ではなく読むために準備している時間ですので、**シーク時間を少しでも減らせられればデータのロード時間も減る**ことになります。

## データの配置場所は指定できる

さて、ここからロード時間を短くする話をしていくのですが、まず大前提の話をします。

これ以降の話は、『各データを光ディスクの円周のどのあたりにおくか』ということを指定する手段が用意されているプラットフォームでのみ通用する話になります。（※代表的なプラットフォームでは用意されています）

そんなこと指定できるんですねぇ。私もコンシューマ機のプロジェクトに参加したときに初めて知りました。

## 配置を工夫してシーク時間を減らす

ロード時間を減らす１つの方法としてシーク時間を減らす方法があります。

例えば データA、データB、データC を順番に読み込むとします。

もし、このような配置だったとき。

- データAの配置場所：内側
- データBの配置場所：外側
- データCの配置場所：内側

この場合、データAを読み込んだあと、データBを読み込む際にヘッドが内側から外側に移動します。つまり、このとき長めのシーク時間が挟まってしまいます。データBが読み終わったあとのデータCを読み込む際も同様の現象が起こります。

この例ですと、３つのデータを内側に置くか、外側に置くか統一できるとシーク時間をぐっと減らすことができ、結果ロード時間が短くできます。

ちなみに、ヘッドが大きく動くとき、ディスクドライブによっては「キュッキュッ」という音が鳴ります。この音が聞こえたら何かしら無駄な時間が発生している証になります。もしゲームをプレイしていてキュッキュッ音が聞こえないのでしたら、それはエンジニアさんががんばっている証拠です。

## 外側のほうがロード時間が短い

ディスクの外側のほうが円周が長いため内側と比べデータを多く格納できる、という話をしました。

そして、ディスクの回転スピードは基本的に一定です。

つまり、データを外側に置くだけでロード時間が短くなります。特に内側にしたい理由がなければぜひ外側に置きましょう。

## 2層対策

（注意：筆者は2層式光ディスクを実際に使ったことがないので想像で話している内容が含まれます）

1層目から2層目、2層目から1層目に照射するレーザー光を変化させる際にもヘッドのシーク時間と同様に待ち時間が発生する、という話を聞いたことがあります。ですので、一度に読み込むデータはどちらかの層になるべく固めておけるとよりロード時間は短くできます。

もし、どうしても両方の層にまたがったデータをロードしないといけないときは、1層目のデータを全部ロードしおわってから2層目のデータをロードする、といったような対策をとり、レーザー光の変化回数を最低限に抑えるようにしましょう。

あと、そもそも2層式は1層式と比べてロード時間が長くなりがち、という話も聞いたことがあります。ですので、あとちょっと容量を減らせば1層式に収まるというケースであればその方法を検討してみることもありかもしれません。

## おわり

リンク：[ゲームプログラマの小話-目次](http://www.10106.net/~hoboaki/wiki/index.php?%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E5%B0%8F%E8%A9%B1)
MacにHomebrew・Rubyを入れる

以下からHomebrewと呼ばれるパッケージ管理システムを導入する。
[Homebrew — macOS 用パッケージマネージャー]
(https://brew.sh/index_ja.html)

導入が終わったら、PATHの更新を忘れずに。
```echo 'export PATH=/usr/local/bin:$PATH' >> .bash_profile
source ~/.bash_profile```

次はrbenv + ruby-buildのインストールを。
rbenvはローカルディレクトリ毎にRubyのバージョンを変更できるので便利。
rbenvのgemパッケージを検索。（たまに名前が変わるので注意）
```brew search rbenv-gem```

今回はrbenv-gemsetでした。こちらをインストール。
```brew install rbenv-gemset ruby-build```

導入が終わったら、PATHの更新を忘れず(ry
```echo 'export PATH=/usr/local/bin:$PATH' >> .bash_profile
source ~/.bash_profile```

最後はお待ちかね、Rubyのインストール。（バージョンはお好みで）
```rbenv install 2.2.3```
【C】10進数と16進数を表示する小さなサンプル



```c:test.c
#include <stdio.h>

int main(void){
        int d = 100;      // decimal
        int x = 0x100;    // hexadecimal

        printf("d = %d\n", d);
        printf("x = %d\n", x);

        printf("d = 0x%x\n", d);
        printf("x = 0x%x\n", x);

        return 0;
}
```


```text:実行結果
d = 100
x = 256
d = 0x64
x = 0x100
```
Hugoで記事の最終更新日時をGit履歴から自動取得する方法

Hugoのバージョン0.18より、Gitの履歴情報から記事の最終更新日時(`lastmod`)を参照できるようになった。

## これまでのHugoにおける最終更新日時の扱い

バージョン0.18よりも前のHugoでは、記事のfrontmatterで`lastmod`を明示しない限り、記事の更新日時を使えず、かなり使いにくい機能だった。

## 0.18以降での最終更新日時の扱い

`enableGitInfo`というオプションが追加され、これが`true`のときには**Gitの履歴情報からMarkdownの最終更新日時を自動で取得し、lastmodとして割り当てる**機能が追加された。

> Add a GitInfo object to Page if enableGitInfo is set. It then also sets Lastmod for the given Page to the author date provided by Git.
https://gohugo.io/release-notes#0-18-0-december-19th-2016

## 有効化の方法

`config.toml`へ1行追加してビルドしなおすだけでOK。

```toml:config.toml
enableGitInfo = true
```

## 公式ドキュメント

GitInfoの公式ドキュメントはこちら

https://gohugo.io/extras/gitinfo/
CentOS7.3にPHP7.1をyumでインストールする

[前回の投稿](http://qiita.com/panappe/items/a876e06488fab4a9af8b)の続き

早速、PHPを入れよう。
バージョンについてお勉強...:writing_hand_tone2:
参考: [PHPのリリース日とサポート期限](http://qiita.com/bezeklik/items/72d1ff8393f66673e2bc)

なるほど、なるほど。
今回はPHP7.1をインストールしてみる:baby_tone2:

#CentOS7.3にPHP7.1をyumでインストールする

まずは、おまじない。

```console
$ sudo yum install epel-release
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

必要最小限でインストール。

```console
$ sudo yum install --enablerepo=remi-php71 php
```

できたできた:clap_tone2:
バージョンを確認する

```console
$ php -v
PHP 7.1.6 (cli) (built: Jun  7 2017 12:15:54) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
```
よしゃ:ok_hand_tone2:

参考: [CentOS6／CentOS7にPHP5.6／PHP7をyumでインストール](http://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e)
画面遷移備忘録　listviewからの情報受け渡し

#画面遷移備忘録
・listviewをタップして画面遷移
・listviewの情報を移動させる

##MainActivity

```java
QuantityInfo info =list.get(position);
```

リストのpositionを取得

```java
intent.putExtra("QuantityInfo", info);
```

※QuantityInfoの中にはcomment,quanntity,timeの3つの情報が格納
QuantityInfoをそのまま指定しては中のメソッドの場所が分からないのでシリアライズする

QuantityInfoはクラスをintent.putExtraするために、QuantityInfoクラスをimplements Serializable
→シリアライズする事によりintentの中に格納出来る

```java
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // 画面遷移
        Intent intent = new Intent(getApplication(), DetailActivity.class);
        QuantityInfo info =list.get(position);
        intent.putExtra("QuantityInfo", info);
        startActivity(intent);

    }
}
```

###SubActivity

```java
QuantityInfo info = (QuantityInfo)getIntent().getSerializableExtra("QuantityInfo" );
```

intentする際QuantityInfo、QuantityInfoのシリアライズされた位置をinfoの中に取りだす

```java
time.setText(info.getTime());
comment.setText(info.getComment());
quantity.setText("" + info.getQuantity());
```

infoの中の情報をsetTextする

```java
public class DetailActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);
        setTitle("");

        Intent intent = getIntent();
        //MainActivityから値を受け取る
        QuantityInfo info = (QuantityInfo)getIntent().getSerializableExtra("QuantityInfo" );

        //id textView1をt1に当てはめている
        TextView time = (TextView)findViewById(R.id.textView1);
        //id textView1をt2に当てはめている
        TextView comment = (TextView)findViewById(R.id.textView2);
        //id textView1をt3に当てはめている
        TextView quantity = (TextView)findViewById(R.id.textView3);

        //受け取った値を表示
        time.setText(info.getTime());
        comment.setText(info.getComment());
        quantity.setText("" + info.getQuantity());
    }
}
```

listを選択から画面遷移をさせる事には成功
残りの項目：レイアウトを整える、画像を選択させる、リストに格納再表示。
LINE BOTを作る最小構成(sdk未使用/node.jsの場合)

node.jsで LINE Bot を作るための最小構成的なものを探したけど思った感じなのが見つからなかったので作りました。
(みんな高機能すぎるよ〜〜〜)

https://github.com/taiju59/line-bot-sample

- herokuとかにデプロイする想定です
    - httpsで受けられるサーバーならなんでもOK (httpsなのはLINEの制約)

- この記事-> [LINE BOTを無料で作る最も手っ取り早い方法 - Qiita](http://qiita.com/InoueDaiki/items/4827f18607b178e02cc5) を元にさせてもらいました
    - これは Bluemix が前提だったので、Bluemix 要素を省いたのが本稿になります

- [line-bot-sdk-nodejs](https://github.com/line/line-bot-sdk-nodejs)は使っていません
    - ~~5月にできていたとは知りませんでした...~~ 複数プラットフォーム展開(Facebook Messenger など)や、Messaging APIに機能追加された場合の立ち回りのしやすさを考えるとsdkを使わないメリットもあるかと思います

## 前提

- LINE BOT用のアカウントを用意しておきましょう
    - こちらがオススメです -> http://qiita.com/nkjm/items/daa4e34b26ef937446c6
    - Webhook URL には `https://各自のドメイン/callback` のように入れておいてください
        - heroku以外(環境変数に`PORT`を指定しない場合)は `https://各自のドメイン:3000/callback`

## 本題

これです↓

```js:index.js
// import modules
const express = require('express')
const request = require('request')
const bodyParser = require('body-parser')

// create a new express server
const app = express()

app.use(bodyParser.json()) // for parsing application/json
app.use(bodyParser.urlencoded({
  extended: true
})) // for parsing application/x-www-form-urlencoded

app.post('/callback', (req, res) => {
  const options = {
    method: 'POST',
    uri: 'https://api.line.me/v2/bot/message/reply',
    body: {
      replyToken: req.body.events[0].replyToken,
      messages: [{
        type: 'text',
        text: req.body.events[0].message.text // ここに指定した文字列がボットの発言になる
      }]
    },
    auth: {
      bearer: 'Channel Access Token' // ここは自分のtokenに書き換える
    },
    json: true
  }
  request(options, (err, response, body) => {
    console.log(JSON.stringify(response))
  })
  res.send('OK')
})

app.listen(process.env.PORT || 3000, () => {
  console.log('server starting on PORT:' + process.env.PORT)
})
```

- `Channel Access Token` は各自のtokenに書き換えてください
- このままだとおうむ返しbotになります
    - botの応答をカスタマイズする場合は `req.body.events[0].message.text` の箇所を任意の文字列に置き換えてください
- 画像やボタンその他を送りたい場合は [ドキュメント](https://devdocs.line.me/ja/?shell#send-message-object) を参考に `messages` の内容を書き換えましょう

## 補足

- ES6っぽい書き方ができるのであればした方がいいのか？と思い const やアロー関数を使いましたが、フロントエンド界の常識とずれていたらプルリク or コメントいただけると嬉しいです

## 参考

- [LINE BOTを無料で作る最も手っ取り早い方法](http://qiita.com/InoueDaiki/items/4827f18607b178e02cc5)
- [AIが入ったBotの作り方を学ぼう - Part2 LINEでビジネスアカウントを作成する](http://qiita.com/nkjm/items/daa4e34b26ef937446c6)
- [LINE API Reference](https://devdocs.line.me)
- [Express.js](http://expressjs.com)
java 三角形を造る

forの繰り返しの処理で
どうゆう条件にしたら、⬛を繰り返して、
　　　　　　　　　⬛
　　　　　　　　⬛⬛
　　　　　　　⬛⬛⬛
　　　　　　⬛⬛⬛⬛
　　　　　⬛⬛⬛⬛⬛


を出せるのでしょうか(・・;)
宜しくお願いします
c++14で数値計算(0)---環境構築

#この記事の目的
c++と数値計算の勉強のためにオレオレ数値計算ライブラリを作る。
この記事ではライブラリの環境を説明する。コンパイルはMakefileで行うがある程度汎用的に使えるMakefileを作ったのでその説明をする。ここでは数値計算に関する具体的な話はしない。

##開発環境
OSはUbuntu16.04、コンパイラはgcc-5.4.0を使う。開発中もアップデートをかけるのでバージョンは変わる可能性がある。
コンパイルはいくつかのテストとチェック用の実行ファイルと静的ライブラリ、動的ライブラリを出すようにする。ディレクトリ構造は以下のようになり

```bash:console
$ ls
Makefile bin/ include/ lib/ mains/ obj/ src/ 
```
bin/:実行ファイルの置き場所、include/:インクルード用ファイルの置き場所、lib/:ライブラリの置き場所、mains/:main関数を含むソースの置き場所、1実行ファイルに1つしかmain関数を置けないのでこれらは別々にコンパイルする。obj/:オブジェクトファイル置き場、src/以下のソースから生成する。src/:ソースファイル置き場、ユーティリティ関数やクラスはここに置く。

## Makefile

```Makefile:Makefile
# 環境設定の定義
CXX =g++
BINDIR =./bin
SRCDIR =./src
OBJDIR =./obj
MAINDIR =./mains
INCDIR =./include
LIBDIR =./lib

# フラッグとライブラリ
CXXFLAGS =-MMD -Wall -O3 -Wextra -std=c++14 -fPIC -I$(INCDIR) -Werror
CXXLIBS =

# mainsのソースからターゲットの自動生成
MAINS=$(notdir $(wildcard $(MAINDIR)/*.cc))
TARGETS=$(MAINS:.cc=)
# srcのソースからオブジェクトファイルの自動生成
SRCS=$(wildcard $(SRCDIR)/*.cc)
OBJS=$(addprefix $(OBJDIR)/,$(notdir $(SRCS:.cc=.o)))
DEPS=$(OBJS:.o=.d)

# オブジェクトファイル用サフィックスルール
$(OBJDIR)/%.o: $(SRCDIR)/%.cc
        $(CXX) $(CXXFLAGS) -o $@ -c $^ $(CXXLIBS)

# 実行ファイル生成用コマンド
%: $(MAINDIR)/%.cc $(OBJS)
        $(CXX) $(CXXFLAGS) -o $(BINDIR)/$@ $^ $(CXXLIBS)

.PHONY: all lib
.PHONY: clean
# TARGETSのチェック、空の時無限ループをつくるのを回避
ifeq ($(strip $(TARGETS)),)
all:
        echo "no targets"
else
all:
        make $(TARGETS)
endif

# ライブラリ生成、動的ライブラリはLinux用
lib: $(OBJS)
        ar r $(LIBDIR)/libMyMath.a $^
        $(CXX) -shared $(CXXFLAGS) -o $(LIBDIR)/libMyMath.so $^ $(CXXLIBS)

#掃除コマンド
clean:
        rm -rf bin/*
        rm -rf obj/*
        find \( -name "*~" \) -delete -o \( -name "#*" \) -delete
```
~~気をつけるべき点はターゲットが空つまりmainsに対象のファイルがないと無限ループを作る。~~
`ifeq``else``endif`ディレクティブを使ってtargetが存在しない時は何もしないようにした。注意する点は`$(strip $(TARGETS))`を使って、空白文字を取り除くことである。
掃除用コマンドはバックアップ`*~`と編集中`#*#`も削除する。
フラッグは`-Wall -Wextra`で警告レベルを上げて`-Werror`で警告をエラーにしているので汚いコードを書くと一発で弾かれる。`-Werror`は切ってもいいがあまり汚いと思わぬバグを作るのでできるだけ警告もなくすようにする。
警告などのオプションの詳しくは以下
[gccの警告オプションを調べてみた](https://gist.github.com/tosihisa/2585404)
[gccで Wall & Wextra を使っても有効にならない警告](http://qiita.com/EqualL2/items/0cfb5b1cbfd70e2af662)


`-MMD`は依存関係ファイル`*.d`を作る。これはsrcはobjディレクトリに、mainsはbinに入れられる。mainsもobjに入れたかったがそこまで問題ではないので放置する。
`-fPIC`はオブジェクトファイルのメモリ位置の固定、動的ライブラリを作るなら必須。
`-I$(INCDIR)`で`#include`でのディレクトリを省略できる。今は使っていないがライブラリは`CXXLIBS`の位置で`-L$(DIR)`でパス指定を省略できる。

## 最後に
以前はファイルを増やすたびにMakefileに追記していたがこのMakefileを使うことでファイルを増やしても気にせずかけるので便利。main関数も書く実行ファイルを出してくれるのでテストも楽になった。
なにかやりたくなったら関数で頑張るよりディレクトリ構造など見なおしたほうが正解に近づく。
よくわからないエラーが出た場合はmake cleanで一度掃除すると治る。
まだバグがあると思いますがかなり汎用的に使えるとおもいます。

## 参考にしたリンクなど
[Makefileの関数](http://qiita.com/chibi929/items/b8c5f36434d5d3fbfa4a)
[汎用的に使えるMakefile](http://boysenberrypi.hatenadiary.jp/entry/2014/03/15/113703)
v8 ver6.0まとめ

 v8 ver6.0がリリースされました。  
ざっくりと新機能や改善点を整理します。  
[https://v8project.blogspot.jp/2017/06/v8-release-60.html:embed:cite]

## Main features

#### SharedArrayBuffer  
ver6.0から、SharedArrayBufferがのサポートが開始されました。  

[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer:embed:cite]
  
SharedArrayBufferは、javascriptワーカーと、ワーカー間の同期制御時にメモリを共有するローレベルメカニズムです。  

#### Object rest/spread properties
ES.nextの仕様において、現在stage3 である Object rest/spread propertiesが採用されました。  

変数宣言時に、Object内の特定のプロパティを指定でき、さらに ...restと記述すれば、指定されていない残りのプロパティをまとめて取得できます。  

```javascript
// Rest properties for object destructuring assignment:
const person = {
  firstName: 'Sebastian',
  lastName: 'Markbåge',
  country: 'USA',
  state: 'CA',
};
const { firstName, lastName, ...rest } = person;
console.log(firstName); // Sebastian
console.log(lastName); // Markbåge

// firstName, lastName以外のプロパティをまとめて取得できる
console.log(rest); // { country: 'USA', state: 'CA' }

// Spread properties for object literals:
// オブジェクトリテラルを用いて変数を宣言する際にも同様に記述して使うことができる
const personCopy = { firstName, lastName, ...rest };
console.log(personCopy);
// { firstName: 'Sebastian', lastName: 'Markbåge', country: 'USA', state: 'CA' }
```  

#### ES6 Performance
v8 ver6.0において、ES2015の機能のパフォーマンス改善もされています。 
javascriptのパフォーマンスベンチマークツールである Ares-6において、10％の改善がみられたようです。  

[http://browserbench.org/ARES-6/]  

#### v8 API
v8 APIに関してもいくつかの変更が加えられています。  
変更点詳細は下記ページにまとまっています。  
[https://docs.google.com/document/d/1g8JFi8T_oAE_7uAri7Njtig7fKaPDfotU6huOa1alds/edit:embed:cite]
Windows Serverの認証局でSAN属性を持たせたマルチドメイン証明書を認証する

マルチドメイン証明書では、Common Nameで「*.examle.com」という記載方法もありますが、Exchangeなど一部ではSAN属性にいれたマルチドメイン形式でないとただしく認識されないケースもあります。
ここでは、SANでの証明書認証方法をメモしておきます。
本動作は、Windows Server 2012 R2以上で動作確認しております。
Windows Server 2022でもこの操作で同様に動作します。

##証明書発行手順
PowerShellで以下を実行します。

```
certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2 
net stop certsvc 
net start certsvc
```
##IISでCSRを作成する
IISマネージャーを開き、ホストを選択し、証明書を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/43851002-0c30-87d4-0229-32db2fbe3cd5.png)

右ペインの証明書を作成をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/edcee649-3fcf-87a2-ae5e-583cc0422aa1.png)

証明書に必要な情報を入力します。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/107dc52d-08d1-f305-c556-9fe0b43556fa.png)

| 項目 | 入れるパラメーター |
|:-:|:-:|
| 一般名  | FQDNを入れます（一番メインのもの）  |
| 組織  | 会社名  |
| 組織単位  |  部署名 |
| 市町村  | 組織がある市町村  |
| 都道府県  | 組織がある都道府県  |
| 国/地域  | 組織がある国  |

＊一般名が一番重要です！

ビット数を2048を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/017f6113-e877-199b-c23e-e5b052b97fde.png)


ファイルを保存する場所を選択し、終了をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/1eeca4bf-2ef3-37d5-685d-9af581ef2e6c.png)

保存したCSRファイルを、メモ帳で開き内容をクリップボードにコピーします。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/c343a392-a755-cc93-05f8-be6f1da2efe9.png)

証明書Webサービスにアクセスします。
通常は、「https://証明書サーバーのIPアドレス/certsrv/」になります。
認証ダイアログが出た場合は、ADのユーザーでログインします。

証明書を要求するを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/e3d2695a-364e-3d08-10af-5a020e568eeb.png)

証明書の要求の詳細設定をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/deeefce9-fcf9-f845-010b-1b917c305d02.png)


コピーしたテキストを「保存された要求」に貼り付けます。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/03d3151e-f53e-c632-e30e-5f11d832bf45.png)

| 項目 | 値 |
|:-:|:-:|
| 保存された要求  | CSRの文字列を貼り付け  |
| 証明書テンプレート  | Webサーバー（デフォルト）選択  |
| 追加属性  | san:dns=xxx.example.com&dns=yyy.example.com |

追加属性に「san:fqdn」を入れる。追加ドメインが必要な場合は「＆」で複数記入することで、マルチドメインに対応します。


証明書が発行されるので、「証明書をダウンロード」をクリックしファイルをダウンロードします。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/eae237a2-34aa-15b6-e5eb-fae787755c5b.png)


##証明書取込手順
証明書の要求の完了をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/85495/23fe09f2-efb9-5b65-6a60-b10484e60d89.png)

先ほど発行された証明書をファイルを選択します。
フレンドリ名は管理用の名前ですので、好きな名前を入力します。
入力後、OKをクリックして完了です。

![image](https://qiita-image-store.s3.amazonaws.com/0/85495/a0b06051-df6e-7914-f0a9-28d7afaa33ea.png)


##証明書の適用
IISのサイトを右クリックし「バインドの編集」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/9f190cbf-2dc0-f8cb-b5b4-ae74cf715123.png)

*向けの443ポート（HTTPS）をクリックし、編集をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/7412286f-c84a-f9d6-e9b4-a72b054a9a79.png)

先ほど入力したフレンドり名の証明書を選択し、OKをクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/6a5b1d90-a83a-5a3d-2232-a35e4465286f.png)


これで、証明書の適用は完了です。
特に難しい操作もなく、SANのサブジェクトを追加するだけで完了します。
Exchangeサーバーなどマルチドメインが必要な場合に活用してみてください。


###参考
[セキュリティで保護された LDAP 証明書にサブジェクトの別名を追加する方法](https://support.microsoft.com/ja-jp/help/931351/how-to-add-a-subject-alternative-name-to-a-secure-ldap-certificate)
ReactorKitの記事を読んだメモ


* http://qiita.com/yusuga/items/e793963ff51ee493497a
* http://qiita.com/yusuga/items/cf08cf172c92364c1e14

上記記事を読んだメモです。メモなので消すかもです。

* ViewでActionを作成
* ActionをReactorにbind
* ReactorはActionSubjectとStateを保持
* ReactorはActionSubjectにemitされたらmutateメソッドでMutationを作成
* MutationはStateの更新を表す
* ReactorはreduceメソッドでMutationと現在のstateから新しいstateを作成
* ReactorはStateをObservableで保持しているので新しいstateをそこに流す
* Reactorは内部的にもCurrentStateを保持している
* Viewはstateをsubscribeしているので、その変更により状態を変える
Request error (error):  UnityEditor.AsyncHTTPClient:Done(State, Int32)

Unityで開発していたらなにやら
`Request error (error): UnityEditor.AsyncHTTPClient:Done(State, Int32)`
という謎のエラーが出ていたので解決方法メモ

<img width="357" alt="スクリーンショット 2017-06-10 23.02.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/63597/8c3e63ae-ad6b-7768-76b5-8058cfdd300a.png">

## 解決方法
Unityメニューの Unity -> Preferencesを開く -> GeneralタブのShow Asset Store search hitsのチェックを外すことで解決

<img width="504" alt="スクリーンショット 2017-06-10 23.02.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/63597/cfefe37b-f902-13b6-fff8-e57dbf3ca49d.png">

かなり昔の情報だがUnityのフォーラムにも上がっていた
https://forum.unity3d.com/threads/request-error-error-unityeditor-asynchttpclient-done-state-int32.203318/

ちなみに[Unity Documantation](https://docs.unity3d.com/jp/540/Manual/Preferences.html)によると、この項目にチェックを入れておくと、
> プロジェクトブラウザで Asset Store の検索をしたときにヒットしたアセット数を表示します。

らしい

特にプロジェクトブラウザ状でアセットストアの検索機能を使わない & エラーが気になる人はチェックを外しておいてもいいかもしれない
超簡単にOpenVPNを使う

簡単・高速にOpenVPNを利用するための方法

## テスト環境

- サーバ: Ubuntu 14.04.5 LTS
- クライアント: Ubuntu 14.04 / macOS Sierra / Windows 10 Creators Update

## 準備

サーバ側にOpenVPNサーバを立てます．

1. [Dockerをインストール](https://docs.docker.com/engine/installation/linux/ubuntu/)
2. 拙作スクリプトをダウンロード

    ```bash
    curl -L https://raw.githubusercontent.com/furushchev/scripts/master/openvpn.sh > openvpn.sh
    chmod +x openvpn.sh
    ```
3. OpenVPNサーバの初期設定

    ```bash
    ./openvpn.sh --init
    ```

これだけでOpenVPNサーバが起動します．

## クライアントPCの登録

クライアントはサーバが発行するovpnファイルを登録することで，サーバと認証を行います．
まずは例としてクライアントの名前を`client1`としてサーバ側でovpnファイルを作成します．

```bash
./openvpn.sh --add client1
```

以上で，カレントディレクトリに`client1.ovpn`ファイルができるので，これをクライアントPCにコピーします．

クライアントPCではOpenVPNクライアントをインストールして，先ほどのovpnファイルを登録すれば接続できるはずです．

参考にコマンドラインからの接続方法は，クライアントで以下を実行します．

```bash
sudo openvpn --config client1.ovpn
```

## クライアントPCの登録解除

```bash
./openvpn.sh --remove client1
```

以上で，`client1.ovpn`を使った接続が無効になります．

## クライアントPCの一覧

```bash
./openvpn.sh --list
```

## その他

```bash
openvpn.sh [--init|--add|--remove|--list] [options]
  Docker OpenVPN Server Configurator
  
  -i,--init
    Initialize openvpn server on docker
      Options:
        -p, --port: Port number used by OpenVPN
        --tcp: Use TCP Protocol for OpenVPN
  -a,--add <name>
    Generate client certificate
    name: client name
  -r,--remove <name>
    Revoke named certificate
    name: client name
  -l,--list
    List all clients
  -h,--help
    Show this help
```
Formで複数submitメモ

# Formで複数のsubmitメモ
```jsp:multiSubmit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>複数submit</h1>
<form action="Controller" method="post">
	名前<input type="text" name="name" size="10">
	<button type='submit' name='action' value='modify'>修正</button>
	<button type='submit' name='action' value='delete'>削除</button>
</form>
</body>
</html>
```
Bloccom Chapter0 SetUp

#**Bloccom SetUp**
**Bloccom**は、ESP-WROOM-02という小型WiFiモジュールを使用している。そこでスケッチを行う前に、Arduino開発環境を整える。

#手順
##1.Arduino IDE ダウンロード
**はじめに**下記URLのArduinoサイトより各自のOSを選択する。
https://www.arduino.cc/en/Main/Software
![ArduinoDownload.png](https://qiita-image-store.s3.amazonaws.com/0/185986/d1d45027-359a-e3ff-ddb2-bebe907030f6.png)

また、右下の**JUST　DOWNLOAD**を選択し、Arduino IDEをダウンロードする。
![JustDownload.png](https://qiita-image-store.s3.amazonaws.com/0/185986/72a49eb0-d25a-b566-0fbf-fa16754e01f3.png)

ダウンロードが完了し次第、Arduinoを立ち上げる。

##2.ESP8266 core for Arduino インストール
**次に**ESP8266のための開発環境を整える。下記のURLに飛び、下記画像の範囲をコピーする。
https://github.com/esp8266/Arduino
![Github.png](https://qiita-image-store.s3.amazonaws.com/0/185986/db62494f-ae10-3866-1d4b-09430511ac92.png)

ちなみに下記をコピーしても大丈夫!!
`http://arduino.esp8266.com/stable/package_esp8266com_index.json`


Arduinoを立ち上げメニューバーより、 Arduino>Preferencesを選択
![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/185986/29fff1e9-6e18-88bd-40c1-c7dcbd357998.png)

下記の場所に先ほどコピーしたURLを挿入し、OKを押す。
<img width="843" alt="挿入.png" src="https://qiita-image-store.s3.amazonaws.com/0/185986/7cc0844b-b014-c556-de01-0aeb58794e10.png">

次に、ツール>ボード>ボードマネージャを選択。
![BoardManager.png](https://qiita-image-store.s3.amazonaws.com/0/185986/1d943c59-befa-35d5-0fbf-b38763bc2f7f.png)

新しいタブの右上に ESP8266 を打ち込み、インストールをする。
バージョンは最新で大丈夫なはず!!
![ボードマネージャ.png](https://qiita-image-store.s3.amazonaws.com/0/185986/31684b2c-9a05-0881-173d-d7ddd6401de9.png)

完了したら閉じるを押す。
これで、ESP8266の開発環境が整った。

##3.ボードの設定
**最後に**ボードの設定をする。
メニューバーのツール>ボード>Generic ESP8266 Moduleを選択。
<img width="914" alt="Module.png" src="https://qiita-image-store.s3.amazonaws.com/0/185986/c4b577b7-68ce-01d2-ed5f-c2eb064aaa9d.png">

また、ツール内の全ての値が下記のようになっていることを確認する。
![ボード設定.png](https://qiita-image-store.s3.amazonaws.com/0/185986/e951768f-be82-58d2-42e0-2c1a83b001ef.png)

以上でESP8266のSetUp完了!!!

[Chapter1 LED点灯に進む](http://qiita.com/Bloccom/items/4722dd0f8fac82e9531c)
MacでMySqlを快速起動

MacにMySQLをインストールしてから毎回起動する時に、ターミナルに

```
$ /usr/local/mysql/bin/mysql -u root -p
Enter password:*******
```
を入力しなければなりません。
もっと早く起動するために、home デリクトリー配下で

```
$ touch .bash_profile
```
.bash_profileファイルを作って、その中に

```
export PATH=${PATH}:/usr/local/mysql/bin/
```
を入力して設定完了。

次回MySQLを起動する時は、

```
$ mysql -u root -p
```
で快速起動可能！
ROSでKinect V2を使う。

###目的
ROSでKinect V2を使う方法について。
[libfreenect2](https://github.com/OpenKinect/libfreenect2)/[iai_kinect2](https://github.com/code-iai/iai_kinect2)をソースからコンパイルする。

###環境
Ubuntu x1404 x64
ROS:Indigo

###手順

下記のコマンドでインストール。

####libfreenect2のインストール
libfreenect2をインストールする。　
https://github.com/OpenKinect/libfreenect2

```
$ mkdir ~/kinectv2
$ cd ~/kinectv2/
$ git clone https://github.com/OpenKinect/libfreenect2.git
$ cd libfreenect2/depends/
$ ./download_debs_trusty.sh 
$ sudo dpkg -i debs/libusb*deb
$ sudo apt-get install build-essential cmake pkg-config
$ sudo apt-get install libturbojpeg libjpeg-turbo8-dev
$ cd ..
$ mkdir build && cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/freenect2
$ make
$ make install
```

下記コマンドで動作確認。画像が取得できればOK。

```
$ ~/kinectv2/bin/Protonect 
```


####iai_kinect2のインストール
iai_kinect2をインストールする。　
https://github.com/code-iai/iai_kinect2

```
$ mkdir ~/catkin_kinectv2/src/ -p
$ cd ~/catkin_kinectv2/src/
$ git clone https://github.com/code-iai/iai_kinect2.git
$ cd iai_kinect2
$ rosdep install -r –from-paths .
$ cd ~/catkin_kinectv2
$ catkin build
```
.bashrcに以下を追加

```
$ vi ~/.bashrc
```
>source ~/catkin_kinectv2/devel/setup.bash

下記コマンドで動作確認。画像が取得できればOK。

```
$ roslaunch kinect2_bridge kinect2_bridge.launch
$ rosrun kinect2_viewer kinect2_viewer kinect2 sd cloud
```


![rosgraph.png](https://qiita-image-store.s3.amazonaws.com/0/73020/302283e4-3c1e-7202-c464-5415cdb529b8.png)

###参考
Kinect V2 + Ubuntu14.04 メモ @ demura.net
http://demura.net/athome/13165.html

「KINECT WITH ROS」(ROS勉強会2016.11.17)@ Katsunori Kanda, 
https://www.slideshare.net/potix2_jp/kinect-with-ros-69186713
記事まとめ（目次）

備忘のため、書いた記事のリンクを書きます。
#PHP
[さくらVPSでCentOS7にPHP7を入れる](http://qiita.com/minechan1234/items/07f8055155c58b77220d)
[CentOS7でブラウザアクセスするまで](http://qiita.com/minechan1234/items/146833d6ba1458f1a49d)

#MySQL
[CentOS7にMySQL5.7を入れる](http://qiita.com/minechan1234/items/eb3d96423358905a6da8)

#Laravel
[CentOS7でLaravel5.4の環境構築](http://qiita.com/minechan1234/items/7e0cbe04bf5f3f405938)
[Laravel5.4を入れて最初にやりたいこと](http://qiita.com/minechan1234/items/f84add083c946b67eda9)
[Laravel5.4でgulpする](http://qiita.com/minechan1234/items/363e2db0c1d915651f79)
[Laravel5.4でServiceを使ったプロジェクト構成](http://qiita.com/minechan1234/items/2cc7c69875fafb2fdae9)

#LDAP
[openLDAPをcentOS7に導入](http://qiita.com/minechan1234/items/4d1cc407f348fa125819)
[php7でopenLDAPに繋ぎユーザ管理を行う（前編）](http://qiita.com/minechan1234/items/ae988bc474a712a7ba83)
数値の桁数を取得する


pythonとperlそれぞれでの数値の桁数の数えかた
pythonのやつの考え方は数学的に参考になる

# pythonの場合
 
```
import math
# data の桁数を取得する
data_size = int (math.log10(data) + 1)
``` 
   
# perlの場合  

```
# $x の桁数を取得する
$count = $x =~ tr/0-9/0-9/;
```
Atomを半透明にするとvim-mode-plusのカーソルが表示されない問題の対処法

# この記事は
Atomを半透明にするとvim-mode-plusのカーソルが見えなくなってしまったので、カーソルを表示させるためのスタイルシートの設定を書きます。

vim-mode-plus以外の設定等は[こちら](https://qiita.com/exy81/items/adf45cee9da0ac091874#_reference-6f55a3d2657e400dca6d)や下の参考URLを参照してください。

# Atomのウィンドウを透過させる方法
この辺が参考になります。ソースからビルドする必要があります。
[Atomのウィンドウを半透明にする方法](http://qiita.com/kakinoki/items/37bfee713990f1c6b43c)
[Atomで透過ウインドウにする](http://qiita.com/yusugomori@github/items/22db3774f6fa9f0c6553)


`src/main-process/atom-window.coffee`の`option`に`transparent: true`を追加してビルドすればOKです。
スタイルシートの設定は上記のサイトを参考にしてください。

# vim-mode-plus用のスタイルシート
vim-mode-plusを使っている場合、コマンドモード時のカーソルが全く見えなくなってしまうので、`style.less`でカーソルの色と透明度を指定します。
`.cursor`と`.blink-off .cursor`で指定した色が交互に表示されますが、同じにしておけば点滅しなくなります。

※ベースは[こちら](https://github.com/atom/vim-mode/issues/201)からコピーさせてもらってますが、このサイトはvim-mode-plusでなく、vim-modeなので、そこだけ変更してます。

```
atom-text-editor.vim-mode-plus.normal-mode,
atom-text-editor.vim-mode-plus.operator-pending-mode,
atom-text-editor.vim-mode-plus.visual-mode
{
  // &, // only keep this if you want to see the cursor on non-focused tabs
  &.is-focused {
    // &::shadow, // shadow-DOM enabled
    &          // shadow-DOM disabled
    {
      // cursor color
      .cursor {
        // cursor styles
        background-color: rgb(90, 90, 250) !important;
        opacity: 0.6 !important;
        // visibility: visible !important;
      }
      .blink-off .cursor {
        // cursor style while blinking (if you so desire)
        background-color: rgb(90, 90, 250) !important;
        opacity: 0.6 !important;
        // visibility: visible !important;
      }
    }
  }
}
```

以上です。
Goでのアルゴリズムクイックリファレンス第2版(逐次探索)

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。[アルゴリズムクイックリファレンス 第2版](https://www.amazon.co.jp/gp/product/4873117852/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117852&linkCode=as2&tag=amesho-22&linkId=b7688201ae37a6234596fa96dfd3ccdd)を読んで各種アルゴリズムをGoで実装して行きます。

前回: [Goでのアルゴリズムクイックリファレンス第2版(マージソート)](http://qiita.com/amesho/items/7a057b2730b74a323166)

今回は[逐次探索](https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%9E%8B%E6%8E%A2%E7%B4%A2)

集まりCのなかの目標値tを力任せで見つける。最良でO(1)で平均・最悪O(n)となる。

```go
package main

import "fmt"

func search(a *[]int, t int) bool {
	for _, v := range *a {
		if v == t {
			return true
		}
	}
	return false
}

func main() {
	a := []int{1, 2, 3, 4, 5, 6, 7}
	if search(&a, 7) {
		fmt.Println("ok")
	}

	if search(&a, 8) {
		fmt.Println("no")
	}
}
```

次回は二分探索の予定です。
Visual Studio Codeでリモートマシン上のNode.jsファイルを直接操作（編集、デバッグ実行）する

# 実現すること
Visual Studio Codeでリモートマシン上のNode.jsファイルを直接操作（編集、デバッグ実行）します

　　　　![debug.png](https://qiita-image-store.s3.amazonaws.com/0/107056/9773b48e-6051-c9df-8370-92bb84f3bd2c.png)
　　　　**ローカルマシン(Windows)でリモートマシン(Linux)のNode.jsファイルを直接操作**

# 対象者
- Visual Studio Codeを使ってNode.jsの開発をしている人
- LinuxマシンのファイルをViとかEmacsで編集するが煩わしいと思っている人
- ローカルで開発したコードをいちいちリモートのLinuxサーバに転送するのが面倒な人
- リモートのLinuxサーバのソースを直接デバッグ実行したい人

# 検証環境
+ ローカルマシン
    - Windows 10
    - Visual Studio Code 1.13.0

+ リモートマシン
    - AWS EC2 (Amazon Linux AMI 2017.03.0.20170417 x86_64 HVM)

# リモートマシン側の準備
## Node.js

#### インストール

```
$ sudo su
# curl -sL https://rpm.nodesource.com/setup_8.x | bash -
# yum install -y gcc-c++ make
# yum install -y nodejs
```

#### 動作確認

```
# curl -sL https://deb.nodesource.com/test | bash -
# npm --v
# node -v
```

#### 参考URL
リンク：https://github.com/nodesource/distributions#enterprise-linux-based-distributions

## jmate

#### インストール

```
# npm -g install jmate
```

#### 参考URL
リンク：https://github.com/jrnewell/jmate

## SSH

セキュリティグループの設定でインバウンド、アウトバウンドともに52698ポートを許可します。

- タイプ：カスタムTCPルール
- プロトコル：TCP
- ポート範囲：52698
- ソース：許可したいIPアドレス

# クライアントマシン側の準備
## Visual Studio Code, Node.js
Visual Studio Code, Node.jsをインストールしておきます。

#### Windows用のSSHクライアントのインストール
Windowsで実行可能はSSHクライアント（ssh.exe）をインストールしPATHを通します。
SSHクライアントは、 **[git for windows](https://git-for-windows.github.io/)** などに含まれています。

## SSH
#### キーペア
インスタンス生成時に作成したキーペア（*.pemファイル）を `~\.ssh` に保存します。
ここでは、`my-ec2.pem` というファイル名で保存したものとして以降説明します。

#### configファイル
毎回長いsshコマンドをうたなくても大丈夫なようにconfigファイルに設定を書いておきます。

```~\.ssh\config
ServerAliveInterval 60

Host my-ec2
    HostName ※EC2のIPアドレス
    User ec2-user
    IdentityFile ~/.ssh/my-ec2.pem
    RemoteForward 52698 127.0.0.1:52698
```

#### テスト
sshコマンドでサーバにアクセスできることを確認します。

```
> ssh my-ec2
```

自動的にログインできればSSHの設定完了です。


## Remote VSCode

#### インストール

Visual Studio Code > EXTENSIONS (Ctrl+Shift+X) > Remote VSCode > Install

#### settings.jsonの設定

Visual Studio Code > File > Preferences > Settings (Ctrl+Comma)

User Settingsに以下を追記

```
  //-------- Remote VSCode configuration --------

    // Port number to use for connection.
    "remote.port": 52698,

    // Launch the server on start up.
    "remote.onstartup": true
```

※ `"remote.onstartup": false` の設定にした場合は、F1でcommand palleteを表示し、`Remote: Start server` でRemote VSCodeのサーバーを起動します。

# ローカルのVisual Studio Codeでリモートのファイルを操作

1. Visual Studio Codeを起動します。
2. Visual Studio CodeのTerminalでサーバにSSH接続します。
    
    ```
    > ssh my-ec2
    ```
    
3. ファイルオープン
    Visual Studio Codeでリモートのファイルを開きます。
    
    ```
    $ jmate -p 52698 ファイル名.js
    ```
    
4. 編集とデバッグ実行
    4.1. ファイルを編集します。
    4.2. ソースコードにブレークポイントをはります。
    4.3. デバッグウィンドウを開きます。(Ctrl+Shift+D)
    4.4. デバッグ実行します。（F5）
  
　これで、ファイルの編集、ステップ実行、変数の参照、ウォッチ式の設定、コールスタックの参照、ブレークポイントの設定がローカルファイルと同様に動作するようになりました。
画面遷移　情報の受け渡し　備忘録

#画面遷移　情報の受け渡し

##MainActivity
時刻・コメント取得は前回の物を流用

IntentでSubActivtyへ値を受け渡す
intent.putExtra("String Value", comment);
intent.putExtra("int Value", quantity);


```java
        intent.putExtra("String Value", comment);
        intent.putExtra("int Value", quantity);
```

```java
    private void addQuantityInfo() {
        // 数量の変数宣言
        private int quantity = 0;
        // コメントを取得する
        EditText edittext = (EditText) findViewById(R.id.edit_comment);
        String comment = edittext.getText().toString();
        // 画面遷移
        Intent intent = new Intent(getApplication(), DetailScreen.class);
        intent.putExtra("String Value", comment);
        intent.putExtra("int Value", quantity);
        startActivity(intent);
    }
```

###SubActivty
CharSequence=文字列を読み取っている
CharSequence getstring これで取得した文字列を読み取っている

```java
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.detail_screen);
        setTitle("");

        Intent intent = getIntent();
        //MainActivityから値を受け取る
        CharSequence getstring = intent.getCharSequenceExtra("String Value");
        int getint = intent.getIntExtra("int Value",0);


        //id textView1をt1に当てはめている
        TextView t1 = (TextView)findViewById(R.id.textView1);
        //id textView1をt2に当てはめている
        TextView t2 = (TextView)findViewById(R.id.textView2);

        //受け取った値を表示
        t1.setText("受け取った文字は"+getstring);
        t3.setText("受け取った数値は"+String.valueOf(getint));
```
virtualenv で環境を作成する

備忘録として書いていきます。

# 環境
|ミドルウェア|バージョン|
|:-----|:-------|
|OS|macOS Sierra|
|Python|3.6.1|
|pip|9.0.1|
|virtualenv|15.0.1|

# 実施内容
公式ドキュメントに従って次のコマンドを任意の場所で実行すると以下のようになります。

```
$ virtualenv ENV
Using base prefix '/Users/<ユーザディレクトリ>/.pyenv/versions/3.6.1'
New python executable in /Users/<ユーザディレクトリ>/Desktop/ENV/bin/python3.6
Also creating executable in /Users/<ユーザディレクトリ>/Desktop/ENV/bin/python
Installing setuptools, pip, wheel...done.
```

ここでの`ENV`は新しく作る環境のフォルダで、任意の名前をつければその名前でフォルダが作成されます。

# 参考資料
- [virtualenv - User Guide](https://virtualenv.pypa.io/en/stable/userguide/)
「UIViewのframe.size.widthとかめんどくさいので省略する」のswift版

ようやくSwift触りだした

仕事で使ってた「[UIViewのframe.size.widthとかめんどくさいので省略する](http://appstars.jp/archive/689)」のObjCのcategoryをswiftのextensionに書き換えた

同じようなのがどこかにあるだろうと思ったけどすぐ見つからなかった
もしかしてswiftではもうこんなの使う必要なかったりする機能あるの？

```UIView+Simple.swift
extension UIView{
  var width:CGFloat{ get{return self.frame.size.width} set(value){self.frame.size.width = value} }
  var height:CGFloat{ get{return self.frame.size.height} set(value){self.frame.size.height = value} }
  var x:CGFloat{ get{return self.frame.origin.x} set(value){self.frame.origin.x = value} }
  var y:CGFloat{ get{return self.frame.origin.y} set(value){self.frame.origin.y = value} }
  var right:CGFloat{get{return self.frame.origin.x + self.frame.size.width} set(value){self.x = value - self.frame.size.width}}
  var bottom:CGFloat{get{return self.frame.origin.y + self.frame.size.height} set(value){self.y = value - self.frame.size.height}}
  var o:CGPoint{ return CGPoint(x: self.width/2, y: self.height/2)}
  var minSize:CGFloat{return min(self.frame.size.width, self.frame.size.height)}
  var maxSize:CGFloat{return max(self.frame.size.width, self.frame.size.height)}
  func toFront(){self.superview?.bringSubview(toFront: self)}
  func toBack(){self.superview?.sendSubview(toBack: self)}
  var trueSize:CGSize{
    let t:CGAffineTransform = self.transform
    self.transform = .identity
    let size:CGSize = self.frame.size
    self.transform = t
    return size
  }
}
```
Python - 非線形方程式解法 二分法 & ニュートン・ラフソン法

二分法とニュートン法を用いて以下の非線形方程式の数値解を求める。

```math
sin(x)=0
```

#二分法

区間$x=[a,b]$で$f(x)$が連続かつ$f(a)f(b)<0$の時、区間内で$f(x)=0$となる解を一つ求める方法。

アルゴリズムは

1. $f(a_0)f(b_0)<0$を満たす解を求めたい範囲で$a_0、b_0$に初期値を代入する。
2. $c=\frac{(a_i+b_i)}{2}$とし、$f(c)f(a_i)<0$ならば$b_{i+1}=c,a_{i+1}=a_i$、$f(c)f(a_i)>0$ならば$b_{i+1}=b_i,a_{i+1}=c$で更新する。
3. 2の逐次計算を行い、$|f(c)|<ε_1$もしくは$|a_i-b_i|<ε_2$を満たせば収束したとして計算を終了する。

###・ソースコード
$x=π$の解を求めるため、初期値$a_0=3.0$、$b_0=3.5$とした。

```py3
import math

def f(x):
    return math.sin(x)

EPS1 = 0.00001
EPS2 = 0.00001

a = 3.0
b = 3.5

while True:
    c = (a + b)/2
    if f(a)*f(c) < 0:
        b = c
    else:
        a = c
    if abs(f(c)) < EPS1 or abs(a - b) < EPS2:
        break

print("x = %f" % c)
```
###・結果

```py3
>>> print("x = %f" % c)
x = 3.141602
```

#ニュートン法
$x_i$における$f(x)$の接線を求め、接線と$x$軸との交点を次の$x_{i+1}$として更新し、逐次計算を行う方法。

$x_i$における$f(x)$の接線$g(x)$は

```math
g(x)-f(x_i)=f^{'}(x_i)(x-x_i)
```

接線と$x$軸との交点を次の$x_{i+1}$として更新するため、$g(x)=0$として

```math
0-f(x_i) = f^{'}(x_i)(x_{i+1}-x_i)\\
x_{i+1} = x_i-\frac{f(x_i)}{f^{'}(x_i)} ... ①
```

アルゴリズムは

1. $x_0$に初期値を与える。
2. ①式に従って次の$x_{i+1}$を求める。
3. 2を繰り返し、$|f(x)|<ε$となったら収束したとし終了する。

###・ソースコード
今回は微分値には解析解($cos(x)$)を用いた。

```py3
import math

def f(x):
    return math.sin(x)

def df(x):
    return math.cos(x)

EPS1 = 0.0001

x = 3.5

while True:
    x -= f(x)/df(x)
    if abs(f(x)) < EPS1:
        break
        
print("x = %f" % x)
```

###・結果

```py3
>>> print("x = %f" % x)
x = 3.141594
```
メモリ制限下でElasticsearch5のDockerコンテナを立ち上げる

## 要約
Elasticsearch5の公式イメージからDockerコンテナを立ち上げようとすると、メモリが少ないと立ち上がらない。
以下のように、ES_JAVA_OPTSでJava VMのヒープサイズを指定してあげると良い。

```sh
# （例）メモリ1250M・Javaのヒープサイズ400Mの場合
docker run -m 1250m -e "ES_JAVA_OPTS=-Xms400m -Xmx400m" elasticsearch:5.3.2
```

## 詳細
メモリ1250MでElasticsearch5のイメージを立ち上げようとすると、
エラーメッセージを吐かずに落ちる。
`docker run -m 1250m elasticsearch:5.3.2`

`docker inspect`で調べると、ステータスコード137で落ちている模様、、

### ファイルディスクリプタ数の上限を指定する
elasticsearchは大量のファイルディスクリプタを消費するので、まずはファイルディスクリプタ数の上限を指定してみる。
デフォルトでは64Kだそうなので、半分の32K・さらに半分の16Kで試してみるがうまくいかない。
`docker run -m 1250m --ulimit nofile=32000:32000`
`docker run -m 1250m --ulimit nofile=16000:16000`

### コンテナのメモリ上限を上げてみる
ではメモリの問題かと考え、コンテナのメモリ上限を上げて試してみると、立ち上げに成功。今回はメモリに制限があることが前提の環境だったので、工夫してみる。
`docker run -m 3000m elasticsearch:5.3.2`

### ES_HEAP_SIZEを指定
ぐぐると、ES_HEAP_SIZEという環境変数でJava VMのヒープサイズ上限を指定できる模様。早速やってみる。
https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html を見ると、メモリの半分以下が推奨されているので、とりあえず400Mにしておく。

```
docker run -m 1250m -e "ES_HEAP_SIZE=400m" elasticsearch:5.3.2
```

するとこんなエラーが。環境変数の名前が変わったよ、というエラーのようだ。

```
Error: encountered environment variables that are no longer supported
Use jvm.options or ES_JAVA_OPTS to configure the JVM
ES_HEAP_SIZE=400m: set -Xms400m and -Xmx400m in jvm.options or add "-Xms400m -Xmx400m" to ES_JAVA_OPTS
```

### ES_JAVA_OPTSを指定
エラーメッセージのままに、環境変数の指定を変えて再チャレンジ。

```
docker run -m 1250m -e "ES_JAVA_OPTS=-Xms400m -Xmx400m" elasticsearch:5.3.2
```

立ち上がった！

## 最後に
けっこう苦労したのだが、ちゃんと公式のリファレンスに書いてありました、、Elasticの製品は、リファレンスがきっちりしていて良いですね。
https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
rbenv installでお目当てのrubyが見当たらない時の対処

大まかに言うとgitで管理されているruby-buildをupdateしてあげればOK
rbenvはruby-buildを使ってruby installを行っている。
そこで、以下の2つの方法のどちらかでruby-buildをupdateしましょう。

# 1. Homebrewをアップデート

```
brew update
brew upgrade ruby-build
```

注:brew updateしたくないので、僕はもう１つの方法でアップデートします。

# 2. ruby-buildを直接update

```
 cd ~/.rbenv/plugins/ruby-build 
 git pull origin master
```

とりあえずこの処理はbrew updateと違い一瞬で終わるので素敵です。　以上