OmniAICreator/Qiita-1.07M huggingface dataset:
python gmailからemailを送信


##参考元

https://www.udemy.com/the-python-mega-course/learn/v4/overview

gmailを送るためのSMTPの設定
https://www.lifewire.com/what-are-the-gmail-smtp-settings-1170854

smtpの公式ドキュメント：
https://docs.python.jp/3/library/smtplib.html

emailモジュールの公式ドキュメント：
https://docs.python.org/ja/3.5/library/email-examples.html

##使うライブラリー

```py
from email.mime.text import MIMEText
import smtplib
```

##gmailから送るためのコード

いくつか注意点：

* この.pyのファイルの名前を"email.py"にしないこと。pythonにはemailモジュールが既にあるため。特に仮想環境上で別の.pyファイルと紐付ける場合は大抵バグる。
* 事前に自分のgoogleアカウント→アカウントにアクセスできるアプリ→安全性の低いアプリの許可:無効→有効へ。あいにくgoogleには安全度が低いと見なされている。


```py

#don't be this file name "email.py"
#becasuse 'email module' is alreday ocuppyed
#it mean don't use module name already exist

from email.mime.text import MIMEText
import smtplib

def send_email(email, chinpo, average, count):
    #送り元
    from_email="自分のgmailアドレス@gmail.com"
    from_password="gmailアドレスに対応したpassword"
    
    #送り先
    to_email=email

    #メールの内容
    subject="Chinpo data"
    message="Hey there, your chinpo size is <strong>%s</strong>.<br>Average size of <strong>%s</strong> people is <strong>%s</strong>.<br>Thanks!" % (chinpo, count, average)

    msg=MIMEText(message, "html")
    msg["Subject"]=subject
    msg["To"]=to_email
    msg["From"]=from_email

    gmail=smtplib.SMTP("smtp.gmail.com", 587)
    #gmail.ehlo()
    gmail.starttls()
    gmail.login(from_email, from_password)
    gmail.send_message(msg)
    #gmail deal with smtp as less scure, 安全性の低いアプリを許可をonへ
    #そして迷惑メールに振り分けられていると

```

1. 前提として、有効なgmailアカウントが必要。要はgmailのメールアドレスとパスワードが必要。送信元。
2. もちろん送り先のメールアドレスもいる
3. メールの本体になるのは`MIMEText`。ここにメールの文章やその他情報を渡す。`msg`変数をprintすると(下記※1)辞書みたいなのが出力される。`_subtype`って引数にメールの中身のコンテントタイプを登録可能。`html`とか。デフォルトは`plain`。`html`を指定することで、htmlタグを使えるようになる。変数の`message`に入ってる`<strong>`はhtmlタグ。文字を太字強調できる。
4. msg["Subject"]でメールの件名。["To"]で宛先のEメールアドレス。["From"]は送り元のメールアドレスを登録する。
5. `SMTP`はメールサーバへ接続してメールを送信する機能を提供してくれる。今回はgmailで送るので、
gmailのサーバーアドレス`smtp.gmail.com`(ホスト名)。SMTP port番号を`587`を渡す。参考元：https://www.lifewire.com/what-are-the-gmail-smtp-settings-1170854
6. `starttls()`メソッド。TLS (Transport Layer Security) モードでSMTP接続する。以降のSMTPコマンドは暗号化される。
7. gmailにはアカウントのログインが必要。`login()`メソッドに自分のメールアドレスと、パスワードを渡す。
8. `send_message()`メソッドでメールを送信できる。

```py:※1
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
```

databaseから値を持ってきて、送るとか。
このクソ便利な`schedule`モジュール: https://pypi.org/project/schedule/  を使って提示連絡を自動化するとかできる。

* `schedule`は時間、日付、曜日で時間を指定できる。曜日+時間みたいな組み合わせも可能。

でもEメールの確認すげぇめんどくさいから、一刻も早くこの世からEメールが消滅してくれることを願ってる。メールボックス開くのが憂鬱やねん。


##あとがき
最近勘違いしてたこと。ニューラルネットワーク(Neural Network)の呼び方を、ニュートラルネットワークと間違えていた。何を中立ちしてくれるんやろな？
BBC micro:bit （マイクロビット）で遊ぶ方法

ひょんなことから
Micorbitを手にして
http://microbit-micropython.readthedocs.io/ja/latest/tutorials/hello.html

```
from microbit import *
display.scroll("Hello, World!")
```
と転送して表示されて面白いかもっ
と思ったので
自宅でやってみるためメモ失礼します。

もっと面白いこと出来るといいなー
NCL > 実行時引数の指定がない時に実行を中止する

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

NCL(NCAR Command Language)関連。
WRF(Weather Research and Forecasting Model)関連。

### 関連

- [NCL > Link > 実行時引数のデフォルト指定の案 @ SKYGIANT > .not.isdefined("myint")で確認してmyintに代入する](https://qiita.com/7of9/items/a97790f60be95ab4d0ff)
- [NCL > 行列形式で出力する > write_matrix() / 実行時引数の指定](https://qiita.com/7of9/items/6cf4a5ea7c8bd9387725)
- [NCL > exit() > スクリプト実行を終了する](https://qiita.com/7of9/items/1201dda8c737b41d1251)

### 概要

- 実行時引数の指定がなければ実行を中止する

### 実装

```ncl
if (.not.isdefined("pi")) then
    print("ERROR: pi is not specified")
    print("")
    print("Execute as follows")
    print("[cmd] pi=3.141592")
    exit()
end if

print("pi is")
print(pi)
```

### 実行例

関連: [NetCDF / NCL > ncl実行時にcopyrightなどを表示しない > -Qオプション](https://qiita.com/7of9/items/c5ff2bed8e5b3597eba2)

```txt:run
$ ncl -Q no_arg_180806.ncl 
(0)     ERROR: pi is not specified
(0)
(0)     Execute as follows
(0)     [cmd] pi=3.141592
```

```txt:run
$ ncl -Q no_arg_180806.ncl pi=3.1415
(0)     pi is


Variable: pi
Type: float
Total Size: 4 bytes
            1 values
Number of Dimensions: 1
Dimensions and sizes:   [1]
Coordinates: 
(0)     3.1415
```
caliper-jsのサンプルプログラム

[caliper-jsのインストール](https://qiita.com/toshiukii/items/79e7bb9b648532216b98)のつづき。

ビルドしたcaliper-jsを使う。

```
<script src="caliperSensor-1.1.3.js"></script>
```
最新ではないがimsglobal.orgにライブラリがある。

```
<script src="http://purl.imsglobal.org/caliper/caliperSensor-1.1.1.js"></script>
```

以下の内容はcaliper-jsのサンプルを書き変えたものである。まず，EntityFactoryとEventFactoryで，entityとeventを記述していく。[IMS Caliper 1.1の仕様](https://www.imsglobal.org/sites/default/files/caliper/v1p1/caliper-spec-v1p1/caliper-spec-v1p1.html#assessmentEvent)によると，AssessmentEventではid，type，actor，action，obj，eventTimeが必須である。

```
var actor = Caliper.Entities.EntityFactory().create(Caliper.Entities.Person, {id: "https://example.edu/users/554433"});
var action = Caliper.Actions.started.term
var obj = Caliper.Entities.EntityFactory().create(Caliper.Entities.Assessment, {
  id: "https://example.edu/terms/201801/courses/7/sections/1/assess/1",
  dateToStartOn: "2018-11-14T05:00:00.000Z",
  dateToSubmit": "2018-11-18T11:59:59.000Z",
  maxAttempts: 1,
  maxScore: 25.0
  // ... add additional optional property assignments
});

// Create Event
var event = Caliper.Events.EventFactory().create(Caliper.Events.AssessmentEvent, {
  id: id,
  actor: actor,
  action: action,
  object: obj,
  eventTime: new Date().toISOString(),
});
```

作成したeventをエンベロープにおさめて，エンドポイントに送信する。

```
// Initialize Caliper sensor
var sensor = Caliper.Sensor;
sensor.initialize("http://example.org/sensors/1");

// Override default HTTP options
var options = Caliper.Clients.HttpOptions;
options.uri = "https://example.edu/caliper/target/endpoint";
options.headers["Authorization"] = "40dI6P62Q_qrWxpTk95z8w";

// Initialize and register client
var client = Caliper.Clients.HttpClient;
client.initialize("http://example.org/sensors/1/clients/2", options);
sensor.registerClient(client);

// Create data payload
var payload = [];
payload.push(event);

// Envelope options
var opts = {
  sensor: sensor.id,
  sendTime: new Date().toISOString(),
  dataVersion: "http://purl.imsglobal.org/ctx/caliper/v1p1",
  data: payload
};

// Create envelope with data payload
var envelope = sensor.createEnvelope(opts);

// Delegate transmission responsibilities to client
sensor.sendToClient(client, envelope);
```
grepコマンドのオプション

Linuxの `grep` でも `git grep` でも

```
grep -A5 'hoge'
```
で 'hoge' を含む行の後ろ5行を標準出力してくれる。

```
grep -B5 'hoge'
```
で前5行を標準出力してくれる。

```
grep -C5 'hoge'
```
で前後5行を標準出力してくれる。

設定ファイルを軽く見たい時に、grepしてlessする、みたいな手間が少し減るので便利。
NTT ドコモの雑談 API を Ruby スクリプトから呼び出してみた

# はじめに

@GORO_Neko です。
ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

まずお断りをば一言。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# 雑談 API って知ってます？
はい、本日のお題です。

NTT ドコモさんが、API 呼び出し形式で、いくつか面白いサービスを開放してくれています。
その一つがこれ、[雑談 API ](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=natural_dialogue&p_name=api_4_usage_scenario#tag01)。

話がかみ合ってるのかかみ合ってないのか微妙な会話になる事が多くはありますが、退屈な時に結構な暇つぶしになってくれる、個人的にはありがたいサービスだったりします。

1 年ほど前にちょっと使って遊んでおりました。
で久しぶりに昔作ったスクリプトを取り出して API を呼んだところ、盛大にエラーが返ってまいりました。

Google センセに尋ねてみたり色々調べたところ、この数か月で API の使い方ががらっとかわってしまったようです。
まぁ、[公式リファレンス](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=natural_dialogue&p_name=api_4#tag01)読めば、わかる話だったというオチではありますが … 

結構使い方を調べなおすのに手間取ったので、忘れないようにメモをします。

# AIP を使うための手順
雑談 API を利用して、会話を行う大まかな手順は以下のようになります。

1. [docomo Developer support](https://dev.smt.docomo.ne.jp/?p=index)にアクセスし「 API 利用申請」を行い、「 API key 」を発行してもらう。
2. 雑談 API を用いて会話を始める前に、[登録サービス](https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration)にアクセスして、会話の一意性を保証するための appId を取得する。
3. [会話サービス](https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue)にアクセスして、サービスと会話を行う。

# 使用例
Ruby 言語で実装した例を[GitHub](https://github.com/YoshihikoHara/chat)に置きました。
Ubuntu 18.04 64 bit および Windows 10 64 bit 上で、CRuby 2.6 で実行した実績があります。

よかったら実行してみてください。

では、また。
GitHubコマンド（サブモジュールを含むブランチ作成）

# GitHubのコマンドで　サブモジュールを含む新ブランチ作成にはまったので備忘録

## 目的
サブモジュールを含むブランチを作成するのはいろいろ面倒なのでコマンドで実施

## やり方

①ローカルリポジトリに移行
cd /d d:
cd D:\githubtest\\NewBranch_command
②リモートから特定のブランチを指定して複製する（サブモジュールも最新版取得される)
git clone -b develop --recursive https://github.com/●●●●/NewBranch

■■■■■■■↓↓サブモジュールの設定↓↓■■■■■■■■■■■■■■■■■■■■■■■
※以下の作業を全てのサブモジュールを取得して繰り返し行う（未実装）
■②サブモジュールをプッシュする（新ブランチ名:testCmdNewBranch)
②-1 サブモジュール場所に移動
cd D:\githubtest\NewBranch\src\Libraries

②-2 チェックアウトして切り替え
git checkout -b testCmdNewBranch origin/develop

②-2 対象範囲全て
git add .
●ここでテスト用に修正（新ブランチだよ目印)
②-3 コミットしてコメントを追加
git commit -m 'commmandtest'
②-3
git push origin testCmdNewBranch
②-4

③サブモジュール【testCmdNewBranch】をプルする
git pull origin testCmdNewBranch


■■■■■■■↑↑サブモジュールの設定↑↑■■■■■■■■■■■■■■■■■■■■■■■

④メインモジュールをコミット（サブモジュールの切り替えを確認）

④-1 メインモジュールに移動
cd D:\githubtest\NewBranch\

④-1 対象範囲全て
git add .

④-2 ローカルブランチを作成してチェックアウトして切り替え
git checkout -b testCmdNewBranch origin/develop

④-2 サブモジュール切り替えをコミット→modified:   エラーはaddがない
git commit -m 'commmandtest-submoduleupdate'




⑤メインモジュールを【testCmdNewBranch】名でプッシュ
git push origin testCmdNewBranch

⑥メインモジュール【testCmdNewBranch】をプルする
git pull origin testCmdNewBranch

●で行った変更が反映されているか確認






## サブモジュールを含む時に気を付けたい事
④-1 対象範囲全て
git add .をぬかすとうまく更新されないから注意してください。

## その他エラー
### エラー内容

```
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
ffatal: early EOF
atal: The remote end hung up unexpectedly
fatal: index-pack failed
```
### 解決策
バッファサイズを増やす必要があります。

 `git config --global http.postBuffer 524288000 `
[gitでプッシュした時に「error: RPC failed; result=22, HTTP code = 411」と表示された時の対処](https://qiita.com/makotok7/items/f06542082c75cbf41c54)
HTMLまとめ

#はじめに

これは**文系ボードゲーマー**である私がプログラミングを勉強したことをアウトプットする日記のようなもの。
今回はHTMLのコードの名称と使い方まとめ


#HTML

- タグ:テキストを囲んで属性をつける
開始タグ:<?>
終了タグ:</?>

- 見出しと段落：見出しはh１〜h６まであって、h６が一番小さい
見出し：< h1 >< /h1 >
段落：< p >< /p >

- コメント：囲んだテキストにコメントが書ける。ブラウザには表示されないのでメモとして使える。
コメント：<!-->

- リンク：テキストを囲むとリンクを作れる。
リンク：< a > < /a >
飛び先指定：< href >
完成形：< a href="url" >

- 画像：画像を挿入
画像：< img >**テキストは囲まないので終了タグはなし**
画像の属性：< src >
完成形：< img src="url" >

- リスト：テキストを箇条書きにできる
リスト：< li >囲む要素によって種類が変わる
黒点：< ul >
     　　　　 < li >　　インデントをつけるとわかりやすい
   　　　　   < /li >
  　　　  < /ul>

　数字連番：< ol >
       　　　　　　　 < li >
       　　　　　　　 < /li>
     　　　　　　  < /ol >

- HTML全体構造：html,head,body
HTML:< html >< /html > 
head:< head >< /head >ページに関する
情報
body:< body >< /body >実際に表示したい内容

-　文字コード：文字化けを防ぐ
charset:< meta charset="utf-8" >文字コードをUTF-8に指定

- タイトル：ブラウザのタブに表示される
タイトル：< title >< /title >

- CSSを読み込む
CSS：< link rel="stylesheet" >

- レイアウト：要素をグループ化
レイアウト：< div >< /div >
ヘッダー：< div class="header" >< /div >
メイン：< div class="main" >< /div >
フッター：< div class="footer" >< /div >

- 送信ボタン
ボタン:< input type="submit" >


#おわりに
HTMLの基本的なコードをまとめた。
これに更にCSSの知識を追加してHTMLとCSSを使えるようにする。
Python:FlaskとPostgreSQLとDockerでウェブアプリを作る

#始めに
FlaskとPostgreSQLとDockerでウェブアプリを作った時のメモです
Windows環境でDocker＋Flask＋Dockerについて書いてある記事は意外と少ないので、Windowsユーザの参考になればと思います

#この記事を書いた人について
J2EEとRailsは作ったことはあるけれど、pythonはほとんど触ったことはありません

#やりたいこと
 - 環境はすべてDocker上の仮想環境に構築する
 - PythonのWebアプリを作る
 - postgresqlに登録できるとこまで作る

# その１　Docker上の仮想環境に構築する

## Dockerfileの作成
ネット上にいろいろある情報を参考に、Dockerfileを作ってみました

[GitHub上のコード](https://github.com/triple4649/pythonweb/blob/master/Dockerfile)

FlaskをDebugモードで上げるためCMD文に
```FLASK_APP=app.py FLASK_DEBUG=1 flask run```    

と記載しています

## docker-compose.ymlの作成
[GitHub上のコード](https://github.com/triple4649/pythonweb/blob/master/docker-compose.yml)　　　　

Webモジュールの依存にPostgresqlを依存させています。
Flaskを使うことにしたのは特に深い理由はありません

#  その２　PythonのWebアプリを作る

## app.pyファイルの作成
 - [GitHub上のコード　app.py](https://github.com/triple4649/pythonweb/blob/master/app.py)
 - [GitHub上のコード　mywebapp.py](https://github.com/triple4649/pythonweb/blob/master/logic/mywebapp.py)

Web上でよくある例のように「app.py」にDBの接続やルーティング情報、DBの登録ロジックをすべて書くのは嫌だったのでDBの登録ロジックは別ファイルに記載することにしました 。   
ただし、Pythonのimort文に関する仕様がよくわかっていなかったため、エラーの解消に時間がかかりました。    
Javaの感覚でimport文を全部最初に記載するのではなく、スクリプト言語らしく必要な個所にimport文を記載する、ことがpythonのimport文を理解する上での鍵ですね

#  その３　postgresqlに登録にデータを登録する

[JavaScript:クリップボートのイメージをBase64変換する](https://qiita.com/triple4649/items/466c47aa657fc0c67950)で作ったHTMLファイルからPOSTしたBase64のデータをPostgresqlに登録させてみました

#  その４　アプリケーションを実行する
GitHubから適当なフォルダにクローンして、コマンドラインからdocker-compose up -dを実行すればWebアプリケーションが実行されます

# 雑感
## 環境構築
RailsのようにWindows固有の問題で頭を悩ますことはなく、J2EEのようにあれこれ設定する必要がなく割と楽に環境構築ができました。dockerに慣れていればほんの数時間で簡単なWebアプリケーションが作成できそうです
## アプリケーション開発
 - テーブルのCreateをDDLなしでできるので楽、カラムの変更もサーバ起動時に自動的にやってくれるのでこれも楽です
 - ルートパスを@で指定できるのがJavaと同じなのでとっつきやすかったです
 - App.pyにエラーがあるとサーバ起動がうまくいかない。App.pyから自作のモジュールを呼び出すときはimport文の定義する箇所に注意しなければならない。
 - DBのコネクションを自前で保持しないといけないのが面倒くさいかも
HTML&CSS でホームページを作ろう！

#ホームページ作成の流れ

➀デザインの作成
➁コードを書く

ページの作成は➁が重視されがちだが、実は「デザインの作成」が大切！

##➀デザインの作成
ページを作る時に軽視されがちだが、コードをかく前にデザインを「がっちり」固めることが大切。
この段階を飛ばすと、後から収集がつかなくなる可能性が高い。

以下の3つのステップを行う。

➀ページの目的を決める
➁ページの内容の決定
➂ページのデザインを固める

###デザインの作成時の注意点
___
誰が見てもわかりやすいようなデザインにする！

・線の区切り、枠組みを意識
・整理整頓されたものを



デザインの構成はどうやって作るのか？
NCL > exit() > スクリプト実行を終了する

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

NCL(NCAR Command Language)関連。
WRF(Weather Research and Forecasting Model)関連。

スクリプト実行を途中で終了するにはexitを使うようだ。

https://www.ncl.ucar.edu/Document/Functions/Built-in/exit.shtml
NCL > Link > 実行時引数のデフォルト指定の案 @ SKYGIANT > .not.isdefined("myint")で確認してmyintに代入する

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

NCL(NCAR Command Language)関連。
WRF(Weather Research and Forecasting Model)関連。

NCLスクリプト実行時、実行時引数を与える場合、指定がなかった場合のデフォルト値設定方法を下記にて見つけた。

https://skygiant.com.au/commandline-arguments-in-ncl/

以下は引用です。

```ncl
; Script arguments
if (.not.isdefined("myint")) then
    myint = 1
end if

print(myint)
```
No space left on deviceで、Volume増やしたけど、growpartコマンドすら実行できない状況を解決(docker containerを削除した)

# 問題

とりあえずおなじみの `no space left on device`のエラー


```
df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/xvda1      7.7G  7.7G     0 100% /
...
```

普通にググると、Volume増やして、`sudo growpart /dev/xvda 1`とかすればいけるとかいてあるが、問題は、満パン過ぎて、/tmp以下にファイルをかけず、growpartコマンドすら聞かず、spaceを増やせない。

```
growpart /dev/xvda 1
mkdir: cannot create directory '/tmp/growpart.1959': No space left on device
FAILED: failed to make temp dir
```

AWSのInstance自体を再起動してもだめ。


# 解決方法: やっぱりファイルを消すしか無い


```
 sudo du -x -h / | sort -r -h | head -40
```
これで一番でかいやつから見ていくと、`/var/lib/docker/container`の中身がでかすぎるので削除することに決定。dockerサービスすら立ち上がらないので。

とりあえずでかいcontainersを削除
```
 sudo rm -rf /var/lib/docker/containers/<hash値>
```

この時点でほぼ解決

```
df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/xvda1      7.7G  3.2G  4.5G  42% /
...
```

これで拡張できるようになったので、以下を実行

```
sudo growpart /dev/xvda 1
sudo resize2fs /dev/xvda1
```

これで解決！

```
df -h
Filesystem      Size  Used Avail Use% Mounted on
...
/dev/xvda1      9.7G  3.2G  6.5G  34% /
...
```
Linuxのbashプロンプトを変更

## 概要
AWSでlinuxにログインしたら、プロンプトがシンプルだったので変更してみたとりあえずメモっておく。

## 変更方法
下記コマンドを実行。

```
$ cd ~/
$ echo "export PS1='\[\e[1;32m\]\u@\h:\w${text}$\[\e[m\] '" >> .bash_profile
```

以上。
HTML復習

#HTMLの復習
HTMLの復習をして、覚えていなかった所をアウトプットするための記事です。

**・「リスト」**
基本的には2種類のリストが存在する。

①点型(・)
②数字型(1)



```
➀
<ul>
<li>怪物</li>
<li>ドラゴン</li>
<li>孫さん</li>
</ul>
```
```
・怪物
・ドラゴン
・孫さん
```
___
```
➁
<ol>
<li>ハリケーン</li>
<li>風邪</li>
<li>マイクロソフト</li>
</ol>
```
```
1.ハリケーン
2.風邪
3.マイクロソフト
```

**・「表」**
表を作る時に用いるコード

➀見出しセル➡`<th></th>`
➁データセル➡`<td></td>`
➂表の行　　➡`<tr></tr>`

```
<table>
<tr>
<th>見出し</th>
</tr>
<tr>
<td>データ</td>
</tr>
<tr>
<td>データ</td>
</tr>
</table>
```

**・「余白」**
余白は大きく2つあります。
非常にややこしいです。
基本的にHTMLでは、文字の周囲に「見えない枠」があります。
その枠を基準にして余白を作っていきます。


➀基準の枠の外側の余白➡margin
➁基準の枠の内側の余白➡padding


```
➀
h2{ margin-top: 20px}→枠の外の上側に20px
h2{ margin-right: 20px}→枠の外の左側に20px
h2{ margin: 20px} →枠の外の全ての方向に20px
```
___
```
➁
h2{ padding-top: 20px}→枠の内の上側に20px
h2{ padding-right: 20px}→枠の内の左側に20px
h2{ padding: 20px} →枠の内の全ての方向に20px
```
【node.js】...  ○○ more itemsと溢れた配列を全て表示する

データが大量にpushされている配列を確認するため

```javascript
console.log(arr);
```

とすると

```
$ node arr.js 
: // 125個データを表示
:
{name: hoge},
... 25 more items ]
```
と100個までしか表示されず、溢れた分が確認できません。

## 解決策

```javascript
const util = require('util');
console.log(util.inspect(arr, { maxArrayLength: null }));
```

とすると全てのデータが表示されるようになります。
macbookちょっと便利機能

# 更新
自分用のメモとしても常に更新していきます。

## 微調整
option + shiftを押して輝度・音量を調整することで1メモリの1/4ずつの調整が可能。

```
option + shift + 🔅
option + shift + 🔉
```

こんな感じ。
![スクリーンショット 2018-08-06 12.59.16.png](https://qiita-image-store.s3.amazonaws.com/0/251763/a1ec25d7-301c-7237-e986-7d1c4eb9cbf1.png)


## 矢印の入力
日本語入力中に、
- `z+h` = ←
- `z+j` = ↓
- `z+k` = ↑
- `z+l` = →
で矢印を入力できる。

## Dockアイコン一時拡大
普段はDockアイコンにカーソルを合わせても拡大しない設定だけど一時的に拡大したいとき、

```
control + shift
```

でアイコン拡大が可能。

## 画像の出力形式を増やす
Macアプリのプレビューから画像を任意の形式で保存するときに通常だと以下の形式。
![normal.png](https://qiita-image-store.s3.amazonaws.com/0/251763/2ccb8a55-9b6c-2094-ab24-8822fe300deb.png)

optionを押しながらフォーマットを選択すると増加します。
![option.png](https://qiita-image-store.s3.amazonaws.com/0/251763/7f570624-2ae3-73f5-2d5c-2bcf23380e60.png)

## サブディスプレイの解像度を増やす
Macに外部ディスプレイを接続しているとき、環境設定の解像度の数が通常だと少ない。
![display_normal.png](https://qiita-image-store.s3.amazonaws.com/0/251763/a60bc956-312a-6e50-40e2-b93304ae831b.png)

そこで`option`を押した状態で変更ラジオボタンを押すと解像度リストが増える。
![display_option.png](https://qiita-image-store.s3.amazonaws.com/0/251763/ae5d7d2a-4aea-28bb-7ec4-d5b551bfa289.png)

リスト全体はこんな感じ。
![display_list_option.png](https://qiita-image-store.s3.amazonaws.com/0/251763/a9a9e8eb-409d-cd15-d7f4-33fb652931ec.png)



## Appleロゴマークの入力
リンゴマーク文字の入力を、

```
option + shift + k
```

でいつでも行なうことができる。




## 隠しファイル/ディレクトリをFinderで表示
Finderで目的のディレクトリを開いた状態で、

```
command + shift + .
```

で表示する。
もう一度やれば隠す。

## マウスカーソルを見つける
カーソルを見失ったとき、シェイクすることでカーソルが大きくなり見つけることができる。
(OS X El Capitan以降)

設定方法は、システム環境設定→アクセシビリティ
![system_env_setting.png](https://qiita-image-store.s3.amazonaws.com/0/251763/2ea2264a-e208-c2e6-30db-de43e7c7d5a2.png)
→ディスプレイから「マウスポインタをシェイクして見つける」のチェックを入れる
![ac.png](https://qiita-image-store.s3.amazonaws.com/0/251763/38840b73-bf13-6ebf-9465-98fe1927fe30.png)
基本HTML


#基本
- head-文章の情報
- body-文章
- <>始まり、</>終わり
- tabで下げる
- !DOCTYP html は必ず入れる　
- lang=""言語を表す

##head
- titleは上に出るやつ
- meta charsetは文字コードの指定　ex)utf8
 - 文字化けしているときはここが間違っている可能性あり
 - 全角空白要注意
- meta name と　meta content
    - 検索結果に表示されたりする
- ホームページのアイコン
    - link rel shortcut icon, href favicon.ico
- コメント
    - <!--コメント-->
    - 動作に影響しない

#body
- グローバル要素
    - id　1つしかない要素
    - classs　複数ある要素
    - style　スタイルを決定する要素
    - header
    - footer
    - nav　ナビゲーション
    - article　独立しているコンテンツ
    - aside　副次的なコンテンツ
    - section それ以外の情報の塊。見出しあり
    - h1-h6　sectionの見出し
    
    アウトラインを意識することが大切

- sectionよりも細い要素
    - p　パラグラフ
    - hr　水平線　区切りのライン
    - pre　改行・字下げの保持
    - blockquote　引用
    - div　スタイリング

- リスト
    - ol 順序あるリスト
    - ul　箇条書きリスト
    - li　リストのアイテム
    - dl　定義づけリスト
    - dt　定義の用語
    - dd　定義の内容
Drawing the koch snowflake given n with python

```python
import math
import numpy as np
import matplotlib.pyplot as plt
import sys

n = int(sys.argv[1])

def getp(p1,p2):
    z=complex(p2[0]-p1[0],p2[1]-p1[1])
    zr=complex(1/2,-3**(1/2)/2)
    z=z*zr
    p=[z.real+p1[0],z.imag+p1[1]]
    return p

ir=10
ip1=[0,0]
ip2=[ir,0]
ip3=[ir/2,ir/2*(3**(1/2))]
def gps(n):
    if n==0:
        return [ip1,ip2,ip3]
    else:
        points=gps(n-1)
        points.append(ip1)
        i=0 
        ls=[]
        #print(points)
        while(1):
            p1=points[i]
            p2=points[i+1]
            p11=[p1[0]+(p2[0]-p1[0])/3,p1[1]+(p2[1]-p1[1])/3]
            p12=[p1[0]+(p2[0]-p1[0])/3*2,p1[1]+(p2[1]-p1[1])/3*2]
            p=getp(p11,p12)
            ls.append(p1)
            ls.append(p11)
            ls.append(p)
            ls.append(p12)
            i=i+1
            if len(points)-1<i+1:
                break
        return ls

ps = gps(n)
print(ps)
ll = []
for p in ps: 
    ll.append(p[0])
ll.append(ps[0][0])
hl = []
for p in ps: 
    hl.append(p[1])
hl.append(ps[0][1])

left = np.array(ll)
height = np.array(hl)
plt.plot(left, height)
plt.show()
```
* n=5 <img width="636" alt="スクリーンショット 2018-08-06 10.50.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/147303/c896335d-f462-dc58-d2b3-298184ceba3b.png">

<!-- I think that it's nearly impossible to solve such problem within two hours and thirty minutes for the first time... -->
# Refs.
* [plt.show](https://pythondatascience.plavox.info/matplotlib/%E6%8A%98%E3%82%8C%E7%B7%9A%E3%82%B0%E3%83%A9%E3%83%95)
CreateJS: EaselJSのnextStageプロパティでマウスイベントを複数のStageに送る

CreateJS Blogに2018年8月3日付で「[Multiple Stages in EaselJS using nextStage](http://blog.createjs.com/multiple-stages-in-easeljs-using-nextstage/)」が公開されました。CreateJSのコツやヒントを伝える目的で書かれた記事のひとつです。本稿は、その解説にもとづいて内容をご紹介します。

EaselJSではパフォーマンスを上げるために、複数の`Stage`はレイヤーにしています。そして、変更が加わえられた`Stage`インスタンスのコンテンツだけを更新するのです。たとえば、背景が複雑なシーンとインタラクティブな要素やユーザーインタフェースをもち、その上に重ねられた前景のシーンには動きの多いスプライトのアニメーションがあるかもしれません。`Stage`をレイヤー化することにより、込み入ったコンテンツの描画も最小限に抑えられるのです。

けれど、ふたつの`Stage`、場合によっては背景だけでも、インタラクティブ性があると問題が起こります。HTMLのDOM要素へのマウス操作は、その境界矩形のうしろの要素に対するインタラクションを阻みます。CSSの[`pointer-events`](https://developer.mozilla.org/docs/Web/CSS/pointer-events)は、マウスイベントの[`target`](https://developer.mozilla.org/docs/Web/API/Event/target)になるかどうかを要素ごとに定めるプロパティです(現在は[広くサポート](https://caniuse.com/#feat=pointer-events)されています)。けれど、EaselJSでは、コンテンツを`Canvas`というひとつの矩形要素に描きます。そのため、マウスイベントは、DOM要素の上位で条件にもとづいて扱わなければならないのです。


# nextStageプロパティ
複数の`Stage`の間でマウスイベントを扱えるように備わっているのが[`Stage.nexStage`プロパティ](https://createjs.com/docs/easeljs/classes/Stage.html#property_nextStage)です。EaselJS 0.7に加えられ、8.0でさらに強化されました。現行の`Stage`で扱われなかったすべてのマウスイベントを、プロパティに定めたつぎの`Stage`に送るのです。

`Stage.nexStage`プロパティの使い方は簡単で、複数の`Stage`をレイヤー化してコンテンツがつくれます。

```js
var stage1 = new createjs.Stage(“topCanvas”);
var stage2 = new createjs.Stage(“bottomCanvas”);
stage1.nextStage = stage2;
```

最前面の`canvas`はDOM要素の上位になります。DOMのイベントを先に受け取り、必要に応じてつぎの`canvas`に送ります。そして、EaselJSはマウスイベントを`DisplayObject`に順に渡していくのです。さらに、`mouseenter`や`mouseleave`といったイベントがうしろの`Stage`で受け取るれようにもできます(図001)。

#### 図001■Stage.nexStageプロパティを使った例
[![Stage.nexStageプロパティ](http://img.youtube.com/vi/AZrHKXMdkY8/0.jpg)](https://www.youtube.com/watch?time_continue=1&v=AZrHKXMdkY8)
[\>> YouTube動画へ](https://www.youtube.com/watch?time_continue=1&v=AZrHKXMdkY8)


# デモとコード例
ふたつの`Stage`を使ったデモは、CodePenの「[NextStage](https://codepen.io/createjs/pen/PQOMRb/)」に公開されています。また、GitHubの[`EaselJS/examples/`](https://github.com/CreateJS/EaselJS/tree/master/examples)にはコード例が[`TwoStages.html`](https://github.com/CreateJS/EaselJS/blob/master/examples/TwoStages.html)として上がっています。さらに、[`StageGL`](http://www.fumiononaka.com/Business/html5/FN1704008.html)にもイベントが渡せます。`StageGL`はWebGLで高速化されたステージです。`EaselJS/examples/WebGL`に同じくコード例[`TwoStages.html`](https://github.com/CreateJS/EaselJS/blob/master/examples/WebGL/TwoStages.html)があります。`StageGL`に加えて、[`mouseChildren`](https://createjs.com/docs/easeljs/classes/Container.html#property_mouseChildren)や[`mouseEnabled`](https://createjs.com/docs/easeljs/classes/DisplayObject.html#property_mouseEnabled)などのパフォーマンス向上の技術を組み合わせれば、HTML5アプリケーションやWebコンテンツがさらに最適化できるでしょう。
Unity 通信状態の取得


■参考URL
https://msdn.microsoft.com/ja-jp/library/system.net.dns.gethostaddressesasync(v=vs.110).aspx
https://forum.unity.com/threads/use-dns-addresses-for-networking.199304/

■呼び元処理

```
    /// <summary>
    /// Pingによる応答時間の取得
    /// </summary>
    public async void OnClickGetPingTime()
    {
        int pingTime = await PingStatus.GetPingTime();
    }
```

■呼び先処理（PINGにより応答時間取得）

```
    /// <summary>
    /// 通信状態の取得クラス
    /// </summary>
    public static class PingStatus
    {
        /// <summary>
        /// PING応答時間の取得
        /// </summary>
        /// <returns>PING応答時間（msec）</returns>
        public static async Task<int> GetPingTime()
        {
            // "/"を省いたホスト名にする事
            string host = "";

            // ホスト名からIPアドレスを非同期で取得
            IPAddress[] serverIPs = await Dns.GetHostAddressesAsync(host);

            // コンストラクタが走った時点でPING送信される
            Ping ping = new Ping(serverIPs[0].ToString());

            await new WaitUntil(() => ping.isDone == true);

            return ping.time;
        }
    }
```
[centOS7] Chrome headlessモードのSSでブランクページになってしまう件

結論: Firefoxのヘッドレスモードを利用しました。

解決した環境

| App Name       |    version   |
|:-----------------|:------------------|
| Mozilla Firefox |  61.0 |
| geckodriver | 0.21.0 |
| Python | 3.6.5 |
| selenium | 3.13.0 |
 

現象が発生したバージョン

| App Name       |    version   |
|:-----------------|:------------------|
| Google Chrome |  68.0.3440.84 |
| ChromeDriver | 2.40.565383 |
| Python | 3.6.5 |
| selenium | 3.13.0 |


**発生した症状**
driver.page_source.encode('utf-8')
これを実行すると

```
<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
```

こうなった。

いろいろ調査していたら、どうもSSLの証明書がうまく認証できてない感じ。
ただ、今回調査元がGeo Trast発行のもので、例のSymantec問題ではなかったので、
それじゃないっぽい。

で、なんとか解決方法がないか調べてみたのだけども解決できず、しょうがないので、Firefoxでいけるかとりあえず試してみようと思って試した結果、うまく行ったので、今後にたようなことが起きると、また調べることになりそうだったので、ここにメモ。

## 導入手順

**Firefoxのインストールは**

wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/61.0/linux-x86_64/ja/firefox-61.0.tar.bz2

wget  https://github.com/mozilla/geckodriver/releases/download/v0.21.0/geckodriver-v0.21.0-linux64.tar.gz

tar zxvf geckodriver-v0.21.0-linux64.tar.gz 
tar xjf firefox-61.0.tar.bz2 

mv firefox /usr/local/
ln -s /usr/local/firefox/firefox /usr/bin/

mv geckodriver /usr/bin/

yum install xorg-X11-server-Xvfb Xvfb


```..bash_profile
Xvfb -ac :99 -screen 0 1280x1024x16 &
export DISPLAY=:99
```
仮想ディスプレイを自動起動しておく。

以上で多分正常に動くはず。
composer.jsonに"vendor/package": "dev-master as 1.1.1"のように書くと、バージョンを詐称できて便利だった。

ComposerはPHPのパッケージ間のバージョンの互換性をしっかり管理してくれて、互換性に問題があれば報告してくれる。普段はありがたい安全装置だが、例えば次のような場面では不自由がある。

* パッケージ`foo/bar`は、`4.6.3`までリリースされている。
* `foo/bar`の`dev-master`にどうしても使いたい機能がある！
* 別バッケージ`hoge/fuga`は`foo/bar`に依存しており、バージョンは4.6系を必要としている。

そのため、`foo/bar`の`dev-master`をインストールしようとすると、互換性の問題が報告されインストールできない:

```shell-session
$ composer require foo/bar=dev-master # 4.6.3からdev-masterにアップグレードしたい
  Problem 1
    - hoge/fuga 3.4 requires foo/bar ~4.6 -> satisfiable by foo/bar[4.6.0, 4.6.1, 4.6.2, 4.6.3] but these conflict with your requirements or minimum-stability.
    - hoge/fuga 3.4 requires foo/bar ~4.6 -> satisfiable by foo/bar[4.6.0, 4.6.1, 4.6.2, 4.6.3] but these conflict with your requirements or minimum-stability.
    - hoge/fuga 3.4 requires foo/bar ~4.6 -> satisfiable by foo/bar[4.6.0, 4.6.1, 4.6.2, 4.6.3] but these conflict with your requirements or minimum-stability.
    - Installation request for hoge/fuga ^3.4 -> satisfiable by hoge/fuga[3.4].
```

本来なら、互換が表明されていないバージョンを無理くり入れるのはリスクがあるので避けるべきだ。しかし、`hoge/fuga`は`foo/bar`の`dev-master`と事実上互換していることが明らかな場合はそのリスクがない。

以上のように、バージョンの互換性問題の報告を無視してでも、dev-masterを入れたいときには、`"foo/bar": "dev-master as 4.6.4"`のように書くと良い。これは、`dev-master`に独自でバージョン「4.6.4」をつけるということだ。

```json
{
  "require": {
    ...
    "foo/bar": "dev-master as 4.6.4",
    ...
  },
...
```

これで、`foo/bar`のバージョンは、`4.6.4`に詐称できるため、`4.6.x`に依存するライブラリとの互換性の問題は報告されなくなる。

なお、次のようにdev-masterのコミットハッシュを指定することもできる。

```json
{
  "require": {
    ...
    "foo/bar": "dev-master#a1b2c3d as 4.6.4",
    ...
  },
...
```

## 所感

<blockquote class="twitter-tweet" data-cards="hidden" data-lang="ja"><p lang="ja" dir="ltr">またニッチなノウハウがひとつ増えた。composer.jsonに&quot;vendor/package&quot;: &quot;dev-master as 1.1.1&quot;のように書くと、バージョンを詐称できて便利だった。 - Qiita <a href="https://t.co/yR3y9Abxuc">https://t.co/yR3y9Abxuc</a></p>&mdash; ❄️suin (@suin) <a href="https://twitter.com/suin/status/1026279883905949698?ref_src=twsrc%5Etfw">2018年8月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
gaussian_kl_divergenceメモ


chainer.functions.loss.vae.gaussian_kl_divergenceの使い方メモ
引数に多変量正規分布の平均ベクトルと対数共分散行列をとり, 出力結果として
引数のパラメータをもつ多変量正規分布と多変量標準正規分布とのKL-divergenceの値を
返してくれる.

VAEのコードを書く際に, 潜在分布と標準正規分布のKL-divergenceを最小化する
条件を書くと思うのでこいつを用いるとサラッとかけたりする. 
下記の通り, 引数として用いる分散は対数を取ったものであることに注意. 

```python
from chainer.functions.loss.vae import gaussian_kl_divergence

mu = np.array([0.0, 0.0])
ln_var = np.array([[0.0, 0.0], [0.0, 0.0]])

gaussian_kl_divergence(mu, ln_var)
```

```bash
variable(0.)
```
IntelliJのLive TemplatesでReactの開発を楽にする

[Live Templates - Help | WebStorm](https://www.jetbrains.com/help/webstorm/using-live-templates.html)

IntelliJを普段メインで使って開発をしています。全然機能を使いこなせていないけど・・・
というか機能ありすぎて覚えるのも結構大変だったりします。んで、ちょっと手が空いた時とかに「ほー！こんな機能あるのか」と発見があって一人テンション上がっていたりもします笑

んで、今回は普段Reactで開発するときに使っているIntelliJのLive Templatesを晒します。

## Live Templatesとは

簡単にいうとIntelliJのスニペット機能です。

preferences > Editor > Live Templates

既存ですでにたくさんのスニペットが用意されていて覚えて使いこなせるとコーディングがグッと楽になります。

今回はReactで開発を前提にお話です。React以外にも便利なLive Templatesがあるのでチェックしてみてください。


### 既存のLive Templates ライフサイクル系
この辺は全て網羅されていそうです。これ覚えておくだけですごい便利！

`cdup`と打ったら`Tabキー`

``` jsx
componentDidMount() {
    // カーソル位置
}
```

他にも、`cdm`(componentDidMount)、`cwm`(componentWillMount)やらあります。使い方も一緒だし、なんとなくわかりやすいネーミングになってるので覚えやすいですね。


## こんなスニペットが欲しい
既存でもComponent作成時のスニペットは用意されているんですけど、自分の開発の要件とあってなかったります。

- Classで作るときは基本的にはReduxとコネクトする
- Classの場合はconstructor欲しい
- Stateless Componentも欲しい
- それぞれTypeSriptのバージョンも欲しい

### オリジナルのLive Templatesの作り方

preferences > Editor > Live Templates

言語一覧が出ているので言語を選択、今回はReactを選びます。

![live-templates.jpg](https://qiita-image-store.s3.amazonaws.com/0/47844/c97e163e-0ff5-9c79-8d5a-08f6973b1fed.jpeg)

画面右側`+`ボタン > Live Template

Abbreviationに`cdu`などのコードを、Descriptionに説明文をそれぞれ入力します。

Template textにコードを入力します。

最後にDefineをクリックして、使う言語を選択します。多分、入力補助とかで出てくるようにかなと勝手に思ってます。

### Class Component with Redux

Abbreviation: `rccx`

Template text

``` jsx
import { bindActionCreators } from 'redux'
import React, { Component } from 'react'
import { connect } from 'react-redux'

class $TM_FILENAME_BASE$ extends Component {
  constructor(props) {
    super(props)
  }
  
 render() {
  return (
   <div>
    $END$
   </div>
  );
 }
}

function mapStateToProps(state) {
  return {}
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators(Object.assign({}, {}), dispatch)
}

export default connect(mapStateToProps, mapDispatchToProps)($TM_FILENAME_BASE$)
```

### Class Component with Redux (TypeScript)

Abbreviation: `rccxts`

Template text

``` jsx
import * as React from 'react'
import * as Redux from 'redux'
import { connect } from 'react-redux'

interface Props {}

class $TM_FILENAME_BASE$ extends React.Component<Props, {}> {
  constructor(props) {
    super(props)
  }
  
 render() {
  return (
   <div>
    $END$
   </div>
  );
 }
}

const mapStateToProps = state => {
  return {}
}

const mapDispatchToProps = dispatch => {
  return Redux.bindActionCreators({}, dispatch)
}

export default connect(mapStateToProps, mapDispatchToProps)($TM_FILENAME_BASE$)

```

### Stateless Component

これは既存であります。Intelli J 2018.2からかな。

Abbreviation: `rsc`

Template text

``` jsx
import React from 'react';

const $componentName$ = () => {
    return (
        <div>
            $END$
        </div>
    );
};

export default $componentName$;

```

### Stateless Component (TypeScript)

Abbreviation: `rscts`

Template text

``` jsx
import * as React from 'react'

interface Props {}

const $componentName$: React.SFC<Props> = () => {
    return (
        <div>
            $END$
        </div>
    );
};

export default $componentName$;
```

またなんかTemplate作ったら追記予定
【Lumen(Laravel)】Lumenでメールを送信するのにあえてPHPMailerを使用する


# Lumenでメールを送信したい

そもそもLumenはメールを送信するような作りになっていないみたいなので、
ちょっと手間がかかりますがちゃんと手順を踏めばLaravelのごとくメールを送信することができるみたいです。

以下参考するべきページです
[Lumenでメールを送る │ M0DE](https://www.m0de.ml/c0d3man/posts/zia4vsrbav1f365nd7yi)
[Lumen、いろいろハマるところ - Qiita](https://qiita.com/yyano/items/57735763bec54e8ac8ee#%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E3%82%8A%E3%81%9F%E3%81%84)
[laravel - Lumen 5.3 send email - Stack Overflow](https://stackoverflow.com/questions/40728207/lumen-5-3-send-email)

# しかしうまくいかないので[PHPMailer](https://github.com/PHPMailer/PHPMailer)を使用する

ググるといろんな記事が出てくるんですが、どの記事通りにしてもうまくいかなかったので、
もうあきらめて[PHPMailer](https://github.com/PHPMailer/PHPMailer)を使ってメールを送信することにします。

# インストール
Composerからインストール

```
composer require phpmailer/phpmailer
```

# コード

一応環境変数にメールの設定を書くようにしています。

```php
use PHPMailer\PHPMailer;

// ～～ 略 ～～

    /**
     * メールを送信する
     *
     * @param string $subject メールタイトル
     * @param string $body    メール本文
     * @return void
     */
    public function sendMail(string $subject, string $body)
    {
        $mail = new PHPMailer\PHPMailer();

        $mail->isSMTP(); 
        // $mail->SMTPDebug  = 1;
        $mail->SMTPAuth   = true;
        $mail->Host       = env('MAIL_HOST');       // メインのSMTPサーバーを指定する
        $mail->Port       = env('MAIL_PORT');       // 接続するTCPポート
        $mail->Username   = env('MAIL_USERNAME');   // SMTPユーザー名
        $mail->Password   = env('MAIL_PASSWORD');   // SMTPパスワード
        $mail->SMTPSecure = env('MAIL_ENCRYPTION'); // TLS暗号化


        // メール内容設定
        $mail->CharSet  = "UTF-8";
        $mail->Encoding = "base64";
        //FROM用メールアドレスと宛先名
        $mail->setFrom(env('MAIL_FROM_ADDRESS'), env('MAIL_FROM_NAME'));
        // TO用メールアドレスと宛先名
        $mail->addAddress(env('MAIL_TO_ADDRESS'), env('MAIL_TO_NAME'));
        // CC用メールアドレスと宛先名
        $mail->addCC(env('MAIL_CC_01_ADDRESS'), env('MAIL_CC_01_NAME'));
        $mail->addCC(env('MAIL_CC_02_ADDRESS'), env('MAIL_CC_02_NAME'));
        $mail->Subject = $subject;
        // HTMLフォーマットの有効
        //$mail->isHTML(true);
        $mail->Body = $body;

        if ($mail->send() === false) {
            echo "Mail sending failed!! Mailer Error: {$mail->ErrorInfo}"
        }
    }
```



```.env.example
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=System@example.com
MAIL_FROM_NAME=System
MAIL_TO_ADDRESS=
MAIL_TO_NAME=
MAIL_CC_01_ADDRESS=
MAIL_CC_01_NAME=
MAIL_CC_02_ADDRESS=
MAIL_CC_02_NAME=
```

# おわり
- Lumenは削りすぎてややこしや

# 参考
https://its-office.jp/blog/php/2017/05/28/phpmailer.html
http://blog.takuya-andou.com/entry/2015/12/17/221917
six.moves.rangeメモ

six.moves.range()についてのメモ

以下の３文はすべて同じ意味. 

```python
# python3
for i in range(10):
```

```python
# python2
for i in xrange(10):
```

```python
# sixモジュール使用
import six
for i in six.moves.range(10):
```
Cloud AutoML Visionを使ってみた(使ってみただけ)

機械学習の知識をあまりもたないエンジニアでも使えるMLというふれこみのGoogle Cloud AutoML。
まさに私にぴったり、ということで使ってみました。
結論から言いますと使ってみただけで、活用には程遠いのですがご参考まで。


## 準備
まずはGoogle Cloud Consoleにアクセス。
https://console.cloud.google.com

まだであれば支払いを有効にしてメニューの一番下にある人工知能カテゴリのVISIONを選択します。
これがAutoML Visionです。

![automl1.png](https://qiita-image-store.s3.amazonaws.com/0/74328/6dca0636-d5ee-6396-b560-6203006e245f.png)



シンプルイズベストなページですね。
AWSならチュートリアルに導かれるところですが、あれはチュートリアルと普段の操作で違いがあるという問題もあるので甲乙つけがたいところです。個人的にはこのシンプルさが好きです。


## 学習データをアップロードする

はい。機械学習っぽくなってまいりました。
画像ファイルを追加するために、上の方にある **+NEW DATASET** をクリックします。

![create_dataset.png](https://qiita-image-store.s3.amazonaws.com/0/74328/4dd22f68-ed2c-3dc7-e34e-a6e459b8b83a.png)



学習に必要なデータセットを作成する方法として、zipで固めてあげる、Cloud Storageに上げたデータと紐付いたcsvをあげる方法があるようです。
ここでは、zipで固めて上げてみます。

注意として、**最低でも２ラベル分の画像を含める必要がある**ようです。
この辺なぜなのか機械学習に疎い私にはよくわかりません。
わかりませんが、趣味の自転車の画像をあげてみます。


![A1.png](https://qiita-image-store.s3.amazonaws.com/0/74328/f89017a7-1bc2-70d2-5158-e948c2b4e959.png)



zipの中身はこんな感じです。

```sh
data/
 + orca/        -- ラベルになる
    + image1.jpg 
    + image2.jpg 
    + image3.jpg 
    .
    .
 + qelite/      -- ラベルになる
    + image1.jpg 
    + image2.jpg 
    + image3.jpg 
    .
    .
```

画像が格納されるディレクトリ名がラベルとして使用されるということで、ラベルごとに画像を別けて格納します。
ちなみにorcaは現在の愛車。qeliteは事故で廃車となった過去の愛車です。南無。


## 学習する
アップロード後、ボタンをポチポチと押していくと学習が開始されます。

![train_start2.png](https://qiita-image-store.s3.amazonaws.com/0/74328/95724165-7232-40a6-751a-536a85e0d31b.png)


コストに関して怖い感じのメッセージが表示されますが、100枚程度の画像なら15分くらいで終了する印象。
無料枠の範囲内です。（多分）

![training.png](https://qiita-image-store.s3.amazonaws.com/0/74328/83fdbda8-7b65-fe38-e5f3-fbec816e6172.png)


しばらく腹筋していると完了します。



## テストする
学習したモデルをその場でテストできる！

![evaluate.png](https://qiita-image-store.s3.amazonaws.com/0/74328/6f41f36b-d4c5-eff8-aed0-384b0bed5081.png)




という嬉しい機能までついております。
上部タブのPREDICTから実行できます。

今回はラベルごとに20枚程度と学習に用いたデータが少なすぎるためか、実用的な精度は出ていない感じですが、操作の簡単さ、APIでの呼び出しやすさなど、十分に将来性を感じました。

BigQueryで機械学習できるBQMLなんかもでてきてますし、どんどんMLが身近になってきていますね！
ST_Simplify時のM値の保存

PostGIS 2.1、SpatiaLite 4.3.0aで確認。

M値を持つ`LINESTRING M`ジオメトリを`ST_Simplify`関数で簡略化した際、PostGISとSpatiaLiteで下記のように結果のM値に違いがあった。

* PostGISでは簡略化後の頂点は、簡略化前のM値を持つ。
* SpatiaLiteでは簡略化後の頂点のM値はゼロとなる。

```sql
SELECT
	ST_AsText(
		ST_Simplify(t.line, 0.5)
	) AS simplified
FROM
	(
		SELECT
			ST_GeomFromText(
				'LINESTRING M(0 0 1, 0 0.5 2, 1 0.5 3, 1 1 4)',
				0
			) AS line
	) AS t
;

-- PostGISでの実行結果
-- LINESTRING M (0 0 1,1 1 4)

-- SpatiaLiteでの実行結果
-- LINESTRING M(0 0 0, 1 1 0)
```
(ETロボコン)走行体が倒立してくれないなぁー>呼び出し時間が問題でした。（多分）

#本記事について
ETロボコンとは、組込みソフトウェアプログラミング教育を目的としたロボコンのことである。
スタートからゴールまでのタイム ＋ 難所クリアなどのボーナスタイムの合計と、ソフトウェアの内容を説明するモデルの完成度によって競われる。

本記事では、ETロボコンに挑戦する筆者が開発をする中でぶち当たった一つの問題と、その解決方法を書いていく。

#開発環境
 - MacOS High Sierra
 - C++

#今回起きた問題
###状態
走行体が倒立時に問答無用ですぐに倒れる。

###問題が発生した状況
運営本部から実装をお願いされていた、走行体が転倒した際にモーターの回転を停止する関数の実装中だった。この関数を使用すると走行体の倒立が不安定になり、この関数をコメント化して挙動を見ると、倒立が安定した。

#想定される問題について考えたことと、解決策実施の結果
##論理エラー
まずはプログラム自体に問題がないかをチェックしていった。
問題はなかった。

##実行時エラー
####メモリリーク
次に走行体が倒立できない原因として考えたのは、メモリリークだった。
恥ずかしながら司令塔の役割を果たすapp.cppから、ev3apiのモーターやセンサーのポインタを利用して、他クラスで利用するev3api関連を初期化していなかったので、メモリを喰っているのは間違いなかった。走行中にメモリ量が足りなくなってしまったのではないか、というわけだ。
しかし、変更点が多くなりすぎるので、これは最後に確かめることにした。

####呼び出し時間
最後に考えたのは呼び出し時間だ。
走行体は４ミリ秒ごとに倒立に関係する関数を呼ぶことによって倒立を維持している。４ミリ秒経つまでにプログラムを最後まで処理しきれていないければ、倒立が維持できないはずである。
浅学ながらインライン関数を使えば呼び出し時間を短縮できると考え、倒立に関係する関数をインライン化していった。しかし、効果はなかった。

また、今年のプログラムにはAPIを柔軟に、後からでも楽に拡張するために、あらかじめMotorならMotorを継承したMotor_expandというように、API拡張クラスをAPIとそれを利用するクラスの間に挟んでいた。
継承という形だったので、呼び出し時間に影響はないと勝手に思っていたが、この拡張クラスを抜くと、無事に倒立できるようになった。


#解決して
考えてみると、継承したクラスは親クラスのメンバおよびメンバ関数を持っているとはいえ、書いてある場所は別だから呼び出しには結局時間がかかるのかもしれない……などと思った。検証はしてない。しなければとは思うが、してない。したら載せようと思う。

でも、もしわかる方いたら教えてください。
[chainer] F.hstackメモ

行列同士を列方向で連結する
chainer.functions.hstackの使い方メモ

```python
import chainer
import chainer.functions as F
import numpy as np


hoge = np.array([i for i in range(9)]).reshape(3,3)

"""
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
(3, 3)
"""
hogehoge = np.array([i*i for i in range(9)]).reshape(3,3)

"""
array([[ 0,  1,  4],
       [ 9, 16, 25],
       [36, 49, 64]])
(3, 3)
"""
hogehogehoge = F.hstack((hoge, hogehoge))

"""
variable([[ 0  1  2  0  1  4]
          [ 3  4  5  9 16 25]
          [ 6  7  8 36 49 64]])
(3, 6)
"""
QiitaのAPIをアクセストークン付きで使用すると、通常のitem検索でも限定共有記事が検出される

**されます！**

いつものようにザル調べではこのあたりの情報が見つからず、うっかりトークンを使った機能を公開しようとしていたので危なかったです。

[Qiita APIのGET /api/v1/users/:user_id/items を GET /api/v2/itemsに移行する - Qiita](https://qiita.com/yimajo/items/52f7deca58a795a509fb)

>## access_tokenを利用した際に限定共有を取得しないで済むか
>
`GET /api/v2/items`で利用制限をゆるくしたいためaccess_tokenを使いたいが限定共有記事を取得したくないのでcURLで試した（`GET /api/v1/users/#{qiita_id}/items`では限定共有記事を取得していた）
>
```bash
curl -X GET https://qiita.com/api/v2/items -d '{"per_page":"10", "query":"qiita user:yimajo"}' -H "Content-Type: application/json" -H ‘Authorization: Bearer ここがトークン‘
```
>
- 想定してた自分の記事が取得できた

この記事からは**/api/v2/itemsでは限定共有記事を取得しない**と読み取れますが、実際は**します**。

```bash
 curl -X GET https://qiita.com/api/v2/items -d '{"per_page":"10", "query":"title:fish user:khsk"}' -H "Content-Type: application/json" -H 'Authorization: Bearer ここがトークン' | jq '[.[].private]'
```

私はタイトルに`fish`を含む限定共有記事を一つ作成しています。
その他に公開記事としても`fish`を含む記事を複数投稿しています。
このコマンドの出力結果は

```
[
  false,
  true,
  false,
  false,
  false,
  false,
  false
]
```

でした。

`jq '[.[].title]'`
では

```
[
  "fishでファイルを連番つきコピーで複製する。にはforループ",
  "fish shell設定スクリプト",
  "fishのfunctionをpecoで選択",
  "fishは一文字の改行なし出力をプロンプトで消してしまう",
  "fishでlistのindexを確認するtestにはcontainsが使える",
  "fishでnode.jsで言うところのnpmみたいなところのFisheryはもうない",
  "CentOS7でfishを入れると競合でDockerをインストールできない。解消はDocker1.10"
]
```

[`fish shell設定スクリプト`なんて記事は公開していないので、この記事は限定共有記事です。](https://qiita.com/search?q=user%3Akhsk+title%3Afish)

トークンはあくまで個人用アクセストークンと銘打たれていますし、他の類似サービスでの扱いはよくわからないのですが…
ちょっと齟齬がありそうな既存の記事があることと、
[`/api/v2/authenticated_user/items`](https://qiita.com/api/v2/docs#get-apiv2authenticated_useritems)
という、**限定共有記事を取得するならこちらだろう**と誤解しそうなAPIがあるため、注意が必要です。

なお、`private:false`Queryおよび`private:false`パラメーターが働いていることは確認できませんでした。

今はユーザー入力から自分のID名があれば検索しない。
としていますが、不便で不安で限定公開にプライベート向けの投稿がなかなか出来ないので、トークンを使いながらprivateを指定できる検索方法を探し中です。

***

user指定が影響しないということも書き置いておきます。

```bash
curl -X GET https://qiita.com/api/v2/items -d '{"per_page":"10", "page":"3", "query":"title:fish"}' -H "Content-Type: application/json" -H 'Authorization: Bearer ここがトークン' | jq '[.[].private]'
```

```
[
  false,
  false,
  false,
  true,
  false,
  false,
  false,
  false,
  false,
  false
]

```
SQL超基本２

#SQLの基本まとめ　その２

###サブクエリとは
SQL文の中に他のSQL文を入れることができます。
この他のSQL文をサブクエリと言います。2つ以上のSQL文を1つにまとめることができるので、より複雑なデータを取得する際に使われます。

```
Select name
From player
Where goals > (
	select goals
	from players
	where name = “ステフ”
);
```
⇨playersテーブルから、nameが「ステフ」の条件で、goalsカラムを取得。
で、ステフよりも得点数（goals）の多い選手名を取得

###ASとは
ASを使うことでカラム名などに別名を定義することができます。
「カラム名 AS "名前"」で、カラム名に定義する名前を指定します。

```
Select goals AS “ステフの得点数”　⇦カラム名が"goals"から“ステフの得点数”になる
From player
Where name= “ステフ”;
```

###テーブルを紐付ける
テーブルを紐づけるために、外部キーと主キーを使います。
外部キーで他のテーブルにある主キーを指定することで、テーブル同士を紐付けることができます。

＊テーブルを紐づけるメリット：データの管理のしやすさ（変更点が一箇所でOK）
###JOINとは
JOINは複数のテーブルを1つに結合したいときに使います。ONで条件を指定して、テーブルAにテーブルBを結合します。
***結合したテーブルは1つのテーブルとしてデータを取得することができます。***

```
Select *　　　　　　　  ⇦②結合された後にonが実行
From players　　　　　⇦①まずここから、onまで実行（テーブルの結合）
Join countries  ⇦playersテーブルにcountriesテーブルを結合。             
On players.country_id = counties.id　　　⇦外部キーで主キーを指定し、テーブル同士の紐付け
```

＊SQLは、取得するテーブルを形成してから検索を行うので、FROM・JOINが先に行われることを覚えておきましょう。

###複数テーブルでのカラムの指定
複数のテーブルに同じカラム名が存在するときは、「テーブル名.カラム名」で指定しなければなりません。
例えば、nameカラムが複数のテーブルにあるときは、「それぞれのテーブル名.name」で指定する。
「テーブル名.カラム名」を用いたカラム指定は、WHERE内でも使えます。複数テーブルを扱うときは、異なるテーブルで同じカラム名が存在する場合があるので覚えておきましょう。

```
Select players.name, countries.name　　⇦「テーブル名.カラム名」で、取得するカラムを指定
From players　　　　
Join countries               ⇦テーブル結合
On players.country_id = counties.id　　⇦外部キーで主キーを指定し、テーブル同士の紐付け
Where players.name = “ステフ”;        ⇦whereでもテーブル名を指定し、取得するカラムを指定
```


###LEFT JOINとは
LEFT JOINを使うことで、FROMで指定したテーブルのレコードを全て取得します。外部キーがNULLのレコードもNULLのまま実行結果に表示されます。



###複数テーブルのJOIN
JOINは1つのSQL文で、複数回使用できます。JOINを複数回使用しても、FROMは1度だけ書けば大丈夫なので注意しましょう。


###例文

①

```
SELECT name AS "選手名", height AS "身長"　　⇦カラム名をASで変更
FROM players
WHERE height > (　　　　　⇦　heightカラムの平均値より高い条件
  SELECT AVG(height)　　⇦heightカラムの平均値を抽出
  FROM players　　　　　　　　　　　　　　
)
;
```


②

```
SELECT *
FROM players
JOIN countries    ⇦テーブルを結合
ON players.country_id = countries.id　　⇦外部キーと主キーを指定しテーブルの紐付け
WHERE countries.name = "日本"　　　　　　
AND height >= 180　　　　　　　　　　　　　　　　　　　⇦条件の指定。ANDつけると複数条件で検索できる
;
```
出身国が日本で
身長が180以上のレコードを取得。


③

```
SELECT countries.name AS "国名", avg(goals) AS "平均得点"
FROM players
join countries
on players.country_id = countries.id
group by countries.name;
```

国の名前、国ごとの平均得点数を抽出。
FROM,JOINが先に実行されて、
SELECTは最後。
ElasticSearch の Heap 設定しているのに OOM Killer に殺される場合がある / DisableExplicitGC

昔から使っている ElasticSearch のバージョンをアップデートした後、プロセスの Xms がしっかり効いていない（プロセスがメモリ使いすぎている）と思ったら以下のリンクが参考になる

* https://github.com/elastic/elasticsearch/issues/26269
* https://github.com/elastic/elasticsearch/pull/25759

要約
====
* 昔は ElasticSearch 起動時に `DisableExplicitGC` オプションを指定していたが、現在こちらを設定しないほうがいい
* 設定した場合、FullGC を意図的に起こせなくなるため、FullGC が起こりにくい環境（適切にチューニングされている環境？）において
 * Heap には余裕があったり、Minor GC で問題無い場合に、DirectBuffer のアロケーションが際限なく増えていく（リークと言えば言える・・・？）

という状況になる
Git事始め

まず Git を使う準備として、`$ git init` を実行:raising_hand:

**共同開発3ステップ概要**
1. コード変更
2. 共有準備
3. 実際に共有

「1. コード変更」は各自お好きなようにするとして、2, 3を説明していきます。

# 2. 共有準備
共有の準備としては**共有したいファイルを選択**→**選択したファイルを記録**します:memo:

**共有準備2ステップ概要**
1. `$ git add -A`ですべてのファイルやフォルダを選択、または`$ git add ファイル名` でファイルを選択。例: `$ git add start.py`
2. `git commit -m "コミットメッセージ"`で選択したファイルを記録。(俗に言う「コミットする」)

# 3. 実際に共有&他の人も自分の作ったファイルを使えるようにする。
他の人も自分の作ったファイルを使えるようにするため、Git では「リモート」という共有ファイル置き場が用意されています:link::computer::link:

**実際に共有4ステップ概要**
1. リモートの URL を登録
2. リモートに名前をつけて登録 (「origin」が一般的。`$ git remote add リモート名 URL`でリモート登録 例: `$ git remote add origin https://yukiya025sharefile.git`)
3. リモートにファイルをアップロード (`$ git push origin master`。「プッシュする」)
4. リモートからファイルをダウンロード (`$git pull origin master`「プルする」)

# 共有準備～他の人も自分の作ったファイルを使えるようになるまでの流れ

**以下の流れを繰り返す**
1. add
2. commit
3. push
4. pull

# そもそもGitを使う目的
- 共同開発では自分が行った変更を把握し、その中で相手に共有すべき部分を選択できるようになることが大事

**そのために準備されている機能**
1. `$ git status` (自分が変更したファイルのファイル名を表示。add済ファイルが緑 :cactus:、未addファイルが赤色 :mushroom:)
2. `$ git diff` (変更前のコードは赤:mushroom:、変更後のコードは緑:cactus:で表示)
3. `$ git log` (自分や他人のコミットを確認。ログの上の方が新しいコミット:sparkles:)
4. `$ git log -p` (変更内容を表示。上下キーで表示範囲を変更、Qキーでこのモードを終了)

1～2を確認して、その内容でよければ `$ git add` する。

# cloud9からgithubに連携するには
上記までの知識を頭にいれつつ、[rails-study.net](https://rails-study.net/github/)さんを参考にしました。railsとありますが、使っているフレームワークや言語に関わらず連携方法は同じです。

一度[rails-study.net](https://rails-study.net/github/)さんの記事を参考にして`$ git init` からすべての作業をやり終えたら、その次からは<font color="LimeGreen">add→commit→push→pull</font>を必要に応じて繰り返せばよし。

ちなみにQiitaで文字の色を変えるのは[@twipg](https://qiita.com/twipg/items/d8043cd4681a2780c160)さんが解説してくれています。

# ブランチを作成する
ブランチを作ると何がよいのかというと、文字通り「枝」なので、「元々のコードが動かなくなったらどうしよう:ghost:」という私の心配を汲み取ってくれる素晴らしい機能なのです:sparkles:

masterブランチが開発のメインとなるのですが、それと平行してもうひとつブランチを作りそこで開発をして「これで大丈夫! ちゃんと動くよ!」となった時点でそのブランチをmasterブランチに統合します。
1. `$ git branch rename_file(←新ブランチ名)` でブランチを作成 
2. `$ git branch` で現在のブランチを確認
3. `$ git checkout rename_file` でrename_fileブランチへ移動
4. rename_fileブランチ上で開発を進める
![branch.png](https://qiita-image-store.s3.amazonaws.com/0/171266/ed81fd4d-2979-507a-8cf1-1cb910cdce3e.png)

開発ができたらrename_fileブランチをmasterブランチへmergeする。

# ブランチを切って作業した後はmasterにマージ
1. `$ git checkout master` でmasterに移動
2. `$ git merge device` でマージ (deviceは私が作成したブランチ名)
3. あとはmasterブランチでaddからpushを行う。
![checkout1.png](https://qiita-image-store.s3.amazonaws.com/0/171266/1a724e46-0244-6c2d-5d0b-4a1c5a66a424.png)

# masterではないブランチもGitHubにpushしよう!
1. masterブランチにいるのであれば、`$ git checkout device` でdeviceブランチへ移動 (deviceは私が作成したブランチ名)
2. deviceブランチでaddからpushを行う。push時は`$ git push origin device`。
![add1.png](https://qiita-image-store.s3.amazonaws.com/0/171266/bf5c19e4-8713-e05c-fd8c-14547ec02a3e.png)
3. GitHubで[Code]>[branches]でdeviceブランチがあればOK。
![branches1.png](https://qiita-image-store.s3.amazonaws.com/0/171266/a9c44842-1d10-7494-8768-83004450c8df.png)
4. codeタブで以下からdeviceブランチの中身 (コード) を確認可能。
![branch2.png](https://qiita-image-store.s3.amazonaws.com/0/171266/24ce1a65-1711-1ccc-eb00-68ecee09ae12.png)





# [プラスアルファ] その他のgit機能 (未使用だけどそのうち使うかも?)
- `git rm ファイル名` : gitの管理下にあるファイルを削除するためのコマンド

# [プラスアルファ] 実際に使ったその他のgit機能
実行環境はWindowsです。
- `rmdir /s .git`: `git init` を取り消したいとき
ソートに潜む罠（初歩的ミス）

#どんな罠？

配列からキーで取得できない

#状況

キー情報が消えている

#原因

タイトルに有るソート(usort)を行ったためキーが消えています

#あとがき

随分前に作ったところを見直す機会があって
都度生成するオブジェクトの再利用を行おうとしたら取得ができずにハマりました。
戒め記事
GCPチュートリアル試行「App Engine での Endpoints Frameworks スタートガイド」

# お題
表題のチュートリアルを試しにやってみる。
Cloud Endpoints自体の概要は、[ここ](https://cloud.google.com/endpoints/) を参照。
概念等の大事なことは、[ここ](https://cloud.google.com/endpoints/docs/openapi/about-cloud-endpoints) を参照。

# 前提
GCP環境は保持済み。

# 試行
★[参考](https://cloud.google.com/endpoints/docs/frameworks/java/get-started-frameworks-java)★

チュートリアル通りやるだけで、GAEにサンプルJavaアプリをデプロイした上でエンドポイントにcurl叩くと結果返すことを確認可能。
特にハマるポイントは無し。
<pre>
$  curl \
>      --header "Content-Type: application/json" \
>      --request POST \
>      --data '{"message":"hello world"}' \
>      https://XXXXXXXX.appspot.com/_ah/api/echo/v1/echo
{
 "message": "hello world"
}
</pre>
※「XXXXXXXX」は自分のGCPプロジェクトID

実行結果は以下のように確認できる。

![gcep.png](https://qiita-image-store.s3.amazonaws.com/0/180599/ddb77e43-c5ba-64ab-e5ad-a9614a1faefe.png)