OmniAICreator/Qiita-1.07M huggingface dataset:
KotlinのローカルAWS Lambdaをデバッグ実行しました。

お疲れ様です。@naokiurです。
最近の業務中は、AWS Lambdaを構築しております。

業務中はPythonで書いているのですが、
前々から興味のあるKotlinでもやりたいなあと思い、
`AWS Toolkit for Intellij`を用いて、
ローカルでデバッグ実行できるように、
準備しました。

AWS Toolkitプラグインを導入している場合、
`AWS Serverless Application`プロジェクトを作ることができるのですが、
どんなKotlinプロジェクトの場合でもLambdaを作成することができるようになるために、
`なんの変哲もないKotlinプロジェクト`上で、
準備しました。


# 環境
* MacBook Pro (Retina 13-inch、Early 2015)
* Java 1.8.0_191
* IntelliJ IDEA CE 2019.1.3
* SAM CLI 0.14.2

# 実施したこと
* なんの変哲もないKotlinプロジェクトを用意する
* AWS SUM CLIで雛形を生成する
* Kotlin・Lambdaの構成を整える
* Runnerを作成する
* 実行！

## なんの変哲もないKotlinプロジェクトを用意する
なんの変哲もないKotlinプロジェクトを作成します。

<img width="829" alt="01.no-strange-kotlin-project.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129313/6db245e5-9e1c-dfc4-8d4c-2815f54e1f99.png">

なんの変哲もないですね。

## AWS SUM CLIで雛形を生成する
AWS Toolkitプラグインは、 `AWS SAM CLI`を前提としているので、
インストールされていると思います。

せっかくなので、AWS SAM CLIに雛形を作成してもらいます。

```shell
sam init -r java8 -d gradle
```

<img width="197" alt="02.sam-init.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129313/e3ce279c-c8b2-7864-1d23-69ce830b2050.png">


## Kotlin・Lambdaの構成を整える

### ソース移動
作成してもらった雛形の以下ファイルを、
任意のパッケージに移動します。

* App.java
* GatewayResponse.java

<img width="192" alt="03.move-java-file.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129313/1a2118bb-fd74-097c-7de5-628afe0ba6be.png">

### 依存性追加

ライブラリの依存関係をgradleファイルに追加します。

```gradle.build
dependencies {
    implementation "com.amazonaws:aws-lambda-java-core:1.2.0" // 追加
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}
```

ありがたいことにIntellijが教えてくれるので、
`import change`をします。

<img width="377" alt="04.import-change.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129313/b8de4df2-d897-28eb-6bce-8adda12eac42.png">

### Kotlin変換
移動したファイルをKotlinコードに変換します。
こちらもありがたいことにIntellijがやってくれます。

<img width="922" alt="05.convert-kotlin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129313/c270fcaa-9834-f1a2-18b2-4409df4eddc8.png">


```
自分が試した際、App.ktでコンパイルエラーが発生しまっていたので、こちらを修正しました。
* return br.lines().collect<String, *>(Collectors.joining(System.lineSeparator()))
* return br.lines().collect(Collectors.joining(System.lineSeparator()))
```

## Runnerを作成する
Lambda実行用のRunnerを作成します。

<img width="590" alt="06.runner-config-template.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129313/35476e86-441f-76b9-00ba-43079b1a4073.png">

Handlerには変換したAppクラスを指定します。

<img width="1257" alt="07.runner-config-content.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129313/5a43ae3b-cabd-0456-291d-4ff64b66b1ec.png">

## 実行！
デバッグ実行します。

<img width="603" alt="08.debug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129313/4cb68037-ca42-c0b6-6ee5-ab7cbe3cd8ba.png">

ブレークポイントで止まりました！！

これでKotlinでも、
ローカルでLambda開発ができますね！


# 結果
* Kotlinで書かれたLambdaを、ローカルでデバッグ実行することができました。

# 今後
* デプロイできるかをまだ試せてないので、試していきたいと思います。
* テストコードを書けるようになっていきたいと思います。
print()文の書式設定覚書(書きかけ)

# print文による書式設定
## %を使う方法
以下の型に対応する

|指定|データ型|
|:--|:--|
|%s|文字列|
|%d|10進整数|
|%x|16進整数|
|%o|8進整数|
|%f|10進float|
|%e|指数形式float|
|%g|10進floatまたは指数形式float|
|%%|%|
例

```
>>> print('%d' % 100)
100
>>> print('%f' % 100)
100.000000
>>> print('%e' % 100)
1.000000e+02
```

複数の変数を用いる場合は、タプルで与える(括弧が必要)

```
>>> print('%s is %d years old.' % ('Eri', 18))
Eri is 18 years old.
```

以下のようにすると幅の下限、文字列の上限、左寄せを指定できる。まずデフォルトでは以下のように表示される

```
>>> import math
>>> d = 10
>>> e = math.e
>>> s = 'apple pineapple pen'
>>> print('%d|%f|%s' % (d, e, s))
10|2.718282|apple pineapple pen
```

数字を指定すると最小幅指定となり、その幅に満たない場合はスペースで埋められ、それより長い場合はそのまま。

```
>>> print('%10d|%10f|%10s' % (d, e, s))
        10|  2.718282|apple pineapple pen
```

``-``を用いて左寄せにした

```
>>> print('%-10d|%-10f|%-10s' % (d, e, s))
10        |2.718282  |apple pineapple pen
```

`.`のあとに数字を書くと文字数の上限となり、それに満たない数字は0で埋められ、少数はその桁数に制限され、文字はその文字数に制限される

```
>>> print('%.5d|%.5f|%.5s' % (d, e, s))
00010|2.71828|apple
```

幅の下限、文字数の上限を同時に定めるとこうなる

```
>>> print('%6.5d|%6.5f|%6.5s' % (d, e, s))
 00010|2.71828| apple
```

幅の下限を文字数の上限より小さく指定したときは、指定しない場合と同じ

```
>>> print('%3.5d|%3.5f|%3.5s' % (d, e, s))
00010|2.71828|apple
```

文字数のそれぞれの指定は、変数で与えることも可能

```
>>> print('%*.*d|%*.*f|%*.*s|' % (0, 4, d, 6, 3, e, 0, 100, s))
0010| 2.718|apple pineapple pen|
```

##{}を使う方法
Python3から可能になった方法。こちらの書式では変数の順序を指定したり、繰り返し用いたりできる
【Atcoder】132E/Dijkstra法

今日の問題は[こちら](https://atcoder.jp/contests/abc132/tasks/abc132_e)

先日勉強したDijkstra法の発展です。
今回は有向グラフかつ、またひとつの頂点に3回まで(3の剰余の分だけ)止まってもと良いというように問題を言い換えることができます。ひとつの頂点に3種類の経路があり得るので、経路はd[ノード数][3]のベクトルとします。

入力例1の場合、頂点3に至るコストは一週目は2(→d[頂点3][2%3]に格納)、二週目は6(→d[頂点3][6%3]に格納)となり、dを更新して行きます。

答えはd[ゴールの頂点][0]　(→ゴールの頂点までちょうど3の倍数まで行け、その場合のコストを表す)を3で割って完了！！

##解法
```python
from heapq import *
f_inf = float('inf')

def dijkstra(start,node,edge):
    #始点sから各頂点への距離
    #node:頂点数
    #d:各頂点へのコスト(存在しないときはinf)
    #q:キュー(スタートからのコスト,頂点)
    d = [[f_inf, f_inf, f_inf] for _ in [0]*node]
    d[start][0] = 0
    #スタートをキューに入れる
    q = [(0,start)]

    while(len(q) != 0):
    #キューの先頭を取得
      ci,i = heappop(q)
    #キューの先頭から繋がっている頂点を探索
      for j in edge[i]:
        nc = ci + 1
        if (d[j][nc%3] > nc):
          d[j][nc%3] = nc
          heappush(q,(nc, j))
    return d
#入力
N,M = (int(x) for x in input().split())
#エッジ
E = [[] for _ in [0]*N]

for i in range(M):
  a,b = (int(x) for x in input().split())
  E[a-1].append(b-1)

S,T = (int(x)-1 for x in input().split())

d = dijkstra(S, N, E)
ans = d[T][0]

#出力
print(ans//3 if ans != f_inf else -1)
```

グラフ系はやっぱり苦手意識がすごい。。。
各頂点$x$回通る可能性がある場合、ノード数を$x$倍してしまえばいいんですね。
次こそ解けるようにしたい！
IPv6アドレスで外から知らないうちに侵入されないためにやること

自分用めも。

## まえおき

[家の回線をIPv6化](http://yusukeiwaki.hatenablog.com/entry/2018/10/15/%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89_%22%E9%9A%BC%22_%E3%81%AFPPPoE%E3%81%A7%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%AB%E4%BD%BF%E3%81%84%E7%89%A9%E3%81%AB%E3%81%AA%E3%82%89%E3%81%AA%E3%81%8B)して以来、「ルーターがあるから家の中は192.168.xxx.xxでしかアクセスできないし安全だ」とはならない。
（ルータの設定次第ではそういうこともできるんだけど、今使っているルータの相性的に駄目だったので、あえてそうしていない）

ということで、Linuxをクリーンインストールするたびに、やっておくことをメモ。

## 前提

* Debianでの手順
* 家のプライベートIPは192.168.10.xxx を想定している

## /etc/ssh/sshd_config

外からしれっとコンソールに入られるのが一番やばい。

```conf:/etc/ssh/sshd_config
PermitRootLogin no # ←コメントを外す

  (中略)

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
PermitEmptyPasswords no

  (中略)

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       ....
#

# ファイルの末尾に、以下を追記
Match Address 192.168.10.0/24
  PasswordAuthentication yes
```

で、 `sudo service ssh restart` する。これで外からSSHでブルートフォースアタックされてもある程度は大丈夫。

`.ssh/authorized_keys` に公開鍵の追記を忘れずに。

## /etc/hosts.allow,deny

外からポートスキャンされるのも嫌なので、SSH以外は受け付けないようにする。

```/etc/hosts.allowの末尾に追記

ALL : 192.168.10.
ALL : [1111:2222:3333:4444::1] # 例外的に外部から侵入を許すIPv6アドレス
sshd: ALL
```

```/etc/hosts.denyの末尾に追記

ALL : ALL
```
SpecsConfigurationConflictError: Requested specs conflict with configured specs.が出た時の対処

# はじめに
プログラマのためのDocker教科書第2版を写経していてタイトルのエラーが出たのでその対処法を。
基本的には各バージョンを最新化して、エラーの内容見て対応してみたってところです。

# 環境
macOS Mojave 10.14.5
Docker version

```
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false
```

# 問題の箇所
Dockerfileのここ。

```
RUN conda install --quiet --yes \
    'numpy=1.13.*' \
    'scipy=0.19.*' \
    'sympy=1.1.*' \
    'matplotlib=2.1.*' \
    && conda clean -tipsy && \
    fix-permissions $CONDA_DIR
```

# どう直したか
以下のように修正。
pythonのinstallの追加だけではダメだった。

```
RUN conda config --show-sources
RUN conda install --quiet --yes \
    'python=3.7.*' \
    'numpy=1.16.*' \
    'scipy=1.2.*' \
    'sympy=1.4.*' \
    'matplotlib=3.1.*' \
    && conda clean --all && \
    fix-permissions $CONDA_DIR
```

# 終わりに
写経そのままだとdeprecateも出るので以下も直しておいた。

```
conda clean -tipsy
```
から

```
conda clean --all
```

根本的にこう直せばいい、みたいなことがあればコメントもらえると嬉しいです。
Google Play Consoleの開き方

[Google Play](https://play.google.com/store)から「デベロッパー」リンクを踏む

↓↓↓

[Android Developer](https://developer.android.com/index.html)に飛ぶので上部の「Google Play」リンクを踏む

↓↓↓

[Android Developer](https://developer.android.com/distribute)内のGoogle Playパージに飛ぶので画面右のリンク「Play Consoleを起動」リンクを踏む

無事到達「https://play.google.com/apps/publish/?account=○○」に行く。
Eclipseのプラグインをオフラインインストールする

Eclipseを利用していますが、業務PCをネットに接続できないためMarketplaceからプラグインをインストールできません。
そのため、ネットに接続できるPCでプラグインをダウンロードして、業務PCにコピーしてインストールする方法を探しました。
[こちら](https://codeday.me/jp/qa/20181208/58153.html)と[こちら](https://qiita.com/takayuki206/items/e0de5e822a988ec814db)のページを参考にしました。

#プラグインダウンロードサイトアドレスの取得
- Marketplaceのダウンロードしたいプラグインのページからアドレスを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225812/678d87d7-4ce7-3c2d-9aa0-210cc6c18687.png)

# プラグインをダウンロード
- eclipse.exeのフォルダに移動してコマンドプロンプトを立ち上げる。
- 下記のコマンドを実行する。(＄1:ダウンロードサイトのアドレスに置き換える。＄2:ダウンロード先のローカルフォルダに置き換える。)

```
$eclipse_home/eclipse -application org.eclipse.equinox.p2.artifact.repository.mirrorApplication -source $1 -destination $2
$eclipse_home/eclipse -application org.eclipse.equinox.p2.metadata.repository.mirrorApplication -source $1 -destination $2
```

例）Overview plugin for Eclipseをローカルフォルダd:wkにダウンロードしたい場合

```
eclipse.exe -nosplash -verbose -application -application org.eclipse.equinox.p2.metadata.repository.mirrorApplication -source http://cdn.rawgit.com/sandipchitale/sandipchitaleseclipseplugins/master/text.overview.updatesite/ -destination d:/wk
```

# ダウンロードしたプラグインのインストール
- 「ヘルプ」→「新規ソフトウェアのインストール」で、ダウンロードしたディレクトリを指定する。
論文紹介-#1 Dense 3D Face Decoding over 2500FPS: Joint Texture & Shape Convolutional Mesh Decoders

## 論文紹介-#1 
[落合先生のフォーマット](https://www.slideshare.net/Ochyai/1-ftma15?ref=http://lafrenze.hatenablog.com/entry/2015/08/04/120205)を元に論文をまとめ紹介していく記事です。

今回は、CVPR2019の[Dense 3D Face Decoding over 2500FPS: Joint Texture & Shape Convolutional Mesh Decoders](https://arxiv.org/pdf/1904.03525.pdf)という論文を紹介します。
至らないところばかりなのでツッコミお待ちしてます！

## どんなもの？
3DMMsという、画像から3Dモーフィングを生成するモデルを改良した論文。
本論文では顔画像に対して適用している。

## 先行研究と比べてどこがすごい？
線形あるいは非線形のデコーダーを持つ先行の3DMMsは、全結合層あるいはアンラップされたUV空間の2Dconv層でモデル化され、大規模なパラメタを必要とした。また、shapeとtextureを別々に求めていた。
本論文では、mesh convolutionを使うことでshapeとtextureの両方を直接求め、モデルサイズの縮小化(decoder size: 17MB, decode: 2500fps on  CPU/Intel  i9-7900X@3.30GHz)を実現した。
これにより3Dshape推測システム全体として300fpsという結果を得た。
<img width="300" alt="スクリーンショット 2019-06-30 15.22.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218202/7f5ab2b6-7fb6-d2c4-9c6b-63cd6e3ebcec.png">

## 技術や手法のキモはどこ？
直接shapeとtextureを求めるmesh convolutionを使ったdecoder

## どうやって有効だと検証した？
3DMDデータセットと300W-LPデータセットを使い、既存研究とreconstructionの精度を比較した。
<img width="250" alt="スクリーンショット 2019-06-30 15.12.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218202/ac9c16e4-d3c6-c8ac-1544-dcc19b67184d.png"><img width="250" alt="スクリーンショット 2019-06-30 15.22.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218202/d984b30c-a1bb-5725-3044-de010874e615.png">

また、笑顔などの顔の属性値を付与することでモデルの表現力を評価した。
<img width="140" alt="スクリーンショット 2019-06-30 15.13.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218202/d49869bd-a86c-1cb4-99dc-6d13a62c63ab.png">


また、AFLW2000-3Dデータセットにおける3D face alignmentのタスクにおいても、3DDFAやN-3DMMよりは高く、PR-NETとは若干劣るぐらいの精度を見せた。
<img width="302" alt="スクリーンショット 2019-06-30 15.17.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218202/71a37206-6068-2631-dff9-6f47f8bb69cc.png">

## 議論はある？
言及なし

## 次に読むべき論文は？
[Joint 3d face reconstruction and dense alignment with position map regression network](http://openaccess.thecvf.com/content_ECCV_2018/papers/Yao_Feng_Joint_3D_Face_ECCV_2018_paper.pdf)
2次元平面の座標を雑に放り込んで取り出せるArrayListの作成

#概要
2次元配列で2次元平面の座標を生成し、それをArrayListに随時放り込めるプログラムを作成しました。

##詳細
現在、壁伸ばし法を使用した迷路生成アルゴリズムを四苦八苦しながら作成中なのですが、その途中で「構築中の壁の座標を記録していく何か」を用意しなければならないことに気づきました。
(参考サイト:[迷路生成アルゴリズム(壁伸ばし法)](http://algoful.com/Archive/Algorithm/MazeExtend))

壁の生成はランダムに行われるので、記録すべき座標=要素数は一定しません。そこで、以下の画像のようなモノがあれば良いなとぼんやり考えつきます。

![伸縮自在な座標入れ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278439/7ddc24d6-c552-6b6f-be5d-61e88a0512cc.png)

色々と調べた結果、Javaに存在するArrayListなるものが「長さを勝手に伸ばしてくれる配列的なもの」だということを知りました。ただ、自分の調べ方の問題なのでしょうが、扱ってあるのはint型やString型が多く、配列を扱っているものが見当たりませんでした。

そこで、2次元配列を取り扱えるArrayListの作成を試み、一定の動作が行われるようになったので、記録ついでに以下に示していきます。なお、作成にあたっては以下のサイトを参考に致しました。
(参考:[ArrayListに多次元配列](https://okwave.jp/qa/q7330825.html))

###手順
(1)ArrayListの作成
(2)代入用の2次元配列の生成
(3)addコマンドを使用し、(2)で生成した配列をArrayListに追加する
(4)getコマンドを使用し、(3)で追加したデータを読み込む

```java:Generics.java
import java.util.ArrayList;

public class Generics{
	public static void main(String[] args){
		/*
		2次元配列をArrayListに追加し、値を取得するプログラム
		→追加する際には配列を生成してarray.add
		→値を取得する際にはarray.get
		*/
		
		ArrayList<Integer[]> array = new ArrayList<Integer[]>();
		System.out.println("---------------point1------------------");
		
		Integer[][] point1 = {{6,7}};
		array.add(point1[0]);
		System.out.printf("(x,y)=(%d,%d)\n",array.get(0)[0],array.get(0)[1]);
		
		System.out.println("---------------point2------------------");
		
		Integer[][] point2 = {{7,4},{2,1}};
		array.add(point2[0]);
		array.add(point2[1]);
		System.out.printf("(x,y)=(%d,%d)\n",array.get(1)[0],array.get(1)[1]);
		System.out.printf("(x,y)=(%d,%d)\n",array.get(2)[0],array.get(2)[1]);
		
		System.out.println("---------------point3------------------");
		
		Integer[][] point3 = {{1,2},{4,6},{3,6}};
		array.add(point3[0]);
		array.add(point3[1]);
		array.add(point3[2]);
		System.out.printf("(x,y)=(%d,%d)\n",array.get(3)[0],array.get(3)[1]);
		System.out.printf("(x,y)=(%d,%d)\n",array.get(4)[0],array.get(4)[1]);
		System.out.printf("(x,y)=(%d,%d)\n",array.get(5)[0],array.get(5)[1]);
		
		/*実行結果
		---------------point1------------------
		(x,y)=(6,7)
		---------------point2------------------
		(x,y)=(7,4)
		(x,y)=(2,1)
		---------------point3------------------
		(x,y)=(1,2)
		(x,y)=(4,6)
		(x,y)=(3,6)*/
	}
}
```

###余談
総じて、「とりあえず動くようにはなったけど、何がどう行われているかはよくわからない」プログラムです。
特に、ArrayListの宣言においては、なぜその書き方で生成と取得がうまくいくのかが全くわかりません。
おそらく、そもそもArrayListが何なのかがよくわかっていない上に、ジェネリックスというこれまたよくわからないものが重なって、二重によくわからなくなっているのが原因でしょう。

「ここまでよくわからないものをよくわからないまま扱っていくなら、適当にクラスを作ってリストにしたほうが良いのでは？」とも思います。多分、もっと効率の良い書き方があるのでしょう。

とりあえず、今後は迷路作成の傍ら、
・ArrayListとは何なのか
・ジェネリックスとは何なのか
を更に調べる予定です。
TSVを読み込みテキストファイルを置換するpython

割と自分用の備忘録
## 使い方
```
python tikan.py TSVファイル 置換するファイル (出力ファイル)
```
## 中身
```tikan.py
import sys
deffo='置換後.txt'

dic={}

f = open(sys.argv[1],'r')
line = f.readline().split("\t")
while line[0]:
    dic[line[0]]=line[1].replace('\n', '')
    line = f.readline().split("\t")
    if len(line) > 2:
        print("有効なTSVではありません")
        sys.exit()
f.close
# 例えばfunctionを関数、functionalを機能的に置換したい場合functionを先に置換すると関数alとなって失敗するので、置換に優先順位をつける
order= sorted(dic.keys(), key=lambda x:len(x),reverse=True)

with open(sys.argv[2],'r') as f:
    result=f.read()
for o in order:
    result=result.replace(o,dic[o])
if len(sys.argv) > 3:
    deffo=sys.argv[3] 
with open(deffo,'w') as f:
    f.write(result)
```

## 気になったこと
ファイルの読み書きって一行でできないのかしら。
統計入門　検定のまとめ

## 統計量z

```math
z=\frac{\bar{x}-\mu}{\sqrt{\frac{\sigma^2}{n}}}
```

## 統計量t

```math
t=\frac{\bar{x}-\mu}{\sqrt{\frac{s^2}{n}}}
```

# 対応のある2標本t検定

```math
t=\frac{\bar{d}-\mu}{\sqrt{\frac{s^2}{n}}}
```

# 対応のない2標本t検定

```math
t=\frac{\bar{x}_1-\bar{x}_2}{\sqrt{s^2\left(\frac{1}{n_1}+\frac{1}{n_2}\right)}}=\frac{\bar{x}_1-\bar{x}_2}{s\sqrt{\frac{1}{n_1}+\frac{1}{n_2}}}
```

# 母比率の検定

```math
z=\frac{\hat{p}-p_0}{\sqrt{\frac{p_0(1-p_0)}{n}}}
```

# 二項分布の検定

```math
z=\frac{X-np}{\sqrt{np(1-p)}}
```

# ポアソン分布の検定

```math
z=\frac{X-n\lambda}{\sqrt{n\lambda}} = \frac{\frac{X}{n}-\lambda}{\sqrt{\frac{\lambda}{n}}}
```

# 適合度の検定

```math
\chi^2=\frac{(実測値_1-理論値_1)^2}{理論値_1}+\frac{(実測値_2-理論値_2)^2}{理論値_2}+\dots+\\　\frac{(実測値_n-理論値_n)^2}{理論値_n}
```

# 独立性の検定

```math
理論値=\frac{f_i\times f_j}{n}
```

```math
\chi^2=\frac{(実測値_1-理論値_1)^2}{理論値_1}+\frac{(実測値_2-理論値_2)^2}{理論値_2}+\dots+\\　\frac{(実測値_n-理論値_n)^2}{理論値_n}
```

# 母比率の差の検定

```math
z=\frac{\hat{p_1}-\hat{p_2}}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1}+\frac{1}{n_2}\right)}}
```

```math
\hat{p}=\frac{n_1\hat{p_1}+n_2\hat{p_2}}{n_1+n_2}
```
指定プロジェクト内のサイズ容量確認

EC2で立ち上げたRailsアプリケーションの容量を確認しようと使ったコマンドを紹介します。

通常、フォルダ内の容量を確認する場合、以下のコマンドを使うのが一般的ですがカレントディレクトリにフォルダやファイルが多い場合その全てが表示されてしまい見えずらくなってしまいます。

```
$ du -h
```

カレントディレクトリのフォルダごとに確認したい場合は以下のコマンドを使用します。

```
$ du -sh app # 検索したいフォルダ名
```

しかし、このコマンドではRailsアプリケーション内のルートフォルダ全ての容量を確認したい場合、１つ１つフォルダを指定する必要があります。
なので、以下のようにカレントディレクトリをパイプで繋ぐ方法を採用しました。

```
$ ls | xargs du -sh

4.0K	Gemfile
8.0K	Gemfile.lock
4.0K	README.md
4.0K	Rakefile
188K	app
32K	bin
112K	config
4.0K	config.ru
28K	db
12K	lib
20K	log
4.0K	package.json
20K	public
4.0K	storage
60K	test
45M	tmp
236M	vendor
```

これで、Railsアプリケーション内のルートフォルダ全ての容量を確認することができました。

# おまけ

トータルの容量も一緒に表示させたい場合は以下のコマンドを使用します。

```
$ ls | xargs du -shc

4.0K	Gemfile
8.0K	Gemfile.lock
4.0K	README.md
4.0K	Rakefile
188K	app
32K	bin
112K	config
4.0K	config.ru
28K	db
12K	lib
20K	log
4.0K	package.json
20K	public
4.0K	storage
60K	test
45M	tmp
236M	vendor
281M	合計
```
Eclipse ショートカット (Mac版)

# 発端
Qiitaの @ariwa さんの[新人研修でドヤ顔で披露したらウケたEclipseのショートカット集](https://qiita.com/arai-wa/items/c2eb7387b5bf37b4ace4)の記事を見て、Macだとどうなのだと調べた内容です。元記事がベスト２０でカウントダウン方式で掲載されていたので、下表もその順序に従っています。(最後は番外の分)
なおWindows版については[元記事](https://qiita.com/arai-wa/items/c2eb7387b5bf37b4ace4)をご参照のほど！

# @ariwa さんの「[新人研修でドヤ顔で披露したらウケたEclipseのショートカット集](https://qiita.com/arai-wa/items/c2eb7387b5bf37b4ace4)」より

|ショートカット|機能|
|:----------------|:--|
|`[ctrl] + ⌥ + K`|スネークケースとキャメルケースの切り替え(*1)|
|`⌘ + ⇧ + o`|import文の編成||
|`⌥ + l`|区切りの良い場所へカーソル移動(左)|
|`⌥ + r`|区切りの良い場所へカーソル移動(右)|
|`[ctrl] + [space]`|テンプレート・プロポーザル|
|`⌘ + e`|タブを検索|
|`⌥ + ⌘ + c`(*2)|メソッドのシグネチャ変更|
|`[ctrl] + ⇧ + ⇟`|選択範囲の拡大|
|`[ctrl] + ⇧ + ⇟`|選択範囲の縮小|
|該当なし(*3)|定数を抽出|
|`⌘ + .`|次の警告・エラーへジャンプ|
|該当なし(*4)|ローカル変数の抽出|
|該当なし(*5)|ファイル検索|
|`[ctrl] + [space]`(*6)|変数名補完|
|`⌘ + 1`|クイック・フィックス(*7)|
|`⌘ + ⇧ + f`|コードフォーマット|
|`[ctrl] + [space]`(*6)|クラス直下でメソッド名だけを書いてメソッド作成|
|`⌘ + ⌥ + ←`|戻る|
|`⌘ + ⌥ + →`|進む|
|`⌘ + d`|行削除|
|`⌘ + ⌥ + r`|名前変更|
|`⌘ + /`|コメントアウト(解除)|
|`[ctrl] + ⌥ + h`|呼び出し階層を開く|
|`⌘ + o`|クイック・アウトライン(*8)|

(\*1) 大文字のスネークケースをキャメルケースに変換、そのあともう一度スネークケースにすると全て小文字になるので`[ctrl] + ⌥ + U`を併用して大文字に変えましょう。
(\*2) Eclipse 202106 版ではデフォルトでキーバインドが設定されていたので更新。 効かない場合は従前通り`[ctrl] + ⌘ + t` でリファクタリング・メニューをポップアップ表示できるので、メニューからカーソルキーを使って「メソッド・シグニチャーの変更」を選択できます。メニューをショートカット・キーで選ぶことはできません。
(\*3) `[ctrl] + ⌘ + t` でリファクタリング・メニューをポップアップ表示できるので、メニューからカーソルキーを使って「定数を抽出」を選択できます。メニューをショートカット・キーで選ぶことはできません。
(\*4) `[ctrl] + ⌘ + t` でリファクタリング・メニューをポップアップ表示できるので、メニューからカーソルキーを使って「ローカル変数の抽出」を選択できます。メニューをショートカット・キーで選ぶことはできません。
(\*5) フルキーボード操作が有効であれば、`[ctrl] + [F2]`でメニューバーをキーボード操作できるので、「検索」-->「ファイル検索」と辿ることはできますが、トラックパッドに手を伸ばすのとどちらが遅いか早いかという話ですね。
(\*6) macOSの日本語環境は、`[ctrl] + [space]`のデフォルト・キー・バインディング(日本語入力ソースの選択)で使用されているのでコンフリクトを解消する必要があります。macOS側の場合、「システム環境設定」-->「キーボード」と選択して、表示されたウィンドウの「ショートカット」タブにある「入力ソース」-->「入力メニューの次のソースを選択」の設定を変えられます。
(\*7) 元記事では「エラーや警告の箇所を選択してctrl + 1 修正方法を教えてくれる」と表現されています。手元の環境(Eclipese 4.8.0)上では上に示したように「クイック・フィックス」と称されています。
(\*8) 元記事では「アウトライン表示」と表現されています。手元の環境(Eclipese 4.8.0)上では上に示したように「クイック・アウトライン」と称されています。

# ついでにまとめておこう！っと
他に自分がよく使うものなども紹介しておきます。

|ショートカット|機能|説明|
|:--|:--|:--|
|`⌘ + ⇧ + g`|参照検索(ワークスペース)|カーソル位置の要素を参照している箇所の検索|
|`⌘ + ⇧ + t`|型を開く|クラスを開く|
|`⌘ + ⇧ + r`|リソースを開く|ファイル名を開く|
|`[F3]`|宣言を開く|要素の宣言を開く|
|`⌘ + T`|クイック型階層|型階層を表示(*a)|
|`⌘ + ⇧ + l`|アクティブなキーバインドを表示|一覧をリスト表示する(今回見つけました！ (^^;)|
|`⌘ + [F12]`|エディターをアクティブにする|他のビューからエディターへ移動|
|`[ctrl] + ⇞`|左のタブへ移動|現在のエディターの左側のタブへ移動|
|`[ctrl] + ⇟`|右のタブへ移動|現在のエディターの右側のタブへ移動|
|`⌘ + ⌥ + a`|矩形選択|通常の編集状態とのモードの切り替え|

(*a) `[F3]` でインターフェースのメソッドを開くとインターフェースが開いてしまいます。クイック型階層を開くと実装クラスを指定して宣言を開くことができます。
Python の systemd service のファイルIO

Raspbian 上で動く Systemd Service を Python でログを取りたいときのメモ．
Raspbian に限った話ではないかもしれない．

# `.service` ファイル

```:logwrite.service
[Unit]
Description = Log write test

[Service]
ExecStart = path/to/main.py

[Install]
WantedBy = multi-user.target
```

# ファイルに書いてくれないコード

※ Systemd Service として実行しなければ（`python3 main.py` などとすれば）このコードでも書き込める．

```python:main.py
#!/usr/bin/python3

from writer import LogWriter


if __name__ == '__main__':
    writer = LogWriter('path/to/logfile')
    writer.write('foo')
    writer.write('bar')
    writer.write('baz')
    writer.close()
```

```python:writer.py
import csv
import time


TIME_FORMAT = '%y/%m/%d;%H:%M:%S'


class LogWriter:
    def __init__(self, path):
        self.logfile = open(path, 'a')
        self.writer = csv.writer(self.logfile, lineterminator='\n')

    def write(self, data):
        self.writer.writerow([time.strftime(TIME_FORMAT), data])

    def close(self):
        self.logfile.close()
```


# ファイルに書いてくれるコード

`main.py` で `open` した．

```python:main.py
#!/usr/bin/python3

from writer import LogWriter


if __name__ == '__main__':
    logfile = open('path/to/logfile', 'a')
    writer = LogWriter(logfile)
    writer.write('foo')
    writer.write('bar')
    writer.write('baz')
    writer.close()
```

```python:writer.py
import csv
import time


TIME_FORMAT = '%y/%m/%d;%H:%M:%S'


class LogWriter:
    def __init__(self, logfile):
        self.logfile = logfile
        self.writer = csv.writer(logfile, lineterminator='\n')

    def write(self, data):
        self.writer.writerow([time.strftime(TIME_FORMAT), data])

    def close(self):
        self.logfile.close()
```
$ rails db:migrate:reset できない　windows

# $ rails db:migrate:reset できないときのたい処理法（windows）


Railsチュートリアル10章をやってる途中、コマンドラインで$ rails db:migrate:resetを打ったがエラーが出た。


```console

$ rails db:migrate:reset

```

```error
Permission denied @ apply2files - C:/Ruby_program/sample_app/db/development.sqlite3
Couldn't drop database 'db/development.sqlite3'
rails aborted!
Errno::EACCES: Permission denied @ apply2files - C:/Ruby_program/sample_app/db/development.sqlite3
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)

```
#原因
Railsのバグらしく、根本的にwindowsでは自らがアクセスしているファイルを削除できないとのこと

# 解決策
コマンドで直接、db/development.sqlite3のファイルを消し、db:create db:migrateを行う

```
$ rm db/development.sqlite3
$ rails db:create db:migrate
```
こうするとエラーが発生せず、マイグレーションし直すことができた。

# まとめ
```
$ rails db:reset
```

```
$ rm db/development.sqlite3
$ rails db:setup
```
は等しい。また、

```
$ rails db:migrate:reset
```

```
$ rm db/development.sqlite3
$ bin/rails db:create db:migrate
```
と等しい。


# 補足
ruby 2.6.3p62 (2019-04-16 revision 67580) [x64-mingw32]
Rails 5.2.3
EC2インスタンスに対して、ファイルを送信する

調べるいろんなやり方が出てくるが結構うまくいかないことが多いので、
うまくいった方法を忘備録として残しておく

```
scp -i [秘密鍵のパス] [送信したいファイル] [EC2インスタンスのユーザー名]@[EC2インスタンスのHost]:[格納先パス]
```
PythonでMtGライフを便利にするDiscordbotを作る

## はじめに
ここでいうMtGってのは超有名カードゲームであるところのMagic the Gatheringのことです。
仕事効率化の記事ではありませんので、ご了承ください。

また、当BOTはwisdomguild様の許諾の下で作成しております。
類似のBOT等を作成する際には、必ずwisdomguild様の許諾を得てから作成してください。
## 参考にしました
 - [Pythonで簡単なDiscord Botの作り方](https://qiita.com/PinappleHunter/items/af4ccdbb04727437477f)
 - [wisdom guild様のapiリファレンス](http://wonder.wisdom-guild.net/api/card-price/manual.php)

## つくったもの
「/howmuch "カード名"」と入力すると、最安値などの情報をまとめて表示してくれます。
![howmuch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296342/0301dba2-a1e9-12db-6034-3830630aa6f9.png)

スラング検索には対応していませんが、「ホガーク→≪蘇る死滅都市、ホガーク≫」といったような部分一致検索には対応しております。
また、「コラガン→≪龍王コラガン≫≪嵐の憤怒、コラガン≫」といったような、１つのワードに対して候補が複数あるワードにも対応しておりません。ご了承ください。

## ソースコード
[Github : kamase14](https://github.com/kamase14/howmuch)

## 動作原理
（例：思考囲い）
→ チャット欄「/howmuch 思考囲い」と入力
→ scryfallAPIでカード名の部分一致検索（ここでは思考囲いが返ってくる）
→ wisdomguildAPIでカードの金額データを取得
→ discord上のチャット欄に出力

といった流れになっています。おおざっぱなものなので、詳しい原理はgithubを見るか[twitter](https://twitter.com/1kme)で僕に直接聞いてください。

## 謝辞
当BOTは、Scryfall様のAPIとwisdomguild様のAPIによって成り立っております。
この場を借りて謝辞を申し上げます。
ざっくりと理解するSwift同期処理

#概要
同期処理を実装する機会があったのでまとめた
syncとasyncの二種類ある
(7/1 syncの部分がasyncになっていたので修正しました)

### async: 他のスレッド処理終了を待機しない

```swift:async
DispatchQueue.global().async {
  print("global thread start.")
  //何か重い処理
  print("global thread end.")
}
DispatchQueue.global().async {
  print("main thread start.")
  //何か重い処理
  print("main thread end.")
}

# result
global thread start.
main thread start.
global thread end.
main thread end.
```

```code:async
start==(Thread 1)==>end  
start==(Thread 2)=====>end
```
いわゆる並列処理
重い処理の裏で別処理を動かしたいときなどに使える


### sync: 他のスレッド処理終了を待機する

```swift:sync
DispatchQueue.global().async {
  print("global thread start.")
  //何か重い処理
  print("global thread end.")
}
DispatchQueue.global().sync {
  print("main thread start.")
  //何か重い処理
  print("main thread end.")
}

# result
global thread start.
global thread end.
main thread start.
main thread end.
```
```code:sync
start==(Thread 1)==>end  start==(Thread 2)====>end
```

いわゆる直列処理
クリティカルセクションなどに使える
SQL ServerでOPENQUERYを使い、ストアドから結果セットを取得する

1時間以上かかっていたクエリが1秒程度になりました。

# 実現したいこと
- とあるBIツールでデータをインポートするクエリが遅いのを改善したい。
    - ```SELECT * FROM <VIEW>``` としているだけだが、VIEW内で集計や結合などをWITH句を駆使して実現している。
    - BIツール側では複雑なクエリを記述できないので、遅いVIEWを何とかしたい。
    - テーブル側は毎日洗い替えされるテーブルのため、インデックス追加は難しい。
    - VIEWのSQLに結合ヒントを設定するなどである程度は改善されるが、十分ではない。

# 改善案として考えたこと
- VIEWをSPに置き換える。
- SP内でローカル一時テーブルを作成、クラスター化インデックスを追加して結合条件や集計の速度を向上する。
- BIツール側のインポートクエリでOPENQUERY関数を使い、SPから結果セットを取得する。
    - OPENQUERY関数はリンクサーバでSQLを実行し、結果セットを返す関数。
    - BIツール側インポートクエリ
        - ```SELECT * FROM OPENQUERY(<LinkedServerName>, 'EXEC <sp_name>')```
    
# 実現可能かの検証
## 手順
1. SQLServerに自分自身をリンクサーバとして登録する。
2. 簡単なSPを作成し、結果セットを返す。
3. BIツール側でインポートクエリを記述する。
4. インポートを実行する。

## 結果
- 期待通りの結果が得られることを確認。

# プロダクトコードにした際に発生した問題と解決策
## 問題
- ローカル一時テーブルをSP内で使用している場合、OPENQUERY関数がエラーとなる。
    - OPENQUERY関数を呼び出すと、```sys.sp_describe_first_result_set```が呼び出されてSPの返す結果セットのメタデータを取得しているらしく、ローカル一時テーブルを使っているとエラーとなってしまう。

## 解決策
- OPENQUERY関数内でEXECする際に、```WITH RESULT SETS```で結果セットの型を明示する。
    - ```EXEC <sp_name> WITH RESULT SETS ( ([ID] INT NOT NULL, [NAME] NVARCHAR(100) NULL) )```
- これで問題が解消することを確認できた。

## メンテナンス性を向上するための工夫
- BIツールでは、同データを何度もインポートするため、複数個所での記述が必要となる。項目追加や修正をBIツール側で複数個所修正するのはメンテナンス上望ましくない・・・
- ユーザー定義テーブル型を作成し、```WITH RESULT SETS``に指定することで記述を1か所にまとめられるのではないか？
    - 実現できる。ただし、リンクサーバの設定時にDB名を指定する必要があるので注意が必要。
昔書いたSlack通知Shellスクリプト

## 概要

昔描いたビルド通知用のスクリプトがあったので残しておく
curl で GitHub からスクリプトを取得し bash で実行
なるほど、その手があったか

```
$ export SLACK_WEBHOOK_URL=https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXX
$ bash <(curl -sSl https://raw.githubusercontent.com/cohakim/scripts/master/v1/build/notify.sh) build_start
```

```
#!/bin/sh
set -eu

SLACK_WEBHOOK_URL=${SLACK_WEBHOOK_URL:-"SLACK_WEBHOOK_URL"}

function template () {
  SLACK_CHANNEL="#notice"
  SLACK_USERNAME="AWS CodeBuild"
  SLACK_ICON=":yuki:"

  BUILD_LOG_URL="https://console.aws.amazon.com/codebuild/home"
  CODEBUILD_SOURCE_REPO_URL=${CODEBUILD_SOURCE_REPO_URL:-"CODEBUILD_SOURCE_REPO_URL"}
  CODEBUILD_SOURCE_VERSION=${CODEBUILD_SOURCE_VERSION:-"CODEBUILD_SOURCE_VERSION"}
  CODEBUILD_BUILD_ARN=${CODEBUILD_BUILD_ARN:-"CODEBUILD_BUILD_ARN"}

  case $1 in
    start)
      MESSAGE="イメージのビルドが開始されました"
      COLOR="#2d9ee0"
      ;;
    complete)
      MESSAGE="イメージのビルドが完了しました"
      COLOR="#7CD197"
      ;;
  esac

  ATTACHMENTS=`cat << EOS
    {
      "channel": "${SLACK_CHANNEL}",
      "username": "${SLACK_USERNAME}",
      "icon_emoji": "${SLACK_ICON}",
      "attachments": [
        {
          "fields": [
            {
              "title": "${MESSAGE}",
              "short": true
            }
          ],
          "actions": [
            {
              "type": "button",
              "name": "build_log",
              "text": "Build Log 🛫",
              "url": "${BUILD_LOG_URL}",
              "style": "primary"
            }
          ],
          "color": "${COLOR}"
        },
        {
          "fields": [
            {
              "title": "Source Repository",
              "value": "${CODEBUILD_SOURCE_REPO_URL}",
              "short": true
            },
            {
              "title": "Source Version",
              "value": "${CODEBUILD_SOURCE_VERSION}",
              "short": true
            },
            {
              "title": "Build ARN",
              "value": "${CODEBUILD_BUILD_ARN}",
              "short": false
            }
          ]
        }
      ]
    }
  EOS`

  echo $ATTACHMENTS
}

case $1 in
  build_start)
    ATTACHMENTS=`template start`
    ;;
  build_complete)
    ATTACHMENTS=`template complete`
    ;;
esac

curl -sS -X POST $SLACK_WEBHOOK_URL -d "$ATTACHMENTS"
```
Xcodeのインデント設定を変更せずタブ文字を入力する

Xcodeのインデント設定にスペース文字を設定したまま、エディタでタブ文字を入力する方法が分からなかったので、調べた内容をメモしておきます。

## 前提

### macOSバージョン

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.5
BuildVersion:	18F132
```

### Xcodeバージョン

Xcode: `Version 10.2.1 (10E1001)`

### Xcodeのインデント設定

`Xcode` > `Preferences...` > `Text Editing` > `Indentation` がスペース文字モードになっている

<img width="445" alt="スクリーンショット 2019-06-30 13.39.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27943/306fce2c-8239-0803-957c-d04bf78bd7f5.png">

## タブ文字の入力方法

Xcodeのインデント設定がスペース文字モードになっている状態でエディタを開き `Tab` キーを押すと、インデント設定にしたがってスペース文字が入力されます。

普段はインデントにスペース文字を使いつつ、特定の場合だけタブ文字を使うには `⌥ (Option) + Tab` キーを押します。

## 参考

[How do I insert a literal tab character?](https://stackoverflow.com/questions/23817819/how-do-i-insert-a-literal-tab-character)
【jest】Javascriptのテストツールjestのインストールと最小限の使用方法

#概要
Javascriptのテストツールであるjestをインストールして最小限の使い方を理解するまで。

#インストール
```
$ npm -D install jest
```
#テストするファイル作成
```javascript:sum.js
function sum(a, b) {
	return a + b;
}
module.exports = sum;
```

#テストコードを書く
```js:run.test.js
const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
	expect(sum(1, 2)).toBe(3);
});
```

#package.jsonを書く
```json:package.json
{
  "scripts": {
    "test": "jest"
  }
}
```

#テスト実行
```
$ npm run test
```

#実行結果
```
 PASS  ./sum.test.js
  ✓ adds 1 + 2 to equal 3 (3ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.466s
Ran all test suites.
```

#Happy Hacking :sunglasses: !
TECH ~Day7~

七日目を終えて、ruby自体の学習も終盤になってきました。
今までrubyについて学んできた内容も実際に自分で使って何か作れと言われたとしたら実際まだ自身がありません。実際にできているコードを見たときになんとなくこれはこの意味を行っているんだなという段階です。まだまだ先は長そうです。
でも自身を持てるように引き続き学習頑張ります。

学習内容
・モデリング
・ゲッター
・require
・セッター
・attr_accessor


・モデリング
やりたいことをプログラムに落とし込むために必要な工程の一つ


・ゲッター
あるクラスのインスタンスのインスタンス変数の値を返すだけのメソッド。
これを定義することでインスタンス自身の持つインスタンス変数の値を取得できる。


・require
あるファイルから他のファイルの記述内容をrequireを使うことで参照できるようになるメソッド。例えばhoge.rbとfuga.rbという二つのファイルがあるとき、fuga.rbに「require "./hoge」と書くとfuga.rbにhoge.rbの記述が書かれていることにしてくれる。
rubyのプログラムをいくつかのファイルに分けて書いたものを、最後にそれらをまとめて一つのファイルに記述するときなどに使える。


・セッター
インスタンス変数の値を更新するためのインスタンスメソッドのこと。


・attr_accessor
ゲッターとセッターを楽に定義できるもの。

（例）
　class Dog
   attr_accessor : name,:type,:age


これらでrubyのカリキュラム内にある学習内容は以上になります。
同じような書き方でも意味が全く違うようなものがたくさんあったのでそれら一つ一つの違いをしっかりと明確に覚えられるようにまた復習しないといけないと感じました。
【python3】venvで仮想環境を作成する【windows10】

## Pythonをインストールする
- インストーラを選択
[***Python Releases for Windows***](https://www.python.org/downloads/windows/)

- 今回インストールしたのは v3.7.3 の 64bit版
***Windows x86-64 executable installer***

```bash:とりあえず&nbsp;pip&nbsp;自身のアップデート
> python -m pip install -U pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/5c/e0/be401c003291b56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 6.6MB/s
Installing collected packages: pip
  Found existing installation: pip 19.0.3
    Uninstalling pip-19.0.3:
      Successfully uninstalled pip-19.0.3
Successfully installed pip-19.1.1
```

## まずは公式を眺める
[***venv --- 仮想環境の作成***](https://docs.python.org/ja/3/library/venv.html) 

## 作ってみる
```bash:仮想環境&nbsp;を作成する
書式は以下の通り
> python -m venv [環境を作成したいパス]

例：
> python -m venv D:\PythonEnvs\MyEnv
```

```bash:仮想環境を立ち上げてみる
書式は以下の通り
> [環境を作成したパス]\Scripts\activate

例：
> D:\PythonEnvs\MyEnv\Scripts\activate
(MyEnv) >

テキトーにコマンドを叩いて動作確認
(MyEnv) > python -V
Python 3.7.3

(MyEnv) > pip -V
pip 19.0.3 from d:\pythonenvs\myenv\lib\site-packages\pip (python 3.7)
```

## 消してみる
仮想環境を削除したいときは、単純にディレクトリごと削除すればOK

## 難点
環境を作成するとき、AnacondaみたいにPythonインタプリタのバージョンを指定できないらしい
初心者でも出来るHTML入門1

## 1.HTMLとは
HTMLとは、Hyper Text Markup Language（ハイパーテキスト・マークアップ・ランゲージ）の略で、Webページを作成するために開発された言語です。
インターネット上で公開されてるWebページのほとんどは、HTMLで作成されています。

## 2.HTMLの準備
HTMLを学ぶために必要な準備は、

- `webブラウザ`　→　Internet Explorer , Google Chrome , Firefox , Safariなど
- `エディタ`　→　メモ帳 , テキストエディット , サクラエディタ , Atomなど

上記を用意できたら、エディタにhtmlのコードを書き、ブラウザで確認をします。

## 3.HTMLの記述
## 3-1.基本の記述
HTMLは拡張子に`.html`と記述します。
（ファイル名が、index.htmlのように最後に`.html`をつける）

```html
<!DOCTYPE html>
<html>
    <head>
        <!-- 付加情報 -->
    </head>

    <body>
        <!-- コンテンツ -->
    </body>
</html>
```

上記はhtmlの最低限記述するコードです。順に解説していきます。

- 1行目の `<!DOCTYPE html>` は、「文書がHTML5で作成されたことを宣言する」という意味になります。
- htmlでは、 `<` と `>` に囲まれた半角の英数字を `タグ` と呼び、`<開始タグ>` と `</終了タグ>` の2つを1セットとして使用します。<br/>
例：html 開始タグ ⇒ `<html>` , html 終了タグ ⇒ `</html>`
-  `<開始タグ>` と `</終了タグ>` で囲まれた全体を `要素` と呼びます。<br/>
例：head 要素 ⇒ `<head>` ～ `</head>`
- htmlでは、文書型宣言以外は全て html 要素内（ `<html>` ～ `</html>` ）に書きます。
- head 要素には、 `付加情報` 、 body 要素には、 `コンテンツ` を書きます。
- htmlでは、 `<!--` と `-->` で囲むことで中の文字をコメント化（htmlに影響を与えない文字化）できます。

以上がhtmlの最低限記述するコードです。

## 3-2.記述例

```html:index.html
<!DOCTYPE html>
<html>
    <head>
        <!-- 付加情報 -->
        
        <!-- タイトル -->
        <title>タイトル名</title>
        <!-- 文字コード -->
        <meta charset="utf-8" />
    </head>

    <body>
        <!-- コンテンツ -->
        <h1>Hello</h1>
    </body>
</html>
```
上記はhtmlの具体的な記述例です。
中身の文をコピーして、文字コードは `UTF-8` を指定し、ファイル名を `index.html` でデスクトップに保存するとブラウザではこうなります↓↓

![htmlの基礎.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/881b3fdb-99e1-1dfc-53d3-f2c9ff86917b.png)
画像のようになれば成功です。

## 4.GitHub
GitHubにソースコードを公開しています。

https://github.com/ryomeblog/qiita/tree/master/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%A7%E3%82%82%E5%87%BA%E6%9D%A5%E3%82%8BHTML%E5%85%A5%E9%96%801


## 5.関連
- [初心者でも出来るHTML入門2](https://qiita.com/ryome/items/4e19c19d3166a01bc0fc)
- [初心者でも出来るHTML入門3](https://qiita.com/ryome/items/72408fb260d1576fcb25)
- [初心者でも出来るHTML,JavaScript入門4](https://qiita.com/ryome/items/152ebca06eda9fe05b39)
- [初心者でも出来るHTML,JavaScript入門5](https://qiita.com/ryome/items/c5e7716ff58bbced5173)
- [初心者でも出来るHTML,JavaScript入門6](https://qiita.com/ryome/items/4a75d5d3df0c6355accd)
- [初心者でも出来るHTML,JavaScript入門7](https://qiita.com/ryome/items/6d58c666a4b296e8cc02)
cocoapodsのライブラリをローカルフォルダから参照してインストールする

# 発端

あるプロジェクトで使ってるライブラリが、特定のipからしかgitにアクセスできず、pod installやupdate時に特定環境でしかインストールできない問題が発生していました。

そこで、ローカル環境にcloneしてるコードからpod installやupdateができないか調査しました。

# ローカルフォルダから参照してビルド

以下サイトで解説されていました。

[Podfile で本家 Spec に無いライブラリを管理する](http://please-sleep.cou929.nu/specify-external-module-in-podfile.html)

次のような指定で、ローカルパスを指定してpodのビルドが出来るようです。

```ruby
pod 'ModuleName', :path => '../ModuleName'
```

# 試してみた

## ライブラリを一旦ローカルにclone

簡単にインディケータを表示できる `SVProgressHUD` を例に
実際に導入できるか試してみました。

利用するgitのURLは以下です。

**SVProgressHUD**
https://github.com/SVProgressHUD/SVProgressHUD.git

まず、任意のフォルダにgitをcloneします。
今回はプロジェクトフォルダに`mypods`というフォルダを作り
その配下にcloneしました。

プロジェクトフォルダで以下コマンドを実行します。
clone先は
`[プロジェクトフォルダ]/mypods/SVProgressHUD`
となります。

```bash
git clone https://github.com/SVProgressHUD/SVProgressHUD.git ./mypods/SVProgressHUD
```

## podの記述

pod ファイルには以下のように記述します
pod の path を先程cloneした`./mypods/SVProgressHUD/`
とします。

```ruby
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'podTest' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for podTest
  pod 'SVProgressHUD', :path => './mypods/SVProgressHUD/'

end
```

## ライブラリのインストール

準備が整ったので、後は、プロジェクトフォルダで`pod install`とする事で
`SVProgressHUD`が含まれたxcworkspaceファイルが作成されます。

ローカルから参照するため、ネットに繋がってなくてもinstallが出来るはずです。

```bash
pod install
```

## github

https://github.com/becky3/local_pod_install
[Kotlin] 基本文法をしました。part.1

# Kotlin 基本文法

```
// java
int temp = 10;

// Kotlin
val temp: Int = 10
var temp = 15
```
Kotlin は「；」を使わず、上記ように変数のTypeが後に付きます。
また、変数のTypeを指定しない場合があります。

## val、var

Kotlin には、2つの変数の宣言方法があります。

val：変わることができない定数(Java：final、C / C ++など : const)
var：一般的な変数に対応します。

```val_sample.kt
val a: Int = 1
val b = 1  // Intだと、推論することができる
val c: Int  // Intを初期化するとき、コンストラクタで初期化する
  c = 100 // コンストラクタの時点で初期化してくれないと、文法上のエラーが発生
```

```var_sample.kt
var x = 5 // Intだと、推論することができる
x += 10
```

## 関数の作成

```java_sample.java
public int sum(int a, int b) {
  return a + b;
}
```

```Kotlin_function_sample.kt
fun sum(a: Int, b: Int): Int {
  return a + b
}
```

Kotlinの関数は、javaと少し違います。
fun　関数名（変数名：変数のType）：returnのType{return値}

もっと、簡単な関数の作成も可能です。

```Kotlin_function_sample2.kt
fun sum(a: Int, b: Int): Int = a + b
fun sum(a: Int, b: Int) = a + b
```

If文の場合は、こうなります。

```Kotlin_function_sample3.kt
fun max(a: Int, b: Int): Int {
  if (a > b) return a
  else return b
}
```

```Kotlin_function_sample4.kt
fun max(a: Int, b: Int) = if (a > b) a else b
```

## loop
Kotlinのloopは、Javaと似ています。

```java_loop.java
ArrayList<String> arrayList = new ArrayList<>();
for (String s : arrayList) {
    Log.d("TAG", "string : " + s);
}
```

```Kotlin_loop.kt
val arrayList = ArrayList<String>()
for (s in arrayList) {
    Log.d("TAG", "string : " + s)
}
```

## ranges

数字の範囲を指定

```java_ranges.java
for (int i = 1; i <= 5; i++) {
  Log.i("TAG", "index : " + i);
}
```

```Kotlin_ranges.kt
for (x in 1..5) {
  println(x)
}
```
WooCommerce の注文単位で在庫を増減時

##注文内の商品の在庫を増やす処理

注文IDが、$order_idの場合、以下で注文の在庫を増やすことが出来ます。（refundやcancelの場合)

```php:current_functions.php
wc_increase_stock_levels($order_id);
```
WooCommerce 3.0以前は以下のような処理でした。3.0から非推奨関数となっています。

```php:legacy_functions.php
$order = wc_get_order( $order_id );
$order->wc_increase_stock();
```

WooCommerce でのコーデックスはこちらから(2019年6月現在)

[Function wc_increase_stock_levels](https://docs.woocommerce.com/wc-apidocs/function-wc_increase_stock_levels.html)

##注文内の商品の在庫を減らす処理

注文IDが、$order_idの場合、以下で注文の在庫を減らすことが出来ます。

```php:current_functions.php
wc_reduce_stock_levels($order_id);
```
WooCommerce 3.0以前は以下のような処理でした。3.0から非推奨関数となっています。

```php:legacy_functions.php
$order = wc_get_order( $order_id );
$order->wc_reduce_stock();
```

WooCommerce でのコーデックスはこちらから(2019年6月現在)

[Function wc_reduce_stock_levels](https://docs.woocommerce.com/wc-apidocs/function-wc_reduce_stock_levels.html)
kaggle でよく使うコード


## CSVファイル処理

- 読込み

```
train = pd.read_csv("../input/train.csv")
```

- 書き出し（先頭列の列名を指定する必要がある。）

```
train.to_csv("my_train.csv", index_label = ["PassengerId"])
```


# EDA(探索的データ解析)

- 先頭5行表示

```
train.head()
```

- 最大表示列数の指定(例として300列)

```
pd.set_option('display.max_columns', 300)
```


- データの形状(行数、列数)を表示

```
train_shape = train.shape
```


- 基本統計量（最大max、最小min、平均mean、標準偏差std）を表示。

```
train.describe()
```


- 欠損数を確認。

```
train.isnull().sum()
```

- 変数同士の相関を見る。(欠損値は除外される)

```
train.corr()
```



# 前処理


- 欠損値を中央値で埋める。

```
train["Age"]=train["Age"].fillna(train["Age"].median())
```


- ラベルを数値に変換。

```
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

le.fit(train["Sex"])
train["Sex"] = le.transform(train["Sex"])
```

- 不要なカラムを削除。

```
train.drop("Fare",axis=1)
```


- 列名を指定して取り出し。(2列を指定するDataFrame型で返ってくる)

```
a = train[["Age","Sex"]]
```
```
a = train.loc[:,["Age","Sex"]]
```

- 列名を指定して取り出し。(1列を指定するとSeries型で返ってくる)

```
a = train["Age"]
```
```
a = train.loc[:,"Age"]
```
GroveのシリアルカメラとOV528の違いが気になる

# はじめに
Arduinoのメモリが足らないので、なんとか取得するデータサイズを小さくできないかと、いろいろと調べてみました。
で、GroveのカメラがほぼほぼOV528なのですが、結局のところ、すべてを実装しているわけではなく、どうやらサブセットみたいだぞということで、その違いをまとめてみました。

なお、Grovrのシリアルカメラの情報は[こちら](http://wiki.seeedstudio.com/Grove-Serial_Camera_Kit/)、OV528に関しては[こちら](https://qiita.com/mine820/items/72f17e17cd806b1d5771)を参照してください。

# Initial（AA01h）
## Color Setting
こんな感じで、いろいろと設定できそうなのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/9fce39a6-df70-f007-8f5a-8aa66488992a.png)
試してみた結果がこちら。

| 意味 | 設定値 | 結果 |
|---|---|---|
| 2-bit Gray-Scale | 01h | JPEG（24-bit Color）で出力 |
| 4-bit Gray-Scale | 02h | JPEG（24-bit Color）で出力 |
| 8-bit Gray-Scale | 03h | JPEG（24-bit Color）で出力 |
| 2-bit Color | 05h | JPEG（24-bit Color）で出力 |
| 16-bit Color | 06h | JPEG（24-bit Color）で出力 |
| JPEG | 07h | JPEG（24-bit Color）で出力 |

すべてJPEG（24-bit Color）で出力されます。

## Preview Resolution
一応、以下の2種類が設定できるようなのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/49d9db2f-7e19-6dad-e36e-9161e3bb2775.png)
結果としては、「Preview」自体が有効にならなかったため、確認できず．．．

## JPEG Resolution
OV528は4つ指定できる様になっていますが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/4f0389cf-ae43-331c-8cd4-0c5535c79c88.png)
Groveの方では「Resolution: 640*480, 320*240, 160*120」となってました。
結果としては、予想通りでした。

| 意味 | 設定値 | 結果 |
|---|---|---|
| 80*64 | 01h | 320*240で出力 |
| 160*128 | 03h | 160*120で出力 |
| 320*240 | 05h | 320*240で出力 |
| 640*480 | 07h | 640*480で出力 |

「03h」のときは「160*128」ではなく「160*120」なのが要注意です。

# Get Picture（AA04h）
## Get Setting
OV528では3種類指定できるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/17d07fdc-42d0-0aa4-3bec-00f06aefc3a3.png)
一応、どれを設定してもエラーにはならないのですが、動きとしてはどれを設定しても同じで、「Snapshot」または「JPEG Preview Picture」っぽいです。
（どちらなのかは判断つきませんでした）

ちなみに、戻りの「Data（AA0Ah）」ではちゃんと設定した「Data Type」で返ってきます。

# Snapshot（AA05h）
## Snapshot Setting
設定としては、圧縮／非圧縮があるのですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/3e338976-86e9-f11e-5f3a-1bed322d2b96.png)
取得したデータは圧縮されていました。

# まとめ
結局、Groveのシリアルカメラのところに書かれてあるままでした。

# 余談
JPEGの画像サイズとチャンネル数は、以下で調べられます。
1. マーカー「0xFFC0」を探す
2. 3バイト読み飛ばす
3. 2バイト→縦のサイズ
4. 2バイト→横のサイズ
5. 1バイト→チャンネル数（3なら通常24bit RGB）
kindle for PCで日本語の読み上げ速度を速くする方法


Kindle for PC のショートカットで
読み上げ速度を速めるには
Shift + 「+」
読み上げ速度を遅くするには
Shift + 「-」

しかし、日本語キーボードでKindle for PC ではShift + 「+」ができない。

調べたところ下記のレジストリに読み上げ速度TtsSpeechRateが保存されているようだ。

```'http://midorigame-ferret.cocolog-nifty.com/blog/2018/06/kindle-for-pc-3.html
【レジストリ】スタート（右クリック）→ファイル名を指定して実行→REGEDIT

［ＨＫＥＹ＿ＣＵＲＲＥＮＴ＿ＵＳＥＲ￥ＳＯＦＴＷＡＲＥ￥Ａｍａｚｏｎ￥Ｋｉｎｄｌｅ￥Ｕｓｅｒ　Ｓｅｔｔｉｎｇｓ］
”ＴｔｓＳｐｅｅｃｈＲａｔｅ”＝ｄｗｏｒｄ：ｆｆｆｆｆｆｆ６
の値を零（0）またはffffffffに変更。（上記は全角に変換して表示。速度を遅くすると，FFFFFFFF(16進数)から値が1ずつ減っていくようだ。）
```
そこで下記の値に変更した
”ＴｔｓＳｐｅｅｃｈＲａｔｅ”＝ｄｗｏｒｄ：０００００００５

kindle for PCの読み上げ速度がいい感じに速くなってくれた。


参考サイト
https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=GPC7U392HH93VPC8

http://midorigame-ferret.cocolog-nifty.com/blog/2018/06/kindle-for-pc-3.html
PyTorch で GPU を使う

## 説明

基本的に `.cuda()` を使う。
1. モデル(net)
2. 入力(inputs)
3. 正解データ(labels)
のそれぞれに対して作用させること。

```python3
def try_gpu(e):
    if torch.cuda.is_available():
        return e.cuda()
    return e
```

みたいなメソッドを定義しておいて、


```python3
import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(28 * 28, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = x.view(-1, 28 * 28)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

net = Net()
net = try_gpu(net)
```
とか

```python3
epochs = 100

for epoch in range(epochs):
    running_loss = 0.0
    for i, (inputs, labels) in enumerate(trainloader, 0):
        # zero the parameter gradients
        optimizer.zero_grad()
        inputs = try_gpu(inputs)
        labels = try_gpu(labels)

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 100 == 99:
            print('[{:d}, {:5d}] loss: {:.3f}'
                    .format(epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

print('Finished Training')
```
とかすると、自動的に CPU と GPU を切り替えられて良いかもしれない。
理想は、`.cuda()` を明示的にコードの中に入れないことなのだが、もっとよい方法があれば教えてください。

## 参考
[PyTorchでMNIST]
(https://qiita.com/fukuit/items/215ef75113d97560e599)
直接的に役に立つわけではないが、爆速で成長するヒントになった書籍5選

# はじめに
[@neet_se](https://twitter.com/neet_se)といいます。
普段はフリーランスエンジニアとして客先常駐の仕事をしています。

今回は直接的に役に立つわけじゃないけど成長する上でヒントになった書籍を紹介したいと思います。

# ドラッカーさんに教わった IT技術者のための50の考える力
エンジニアの仕事における考え方や進め方が簡潔に50個並べられています。
段取りや自己管理、コミュニケーション、スキルアップについてまとめられています。

題名にドラッカーと書いてありますが、あまり出てきません。笑
ときたま、ドラッカーの言を借りている程度です。
例えば、「自分の強みを発見し強化することの重要性」はドラッカーが発言がベースとなっています。

シリーズでもう一冊似た本がありますが、私はこちらのほうがオススメです。

https://www.amazon.co.jp/dp/4798047473

# 仕事の問題地図
仕事で起きる問題をいくつか取り上げています。
図が多く、文章もとても簡易なため読みやすいです。

特にプロジェクトマネジメントやうまくいかない職場はどう改善するべきかといった話は働いていて、よくブチ当たる壁なので｢あー、あるある｣と思いつつ、読み進めることができ「じゃあ、あのときどうすればよかったの？」と振り返るキッカケになりました。
文句を言うのは簡単ですが、じゃあ解決するにはどうすればよいの？となったときにヒントになる本です。

https://www.amazon.co.jp/dp/4774187747

# プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則
プログラミングの設計や思想、考え方について書かれています。
例えば、DRYやUNIX哲学、アーキテクチャ設計について等です。

｢プログラミング｣と題名に書かれていますが、ソースコードは一切出てきません。笑
あくまで｢考え方｣にフォーカスを当てたいという方針のようです。
なので、ある程度開発の経験がある方向けかなと。

長い目で見ると、これらの考えを自分なりに落とし込むと財産になると思います。

https://www.amazon.co.jp/dp/B071V7MY82

# 人を動かす
発売されて80年ぐらい立っていますが、未だに売れ続ける自己啓発書の開祖のような存在です。
詳しくないですが、著者のデール・カーネギーはスピーチのセミナーを開いていた人のようです。

エンジニアとして働いていて、一人ですべて完結することはないはずです。
人を動かすためのパターン、NGな行動について書かれています。

悪口を言わない、避難しないなど「当たり前だろ」と思われることが書かれていますが、それらが完全にできている人は中々いない印象です。
エンジニア以前に社会人としてやっていくために必要なことを改めて思い返すにはとても良い本だと思います。

https://www.amazon.co.jp/dp/442210098X

# アウトプット大全
成長のためのアウトプット、学び方について書かれています。
アウトプットとインプットの比率や、その方法論について。
著者は精神科医で医学の知識や経験に基づいたことが書かれています。

｢やる気は存在しない、行動の後についてくる｣という話はエンジニアで言うと｢Twitterなんてやってないでコード書け！｣みたいな話で刺さる人も多いのではないでしょうか。

アウトプットの重要性は私も日常的に感じていて、記憶の定着性だけでなく自分の考えや知識が正しいか答え合わせにもなりますし、何より新しい繋がりを得るのに有用です。

https://www.amazon.co.jp/dp/4801400558

# おわりに
いかがでしたでしょうか？

技術を身に着けただけでは仕事では上手くいかないこともあると思います。
今回はその点にフォーカスを当てて、よいと思った書籍を上げてみました。

よろしかったらシェアしたり何か感想をください。
あなたのアウトプットが誰かのインプットの助けになると思います！

私の運営しているコミュニティTECH::Survivorでは無料で相談を行っています。
月１程度で会合も行っていますので、もしご興味がありましたら参加してみてください。

http://techsurvivor.top
AxiosでCookieを自動処理する

※環境はNode.js 12.xです

## withCredentials: true

色んなサイトに書いてある方法。

```js
const Axios = require('axios');

let client = Axios.create({ withCredentials: true });

const response1 = client.get('https://example.com/set_cookie');
console.log(response1.headers['set-cookie']); // [ 'PHPSESSID=pbjscl1plduu6npqeemep58550' ]

const response2 = client.get('https://example.com/check_cookie');
console.log(response2.indexOf('Cookie') != -1); // false
```

ところがこの方法ではうまく行かなかった。

## axios-cookiejar-support

[CookieJar](https://www.npmjs.com/package/tough-cookie)と呼ばれるCookie処理バックエンドを組み込む方法。
まずはプラグインをインストールする。

```sh
npm install axios-cookiejar-support
```

そして実際にリクエストしてみる。

```js
const Axios = require('axios').default;
const AxiosCookiejarSupport = require('axios-cookiejar-support').default;

// Axiosにプラグイン注入
AxiosCookiejarSupport(Axios);

let client = Axios.create({
    jar: true, // cookiejarを有効化する
    withCredentials: true, // 依然として必要
 });

const response1 = client.get('https://example.com/set_cookie');
console.log(response1.headers['set-cookie']); // [ 'PHPSESSID=pbjscl1plduu6npqeemep58550' ]

const response2 = client.get('https://example.com/check_cookie');
console.log(response2.indexOf('Cookie') != -1); // true
```

うまく行ったらしい。
詳しい使い方は[axios-cookiejar-support](https://www.npmjs.com/package/axios-cookiejar-support)を参照。
Laravel transaction 2つの処理方法　サンプルソース

+ DBファザード 利用

```php

public function update (Post $post, Request $request)
{
    $params = $request->all();

    return DB::transaction(function () use ($post, $params) {
        $post->fill($params)->save();
        $post->tags()->sync($params['tag_ids']);

        return $post;
    });
}

```

+ 手動

```php

public function update (Post $post, Request $request)
{
    $params = $request->all();

    DB::beginTransaction();
    try {
        $post->fill($params)->save();
        $post->tags()->sync($params['tag_ids']);
        DB::commit();
    } catch (\Exception $e) {
        DB::rollback();
    }

    return $post;
}
```