OmniAICreator/Qiita-1.07M huggingface dataset:
Androidアプリ(Kotlin)でメニューを作成する方法

# Androidアプリ(Kotlin)でメニューを作成する方法
右上にあるメニューの作成方法がよくわからなかったので忘れないようにまとめたメモ

下記みたいなメニューの作成
![Screenshot_1561941566.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/46c3a732-71c2-01d2-71aa-1f989f7fa812.png)

## メニューリソースの作成
メニューのリソース用xmlを作成
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/5a32b734-7598-cb2c-8bc4-6f9ba603b9c7.png)

```xml:main_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/create"
              android:title="@string/create" />
        <item android:id="@+id/delete"
              android:title="@string/delete" />
</menu>
```
デザインとしては下記の感じになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/c4a6c815-b737-a3bd-a3dc-3c9fbb7d112f.png)

##メニューの埋め込み
Activityに埋め込む

```kotlin:MainActivity.kt

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.AdapterView.AdapterContextMenuInfo


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    //メニュー表示の為の関数
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        super.onCreateOptionsMenu(menu)

        val inflater = menuInflater
        //メニューのリソース選択
        inflater.inflate(R.menu.main_menu, menu)
        return true
    }

    //メニューのアイテムを押下した時の処理の関数
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.getItemId()) {
            //作成ボタンを押したとき
            R.id.create -> {
                return true
            }
            //削除ボタンを押したとき
            R.id.delete -> {
                return true
            }
            else -> return super.onOptionsItemSelected(item)
        }
    }
}

```
↑関数名に一部ミスがあったため修正しました。

##完成
右上にメニューボタンがあればOK
![Screenshot_1561941570.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/3628c8c3-02b3-7d9d-4142-6185b360c71a.png)
SORACOM Air のバイナリパーサーでうまくデータを変換できない。

##概要

SORACOMの[バイナリパーサー](https://dev.soracom.io/jp/docs/binary_parser/)を有効にして、SORACOMコンソールで送信したデータを確認すると、どうやら変換がうまくいっていませんでした。

その原因を突き止めるのに悪戦苦闘したので、判明した原因を共有します。


##結論

まず、結論から。

見た目では16進数に変換できていたのですが、内部ではASCII文字として保存されていたからです。


##目標と結果

- やったこと
**経度: 139.752101, 緯度: 35.682501**を、SORACOM Unified Endpointにバイナリで送る。

- 目標
コンソール上で**{"lat":139.752101,"lng":35.682501,"binaryParserEnabled":true}**と確認できる。

- 結果
コンソールでは、**{"lat":943.010871,"lng":845.23141,"binaryParserEnabled":true}**と表示されてしまう。


##実装していたソースコード

スケッチの loop()内の処理のみ、共有します。

```grove-gps.ino
// 実際のデータは、grove-gpsセンサから読み取った値が格納。
        double lat = 139.752101;
        double lng = 35.682501;

        unsigned long int const lat_decimal = (unsigned long int)(lat * 1000000);
        unsigned long int const lng_decimal = (unsigned long int)(lng * 1000000);
    
        char post_data[64];
        sprintf(post_data, "%x%x", lat_decimal, lng_decimal);
        SerialUSB.print("post data: ");
        SerialUSB.println(post_data);

// UDPプロトコルでデータを送信
        Nectis.PostDataViaUdp(post_data);
```

##間違いポイント

- sprintf() で変換指定子を１６進数の **%x** にすれば良い
と勘違いしていたところです。

この方法で変換した送信データをArduinoIDEのシリアルモニタで確認すると、
**Send:85472a522078c5**
となっており、10進数に戻すと、見た目上は確かに**lat**,**lng**になります。

さらに、[SORACOM Binary Parser Playground](https://blog.soracom.jp/blog/2019/06/21/binary-parser-playground/)で試してみても、うまく変換できてしまいます。

どうして思い通りに変換できなかったのかというと、16進数に変換したデータを16進数のASCII文字として送信していたからです。


##失敗した送信データを解読してみる

ArduinoIDEのシリアルモニタで確認した送信データ**"85472a522078c5"**が、バイナリパーサーで変換すると、
**{"lat":943.010871,"lng":845.23141,"binaryParserEnabled":true}**
となることを確認していきます。

送信データを先頭から16進数のASCII文字に変換していくと、
85472a522078c5 => **38 35 34 37 32 61 35 32 32 30 37 38 63 35**
となります。

先頭の４Bytes、即ち**38 35 34 37**を16進数とみなし、10進数に変換してみます。

(38353437)16 = (943010871)10

SORACOMコンソールで確認できたデータの"lat"と一致しました。

同様に、次の４Bytesを変換すると、

(32613532)16 = (845231410)10

となり、これもコンソールで確認できたデータの"lng"と一致します。


##まとめ

扱っているデータが、16進数のASCII文字なのか、16進数の数値なのか、しっかりと確認しましょう。
NSFetchedResultsControllerの使い方

#NSFetchedResultsControllerを使う際注意点のまとめ
###1.1つ以上のsort descriptorが必要
```Swift
let nameSort =  NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [cateSort, nameSort]
```
###2．Grouping results into sectionsの際、sectionNameKeyPathの設定も必要し、sectionNameKeyPathのKeyを１番のsort descriptorとして追加することも必要
```Swift
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,
                           managedObjectContext: coreDataStack.context, 
                           sectionNameKeyPath: "category",cacheName: nil)
let cateSort = NSSortDescriptor(key: "category", ascending: true)
let nameSort =  NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [cateSort, nameSort]
```
###3．sort descriptorの追加される順でsortする。
例えば

```Swift
let zoneSort = NSSortDescriptor(key: "qualifyingZone", ascending: true)
    let scoreSort = NSSortDescriptor(key: "wins", ascending: false)
    let nameSort =  NSSortDescriptor(key: "teamName", ascending: true)
    fetchRequest.sortDescriptors = [zoneSort, scoreSort, nameSort]
```
勾配降下法、モメンタム法、nesterovの勾配加速法をアニメーション化した。

#勾配降下法

勾配降下法を使うとパラメータの値を逐次的に更新していくことによって一番尤もらしいパラメータの値を求められる。
関数$E(\theta)$のパラメータ$\boldsymbol{w}$の更新式は以下の通り。

```math
{\mathbf{w}^{t + 1} \gets \mathbf{w}^{t} - \eta \frac{\partial E(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}
}
```

この更新を繰り返すことによって、パラメータの値を探索していいく。場合によっては更新を何千回と繰り返さなければならないこともあるため、これを効率化するテクニックが無数に存在する。本記事では、シンプルな勾配降下法に加え、これらのテクニックを使った際のパラメータが更新されていく様子をアニメーション化した。

#初期値の設定

関数: $f(x, y)={x^2 + 3y^2}$
初期座標: $(x, y) = (9, 9)$
学習率: $\eta=0.1$
終了条件: $x, y$の勾配がいずれも$0.01$未満になったら終了。



#普通の勾配降下法


![koubai_normal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275145/e9053384-9e6f-a3d4-f776-c45d4496ded8.gif)

まずは、単純に勾配を取る普通の勾配降下法。100回で収束した。

#モメンタム法

更新式は以下のようになる。

```math
{\mathbf{w}_{t + 1} \gets \mathbf{w}_t - \eta \frac{\partial E(\mathbf{w}_t)}{\partial \mathbf{w}_t}} + \gamma \Delta \mathbf{w}_t
```

モメンタム法は、前回の更新の方向に慣性をつけることによって、学習を速めるテクニック。勾配が急な場所では、どんどん加速していくイメージ。$\gamma$の値は0から1の範囲で設定する。今回は0.9とした。

![final_koubai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275145/868188ec-49b0-389a-ee4d-390a71f4077c.gif)

確かに慣性がかかっているのが見て取れる。58回で収束した。いい感じ。

#Nesterovの加速勾配法（Nesterov's Accelerated Gradient Method）
更新式は以下の通り。

```math

\bar{\mathbf{w}_t} =  \mathbf{w}_t + \gamma \Delta \mathbf{w}_t
　\\

{\mathbf{w}_{t + 1} \gets \mathbf{w}_t - \eta \frac{\partial E(\bar{\mathbf{w}_t)}}{\partial \bar{\mathbf{w}_t}}} + \gamma \Delta \mathbf{w}_t

```

Nesterovの加速勾配法は、モメンタム法を発展させた手法。
$\boldsymbol{x}_t$の地点におけるモメンタム法の更新を①慣性による移動と②$\bar{\mathbf{w}\_t}$の勾配による移動の2段階に分けることができる。Nesterovの加速勾配法はこれに対し、まず慣性によって$\bar{\mathbf{w}\_t}$に移動し、$\bar{\boldsymbol{w}\_t}$の勾配によって2段階目の移動をするという仕組みである。これによって、慣性がつきすぎるのを防ぎ、更新スピードを速めることが可能となっている。


![final.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275145/2f572c30-76be-36c2-639b-7d7eca90e45c.gif)

43回で収束した。



# AdaGrad

```math
{h_{0} = \epsilon\\
h_{t} = h_{t−１} + \nabla E(\mathbf{w}^{t})^{2}\\
\eta_{t} = \frac{\eta_{0}}{\sqrt{h_{t}}}\\
\mathbf{w}^{t+1} = \mathbf{w}^{t} - \eta_{t} \nabla E(\mathbf{w}^{t})
}
```
adagradは、$h_0=\eta$にepochごとに重みの2乗を足していき、その平方根で$\eta_{0}$割った数を学習率とする。これによって、学習率が毎回下がっていく。

は、初期学習係数$\eta_0$と$h_0=\epsilon$を決める必要がある。
Chainerにおけるデフォルトのパラメータは$\epsilon = 10^{-8}, \eta_{0} = 0.001$となっている。


[コード](https://github.com/ryuhei1230/qiita_repo/blob/master/momentum.py)
create文を一括で出す

```sql
-- 未完成 plsqlで使える配列を出力してみる。ボツ。難しすぎた
SELECT 'ar('||ROWNUM||')'''||OBJECT_NAME||''',', CREATED, TIMESTAMP 
FROM USER_OBJECTS WHERE OBJECT_TYPE='TABLE'
order by created desc
;
```

```sql
-- in句に入れられるように加工する
SELECT 
	''''||OBJECT_NAME||''',', CREATED, TIMESTAMP 
FROM USER_OBJECTS 
WHERE 
 OBJECT_TYPE='TABLE'
and not(REGEXP_LIKE(OBJECT_NAME,'^[A-Z]','i'))
order by created desc
;
```

上で出力したテーブル名を使ってスプールでcreate文を出す

```sql
-- ①SQL設定
-- コンソールメッセージを非表示にする
SET ECHO OFF
-- 1行に出力するバイト数
-- 少ないと見切れるので最大に設定する
SET LINESIZE 32767
-- 1ページの行数
-- 少ないとヘッダーが多くて見づらいので無制限に設定する
SET PAGESIZE 0
-- 「○○行が選択されました」メッセージを非表示にする
SET FEEDBACK OFF

--セミコロンを付加
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',TRUE );

--ストレージ句を無効に
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE );
 
--表領域の指定を無効に
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM( DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',FALSE );


SPOOL /Users/na8esin/oracle_create_statment/create_statment.sql
SET SERVEROUTPUT ON
DECLARE
	TEMP_DDL_STATMENT varchar2(5000); --CREATE文を一時的に格納

	CURSOR c_USER_OBJECTS IS
		SELECT OBJECT_NAME, CREATED, TIMESTAMP
		FROM USER_OBJECTS WHERE OBJECT_TYPE='TABLE'
		AND OBJECT_NAME IN(
-- 上で出力したテーブル名を入れる
		)
		order by created desc;
	rec_USER_OBJECTS c_USER_OBJECTS%ROWTYPE;
BEGIN
	FOR rec_USER_OBJECTS IN c_USER_OBJECTS LOOP
		select dbms_metadata.get_ddl('TABLE',rec_USER_OBJECTS.OBJECT_NAME) INTO TEMP_DDL_STATMENT from dual;
		DBMS_OUTPUT.PUT_LINE(TEMP_DDL_STATMENT);
	END LOOP;
END;
/

-- ログ出力終了
spool off
EXIT;

```
暗黙変換は使わないほうがいい

クライアントによって、エラーになったりならなかったりするから

```sql
/** 暗黙変換について **/
select CASE WHEN '20190402' < sysdate THEN 'OK' ELSE 'NG' END from dual;


select CASE WHEN '2019-04-02 00:00:00' < sysdate THEN 'OK' ELSE 'NG' END from dual;

select CASE WHEN to_date('2019-04-02 00:00:00','YYYY-MM-DD HH24:MI:SS') < sysdate THEN 'OK' ELSE 'NG' END from dual;

-- フォーマットを間違えて入れた場合はどうなる？
-- OK
select CASE WHEN to_date('19-05-01','YYYY-MM-DD HH24:MI:SS') < sysdate THEN 'OK' ELSE 'NG' END from dual;
select CASE WHEN to_date('19-05-01','YYYY-MM-DD HH24:MI:SS') < to_date('2019-05-01 00:00:00','YYYY-MM-DD HH24:MI:SS') THEN 'OK' ELSE 'NG' END from dual;
```
php-master-changes 2019-06-30

今日は fileinfo の二重解放を避けるための修正、ドキュメントの更新、timelib を更新する修正があった！

# 2019-06-30
## weltling: Set buffer to NULL to prevent double free (Kamil Dudka at redhat)
- https://github.com/php/php-src/commit/5ae0a6b784e90e5c2aa6723b404a7bb91cd5fecc
- [7.4~]
- ext/fileinfo で、二重解放を避けるよう解放後バッファのポインタに NULL を突っ込む修正

## weltling: Update libmagic.patch [ci skip]
- https://github.com/php/php-src/commit/dacf9ecc46243b8e61dcd1988443f4a57b413f43
- [7.4~]
- ext/fileinfo で、libmagic のパッチを更新

## weltling: Update NEWS [ci skip]
- https://github.com/php/php-src/commit/a149f9f3c087fb99dae217653d705aa4fc1d0c66
- [7.2~]
- NEWS へ[前日の修正](https://qiita.com/sj-i/items/2b020a851bc0dfdb7238#jdoubleu-fix-78183-finfo_file-shows-wrong-mime-type-for-tga-file)を追記

## derickr: Update timelib to 2018.02
- https://github.com/php/php-src/commit/aae5907cb7e775f16bedf61b010b8692c12a2843
- [7.3~]
- ext/date で、timelib を 2018.02 へ更新

## derickr: Fixed tests due to changed timezone data
- https://github.com/php/php-src/commit/cc3fe3bd30ecd94e7eec5075f25f7cd4c5b806e2
- [7.3~]
- ext/date で、タイムゾーンデータの更新に伴うテストの期待出力の修正
rowtypeが異なっていても型が大体あっていれば代入できる

```sql
/* 代入も出力もできている */
SET SERVEROUTPUT ON
DECLARE
	TYPE r_レシート名 IS RECORD (
		レシート名漢 ＪＡＮ名称Ｍ.レシート名漢%TYPE,
		レシート名仮 ＪＡＮ名称Ｍ.レシート名仮%TYPE
	);

	CURSOR c_table IS SELECT レシート名漢, レシート名仮
						FROM Ｈ商品Ｍ WHERE 本部コード = 53 AND ＪＡＮコード = '4902750697874';
    r_tmep r_レシート名;
BEGIN
    OPEN c_table;
	FETCH c_table INTO r_tmep;
    DBMS_OUTPUT.PUT_LINE(r_tmep.レシート名漢);
END;
```
select文の結果が0件の場合の制御


```sql

/* select文の結果が0件の場合の制御は？ */
SET SERVEROUTPUT ON
DECLARE
	CURSOR c_table IS SELECT * FROM ＪＡＮ名称Ｍ WHERE ＪＡＮコード = 'aaa';--'4987494076314';
    r_tmep ＪＡＮ名称Ｍ%ROWTYPE;
BEGIN
    OPEN c_table;
	FETCH c_table INTO r_tmep;
	IF r_tmep.ＪＡＮコード IS NULL then /* こんな感じで特定のカラムを調べてみないとわかんない */
		DBMS_OUTPUT.PUT_LINE('record is null');
	END IF;
END;
```
プロシージャの入れ子

```sql
CREATE OR REPLACE PROCEDURE proc_nest_sample
AS
	PROCEDURE proc_sub_one AS
	begin
		DBMS_OUTPUT.PUT_LINE('I am proc_sub_one');
	end proc_sub_one;

	PROCEDURE proc_sub_two AS
	begin
		DBMS_OUTPUT.PUT_LINE('I am proc_sub_two');
	end proc_sub_two;
BEGIN
	proc_sub_one();
	proc_sub_two();
end;
```
一番簡単なplsql

```sql

DECLARE
    tantou_count NUMBER(7);
BEGIN
    select count(*) into tantou_count from "Ｋ受担当Ｄ";
    DBMS_OUTPUT.PUT_LINE(tantou_count);
EXCEPTION
    WHEN too_many_rows THEN null;
END;
/
```
日本語のテーブル名は意外とわかりやすいけど、文字化けで苦しむので、
やっぱりなくしたほうがいい。
Gitコマンド　整理用メモ

# 目的
GitコマンドとUIツールを共存してうまく活用していく

# 前提
まずは、Gitをインストールしてきましょう

### あって損しないもの（追記で入れましょう）
TortoiseGit
SourceTree 

### Github等で、gitリポジトリ作る

# Windows に沿って説明します
コマンドプロンプト起動してhogeなディレクトリ作ってそこへ移動
↓
git init や git clone ... /.git
（または、ブラウザ上でフォークしてターミナルでクローンなど）
↓
初期化機能追加対応（ソース修正）
↓
git add file ...
↓
git status
↓
git commit -m "#issues5 初期化処理の機能追加しました"
↓
git push origin master
（（フォークした）自身リポジトリにプッシュ）
git push upstream master
（フォーク前のリポジトリにプッシュ）

（チームでやってるときは本当にmasterにプッシュしても大丈夫か要確認！）
オプション（-f）をつけることにより、強制的にプッシュできる。

# git pull
リモートにある最新を取得してマージ

# git fetch 
リモートにある最新を取得のみ

# git pull origin master
（フォークしたリポジトリの最新を取得してマージ）
# git pull upstream master
（フォーク前のリポジトリの最新を取得してマージ）

# git fetch origin master
（フォークしたリポジトリの最新を取得）
# git fetch upstream master
（フォーク前のリポジトリの最新を取得）

## リポジトリのフォーク
> GitHub等のアカウントを持っていると、自分のアカウント内に既存のリポジトリの複製をつくれたりします。 この操作をフォークと呼ばれる。 

> 共有されていないリポジトリに対して書き込むことはできません。 一方、フォークしたリポジトリは自分の所有物なので、自由に更新ができます。

# git merge
fetchした内容を自分のブランチへマージさせる

# チェックアウト後の新規ファイルを追跡できずにステージングに残ってしまう場合の対処
> untracked fileを削除するためにはgit cleanを使います。

## git clean -n
> untracked fileを削除する前に、削除の対象となるファイルを確認できます。

## git clean -dn
> ディレクトリを確認したい場合に使う

## git clean -f
> untracked fileを削除します。

## git clean -df
> ディレクトリを削除する場合はdをつけます。 



# コンフリクト起きてgit pullできない時

ひとことでまとめようとすると難しい

> 自分のソースをバックアップとることを前提に、
git fetch で状態だけ確認、コンフリクト起きたところをIDE等で見て修正。そして、git mergeでマージ

## よい方法の例としては
> TortoiseGitの場合、右クリックすると『変更取り消し』機能があるので、事前にバックアップはするのは前提とし、その機能を活用したあと、バックアップと差分確認し、自分の修正取り込んだり、修正を捨てる

> TortoiseGit入れなてないときも同様に、バックアップ取ってプルまたは、クローンし直して、修正差分を取り込む。

## 差分確認ツールとして
> WinMergeが有名である。または、gitの差分コマンドや、TortoiseGitの差分機能も検討してみてください

> vscode拡張機能としてGit Lensがある
[https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)

## ブランチの状態を確認できるツール
### Sourcetreeの代用として可能

> vscode拡張機能としてGit Graphがある
[https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph)

## 結論
> ひとことでいうと、コンフリクト起きたときは、自分のファイルをリネームしてプルし差分取り込む、またはローカルブランチ切るか、UI使ってバックアップを視覚化して分かりやすく取ることが大切

## オプション
### --ff-onlyを設定する
> fast-forwardでマージできる状況ではfast-forwardでのmergeを、そうでなければfetchのみ行う

```vim
git pull --ff-only origin HEAD

```
### --ff-onlyをデフォルトで実行されるようにする

> git pull時に--ff-onlyを設定すると便利です。エンジニアたるもの良さそうなオプションは当然デフォルトで設定したくなる。

> デフォルト設定にする場合~/.gitconfigを編集するか

```vim
~/.gitconfig
[pull]
    ff = only
```
### 下記コマンドを実行する事で設定できます。

```vim
$ git config --global pull.ff only
```


# 参考
## issues単位とは？
[https://seleck.cc/647](https://seleck.cc/647)

## SSH接続設定
[https://backlog.com/ja/git-tutorial/reference/ssh/](https://backlog.com/ja/git-tutorial/reference/ssh/)
例外の入れ子

```sql

SET SERVEROUTPUT ON
BEGIN
    BEGIN
        RAISE NO_DATA_FOUND ;
	EXCEPTION
		WHEN OTHERS THEN
			DBMS_OUTPUT.PUT_LINE('inner');
			DBMS_OUTPUT.PUT_LINE(sqlcode||':'||sqlerrm);
			raise; -- 呼び出し元に同じ例外情報を伝播する
	END;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('OTHERS');
        DBMS_OUTPUT.PUT_LINE(sqlerrm);
END;
```
【備忘録】簡単、便利なのに盲点になりがちなアレコレ（旧：PCの画面綺麗にしたいけど電源入れちゃった・・・）

# メモ的な感じで。
普通簡単に気がつくものかも知れないけど、
個人的に、なんとなく盲点になってしまっていたもの達。
同じような人がいらっしゃれば参考になればいいなあ。


## 画面汚れてる・・・・
PCの画面が汚れていて拭きたいのに
電源を入れてしまった。
また今度拭こう。（画面が明るいと汚れが見えにくい）

ということがよくありました。
ただ、よく考えれば**画面の明るさを最小にすればいいだけ**なんですよね。

## カレンダーをターミナルに出す

```terminal:ターミナル
cal
```

実行するとこんな感じ↓

```terminal:ターミナル
      7月 2019         
日 月 火 水 木 金 土  
    1  2  3  4  5  6  
 7  8  9 10 11 12 13  
14 15 16 17 18 19 20  
21 22 23 24 25 26 27  
28 29 30 31         
```

## 日時を表示

```terminal:ターミナル
date
```

実行するとこんな感じ↓

```terminal:ターミナル
2019年 7月19日 金曜日 08時48分35秒 JST
```

## 電卓をターミナルで

```terminal:ターミナル
bc
```

実行するとこんな感じ↓

```terminal:ターミナル
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1+1
2
100*100
10000
3/2
1
3%1
0
```

オプションつけないと割り算がざっくり計算になるのでご注意を。

## コマンドを単語登録する
平仮名を入れて変換すれば、コマンドが出る。
実行ファイルにパスを通して環境を汚したく無いとか、
そもそも色んなサーバーにアクセスするけど利用するPCは少ない台数とか。
そういう場合に使えるかもしれない。

自分はよく入力するSQL文とか、
シェルスクリプトの絶対パスとかを登録しています。

## ターミナルで最初or最後の文字に移動する
control+A control+E で出来ます。
作業スピード上がって、便利。

## シークレットブラウザを使えば非ログイン状態でテスト可能
ログイン機能があるWEBサービスのテスト、
いちいちログアウトするの、面倒ですよね。
シークレットブラウザを使うのがオススメです。
[Java]DateTimeFormatterのFormatStyle別出力

### ロケールを日本

```java
        Locale locale = Locale.JAPAN;
        LocalDateTime now = LocalDateTime.now();
```

出力プログラム

ofLocalizedDateTimeでフォーマットを行う。

```java
        
        System.out.println(
                now.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(locale))
        );
        System.out.println(
                now.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).withLocale(locale))
        );
        System.out.println(
                now.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(locale))
        );
        System.out.println(
                now.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(locale))
        );

```

実行結果(上から、FULL, LONG, MEDIUM, SHORT)

```
java.time.DateTimeException: Unable to extract ZoneId from temporal 2019-07-01T07:58:21.538531
java.time.DateTimeException: Unable to extract ZoneId from temporal 2019-07-01T07:58:21.538531
2019/07/01 7:59:30
2019/07/01 7:59
```

### ロケールをアメリカ

実行結果(上から、FULL, LONG, MEDIUM, SHORT)

```
java.time.DateTimeException: Unable to extract ZoneId from temporal 2019-07-01T07:58:21.538531
java.time.DateTimeException: Unable to extract ZoneId from temporal 2019-07-01T07:58:21.538531
Jul 1, 2019, 7:57:26 AM
7/1/19, 7:57 AM
```
Generics or Protocol associated type? それが問題だ🤔

## はじめに
「Swiftでは、任意の型に対応させられるように、Genericsを使って型を抽象化できるのか。。。🧐」
「なんと、Protocolでもassosiated typeで任意の型を表現できるらしい！😳」

「。。。。。。。。。。。。。」

「で、どっち使えばいいんだ？🙄🙄」
 
 **※以下 PAT = Protocol associated type**

## 検証 (Swift5, Xcode10.2.1)
例えば下記のようにポケモン(もはや恒例)を表す `Pokemon` というプロトコルとそれに準拠した `Pikachu` があるとする。
今回はポケモンの名前を出力してくれる `PokemonDescriptor` を作りたい。
`PokemonDescriptor` は、`Pokemon` プロトコルに準拠しているものなら何でも出力できる。

```swift
protocol Pokemon {
    var name: String { get }
}

struct Pikachu: Pokemon {
    let name: String
}
```

### PATを使った場合
```swift
protocol CharacterDescribable {
    associatedtype Character
    func describe(_ character: Character)
}

struct PokemonDescriptor: CharacterDescribable {
    typealias Character = Pokemon
    func describe(_ character: Character) {
        print("\(character.name)だよ〜")
    }
}

let pikachu = Pikachu(name: "ピカチュウ")

let pokeDescriptor = PokemonDescriptor()

pokeDescriptor.describe(pikachu)

// output: ピカチュウだよ〜
```

### Genericsを使った場合
```swift
struct PokemonDescriptor {
    func describe<T: Pokemon>(_ pokemon: T) {
        print("\(pokemon.name)だよ〜")
    }
}

let pikachu = Pikachu(name: "ピカチュウ")

let pokeDescriptor = PokemonDescriptor()

pokeDescriptor.describe(pikachu)

// output: ピカチュウだよ〜
```

### 何が違うのか💡
プログラム自体がしていることは同じ。
違いはそれぞれの `describe()` メソッドが実行される方法(Method dispatch)。

>Method dispatchとは
>メソッドを呼び出すときにどの実装が実行されるかを選択/解決するシステム。
>コンパイラがコンパイル時にそれを解決するのがstatic dispatch。実行時に解決するのはdynamic dispatch。

Qiita内だと、[この記事](https://qiita.com/HaNoHito/items/f40bfc1717c1e922a5b0)とかSwiftのMethod dispatchについて詳しく書かれてます👏

GenericsとPATにおいて、前者で定義されたメソッドはstatic dispatchで実行されるが後者で定義されたメソッドはdynamic dispatchで実行される。
staticはコンパイル時にどのメソッドを走らせるか事前に決めるので実行速度が速い、ただしメモリーをより多く消費する。
逆にdynamicはプログラム実行中に動的に決定するので、その分実行速度は落ちるが効率的にメモリーを使用できる。

## 結論✍️
- ケースバイケース
- どちらでもよく、簡単なコードならとりあえず実行速度の速いGenericsを検討する
- ただし、PATの方が表現力や可読性が高い(そもそもSwiftはProtocol oriented)
- 自分はPATでやりたい

## 最後に
自分でもまだしっくり来てないです。誰かアドバイスください！！(説教でも可😜)

## 参考資料
[SwiftにおけるMethod Dispatchについて - Qiita](https://qiita.com/HaNoHito/items/f40bfc1717c1e922a5b0)
[Method Dispatch in Swift – RPLabs – Rightpoint Labs](https://www.rightpoint.com/rplabs/switch-method-dispatch-table)
辞書ファイルから、n字違いの文字列を探し出すコード


辞書ファイルから、引数に与えられた文字列から、ｎ文字違う文字列を探し出して列挙するコードです。使い方は、`$ ./kol.py ことば` または、`$ ./kol.py ことば n`として下さい。nを省略するとnは１となります。

#辞書ファイルフォーマット
あいうえお\n
かきくけこ\n
さしすせそ\n

または、
abcde\n
fghij\n
klmno\n

のように、辞書ファイルは、\nで区切られたテキストファイルなら良いです。
出力見本は、jm.txtという、jmdicから抽出したひらがなの名詞ばかりの日本語辞書を使いましたが、辞書ファイル自体は、著作権の関係で、公開できません。辞書ファイルを変えたかったら、コード中の「辞書ファイル」というコメントのある行のファイル名を変えて下さい。
#コード

```kol.py
#!/usr/bin/python3

import sys
args=sys.argv
ins=args[1]

if len(sys.argv)==3:
  n=int(args[2])
else:
  n=1

ld = open ("jm.txt") # 辞書ファイル
lines = ld.readlines()
ld.close()

for line in lines:
  l=len(line)-1
  d = 0
  if l==len(ins):
    i = 0
    while(i<l):
      if line[i]!=ins[i]:
        d+=1
      i+=1
    if d==n:
      print(line.rstrip('\n'))
```

#実行結果（出力見本）

```
$ ./kol.py ことば
けとば
こうば
こしば
ことう
ことく
ことざ
ことし
ことじ
ことに
ことね
ことの
ことみ
ことり
こはば
こまば
そとば
はとば
まとば
$
```
【技術備忘録③】容量監視コマンドの「df」「du」コマンドの習得で、原因究明力の向上

- 現在利用している言語や技術の記法や不明点等を記録していく記事第三弾。
- 素晴らしき先人たちの「タイトル命名術」を事細かく調査した結果、センスや感性が最終着地点であることが判明し、史上最大の悟りに没頭。
- 今回は、容量監視コマンドである「df」「du」コマンドを記録して、原因究明力を更に上げていくことにしよう。

## 作業環境
- Amazon Linux 2
    - ※結果画面や利用確認等の、メイン環境として使用。
- Mac OS X 10.13.4
    - ※Macでの操作性と利用可否確認のために使用。

## dfコマンド

### 概要や特徴
- OSのディスク容量のサイズや使用率等の情報を表示するコマンドツール。
- 手元の環境のシステムがどのくらいの容量を有しているのかを確認する際に用いる。
- パソコンの挙動の不具合・サーバーエラー等の際の原因究明に便利。

### 基本操作
- 基本的な使用例は下記。

<img width="602" alt="test.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/087ce910-a13c-dae6-4e77-d96e07043099.png">

- 基本的な項目の見方は下記。

|項目名|意味|
|:---:|:---:|
|Filesystem(ファイルシステム)|ディスク名|
|1K-blocks(1K-ブロック)|使用可能なディスク容量|
|Used(使用)|使用済みディスク容量|
|Available(使用可)|ディスク空き容量|
|Use%(使用%)|ディスク使用率|
|Mounted on(マウント)|ファイルシステムの位置(場所)|

- 基本的な操作方法は下記。

| 内容 | コマンド |
|:-:|:-:|
| 通常表示  |  `df` |
|  サイズ容量表示 | `df -h`  |
| 全ファイルシステム容量表示  | `df -a`  |
| サイズ単位での表示  | `df -BM`で1024 * 1024単位<br>`df -BMB`で1000 * 1000単位<br>`df -H`でサイズ単位に合わせた表示  |
|  iノード(ファイル属性情報データ)での表示 | `df -i`  |
| ファイル場所指定での表示 | `df ファイルパス`  |
| ファイルタイプの表示 | `df -T`  |
| バージョン表示 | `df --version`  |
| ヘルプ表示 | `df --help`  |

## duコマンド

### 概要や特徴
- ファイル容量のサイズや使用率等の情報を表示するコマンドツール。
- dfコマンドと同様に、サイズや使用率の表示コマンドだが、ファイルごとの表示のため、より詳細な情報を確認することができる。
- dfコマンド同様に、挙動の不具合やサーバーエラー等の原因究明に便利。

### 基本操作
- 基本的な使用例は下記。

<img width="597" alt="hsh.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/3cf9013c-a5f0-ab88-bd87-6b73ab40950e.png">

- 基本的な操作方法は下記。

| 内容 | コマンド |
|:-:|:-:|
| カレントディレクトリ(現在位置)下の全ての表示  | `du`<br>**※HOMEディレクトリ等で行うと、大量の処理が走るため注意**  |
| 容量の合計のみ表示  |  `du -s`<br>`du -s ファイル場所`で特定ディレクトリでの合計表示 |
| サイズ単位での表示  |  `du -h`<br>`du -sh`みたいに組み合わせて利用する場合が多い。 |
| 階層指定  | `df -d階層数`<br>例 : `df -d1`で１つ目の階層までの表示指定<br>`du -hd1`みたいに組み合わせて利用  |
|バイト単位表示|`du -b`|
|バージョン表示|`du --version`|
|ヘルプ表示|`du --help`|

## 実践コマンド
- 実際に挙動不具合等での確認の際に便利なコマンドは主に下記。

```bash
# 2階層指定で、ファイル容量の多い順での表示
$ du -hd2 ファイル場所 | sort -nr

# 2階層指定で、ファイル容量の少ない順での表示
$ du -hd2 ファイル場所 | sort -h

# 特定ディレクトリの合計のみの表示
$ du -sh ファイル場所
```


## まとめ
- 今回は、容量監視コマンドの学習ということで、知らぬ間の容量の無頓着使用に、自分への怯えと同時に愛着を感じながら記事を書く。
- 試用中毒であるため、そろそろクラウド中心を検討する時期がきたことに、表情筋を自由に踊り狂わせる生活。
- コマンドツールにも視覚性を求める現代技術者のため、次回は容量監視を可視化できるツールを探して試用することにしよう。

## 参考
- https://www.yoheim.net/blog.php?q=20160707  
→こちらの記事を参考にいたしました。大変お世話になりました。

- https://help.gmocloud.com/app/answers/detail/a_id/3275/~/df%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E5%AE%B9%E9%87%8F%E7%A2%BA%E8%AA%8D  
→こちらの記事を参考にいたしました。大変お世話になりました。
来るべきVue3.0に備える


v-sendai #2での発表内容です


## 自己紹介

tanshio(@_tanshio)


フロントエンドエンジニア、ウェブデザイナー
好きなものはVue・Nuxt、TypeScript、WebGLです
いま挑戦中のものはRustです
VTuberが好きです

---

基本的には、https://github.com/vuejs/rfcs に書いている情報になります。

---

## Class APIの破棄

クラスベースのAPIが提案されていましたが、破棄されました。

---

```vuejs
<template>
  <div @click="increment">
    {{ count }} {{ plusOne }}
    <Foo />
  </div>
</template>

<script>
import Vue from 'vue'
import Foo from './Foo.vue'

export default class App extends Vue {
  static components = {
    Foo
  }

  count = 0

  created() {
    console.log(this.count)
  }

  get plusOne() {
    return this.count + 1
  }

  increment() {
    this.count++
  }
}
</script>
```

https://github.com/vuejs/rfcs/pull/17#issuecomment-494242121

僕的にはシンプルかつ継承などもしやすいので残念。
rfcsのVuexがこれベースっぽかったので今後注目。

---

## Function-based Component API

---


```js

import {
  value,
  computed,
  watch,
  onMounted,
  inject
} from 'vue'

const App = {
  // same as before
  props: {
    a: String,
    b: Number
  },

  // same as before
  components: {
    // ...
  },

  setup(props) {
    // data
    const count = value(1)

    // computed
    const plusOne = computed(() => count.value + 1)

    // methods
    function inc() {
      count.value++
    }

    // watch
    watch(() => props.b + count.value, val => {
      console.log('changed: ', val)
    })

    // lifecycle
    onMounted(() => {
      console.log('mounted!')
    })

    // dependency injection
    const injected = inject(SomeSymbol)

    // other options like el, extends and mixins are no longer necessary

    // expose bindings on render context
    // any value containers will be unwrapped when exposed
    // any non-containers will be exposed as-is, including functions
    return {
      count,
      plusOne,
      inc,
      injected
    }
  },

  // template: `same as before`,

  render({ state, props, slots }) {
    // `this` points to the render context and works same as before (exposes everything)
    // `state` exposes bindings returned from `setup()` (with value wrappers unwrapped)
  }
}

```

---

React Hooksのようなイメージ。

---

今からでも使える
https://github.com/vuejs/vue-function-api

---

- setup
- value
    - プリミティブ型で使う
- state
    - 配列やオブジェクトなど。(Vue.observable)
- computed
- watch


---

## ポータルが来る

body直下などにVueコンポーネントがおけるようになる

- モーダル・トーストの管理が非常に楽になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39134/2b1f3667-a2b1-2c07-326e-09ee6c9e7476.png)

z-indexでの管理が楽になる

---

## Nuxtはどうなる？

VueFes 2018の質疑応答の限りでは、Vue 3.0がリリースされ次第早めに対応したNuxtもリリースしたいとのこと。

---

## 準備しておく

---

## 非推奨、動作が変わるものを見直す

- slot
    - slot-scopeが非推奨に
    - v-slotを使う
- Vue.observable
    - 参照ではなくなるので、使っている場合は注意

---

## バージョンアップはきついか？

V1→V2がそこまでつらくなかったので大丈夫だと思いたい

## TypeScriptをやろう

Vue 3.0ではTypeScriptが全面的にサポートされる(はず)なので、今のうちにTypeScriptに慣れておこう。
コンポーネントのpropsがエディタ上で補完出るようになってほしい…(Reactではできるので)

## まとめ

- Function-based Component APIがくるぞ！
- TypeScriptをやろう

---

## ありがとうございました
gemでエラーは出た時の１つの解決方法(メモ書き)

gemをインストールした直後などにエラーが発生した時は、とりあえずrails s（サーバー）を立ち上げ直すことが１つの解決方法である。

特に、deviseというgemに関するエラーは、だいたいrails s（サーバー）を立ち上げ直せば、解決できることが多い。

したがって、gemをインストールした直後のエラーなどは、とりあえずrails s（サーバー）を立ち上げ直すことをやっておくと良い。
Nuxt.jsビギナーズガイド　ハマったこと

#CHAPTER4はじめでのこと。
#事象
projectを作成して、appフォルダに関連ディレクトリを移した。その後少し進めると、さっきまでできていたyarn devが通らなくなった。
yarn installを叩いて依存関係を修正するも、今度はelement-uiがうまく動かない。
SSRでレンダリングされたと思われる最初のうちはelement-uiが当たっているけど、読み込みが終わるとスタイルが崩れて、プレーンなテキストに戻ってしまう。

element-uiのel-menu-itemあたりでエラーが起きている。
よく見ると、SSRとクライアントで描画したDOMが不一致になっているとのエラーも混ざっている。

単純なタイポでもなさそうで、よくわからずにyarn create nuxt-appを数回試した。

#解決策と原因
よく考えずに.nuxtフォルダまでappディレクトリに移していたことが原因っぽい。
依存関係が崩れて、yarn installで修正したと思っても、よく見るとelement-uiのバージョンがどうのでwarning吐いてた。

.nuxtフォルダに触らない手順だと、特にエラー発生せず。

#P１０６ページ周辺でのこと。
##事象：
・ユーザー登録を実行すると、失敗のnotificationがでる。
・しかし、firebaseのDBを見てみると、ユーザ情報は登録されている。
・devtoolsでhttpのpatchに対して200[OK]のレスポンスが返ってきていることも見える
・登録したユーザー名でログインに成功する。
・ユーザ登録は実際にできているのに、失敗のnotificationしかでない。

##考察：
ユーザー登録まではできているのだから、patchを投げたところまでは良いはずと判断。
じゃあその次らへんか・・・？

そうしたらstoreに書いたregisterのロジックでtypo発見。$axios.$patchの結果を変数userに格納し忘れる痛恨のミスを発見。
これだと思って修正するも事象はなおらず。
あとは何があるんだろ。

この手のデバッグを効率よくやる方法を知りたい。。。

##原因
後日、改めて最初から写経しなおしたらすぐわかったのだけど、単純にthisを忘れたり、1行飛ばしたりしてただけだった。
深夜にやると、単純なこともわからなくなりがち。
任意の文字列の最初の2文字を最後尾に持ってきて その文字を出力するメソッド


任意の文字列の最初の2文字を最後尾に持ってきて その文字を出力するメソッドの作り方

ex)
left2('Hello') → 'lloHe'
left2('Ruby') → 'byRu'
left2('oh') → 'oh'

```ruby

def left2(str)
  left2 = str.slice!(0,2)
  puts str + left2
end
```

slice!メソッドを調べても出てこなかったので、ご存知の方は教えていただけると幸いです。


＜参考記事＞
・https://ref.xaio.jp/ruby/classes/string/slice
・https://ref.xaio.jp/ruby/classes/array/slice
・https://www.javadrive.jp/javascript/array_class/index8.html
flutter_inapp_purchaseを使った課金の実装

# はじめに
今年に入ってからFlutterばっか触ってます
とてもいいです

最近業務でiOSでの課金の実装をしたので、メモがてら書いてみます

なんでflutter_inapp_purchaseを使ったかというと、FlutterMeatUpのLTで課金のパッケージについて話されていた方がこれが一番いいと言っていた記憶があったので、これを使ってみました
# 準備
flutter_inapp_purchaseをpubspec.yamlに書きましょう

```pubspec.yaml
flutter_inapp_purchase:
```

書いたらこれを叩けばinstallできます
`flutter packages get`

# 実装
とりあえずコード貼っときます

```dart
// 困ったらここをみてください
// https://pub.dev/packages/flutter_inapp_purchase#-readme-tab-
import 'dart:async';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';

class InAppPurchase {

  Future<void> init() async {
    await FlutterInappPurchase.initConnection;
  }

  Future<void> dispose() async {
    await FlutterInappPurchase.endConnection;
  }

  //引数にはitemのIDみたいなのを渡す itunesConnectとかにあるやつ
  //商品のリストが帰ってくる
  Future<List<IAPItem>> getItems(List<String> productList) async {
    final List<IAPItem> _items = await FlutterInappPurchase.getProducts(productList);
    return _items;
  }

  //商品の購入
  //返り値は適当
  Future<PurchasedItem> purchaseItem(IAPItem item) async {
    try {
      final PurchasedItem purchasedItem = await FlutterInappPurchase.buyProduct(item.productId);
      return purchasedItem;
    } catch (e) {
      print('$e');
      return null;
    }
  }
}
```

軽く説明していきます。

とりあえずinitとdisposeは説明いらないですね。
使う時にinit呼んで、終わる時にdispose呼べばいいです

```dart
Future<List<IAPItem>> getItems(List<String> productList) async {
  final List<IAPItem> _items = await FlutterInappPurchase.getProducts(productList);
  return _items;
}
```
getItemsは、まず引数にAppStoreConnectで登録できる課金アイテムの製品IDをString型で渡します。
そうすると消耗型のアイテムや買い切りの非消耗型のアイテムを返してくれます。

ただiOSは定期購読のアイテムも`FlutterInappPurchase.getProducts()`で帰ってくるみたいです。
その逆もあって`FlutterInappPurchase.getSubscriptions()`で定期購読以外のアイテムも帰ってくるみたいなので、iOSに関して言えばどっちでもいいっちゃいいような気はしますね

```dart

  Future<PurchasedItem> purchaseItem(IAPItem item) async {
    try {
      final PurchasedItem purchasedItem = await FlutterInappPurchase.buyProduct(item.productId);
      return purchasedItem;
    } catch (e) {
      print('$e');
      return null;
    }
  }
```

ここはメソッドの名前を見ればわかるように。購入のところです。
getItemsで取ってきたItemを引数に渡します
購入したアイテムを返してくれます

ざっとこんな感じです

とりあえず、動かしたいんだ。という方は上のclassをコピペしてもらって、
よしなにしてもらえれば動くと思います。

#終わりに

リリース前にはSandBoxを使えばテストができるという知見を得られたし、
少し課金周りの知識がついたので、よかったです

他にどんなメソッドがあるのか、細かいパラメータとかが気になる方は、
https://pub.dev/packages/flutter_inapp_purchase#-readme-tab-
ここに全部書いてあるので参考にしてください

少しでも参考になれば嬉しいです
validationの日本語化

##実行環境
Ruby: 2.5.1
Rails: 5.2.3


##日本語に変換

デフォルトでは、英語でエラーが書かれていて下のように日本語にしたい。

<img width="621" alt="スクリーンショット 2019-07-01 01.26.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438198/69b89eee-e27b-e6fd-f465-4bda25906ed8.png">

エラーメッセージを日本語にするには、以下を追加してbundle install

```ruby:Gemfile
gem 'rails-i18n'
```
次にconfig/application.rbに以下を追加

```ruby:config/application.rb
module KotoKoto
  class Application < Rails::Application

    config.i18n.default_locale = :ja

  end
end
```
次にconfig/locales以下にja.ymlを作成します。そこで記述する文は任意のモデルによって変えてください。例としてuserモデルで書いています。

```ruby:locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        email: メールアドレス
        password: パスワード
        password_confirmation: 確認用パスワード
        remember_me: 次回から自動的にログイン
        name: 名前
        nickname: ニックネーム
        introduction: 自己紹介
```

userと書いているところは自分が指定したいモデル名。それ以下のemailなどはモデルのカラム名に適宜、日本語を設定してください。

##参考文献
以下のurlで詳しく書かれています。
[https://qiita.com/Ushinji/items/242bfba84df7a5a67d5b](https://qiita.com/Ushinji/items/242bfba84df7a5a67d5b)
rails s(サーバー)のエラー解決方法

#rails s コマンドが実行できないエラー
ターミナル上でrails s コマンドを終了させる時は、^(control)+cコマンドで終了できる。

しかし、うっかり右上の赤いマークを押して、
https://gyazo.com/7555fc3c236e57c09863261abe092e61
「強制終了させますか？」で「終了」のボタンを押してしまった。
https://gyazo.com/b453d2ffdcbb9fe9600765ab1c6cf03c

このようなサーバーの終了方法を実行すると、一旦はサーバーが終了する。しかし、次にターミナル上でrails s コマンドを実行しようとすると、以下のようなエラーが出て、サーバーが立ち上がらなくなる。

```
$ rails s
=> Booting Puma
=> Rails 5.2.3 application starting in development 
=> Run `rails server -h` for more startup options
A server is already running. Check /Users/okamotoryou/projects/nekotter/tmp/pids/server.pid.
Exiting

```
#エラーの原因
エラー文を読むと、「すでにサーバーは立ち上がっている」という内容が表示される。このようなエラーの原因は、正しくサーバーを終了させなかったことである。

#解決方法

以下のコマンドをターミナル上で入力するとサーバーを正しく終了させることができる。そして、次からちゃんとrails s コマンドを実行することができるようになる。

```
$ pkill -f puma
```
https://gyazo.com/4d005c594848cff8137d3ecb6d66dde7


＜参考記事＞
・https://qiita.com/kanuu/items/fd6e33fca6ad6a90d059
・https://qiita.com/motty93/items/d22c1eb8f5128f8cd7f8
・https://qiita.com/kanuu/items/fd6e33fca6ad6a90d059
RubyonRailsにまつわるマインドマップをsvgにしたよ

https://qiita.com/jnchito/items/063e332cbe3023f52f93
こちらに載っているマインドマップのソースを探していたのですが削除されているようで自分で作り直してみました。

![jap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/28d31a4d-2cef-9fba-f2d7-020d53f17f5c.png)

[svg形式はこちら](https://drive.google.com/file/d/1ccUTvKKTXQfnfxtQ9pKtXlLCAFLHGP7-/view?usp=sharing)


記事を元に日本語化して、リンクを入れてクリックするだけでgoogle検索に移動するようにしました。

これ作るときに使ったmindmupはgoogleと連携しやすくていいなと思ってたけどsvg出力するときにテキストが壊れちゃって残念な感じになってしまった。mindmapソフトガチャ失敗？

一応
[mindmupのソース](https://drive.google.com/file/d/1ZUX1cP5THt0npFojDdJbm_gUAq36cg6R/view?usp=sharing)
[英語版](https://drive.google.com/file/d/1oPZUGBQ5hx9OH3BAleOh7MmCOuB27KBG/view?usp=sharing)
元のマインドマップではどのソフトを使っていてどうやったらあんな風になるのか知りたい。
NanoPi Neo4 GrandPa DeskTopの使い方

# はじめに
NanoPi Neo4に私の父(91才)が使うDeskTopを作りました。GrandPa (おじいちゃん）DeskTopと言います。Neo4用のUbuntuにはFriendlyArmからもDeskTopが提供されていますが、日本語の導入、LibreOfficeのInstall等、ずぶの素人では難しい面もあり、また、自分でやるにはパッケージのサイズが大きいため時間がかかります。同じようなものなら多めに入っているDeskTopから要らないものを削除したほうが早いです。そこでFriendly Elec Desktopを日本語化しDisk Imageを公開することにしました。

# License
Ubuntuのライセンス条項及びFriendlyElecのライセンス条項に従います。完全に無保証で適用による損害賠償には応じません。

# 中文摘要
如何使用NanoPi Neo4的爷爷桌面包。

# 用意するもの
1. eMMC32GiB付き[NanoPi Neo4](https://www.friendlyarm.com/index.php?route=product/product&path=69&product_id=241)が走る環境 :1
2. 64GiB以上の USB Memry :1
3. 16GiB以上のmicroSD :1
4. USB3.0が付いたPC一式。USB2.0だと大変時間がかかります。OSはWindows,Linux等 :1

# 手順
1. GrandPa ImageをDownloadします。[grandpa20190703.zip](http://nanopi.laki.jp/grandpa20190703.zip) sha256sum grandpa.zip 617a39fb2ee48e1c10cdc661d77f1356bf6c5d79c9159c7240d67dbfbff539c2  
2. USB memをNTFSでformatします。
3. granpa.zipを解凍し、USB Memに平にコピーします。フォルダーを作って中に入れてはいけません。Etcherでは焼けません。
4. [FriendlyArmのNeo4 Download](http://download.friendlyarm.com/nanopineo4)以下のサイトからrk3399-eflasher-buildroot-＜日付＞.img.zipをDownloadします。
5. 今度は[Etcher](https://www.balena.io/etcher/)でmicroSDに焼きます。zipは解凍せずに焼けます。
6. Neo4に焼き終わったmicroSDとUSB memを挿して立ち上げます。
7. eflasherが立ちますのでUSB指定でeMMCにRestoreします。
8. microSD, USB memを取り外しbootします。
9.  User: pi, Passwd: nanoでloginします。
10.   必ず、root, piの **passwdを変更** してください。

# 結論

1. 出来合いのDeskTopを導入するのは非常に簡単です。
2. DeskTopを使用するだけならLinuxの知識はいりません。
3. 素のUbuntuを日本語化しLibreOfficeを入れるのはある程度の知識を要し時間と手間が掛かります。

# 謝辞
査読くださった皆さんに感謝します。
[NanoPIの部屋](https://www.facebook.com/groups/131561651024605/)の皆さん、いつも「いいね」をありがとう。
[FriendlyArm](https://www.friendlyarm.com/)のみなさん、素晴らしいSBCの提供に感謝します。このレポートはFA社より無償提供されたハードウエアで実験し作成しました。
貧弱な自サイトに変わり、DeskImageのDisk Spaceを提供していただいた匿名の某氏に感謝します。
はじめてのChrome拡張機能　ページをポップアップさせる

# はじめに
シングルディスプレイだと複窓をする機会がよくあります。時には3窓、4窓することもしばしば。そんな時に思うことがあります。

ブックマークバーとURLバー、邪魔だな......。


ということで、2クリックでポップアップウィンドウ化する拡張機能を作りました。

https://chrome.google.com/webstore/detail/popup-browser/mkcacjdndeohfnkioobenjpoifkecnjf

#準備

そもそもjavascriptの知識が十分になかったので１からやり直した。
[js-primer：ECMAScript 2018時代のJavaScript入門書](https://jsprimer.net/)


Chrome拡張機能については、色々読んだのですが結局公式のドキュメントが一番わかりやすかったです。
https://developer.chrome.com/extensions

#設計

とにかく簡単にポップアップさせたかったので、コンテキストメニュー（右クリックで開くやつ）から動作させるようにします。こんな感じ。
![無vvv題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422212/f8f72af7-e018-dcd3-279a-b1bba20e5a47.png)

超絶シンプルな機能なのでコードは短くできそうです。

#コードを書く
`manifest.json` はこのようになりました。 `permissions` にはタブを操作するための `"tabs"` とメニューをいじるための `contextMenus` を記述する必要があります。


```json:manifest.json
{
  "name": "popup browser",
  "description" : "Pop up browser",
  "version": "1.0.2",
  "manifest_version": 2,
  "permissions": ["contextMenus", "tabs"],
  "browser_action" :{
    "default_icon": "p.png"
  },
  "background": {
    "scripts": ["background.js"]
  },
  "icons": { "16": "p.png"}
}
```

参考：https://developer.chrome.com/extensions/manifest

公式で用意されている [Chrome APIs](https://developer.chrome.com/extensions/api_index) を利用して、中身を書いていきます。

```js:background.js
// コンテキストメニューに要素を追加する
chrome.contextMenus.create({
  title: "ポップアウトさせる", 
  id: "popout", 
  contexts: ["all"], 
  onclick: () => {
    // 現在開いているタブのURLを変数 tab に格納する
    chrome.tabs.getSelected(tab => {
      // 現タブを閉じて、
      chrome.tabs.remove(tab.id);
      // 新たにポップアップウィンドウでURLを開く
      chrome.windows.create({
        url: tab.url,
        type: 'popup',
        // Youtubeで丁度よく窓化できるサイズ
        width: 650, height: 450,
        focused: true
      });
    });
  }
});
```

それぞれ用いた API のドキュメントです。
https://developer.chrome.com/apps/contextMenus
https://developer.chrome.com/extensions/tabs
https://developer.chrome.com/extensions/windows

非同期処理を扱うコードを１から書くのは初めてなのでどこかおかしいかもしれない。
が、まあ動くので大丈夫！（本当？）

#おわりに

実際に使っているのですが、普通に便利で良いです。色々と作っていきたいですね。
ローカル上にLocalStackをDockerで実行

# はじめに

開発用にAWSのサービスをローカル環境に構築できる、LocalStackというプロジェクトがあります。
https://github.com/localstack/localstack 

今回はDockerを使ったLocalStackの実行方法をまとめます。

# 環境

OS: macOS Mojave 10.14.5
Docker: 18.09.0
Docker Compose: 1.23.2

# プロジェクトをプル

```
git clone https://github.com/localstack/localstack.git
cd localstack/
```

# サービスの指定
環境変数 `SERVICES` にカンマ区切りでサービス名を指定することで起動させたいサービスを選ぶことができます。
指定がない場合、全て指定と同意です。

指定できるサービスは以下の通り

|サービス|サービス名|エンドポイント|
|:------|--------|:-----------|
|API Gateway|apigateway|http://localhost:4567|
|Kinesis|kinesis|http://localhost:4568|
|DynamoDB|dynamodb|http://localhost:4569|
|DynamoDB Streams|dynamodbstreams|http://localhost:4570|
|Elasticsearch|elasticsearch|http://localhost:4571|
|S3|s3|http://localhost:4572|
|Firehose|firehose|http://localhost:4573|
|Lambda|lambda|http://localhost:4574|
|SNS|sns|http://localhost:4575|
|SQS|sqs|http://localhost:4576|
|Redshift|redshift|http://localhost:4577|
|ES (Elasticsearch Service)|es|http://localhost:4578|
|SES|ses|http://localhost:4579|
|Route53|route53|http://localhost:4580|
|CloudFormation|cloudformation|http://localhost:4581|
|CloudWatch|cloudwatch|http://localhost:4582|
|SSM|ssm|http://localhost:4583|
|SecretsManager|secretsmanager|http://localhost:4584|
|StepFunctions|stepfunctions|http://localhost:4585|
|CloudWatch Logs|logs|http://localhost:4586|
|STS|sts|http://localhost:4592|
|IAM|iam|http://localhost:4593|
|EC2|ec2|http://localhost:4597|

※ サービス名はaws cliのリファレンスから
http://docs.aws.amazon.com/cli/latest/reference/#available-services 

# 注意点: Dockerに割り当てるメモリが少ないと正しく起動しない

Dockerへのメモリ割り当てが少ないと、指定した全てのサービスが正しく実行されないことがあります。
例えば、以下のような elasticsearch の起動で実行エラーが発生します。

```
...
WARNING:infra.py: Service "elasticsearch" not yet available, retrying...
ERROR:infra.py: Error checking state of local environment (after some retries): Traceback (most recent call last):
...
```

だいたいメモリを __4 GB__ にすれば全てのサービスが実行できました。

多くのサービスを実行させたいときは、割り当ての量を増やすか、増やせないときは最小のサービスを指定して実行が必要です。


# Dockerで実行

## Docker Composeを実行
```
TMPDIR=/private$TMPDIR \
DATA_DIR=/tmp/localstack/data \
SERVICES=apigateway,kinesis,dynamodb,dynamodbstreams,elasticsearch,s3,\
lambda,sns,sqs,redshift,es,ses,route53,cloudformation,cloudwatch,\
ssm,secretsmanager,stepfunctions,logs,sts,iam,ec2 \
docker-compose up -d
```

`TMPDIR` : Macの場合は指定が必須
`DATA_DIR` : データの永続化のために指定
`SERVICES` : 実行するサービスを指定 (全てのサービスを実行する際は指定はいらない。上ではサンプルとして全てを列挙)

バックグランドで実行のために `-d` オプションをつけています。

ログの最後に `Ready` と出れば、起動完了です。
すると、デフォルトではDocker上に `localstack_localstack_1` という名前でプロセスが実行されていると思います。

## ホストOS起動時に自動で実行するように設定

ホストOSが再起動した際も自動で実行されるよう設定値を変更します。

```
docker update --restart=always localstack_localstack_1
```

# まとめ
これでAWSサービスをローカルで利用できる環境が整いました。
あとは、CLIやSDKで、各サービスのエンドポイントをLocalStackへ向けることで利用可能となります。
vueプロジェクトの`npm run build`がエラーになる

# vue cli で作成したプロジェクトのbuildができない

2019/06/30 12時頃、`vue create`で作成したプロジェクトの`npm run build`コマンドができなくなった。

以下のようなエラーが発生。

```terminal
$ npm run build

⠙  Building for production...Starting type checking and linting service...
Using 1 worker with 2048MB memory limit
⠸  Building for production...Unhandled rejection Error: original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.
    at SourceMapGenerator_validateMapping [as _validateMapping] (/Users/user_name/spring-sec-sample-app/src/main/resources/client-app/node_modules/webpack-sources/node_modules/source-map/lib/source-map-generator.js:276:15)
...
```

エラーをみる限り、`source map`の作成時にコケている？よう。


## 暫定対応1

そもそもビルド時に、`source map`を作成しないようにする。

vueプロジェクトの設定は、`vue.config.js`に書き込めば、vueがそのファイルを自動的に検知して読み込んでくれる。

デフォルトでは作成されないので、存在しない場合は自分で作成する。
階層はプロジェクトディレクトリのルートに配置する。

```terminal
$ vi vue.config.js
```

```javascript:./vue.config.js
module.exports = {
    // other config
    productionSourceMap: false
}
```

これでひとまず、エラーは回避できる。


## 暫定対応2

node modules の依存関係を自分で定義する。

```json:package.json
{
  "dependencies": {
    "core-js": "^2.6.5",
    "vue": "^2.6.10",
    "vue-class-component": "^7.0.2",
    "vue-property-decorator": "^8.1.0",
    "vue-router": "^3.0.3",
    "terser": "4.0.0"  // 追加
  },
}
```

上記のように、`terser`のバージョンを`4.0.0`に指定する。



## 原因

vueプロジェクトは`source map`作成時、内部的に依存している`terser`というライブラリを利用している。
その`terser`がv4.0.1を2019/06/30にリリースした模様。

https://www.npmjs.com/package/terser

その**v4.0.1でバグが紛れ込んだ**そうです。

issueが上がっていました。
https://github.com/terser-js/terser/issues/380



クライアントってモジュールの依存関係が複雑すぎて、こういう小さな変化がエラーを生み出すし、サーバに比べて極めて大変。。
依存する全てのモジュール理解している人とかいるのかな、、難しい。
Julia のパイプライン演算子と部分評価

Juliaにはパイプライン演算子があり、一引数の関数であればチェーンして書くことができる。

```julia
[1, 4, 1, 3, 2] |> sort |> unique
```

しかし1引数関数しか書けないというのはいかにも不便。例えば、`sort`には`rev`というフラグがあって、ソートの向きを変えられるのだけど、これも使えない。

もちろん、無名関数を使えばいいのだけど、ちょっと見通しが悪い。

```julia
[1, 4, 1, 3, 2] |> x -> sort(x, rev=true) |> unique
```

関数がcurry化というか部分評価できればいいわけなのだけど。ここでやりたいのは、第一引数以外の引数を与えて、第一引数だけを返す関数が作れればいいので、フルのcurry化というのもやりすぎ感ただよう。

ということでマクロの勉強を兼ねて部分評価するマクロを書いてみた。

```
add(x)
```
という式に対して、

```
(y) -> add(y, x)
```
という無名関数を返してやればいいわけだ。


```julia
macro partial(x)
    if typeof(x) == Expr
        if x.head == :call
            name = x.args[1]
            rest = view(x.args, 2:length(x.args))
            return esc(quote
                (y) -> $name(y, $(rest...))
            end)
        end
    end
    return x
end
```

このマクロは、引数が関数呼び出し型の式になっていた場合に、第一引数に引数を挿入する無名関数を返す。それ以外のときはとりあえず、受け取った式をそのまま返している。

このマクロを使うと、上のサンプルはこんなふうに書ける。

```julia
[1, 4, 1, 3, 2] |> (@partial sort(rev=true)) |> unique
```

文字数的には無名関数を使ったほうが短いぐらいなのだけど、新しい変数を導入しなくていいという点だけはこちらのほうがマシかな。

それにしてもJuliaのマクロ、ASTが直接いじれるのはいいけど、書きにくいなあ。。マクロに限らず、パターンマッチが貧弱だからか。この辺、強化されてほしい。


### 追記
2019/9/15 こちらもエスケープが足りていなかった。追加した。

また、`filter`などの場合は第一引数ではなく、第二引数を置き換えたい。
プレースホルダーマクロを使えばいずれの場合でも、

```julia
[1, 4, 1, 3, 2] |> (@ph sort(_, rev=true)) |> unique
```
のように書けるので、こちらのほうがいいかもしれない。
【脱jQuery】AjaxをFetch APIで実現する

ナウいAjaxのやり方として、Fetch APIのテストソースを書きました。
呼び先のAPIは天気を取得するOpenWeatherMapを使用しています。

```JavaScript:snippet.js 
var API_KEY = 'APIキーを設定';
var lon = '141.355539';
var lat = '43.067885';
var URL = `http://api.openweathermap.org/data/2.5/forecast?lat=${lat}&lon=${lon}&cnt=1&units=metric&APPID=${API_KEY}`;


(async ()=>{
    try{
        var res = await fetch(URL);
        var data = await res.json();
        console.log(JSON.stringify(data));
    }
    catch(err){
        console.log(err);
    }
})();
```
3D系ソフトの視点操作方法の一覧表（Unity,Blender,Sculptris,MagicaVoxel）

# 何
- 使用している3D系ソフトによって視点操作の方法が異なるため、一覧にして思い出しやすくした。
- Windows環境で動作確認

## 表

|  |Blender|Unity  |Sculptris  |MagicaVoxel  |
|---|---|---|---|---|
|**回転**  |中央ボタンDrag<BR>テンキー2,4,6,8  |Alt+左クリックDrag  |右クリックDrag <BR> 左クリックDrag(*1)  |右クリックDrag  |
|**平行移動**  |Shift+中央ボタンDrag  |Alt+中央ボタンDrag  |Alt+右クリックDrag  |中央ボタンDrag  |
|**拡大縮小**  |マウスホイール<BR>テンキー+/-  |マウスホイール  |マウスホイール <BR> Ctrl＋右クリックDrag  |マウスホイール  |
|**正面を向ける**  |テンキー1(前),3(横),7(上) <BR> (*2)  |シーンギズモ  |Shift+回転  |5  |
|**座標系**  |右手系  |左手系  |-  |右手系  |

- *1 オブジェクトがない場所で
- *2 180度逆はCtrlを押しながら各数字（例：後ろはCtrl+テンキー1）


## その他
- sculptrisの９つのブラシと、キーボードのFを中心とした９つのキーが位置で対応しているため、対応を覚える必要はなない。（例：scaleは、上段の右なのでT）

- blenderの操作は設定から変更可能（参考： http://kurone.info/blog/archives/672）
Microsoftが適当なこぼし配列とか名前を考えていたので改名を提案する

動的配列とこぼした配列の動作
https://support.office.com/ja-jp/article/%E5%8B%95%E7%9A%84%E9%85%8D%E5%88%97%E3%81%A8%E3%81%93%E3%81%BC%E3%81%97%E3%81%9F%E9%85%8D%E5%88%97%E3%81%AE%E5%8B%95%E4%BD%9C-205c6b06-03ba-4151-89a1-87a7eb36e531
>2018では、複数の値を返す Excel の数式 (配列とも呼ばれます) はすべて、隣接するセルに結果を返します。この動作は、こぼれると呼ばれます。

>複数の結果を返す可能性があるすべての数式は、動的配列数式と呼ばれます。現在複数の結果を返し、正常に流出している数式は、流出した配列数式と呼ばれることがあります。

>次に、これらの種類の数式を理解して使用するための注意点をいくつか示します。
>##流出は何を意味しますか?

流出とは、数式に複数の値が含まれていて、それらの値が隣接するセルに配置されていることを意味します。たとえば、配列を降順に並べ替える = SORT (D2: 1,-1)は、高さ10行の対応する配列を返します。ただし、左上のセル (この場合は F2) に数式を入力するだけで、セル F11 に自動的にダウンすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/9e0d5b4e-b813-5a21-e9ae-1679e3edad6c.png)

##Microsoftは日本を重視しているとか口先だけ過ぎ
なんだこの機械翻訳は。。。流出もこぼすもこぼしたもみなSpiil あるいはSpilledである。
こんなたった数行で訳語を統一できない機械翻訳とか普通は使わないでしょ。
しかも新製品の売りなのに。どこが日本市場を重んじているのか。侮辱するのもいい加減にしてほしい。そりゃ中国市場が広いですよ。だから無理はしなくてもいいけど、手を抜いている/コストが開けられないらしいのはまるわかりなのにぬけぬけと美辞麗句を並べるのはやめてほしい。

##機械翻訳もおかしいが英語もSpillを使っているのがおかしい
流出とはの項目の英語は次のようになっている。
What does spill mean?

Spill means that a formula has resulted in multiple values, and those values have been placed in the neighboring cells. For example, =SORT(D2:D11,1,-1), which sorts an array in descending order, would return a corresponding array that's 10 rows tall. But you only need to enter the formula in the top left cell, or F2 in this case, and it will automatically spill down to cell F11.

##Spillを使うのがおかしい理由
###Spillは不注意でこぼすというニュアンスがあり、意図的にこぼしているためあり得ない
Spillの意味を見ると
cause or allow (liquid) to flow over the edge of its container, especially unintentionally.
と意図的ではない意味が第一義である。この英語の解説自体がおかしい

###Spillは自動詞であって他動詞ではない
https://www.alc.co.jp/beginner/article/mouthbird/2015/03/post_1192.html
目的語が取れない自動詞の英文」は受動態が作れないのである。
またSpillは自動詞である
https://talking-english.net/spill/
したがってSpilled Arrayはこぼした配列になる。
しかしこれでは誰かが意図的に流出あるいはこぼしたことになり、本来不注意か悪意を持って流出させているSpillの原義はそこからして違う。

##というわけで対案をいうと
###結反配列（けっぱんはいれつ）
結果配列では変なので、結果を反映させた配列ということです
中国語だと反映结果的排列なので反结排列か、日本語と逆になります。

###結果配列
Result Array
配列数式の結果の配列というのなら、これでいいのでは。。。

###展開配列 拡展配列
Expanded Array
配列数式を「展開」したのだからこれでいいはず。いったいなぜ流出なのか。説明に困るでしょ。「君、なんだかその関数名前がやばいので使わない方がいいのでは？」
展開数式
扩展阵列
中国語の拡展配列など日中共通でよい。
というかこれが一番無理がないしわかりやすいよね。
Filter関数は展開した配列をフィルターする関数です。
とても分かりやすい。
Expansion Array
「君、便利そうだな、もっと教えてくれ」
って反応が違いすぎるよ。

###出力配列 導出配列 引出配列
OutPut Array
Exported Array
导出数组
配列数式を出力しているから
引き出しているから
配列数式から導出されているから

###とりあえず公式よりましなものしか思いつけない
個人的には展開配列もいいなあとおもえてきました。
あなたはどうですか？
そんなにこぼしたいですか？そんなに流出させたいですか？
メモ：AlibabaCloud DataVを使うときのMySQL設定

AlibabaCloud DataVとはこんな感じのダッシュボード機能。

![d1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/2177b0ff-4de4-a42d-ea80-d40930695c52.jpeg)


このグラフひとつひとつにSQLが記載されているのですが、
最短1秒間隔でクエリを投げることが可能。

当然、コネクションをそれなりに使ったり、接続待ちでタイムアウトが起きたりする。

なので、状況に応じて以下の値を変更する必要あり。

|parameter|value|
|----|----|
|max connection|1000以上|
|wait_timeout|288000|
|connect_timeout|288000|

上記値はサンプルだが、たくさんのSQLが走るとSQLクライアントまで切断されてしまうので、
connect_timeoutも変更した方がベター。。

ここら辺をつかって調査

```
SHOW GLOBAL STATUS
SHOW PROCESSLIST;
show global variables like '%timeout%';
```
データ構造をPythonで理解してみた

データ構造のスタックとキューの違いについて説明し、Pythonでコードを書いていきます。

# スタック
リストにデータを追加する際は一番最後に追加され、データを取り出す際には最も新しいデータを取り出すデータ構造のことです。
いわゆる、「後入れ先出し」のパターンです。


# キュー
リストにデータを追加する際は一番最後に追加され、データを取り出す際には最も古いデータを取り出すデータ構造のことです。
こちらは、「後入れ後出し」のパターンですね。


# Pythonで書いてみる
Pythonにはこれらのデータ構造を簡単に表現できる便利なメソッドが存在します。

- append()
 - リストの末尾に要素を追加します。「後入れ」を実行してくれます。
- pop()
 - リストの末尾の要素を削除します。「先出し」を実行してくれます。
- popleft()
 - 一番左側の要素を削除します。「後出し」を実行してくれます
 - このメソッドはcollections.dequeを使用した時のみ有効となるので、注意が必要です。



スタックの場合

```zsh
>>> lst = [1,2,3,4,5]
>>> lst.append(6)
>>> lst
[1,2,3,4,5,6]
>>> lst.pop()
6
```

キューの場合

```zsh
>>> from collections import deque
>>> lst = deque([1,2,3,4,5])
>>> lst.append(6)
>>>lst
deque([1,2,3,4,5,6])
>>> lst.popleft()
1
```

このようにPythonで書くと、正しくスタックやキューが実行されていることが分かります。


# まとめ
今回はデータ構造のスタックとキューについて説明してきました。
言葉での説明にピンとこない方は、Pythonでコードを書いて実行してみてはいかかでしょうか。