OmniAICreator/Qiita-1.07M huggingface dataset:
LeetCode / Merge Two Sorted Lists

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/07/13/153148)からの転載）

[https://leetcode.com/problems/merge-two-sorted-lists/]

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

Example:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4

以下のように定義される、ListNodeというclassを使う問題です。ListNodeを使う問題はLeetCodeで大量に出てきます。

```python
# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
```

#### 回答・解説

##### 解法1
ListNodeって何？Listと違うの？と思いながら、私がとりあえず書いたコードを示します。
内容は単純にIterationを回すものですが、これでも正解ではあります。

```python
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        l = []
        while l1 or l2:
            if not l2 or l1 and l1.val < l2.val:
                l.append(l1.val)
                l1 = l1.next
            else:
                l.append(l2.val)
                l2 = l2.next
        return l
```

##### 解法2
解法1のようにIterationを回す解法と対照的なのが、recursive（再帰的）な解法です。
再帰関数とは何か？については以下を参考にしていただければと思いますが、
一言で言えば、<b>状態（引数の値）を変えながら、自分自身を呼び続ける関数</b>のことを意味します。
（初めて再帰関数を見たときは意味がわからず軽く発狂しそうになりました。。。）

[https://qiita.com/jumpyoshim/items/20e6b5e70efa466699b4:embed:cite]

さて、このrecursiveな解法は以下の通りです。
l1とl2の各要素の大小を比較し、l1の1つ目の要素の方が小さければ、次はl1の2つ目の要素とl2の1つ目の要素の大小を比較し、
l2の1つ目の要素の方が小さければ、次はl2の2つ目の要素とl1の1つ目の要素の大小を比較します。
このように<b>各要素の大小を比較し小さい方を採用する処理</b>は何度も呼ばれることになるので、再帰関数で記述するのが効率的だということになります。

```python
class Solution:
    def mergeTwoLists(self, l1, l2):
        if not l1 or not l2:
            return l1 or l2
        if l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2
```
気体の反応拡散系を工学的に解くには（１）

##はじめに
反応拡散系といえば、魚や動物の縞模様を表現することがきる系として話題になることも多く（？）、[Qiitaでもいくつかの記事が投稿されています](https://qiita.com/search?q=%E5%8F%8D%E5%BF%9C%E6%8B%A1%E6%95%A3)。
もちろん、化学製品の製造工程などでは日常的に考えることになり、工学的にも重要な問題です。
先日、FEMのプログラムについて知人と話していた際に、反応を含む現象ってどう取り扱うのか、といった話になったので、本稿では、特に気体の反応拡散系を工学的に解く方法（FEMやFVMによる数値解析を想定）について、その考えを整理していきます。**まじめに取り組もうとすると意外と難しいぞ**、ということをお伝えできればと。
著者は元々大学で化学工学を専攻していましたが、率直なところ本問題に対して十分に理解できていない部分も多いので、内容に間違いなどもあるかと思いますが、ご容赦ください（誤りご指摘ください）。

##反応拡散系について詳しく知るために
本稿を始める前に、以下のページをご紹介します。エクセルを使って勉強できて、非常によい教材です。
[Excelで解く化学工学10大モデル](http://www.scej.org/publication/journal/excel-model.html)

##反応拡散系を数式化する
反応拡散系は、ごくごく簡単に言うと拡散方程式に反応に関するモデルを追加することで表現できます。

```math
\frac{\partial c}{\partial t}=\frac{\partial}{\partial x_j}(D\frac{\partial c}{\partial x_j})+\dot{S}
```
cはガスの濃度でDは拡散係数、右辺第一項がは所謂Fickの法則です。右辺第二項はガスの生成項となり、ガスの生成（もしくは消費）速度になります。この方程式を離散化してFE解析することは、特に難しくない、、、といいたいところですが、拡散係数Dと反応速度S次第では非常に解きづらくなったりしてきます。が、そこの問題は後ほど取り上げることにして先に進みます。

##多成分系の拡散方程式
先の拡散反応方程式は、ある着目する成分に関してFickの法則が成り立つことを（当然ながら）前提としています。しかし、工業的に重要な問題では必ずしも上式が単純に適用できない場合も多く、その一例が多成分系の拡散方程式です。あるガス成分mに着目した、多成分系の拡散方程式は下式になります。なお、一旦反応の話は無視します。

```math
\frac{\partial(\rho Y_m)}{\partial t}=\frac{\partial}{\partial x_j}(D_m\frac{\partial(\rho  Y_m)}{\partial x_j})
```

ここで、ρは混合ガスの密度[kg/m3]、Ymは成分mのガス分率[-]（0-1の値をとる）であり、ρYmは成分mの濃度になります。多成分系なので、ガスの成分それぞれに方程式が立つので、それらをそれぞれ解くことになります。むろん、この方程式も容易にFE解析できるので、めでたしめでたし、、、とは残念ながらなりません。
##多成分系の拡散方程式を解くことの何が難しいか？
**結論から言うと、方程式の数と未知数との数のつり合いが取れなくなります。**
前記、方程式中ではYmが未知数であるのは明白です。ガスの成分mの数だけ方程式と未知数Ymが必要なので、ここでは方程式の数=未知数の数です。ρおよびDmは温度・圧力ならびにYmから計算されます。温度、圧力は既知の値として設定することが多く、この仮定の下ではρおよびDmの関係式を考えた場合にも、方程式の数=未知数の数となります。
では、どこが問題となるのか。ここでYmについて考えると、Ymはガス分率として定義しているため、全成分のYmは足すと1になります。この制約条件（方程式）が新たに加わってしまうために、方程式の数が未知数の数に対して＋１されてしまい、残念ながら数学的に整合しません。

補足）ρの計算式
混合ガスの密度ρですが、単位体積あたりのガス成分の重量です。これは、気体の状態方程式PV=nRTより、温度・圧力ならびに、混合気体の平均分子量から計算されます。混合気体の平均分子量は、各気体の分子量とそれぞれのガス分率が分かれば計算できます。気体の状態方程式は、あくまでもモデルなので適用できなくなる場合もありますが、我々の考える通常の現象程度であれば気体の状態方程式を問題なく使用できるハズです。

###いったんここまで
第１回目では問題提起だけしておいて、回答は第２回目の記事に任せます。
もしくは、いい感じの解説記事やウェブページなどあればご紹介ください。第２回目は別の内容を書いていきますので。。
配列に第二引数まで使って初期を設定する際の注意点は各要素が同じobject_idだということ

言いたいことはタイトル通りです。

Rubyの場合、配列は`Array.new`で生成でき、引数を2つ指定することで生成できます。

```ruby
p tests = Array.new(5,'test')

=> ["test", "test", "test", "test", "test"]
```

第一引数に、要素数、第二引数には格納する文字列を指定できます。

注意点は各要素が同じ`object_id`であることです。

```ruby
tests.each { |t| p t.object_id }

=> 70112523450820 # tests[0]
=> 70112523450820 # tests[1]
=> 70112523450820 # tests[2]
=> 70112523450820 # tests[3]
=> 70112523450820 # tests[4]
```

問題点は、破壊的メソッドで、どれかの要素を変えてしまうと、他の要素も変わってしまうことです。

```ruby
p tests = Array.new(5,'test')
=> ["test", "test", "test", "test", "test"]

tests[0].upcase!

p tests
=> ["TEST", "TEST", "TEST", "TEST", "TEST"]
```

問題を避けたい場合は、ブロックで初期値を設定するといいです。

```ruby
p tests= Array.new(5) { 'test' }
=> ["test", "test", "test", "test", "test"]

tests.each { |t| p t.object_id }
=> 70348531944080 # tests[0]
=> 70348531944060 # tests[1]
=> 70348531943940 # tests[2]
=> 70348531943900 # tests[3]
=> 70348531943880 # tests[4]
# それぞれ、object_idが違うので↑、破壊的メソッドで1つの要素変えても他に影響はありません。↓

tests[0].upcase!
p tests
=> ["TEST", "test", "test", "test", "test"]
```

同じオブジェクトかどうかを意識しないと、不具合を起こしてしまう可能性がありますので、注意が必要ですね。
メソッド `object_id`を使うと、同じかどうか確認できるので、慣れるまでは使って確認するのもありかと思います。
ISPC 本体を AARCH64 向けにクロスコンパイルする

俺得 ISPC AARCH64 版で ISPC を動かすのはこちら.

ISPC を aarch64 で動かす
https://qiita.com/syoyo/items/36f089548323325bb5e1

最近(2019/05), ISPC 本体に AARCH64 対応が入ったようなので, 俺得版ではなく, 本体を AARCH64 対応でビルドしてみます.

## 対象環境

* Linux(Ubuntu 16.04 or later)

## LLVM/clang のビルド

ISPC は LLVM 3.4 とかでも動くようですが, AARCH64 対応が進んでいる LLVM/clang 最新版を使いたいですね. ここでは LLVM/clang 8.0 を使います. 

ISPC では LLVM の`dump` 関数を使っていますが, これは LLVM 5.0 から deprecated になり, prebuilt package などでは dump 関数は有効になっていないため, まずは dump 関数を有効にして LLVM/clang をビルドする必要があります.

https://github.com/ispc/ispc/wiki/Building-ispc

を参考にします. 必要なソースコードをダウロードしてビルドするユーティリティ　`alloy.py`(合金?)スクリプトを使います(上記 dump 機能を有効にして LLVM/clang をビルドします).

`LLVM_HOME` にソースコードとビルドのインストール先パス, `ISPC_HOME` に ispc repo のパスを設定して起動します. `LLVM_HOME` に相対パスを指定すると build ディレクトリがおかしなところに生成されるようなので注意ください.

```
$ LLVM_HOME=/path/to/llvm-dist ISPC_HOME=/path/to/ispc python alloy.py -b --version=8.0
```

`--force` が追加で必要かもしれません. ビルドが終わるまで待ちます(30 分 ~ 1 時間くらい)

## ISPC のビルド

上記でビルドした LLVM バイナリ(`bin-8.0`)を PATH に加えて `llvm-config` が見つかるようにして, cmake bootstrap します.

`ARM_ENABLED=On` にして, ARM 対応で ISPC をビルドします.

```
$ rmdir build
$ mkdir build
$ cd build
$ PATH=/path/to/llvm/build/bin-8.0:$PATH cmake -DARM_ENABLED=On ..
$ make
```

ISPC がビルドできました. ispc のヘルプを出して, `--arch` に `aarch64` があれば成功です.

## AARM64 向けコードの生成

`--target` に neon 系を指定します. 

```
$ ispc --arch=aarch64 --target=neon-i32x4 ...
```

generic だと現状実行時エラーになりますので注意ください.

## TODO

クロスコンパイルされたバイナリを Raspberry Pi 3(ARM64 kernel) などで動くか確認する
Swift：スクロールバーのギャップを除いたNSScrollViewのサイズを取得する

```swift
func - (left: CGSize, right: CGSize) -> CGSize {
    return CGSize(width: left.width - right.width, height: left.height - right.height)
}

let gap = CGSize(width: scrollView.verticalScroller?.visibleRect.width ?? 0.0,
                 height: scrollView.horizontalScroller?.visibleRect.height ?? 0.0)
let bounds = NSRect(origin: CGPoint.zero, size: scrollView.bounds.size - gap)
```
M2Detの環境構築

#はじめに

本記事では物体検出技術のM2Detの環境構築について紹介をします。
[筆者の公式リポジトリ](https://github.com/qijiezhao/M2Det)にも丁寧な説明がありますが、
pip環境のみでも構築できたので、紹介します。

# 前提条件
以下の条件で環境構築を行いました。

- Ubuntu 18.04
- CUDA 10.0
- cuDNN 7.5.0

# 手順

## 1. リポジトリのクローン
筆者が公開している[リポジトリ](https://github.com/qijiezhao/M2Det)をクローンします。

```
$ git clone https://github.com/qijiezhao/M2Det.git
```

## 2. 関連するパッケージをインストール
次に関連するパッケージをインストールします。

```
$ pip install Cython
$ pip install tqdm
$ pip install opencv-python
$ pip install addict
$ pip install matplotlib
$ pip install termcolor
```

# 3. PyTorchとTorchvisonのインストール
公式リポジトリでは、Pytorchのサポートverは0.4.1とありましたが、
デモプログラムの実行は、1.1.0でも動作しました。torchvisionも合わせてインストールしておきます。

最新情報は[PyTorchのHP](https://pytorch.org/)を参照してほしいですが、
2019年7月13日時点の手順を以下に記述します。

```
pip install https://download.pytorch.org/whl/cu100/torch-1.1.0-cp36-cp36m-linux_x86_64.whl
pip install https://download.pytorch.org/whl/cu100/torchvision-0.3.0-cp36-cp36m-linux_x86_64.whl
```

ちなみに、手順2,3を実行し、pip freeezeした結果は以下です。
うまく動作しないときは、以下を見てverを揃えて見てください。

```
addict==2.2.1
cycler==0.10.0
Cython==0.29.12
kiwisolver==1.1.0
matplotlib==3.1.1
numpy==1.16.4
opencv-python==4.1.0.25
Pillow==6.1.0
pyparsing==2.4.0
python-dateutil==2.8.0
six==1.12.0
termcolor==1.1.0
torch==1.1.0
torchvision==0.3.0
tqdm==4.32.2
```

## 4. nms と coco toolsのコンパイル

[公式リポジトリ](https://github.com/qijiezhao/M2Det#preparation)の説明にあるように
nmsとcoco toolsのコンパイルをするために、以下のコマンドを実行してください。

```
$ cd M2Det
$ sh make.sh
```

## 5. 動作確認（デモの実行）

- 重みファイル（m2det512_vgg）を[baidu cloud](https://pan.baidu.com/s/1LDkpsQfpaGq_LECQItxRFQ) や [google drive](https://drive.google.com/file/d/1NM1UDdZnwHwiNDxhcP-nndaWj24m-90L/view)からダウンロードします。

- 次にcloneしたフォルダ直下にweightsというフォルダを作成しダウンロードした重みファイルを配置します。

- 推論したいファイルをimgsフォルダに置きます。
（現状のコードでは、拡張子が.jpgとなっている画像ファイルのみ推論します。）

- 次に以下のコマンドを実行し、推論を行います。

```
$ python demo.py -c=configs/m2det512_vgg.py -m=weights/m2det512_vgg.pth --show
```

実行すると、推論結果はimgフォルダに
「（入力ファイル名）_m2det.jpg」というファイル名で作成されます。

## 6. 参考（推論対象の拡張子を変更する）
推論した画像ファイルの拡張子が.JPGを大文字だったので、
[demo.pyの101行目](https://github.com/qijiezhao/M2Det/blob/master/demo.py#L101)を以下に書き換えました。

```
#im_fnames = sorted((fname for fname in os.listdir(im_path) if os.path.splitext(fname)[-1] == '.jpg'))
im_fnames = sorted((fname for fname in os.listdir(im_path) if os.path.splitext(fname)[-1] == '.JPG'))
```

## E. 今後
Macでも同様の手順で試したのですが、nsmのコンパイルでエラーが起こってしました。
多少時間がかかってもCPUで推論を行いたいので、
解決方法がないか、今度Tryしてみようと思います。
Windowsでssh-copy-idっぽいことをしたい


- ~/.ssh/id_rsa.pub（例:C:\Users\ユーザー名\\.ssh\id_rsa.pub）として公開鍵がすでに生成されている
- 送付先サーバーはSSH接続でパスワード認証が有効になっている

以上の条件を満たしてPowerShellで以下のコマンドを実行します。
見やすくするために　`　で改行しています。1行ずつではなく以下の5行をまとめてご使用ください。

```
cat ~/.ssh/id_rsa.pub | ssh ${user}@${host} `
" `
mkdir -p ~/.ssh && chmod 700 ~/.ssh && `
cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys `
"
```

```
ssh ${user}@${host}
の部分は適宜変更してください。
例：ssh user@123.456.78.99
```

実行後パスワードが求められるので入力します。

もう一度

```
ssh ${user}@${host}
```

でパスワード入力が求められずにSSH接続できれば成功です。
パスワード認証の設定を有効にした場合は無効化しておくのをお忘れなく。


# 環境

- 公開鍵送付元
    - windows10 home
    - PowerShell 5.1
    - OpenSSH_for_Windows_7.6p1, LibreSSL 2.6.4

- 公開鍵送付先
    - centos7.4

# 解説

### cat ~/.ssh/id_rsa.pub

powershellのcat（Get-Contentのエイリアス）で公開鍵を取得します。


### mkdir -p ~/.ssh && chmod 700 ~/.ssh

mkdirの-pオプションで~/.sshディレクトリが存在しなければ新規作成、新規作成した場合は~/.sshの権限を700に変更します。

### cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys

authorized_keysを新規作成して公開鍵を書き込み、もしくはauthorized_keysが存在していれば追記します。
新規作成された場合は権限が644となっており他のユーザーから書き込みができないのでSSHで接続するには問題ありませんが、一般的な600に変更しておきます。

# おまけ　SSHパスワード認証を無効化するコマンド

```
ssh ${user}@${host} `
" `
sed -i 's/PasswordAuthentication.*/PasswordAuthentication no/g' /etc/ssh/sshd_config && `
systemctl restart sshd `
"
```

sedでPasswordAuthenticationをPasswordAuthentication noに書き換えたあとsshdを再起動しています。

# 参考

[Is there an equivalent to ssh-copy-id for Windows?](https://serverfault.com/questions/224810/is-there-an-equivalent-to-ssh-copy-id-for-windows)

[mkdirでディレクトリが存在しない時だけディレクトリを作成する。](https://blog.katty.in/4967)

[それ PowerShell でできるよ](https://qiita.com/cd01/items/da9a36582372e7d0a7f6)

[OpenSSHのバージョンが知りたい](https://www.itmedia.co.jp/help/tips/linux/l0584.html)

[Disable PasswordAuthentication and Enable PubkeyAuthentication on Sakura VPS.](https://gist.github.com/marcy-terui/9460706)
Javaでリストを使うとき、java.awt.Listが出てきてエラーになる

Javaのプログラミングで、いつも通りにリストを使用したのに、下記のようなエラーとなることがあります。
![list_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298692/9da8376f-2885-90af-ea9e-fbc6672999ce.png)

これは、リストとして、java.util.Listではなく、java.awt.Listを使ってしまっていることが原因です。

## java.awt.Listとは何か？

JavaでGUIを作る際に使用する Abstract Windows Toolkit のGUI部品で、いわゆる**リストボックス**です。Javaのコレクションのリストではありません。

### 画面

![listbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298692/41f8b329-7588-8be3-e8fc-6cc0b1c0d7fd.png)


### ソース

```Java
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class AwtEx {

	AwtEx(){
		List awtList = new List();
		awtList.add("item01");
		awtList.add("item02");
		awtList.add("item03");
		
		Frame frame = new Frame();
		frame.add(awtList);
		frame.setSize(200, 200);
		frame.setLayout(new FlowLayout());
		frame.setVisible(true);
		
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent we) {
				frame.dispose();
			}
		});
	}
	
	public static void main(String[] args) {
		new AwtEx();
	}
}
```


## 対応方法
java.awtを使わないようにすればいいですが、下記リンクのようにjava.awtが出ないように、開発環境に設定するとより楽かと思います。

[EclipseでListが100倍使いやすくなる方法](https://qiita.com/dhun/items/5be728fdf578a51bf88d)
独自ルール:ROS2における名前付け

[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)

ここでは以下の名前付けについて述べる

- 名前固定のもの
    - node名
    - nodeの提供するサービス名，トピック名 
- ルールを考えるもの
    - ワークスペース名・パッケージ名
    - c++などでの一般で言う名前空間
    - nodeの名前空間

# 名前固定のもの
## node名
node名はその役割に応じてプログラム中にハードコーディングする．同一nodeを複数起動する場合はnodeの名前空間で区別する．
[githubの公式example](https://github.com/ros2/examples)でもnode名は固定になっている．

### 個別の名付けルール

- "役割など"_node

## サービス名・トピック名
node名と同様．

# ルールを考えるもの
## ワークスペース名・パッケージ名
機能に応じた名前を考え適切につける．
ここで，nodeとメッセージ，テスト用プログラムは別々につくりたい．このことから，以下のようにする．

1. ワークスペース名として相応しい名前(例えばreinforcement_learning)を考える．
1. そのディレクトリを作成する(mkdir reinforcement_learning)
2. reinforcement_learning/にて，必要に応じて部品となるパッケージを作成する．代表的なのは以下の構造となる．
    - reinforcement_learning_msgs
    - reinforcement_learning_node
    - reinforcement_learning_target
1. reinforcement_learning/をgitで管理する(個々のパッケージで管理しない)

[あれ？ワークスペース？](https://qiita.com/NeK/items/18ff9e9c443295d5d805)

## c++などでの一般で言う名前空間
特にlibraryとしてnodeのクラスを作成する場合，プログラミング言語が提供する名前空間をつける(ROS特有の名前空間は「nodeの名前空間」にて)．
少なくとも名前空間として，パッケージ名をつける．それ以上は自由に．

例えばreinforcement_learning_nodesのクラスでは以下のような名前空間をつけること．

```c++
namespace reinforcement_learning\node{

}

あとは好みで例えば以下のように
namespace reinforcement_learning_node{
  namespace action_selection_method{

  }
}
```

## nodeの名前空間
ROS2ではnodeを一意に決定するために，nodeのnamespaceとnode名が使える．[公式のAPIのNodeのコンストラクタ](http://docs.ros2.org/dashing/api/rclcpp/classrclcpp_1_1Node.html)を見ると指定できることが分かる．
node名だけ指定した場合(node_name)，node_nameで指定でき，namespaceも指定した場合，node_nameや/namespace/node_nameで指定できる．

この名前空間については自由に考える．
dotfiles をgit bare repoで簡単に管理する

# Dotfilesどうやって管理していますか 

2019/07/19 update

##TL;DR 
今までは\$HOME/dotfiles以下で管理して、symlinkを貼っていた。(一部スクリプト化)
一方で、symlinkが適切に貼られなかったときなど管理が煩雑だった。
git bare repoを使うことで、$HOME直下の一部のdotfileをtrackして、symlinkを貼らずにcloneだけで設定が終わるようになった。

## 設定方法 (bash使用を仮定)

```
mkdir $HOME/dotfiles
git init --bare $HOME/dotfiles  #ここには.bashrcなどを置かない
echo 'alias config='/usr/bin/git --git-dir=$HOME/dotfiles/ --work-tree=$HOME'' >> $HOME/.bashrc
config config --local status.showUntrackedFiles no
```

## 使用法
`git add` などの代わりに `config add` など使う。

```
config add .bashrc
config commit -m "Add .bashrc"
remoterepo='https://github.com/xxx/dotfiles'
config remote add origin $remoterepo
config push origin master
```

## 環境構築方法
新しく環境構築する側で

- \.bashrc か .zshrcに aliasを以下のように設定しておく。

```
alias config='/usr/bin/git --git-dir=$HOME/dotfiles/ --work-tree=$HOME'
```

- dotfiles repoを引っ張ってくる

```
git clone --bare <git-repo-url> $HOME/dotfiles
source .bashrc
```

- dotfiles を$HOMEで展開する

```
cd 
config checkout
```

もともとのdotfiles が存在する場合errorとなる場合があります。
そのとき[ここ][link2]を読んでみてください。

## appendix
### git bare repoについて
`git init`で作られる.git ディレクトリの内容(commit historyなど)が作られる。詳しくは[参考資料](link2)参照。
あとはせっかくgitをつかっているので、hostによってbranch切りましょう。

### 参考資料

- [youtube: Git Bare Repository - A Better Way To Manage Dotfiles][link1] 

- [The best way to store your dotfiles: A bare Git repository][link2]  

[link1]:https://www.youtube.com/watch?v=tBoLDpTWVOM
[link2]:https://www.atlassian.com/git/tutorials/dotfiles
---

- リンク切れ修正、環境再構築の方法を追記　(2019/07/19)
[python]算数・数学④~数列など~

#前回まで
[前回はこちら](https://qiita.com/hiroyuki_mrp/items/a03d44b72d9668c6f4bd)

#改めて
機械学習を始めるにも、算数や数学がわからないと、入門書すら読めない。ただそこまで、ちゃんと解説してあるものもない。ということで最低限必要な数学基礎をこの記事で書けたらいいなと思っています。

#環境
ほぼ影響ないですが、python3系を利用。

#前提
四則演算や累乗（2乗とか3乗とか）がわかっていること。

# 等差数列

等差数列の$a_n$の計算(初項a、公差d)
$
a_n = a + (n-1)d
$

始点、終点（indexだから１つ前まで）,項差を指定するだけ
0~10までの項差1

```py
import numpy 
np.arange(0,11,1)
->array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

#もしくは
list(range(0,11,1))
# ->[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

等差数列の和(初項a、末項l、項数n)
$
S = \frac{1}{2}n(a+l)
$

```py
ans = np.arange(0,11,1)
sum(ans)
#-> 55

#もしくは
sum(list(range(0,11,1)))
#-> 55
```

## 等比数列

等比数列の$a_n$の計算(初項a、公比r)
$
a_n = ar^{n-1}
$

```py
[3**i for i  in  range(1,11,1)]
-> [3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049]
```

等比数列の和(初項a、末項l、項数n)r !=1
$
S_n = \frac{a(1-r^n)}{1-r}= \frac{a(r^n-1)}{r-1}
$

```py
sum([3**i for i  in  range(1,11,1)])
#-> 88572
```

等比数列の和(初項a、末項l、項数n)r =1

$
S_n = an
$

```py
ans = np.ones(10) * 5
sum(ans)
# -> 50

＃もしくは

ans = [5]*10
sum(ans)
# -> 50
```



#便利な和の公式
$
\sum_{k=1}^{n}k = \frac{1}{2}n(n+1)
$

$
\sum_{k=1}^{n}k^2 = \frac{1}{6}n(n+1)(2n+1)
$

$
\sum_{k=1}^{n}k^3 = (\frac{1}{2}n(n+1))^2
$

$
\sum_{k=1}^{n}c = nc
$

$
\sum_{k=1}^{n}(a_k+b_k) = \sum_{k=1}^{n}a_k+\sum_{k=1}^{n}b_k
$

$
\sum_{k=1}^{n}(pa_k) = p\sum_{k=1}^{n}a_k
$

#ここまで
この記事では本当に一部しか扱っていませんが、以下の記事ではたくさん扱われていたので、拝見さえていただきました。
[Pythonで数学の勉強：数列・級数・組み合わせ論](https://qiita.com/tibigame/items/84bfd46df494e05c711e)

[次回](https://qiita.com/hiroyuki_mrp/items/cc5668cda464624f2d6e)は集合と確率について投稿していきます。
React の流儀を読んでコードを書いてみた

## The React Way

[React の流儀](https://ja.reactjs.org/docs/thinking-in-react.html)を読んで学んだコンポーネントの階層構造などを意識した開発の練習

### 手順

#### UI をコンポーネント階層に落とし込む

   - 単一責任の原則 (single responsibility principle) を意識
   - コンポーネントを階層構造に並べてみる

#### React で静的なバージョンを作成する

   - 最初は、データモデルを受け取って UI の描画だけを行う、ユーザーからの操作ができないというバージョンを作る
   - props を通じてデータを渡す形で、自分のコンポーネントを組み上げていく
   - 静的なな Version を作成する際には state は必須ではない（動的なデータデータを扱うための機能）
   - コンポーネントはボトムアップでもトップダウンで作っても問題ない。大きなプロジェクトではテストを書きながら前者を、シンプルなアプリでは後者の方がら楽

#### UI 状態を表現する必要かつ十分な state を決定する

- アプリに求められている更新可能な状態の最小構成を、最初に考えておく
- 動的に変化するもの、そうでないものを考えて props か state か判断する

#### state をどこに配置するべきなのかを明確にする

- どのコンポーネントが state を所有するのかを明確にする
- 共通の親コンポーネントを見つけ state を与える
- 単方向データフローを意識する

#### 逆方向のデータフローを追加する

- 解読中...

#### Sketch でモックアップ作成

**ドキュメントにあるモックアップを参考に、Sketch でつくる**

![ItemList](https://user-images.githubusercontent.com/10560950/61163395-a4a4c180-a548-11e9-9774-a7471ef1c0f0.png)

**フォルダ構成および階層を書き出す**

![component](https://user-images.githubusercontent.com/10560950/61163441-f77e7900-a548-11e9-8b91-97408010c949.jpeg)

#### やってみた感想

![ezgif com-video-to-gif](https://user-images.githubusercontent.com/10560950/61167550-d5eab500-a57b-11e9-9843-a3d72a609507.gif)

- コードを書く前段階で考えるべきことが想像以上に多くあった。
- 流れを意識しながら書いたら、#2の静的なサイトの作成だけで4時間ほどかかってしまった...
- React に限らず、設計という概念を持つ必要があると学べた。
- `toLowerCase()`を使用し、大文字小文字関係なく検索できるようにした。
- `在庫商品のみ表示`と`カテゴリー名`などが実装できなかったので、今後追加。
vue.jsで容量の大きいファイルを読み込む時はimportするよりaxiosの方が良いかも

## importでファイルの読み込みが可能
パッと思いつくやり方として、importをする方法があります。

```js
import json from './test.json'

export default {
  // 省略
  // 読み込んだjsonが使用可能
}
```

### webpackでバンドルされる
デメリットとして、仮にこのファイルを使わなくてもwebpackでバンドルされてしまいます。
そのため、データを読み込むだけ読み込んで、使用しないという無駄のある作りになってしまいます。
何かのマスタデータのように容量の大きいファイルの場合は、必要な時だけそのファイルを読み込むという作りの方が良いのではないでしょうか。

## axiosで読み込みが可能
import以外にもaxiosを使用してファイルの読み込みが可能なため、こちらを使うことで必要なタイミングでファイルを読み込むことができます。
APIをコールするときのようにパスを指定することで、読み込みが可能です。

```js
mounted () {
  axios.get('./test.json')
  .then(response => {
    this.data = response.data;
  });
}
```

こうすることで、バンドル時には`test.json`が読み込まれず、mountされたデータが必要なタイミングのみ読み込みが行われるようになります。
実際にimportする場合とmountedでaxiosを使用して読み込む場合を比較してみても、mounted内で取得する方が容量が小さくなりました。ちなみにこのとき使用していたファイルはでかいです。

```bash
$ ll -h public/js/test.js
total 16328
// importでtest.jsonを取得時
-rw-r--r--  1 user  group   6.6M  6 28 12:10 public/js/test.js

// mountedの中でtest.jsonを取得時
$ ll -h public/js/ambassador.js
-rw-r--r--  1 user  group   3.4M  6 28 12:31 public/js/test.js
```
ユーザー登録画面を作成しながらDBを操作する画面作成の基礎を勉強してみる～テストデータ作成～

usersテーブルにテストデータを登録します。

## 手順

 1. データベースを作成します
 2. データベースにテストデータを登録します

## 1. データベースを作成します

usersテーブルをマイグレーションします。

```php:database/migrations/～_create_users_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
```
```
$ php artisan migrate
```

## 2. データベースにテストデータを登録します

FakerとFactoryを使ってテストデータを登録します。

Userのモデルを作成します。
appフォルダ配下に既に存在する場合は、この手順は不要です。

```
$ php artisan make:model User
```

ファクトリーを作成します。
database/factories配下に既に存在する場合は、この手順は不要です。

```
$ php artisan make:factory UserFactory
```

シーダーを作成します。

```
$ php artisan make:seeder UsersTableSeeder
```

Userファクトリーを編集します。

```php:database/factories/UserFactory.php
<?php

use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});
```

シーダーを編集します。

```php:database/seeds/UsersTableSeeder.php
<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory (\App\User::class, 20)->create();
    }
}
```

シーダーを実行してテストデータを登録します。

```
$ php artisan db:seed --class=UsersTableSeeder
```
ユーザー登録画面を作成しながらDBを操作する画面作成の基礎を勉強してみる

ユーザーの登録画面を作成しながらDBを操作する画面作成の基礎を勉強していきます。

[テストデータ作成](https://qiita.com/mikansei-lab/items/e4d6e259278e94e06923)
[コントローラとルーティングの作成](https://qiita.com/mikansei-lab/items/90633d1b3a4af5a69e76)
[ユーザー一覧画面の作成](https://qiita.com/mikansei-lab/items/71ae2d632062cd38a316)
[参照画面の作成](https://qiita.com/mikansei-lab/items/87d18f0692cd83722724)
[削除機能の実装](https://qiita.com/mikansei-lab/items/e84abf648a6e684d6d16)
[更新画面の作成](https://qiita.com/mikansei-lab/items/1622d99e65fa1ea482c5)
[新規登録画面の作成](https://qiita.com/mikansei-lab/items/cef22a3aec445af66cef)

## 使用するテーブル

テーブル名：users
テーブル構造：homestadにデフォルトで用意されているマイグレーションファイルを使用する。

## 用意する画面

|画面名|ファイル名|説明|
|:--|:--|:--|
|ユーザー一覧画面|users/index.blade.php|ユーザーの一覧を表示する|
|ユーザー登録画面|users/create.blade.php|ユーザー情報を新規登録する画面|
|ユーザー参照画面|users/show.blade.php|ユーザーの情報を参照する画面|
|ユーザー編集画面|users/edit.blade.php|ユーザー情報を更新する画面|

## プログラムの設計

|処理|メソッド|URL|Controllerメソッド名|ビュー|
|:--|:--|:--|:--|:--|
|一覧表示|GET|/users|index|index.blade.php|
|追加ページ表示|GET|/users/create|create|create.blade.php|
|追加処理|POST|/users/|store||
|参照ページ表示|GET|users/{id}|show|show.blade.php|
|編集ページ表示|GET|users/{id}/edit|edit|edit.blade.php|
|更新処理|PUT|users/{id}|update||
|削除処理|DELETE|users/{id}|destroy||

## 各画面の仕様

### ユーザー一覧画面

 - ユーザー一覧を表示する。各行の項目は次の通り。  
 [ID, 氏名, email, 参照リンク, 編集リンク, 削除リンク]
 - 参照リンクがクリックされた場合、ユーザー参照画面へ遷移し、選択された行のユーザー情報を表示する。
 - 編集リンクがクリックされた場合、ユーザー編集画面を表示し、選択された行のユーザー情報を表示する。
 - 削除リンクがクリックされた場合、選択された行のユーザーを削除する。

### ユーザー登録画面

 - 一覧画面へのリンクを設置する。
 - 保存ボタンを設置し、クリックされた場合、入力内容でユーザーを登録する。

### ユーザー参照画面

 - 一覧画面で選択されたユーザーの情報を初期表示する。
 - 一覧画面へのリンクを設置する。

### ユーザー編集画面

 - 一覧画面で選択されたユーザーの情報を初期表示する。
 - 一覧画面へのリンクを設置する。
 - 保存ボタンを設置し、クリックされた場合、入力内容でユーザーを更新する。
helm bitnami/magento chart を minikube で動かした

# bitnami/magento on minikube
helm での k8s 複数台構成の勉強用に bitnami/magento chart を minikube 上で起動したときの手順を残した。

## 先にオチ
重すぎてローカルではほぼ動かない！

## 手順紹介
1. [minikube インストール](https://kubernetes.io/docs/tasks/tools/install-minikube/)
2. [helm インストール](https://helm.sh/docs/using_helm/#installing-helm)
3. 以下コマンド作業

```
# メモリとディスクをたくさん消費します。ミニマムこのくらいの設定が必要
$ minikube start --vm-driver=hyperkit --memory 4096 --disk-size 30g

# helm 初期化
$ helm init --history-max 200

# elasticsearch にメモリ設定を上書きを許可。
$ helm install bitnami/magento --set elasticsearch.sysctlImage.enabled=true

この時点ではアプリが必要とする情報が渡されておらず、起動できない。

# （別ターミナルtab作業） ローカル hosts を解決し、ロードバランサーにIPを渡す
$ minikube tunnel

# 必要な変数を用意する（fishシェルは$を外す）
$ export APP_HOST=$(kubectl get svc --namespace default HELM_NAME-magento --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
$ export APP_PASSWORD=$(kubectl get secret --namespace default HELM_NAME-magento -o jsonpath="{.data.magento-password}" | base64 --decode)
$ export APP_DATABASE_PASSWORD=$(kubectl get secret --namespace default HELM_NAME-mariadb -o jsonpath="{.data.mariadb-password}" | base64 --decode)

# オプションから変数を渡して更新し、起動
$ helm upgrade HELM_NAME bitnami/magento \
      --set magentoHost=$APP_HOST,magentoPassword=$APP_PASSWORD,mariadb.db.password=$APP_DATABASE_PASSWORD

```
VimでDockerコンテナを操作する

こんにちわ。
[ゴリラ.vim](https://gorillavim.connpass.com/)を運営している[ゴリラ](https://twitter.com/gorilla0513)です。

みなさんVimとコンテナは好きですか？
普段VimでDockerfileを書いたりする時にコンテナの状態気になりませんか？
あの子元気かな？とか、この子今起きているかなとか、いろいろ気になると思います。

そんな方むけにVimからコンテナを操作したり、監視したりするプラグインを作ってみました。

<a href="https://github.com/skanehira/docker.vim"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/skanehira/docker.vim.png" width="460px"></a>

# どういうやつ？
![docker.vim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/06fd3ff9-4b54-d442-5f0b-4183aaeeedb7.gif)

## できること
現時点で以下のことができます。
のんびり開発中でまだ実装したい機能がありますが、とりあえず形になったので公開しました。

### images

- get images
- delete image
- pull image

### containers

- start/stop/restart/kill container
- delete container
- attach container(require docker command)
- monitoring container CPU/MEM

## 使い方
READMEを参照してください。
コマンドとキーバインドがあります。基本一覧ではキーバインドを使った操作になります。
例えば、`:DockerContainers`でcontainers画面を開き、uでコンテナ起動、sでコンテナを停止します。

## おすすめポイント
Vimを止めることなくattachしつつ、CPUやMEMの使用率を監視できる機能が推しです。
ただ、モニターに関しては現在Mac/Linuxしか対応していないので、今後Windowsも対応していく予定です。

attachに関しては、裏で`docker exec -it {container} {cmd}` というふうに実行しているので、dockerコマンドが必要になってきます。

## 仕組み
API通信は裏でcurlを使っています。
`curl --unix-socket /var/run/docker.sock http://localhost/containers/json`という感じでコマンドを実行しています。
こちらは`vital`というライブラリの`web.http` モジュールを使っています。
プラグインで使いやすいように、それを更にすこしwarapした関数を用意しました。

```vim
" http get
function! docker#api#http#get(url, param) abort
	return s:HTTP.request(a:url, {
				\ 'unixSocket': '/var/run/docker.sock',
				\ 'param': a:param
				\ })
endfunction
```

あとは `docker#api#http#get` に`url`と`queryparameter` を渡せば良いだけです。簡単ですね。


一覧表示ではテーブルを使っています。こちらに関しては、`text.table`モジュールを使用しています。
こちらを使用すれば簡単にテーブルを作れます。とても便利ですね。

```vim
" ヘッダとカラム数を指定してtableオブジェクトを作る
let l:image_table = s:TABLE.new({
			\ 'columns': [{},{},{},{},{}],
			\ 'header' : ['ID', 'REPOSITORY', 'TAG', 'CREATED', 'SIZE'],
			\ })

" curlのレスポンスを１行ずつ整形してテーブルに追加
for row in a:ctx.content[a:ctx.offset:a:ctx.offset + a:ctx.top - 1]
	let l:image = docker#util#parse_image(row)

	call l:image_table.add_row([
				\ l:image.Id,
				\ l:image.Repo,
				\ l:image.Tag,
				\ l:image.Created,
				\ l:image.Size])
endfor

" table.stringify()で実際のテーブルテキストを出力
let a:ctx.view_content = l:image_table.stringify()
```

ざっくりですが、実はそんな難しいことはしていなくて、
裏でDocker EngineのAPIを叩いて結果に応じてVimのポップアップウィンドウを使っていい感じにインターフェイスを用意して操作する感じです。

# 最後に
このプラグインはまだ開発途中です。
バグや要望があればissueやPRをください。みなさんの意見・要望・PRがたくさん来ることを楽しみにしています。
Kindle fire上で動くtermuxのvimでskk日本語入力をする

Kindle fireでtermuxを使うとCUIが使えて楽しいのだけれども,標準状態だと日本語入力ができない.全部英語で書けば解決しそうだがせっかくなのでskkを入れて日本語を打てるようにしたい.
#プラグインのインストール
deinを使ってるのでtomlファイルに欲しいものを書く.

~~~
[[plugins]]
repo = 'tyru/skk-vim'

[[plugins]]
repo = 'vim-jp/autofmt'
~~~

`tyru/skk-vim`がメインのskkしてくれる子.`vim-jp/autofmt`は日本語の整形をしてくれる子らしい(具体的に何をしてるか知らない).
Vimを立ち上げ直すとインストールが始まるので待つ.
#skk辞書を入れる
とりあえずlarge辞書入れればいいと思った.
まず辞書ファイルをダウンロード,その後解凍.辞書ディレクトリを作ってそこに置く.

~~~
$Curl openlab.jp/skk/dic/SKK-JISYO.L.gz -o SKK-JISYO.L.gz
$gzip -d SKK-JISYO.L.gz
$mkdir .skk-dic
$mv SKK-JISYO.L .skk-dic/SKK-JISYO.L
~~~
#辞書ファイルの文字コードを変更
ダウンロードした辞書ファイルをそのまま使おうとすると漢字への変換が上手くいかない.そのため辞書ファイルの文字コードを変更する.
実際にSKK-JISYO.Lをvimで開いて

~~~
:set fenc?
~~~
を叩くと`euc-jp`と帰ってくる.これを`utf-8`にしたい.
SKK-JISYO.LからSKK-JISYOutf-8.Lみたいな名前のコピーを作ってからvimのコマンドラインで

~~~
:set fenc=utf-8
~~~
をすると上手くいく.

#.vimrcの設定
必要なものが揃ったので.vimrcに色々書き込んでいく.

~~~
"skk-vim options
let g:skk_large_jisyo = '~/.skk-dic/SKK-JISYOutf-8.L'
let  g:skk_egg_like_newline=1

"autofmt option
set formatexpr=autofmt#japanese#formatexpr()

~~~
`skk_large_jisyo`に辞書ファイルの場所を入れてあげる.`skk_egg_like_newline`を1にすると入力確定時のenterキーによる改行を無視してくれる.`set formatexpr=autofmt#japanese#formatexpr()`はautofmtによる日本語整形機能の有効化させる.

#おわり
これで日本語入力できるようになりました.やったね.
まぁ英語で書いた方が楽なんですけどね.
#参考ページ
[skk.vim を導入しました | だえもんのブログ](https://ameblo.jp/dae-mon/entry-12443103423.html)
[Vim のすゝめ - Vim と日本語 | 株式会社創夢 — SOUM/misc](https://www.soum.co.jp/misc/vim-no-susume/12/)
kaggleのTitanicチュートリアルをやって気づいたpandasのハマりどころ

# はじめに
盛大にハマって、4, 5時間+α(やる気がなくなって進まなかった時間)を溶かしたので、自戒の念も込めて書きます。
ほとんどkaggleは関係なく、pythonのリストのidに関する記事かと思います。

見事なハマりポイントのあったチュートリアルは、下のリンクから飛べます。
[Titanic Data Science Solutions | Kaggle](https://www.kaggle.com/startupsci/titanic-data-science-solutions

# 本題
## データ前処理のコード
このチュートリアルの中では、trainデータとtestデータをリストにまとめることで、データの前処理を楽に行えるようにしています。

```python
import pandas as pd

train_df = pd.read_csv('../input/train.csv')
test_df = pd.read_csv('../input/test.csv')

combine = [train_df, test_df]
```
`combine`という名前のリストにまとめて処理を行います。
例えば、`train_df`と`test_df`のそれぞれの`Name`カラムから、敬称(Mr, Ms, Mrs, Dr)などを抽出し、`Title`という新しいカラムを作るのは、下のコードで実現できます。
（わかりやすいように、元のコードを書き直してあります)

```python
for dataset in combine:
    dataset['Title'] = dataset["Name"].str.extract(' ([A-Za-z]+)\.', expand=False)
```
`train_df`と`test_df`は書き換わり、`Title`カラムが作られます。

## 謎の再代入
こんなコードがありました。

```python
train_df = train_df.drop(['Ticket', 'Cabin'], axis=1)
test_df = test_df.drop(['Ticket', 'Cabin'], axis=1)
combine = [train_df, test_df]
```
`train_df`と`test_df`の`Ticket`及び`Cabin`カラムを削除するコードです。
しかし、3行目の`combine = [train_df, test_df]`をまたやってる意味がわかりませんでした。
「さっきcombineに代入してたやないか！」と。
そして、データフレームをまとめて処理するならこのほうがいいだろうと、下のコードを書いたわけです。

```python
for dataset in combine:
    dataset = dataset.drop(['Ticket', 'Cabin'], axis=1)
```
## 削除されないカラム、合わない列数
コードを実行して`train_df`と`test_df`の中身を確認しても、`Ticket`と`Cabin`カラムが消えてないんですよ。
だから、学習に進もうにも挙動が少し違っていました。
でも原因は特定できず。

## 原因
このkaggleのチュートリアルはjupyter notebookで提供されていました。
なので、元のコードを動かして原因を特定しようと思い実行。
大幅に違うコードはやっぱり、dropする部分でした。

dropは、特定の行または列を落としたデータフレームを返すメソッドです。
dropメソッドを実行しただけでは消えないので、代入することで、元のデータフレームを置き換えます。

```python
train_df = train_df.drop( 条件など )
```
ここで、再代入が発生することになるわけです。再代入するということは、つまりオブジェクトが変わるということ。
dropする前とした後の`train_df`では、idが変わっているわけです。

```python
print(id(train_df))  # 4705601968
train_df = train_df.drop("Age", axis=1)
print(id(train_df))  # 4706557120
```
なので、dropメソッドを使って代入した後では、それを指す`combine`変数も`combine = [train_df, test_df]`で再代入する必要があるわけです。

「正しいdrop」

```python
train_df = train_df.drop(['Ticket', 'Cabin'], axis=1)
test_df = test_df.drop(['Ticket', 'Cabin'], axis=1)
combine = [train_df, test_df]
```
<img width="855" alt="スクリーンショット 2019-07-13 14.13.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106956/927cce19-1708-1228-4c3f-80bf378cdac5.png">

## for文を使ったdropがいけないわけ
```python
for dataset in combine:
    dataset = dataset.drop(['Ticket', 'Cabin'], axis=1)
```
このコードがうまく動作しなかった理由は単純でした。
`dataset`という変数には、`combine`の中身(`train_df`, `test_df`)が順番に渡されます。
その`dataset`という変数にdropしたデータフレームを渡しても、元のtrain_dfにはなんの影響も与えません。
C++の範囲for文の動作とpythonのfor文の動作がごちゃごちゃになっていました。

<!--
```c++
for (auto& e: combine) {
  e = e.drop("Age", axis=1)
}
```
-->
# まとめ
pythonのリスト関係で動作がおかしくなったとき、オブジェクトのidが関係することが多くあります。
今回、pandasのデータフレームがリストの要素に入っていたこともあり、原因がわかりにくくなっておりました。
今後も精進したいと思います。
sshpass をJavaからshellなどで呼ぶ場合、パス付きが必須のようです。

ssh -i /Users/uramoty/.ssh/id_rsa ログインしたいホストのIPかURL

をターミナルから実行すると、無事ログインできるわけですが、Javaを挟んで、

	    String[] cmd = {				 
                "sshpass",
				"-p",
				"パスワード",
				"ssh",
				"-r",
				"-o",
                "ログイン先ホストGIP"
		};
		doShell SampleRunTime = new doShell();
		try {
			SampleRunTime.execCmd(cmd);
		} catch (Exception e) {
			e.printStackTrace();
		}

などと書くとなぜか、エラー。
which sshpass すると、/usr/local/bin/sshpass
なので、
上記サンプルの"sshpass",を"/usr/local/bin/sshpass",
にしてみてください。
それでもダメなときは、上記サンプルの"sshpass",を

/usr/local/bin/**sshpassの実体パス**。
"/usr/local/Cellar/sshpass/1.05/bin/sshpass",

に。
[Ruby] 本日の日付から曜日を日本語で取得する

#本日の日付を曜日で出力しよう
Rubyで本日の日付を出力するコードをご紹介します。

##実際のコード
全ての行にコメントして解説しています。
よかったら参考にしてください。

```ruby:routes.rb
require 'date'
#日付に関するDateクラスを使用します、という宣言を行う
d = Date.today
#todayメソッドによって、Dateクラスのインスタンスを作成する。これによって、本日の情報（2019年7月13日）がインスタンスに入る

puts '今日は'+%w(日 月 火 水 木 金 土)[d.wday] + '曜日'
#wdayメソッドはインスタンスの情報から曜日だけを抜き出す。日曜日が0、月曜日が１、火曜日が２のように0~6までの決まりの数字が入る
#今回は土曜日なので[d.wday]には6が入っている
#%wは後置してある（）の中の要素で配列を作成するので、["日","月","火","水","木","金","土"]と同義
#配列に対して[d.wday]（中身は本日の場合土曜日なので6）という番号で取り出す→つまり配列の中の7番目の要素である「土」が抜かれる
```

以上となります。
wdayメソッドなどはrequire 'date'で宣言をしないと使えないので、日付け系のメソッドを使用する際は宣言するのを忘れないようにしましょう。
IntteliJ インストール + HelloWorld(mac)

二回目があっても迷わないように備忘録

参考
意外と誰も教えてくれないIntelliJ IDEAの使い方(基本から応用まで)
・ https://qiita.com/syu_chan_1005/items/46f94412f7493d6e60eb

前提
jdk1.8
IntelliJ 2019.1

## IntelliJをダウンロードする
公式サイト
https://www.jetbrains.com/idea/

無料のCommunity版を使用するため、トップに出てくるDOWNLOADではなく、一番下にスクロールして出てくる右側のDOWNLOADを選択する
(有料版のUltimateを使用する場合は左側のDOWNLOAD)
<img width="1298" alt="スクリーンショット 2019-07-13 12.18.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289347/587bb169-a43d-c2a0-df1a-3de55b80e5c6.png">

## IntelliJ 起動
<img width="778" alt="スクリーンショット 2019-07-13 12.12.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289347/1bdd27ff-1a15-a229-d6b3-69c75ff40818.png">

## Project作成
起動したIntelliJからCreate New Projectを選択する
Project SDKがjavaであることを確認し、Libraries and Frameworksにはチェックを入れずにNextを押下する
<img width="686" alt="スクリーンショット 2019-07-13 12.54.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289347/68e319ee-66cd-a5d7-1d66-acedff6c9791.png">

Create project from templateにチェックを入れ、Java Hello Worldを選択後、Nextを押下する
<img width="302" alt="スクリーンショット 2019-07-13 13.03.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289347/ffffd4ec-21e8-0dd1-b0e0-b1701e48a00f.png">

Project name、Projectlocationに自由な名前を入れる(初期表示はuntitled）
FInishを押下する
<img width="382" alt="スクリーンショット 2019-07-13 13.08.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289347/1f109b4b-6607-6e59-dc17-4b2cd135065c.png">

##Hello World
Tip of the Dayが出てきた場合はCloseを選択する
(本日の豆知識なので時間があるときに読む）
<img width="771" alt="スクリーンショット 2019-07-13 14.09.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289347/0f88841f-e977-923a-bf95-813d9c9e9fc4.png">
実行してみる
右上の実行ボタンを選択
<img width="796" alt="スクリーンショット 2019-07-13 14.07.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289347/13b807ba-8b98-37bd-d217-ae771639c5eb.png">
Hello World!が出ました
よかったですね

##感想
名前がかっこいいから触ってみたが補完が出て来る速度が早くて気持ちがいい
JSやSpringのサポートはUltimate版のみのようなので、今は見送りの方向　お金に余裕できたら使う
関係ないけどMacのTouchBarに実行ボタンとか出ることを初めて知った
テーブルにソート機能をつける

# 実現したい仕様

- テーブルのヘッダー文言の初期表示は「登録日時△」
- テーブルのヘッダーをクリックすると、そのカラムの内容でソートされ、ヘッダー文言は以下のようになる
    - 「登録日時△」->「登録日時▼」（降順ソートになる）
    - 「登録日時▼」->「登録日時▲」（昇順ソートになる）
    - 「登録日時▲」->「登録日時▼」（降順ソートになる）
- 「更新日時」カラムも同様
    - 但し、「更新日時」ヘッダーをクリックすると、「登録日時」ヘッダーは「登録日時△」の表示になる（逆も同様）

# 実装

```routes.rb
Rails.application.routes.draw do
  resources :books do
    collection do
      get :sort
    end
  end
end
```

- コントローラはもっとDRYできそうです。

```books_controller.rb
class BooksController < ApplicationController
  before_action :set_variable, only: [:index, :sort]

  def index
    @books = Book.all
  end

  def sort
    if params[:created_at].present?
      @created_at_num = params[:created_at].to_i

      if @created_at_num == 0
        @books = Book.order(created_at: :DESC)
        @created_at = '登録日時▼'
        @created_at_num = 1
      else
        @books = Book.order(created_at: :ASC)
        @created_at = '登録日時▲'
        @created_at_num = 0
      end

    elsif params[:updated_at].present?
      @updated_at_num = params[:updated_at].to_i

      if @updated_at_num == 0
        @books = Book.order(updated_at: :DESC)
        @updated_at = '更新日時▼'
        @updated_at_num = 1
      else
        @books = Book.order(updated_at: :ASC)
        @updated_at = '更新日時▲'
        @updated_at_num = 0
      end

    else
      @books = Book.all
    end
    render :index
  end

  private

  def set_variable
    @created_at = '登録日時△'
    @updated_at = '更新日時△'
    @created_at_num = 0
    @updated_at_num = 0
  end
end
```

- Bootstrapの記述があります。見辛かったらすみません。

```index.html.slim
.container

  h1.mb-3 書籍一覧

  - if @books.size > 0
    table.table.table-bordered
      thead.thead-light
        tr
          th タイトル
          th 著者
          th.pointer onclick='window.location="#{sort_books_path(created_at: @created_at_num)}"' role="link"
            = @created_at
          th.pointer onclick='window.location="#{sort_books_path(updated_at: @updated_at_num)}"' role="link"
            = @updated_at
      tbody
        - @books.each do |book|
          tr
            td
              = book.title
            td
              = book.author
            td
              = book.created_at
            td
              = book.updated_at
  - else
    .mt-5.text-center 該当のデータはございません。

```

# まとめ
- あんまりこれといった学びポイントが無かった？ですかね。。。とりあえず冗長さが感じられるので、ググりながらもっといい書き方無いか探してみます。
Cloud9でターミナルからファイルを開く方法【c9コマンドを使う】

c9をインストールすれば、Cloud9のターミナルからファイルを開くことができるようになります。Linuxの「open」コマンドみたいなものです。


1. c9をインストール 

```
npm install -g c9
```

以下のコマンドでファイルを開くことができます。

```
c9 ファイル名
```

以上です。
Raspbian Buster 2019-07-10 Release-note 翻訳

(追記: 10/2にRaspbian Buster 2019-09-26がリリースされています)
https://qiita.com/utaani/items/85f6e6515ed576cadb9a

http://downloads.raspberrypi.org/raspbian/release_notes.txt

Raspberry Pi設定でPi4のビデオ出力切り替えのオプションをわかりやすくした
Appearance Settingsにセカンドモニターにタスクバーを移動する設定を追加
Recommended Software にアーキテクチャによるパッケージのインストールを制限する設定を追加
Adobe Flash player 新バージョン(32.0.0.223)
画面リフレッシュレートの選択をScreen Configurationに追加
Pi4でLibreOfficeのテキスト挿入カーソルが消えていた問題を修正
タスクバーのWi-Fiアイコンがクリックされた時にWi-Fiが中断する問題を修正
デスクトップのログインプロンプトで間違ったデスクトップ背景だったのを修正
obconfとlxapperaranceでセグメンテーションフォルトが発生していたのを修正
Screen Configurationでファイルポインターが閉じれなかった問題を修正
たくさんのデバイスが検出された時にBluetoothプラグインがフリーズしていたのを修正
lxterminalでURLを開くが動作していなかったのを修正
キーボードでスタートメニューを開く時に間違ったモニターに表示していたのを修正
セカンドモニターで最小化できない場合にタスクバーの[]が消去されていなかったのを修正
Linux kernel 4.19.57
Raspberry Pi ファームウェア cb3a32adf39f45a49be454e30c7464920ad7c605
[AWS][前編]ログ基盤を構築する

[現在作成中のAlexaスキル](https://qiita.com/toctoc0352/items/61c3c2b761a8fab47f7a)にログ基盤を構築しています。
今回は技術情報ではなく、進捗状況をお話させて頂けたらと思います。

## AWSマネージドサービスのログ基盤との出会い

インフラ部分をもっと充実させたいと思い、調べてみたら以下の記事が見つかった。
[クラスメソッド、Amazon Alexaスキルのフルマネージドサービスを提供開始
〜音声インタフェースの設計開発から運用時の継続的なユーザー体験の改善までサポート〜](https://classmethod.jp/news/amazon-alexa-skills/)

ログは普段の業務でも障害解析のために利用したりしているが、AWSでログ基盤を構築すると何ができるのか興味が出てきたため、ログ基盤構築に取り掛かることにした。

## 構成
![AWSログ基盤.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406177/646383f2-5e6d-fb57-3489-81118b5acc22.jpeg)

上記構成で構築することを考えた。
特にSQLでログを検索できる(Athana)のは、普段から業務でSQLを触っている者としては非常に魅力的に感じた。

## 課題

しかし、事はそう簡単に行かず、2つの課題に直面した。

### 1. CloudWatchのログをFirehoseで読み込む際にエラーが発生
* エラー内容 :

``` エラーログ
Encountered malformed JSON. Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens at [Source: com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream@5b2f3ec7; line: 1, column: 2]
```
* 原因 : AWSサポートに問い合わせたところ、[Firehoseの入力データ形式をJSONにしなければならない](https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/record-format-conversion.html)との事。
* 解決策 : [CloudWatchのログをJSONに変換するために別のAWS Lambdaを用意する必要がある事](https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/data-transformation.html) を教えてもらった

### 2. AWS Lambdaで変換したログをFirehoseで読み込む際にエラーが発生
* エラー内容 :

``` エラーログ
Encountered malformed JSON. Unrecognized token 'START': was expecting ('true', 'false' or 'null') at [Source: com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream@3257c660; line: 1, column: 7]
```
* 手順
(1) Lambdaで関数を追加
       関数の作成 -> 設計図の使用  -> kinesis-firehose-cloudwatch-logs-processor  を選択
(2) firehoseの設定(Transform source records with AWS Lambda)で上記Lambda関数を設定

* 原因 : AWSLambda関数kinesis-firehose-cloudwatch-logs-processorだけではCloudWatchのログの形式を変換できず、データの解析、レコード形式の変換時にエラーが発生

* 解決策
(1) CloudWatch Logsから送信されたレコードから、個々のログイベントを解析して抽出 
(2) 出力したい構造に合わせたJSON形式に変換

上記の1についてはAWSLambda関数kinesis-firehose-cloudwatch-logs-processorで実装されているため、2を実現するためには、kinesis-firehose-cloudwatch-logs-processorを編集する

## 現状

まだ、JSON形式に変換するためのAWS Lambdaを作成中です。
構成を考えた当初は設定だけでログ基盤を構築できると思ったが、現実はそう甘くないみたいです。
この続きはまた[次回](https://qiita.com/toctoc0352/items/372537ac91d90a7a2365)に投稿したいと思います。
Enable copying "pwd" result to clipboard in macOS(set alias on fish)


### 1. copy pwd command result to clipboard
write this.

```zsh
$ pwd | pbcopy
```

you can copy pwd result to macOS clipboard. 


### 2. set alias

to avoid search like this...
> "how to copy pwd command result to clipboard on mac"
(on google word search)

you can set alias.


```zsh
$ alias pwdcp 'pwd | pbcopy'
```


try


```zsh
pwdcp
```
and Command + V.

you can did it, right? 
if not, check your os is really really macOS ;(



### 3. save function on fish (optional)

```zsh
$ funcsave pwdcp
```

that's all. see you!

enjoy :)
[AWS][後編]ログ基盤を構築する

※現在、ログ基盤を構築中です。もうしばらくお待ち下さい※

2019/07/30 途中経過追記

## CloudWatch Logに出力する内容を決める

[前回の投稿](https://qiita.com/toctoc0352/items/8886f4e827481c500915#2-aws-lambda%E3%81%A7%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%9F%E3%83%AD%E3%82%B0%E3%82%92firehose%E3%81%A7%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E9%9A%9B%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F)からAWS Lambdaで変換したログをFirehoseで読み込む際にはログ出力内容をJSONに変換する必要があることがわかりました。
ただし、JSONに変換するにしても、出力する内容を決めていない状態だったので、ひとまずアクセスログを出力することに決めました。

## アクセスログを出力する(T.B.D)

Alexaスキルを作っているため、Alexaからのリクエスト内容を取得できるAPIを調査したところ、以下がヒットしました。
https://alexa-skills-kit-python-sdk.readthedocs.io/ja/latest/REQUEST_PROCESSING.html

上記を参考にして、Pythonのログライブラリ(logging)を使い、CloudWatch Logに出力はできたが、改行されてしまい、CloudWatch Logの複数行にわたりJSON形式のログが出力されてしまう。
Splunkでフィールドの値からフィールドを作成

## やってみました。

```Splunk:SPL
| makeresults
| eval field_name="ABCDEF"
| eval field_name=split(field_name,"")
| mvexpand field_name
| eval {field_name}=random() %10
```

## 解説
1.  いつもの`makeresults`
2.  _field_name_に値を設定
3.  `split`で**multi value**に変更
4.  `mvexpand` で行分割
5.  `eval`で{フィールド名にしたいフィールド}に値をセット

## 結果
<img width="1280" alt="qiita.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/e2f3a9f5-d0ab-eb03-e314-4926f03d4e44.png">

あとは不必要なフィールドを消していけばいい。

:sweat: これくらいだと普通に`eval`で書いてってももいいね
mongoDBに接続するとき、パスワードに記号を使っているとき注意すること

## 先に結論
パスワード等に記号を使うときは、必要に応じてエンコードするのを忘れない。

## 簡単な経緯
[Full Stack Vue.js, Express & MongoDB [1] - Express API](https://youtu.be/j55fHUJqtyw)
↑の動画を観ながら、node.js, express, mongoDB, vueを使ってアプリを作ろうとしていた。
動画では[mLab.com](https://mlab.com/)を使用していたが、2019年2月以降新規の会員登録を停止している旨が書いてあったので、今回は[mongoDB Atlas](https://cloud.mongodb.com)を使うことにした。

## エラー発生
mongoDBに接続しようとしたら以下のようなエラーがでた
`UnhandledPromiseRejectionWarning: MongoParseError: URI does not have hostname, domain name and tld`

## 原因
パスワードに記号を含めていたが、その文字をエンコードしていなかったため、エラーがでたようだ。



## 対策
記号を[ASCII Codes Table](https://ascii.cl/)をもとにエンコードしたら解決できた。

```javascript
const uri = "mongodb+srv://<ID>:<password>@mongoDBのURI";
```

ここの`<password>`欄に

`p@ssw0rd'9'!`

と入れたいなら、

`p%40ssw0rd%279%27%21`

とエンコードしてあげないといけない。

*参考*

[Special characters in connection string password](https://docs.atlas.mongodb.com/troubleshoot-connection/#special-characters-in-connection-string-password)

## 雑感
たぶんID, PASSWORDを他の変数にいれて、エンコードしたうえでDBのURIを作成とかするほうがいいのかなと思った。
【matplotlib応用】グラフのもう一つの配置方法をやってみる♬

何度もググっているので簡単なアプリ作って、理解しておこうと思う。
以下の参考に簡単な例から順に記載されている。
今回は、基本はわかっているけどな人対象に記載する。
【参考】
・[matplotlib - 2D and 3D plotting in Python](https://www.southampton.ac.uk/~feeg1001/notebooks/Matplotlib.html)

###通常のグラフ配置と表示範囲制御
以下のように実施する。
以下は、プロットレンジの例として参考のIn [39]:に掲載されている例を2x3配置に変更したものである。
ここで、ぴったり表示するために真ん中ではaxis('tight')を利用し、さらに三つ目では、 set_ylim([0, 60])などを利用している。
※因みに、1x3配置ではaxes[0]など一次元とする

```py
import matplotlib.pyplot as plt
import numpy as np
import matplotlib

fig, axes = plt.subplots(2, 3, figsize=(12, 8))　#2x3の配置
x = np.linspace(0, 5, 10)

axes[0,0].plot(x, x**2, x, x**3)
axes[0,0].set_title("default axes ranges")

axes[0,1].plot(x, x**2, x, x**3)
axes[0,1].axis('tight')
axes[0,1].set_title("tight axes")

axes[0,2].plot(x, x**2, x, x**3)
axes[0,2].set_ylim([0, 60])
axes[0,2].set_xlim([2, 5])
axes[0,2].set_title("custom axes range")

axes[1,0].plot(x, x**2, x, x**3)
axes[1,0].set_title("default axes ranges2")

axes[1,1].plot(x, x**2, x, x**3)
axes[1,1].axis('tight')
axes[1,1].set_title("tight axes2")

axes[1,2].plot(x, x**2, x, x**3)
axes[1,2].set_ylim([0, 60])
axes[1,2].set_xlim([2, 5])
axes[1,2].set_title("custom axes range2")
fig.savefig("./moving_fig/ordinary_fig.png", dpi=200)
plt.show()
plt.close()
```
![ordinary_fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/1ad11ccc-ffe6-076d-0bb6-e122dce003d7.png)

###座標を利用して図を配置する
以下は参考のIn [13]:のものを少し拡張して通常利用するものを追加して直感的に理解できるように一つのアプリにしたものである。

```py
import matplotlib.pyplot as plt
import numpy as np
import matplotlib

x = np.linspace(0, 5, 10)
y = x ** 2

matplotlib.rcParams.update({'font.size': 18, 'font.family': 'sans', 'text.usetex': False}) 
fig = plt.figure(figsize=(8,6))  #(width,height)
for i in range(10):
    x_offset=np.round(0.05*4,decimals=2)
    y_offset=np.round(0.05*i,decimals=2)
    width=0.3
    height=0.3
    axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # main axes
    axes2 = fig.add_axes([x_offset, y_offset, width, height]) # insert axes
    
    # main figure
    # possible marker symbols: marker = '+', 'o', '*', 's', ',', '.', '1', '2', '3', '4', ...
    # possible linestype options ‘-‘, ‘--’, ‘-.’, ‘:’, ‘steps’
    axes1.plot(x, y, color='r', lw=3, linestyle='--',marker='o' , label=r"$y = x^2$")
    axes1.legend(loc=1) # upper light corner
    axes1.grid(True)
    axes1.set_xlabel('x')
    axes1.set_ylabel('y')
    axes1.set_title('title')

    # insert
    axes2.plot(y, x, 'g', label=r"$x = y^2$")
    axes2.legend(loc=2) # upper left corner
    axes2.set_xlabel('y')
    axes2.set_ylabel('x')
    axes2.set_title('insert title;'+str(x_offset)+"_"+str(y_offset))
    plt.pause(1)
    fig.savefig("./moving_fig/moving_fig"+str(i)+".png", dpi=200)
    plt.clf()
```
while True:などで図を消去せずに回していると重くなるので、以下を適当に使って適宜消去する。上ではplt.clf()で図を毎回消去している。

```
cla()   # Clear axis
clf()   # Clear figure
close() # Close a figure window
```
![lecture_moving_fig.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/ad452674-de7b-cf78-5b26-89c9bf2a8d76.gif)
###まとめ
・通常のグラフ配置関連の描画方法をやってみた
・座標で配置する方が配置の自由度が高い
・その他、諸々の描画方法を試してみた