OmniAICreator/Qiita-1.07M huggingface dataset:
macOS MojaveでHomebrewをインストールするぞい

環境: macOS Mojave　10.14.3

使用しているMacでRubyの環境構築をしたくてrbenvをインストールすることにしました。
rbenvをインストールするにはさらにHomebrewが必要なのね、ということでHomebrewをインストール

## 事前準備
* App StoreからXcodeをインストール
* Xcodeを立ち上げ規約に同意

## Homebrewインストール方法

Homebrewのサイトにアクセスし、URLをターミナルでコピペ
Homebrewインストール先
[https://brew.sh/](https://brew.sh/)

この時Xcodeの規約に同意してないとインストールできないので注意です

```

You have not agreed to the Xcode license.
Before running the installer again please agree to the license by opening
Xcode.app or running:
    sudo xcodebuild -license

```


```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew

Press RETURN to continue or any other key to abort
==> Downloading and installing Homebrew...
remote: Enumerating objects: 18, done.

略

From https://github.com/Homebrew/brew
 * [new branch]      master     -> origin/master
 * [new tag]         0.1        -> 0.1
 * [new tag]         0.2        -> 0.2
 * [new tag]         0.3        -> 0.3
・
・
・
 * [new tag]         2.0.5      -> 2.0.5
 * [new tag]         2.0.6      -> 2.0.6
HEAD is now at ee64b7caa Merge pull request #5937 from MikeMcQuaid/dev-cmd-test-cleanup
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Tapping homebrew/core
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Enumerating objects: 4957, done.
remote: Counting objects: 100% (4957/4957), done.
remote: Compressing objects: 100% (4760/4760), done.
remote: Total 4957 (delta 51), reused 354 (delta 6), pack-reused 0
Receiving objects: 100% (4957/4957), 3.99 MiB | 380.00 KiB/s, done.
Resolving deltas: 100% (51/51), done.
Checking out files: 100% (4974/4974), done.
Tapped 2 commands and 4742 formulae (4,999 files, 12.4MB).
Already up-to-date.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh

```

やっとできた〜〜〜


```

$ brew help

```
でコマンドを確認できます。


```
Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA

Contributing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh

```

インストールの完了確認は

```

$ brew doctor
Your system is ready to brew.

```

お疲れ様でした！
VBScriptのfor文でcontinue的なことを実現する


# 前提
ループの中で、ある条件に一致した時に処理をスキップさせたいという場面はよくあると思います。
しかしVBSのforにはcontinueがありません。

なのでこのような書き方になります。

```vb
For i = 0 To cnt
    If [処理を通したい条件] Then
        'ここで処理する
    End If
Next
```

これだと処理内容によってはネストがどんどん深くなっていってしまいます。

# 疑似continue

そこでdo loopを組み合わせて疑似的にcontinueを実現します。
forの中に**一度だけループするdo loop**を記述します。

```vb
For i = 0 To cnt
	Do
		If [処理をスキップしたい条件] Then Exit Do

		'ここで処理する
	Loop Until 1
Next
```

でもそのままだとネストの深さは解決しないので、下記のようにforとdo loopを一行で書きます。

```vb
For i = 0 To cnt : Do
	If [処理をスキップしたい条件] Then Exit Do

	'ここで処理する
Loop Until 1 : Next
```
これで無事？メイン処理のネストを一段浅くすることができました。
パッと見は違和感がありますが、見慣れれば重要な処理のネストが深くなるよりはいいかなと思います。

# 参考
[VBScript] ループ制御コマンド「Continue」っぽいものを美しく実装する ＞ Z_￣∂
https://yozda.exblog.jp/9314000/
CircleCIでの環境変数のセキュリティ （設定画面で設定した環境変数）

## 確認したいこと
確認したいことは、「CircleCIの歯車アイコン（⚙）で設定した環境変数がどういうときにリークする可能性があるか」です。

サービスのトークンなどを環境変数として設定する用途などで利用すると思いますが、トークンの流出が怖いのでどういうときに起こりうるかしっかりと確認したいと思います。

## 検証方法

* CircleCI 2.0を使います。
* コンテナベースのビルドで試しました。
    * `docker: [image: ...]`を使っていて`machine: true`は使ってません。
    * `circleci/node:10`イメージを使いました。
* `MY_SECRET1`に`This is secret message!`を設定しました。
* 環境変数の取得方法は以下の3つを試しました。
    * `echo $MY_SECRET1`
    * `env`コマンド
    * `node -e 'console.log(process.env)'`


### console.log(process.env)を使った理由

`console.log(process.env)`を使うと環境変数名と値がkey-valueのオブジェクトとして出力できます。

```js
{ CIRCLE_NODE_INDEX: '0',
  YARN_VERSION: '1.13.0',
  CIRCLE_COMPARE_URL: '',
  ...省略...
}
```

`console.log(process.env)`みたいに言語の機能を使ったのは、以下のような可能性を排除したかったからです。

* `$MYSECRET1`が含まれていたら、コマンド動かさないとか、
* `env`コマンドに細工しているとか、
* 出力に秘密の環境変数の値が含まれていたら消すみたいなフィルタリング

`process.env`のオブジェクトにkey-valueとして含まれていなかったら、おそらくCI動く前から環境変数をセットしないで動かしている内部実装なのかなと判断できると思いました。
Node.jsを使った意味は特にないです。

## 結果

GitHubアカウントは２つ用意して行いました。
どちらのアカウントで起こったことなのかを分かりやすくするために名前つけます。

* オリジナルリポジトリのアカウントをauthorの**Aさん**、
* フォークしてコントリビュートする人をcontributorの**Cさん**
とします。

## CさんがforkしたリポジトリをCさんのCircleCIでビルドした場合

以下のような結果で、forkした場合にビルドされてもリークはしなくて安心です。（確かこれは公式ドキュメントに書いてあった気がします）

* echo $MY_SECRET1`: 何も表示されない
* `env`コマンド: `MY_SECRET1`が含まれていない
* `node -e 'console.log(process.env)'` : `MY_SECRET1`が含まれていない

（この挙動を見る限り、`MY_SECRET1`が完璧にセットされない状態で、CIが動いている感じがします。）

## CさんがforkしたリポジトリからAさんにプルリクエストした場合

この場合、CさんがCircleCIのアカウントを持っていれば、passしたところに✔がついたりして、CircleCIが走ります。ただ持っていなければCircleCIが動かないため上記の結果と同じになります。


## Cさんのプルリクエストをマージしたとき

authorのAさんが緑色の[Merge]ボタンを押してマージすると、環境変数はすべて方法で、表示されました。

* echo $MY_SECRET1`: 表示される
* `env`コマンド: `MY_SECRET1=This is secret message!`が含まれている
* `node -e 'console.log(process.env)'` : `MY_SECRET1: 'This is secret message!'`が含まれている。

一番簡単な`echo $MY_SECRET1`の結果です。値"This is secret message!"が表示されてます。

<img width="731" alt="Screen Shot 2019-03-29 at 0.10.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/a28ff3cd-6478-4c20-66ea-b39482879a24.png">


## まとめ

「マージは慎重に！」と思いました。
マージして**authorのCircleCIでビルドされれば環境変数は取得可能**になってしまいます。
また、うっかりデバッグでauthorが`env`を表示したりするのも危険ということが分かります。
たった3文字で大変なことが起こる可能性があります。

感想としては、
`env`をリモート端末に送信するような書かれてたりすれば、うっかり漏れたりする可能性がある気がしました。難読されたシェルとJSFucｋとか色々読みにくくする方法はたくさんあると思います。
それら使ったりすればパッと見わからないように細工される可能性もあると思いました。

Travis CIだとコントリビューターがプルリクエストすると、authorのアカウントでCIでも動くので、Travis CIのときの環境変数の流出の可能性についてもちゃんと把握しておきたいです（ちょっと今Travis CI障害中なので先にCircle CI調べました）。
（追記:CircleCIでも、Build forked pull requestsオプションありましたね。Pass secrets to builds from forked pull requestsっていうオプションがあるくらいなのでこれがoffの限り、環境変数は渡されなさそうですね。）


## 蛇足

"This is secret message!"の"a"なかったです...
はじめてのC++ 【29日目】

#はじめに
昨日はいろいろあって投稿ができなかった。今日からまた再開！
ポインタ天国から抜け出せない。今日または明日には抜け出したい.
##intint const * const * const ** const * p【2日目】
「アドレス」と「中身」という表現を使っていたのですが、もう使いません。
28日目にyumetodoさんのコメントをイラストにして確認してみようと思います。

```cpp
    int n1 = 3;
    int n2 = 4;
    int const * p1 = &n1;
    //*p1 = 4;//NG
    p1 = &n2;//OK
```
![IMG_0185.PNG](https://qiita-image-store.s3.amazonaws.com/0/298612/5e5620e0-3bdd-09da-bb89-db35048a8e6d.png)

```cpp
 int const * p2 = &n1;
 int const * const * pp1 = &p1;
 //*pp1 = p2;//NG
 pp1 = &p2;//OK
```
ここで疑問が出てきた。
`*pp1 = p2`ってどういう処理なのか。
pp1の中にはp1のアドレスが入っているから、ポインタを介してp1の中身を変える作業であってるかな。
p1はn1のアドレスを格納しているので、n1のアドレスをp2に入っているn1のアドレスに書き換えようとしている？
でも、なんでこれがだめなのか。
 `int const * const * pp1` を英訳すると
`pp1 is pointer to read only pointer to read only int`
`変更不可能なint型の値への変更不可能なポインタへの変更可能なポインタpp1`
ん？わからない。
イラストにすると、
![IMG_0186.PNG](https://qiita-image-store.s3.amazonaws.com/0/298612/933921eb-ce60-bd5a-3b53-5b2fe2e999ff.png)

あー！わかった気がしてきた！
`変更不可能なint型の値への変更不可能なポインタへの変更可能なポインタpp1`
この文章の `変更不可能なint型の値への変更不可能なポインタ` ってのは、`変更不可能なポインタp1`をポインタを介しての変更(指し示す先の変更)ができないってことで、 `変更可能なポインタpp1` ってのは、領域の変更は可能　ってことかな。

```cpp
    int const * const * pp2 = &p1;
    int const * const * const * ppp1 = &pp1;
    //*ppp1 = pp2;//NG
    ppp1 = &pp2;//OK
```
まずは英訳
` int const * const * pp2`
`pp2 is pointer to read only pointer to read only int`
`書き換え不可能なint型の値への書き換え不可能なポインターへの書き換え可能なポインターpp2`

`int const * const * const * ppp1`
`ppp1 is pointer to read only pointer to read only pointer to read only int`
`書き換え不可能なint型への書き換え不可能なポインタへの書き換え不可能なポインタへの書き換え可能なポインタppp1`
指し示す領域は変更可能だが、指し示す先の値の変更は不可能

```cpp
    int const * const * const * ppp2 = &pp1;
    int const * const * const * * pppp1 = &ppp1;
    *pppp1 = ppp2;//OK
    pppp1 = &ppp2;//OK
```
コード
` int const * const * const * ppp2`
英訳
`ppp2 is pointer to read only pointer to read only pointer to read only int`
日本語訳
`書き換え不可能なint型への書き換え不可能なポインタへの書き換え不可能なポインタへの書き換え可能なポインタppp2`

コード
`int const * const * const * * pppp1`
英訳
`pppp1 is pointer to pointer to read only pointer to read only pointer read only int`
日本語訳
`pppp1は書き換え不可能なint型への書き換え不可能なポインタへの書き換え不可能なポインタへの書き換え可能なポインタへの書き換え可能なポインタ`
新しいイメージが湧いてきた。
![IMG_0187.PNG](https://qiita-image-store.s3.amazonaws.com/0/298612/d46d04fb-0fbf-9a39-b8e7-68c66d7f9797.png)

なぜ、

```
*pppp1 = ppp2;//OK
```
ができたかというと、上の図から考えることができた。
pppp1は4層になっていて、 `*` が増えるたびに１層下に行く。
今、 `*pppp1`　から下の層と `ppp2`の層全体が同じである。そして、 `*pppp1` は書き換え可能な層なので、

```
*pppp1 = ppp2;
```
が実行できた。

違う例で見てみると、

```cpp
 int const * p2 = &n1;
 int const * const * pp1 = &p1;
 //*pp1 = p2;//NG
 pp1 = &p2;//OK
```
この例を使って考えてみると、
<img width="1194" alt="IMG_D74A82AF7EB1-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/298612/86b4592a-4c21-32ef-a185-15dabe7c33c5.jpeg">
いま、 `*pp1`が書き換え不可能なので、

``` 
 *pp1 = p2;//NG
```
となる。
また、

```
 pp1 = &p2;//OK
```
は, `pp1`の層が書き換え可能なのでOKとなる。


なんか見返すと結構ずれてるような気がしてきた。
上のイメージって使えないかも。
pointer怖い。

#終わりに
疲れたので、終わり。
また明日やる。
おやすみなさい。
go modulesとCircle CIのキャッシュを使ってビルド＆テストを高速化する

go modulesの機能とCircle CIのキャッシュをうまく活用してビルドとテストを高速化してみます。

githubはこちら: https://github.com/atotto/circleci-golang-example

## go modules

go modulesに関する詳細は:

- https://github.com/golang/go/wiki/Modules
- https://blog.golang.org/modules2019

があります。雑な説明だとパッケージを管理するためのツールです。`go.mod`と`go.sum`の２つのファイルで構成され、それぞれ、modulesと、modulesのサムが書かれています。go modulesを利用しておけば、どんな環境でも同じバイナリをはきだせるのがウリだと思います。


今年の夏までは `export GO111MODULE=on` として環境変数を設定しておきましょう。

## go modules をキャッシュする

    go mod download

とすると、go.modなどに書かれた依存パッケージが `$GOPATH/pkg/mod/` へキャッシュされます。このディレクトリをCircle CIの `save_cache` に指定すれば良さそうです。

例:

```yaml
version: 2

defaults: &defaults

jobs:
  setup-build:
    docker:
    - image: golang:stretch
    working_directory: /workspace
    environment:
      GOPATH: /
      GOCACHE: /.cache/go-build
      GO111MODULE: "on"

    steps:
    - run: go env
    - checkout
    - restore_cache:
        keys:
        - go-module-cache-v1-{{ checksum "/workspace/go.sum" }}
        - go-module-cache-v1-
    - run: go mod download
    - save_cache:
        key: go-module-cache-v1-{{ checksum "/workspace/go.sum" }}
        paths:
        - /pkg/mod/cache
    - save_cache:
        key: workspace-v1-{{ .Environment.CIRCLE_SHA1 }}
        paths:
        - /workspace
```

go modulesを利用しているので、 `working_directory` を好きなところにできます。

`restore_cache`の

`go-module-cache-v1-{{ checksum "/workspace/go.sum" }}`
で `go.sum` のチェックサムを取り、すでにキャッシュしたものを採用します。

`go-module-cache-v1-`
で、それまでにキャッシュしたものを採用します。

チェックサムのキャッシュがなかった場合は、 最新のキャッシュから引っ張るので、順番に書いておくと良さそうです。

## go test の結果をキャッシュする 

Goのテストは一度実行した結果をキャッシュする機能がありますのでこれをキャッシュしてみます。

```yaml
  test:
    docker:
    - image: golang:stretch
    working_directory: /workspace
    environment:
      GOPATH: /
      GOCACHE: /.cache/go-build
      GO111MODULE: "on"

    steps:
    - restore_cache:
        keys:
        - workspace-v1-{{ .Environment.CIRCLE_SHA1 }}
    - restore_cache:
        keys:
        - go-module-cache-v1-{{ checksum "/workspace/go.sum" }}
        - go-module-cache-v1-
    - restore_cache:
        keys:
        - go-build-cache-v1-{{ .Branch }}-{{ .Revision }}
        - go-build-cache-v1-{{ .Branch }}
        - go-build-cache-v1
    - run: go test -v ./...
    - save_cache:
        key: go-build-cache-v1-{{ .Branch }}-{{ .Revision }}
        paths:
        - /.cache/go-build
```

テスト実行前に、 `setup-build` でキャッシュしたworkspaceと、go modulesのキャッシュをリストアします。

テスト結果は `GOCACHE` で指定した場所にあるので、そのディレクトリごとキャッシュしておくと良いです。

## ワークフローにする

```yaml
workflows:
  version: 2
  test:
    jobs:
    - setup-build
    - test:
        requires:
        - setup-build
```


> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/30362/9c2aba71-1b40-16b7-2ad5-fc77207c49dd.png)

おしまい

完成品はこちら。 [.circleci/config.yml](https://github.com/atotto/circleci-golang-example/blob/master/.circleci/config.yml)


# 資料

- https://circleci.com/docs/2.0/language-go/
- https://circleci.com/docs/2.0/caching/
- https://circleci.com/docs/2.0/workflows/
Gitでよく使うコマンド一覧

ソース管理といえばGitが主流の時代。Gitでよく使うコマンドをまとめてみました。

###リポジトリを取得する

```git
$ git clone https://xxxx.xx...git
```

#####ブランチを指定したい場合は

```git
$ git clone -b some_branch https://xxxx.xx...git
```

#####作成されるディレクトリ名を指定したい場合は

```git
$ git clone https://xxxx.xx...git some_directory
```

###ブランチを作成する

#####まずはコピー元のブランチに切り変える

```git
$ git checkout original_branch
```

#####ローカルにブランチを作成する

```git
$ git checkout -b copy_branch
```

#####ブランチをリモートに登録する

```git
$ git push -u origin copy_branch
```

###変更内容をコミットする

#####すべてコミットする場合

```git
$ git commit -a
```

#####一部のファイルをコミットする場合

```git
$ git add コミットするファイル
$ git commit
```

#####コメントをコマンドラインで登録する

```git
$ git commit -m 'コメント'
```

###ブランチの切り替え

```git
$ git checkout 切り替えるブランチ名
```

###他のブランチをマージする

```git
$ git merge マージするブランチ名
```
マージするブランチをあらかじめgit pullで最新にしておく必要があります。

###履歴を確認

```git
$ git log
```

###特定のコミットだけマージ

```git
$ git cherry-pick コミットID
```
コミットIDはgit logで確認できます。

参考：
[git cherry-pickで助かりました(他ブランチのコミットを反映させる方法)](https://qiita.com/bossunn24/items/dedb620541d852327934
)
[git コマンド branchの作り方](https://qiita.com/TetsuTaka/items/5ab227a8bd2cd7106833)
AtCoder ABC - 084- A&B&C

#AtCoder ABC 084 B&C
[AtCoder - 084](https://atcoder.jp/contests/abc084)


#A問題

   - $24hr+(24-M)hr$ 
    - 1日(12/31)+残り時間(12/30)

```java
	private void solveA() {
		Scanner scanner = null;
		int numM = 0;

		try {
			scanner = new Scanner(System.in);
			numM = scanner.nextInt();

			System.out.println(24 + 24 - numM);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - 文字列Sは、$A + 1 + B$文字ある
    - 文字数が足りない場合はNG
 - `数字がA個 + '-' + 数字がB個`という構造である必要がある
    - 上記に合致しているかを調べる

 - 実装は汚い
    - AとBを文字列として受け取って、数値にパースしてExceptionが出たらNGとしている


```java
	private void solveB() {
		Scanner scanner = null;
		int numA = 0;
		int numB = 0;
		String s = "";

		try {
			scanner = new Scanner(System.in);
			numA = scanner.nextInt();
			numB = scanner.nextInt();
			s = scanner.next();
			try {
				String wkA = s.substring(0, numA);
				String wkB = s.substring(numA + 1, s.length());
				Integer.parseInt(wkA);
				Integer.parseInt(wkB);

				if (numA + numB + 1 == s.length()) {
					String wk = s.substring(numA, numA + 1);
					if (wk.equals("-")) {
						System.out.println("Yes");
						return;
					}
				}
			} catch (NumberFormatException e) {
				//				e.printStackTrace();
			}

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
		System.out.println("No");
	}
```

#C問題

 - 再帰で解いた
 - 開通式時に$駅_i$にいた場合、駅Nまで到着できるのは最速で何秒後か？
 - 開始駅を駅_0から駅_(n-1)まで順次変更していき到着に必要な秒数を出力していく
    - 実装しながらコメント入れていったので説明はソースのコメント

```java
	private void solveC() {
		Scanner scanner = null;

		try {
			scanner = new Scanner(System.in);
			int cNumN = scanner.nextInt();
			int[][] csf = new int[cNumN - 1][3];

			for (int i = 0; i < csf.length; i++) {
				csf[i][0] = scanner.nextInt();
				csf[i][1] = scanner.nextInt();
				csf[i][2] = scanner.nextInt();
			}

			for (int i = 0; i < csf.length; i++) {
				System.out.println(getTime(cNumN, csf, i, 0));
			}
			/**
			 * 最終駅は常に0
			 */
			System.out.println(0);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

	private int getTime(int cNumN, int[][] csf, int currentI, int currentTime) {

		/**
		 * 最終駅まで付いたら完了
		 */
		if (currentI == cNumN - 1) {
			return currentTime;
		}

		int res = 0;

		int c = csf[currentI][0];
		int s = csf[currentI][1];
		int f = csf[currentI][2];

		/**
		 * 現在時刻がその駅のスタート時刻の前であった場合
		 * スタート時刻を採用
		 * 現在時刻がスタート時刻より後なら
		 * 現在時刻を採用
		 */
		if (currentTime < s) {
			res = s;
		} else {
			res = currentTime;
		}
		/**
		 * 現在時刻がfと同じタイミングなら、
		 * すぐに電車に乗れる。
		 * 　=>ひとつ前のスタート時刻をそのまま利用できる
		 * 違うタイミングなら、
		 * 次の発車タイミングを待たなければいけない
		 */
		if (res % f != 0) {
			res = res + (f - res % f);
		}
		/**
		 * 発車したので移動時間を足す。
		 */
		res += c;
		/**
		 * 次の駅の処理を実行する
		 */
		res = getTime(cNumN, csf, currentI + 1, res);
		return res;
	}

```
AtCoder ABC - 083- A&B&C

#AtCoder ABC 083 A&B&C
[AtCoder - 083](https://atcoder.jp/contests/abc083)

#A問題

 - 比較

```java
	private void solveA() {
		Scanner scanner = null;
		int numA = 0;
		int numB = 0;
		int numC = 0;
		int numD = 0;

		try {
			scanner = new Scanner(System.in);
			numA = scanner.nextInt();
			numB = scanner.nextInt();
			numC = scanner.nextInt();
			numD = scanner.nextInt();

			if (numA + numB == numC + numD) {
				System.out.println("Balanced");
			} else if (numA + numB > numC + numD) {
				System.out.println("Left");
			} else if (numA + numB < numC + numD) {
				System.out.println("Right");
			}

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - ただ単純に、`1－N`まで各桁の和を調べ、 $A \geqq 各桁の和 \geqq B$となる数値を出力
    - 12 -> 1+2=3
 - 各桁の和は $mod10$ , $divide 10$を繰り返せばよい(modの値を+していく)
    - $12 \quad \rightarrow \quad mod 10 = 2  \quad \rightarrow \quad  12/10 = 1  \quad \rightarrow \quad  mod10=1$

```java
private void solveB() {
		Scanner scanner = null;
		int numN = 0;
		int numA = 0;
		int numB = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();
			numA = scanner.nextInt();
			numB = scanner.nextInt();

			int res = 0;
			for (int i = 1; i <= numN; i++) {

				int wk = 0;
				int tmp = i;
				while (tmp != 0) {
					wk += tmp % 10;
					tmp /= 10;
				}
				if (numA <= wk && wk <= numB) {
					res += i;
				}

			}

			System.out.println(res);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題

　- $A_{i+1}はA_iの倍数$ということは、$A_1はA_0の倍数$
    -  $A_0はXの倍数 \rightarrow A_0 = X$
    -  $A_{i+1}はA_iの倍数 \rightarrow A_{i+1}はXの倍数$
    -  数列の長さの最大値なので、倍数が最小であれば良い →　倍数は2が最小（1だと条件を満たさない）
    -  $X*2n \leqq Y$ 以下になる $nの最大値$ を求める


```java
	private void solveC() {
		Scanner scanner = null;
		long numX = 0;
		long numY = 0;

		try {
			scanner = new Scanner(System.in);
			numX = scanner.nextLong();
			numY = scanner.nextLong();

			long x = numX;
			int res = 0;
			while (x <= numY) {
				x *= 2;
				res++;
			}

			System.out.println(res);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```
AtCoder ABC 064 A&B&C

#AtCoder ABC 064 B&C
[AtCoder - 064](https://atcoder.jp/contests/abc064)


#A問題

 - 入力値を3桁の数に変換して、それが4の倍数かどうかを判定する

```java
	private void solveA() {
		int numR = nextInt();
		int numG = nextInt();
		int numB = nextInt();

		int num = (numR * 100 + numG * 10 + numB);

		out.println(num % 4 == 0 ? "YES" : "NO");
	}
```


#B問題

 - 入力値の最小値と最大値の差分が移動距離となる
 - どーーーしてもStreamを使ってみたかったので書いたけど、こんなのでいいのか？？？

```java
	private void solveB() {
		int numN = nextInt();
		Map<Integer, Integer> wk = new TreeMap<Integer, Integer>();
		IntStream.range(0, numN).forEach(i -> wk.merge(nextInt(), 1, (oldV, newV) -> oldV + newV));

		AtomicInteger min = new AtomicInteger(Integer.MAX_VALUE);
		AtomicInteger max = new AtomicInteger(0);
		wk.keySet().stream().forEach(key -> {
			min.set(Math.min(min.intValue(), key));
			max.set(Math.max(max.intValue(), key));
		});

		out.println(max.intValue() - min.intValue());
	}
```

#C問題

 - こいつもはまった問題。
 - はまった理由、、、色は最大8色だと思い込んだ。。。質問欄に8色以上あると書いてあったのをちゃんと読めば。。。
 - どのレートに人がいるかを調べればよい
    - 基本は人を数える必要はない（どの色の種類があるかを調べるだけなので絵）
    - レート3200以上の人のみ、何人いるかを数える

 - 色の種類最小
    - 3200未満のレートの人が存在する（色の種類が1以上ある）
        - 3200以上の人たちは、既に存在する色になればよい（カウントしない）
    - 3200未満のレートの人が存在しない（色の種類が1つもない）
        - 3200以上の人たちは、1つの色を新しく作成してその色に集まればよい（１としてカウントする）

 - 色の種類最大
    - 以下の二つの値を足す
        - 3200未満の人たちの色の種類
        - 3200以上の人たちは全員別の色となる

```java
	private void solveC() {
		int numN = nextInt();

		Set<Integer> set = new HashSet<>();
		int cnt = 0;
		for (int i = 0; i < numN; i++) {
			int key = nextInt();
			if (key < 400) {
				set.add(1);
			} else if (key < 800) {
				set.add(2);
			} else if (key < 1200) {
				set.add(3);
			} else if (key < 1600) {
				set.add(4);
			} else if (key < 2000) {
				set.add(5);
			} else if (key < 2400) {
				set.add(6);
			} else if (key < 2800) {
				set.add(7);
			} else if (key < 3200) {
				set.add(8);
			} else {
				cnt++;
			}

		}
		/*
		 * 赤のみなら赤全員が同じ色になればよい
		 * 赤以外がいるのなら、赤以外の合計
		 */
		int min = set.size() == 0 ? 1 : set.size();
		/*
		 * 赤+その他の色の合計がmax
		 * 色の種類数のmaxを求めるのだが、色の種類数のmaxは8ではない
		 * 問題文に「レートが3200以上になると色を自由に変えることが出来ます」
		 * これは、「問題文中の8色の中で自由に変える」ではなく「8色ではない別の色に自由に変える」の意味
		 * なので、以下のコードを追加すると間違える
		 * ->質問のタブに同じことを聞いている人がいた。。。質問蘭を読むの大事
		 *		max = max > 8 ? 8 : max;
		 */
		int max = set.size() + cnt;
		out.println(min + " " + max);
	}
```
素人による動的計画法 初級編

##動的計画法とは
>動的計画法（どうてきけいかくほう、英: Dynamic Programming, DP）は、計算機科学の分野において、アルゴリズムの分類の1つである。対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法を総称してこう呼ぶ。

　上記の説明はWikipediaからの引用だが、アルゴリズムはその定義を言葉で聞いただけではすぐに理解できない（よね？）。私も最初に「動的計画法は小さな問題をあらかじめ解いておき、その計算結果を利用する」と何かで動的計画法の説明を読んだ時に「？？？」となった。その後、自分で実装してみて初めて理解できたのでアルゴリズムにおいては自分で実装してみることが理解への近道のように感じる。

##今回すること
　フィボナッチ数列を例に用いる。まずは単純な再帰関数による実装の限界を示し、そのあとに動的計画法の威力を実装によって示すという流れ。
　言語はC++を用いるが予備知識が必要になるほどではないはず（でもif文、for文、配列とかの知識は前提で進めます）。

##フィボナッチ数列とは
　前２項の和を続けていく数列で、{1, 1, 2, 3, 5, 8, 13, ...}と続いていく。漸化式による表現では、

```math
a_{n} = a_{n-1} + a_{n-2} (a_1 = 1, a_2 = 2, n\geqq 3)
``` 

 のようになる。$a_0 = 1, a_1 = 1$とするときもある。フィボナッチ数列には今回触れないが面白い性質がたくさんあるので調べてみてほしい。

##再帰関数による実装
　さて、早速実装してみる。上記のような漸化式を取るので、素直に再帰関数で実装すると次のようになる。

```cpp
int fib(int n) {
  if (n == 0 || n == 1) return 1;

  return fib(n - 1) + fib(n - 2);
}
```


　図にするとこんな感じで再帰関数が呼び出されることになる(n = 4のとき)。
<img width="861" alt="スクリーンショット 2019-03-28 23.28.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/299664/458bfdfe-3d18-3652-78df-8ef256037302.png">

　しかし、お気づきになっただろうか…？上の画像ではfib(4)でfib(3)とfib(2)とを呼び出すが、fib(3)の時に再びfib(2)を呼び出していることに…。今回はn = 4という小さな数字だったから良かったが、これが大きな数になると同じ処理が何度も繰り返され、爆発してしまう。

　そこで登場するのが動的計画法！同じ処理をするのであれば、一度した計算を記録しておけばいいというのが冒頭に出てきた「動的計画法は小さな問題をあらかじめ解いておき、その計算結果を利用する」というものである（ここでストンときてくれると嬉しい）。

##動的計画法による実装
　いよいよ動的計画法である。あらかじめ行った計算結果の記録には配列を用いる。

```cpp
int f[100]; //配列の大きさは求められるnによって適宜変える
f[0] = 1;
f[1] = 1; //初項を用意しておく
for (int i = 2; i <= n; i ++) f[i] = f[i - 1] + f[i - 2]; //配列f[k]に計算結果を記録していく
```

　配列の最後にあるf[n]が求めるものとなる。ループ文中にあるf[i - 1]とf[i - 2]はすでに計算済みなので、再帰関数の時のような無駄がない。

##練習問題
　最後に[AtCoder](https://atcoder.jp/)(競技プログラミングサイト)にある動的計画法の過去問を貼っておくので、ご自身で実際に解いてみてほしい。

 [ABC040-C-柱柱柱柱柱](https://atcoder.jp/contests/abc040/tasks/abc040_c)
 [Educational DP Contest-A-Frog1](https://atcoder.jp/contests/abc040/tasks/abc040_c)

　私もAtCoderをやっているのでぜひ一緒に精進しましょう〜。わからない点などあればTwitterでもいいので気軽に聞いてください。

##おわり
　タイトルにもあるようにこれは初級編。今回扱った配列は１次元だったが、多次元配列を用いる動的計画法がわんさかある。まだまだ奥が深いのである。それでは、私のアルゴリズム力と実装力が上がった際に書くであろう中級編でお会いしましょう( ^_^)/~~~
Google検索からꓮⲣⲣꓲеが消えた・・・？

# Googleで `ꓮⲣⲣꓲе` を検索してみると・・・
[まさかの検索結果0件！](https://www.google.com/search?q=%EA%93%AE%E2%B2%A3%E2%B2%A3%EA%93%B2%D0%B5&oq=%EA%93%AE%E2%B2%A3%E2%B2%A3%EA%93%B2%D0%B5&ie=UTF-8)

![cap.JPG](https://qiita-image-store.s3.amazonaws.com/0/385786/597aee67-0916-cbcc-3c30-eae5915d98c2.jpeg)

ついに、競合を検索結果から締め出し始めたのか！？

# 種明かし
いいえ、そんな訳はありません。それでは、解説します！
今回使った `ꓮⲣꓲе` の4文字それぞれのUnicodeコードポイントの詳細は下記のとおりです。

```JavaScript
{"name":"LISU LETTER A","desc":"","char":"ꓮ","code":"A4EE","block":"Lisu"}
{"name":"COPTIC SMALL LETTER RO","desc":"","char":"ⲣ","code":"2CA3","block":"Coptic"}
{"name":"LISU LETTER I","desc":"","char":"ꓲ","code":"A4F2","block":"Lisu"}
{"name":"CYRILLIC SMALL LETTER IE","desc":"","char":"е","code":"0435","block":"Cyrillic"}
```

そうです。アルファベットによく似た形ですが、別の文字だった、、というやつです。
ちなみに、上記Jsonは、私の[二つ前の記事](https://qiita.com/uniqode/items/a00b5f81933a6fb18045)で作成したAPIに `char=ꓮ` としてGETパラメータで呼び出すと、簡単に得られる情報です。

なお、Unicodeの形が似ている文字ならなんでも良いかというと、そうでもないみたいで、[MathematicalAlphanumericSymbols](https://en.wikipedia.org/wiki/Mathematical_Alphanumeric_Symbols)などは、普通にアルファベットに同一視されてしまいました。今回使ったようなLisu言語やCopt言語、キリル文字のように、アルファベット由来だが別言語の文字、が良さそうです。

# 最後に
以上の知識を利用して、Apple以外にも使えそうな文字を探して、4/1のエイプリルフールに同僚を驚かしてみてはいかがでしょうか。自社の社名とかでやると、さらに驚かれるかもしれません。

使えそうな文字を探すには、私の運用しているTwitterボット [@BotUnicode](https://twitter.com/BotUnicode)も役に立つかもしれません！
そして、使えそうな文字が見つかったら、ぜひコメントで教えてください！

# 追記
ちなみに、記事執筆2時間後には、Googleにクロールされて、当記事が検索結果(全1件)に出てくるようになりました。すごいな、Googleᴉᴉ
↑なお、この最後のビックリマークみたいなのは、

```JavaScript
{"name":"LATIN SMALL LETTER TURNED I","desc":"","char":"ᴉ","code":"1D09","block":"Phonetic Extensions"}
```
Pythonを始めるはなし(環境構築)

# 0. はじめに
Java、C/C++、JavaScriptしかやったことないワタシが一発発起した話。
Mac利用は初心者。

# 1. どこからはじめようか
## 1.1 環境構築
* Windows(Windows 10)
  - anaconda
  - PyCharm

* mac(Mojave)
  - XCode(環境を整える際にはすでに入れてあったので同時にはインストールしていません）
  - homebrew
  - pyenv
  - python 3.7.2
  - PyCharm
     - PyCharmを入れてみるも、プロジェクトを作成しようと試みるも…仮想環境がVirtualenv,Pipenv,Condaしか選択できない・・・
      - brewでpipenvを入れる  
         - そもそも、pipenvでなくても、直接指定できるということをあとで知る。(でも、pipenvは入れておきたいので入れました)

## 1.2 引っかかったところ
* Windows
  - 調べれば出てくる情報で特に引っかかったところはなかった。

* mac
  - pyenvでpython 3.7.2を入れるときにzlibエラーが出る。
      - brewでzlibを導入する。(DL + install)
  - 仮想化する際にpythonのバージョンを切り替えられなくて悪戦苦闘。
     - pyenvもpipenvも.bash_profileに設定を忘れていただけだった件。

# 2. 情報源
* 下記を参考にさせていただきました
    - [Pythonのテキストを作りました](https://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975)
    - [Python基礎講座](https://qiita.com/Usek/items/7bd985a5d0c00bf3e41a)
    - [【2018年版】Pythonインストール・Mac編【長く安全に使える方法】](https://basicincome30.com/python-install-mac)
    - [超初心者でも出来る！MacにPython3のローカル開発環境を構築する方法](https://hajipro.com/python/mac-python)
    - [pyenvでPythonのバージョンを切り替えられない場合の対処法＋](https://qiita.com/TheHiro/items/88d885ef6a4d25ec3020)
    - [pyenvからpipenvにしてみた](http://atc.hateblo.jp/entry/2018/07/03/pyenv%E3%81%8B%E3%82%89pipenv%E3%81%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F)
    - [Mac上のPython仮想環境をpipenv+pyenvへ移行してみた](https://dev.classmethod.jp/etc/environment_to_pipenv-pyenv/)
    - [PyCharmの実行環境にvenvの環境を設定する方法](https://codelab.website/pycharm-project-interpreter/
)
Spring Boot: IntelliJでコードを変更したらアプリケーションを自動再起動するようにする設定

本稿では、Spring BootのDeveloper Tools(開発者ツール)を使用してアプリケーションを自動的に再起動する方法について説明します。本稿では次のことを解説します。

* 開発者ツールにはどのような機能があり、Automatic Restart(自動再起動)がアプリケーション開発をどのように手助けするか。
* IntelliJ IDEAと開発者ツールの自動再起動機能を統合する方法。


##自動再起動

Spring Bootフレームワークのモジュールとして提供されているDeveloper Toolsは、アプリケーション開発をはかどらせてくれるモジュールです。

開発者ツールは、5つの機能で構成されています。

1. デフォルトプロパティ
2. Automatic Restart(自動再起動)
3. LiveReload
4. グローバル設定
5. リモートアプリケーション

上記の機能の中で、開発プロセスにスピードへの大きな影響を与えるものは2番目のAutomatic Restartです。これは、./outや./buildなどのフォルダー内のファイルの変更を監視してくれ、クラスパス上のファイルが変更されると、アプリケーションを自動的に再起動してくれます。

Developer Toolsのインストールはとても簡単です。次の一行をbuild.gradleの`dependencies`ディレクティブに追加してください。

```gradle
dependencies {
    ...
    runtimeOnly 'org.springframework.boot：spring-boot-devtools'
    ...
}
```

## IntelliJとDeveloper Toolsの統合

ただし、上記の一行を追加するだけでは、Developer Toolsはまだ自動的にアプリケーションを再起動してくれません。さらに2つのステップをこなす必要があります。

まず、プロジェクトのビルドを自動化する設定に有効にする必要があります。Preferences.../Settings... -> Build, Execution, Deployment -> Compilerを開き、Build project automaticallyを許可します。

<img width="981" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/190d0ff7-21f9-2416-b93b-33abb8b9ae01.png">


次に、レジストリ設定を変更します。 command + shift + Aを押し（Windowsを使用している場合はCtrl + Shift + Aを押し）、Registryを検索します。

<img width="698" alt="Screen Shot 2019-03-28 at 23.42.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/99debbf9-1c1e-f11a-20f1-3e082e4335eb.png">

レジストリのリストをスクロールして次の設定を見つけて有効にします。

```
compiler.automake.allow.when.app.running
```

<img width="913" alt="Registry.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/78ea5bc3-9860-65cf-d13d-bc20a75fa486.png">


上記の2つのステップを終了することで、手動で再起動することなくアプリケーションを開発できるようになります。

最後に注意しなければならないのは、アプリケーションの起動方法です。Gradleタスクの `bootRun`の代わりに` main` 関数を実行してアプリケーションを起動する必要があります。

<img width="558" alt="store___Volumes_dev_kotlin-mini-alis__-_____src_main_kotlin_example_store_StoreApplication_kt__store_main_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/520054a3-03c9-7959-9e68-e56ce55fe0fd.png">

##まとめ

本稿では下記の2つについて解説しました。

* Developer Toolsにはどのような機能があり、Automatic Restartがアプリケーション開発をどのように手助けするか。
* IntelliJ IDEAと開発者ツールの自動再起動機能を統合する方法。
AWS SAM CLI + Ruby のローカル開発時にホットリローディングされない件

[aws-sam-cli](https://github.com/awslabs/aws-sam-cli)でLambda上で動かすRubyスクリプトを書いていたのだけど、`sam local start-api`を実行したときにホットリローディングが効かなくてしばらくハマっていたのでした。


## 原因は`sam build`

`sam build`をしていたことで`.aws-sam`配下にパッケージされたLambdaファンクション一式ができあがるのだけど、
これがある状態で`sam local start-api`するとこちらが優先して参照されてしまうらしい。

```bash
.aws-sam
└── build
    ├── HelloWorldFunction
    │   ├── Gemfile
    │   ├── Gemfile.lock
    │   ├── app.rb
    │   └── vendor
    │       └── bundle
    └── template.yaml
```


## ファンクションごとのgemのインストールパスについて

なぜ`sam build`したかというと、`start-api`したときにgemが見つからないってエラーが発生したため。
こんな感じで。

```bash
{
  "errorType": "Init\u003cLoadError\u003e",
  "errorMessage": "cannot load such file -- httparty",
  "stackTrace": [
  ~
}
```

開発時には以下のようにvendor/bundle配下を指定して`gem install`する。
(自分はいつも.bundleにインストールする派だったのでここでも少しハマった)

```
$ bundle install --path hello_world/vendor/bundle
```

複数のLambdaファンクションを作成する場合は`--gemfile`オプションを付けたほうが良いかも。
`--gemfile`オプションを付ける場合、`--path`で指定するインストールディレクトリは`--gemfile`で指定したGemfileを起点としたパスになる（さっき気づいた）ので以下のようになる。

```
$ bundle install --path vendor/bundle --gemfile hello_world/Gemfile
```

こうなる。

```bash
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── hello_world
│   ├── Gemfile
│   ├── Gemfile.lock
│   └── app.rb
│   └── vendor
│       └── bundle
├── template.yaml
└── tests
```

## まとめ

ざざっと調べた程度ですが公式のドキュメントやStack Overflow等でもAWS SAM + Ruby の情報はまだ少ない様子。
今回の教訓は以下のとおりです。

- `sam build`はデプロイ時に
- gem は vendor/bundleに置く
jQueryでeachを使う

jQueryオブジェクトを複数取得した後、ループ処理をしたいのにいつも忘れてしまうeach文の使い方をまとめました。

スキップは**return true**、ブレイクは**return false**がポイントです。

each文で取得するHTMLはこちら

```html
<ul class="array_test">
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
  <li>item5</li>
</ul>
```

javascriptはこのように記述します。

```js
$('ul.array_test li').each(function(index, element){
  console.log(index + ':' + $(element).html());
});
```

```:実行結果
0:item1
1:item2
2:item3
3:item4
4:item5
```

###スキップする(return true)

```js
$('ul.array_test li').each(function(index, element){
  if(index == 3){
    return true;
  }
  console.log(index + ':' + $(element).html());
});
```

```:実行結果
0:item1
1:item2
2:item3
4:item5
```

###途中でブレイク(return false)

```js
$('ul.array_test li').each(function(index, element){
  if(index == 3){
    return false;
  }
  console.log(index + ':' + $(element).html());
});
```

```:実行結果
0:item1
1:item2
2:item3
```
Git for windows > git svn がフリーズする（version2.20.1のバグだった）

## 状況

現場のsubversionをgitに移行すべく、git svn initを実行するが、
「・・・Initialized empty Git repository」のあと進まなくなってしまう。
git svn cloneでも同じ状況。
ネットワークの問題でSVNサーバーに接続できないのか、リポジトリが大きいせいなのか、
リビジョンを指定してもtrunkのみ対象にしても結果が変わらない。

## 原因
以下のような記事を発見。
https://stackoverflow.com/a/54910767

Git for Windows v2.20.1のバグだったようだ。
https://github.com/git-for-windows/git/issues/1993

v2.21.0にバージョンアップしたところ、現象は解消された。
数字リテラルに対してスマートにメソッドを呼ぶ方法【JavaScript】

JavaScriptで、数字リテラルに対してスマートにメソッドを呼ぶ方法を解説します。

## 数字リテラルに対してスマートにメソッドを呼ぶ方法【JavaScript】
まず基本的な方法は、カッコで括る方法です。

```javascript
(1).toString();// '1'
```

しかしこれには問題があります。詳しくは[こちらの記事](https://qiita.com/ToshioAkaneya/items/8dd1ef2bc3847ce6329f)で解説しています。

ドットを付ける方法もあります。

```javascript
1..toString();// '1'
```
しかし、小数に対しては使え無いので一貫性がありません。
一貫性のあるオススメの方法が、半角スペースを使う方法です。

```javascript
1 .toString();// '1'
```
以上です。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
PlayFab Insights とは？！

GDC2019アップデートの一つ 「PlayFab Insights」ってなに？
という話

### PlayFab Insights とは？
複数のゲームデータと組み合わせて、ゲームのパフォーマンス測定と分析を行うことができる機能
バックエンドの仕組みはAzure Data Explorer なので高スループットで大規模なデータセットでも数秒で照会が可能
5分以内にはデータにアクセスができ、SQL風のクエリでデータ検索・分析が可能
他のデータもインポートして相関分析も可能(裏がData Explorerだから)

### 何ができるの？
(1)データの検索・分析に最適化された、強力なSQL風のクエリ言語の使用
(2)大量の異種データ（構造化および非構造化）の分析をサポート
(3)Power BIやExcelなどの複数のデータコネクタとのデータ統合
(4)外部のプラットフォームやフォーマットとの間でデータをインポートおよびエクスポートする機能
(5)データのプライバシーとガバナンスはGDPRに準拠して管理
(6)カスタムデータ パイプラインを作成、スケジュール、および監視する機能

### どうやって使うの？
PlayFab Insight を専用で使うためには下記いづれかのアカウントが必要
・Organizational account (Azure AD ID とか)
・Microsoft account
共用でもよい場合はアカウントはいらないらしいが、個人的にはセキュリティ的に専用の方がよい気がします・・・

### データの確認
Data Explorer のWebクライアントからPlayFabInsightsClusterを指定することで確認することができる
(PlayFabの管理画面上からまとめて確認できるわけではなさそう)

これが使えるということは、以前の30日でログがなくなる対策として考慮できるということだと思われ
Manjaroで Kernel Panic!!

# OSが起動しなくなった!!!

研究室のManjaroマシンが起動しなくなって非常に焦りました...

# 参考にさせていただいたサイト

ほんっとうに助かりました...!

- [カーネルパニック(ArchWiki)](https://wiki.archlinux.jp/index.php/カーネルパニック)
- [grub.cfgが破損してOSが起動しなくなった場合の対応方法②](https://qiita.com/daisuke0115/items/da6f399df52af95cc0b8)

# 復元手順

1. grub のコンソールで, もともとのマシンのrootにあたるパーティションを探す.
2. そのうちで, カーネルのある場所を探す.
3. grubのコンソールから[grub.cfgが破損してOSが起動しなくなった場合の対応方法②](https://qiita.com/daisuke0115/items/da6f399df52af95cc0b8)に従ってbootをする.
4. 起動できたら, 一旦poweroff (そのままコンソールが扱えそうだったら続けて行って良いと思う)
3. リカバリのために, Live CD や Live USB などを用意する.
4. /dev/sdX のなかから, もともとのマシンのrootに当たるパーティションを探す.
5. /mnt に /boot /proc /sysfs /dev をマウントする.
6. chrootを実行
7. 私はNVIDIAの設定が狂っていたので, ここでlightdmのデーモンを切りました.
8. 再起動

# 最後に
リマインダー的な記事になってしまったので,
また時間があるときに追記したいと思います.


(治って本当に助かった...笑)
Dockerでpythonコンテナを作成してもすぐに落ちて 困った話

# 初めまして！
Qiita初投稿です。
職業はプログラマーとは全く関係がありませんが、プログラマーに憧れて最近勉強し始めました！同じような境遇の方、一緒に頑張りましょう！

# 何かとDocker使いたい
ほんの少しdockerが使えるようになり、嬉しかった（調子に乗った）ので、すでにホストにpythonの環境が整っているのにも関わらず、dockerでpython3イメージからコンテナを作ってみようと思い、早速洗礼を受けたというお話です。

# Exited (0)の洗礼
↓これでいけるだろうと高をくくっていました。

```
docker run --name dl python
```

しかし

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```
あれ？コンテナ起動してないけど`run`したらコンテナ起動するんじゃなかったっけ？

一応確かめます。

```
$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                     PORTS               NAMES
e5a8b2e35c47        python                     "python3"                7 seconds ago       Exited (0) 5 seconds ago                       dl
```

コンテナは作れているけどExited (0)です。

# 動じない僕
いや、大丈夫。なんてったって、僕は`docker start`も知っているからね。

```
$ docker start dl
dl
```

これでいけるはず！！！

# 動じる僕
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

・・・なんでやねん！

```
$ docker exec -it dl bash
Error response from daemon: Container [...] is not running
```
・・・どうしたらええねん！さっき`docker start`させたやん！


# 偶然の解決
・・・いろいろ悩みましたが、これでなぜかいけました。

```
docker run -it --name dl python bash
root@f45107d69802:/# exit
```

↓コンテナから`exit`で抜けてもこの通り！

```
$ docker start dl
dl
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
f45107d69802        python              "bash"              About a minute ago   Up 3 seconds                            dl
```
`docker start`できちんと起動しています！

# まとめ
dockerでpythonのコンテナを作るときは、`-it　... bash`が必須なのでしょうか？

原因はよくわかっていませんが、いつかこの投稿を見直した時にはわかっていると信じて、とりあえず先に進みます！早くDeepLearning勉強してみたい！！

・・・でも、やっぱり原因がわからないのも気持ち悪いので、何かアドバイスいただけるともっと嬉しいです。よろしくお願いします。
クラスとインスタンス　オススメ記事

java初学者です。
現在、**クラス**と**インスタンス**をちゃんと理解していないことに気づいたので勉強中です。
勉強している中で初学者でもイメージを掴みやすいなと思った記事を紹介します。
今回、掲載する記事を元にアウトップットする予定ですので、
皆さんもクラスとインスタンス（継承も少し載ってる）についてQiitaに投稿してみてください。
#[図で理解するJavaのクラスとインスタンス](https://qiita.com/hys-rabbit/items/a2ce50d3387cfa0f62f2)
#[クラスはなぜNewしないと使えないのか](https://qiita.com/kn2018/items/f99f62cabfd31667b055)
#[クラス変数はなぜ必要なのか【Java】](https://qiita.com/houjitea2/items/11dd6f9a88c6c722bd76)

他にも良記事があれば随時更新していきたいと思います。
クラスとインスタンスがわかればソースコードが格段に読みやすくなります。
僕も上記の記事を読んでjavaのソースコードが読みやすくなった感覚がありました。
楽しく読んでいきたいと思います。
Koa.js での Response の Headers

自分用メモ。

`Koa.js` で Response の Headers を設定するには

``` javascript
app.use(async ctx => {
    ctx.set('Content-Type', 'text/html');
});
```

こうする。

---

参考：[javascript - How do I set headers to all responses in Koa.js? (Stack Overflow)](How do I set headers to all responses in Koa.js?)
Twythonを使ってみた

##備忘録やで
TwitterAPIとったので遊んでましたがちょくちょく使い方忘れるので基本的なTwythonの使い方をおいときますね
Tweepyはこういう日本語の情報多いんですけどTwythonになると全然ないのでいちおう書きます
でも基本的なことしか書かないです
深いところは公式の英語の説明読んでください
https://twython.readthedocs.io/en/latest/index.html

###APIの取得
普通にぐぐれば取り方はいっぱい出てくるので僕が前に書いた取り方のコツのまとめ置いときます
https://qiita.com/nya3_neko2/items/d801a7b47d335a643cfa

###Twythonのインストール

```
$ pip install twython
```

###apiインスタンスの作成
まずTwython使うためにapiインスタンスを作成します
Twitterには0auth1と2があってツイートをするなら前者の設定が必要です
読み取りだけをするなら後者でいいです
今回はOauth1の方を使っていきます
""の中に取得したkeyとか書きます

```Oauth1.py
CONSUMER_KEY = ""
CONSUMER_SECRET = ""
ACCESS_KEY = ""
ACCESS_SECRET =""
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET) 
print('Auth Done!')
```
```Oauth2.py
APP_KEY=""
ACCESS_TOKEN=""
api = Twython(APP_KEY, access_token=ACCESS_TOKEN)
```
後者でやるほうが審査が簡単だったりします
APIとる作文めんどくさいですからね
後者にチャレンジするときはhttps://developer.twitter.com/en/apps にアクセスしてappの登録してください
###timelineの取得


```python
user_timeline = api.get_user_timeline(screen_name = user_name,count=1)
```
で取得したいアカウントの最新ツイート1件取得します
user_nameには取得したいアカウントの@を抜いたIDをstrで入力します
僕のTwitterは@nya3_neko2なのでこの場合は

```python
user_name = "nya3_neko2"
```
countを変えれば最大200件まで取得できます
ここで取得されるuser_timelineはlistです
ここから最新ツイートのtextが取得したければ

```python
try:
    user_timeline = api.get_user_timeline(screen_name = user_name,count=2)
    for tweet in user_timeline:
        now_tweet = tweet['text']
        print(now_tweet)
except TwythonError as e:
    print('error')
    print (e)
```
でnow_tweetに最新ツイートのtextが代入されます
###ツイートしてみる
ツイートしてみます
""の中にツイートする文を入れましょう
改行したいところに\nいれれば改行できます

```python
api.update_status(status="")
```

この""に文字数制限を超えたものや、直近で重複したツイートしている場合はエラーが出ます
👇こんなの
Twitter API returned a 403 (Forbidden), Status is a duplicate.
モブプロは効率が良いのか

# はじめに
2019/2/23に刊行されました、[「モブプログラミング・ベストプラクティス ソフトウェアの品質と生産性をチームで高める」](https://www.amazon.co.jp/%E3%83%A2%E3%83%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%93%81%E8%B3%AA%E3%81%A8%E7%94%9F%E7%94%A3%E6%80%A7%E3%82%92%E3%83%81%E3%83%BC%E3%83%A0%E3%81%A7%E9%AB%98%E3%82%81%E3%82%8B-%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%BB%E3%83%91%E3%83%BC%E3%83%AB/dp/4822289648)という書籍を読みました。

![51aIqvL8iXL.jpg](https://qiita-image-store.s3.amazonaws.com/0/223534/7a1f02e2-d908-18c7-f374-59b7efcdde7c.jpeg)

本稿はおおむね、その内容のうち特に感銘を受けた部分について取り上げ、解説したものです。

帯に「一緒に働くだけで個人とチームが成長する」とありますが、まさにその通りだと感じました。

当書は、モブプロの何が良いのかわからないという方、モブプロをどのように始めれば良いのかわからない方、またモブプロの良さはわからないが上司やメンバーをどうやって説得しようと考えている方にとってもおすすめです:thumbsup:


## モブプロ、効率下がらないの？

モブプロは簡単に言えば、３人以上のメンバーが一つの画面の前に集まり、一人が実際に操作をし周りの人々（モブ）がなんやかんやと言いながら開発を進めていく手法のことです。

直感では、1/3になるとは言わずとも３人が並行で開発をするより効率が劣るような感じもしますよね。

## フロー効率を改善する

### エキスパートの生む問題
あるチームでそれぞれの分野におけるエキスパートがいて、各々が独立に開発しているとします。
それぞれのエキスパートはお互いの領域について詳しくありません。

さて、このような時に発生する問題はどのようなものでしょうか？

まず、誰か一人でもいなくなった場合に困った状況になるのは明らかです。
また、特定の分野のタスクが短期間で増えた場合、その分野を他のメンバーでカバーすることができず、結果としてサービスのリードタイムにおけるボトルネックとなります。

いわゆる、**属人化が進んでしまった状態**ですね:fearful:

### リソース効率とフロー効率

#### リソース効率
リソースの稼働率が高いことをリソース効率が良いと言います。
換言すれば、チームメンバーみんながそれぞれ仕事を持っていればいるほどリソース効率が良いということです。

#### フロー効率
サービスのリードタイムが短くなることをフロー効率が良いと言います。
例えば、複数の仕事を並列して進めるより同じ仕事を分担してみんなで進めたほうがフロー効率が良いと言えます。

 ＊リソース効率をフロー効率については記事「[フロー効率性とリソース効率性について（QCDのトレードオフなんて本当は無かったんだ）](http://i2key.hateblo.jp/entry/2017/05/15/082655)」がわかりやすいです。興味のある方は、ぜひお読みになってください。
  
  
**上の例におけるような属人化が進んだチームでは、リソース効率を高めることがは非常に容易いですが、フロー効率を向上させることは難しいです。**
それぞれがお互いの分野を知らないので、同じ仕事をみんなでというのが苦手なチームになってしまっているからです。

### モブプロはゼネラリストを生む　
モブプロは、みんなで一つの作業を進めていくわけですから、色々な場面で行うことで自ずとゼネラリストがたくさん生まれることになります。
ゼネラリストが生まれるということは、もし特定領域においてタスク量が増えた場合カバーを行いやすく、そういった点においてボトルネックを生みづらいチームになるという強みを得ることになります。

## 他にも、効率が良いと言える要素はたくさん:sunglasses:

### 合意プロセスの省略・改善
みんなで意見を出し合いながら作業を進めているということは、その時点で一定の合意が得られているということになります。
また、評価行程として考えても、品質が向上することは明らかで、不具合などを埋め込む可能性が低くなります。
これはつまり、手戻りという**顧客に対する価値を生まない状況に陥る自体を避けやすくなる**ということです。

### ノウハウの共有
特定の分野に関する知識の共有を経てゼネラリストが生まれやすいということは上述いたしましたが、これは特定の分野における知識だけにおける話ではなく、**汎用的な知識をメンバーで幅広くシェアし生産性を高めることも可能です**。
ショートカットやツールなどに対する知見が得られることはもとより、人それぞれコードの書き進め方や考え方を垣間見ることで得られるものって少なくないですよね。

### 新人の教育
プロジェクトの先輩がどのように操作していくかを実際にみる時間がたくさん与えられることは、新人の方々に良い影響を及ぼす可能性は高いですし、教育のために何か他の仕事を引き換えとする必要がなくなります。

# おわりに
短い記事でしたが、モブプロに対する興味をもつ機会になっていただければ嬉しい限りです。
私個人としては実は完全なる新人で、恥ずかしながらチームという目線で考えを進めていくことがあまりできていませんでしたが、今回当書を読み本当に、そのような目線で考える良い機会となったなぁと感じました。
謝り等ございましたら、ご指摘頂けますと幸いです。  
**レッツ、モブプロ！**
tensorflow-gpu 1.5.0が動くまで

(また後日清書します。今日(2019/3/28)の所は覚え書き程度に)
※2019/4/4追記
本試行は実行マシンが初代i7を積んでおりAVX命令に対応していないのでtensorflow1.5.0以前しか使用できないという前提に立って記載しています。しかし、ソースからビルドするとそれ以降のバージョンでも使用出来る事がわかり、試したところUbuntu Server 18.04上で1.13.0-rc0をビルドし使えるようになりました。因って、この記事は単なる知識不足の思い込みからの試行錯誤の記録となりました。

以前Fedora29 i5 16Gのマシンで流行の機械学習を少し試してみようとtheano+kerasを使ったネットの記事を元に動かして見たのですが遅すぎて話にならず。
そんな中、つい最近長年使っていたPCを引退させたのでこちらにグラボを積んでみる。
積んだのは

MSI GoForce GTX 1060 GAMING X 6G

です。

いざtesorflowをGPUで動かして見ようと思ったのですが…ほぼ丸一週間かかった。その奮戦記です。

最初は__CentOS7.3__上で環境構築しようと思い色々試す。この時はCUDAのインストールに苦戦。ネットの情報ではnvidiaドライバを入れてからCUDA Toolkitという順序のように思って試したのですがnvidia-smiすらFatal Errorと。
結局CUDA Toolkitをいきなり入れたらドライバも入ってくれるとのことでCUDA Toolkitだけを入れたら見事に動いた。CUDAのサンプルも動きました。cudnnも言われたとおりにやったらすんなりインストール完了。ただrpm形式のサンプルプログラムにはコンパイルに必要なsamples_common.mkが入ってない。。。仕方なくUbuntsu用のdebを解凍し使いました。動作の方は問題無かったです。
その次にtensorflow-gpuを入れたのですがimportでこける。どうやら原因はlib、つまりgcc周りが古いのが原因のようで。しかしCentOSはサーバー用途なので多少無理な方法でバージョンを合わせたりするなどの策が必要な様で。なのでCentOSは断念。

それならと先進的な__Fedora29__で環境構築しようと思いました。
この時は慣れた物でCUDA、cudnnもすんなり。tensorflow-gpuも入りました。しかしまたしてもimportでエラー。どうやらCUDAは10でないと無理で、最新のCUDA 10.1ではtensorflow-gpu動かないらしい。しかし、Fedora用は10.1しかない。よってFedoraも断念。

それならと__Ubuntsu Server 18.04 LTS__を試しました。CUDA,cudnnはUbuntsuが一番すんなり動きますね。ネットの皆様がUbuntsu使われている理由がよくわかりました。tensorflow-gpuを入れるところまではいけたのですが、importで今度は

```
illegal ERROR (Core dumped)
```
と出てで落ちました。調べると使っているマシンのCPUがi7なのはいいが第一世代のものでAVX命令に対応していないのが原因とのこと。
_tensorflow-gpu-1.5.1以降はダメ_のようで。なのでtensorflow-gpu-1.5.0を入れようとする。
その為にはCUDA 9.0 or CUDA 8.0を入れなければならない。なので、CUDA 9.0を入れようとしたのですが18.04用は提供されていない。よって18.4を断念。Ubuntu 16.04 LTSならCUDA 9.0が提供されているのでそちらを。

__Ubuntu 16.04 LTS__は最初Serverをインストールしたのですがインストール後固まる現象が起きて埒が明かないのでDesktopを使いました。CUDA 9.0,cudnnを無事インストール。しかし肝心のtensorflow-gpu-1.5.0はどうやったら手に入れられるのか…
色々探しているとYoutubeに親切な動画があって、

https://pypi.org/project/tensorflow-gpu/1.5.0/#files

こんなところに有ったのですね。
こちらのお陰でwhlファイルのファイル名の意味を知ることが出来ました。
anacondaのpythonをcondaで3.6に切り替えてインストールし、無事に動かす事が出来ました。

いやぁ、長かったw
System.ValueTuple.dllの参照エラー（unresolved）

現在参画している案件で、ASP.NET Web Siteの保守開発を行っている。

プロジェクトのターゲットフレームワークは.Net Framework 4.5.2。
なので、ValueTupleを使用するにはSystem.ValueTuple.dllをNuGetでダウンロードし、  
プロジェクトから参照できるようにしておく必要がある。
（Web Siteの場合、binにdllファイルを配置するだけ）

しかし、dllをbinに配置しただけだと以下のようなビルドエラーが表示されてしまう。

```
BC30002: Type 'ValueTuple' is not defined.
```
 
上記エラーを修正するためには、Web.configのassemblyBindingセクションに下記を追加する

```
<dependentAssembly>
 <assemblyIdentity name="System.ValueTuple" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" />
 <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
```

これでビルドエラーが消え実行できるようになるが、ValueTupleを使用しているページを表示すると・・・  
以下のようなコンパイルエラーが発生してしまった。

```
BC30560: 'ValueTuple' is ambiguous in the namespace 'System'.
```
 
原因は環境依存で、Windows 10 Fall Creators Updateから.Net Framework4.7が標準インストールされ、4.7ではValueTupleがGACの方にも追加されてしまったからのようだ。

ということで、ターゲットフレームワークが4.7以上の場合、System.ValueTuple.dllの参照は削除しなければならないと思うのだが、ターゲットフレームワークが4.7未満のプロジェクトはどうしたらよいのか・・・

解決策はターゲットフレームワークを4.7にするしか無いような気がする。

以下、参考URL
[https://github.com/dotnet/roslyn/issues/18775:title]
ラズパイでコンソールサーバー(もどき)

## これは何
NW機器のコンソールポートをNW越しに触れるようにしたメモ
aptだけで大丈夫版(makeいらず)

## 材料
### 主な材料
- ラズパイ(Raspberry Pi 3 Model B)
- USBシリアルアダプター(BSUSRC0610BS、Win10でも追加のドライバいらない 便利なやつ※いつからかのWin10からドライバが消えてるみたいです、手動でインストールが必要に(´・ω・`))

###お好みで
- RJ-45 <==> DB-9 ケーブル(NW機器とかに付いてるの)
- シリアルケーブル

## 下準備
1. ラズパイへRaspbianをインストール&パッケージアップデート
2. NICなどなど設定
3. USBシリアルアダプターをラズパイに接続

## すること
1. ターミナルエミュレーター(minicom)をインストール

    ```bash
sudo apt-get install minicom
```
2. USBシリアルアダプターのラベルを確認

    ```bash
ls -d /dev/* | grep ttyUSB
```
3. シリアルポートの設定ファイル作成

    ```bash
sudo vi /etc/minicom/minirc.${お好きな名前}
```
```:/etc/minicom/minirc.${お好きな名前}
#先程確認したUSBシリアルアダプターのラベル
pu port             /dev/ttyUSB0
#ボーレート
pu baudrate         9600
pu bits             8
pu parity           N
pu stopbits         1
```
4. 接続

    ```bash
minicom ${お好きな名前}
``` 
5. (･´ｰ･｀)
    `CTRL+A => Z`で操作説明

## おわり
あとはご自由に
Flask 階層分け

# はじめに
* せめて２階層にわけたい

# 構成
```
│  svr.py
├─ apps
│  ├─ root.py
│  └─ hello.py
├─ templates
│  ├─ root.html
│  └─ hello.html
└─ static ...空
```

# 実行結果
![blueprint.png](https://qiita-image-store.s3.amazonaws.com/0/222636/eb8f4c4a-a04c-3c17-d0a0-948b5c6cb045.png)


# app
## [1]svr.py
```python
from flask import Flask

# 分割先のコードをインポートする。appsはフォルダ名。
from apps import root
from apps import hello

app = Flask(__name__)

# 分割先のコントローラー(Blueprint)を登録する
app.register_blueprint(root.app)  # /
app.register_blueprint(hello.app) # /hello

# 起動する
if __name__ == "__main__":
    app.run(debug=True)


```

## [2]root.py
```python
# Blueprintをimportする
from flask import Blueprint
# render_template を追加
from flask import Flask, render_template


# "root"という名前でBlueprintオブジェクトを生成します
app = Blueprint('root', __name__)

# ルーティング処理を書きます
@app.route("/")
def root():
    # render_template を使って root.html を表示
    return render_template('root.html')

```

## [3]hello.py
```python
# Blueprintをimportする
from flask import Blueprint
# render_template を追加
from flask import Flask, render_template


# "hello"という名前でBlueprintオブジェクトを生成します
app = Blueprint('hello', __name__)

# ルーティング処理を書きます
@app.route("/hello")
def hello():
    # render_template を使って hello.html を表示
    return render_template('hello.html')

```

## [4]root.html
```html
<html>
<body>
<div>
this is root.
</div><div>
<a href="./hello">hello</a>
</div>
</body>
</html>
```

## [5]hello.html
```html
<html>
<body>
<div>
this is hello.
</div><div>
<a href="./">root</a>
</div>
</body>
</html>
```

# 参考（今日のレシピ）
https://www.yoheim.net/blog.php?q=20160507
CentOS7でmaildrop-3.0.0をビルドした時のメモ

# はじめに

プライベートで利用しているVPSサービスが終了するので、別のVPSに乗り換える際にUbuntuからCentOSにディストリビューションを変更することにしました。

これまで利用していたmaildropの設定を引き継ごうと思ったのですが、procmailはあるもののmaildropは見つかりませんでした。

maildrop-2.8.x系列をCentOS7にインストールする方法は、いくつかみつかり、またNux DesktopのRPMも入手可能です。

今回は maildrop-3.0.0 が欲しかったので、次の記事を参考に作業を進めたので、差分の記録を残しておきます。

# 参考文献

* https://blog.cles.jp/item/9042

# ポイント

CentOS7でmaildropをビルドする時に必要な、famライブラリを準備するため、以前はlibfam-develを利用していたようですが、現在はgamin-develに引き継がれているので、そういった細かい点で変更点があります。

# ビルド手順

http://www.courier-mta.org/download.html から、次の2つのtar.bz2をダウンロードしておきます。

* courier-unicode-2.1.tar.bz2
* maildrop-3.0.0.tar.bz2

## パッケージのビルド

Specファイルは準備されているので、rpmbuildでビルドは完了します。

```bash
$ sudo yum install gamin-devel gdbm-devel pcre-devel libidn-devel
$ rpmbuild -ta courier-unicode-2.1.tar.bz2
$ sudo rpm -ivh rpmbuild/RPMS/x86_64/courier-unicode-2.1-1.el7.x86_64.rpm
$ sudo rpm -ivh rpmbuild/RPMS/x86_64/courier-unicode-devel-2.1-1.el7.x86_64.rpm
$ rpmbuild -ta maildrop-3.0.0.tar.bz2
$ sudo rpm -ivh rpmbuild/RPMS/x86_64/maildrop-3.0.0-1.x86_64.rpm
```

# さいごに

ログは確認していますが、コンパイルは特にエラーなく完了しているようです。

自分が管理しているドメイン宛てのメールは、さくらのメールボックスを利用していて、前段の~/.fetchmailrc は次のようになっています。

"__pop3_mailserverN__", "__login_idN__", "__passwordN__" (Nは数字)の部分は、それぞれ適当なメールサーバー、メールアドレス、パスワードになっています。


```fetchmail:~/.fetchmailrc
set syslog
set no bouncemail
defaults
    protocol pop3
    port 995
    fetchall
    ssl
    nokeep
    no mimedecode
    mda "/usr/bin/maildrop"

poll  <pop3_mailserver1>
        user  <login_id1>
        password <password1>
        user  <login_id2>
        password <password2>
        ...

poll __pop3_mailserver2__
        ....
```

pollやid,passwordの組は複数書く事ができて、受信したメールの処理はmaildropに任せています。

今回の maildrop に処理をさせるための、~/.mailfilter は次のような内容にしています。

```maildrop:~/.mailfilter
HOME=/home/user01
MAILDIR="/work/maildir/"
MAILDROP="/work/logs/"

logfile "${MAILDROP}maildrop.log"

to "${MAILDIR}"
```

logfileに指定しているmaildrop.logの処理は、logrotateに任せているので、/etc/logrotate.d/maildrop には次のように記述しています。

```logrotate:/etc/logrotate.d/maildrop
/work/logs/maildrop.log {
  rotate 55
  weekly
  compress
  missingok
  notifempty
}
```

こんな感じでVPS上にメールをアーカイブしてインデックスを作成するなどの処理を行なっています。

以上