OmniAICreator/Qiita-1.07M huggingface dataset:
Docker for Windowsのドライブ共有時に必要なESETでの設定

## はじめに
Dockerの**Shared Drives**が適用できない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/068f36dd-ff7c-5185-8afd-2e1e761d47e6.png)

ファイアウォールによって、Dockerとの通信が遮断されているみたいです。
以下は**ESET Internet Security 11**での操作手順です。

## ESETでの対処法

### ESET Internet Security 11を開く

タスクトレイのアイコンをダブルクリックで起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/0db0a6f1-4f82-2673-33d1-cdb3f55a4c64.png)

### 設定 > ネットワーク保護 を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/0aa43fb7-7cd7-3c3b-1844-ef7ffbc35e6d.png)

### トラブルシューティングウィザードを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/72d3b9ef-dc1b-137e-675a-f2b3506fc287.png)

### Dockerのものを見つけてブロックを解除する
DockerNATはデフォルトで **10.0.75.0/24** のIPアドレスが割り振られるので、それに該当するものを探します。
また、使用ポートは**445**です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/30365b5b-fd45-244c-ec57-00a9909ffa70.png)

## 再度共有設定を行う
**Apply**を押して、左下が再度**Docker is running**となれば成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/65b31bf6-37ad-6847-e135-c5867694ba6b.png)
Rustcに付随しているLLVMを使う

注：以下の方法は**Windows(`*-pc-windows-msvc`)では使えません**

Rustはアセンブラを生成するためにLLVMのライブラリを使います。これはtoolchainに含まれていて、例えばお手元の`~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/codegen-backends`を覗いてみてください（ちなみにlibcoreやlibstdもこの辺にあります)。ここに`librustc_codegen_llvm-llvm.so`という共有ファイルがあり、これにLLVMのライブラリが含まれています。

一方、ユーザーがRustでLLVMを使う方法としては、例えば以下の記事でも紹介されていますが、`llvm-sys`があります。

- [RustでLLVMしてみたメモ](https://qiita.com/JunSuzukiJapan/items/88c5fec58dddb0522cca)

`llvm-sys`は他の`*-sys` crateと同様に、システム(`/usr`)や他の場所にインストールされているLLVMを使います。しかしLLVMのインストールは存外面倒で、パッケージ管理システム(apt,dnf等)で入るものが古すぎたりします。
私は[llvmenv](https://github.com/termoshtt/llvmenv)というのを作って管理していたのですが、今回はrustc自体に含まれるLLVMを使う方法を紹介します。

rustc-llvm-proxy
-----------------
https://github.com/denzp/rustc-llvm-proxy

このcrateは実行時に[libloading](https://github.com/nagisa/rust_libloading)を使って動的に共有ライブラリを読み込み、LLVMの関数を呼び出します。RustとのFFIには`llvm-sys`を使います。

```toml:Cargo.toml
[dependencies]
rustc-llvm-proxy = "0.1"

[dependencies.llvm-sys]
version = "60.2"
features = ["no-llvm-linking"]
```

この様に`llvm-sys`に`no-llvm-linking`を指定します。これでシステムに(rustc自体と別個に)LLVMがインストールされていなくてもrustc自体の使っているLLVMを使う事ができます。これにより

- rustcのコード生成と同じLLVMのビルドを使うことができる
- システムのLLVMに依存しない

の2点が解決されます。

```rust:main.rs
extern crate llvm_sys;
extern crate rustc_llvm_proxy;
```

の様にextern crateだけしておけば後は`llvm-sys`の場合と同じです。参考に上記の記事のコードをコンパイルできる形にしたものを[rustc-llvm-proxy-example](https://github.com/termoshtt/rustc-llvm-proxy-example)においておきます。

### 追記
- stableでも使えるのでnightlyな表記を削除
- windowsでは使えない旨を表記 (https://github.com/denzp/rustc-llvm-proxy/issues/1)
    - `*-pc-windows-msvc`/`*-pc-windows-gnu`の違い

### 追記2
- rustc-llvm-proxy 0.1.3では`LLVM_InitializeAllTarget`等の初期化マクロが呼べません。個別のターゲットごとの初期化を使うか、以下のPRを使ってください https://github.com/denzp/rustc-llvm-proxy/pull/4
Getting Real Visitor IP in a Laravel Application regardless of how many in-betweens

Recently I worked on a project that happens to be architected this way. (Not my decision)

React.js Frontend -> GraphQL Server -> Cloudflare -> Laravel Backend REST APIs

Naturally getting the real IP of the visitor is very troublesome. Previously when it was just Cloudflare sitting in front of the Laravel app. Getting the visitor IP is a simple case of configuring https://github.com/fideloper/TrustedProxy and you can continue to use your usual `request()->ip()`

However, in this new architecture, you have a GraphQL server in front of Cloudflare, making things not as straight forward.

But still, the solution is simple after some dive into Laravel's source code

1. Make your GraphQL server forward the visitor IP to Cloudflare on the `X_FORWARDED_FOR`header.
2. In your Laravel App, when you fetch the request IP, instead of doing `request()->ip()`, do `last(request()->getClientIps())`
3. Done!

Now for the explanation:

1. First, read the [Cloudflare docs](https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-) on `X-Forwarded-For`
2. In short, the real visitor IP is the last one on `X-Forwarded-For` header
3. Now let's look at the code behind Laravel's `request()->getClientIps()`

```php
    /**
     * Returns the client IP addresses.
     *
     * In the returned array the most trusted IP address is first, and the
     * least trusted one last. The "real" client IP address is the last one,
     * but this is also the least trusted one. Trusted proxies are stripped.
     *
     * Use this method carefully; you should use getClientIp() instead.
     *
     * @return array The client IP addresses
     *
     * @see getClientIp()
     */
    public function getClientIps()
    {
        $ip = $this->server->get('REMOTE_ADDR');

        if (!$this->isFromTrustedProxy()) {
            return array($ip);
        }

        return $this->getTrustedValues(self::HEADER_X_FORWARDED_FOR, $ip) ?: array($ip);
    }
```

As we can see we need to grab the last item in the array returned by `getClientIps()`. In PHP there is the `end(&$array)` method but doing so will give you `PHP Fatal error:  Only variables can be passed by reference` error so you would need an extra line to assign the response of `getClientIps()` to a variable first.

```php
$clientIps = request()->getClientIps();
$visitorIp = end($clientIps);
```

But thankfully, Laravel has a `last($array)` helper method which avoids the need for that and calls `end(&$array)` behind the scenes.

```php
    /**
     * Get the last element from an array.
     *
     * @param  array  $array
     * @return mixed
     */
    function last($array)
    {
        return end($array);
    }
```

I hope this article helps anyone who is facing a simular issue. Good night :)
Docker for Windowsで起動時に「Docker for Windows - Access denied」と表示される場合の対処法

## はじめに
Docker for Windowsで、起動時に以下のような通知がされ、起動できない場合があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/8a1e6202-5e7a-d3c3-8ff4-151508e66559.png)

```
Docker for Windows - Access denied
You are not allowed to use Docker
You must be in the "docker-users" groupe
```

## 原因
実行ユーザーが**docker-users**グループに所属していないためです。

基本的にインストール時に自動でグループに追加されるので、

* インストール作業をした管理者権限を持つユーザー以外でDockerを起動したとき
* インストールの際に管理者権限を持っていないユーザーでインストール作業を行ったとき
    * ログオンしているユーザーではなく、UACで認証したユーザーが**docker-users**に追加されます

などに遭遇します。

## 対処法

**docker-users**グループに、Dockerを利用したいユーザーを追加する必要があります。
グループにユーザーを追加するには**管理者権限が必要**なので、**以下の処理は管理者権限のユーザーで行ってください**。

### **1. スタートを右クリック > コンピュータの管理**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/52eae32a-6977-61a4-0370-b97454db6432.png)

### **2.ローカルユーザーとグループ > グループ から、docker-usersを選択**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/d9619cc6-7673-6faa-3c4a-1c84bcca61d1.png)

### **3. プロパティを表示し、追加を押す**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/95dd5df4-4ba0-bb0b-89d1-3a5a324b8621.png)

### **4. 追加するユーザーを指定する**

**オブジェクトの種類の選択**はユーザーを選択し(そのままでも良い)、
**場所の指定**はコンピュータ名が表示されているのでそのままで、
**オブジェクト名**は追加したいユーザー名を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/18854f34-103a-b209-a423-38368c428287.png)

**名前の確認**を押すと、ユーザー名が正しい場合は**オブジェクト名**欄が、

```
[コンピュータ名]¥[入力したユーザー名]
```

に自動解決されるので、**OK**を押してダイアログを閉じる

### **5. ユーザーが追加されたことを確認して適用する**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/fc4cb2c4-f34b-ee5b-d7ac-83e1efafb973.png)


### **6. サインアウトする**

グループの適用にはサインアウトが必要です。

### Dockerを起動してみる

正常に起動出来れば完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262177/934fb3fb-91fd-9e47-daf7-f07fd07ced18.png)

## 良いDocker for Windowsライフを！

Windowsでの開発環境が益々良くなっていくことを願っております。
DonkeyCar Macにtensorflowをソースからビルドしてインストール

https://www.tensorflow.org/install/install_sources

#java JDKをインストール
http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html
「jdk-10.0.2_osx_bin.dmg」をクリックしてダウンロード
マウントしてインストール

#bazelをインストール
https://docs.bazel.build/versions/master/install-os-x.html#install-with-installer-mac-os-x

ブラウザにて
https://github.com/bazelbuild/bazel/releases
「bazel-0.10.1-installer-darwin-x86_64.sh」をクリックしてダウンロード

ターミナルにて

```
$cd Downloads
$chmod +x bazel-0.10.1-installer-darwin-x86_64.sh 
$./bazel-0.10.1-installer-darwin-x86_64.sh --user
$export PATH="$PATH:$HOME/bin"
```

動作確認

```
$bazel version
```

#ソースをビルド
ターミナルの DonkeyCar の仮想環境で作業

```
$git clone https://github.com/tensorflow/tensorflow
$cd tensorflow
$git checkout r1.7
```
（r1.8はビルド失敗）

```
$./configure 
```
全ての項目にreturn

```
$bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
```

#pipパッケージ作成

```
$bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
```

#pip でインストール
現状のバージョンを確認

```
$pip list
```

```
$pip install /tmp/tensorflow_pkg/tensorflow-1.7.1-cp36-cp36m-macosx_10_7_x86_64.whl
```

バージョンを確認

```
$pip list
```
標準入出力のファイルディスクリプタ

よく忘れるのでメモ

|  | 数値表現 | マクロ@unistd.h |
|---|---|---|---|
|標準入力  | 0 |STDIN_FILENO | 
|標準出力  | 1 |STDOUT_FILENO |
| 標準エラー出力 | 2 |STDERR_FILENO | stderr |

|  |ファイルポインタ |
|---|---|
|標準入力  |stdin |
|標準出力 |stdout |
| 標準エラー出力 |stderr |
俺たちはIDisposableだから１ステップずつ全力で処理してこうぜ

母に病気が見つかって改めて気づいたんですが、俺たちは```IDisposable```をImplementしてるクラスのインスタンスであって、今まさに```using```の中にいるんですね。

```using```を抜けるまで何億ステップあるか全くわかりませんが、たとえ変数を宣言するだけのステップでも、願わくば全力で喜んだり怒ったり泣いたり笑ったりしながら```int hoge！```と宣言したいです。
Flaskを用いてWebAPIサービスを構築した際の経験談


# 概略
Flaskを用いてWebAPIサービスを構築した際のメモを共有します。

このWebAPIサービスは以下の要件を満たしているものとします。

-  あるWebAPIを呼び出すことによって，呼び出し元に特有のファイルを生成してダウンロードできるようにする。
-  上記で生成したファイルは一定時間経過後，自動的に削除すること。
-  nginx + uwsgi + flask の形でdeployする。 


# FlaskでのBackground処理

今回の実装において，「一定時間経過後，作成したファイルを自動的に削除」機能の実装に苦労しました。最初の開発環境では，一定時間後に作成したファイルを削除する処理を実行するThreadを別途作成していましたが，nginx + uwsgi + flask の環境にdeployすると，そのThreadが実行されない問題に遭遇しました。

おそらく，uwsgiに["harakiri"モード](https://uwsgi-docs.readthedocs.io/en/latest/FAQ.html#what-is-harakiri-mode)を設定していたため， nginx + uwsgi + flasｋ環境では，harakiriモードがFlask自体のプロセスが強制終了したために，削除するThreadが実行されなかったと推測します。

Flaskでは，background処理をどのようにすべきでしょうか。方針はFlaskのdocumentにありました。

# Celery Background Tasks

Flaskのdocumentにずばりそのものがありました。
[Celery Background Tasks](http://flask.pocoo.org/docs/1.0/patterns/celery/)
より引用です。

> If your application has a long running task, such as processing some uploaded data or sending email, you don’t want to wait for it to finish during a request. Instead, use a task queue to send the necessary data to another process that will run the task in the background while the request returns immediately.

大雑把に訳すと，「　データをアップロードしたりemailを送信するといった時間のかかる処理を含むのならば，その処理が完了するまで待つのでなく，タスクキューを使ってバックグラウンドでその処理を実行し，リクエストに対してはすぐに返答しなさい」
でしょうか。

このdocumentにはバックグラウンド処理をする際にどのようにCeleryを用いるか記載されています。このdocumentとCeleryのチュートリアル[First Steps with Celery](http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html)に従って，実際の実装を行いました。


# 今後の予定

実際には，上記WebAPIサービスを提供するDocker imageを作成して，Kubernetes上にdeployしました。deployする際に，どうceleryを動かすかについて一悶着がありましたので，それに関連した経験談に関してはまた後日。
ISUCON8予選に参加した話

ISUCON8に参加してきました。ISUCONは今回が初めてだったのですが、学ぶことも多く、来年も是非参加したいなと思いました。

この記事では今後ISUCONに参加される方へ、ISUCONがどんなものか、また自分たちがどういうことをしてきたか記していきたいと思います。今後参加される方の参考になればと思います。

# ISUCONが始まるまで
「(**I**)いい感じに(**S**)スピー(**U**)ドアップ(**CON**)コンテスト」の名の通り、架空のWEBサービスを高速化するらしいと聞き、サーバーとアプリケーション要員を一人ずつ、それと自分の３人で挑むことにしました。この布陣はバランスが取れててよかったと思います。

## 事前対策
本番まで2回ほどチームメンバーで集まって過去問を解きました。言語は３人の共通部分をとってPHPです。題材は[公式](https://github.com/isucon)や、[Vagrant](https://github.com/matsuu/vagrant-isucon)、[Ansible](https://github.com/matsuu/ansible-isucon)、色々と作ってくださったものがありますが **Vagrant** でやるのが一番いいと思います。公式のでセットアップしたら軽く1日溶けました。Docker作ってくれる人いないかな...

「isucon 対策」とかでググるとhtopとかでプロセスを監視しつつ、[alp](https://github.com/tkuchiki/alp)やら[pt-query-digest](https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html)といったツールを使ってアプリケーションのボトルネックを探せばよいとあり、確かにそれで十分スコアあげれる感がありました。

## 思い描いていたシナリオ
リハーサルで３人だと開発環境作らないと厳しい感じだったので、DockerComposeを書いて環境の共有をしようという話になり、最初の1,2時間で一人がDockerComposeを書き上げ、その間にアプリケーション担当がコードリーディング、サーバー担当がボトルネックを見つけたりなんなりして、「３０分くらい指針を話し合い２時間くらい開発を行う」のローテーションを回すみたいな感じを想定していました。

定期的に話し合うのは、一回全員が好き勝手にチューニングした時に優先度の共有がなされず、まさに「船頭多くして船山に登る」状態になったからでした。

で、この布陣になると自分がcompose書くわけなので、**どうせphp-nginx-mysqlで来るだろう** しISUCON7のcomposeファイルを書いてカンニングペーパーにすれば余裕では？という思いで、とりあえず一年前の予選のcomposeファイルだけ書きました。

そして事件が起きました

# ISUCON本番
第一関門「起床」をクリアし順調な滑り出し。が、問題を見て

```math
\def\textlarge#1{%
  {\rm\Large #1}
}
```
サーバー3台あるとか聞いてないんやけど

$\textlarge{ってかH2Oってなんや}$

あとあとよく見ればISUCONは複数台のサーバーが使えるという記事も見つけました。よくわかんないけどなんか色々分散させるんですかね。

h2o初耳だったので調べるとDeNAの方が作ったそう...あ、そういやDeNAさんも作問してるんやった...

## やったこと

計画通りまずDockerComposeファイルを書き始めたのですがなかなか上手いこといかず、2時間過ぎた時点で諦めました。特にh2oに関する知識が足りなかったように思います。仕方なく全員でPHPプログラムのみをgitで管理することに。

その間にh2oについてある程度調べがついたので、htopを見つつスレッドこれくらいがいいかなとかconfをいじりました。この時点でスコア1,500程度。

ここでCPUの使用率が100に張り付いていたので、中でも異様にスレッドの使用率が高かったMariaDBを別サーバーに移そうとしました。が、サーバーを分けた分RTTが増え/initializeが通らなった(/admin/で死ぬ)ため、一旦据え置きに。

そのあと気づいた点として、スロークエリログを見てもアクセスログを見てもget_eventメソッドが異様に遅いということがあって、圧倒的に優先度が高かったのでこれを解消しました。sheet自体のrank別の数や金額というのはeventに関せず同じ値なので、これを利用しforeach内のN+1クエリを解消、これでようやく6,000を超えました。

ついでに言えば/initializeでのボトルネックもここで解消されたので、MariaDBを移行。スコアは一気に22,000に。ベンチ回してもCPUはほとんど食われず。その他多少のアプリケーション変更やらキャッシュの共有やら使っていないシステムプロセスの終了を行なったり、この時点で割と手を出し尽くした感。

最後にh2oも最後の一台に移行しようということになったのですが、なぜか上手いこといかず諦めました。この時点で25,000を超えており、１時間前の時点で学生一位だったので、まあいいかということで30分残し、分析に使った余計なプロセスを全部消して皆PCを閉じました。

# 結果
**予選落ち**。不思議でしたが一点確認していなかったことがありました。「再起動試験」です。どうやら何かのプロセスが再起動時に起動せず、死んだ？？

リアルに▂▅▇█▓▒░(‘ω’)░▒▓█▇▅▂　うわああああああってなりましたがちゃんとレギュレーション読めって話です。


# まとめ
 - やるのは基本的にプロセス監視とアクセスログ、スロークエリログ監視。数値に基づいて改善すべし。
 - ISUCONは予想外の構成を出してくかもしれないのでバクチな対策をしない
 - **再起動試験に備えよ**

ということで来年も挑戦したい。
fbxのuvmapを変えたいとき

随時更新していきますが、とりあえずメモとして。

①fbxをmayaで開く

②uv のuv エディタを開く
　uvの位置を調整する。
　　右クリックで下に引っ張ってフェイス(面)を選ぶと、調整しやすい。
　
③uvを書き出す
　
④uvを試し貼りする

⑤fbxで書き出す

⑥unityで読み込む

⑦マテリアルのテクスチャーを指定する

⑧avatarをhumanoidに設定し直す
　FBXのインスペクターで以下の部分を変更する。
[![Screenshot from Gyazo](https://gyazo.com/0c7f41020379d5dea0e5a4fc68af50a0/raw)](https://gyazo.com/0c7f41020379d5dea0e5a4fc68af50a0)

 ※このあたりはこの記事に詳しい！
[Day5] Vue.js × TypeScript 入門 ①

## そうだVue.jsを書こう!（現実逃避）
なんか唐突にサーバサイド書くの飽きた(錯乱)

### ということで環境構築
vue.js用のcliがあるのでグローバルに保存しときます。
`npm install -g @vue/cli`

こんな感じでバージョン出たらOK

```
$ vue --version
3.0.3
```

```
$ vue create sample
  default
> Manually select features 
```

その後TypeScriptを選択する(spaceキーで選択できる)

```
cd sample
npm run serve
```

テストページが表示されたらOK

<img width="739" alt="スクリーンショット 2018-09-16 22.32.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/286417/5f97e994-4c3f-5ee3-d7d1-443db5f0e992.png">

## 実際に書いてみよう
`/src`配下に編集用のファイルがあるのでいじってみる。

編集前
App.vue

```
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js + TypeScript App"/>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import HelloWorld from './components/HelloWorld.vue';

@Component({
  components: {
    HelloWorld,
  },
})
export default class App extends Vue {}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

```

### ん？ 独特すぎてよくわからんぞ。。。
なんとなく、画面の部品毎にvueファイルを作ってるぽいことが分かったので、
適当なファイルを作成してみる。

GoodBye.vue

```
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <h2>{{ msg2 }}</h2>
  </div>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';

@Component
export default class GoodBye extends Vue {
  @Prop() private msg!: string;
  @Prop() private msg2!: string;
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>
```

App.vue

```
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <GoodBye msg="test" msg2="sample"/>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import HelloWorld from './components/HelloWorld.vue';
import GoodBye from './components/GoodBye.vue';

@Component({
  components: {
    HelloWorld,
    GoodBye,
  },
})
export default class App extends Vue {}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
```

実行結果
<img width="634" alt="スクリーンショット 2018-09-16 22.49.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/286417/180e4823-7850-a648-c68e-2a9b63f70575.png">

### 感想
パーツ毎に画面作れるの面白いし、メンテナンスしやすそう。
cssは埋め込まれてたけど、別ファイル化すべきな気がする。
Cuckooでモックを使ったテストをする

# 目的
- テストの際に、都度Mockクラスを作るのが面倒なので楽したい

探してみるとCuckooというライブラリがあったので使ってみる。

# 導入

readmeにあるようにすすめれば大丈夫
https://github.com/Brightify/Cuckoo


### Run Script
テストターゲットのBuild PhasesにRun Scriptを足すように言われるが、Compile Sourcesより先に実行されるようにしておくと良さそう（一瞬はまった）

テストのたびにファイルのコメントのタイムスタンプが更新されて鬱陶しいので、`--no-timestamp` オプションを追加しておく

```shell
# Define output file. Change "$PROJECT_DIR/${PROJECT_NAME}Tests" to your test's root source folder, if it's not the default name.
OUTPUT_FILE="$PROJECT_DIR/${PROJECT_NAME}Tests/GeneratedMocks.swift"
echo "Generated Mocks File = $OUTPUT_FILE"

# Define input directory. Change "${PROJECT_DIR}/${PROJECT_NAME}" to your project's root source folder, if it's not the default name.
INPUT_DIR="${PROJECT_DIR}/${PROJECT_NAME}"
echo "Mocks Input Directory = $INPUT_DIR"

# Generate mock files, include as many input files as you'd like to create mocks for.
"${PROJECT_DIR}/Carthage/Checkouts/Cuckoo/run" generate --no-timestamp --testable  "$PROJECT_NAME" \
--output "${OUTPUT_FILE}" \
"$INPUT_DIR/MyModel.swift" \
# ... and so forth, the last line should never end with a backslash

# After running once, locate `GeneratedMocks.swift` and drag it into your Xcode test target group.
```

MyModel.swift以降に、モック化したいファイルを追記。つまり、モック対象が増えるたびにここをアップデートする必要がある。。。

# 例
あんまりいい例が思いつかなかったんですが...
`ViewModelのとあるメソッドがModelのメソッドを実行していること` を確認したい場合の例

## テスト対象

```MyViewModel.swift
class MyViewModel {
    let model: MyModel

    init(_ model: MyModel) {
        self.model = model
    }

    func doSomethingWithModel() {
        model.someRequest()
    }
}
```

## モック化したい
```MyModel.swift
class MyModel {
    func someRequest() {
        // APIで云々...
    }
}
```

## テストコード

```MyViewModelTest.swift
class MyViewModelTest: XCTestCase {
    var mock: MockMyModel!
    
    override func setUp() {
        // 対象にしたいprotocol/classの頭にMockをつけたclassが用意されるので使う
        mock = MockMyModel()
        stub(mock) { (mock) in
            // メソッドがコールされても何もしないことを設定する
            when(mock.someRequest()).thenDoNothing()
        }
    }

    func testDoSomethingWithModel() {
        // mockを注入
        let viewModel = MyViewModel(mock)
        viewModel.doSomethingWithModel()
        // mockのメソッドが呼ばれていることを確認する
        verify(mock, times(1)).someRequest()
    }
}
```

流石に自分でモックを書くよりは早そうですね！
EC2インスタンスのPublicDnsNameを一覧で表示するコマンド

`--query`で絞って`--output text`を指定する。

queryの絞り込みはこの記事が参考になる。
https://qiita.com/draco/items/fa09ae0c2f51de9de449

```shell

$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].PublicDnsName' --output text

ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
...
```
Kotlinとポケモンで学ぶデザインパターン【第2章 Adapter】

# はじめに
1. [Kotlinとポケモンで学ぶデザインパターン【第1章 Iterator】](https://qiita.com/rui_qma/items/4d4fd9a85834485519cb)
2. Kotlinとポケモンで学ぶデザインパターン【第2章 Adapter】
3. [Kotlinとポケモンで学ぶデザインパターン【第3章 TemplateMethod 】](https://qiita.com/rui_qma/items/8187d5d890d17dea35e1)

第二回となります。今回はAdapterパターンを書いていきます。
# 【第2章 Adapter】
Adapterパターンは「すでに提供されているもの」と「必要なもの」の間の「ずれ」を埋めるようなデザインパターンです。
バージョンアップなどで機能を変更・追加する際にAdapterパターンを適用すれば既存のクラスに全く手を加えることがないため、以下のようなメリットがあります。

- 既存のクラスに対してテストを繰り返す必要が無い
- 過去バージョンとの互換性が保証される

#  実装
Adapterパターンを適用する設定として、第二世代（ポケモン金銀）での野生ポケモンとの遭遇について考えていきます。
初代ポケモンのときは野生ポケモンと遭遇する処理を以下のように実装しました。

```Kotlin:Encount.kt
open class Encount(val name: String){
    fun information(): String {
        return "あ！ やせいの $name が とびだしてきた！"
    }
}
```
```Kotlin:MainActivity.kt
val encount = Encount("ピカチュウ")
println(encount.information())
```
```text:出力結果
あ！ やせいの ピカチュウ が とびだしてきた！
```
第二世代ではゲームボーイカラーによるカラー表現を利用した色違いポケモンや、ポケルスというウィルスに感染した野生ポケモンと極低確率で遭遇するシステムを追加します。
Encount2が第二世代に必要とされるインターフェースとします。

```Kotlin:Encount2.kt
interface Encount2 {
    fun informationBase(): String
    fun informationColor(): String
    fun informationPokerus(): String
}
```
Adapterの役割を果たすNewEncountクラスによってEncountを継承し、Encount2を実装します。

```Kotlin:NewEncount.kt
class NewEncount(name: String) : Encount(name), Encount2 {
    val num = Random().nextInt(65536)
    override fun informationBase(): String {
        return information()
    }
    override fun informationColor(): String {
        return if(num.rem(8192) == 0) "この $name は色違いです" else "この $name は普通の色です"
    }
    override fun informationPokerus(): String{
        return if(num.rem(218845) == 0) "この $name はポケルスに感染しています" else "この $name はポケルスに感染していません"
    }
}
```
```Kotlin:MainActivity.kt
val encount2 : Encount2 = NewEncount("ピチュー")
println(encount2.informationBase())
println(encount2.informationColor())
println(encount2.informationPokerus())
```
ここで、NewEncountのインスタンスをEncount2インターフェース型の変数に代入していることがポイント

```text:出力結果
あ！ やせいの ピチュー が とびだしてきた！
この ピチュー は普通の色です
この ピチュー はポケルスに感染していません
```
(※野生でピチューが出現することはありません)
# 【Kotlin文法】if式
Kotlinにおけるifは式で、値を返します。

```Kotlin:NewEncount.kt
return if(num.rem(8192) == 0) "この $name は色違いです" else "この $name は普通の色です"
```
Javaならばこのようになります。

```Java:NewEncount.java
if(num % 8192 == 0) {
    return "この " + name + " は色違いです"
} else {
    return "この " + name + " は普通の色です"
}
```
三項演算子として書けますね。よく1行にまとめたがる私の好みです。

ifが式のため、Kotlinには三項演算子が存在しません。
Raspberry Piでkubernetesクラスタを組んでみる①

# Raspberry PiへのOSのインストール
## 用意するもの
- RaspberryPi3 ModelB × 3 (RaspberryPi2でもいけるらしい)
- SDカード 16GB × 3（とにかく転送速度が速いものほどいい）
- USB電源（microUSBで給電できるAndroidスマホの充電器とかでもいけるよ。3つ必要）

## Raspberry Piに入れるOSイメージを用意する
Raspberry Pi用のOS、RaspbianにDockerを入れてやりました。
HypriotOSを使うと元からDockerga入っているし楽ちんとオライリーの入門kubernetesには書いてあったのですが、バージョンが違うのか本に書いている内容と違った動きをするので諦めました。（トラブルシュートする場合、HypriotOSよりRaspbianの方がいろんな記事がヒットするかなんとかなりそう）

## OSイメージをSDカードに書き込んでみる。
https://www.raspberrypi.org/downloads/raspbian/
ここからイメージをDLしてくる

```
# UnZip
$ cd ~/Downloads
$ unzip 2018-06-27-raspbian-stretch-lite.zip

# ここでSDを差し込む
$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            199.5 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
   4:       Microsoft Basic Data BOOTCAMP                50.7 GB    disk0s4

/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.7 GB    disk1
   1:             Windows_FAT_32                         15.7 GB    disk1s1
# ↑SDはdisk1だ！
# unmountする
$ diskutil unmountdisk /dev/disk1
Unmount of all volumes on disk1 was successful

# 書き込み！（sudoつけるの忘れずに）
$ sudo dd if=2018-06-27-raspbian-stretch-lite.img of=/dev/rdisk1 bs=1m
Password:
1000+0 records in
1000+0 records out
1048576000 bytes transferred in 123.390814 secs (8498007 bytes/sec)

# ssh有効化
$ cd /Volumes/boot
$ touch ssh

# cgroups有効化
$ vi cmdline.txt

cgroup_enable=cpuset cgroup_enable=memoryを追加

# ↑この作業を3回（SDカード３枚分）繰り返す
```

## SDをRaspberry Piにセットして起動する
USBコードをさしたらもう起動されます。
この時、モニタ（HDMI）とキーボード（USB）も接続しておきましょう。
なにやらCUIの画面が出てくれば起動OKです。

## 注意事項
起動時にエラーやワーニングのメッセージが出てくるときは注意してください。
私の場合、SDの３枚中１枚が不良品だったようでそういった状況になってました。SD変えた途端、以降の作業も含めてちゃんと動くようになったのでSDの不良だったんだろうなあと。
Rails5で no implicit conversion of nil into String (TypeError) が出たときのメモ

突然railsコマンドが使えなくなった。
（いや、たぶんrails d devise:installとか変なコマンド入力しちゃったから。。。）
エラーメッセージは以下の通り。

```shell
$ rails c
Running via Spring preloader in process 98889
/xxxxx/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:286:in `load': no implicit conversion of nil into String (TypeError)
```

https://stackoverflow.com/questions/24960417/rails-4-error-with-every-command-load-no-implicit-conversion-of-nil-into-str
binをアップデートするとよくなるらしい。

```shell
$ rails app:update:bin
```
確かに治りました。
GoogleAppEngineでデプロイしたサービスから、古いバージョンをcloudbuildを使用してまとめて消す

gcloud app deployを繰り返していると、どんどんと古いバージョンが溜まっていってしまいます。
それはそれで、いつでも古いバージョンに切り戻せるので便利ではあるんですが、保存できるバージョンの量にも限界があるので:crying_cat_face:
cloudbuildでデプロイ後に、バージョンが指定の件数以上に存在する時には削除するようにしてみます。

- [GoogleAppEngineでデプロイしたサービスの中で、一番古いバージョンをワンライナーで取得する](https://qiita.com/fumihiko-hidaka/items/aa2074faae154097f99c)
- [cloudbuildで、一つの環境変数で、引数に2つの値を渡せるようにする](https://qiita.com/fumihiko-hidaka/items/6103f58d22976e4ff5dc)

これとこれとの重ね技かな？

# 作ってみたもの
```cloudbuild_sample.yaml
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: '/bin/bash'
  args: [
    '-c',
    "gcloud app versions list --service=default | grep default | sort -rk 4,4 | awk '{print $2}' | tail -n +6 | xargs -I {} gcloud app versions delete {}",
  ]
```

argsが長いのが難点ですね:joy:
もうちょっと綺麗に出来る方法等あれば教えていただけると:sob:

# やっていること！

## gcloud app versions list --service=default
defaultサービスのバージョンの一覧を取得しています。

```terminal
SERVICE    VERSION          TRAFFIC_SPLIT  LAST_DEPLOYED              SERVING_STATUS
default    20180916t123824  1.00           2018-09-16T12:41:32+00:00  SERVING
```

実行すると、こんな感じで帰ってきます。

## grep default
ヘッダ行が存在するので、これで対象を消しています。

## sort -rk 4,4

実行結果のLAST_DEPLOYEDの項目でソートしています。
rで逆順にすることで降順ソートにしてあげています。

## awk '{print $2}'
これでVERSIONの列の項目のみにしてあげています。

## tail -n +6
今回は残すバージョンの数を5つにしているので、それに+1して6で設定しています。
6行目からのバージョンを全て取得しています。降順ソートなので、古いものが取れるようになっていますね！

## xargs -I {} gcloud app versions delete {}
そしてここが今回のキモです。
6行目から取得したバージョンの一覧をxargsを使用して、deleteコマンドにまとめて入れて実行させています。
これで古いバージョンをまとめて消すことができました！
DISCORDの千枝ちゃんBOTを２４時間起動にしたみた

# はじめに
前回の記事<a href = "https://qiita.com/Yoshi_T/items/693210e51ff34585a99b">DISCORDで千枝ちゃんを召喚してみた</a>の続き
BOTを作ったのはいいが、起動するためにはPCでpythonを起動しなければならない。
ただPC２４時間つけっぱだと睡眠の妨げになってよろしくない
まぁ千枝ちゃんと一緒に寝てると思えば悪くはないが

AWSのEC2たてるなり方法はあるが、お金はかけたくないなぁというのが本音。

第一EC2とか普通すぎて記事にならんしなぁ


# Herokuのアカウント取得
色々調べた結果、無料で簡単にできそうな選択肢ということで、Herokuを使ってみることにした。
https://jp.heroku.com/
日本語サイトもあるので、アカウント取得はとくに問題なくいけました。
AWSと違ってクレカ登録もなかったのでそのあたりも抵抗なくアカウント取得できますね。

# アプリの登録と実装
### CLIの用意
https://devcenter.heroku.com/articles/getting-started-with-python#set-up
ここからインストールすればおっけー。

### ファイルの用意
以下のファイルを用意する。
・tiebot.py（DISCORDのbotファイル）
・index.py
・Procfile
・runtime.txt
・requirements.txt

index.pyはなんか適当にpythonファイルを用意する。なんかないとダメらしい（なくてもいける？よくわからない）

```python:index.py
from bottle import route, run

@route("/")
def hello():
        return "hello world"
```

Procfileで起動コマンドを書く。今回はpythonなのでこんな感じに

```console:Procfile
bot: python tiebot.py
```

runtime.txtにはpythonのバージョンを記載

```text:runtime.txt
python-3.6.6
```

requirements.txtはpipのリストを記載。というか下記の通りコマンドを打てば作ってくれる

```console:コンソール
pip freeze > requirements.txt
```

### アプリへコードの登録


```console:コンソール
heroku login
＜登録したherokuのIDとpassを入力＞
heroku create sasakitiebot(アプリ名) --buildpack heroku/python
git init
heroku git:remote -a sasakitiebot(アプリ名）
git add .
git commit
＜適当にコメント＞
git push heroku master
```

ファイルさえ準備できてれば問題なくpushされる...はず。


# アプリの実行
登録が成功していれば、herokuをブラウザから確認すると下記の通りリソースが登録されているはず。
真ん中のつまみをONにすれば、pythonが実行されてbotが動いてくれます。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/148269/4f364ba3-68e5-92c2-4529-00ac58874a7c.jpeg)


# おわりに
私の担当アイドルは橘ありすです（きりっ）
6thライブは猫屋敷も名古屋も両方全通します（きりっ）
MacOS X デスクトップアプリのプロジェクト作成

#Swift4開発
iPhone開発は参考書やサイトに情報が多く落ちているが、
MacOSXのデスクトップアプリ開発の記事は数が少なく古い。
Swift4の参考書は基本文法とコマンドライン系の開発で買う必要性を感じられなかった。
基本文法とコマンドライン系の開発なら[Swift4.2チュートリアル](https://docs.swift.org/swift-book/)をChromeブラウザで翻訳して勉強すれば十分だ。
私はぶっつけ本番でプログラミングできた。

プロジェクト作成したら[MacOS X デスクトップアプリのHelloWorld](https://qiita.com/iGlobo/items/994f2e8c2e146aca9ea9)へ

#開発環境
2018年9月の最新バージョン
- MacOSX HighSierra(10.13.6)
- Xcode Version 9.4.1 (9F2000)
- Swift4.2
- Cocoa

#プロジェクト作成
1. Xcodeを起動して、「Create a new Xcode project」を選択する。
![create_a_new_Xcode_project.png](https://qiita-image-store.s3.amazonaws.com/0/289168/1fd64177-8ede-3bee-f561-b824ad8616fa.png)

2. 「macOS」タブの「Cocoa App」を選択して、「Next」を押下する。
![cocoa_app_project_create.png](https://qiita-image-store.s3.amazonaws.com/0/289168/c709e44c-53f0-a3b2-1445-9b9fdafe303b.png)

3. プロジェクト作成画面が出てくるので入力し、「Next」ボタンを押下する。

    Product Name : HelloWorld(プロジェクト名)
    Team : None
    Organization類 : お好きにどうぞ (Bundle Identifier)
    Language : Swift
    Use Storyboards : チェックON (Main.Storyboardファイルを生成)
![choose_options_for_your_new_project.png](https://qiita-image-store.s3.amazonaws.com/0/289168/70d18e77-770e-d2e3-be7b-7c0c41e83c1d.png)

4. ローカルリポジトリが欲しいなら「Create Git repository on my Mac」をチェックONにして、「Create」ボタンを押下する。
5. プロジェクト作成が終わり、生成されたファイルとプロジェクト作成画面で入力した項目がどこにきているか確認する。
![xcode_helloworld_gui.png](https://qiita-image-store.s3.amazonaws.com/0/289168/b70a9b58-3d97-9455-e6cc-b32d4888a021.png)

主に編集するファイルは以下の３点。

- AppDelegate.swift (アプリケーションのライフサイクルメソッドがある)
- ViewController.swift (ウインドウのライフサイクルメソッドがある)
- Main.Storyboard (右下の部品類からドラッグ&ドロップでウインドウのGUIパーツを編集する)

以上、最後に「いいね」ボタンをよろしくお願いします。
Rubyのクロージャでスイッチとカウンタを作る

クロージャでスイッチとカウンターを作ってみる。


### スイッチ
```ruby
status = false

switch = -> { status = !status }

p switch.call # => true
p switch.call # => false
p switch.call # => true
```

### カウンタ
```ruby
n = 0

counter = -> { n += 1 }

p counter.call # => 1
p counter.call # => 2
p counter.call # => 3
```

## メソッドの中に閉じる
### スイッチ
```ruby
def create_switch
  status = false
  -> { status = !status }
end

switch = create_switch()

p switch.call # => true
p switch.call # => false
p switch.call # => true
```

### カウンタ
```ruby
def create_counter
  n = 0
  -> { n += 1 }
end

counter = create_counter()

p counter.call # => 1
p counter.call # => 2
p counter.call # => 3
```

# 参考にした記事
[クロージャとは - Qiita](https://qiita.com/hennin/items/806bc2633556dea85ee2)
[Rubyでクロージャを使いたい（導入編）- Qiita](https://qiita.com/EastResident/items/8abf587bc78bf989e2df)
[Ruby のブロックはクロージャである](http://obelisk.hatenablog.com/entry/2017/12/26/143924)

# 変更点
ご指摘を受け構成・内容を変更しています。詳しくはコメントを参照してください。
Laravelのクエリビルダでサブクエリ（LEFT JOIN）を使うメモ

Laravelのクエリビルダで、特定のカラムだけselectしたサブクエリをLEFT JOINするのに少し手間取ったのでメモを残します。

DB::rawを使って、(SELECT id....)をし、それを以下のようにleftJoinの構文に渡すだけでした。

```php
            $staff_table = DB::table('staff AS st');
            $staffs = $staff_table
                        ->leftJoin(DB::raw('(SELECT id,office_name FROM office) AS of'), 'of.id', '=', 'so.office_id')
                        ->where('st.id','=',$user->id)
                        ->get();
```

ポイントは、leftJoinが
('テーブル名','一方のテーブルのID等','=','他方のテーブルのID等')
という記法なので、それを踏襲する必要があることです。

上記の書き方では、'テーブル名'のところにDB::rawで普通のクエリ文を書けるので、それでOKでした。

少し見にくくなってしまいますが、とりあえず動くので良かった良かった。

追記：Laravelの話ではなく、普通のサブクエリの話ですが、
SELECT idでidをひっぱっておかないと、of.idとした時に、idがないのでうまくいかない、
というのが地味に大事なポイントでした。

---

##追記

サクブエリに関する[良い記事](https://reinink.ca/articles/dynamic-relationships-in-laravel-using-subqueries)を見つけました。英語ですが。
クエリ数を少なく、かつ、メモリ使用を最小限に留める、という視点で書かれており、勉強になります。
PyCharmでファイルタイプを誤って認識させてしまった際の対処(メモ)

最近機械学習を始めてPython&PyCharmを使い始めたのですが、地味にはまった＆Google先生でも探せなかったので、残しておきます。
※macの場合の対処法です。
※windowsの場合も似たような対処ができるとは思いますが、試していません。

# 現象
PyCharmは、拡張子なしでもファイルタイプを認識し、適切なファイルタイプとして扱ってくれますが、逆に一度誤ったファイルタイプを指定してしまうと、同名のファイルは一度削除しても、.ideaを消しても最初に指定したファイルタイプとして認識されてしまいました。

自分は、training.pyというファイルをPLAIN_TEXTと認識させてしまったため、「別のファイル名でコードを記述し、Pythonと認識させる」　→「リファクタ（rename)」とやってみましたが、renameするとPythonと認識してくれなくなりました。。
※もちろん別名であれば、Pythonとして認識してくれました。

# 対処法
1.　以下ファイルを開きます。
```~/Library/Preferences/PyCharm2018.2/options/filetypes.xml```
※PyCharm2018.2の場合です。バージョンは適宜読み替えてください。

2.　mappingタグのtype属性を適切なtypeへ書き換えます。(もしくは削除します)
```<application>
  <component name="FileTypeManager" version="17">
    <ignoreFiles list="*$py.class;*.hprof;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;vssver.scc;vssver2.scc;" />
    <extensionMap>
      <mapping pattern="trial_data.txt" type="PLAIN_TEXT" />
      <mapping pattern="hello_world" type="Python" />
    </extensionMap>
  </component>
</application>```

以上です。

それでは、良いPython＆PyCharmライフを〜
Google App Engine (AppEngineStandard)で動かせるruntime

Google App Engine にymlを食わせて、 Node.js 6 のランタイムでデプロイしようとしたら

こんな感じに怒られました。動かせるランタイムは以下のような感じなんですね:frowning2:


```
 Invalid runtime 'nodejs6' specified. Accepted runtimes are: [go, php, php55, python27, java, java7, java8, nodejs8, php72, 
python37] ```
PiBakeryを使ってRaspberryPi Zero Wをヘッドレスでセットアップする

# はじめに

RaspberryPi Zero Wにディスプレイやキーボードとかつないでセットアップするのが面倒なので、電源だけを接続しただけでwifi経由でssh接続できるようになる方法を探していました。
PiBakeryを試してみたらうまくいったので、記録を残しておきます。

# 使用機材

* MacBook Air (13-inch, Mid 2011)
* macOS High Sierra 10.13.6
* RaspberryPi Zero W
* PiBakery 0.3.8(最新版にアップデート後)
    * http://www.pibakery.org/index.html

# PiBakeryについて

公式サイト：http://www.pibakery.org/index.html

RaspberryPi用のOSイメージを焼いたSDカードにいろいろ設定すると
初期起動時にsshを有効にできたりするらしいんですが、
それらをまとめて簡単にやってくれるのがPiBakeryです。
書き込めるOSイメージはRaspbianだけです。

# 設定する項目

今回は初回起動時のみ1回だけ設定すれば良い項目だけ設定します。
パッケージのインストールなどは行わず、wifi経由でのssh接続をメインに設定します。

* wifi設定
* ブートオプション,CLI(ログイン必要)
* ホスト名変更
* SPIとI2Cを有効化
* SSHホスト鍵の変更
* SSH認証キーの登録

## 設定例

wifiパスワードやssh認証用の公開鍵は自分の環境に合わせて書き換えてください。

![スクリーンショット 2018-09-16 18.54.16.png](https://qiita-image-store.s3.amazonaws.com/0/19321/5fbf7b10-ec18-b30b-2992-cecacf1cbb31.png)

## 注意事項

* 最後をシャットダウンにしておくと、初回起動時の設定が完了するとアクセスLEDが消灯するのでわかりやすいです。
* RaspberryPiのモデルによって接続できるwifiの周波数が異なるので注意してください。
    * RaspberryPi 3 Model B+ は2.4Ghzと5GHz(11ac)の両方が使える
    * RaspberryPi 3 Model B は2.4GHzのみ
    * RaspberryPi Zero W は2.4GHzのみ
* ssh設定のKeyにはsshの公開鍵をそのままコピペします。
    * RaspberryPiの.ssh/authorized_keysに書き込まれるので、ssh-rsaなどの鍵の形式からアカウント名まですべてコピー&ペーストします。

# 手順

1. PiBakeryをPCにインストールします
2. PiBakeryを起動して最新版にアップデートします。
3. PiBakeryでRaspberryPi Zero Wの起動設定を作成します。[設定例](#設定例)
4. PiBakeryで起動設定をSDカードに書き込みます。
5. SDカードをPCから外してRaspberryPi Zero Wに差し込みます。
6. RaspberryPi Zero Wを電源に接続します。
7. RaspberryPi Zero Wのアクセスランプが消灯するまで待ちます。(けっこう時間がかかります)
8. RaspberryPi Zero Wのアクセスランプが消灯したら、電源をつなぎ直します。
9. sshで設定したRaspberryPi Zero Wに接続します。
    1. 設定したホスト名に「.local」を追加したホスト名でアクセスします。
    1. `​ssh pi@raspberrypi.local`

# sshでRaspberryPiに接続できたらやること

1. raspi-configでロケールやタイムゾーンを設定します。
2. raspi-configでOSを最新版に更新します。
3. sshdの設定を変更して、パスワード認証を無効にし、公開鍵認証にのみ制限します。

## sshのパスワード認証をOFFにする

```bash:raspberrypi
sudo vi /etc/ssh/sshd_config
```

次の設定を追加してパスワード認証を無効にする

```text:/etc/ssh/sshd_config
PasswordAuthentication no
```

設定を変更したあとはsshdをリスタートします。

```bash:raspberrypi
sudo systemctl restart ssh
```
Julia v1.0.0で入った仮想環境の管理について

Pythonでプロジェクトを作成するときまず最初にやるのがvirtualenvを実行することです。
Juliaにもv1.0.0から同様の仮想環境でのパッケージを管理する機能が導入されました。[^1]

# 仮想環境でのパッケージ管理概要
PythonやRubyを使っていた人は分かっていると思うので読み飛ばしてOKです。
プログラムを作成する際、様々なライブラリに依存して開発すると思います。
完成したプログラムを別環境で動作させる際、こうした依存したライブラリも同時にインストールしなければなりません。
つまり、どのライブラリをインストールすべきかの管理をしなければなりません。
ところで、開発環境に予め入っていたライブラリを無意識に使っていた場合どうなるでしょうか？
また、複数の開発を並行で行っている場合で、使いたいライブラリのバージョンがそれぞれで異なる場合もあるでしょう。
こうした事を解決するのがvirtualenvであり、bundlerでした。
PythonやRubyではこれらにより開発環境ごとにライブラリを管理、インストールしていました。

# REPL
Pythonではvirutalenvは単体のプログラムでしたが、Juliaではインタラクティブシェルの中から実行します。
インタラクティブシェルですが、今回は以下の3モードを使います。

* Juliaを実行するためのモード
* pkg管理のためのモード
* shellを実行するモード

## Juliaを実行するためのモード
いつものやつです。Julian modeといいます。
好きなだけJuliaを実行してください。

## pkg管理のためのモード
ここでpkgを管理します。Pkg REPL-modeといいます。
Julian modeで```]```を押すとこのモードに入ります。
Pkg REPL-modeになるとプロンプトがjulia>から(v1.0)pkg>に変わります。
```Ctrl+c```でJulian modeに戻ります。
Backspaceでも戻れます。

## shellを実行するモード
shellが出てきます。Shell modeといいます。
```echo $SHELL```を打っても```SHELL not defined```と言われるので、何かbashとかを呼び出しているわけでもないようです。cdとかlsとかそういうのは通ります。
Julian modeで```;```を押すとこのモードに入ります。
Shell modeになるとプロンプトがjulia>からshell>に変わります。
Pkg REPL-modeと同じく```Ctrl+c```かBackspaceでJulian modeに戻ります。
Pkg REPL-modeと違い、コマンドを一つ打つごとにJulian modeに戻ります。

# 仮想環境作成
仮想環境を作成します。
virtualenvで言う```virtualenv [プロジェクト名]```です。
JuliaではPkg REPL-modeで```generate [プロジェクト名]```です。
generateはパッケージを作りたいときのもので、スケルトン的なものも作ってくれます。
そこまでは必要ない場合は```activate [プロジェクト名]```で良いです。
activateの場合はパッケージをaddするまで何もファイルが作られません。
ただし、生成されるProject.tomlにnameの項目が無いなど、他のプロジェクトでaddするつもりがあるパッケージを作るときは色々かけているので、generateで作ったほうが無難です。

# 仮想環境に入る
virtualenvで言う```bin/activate```です。
JuliaえはPkg REPL-modeで```activate [プロジェクトのディレクトリ]```です。
例えばカレントディレクトリがパッケージの中なら```activate .```になります。
仮想環境に入るとプロンプトが```(v1.0)pkg>```から```(パッケージ名)pkg>```になります。

# 仮想環境から出る
viatualenvでいう```deactivate```です。
多分、無いんじゃないですかね…。
マニュアルを読んだんですが見つけられませんでした…。

# パッケージの追加
pipでいう```pip install```です。
Pkg REPL-modeで```add [パッケージ名]```です。
パッケージ名のところはgitのurlでもローカルgitへのパスでもいけます。
gitで管理されていることは必須みたいです。

# cloneしてきたリポジトリの仮想環境の再現
pipでいう```pip install -r requirements.txt```です。
cloneしてきたリポジトリでactivateした後、Pkg REPL-modeで```instantiate```です。

# 依存関係の記録
pipでいうrequirements.txtです。
Project.tomlが勝手に依存関係を記述し続けてくれます。

# ライブラリのインストール先
virutalenvではbinの下にライブラリがインストールされていました。
このため、プロジェクトごとに同じライブラリがインストールされることがあり、若干非効率を感じるところがありました。
Juliaでは~/.julia/packages/ライブラリ名の下にハッシュみたいな名前のフォルダがあり、その下にライブラリが展開されています。
各プロジェクトごとにライブラリをインストールするのではなく、このpackagesの下を共有しているようです。

# どうでもいい話
Shell modeですがキーバインドが```;```です。
私はUS配列なので特に不便ではなかったのですが、JIS配列だとちょっとめんどくさいかもしれません。
ショートカット系はUS配列使用者が決めている以上、US配列のほうが有利かもしれません。

[^1]: 仮想環境という言い方ですが、VirtualBoxやVMWareのような物とは別物です。最適な言葉があれば教えてほしいです。
HomebrewのImageMagickとpolicy.xml (not authorized エラー)

ちょっとしたメモ書き。

## 経緯

ちょっと`convert`コマンドでPNGファイルをPDFにしたかっただけ。

## 現象

PNG形式のファイルをPDF形式に変換しようとすると以下のようエラーとなる。

```
$ convert image-001.png -units PixelsPerInch -density 72x72 output_001.pdf
convert: not authorized `PDF' @ error/constitute.c/IsCoderAuthorized/408.
```

どうやら脆弱性対策の一環。不正な画像ファイルの変換時にGhostscriptのバグを突かれるとまずいという話。

セキュリティ対策でGhostscriptを呼び出すタイプの拡張子が処理対象から外されている。

- [Ghostscript の -dSAFER オプションの脆弱性に関する注意喚起](https://www.jpcert.or.jp/at/2018/at180035.html)
- [Mogrify and Convert both throw "not authorized" error · Issue #1310 · ImageMagick/ImageMagick](https://github.com/ImageMagick/ImageMagick/issues/1310)

## 対処

ImageMagickの設定ファイルのありかを特定、一時的に設定を変える。

Homebrewでインストールしている関係で手元のマシンでは`policy.xml`は以下の場所。

```
 /usr/local/Cellar/imagemagick/7.0.8-11_1/etc/ImageMagick-7/policy.xml
```

`7.0.8-11_1`の部分はバージョン依存。

このフィアルを**バックアップ**したうえで書き換える。

```
  <policy domain="coder" rights="none" pattern="{EPS,PS2,PS3,PS,PDF,XPS}" />
```

この行から`,PDF`という箇所を削除。

## 注意

作業が完了したら設定をもとに戻しておく。
E2Eテストツール使用感

まだE2Eテストツールを使用した経験はそんなに長くはないのですが、
TestCafeとSeleniumWebdriverで同じテストを実装する機会があったので、
それぞれの長所と短所を簡単に挙げてみようと思います。
どんなツールがいいんだろう？という方に、選択の参考にしていただけると幸いです。

#TestCafe
[TestCafe](http://devexpress.github.io/testcafe/)
[TestCafe Studio](https://testcafe-studio.devexpress.com/)
まずはこちら、TestCafe
今、私の中で最もホットなツールです。
クロスブラウザ対応なのにWebdriverが不要という優れものです。
まだ出回っている情報は少ないですが、APIの説明は公式ページに書いてあるのでなんとかなります。
ちゃんとCIでも動作しますし、メジャーなCIなら公式ページに連携する手順が書いてあるので、
参考になると思います。
waitがデフォルトで設定されているので、あまりに読み込みに時間がかかるものでなければ、
基本的にはタイマーなんかは考慮しなくてもサクサク動作してくれます。

###[長所]
・セットアップが楽ちん。
　→node.jsがあれば、インストールするだけです。

・TestCafe Studioがあると尚便利。
　→エディタ機能やレポート機能、レコード機能を備えた優秀なツールですね。
　　TestCafeStudioがあれば、node.jsをわざわざ準備する必要もありません。
　　私の場合は、自分のPCで作成したコードをTestCafeStudioで動かし、問題なければCIから起動するようにしています。

・デフォルトでwaitが考慮されており、自分で時間を変更できる。
　→Seleniumと比較する際に一番大きな利点となるのは、ここでしょうか。

###[短所]
・情報が少ない
　→ネットで検索してもセットアップ方法と、チュートリアル的なコードしかヒットしませんでした。
　　一応、公式の方でAPIの使い方とか書いてあるのでそこで確認して試しながら地道に理解していくのが(私の)現状です。

・毎回ログインからスタートする必要がある
　→テストクラス毎にブラウザを起動するところから処理が始まるので、
　　SNSやECサイトみたいなログイン処理が必要なものについては、
　　毎回ログインして画面遷移していく必要があります。

・分岐やループなどの処理が組み込みづらい。
　→正直まだよくわかっていません。
　　分岐先で異なる処理を組み込んだりしたいのですが。

#Selenium Webdriver
[Selenium](https://www.seleniumhq.org/)
続いてはこちら、AKA.自動テスト
昨今のE2Eツールの中でトップシェアと思われる、Selenium Webdriver
中にはE2Eツールはこれしか知らないと思っている人もチラホラ。
私はRubyでしか扱った事がないので、Rubyでの使用感についてになります。

###[長所]
・情報が多い
　→TestCafeに比べると圧倒的な情報量を誇ります。いろんな人が記事を書いてくれていますね。
　　私もよく参考にさせていただきました。

・使いこなせればそれこそ自由自在に操作できるようになる(はず)
　→短所の欄に記載しますが、wait処理を自動でいれてくれる機能はないので、自分で作らなければいけません。
　　そういった点で、使いこなせれば痒い所にもいずれは手が届きそうな印象です。
　　※私はまだまだ未熟なので、いたるところが痒いですが。

・対話式で動かせるのが便利
　→これはRubyだけなのか？はわかりませんんが、irbで起動すれば対話式で操作できるので、
　　要素の指定に誤りがないかなどの確認がしやすいです。

###[短所]
・互換性問題
　→SeleniumWebdriverを動かすには、SeleniumWebdriver(言語別)、対象言語の開発環境(私ならRuby)、
　　各ブラウザのWebdriverが必要になります。
　　そして、各ブラウザのWebdriverはそれぞれのブラウザベンダーが実装しているようです。
　　つまり、同じコードで全てのブラウザを動かせるかというと、そうではありません。
　　クロスブラウザテストを実装する際には、苦戦させられるポイントだと思います。

・あくまでスクレイピングツール
　→これが1番のハマりどころではないでしょうか？
　　画面の更新、画面遷移、モーダルやポップアップの起動など、全てが一瞬で表示されるわけではありません。
　　むしろほとんどが多少の読み込み時間を要すると思います。
　　要素をクリックしてモーダルが起動するまでに1秒のラグがあるそんな時、
　　SeleniumWebdriverはモーダルが起動する前に要素を探し、見つからないとエラーを吐いて終了します。
　　特に初めて触り始めた頃は、この動作に散々苦しめられました。

・みやすいコードにするには目の色を変えてモジュールを作る必要がある。
　→私の場合ですが、例えば要素をクリックする際、必ずwaitを入れるのでモジュールに合わせたものを作っておきます。
　　そもそも私のセンスがイケてないのかもしれませんが。

#個人的には
上記はどちらもクロスブラウザ対応ですが、準備の手間やコードの書きやすさ、見やすさ、それらの点で
TestCafeを優先して使用しています。
ちなみにどちらもCIと絡めることも可能です。
ただ、TestCafeにしてもSeleniumWebdriverにしても私はまだまだ未熟なので、その他のツールも含めて、
もっと知識をつけ、適宜適切な判断を出来るようにしていきたいですね。
エンジニアのためのドキュメントデザイン術（書体・フォント）



### デザインが美しいフォントに変更するだけで資料も美しくなる

下の画像は社内資料等でよく見かける資料の例です。
![font0.PNG](https://qiita-image-store.s3.amazonaws.com/0/291694/1602391a-ba99-0e00-b628-6bbbec9db709.png)

Windowsで長らく使われてきたMSゴシックで書かれた文書です。ちょっとだけ小さな変更を加えてみましょう。色彩編等で後述しますが、装飾がうるさいので色彩と文字装飾を取り除きます。モノクロになったMSゴシックの文書の書体を変更してみましょう。
![font1.PNG](https://qiita-image-store.s3.amazonaws.com/0/291694/3f171b4b-8aa8-0394-45ff-fbbe2bcec35a.png)
いかがでしょうか。別の項で説明しますが、色彩を一旦取り除き、書体を変更してみました。たったこれだけで大きく印象が変わりました。文字・書体の美しさは文書の見栄えに大きく影響します。

### フォントの選定により文書は美しくなる

 - 日頃から気に入った書体・フォントをいくつか見つけておく
 - 文書の内容により書体を選択する

### フォント・書体に関する注意点

 - フォントがインストールされていない環境では再現されない場合があるに注意
 - 標準フォントではない場合、フォントの埋め込みが必要

標準フォントのみで仕上げることが推奨です。特殊なフォントを使用した場合、ファイルにフォントを埋め込むか、画像にしてから取り込むなどの作業が必要な場合がありますので、標準フォントや広く普及したフォントを利用しつつ、一部、特殊な商用フォント等を画像で取り入れるといったことも必要となります。

また、フォントを埋め込む場合はファイルサイズが大きくなってしまうなど別の問題もありますので注意して下さい。

### 付録

◆本連載の目次はこちら
https://qiita.com/sutton/items/8343491cf1f9b3f65129

◆個人的に大好きなMSゴシック
MSゴシックは個人的にも長く使っており愛着があり、私はTeraTerm等のターミナルエミュレータでは必ずこのフォントを使用しています。しかし、MSゴシックはパソコンやディスプレイの性能が低く視認性が低い時代に、そういう状況に合わせて読みやすくデザインされたフォントです。デザインに配慮した書類を作成する上ではこのフォントは向いていないように思います。

◆著者の環境について
Windows 10 Home に Microsoft Office2016 をインストールした環境で標準インストールされているフォントを利用して解説しています。

MacOSXやiOS端末はかなり昔のリリース当時よりフォントが美しかったので文書閲覧用に一家に一台あってもよさそうですね。
【Swiper】Swiperをネストしている要素にaddClassすると動作が重くなる件

swiper
よく使っているスライダーjs
[公式サイト](http://idangero.us/swiper/)

#addClassすると何故か動作が重くなる

bodyにaddClassでis-openなどを付与してハンバーガーメニューを展開させるなどの動作が重くなる...

#原因
下記のオプションが有効だったから
observeParents: true
↓
observeParents: false

有効の場合swiperをネストしている要素に動的になにかを追加するとswiperが反応してその他の動作が重くなるみたい
設計を学ぶときに興味を持った投稿記事

# Qiitaの記事から設計を学ぼう！
設計を学ぶにあたり気になった記事を残していく。

## 趣旨
1. 設計の概要について書いている記事は多くても、実際の書き方まで言及している日本のサイトは少ないと思う。
2. まじめな話、設計を気軽に学べるWebサイトはないと思っているので皆はどうやって体系的に学習をしたのか知りたい。[^1]
3. なぜならば、設計の知識なしで現場に飛び込むと、僕みたいな設計をしたことのないコーダーが生まれて残念なことになるからだ。
4. 情報科の学校でもない限り設計について扱う授業を受ける機会なんてあるのだろうか？[^2]
5. 不満は募るばかりである。[^3]
6. そのため、設計を学びたいと思ったときにすぐ学べるようにリンクを残していく。
基本的には設計書の書き方もしくは例を中心にまとめているQiitaのページを載せていく。
7. 更新は随時行う。

## 仮説
* 設計を知れば、開発は有益なものとなるのではないか。
* 設計という前提(知識)があれば、現場での自分の活動は少しはマシになったのではないか。[^4]
* 設計ができれば、実装は作業ゲーで悩まず実装できるのではないか。

## UML
[UML入門](https://qiita.com/kiyodori/items/06d71b7763f424af931f)
[Astah UMLを体験（題材：おつかいゲーム）](https://qiita.com/Somen440/items/8e79687415b599e3b28c)
[UMLの仕様を読もう](https://qiita.com/maxmellon/items/da46865e493307a987eb)

### クラス図
[グローバルゲームジャムでクラス設計をやった話2017](https://qiita.com/toRisouP/items/5b7814fda00cab120e39)

### オブジェクト図
[【UMLでプリキュア】変身のセリフのオブジェクト図（資料編１）](https://qiita.com/azuki8/items/1dc6d84af3af8d54eac1)
[【UMLでプリキュア】変身のセリフのオブジェクト図（資料編2）](https://qiita.com/azuki8/items/a935120c3365a4f374ae)

### シーケンス図
[【SequenceDiagrams】シーケンス図の書き方](https://qiita.com/dodomasaki/items/31e2210c07cb58471ac4)

### コンポーネント図
not found

### 配置図
not found

### パッケージ図
not found

### ユースケース図
[esa.ioで簡単に図を書きたい（UML記法）](https://qiita.com/usagizmo/items/a3809d59e57512a30e08)

### アクティビティ図
[もやもやが晴れたようにわかる 。 実行中のプログラムから作成したオブジェクト図とコミュニケーション図で学ぶオブジェクト指向](https://qiita.com/Disko-Muzik/items/292a706d5df79734258e)

### コミュニケーション図
not found

### 状態図
[【新人教育 資料】第6章 UMLまでの道 〜ステートマシン図の説明&書いてみよう編〜](https://qiita.com/devopsCoordinator/items/289f77fc83813ba7cc76)

## ER図
[PlantUML で ER 図を描く（似非）](https://qiita.com/Tachy_Pochy/items/d074e6cbf2f5f4527fa7)
[ER図の作り方【簡易版】](https://qiita.com/yagi21/items/fac0e257317cea32d2d1)
https://qiita.com/ramuneru/items/32fbf3032b625f71b69d

## その他
[システム設計の流れ・設計書の構成メモ](https://qiita.com/chocode/items/fd51dd8f561e2a0fbd70)

### 概要・思想
[ソフトウェア設計についてのつぶやき](https://qiita.com/BlueEventHorizon/items/7b8dcf625ff5790ed1ef)

### ツール
[[Mac] PhpStormでのPlantUML環境構築](https://qiita.com/isshi256/items/a04439698525460f36f2)

## 今後の更新、展望
* サーバやネットワークなどあらゆる設計を扱いたい
* 要件定義など上流？と呼ばれる内容も扱いたい
* マネジメント、PMBOK?
* ビジネス的な意味でのMINDなど

上記は記事を別にして扱うかもしれない。

[^1]: 現場で叩き上げられて覚えた人は素晴らしいがその前提はなしで考えたい。それでは学習機会が平等に与えられないからだ。恐らくは学術的にも体系的にまとめ上げられていると信じたい。

[^2]: 会社でIT未経験者を雇うのであれば会社が教えるのが筋であろうが、学科に問わず高校や大学で1度は学ぶ機会がほしかった。C言語の授業を昔受けたが、設計についてなんて言及あったのか記憶にない。むしろ、設計と合わせて実装を先に学びたかった。学校の先生て実装できるイメージはありますが設計ってできるのだろうか？

[^3]: 単純に自分の調べ方が悪い可能性はある。

[^4]: 暗黙知は害悪でしかないと思っている。ITの現場であればどこでも使いそうなんだから共有されていい情報だと思う。

<!--
設計回りの参考記事をQiitaおよび引っ張ってくる。

他人のメリット
・他人の資産(他の人にとってはViewを稼ぐキッカケとなる)

自分のメリット
・自分としてはBuzzる機会(まとめサイト運営)につながるかも
・また、自分としては理解をしたいからリンクを残して読むストックとして残せる


対象者
設計をしたことがない
プログラミングだけ

学校やこういうネットの情報
学術的な立場で体系的に知りたい

対象
外部サイトなどは良さそうだが、あまりない。
体系的にまとまっているところはない。
Qiitaで探してみる

学術書もあり

今後
・要件定義
・PMBOK
・ビジネスレベルなど

目的
設計を自分はしたことがない
今後は実装よりも概念的なところを学びたい
設計について学びたい
(実装する動機や、実装ゲーにできそう！
自動化できそう、設計さえすればいけるかと思う便利さを感じたため)

本当になんでだっけ

ふつうに世の中の情報だと
学びたいと思ったときに学べなかったから

「ビジネス」問わず体系的に。
学術的に純粋に学びたい

ユーザ
設計を知りたい

日本語変？
設計を学ぶため調べる最中に興味を持った投稿記事

恐らくは
「自分で思考すること」->「ビジネス」を考えること -> 「業務的な図示(設計)」-> ソフトウェアなら「設計」必要であればする(落とし込む)-> 実装までいくと思うな。

設計も実は後の方だと思うな

なぜ、売れるか分からなければゴミ生産になるから
無駄になってしまう。もったいない

 -->
cdしない(linuxコマンド)

## はじめに
linuxコマンドで最初に覚えるコマンド cd (change directory)。
なにかと必要以上にcdを使ってカレントディレクトリを移動しちゃう人が多いかと思います。
ファイルやディレクトリ構成を参照するだけとか、適当なログをみるだけとかでわざわざcdしちゃうと戻りたくなったときに面倒。
コマンド履歴も「cd xxx」「cd ..」 とか多くなって汚れちゃいます。

**Escapeキー + ドット(.)**
**”直前のコマンドの最後の引数を打つ”**

上記のショートカットを使うと便利かなと感じています。
bashの話です。

## ユースケース
一例ですが、apacheのアクセスログとエラーログを参照したい場合を説明。

1. ファイルの存在を確認
```ls -l /usr/local/apache2/logs/```

2. access_logファイルの中身を参照
```less /usr/local/apache2/logs/access_log```
→ここで、「less Escapeキー + ドット(.) 」と入力します。

3. error_logファイルの中身を参照
```less /usr/local/apache2/logs/error_log```
→ここでも、「less Escapeキー + ドット(.) 」と入力して、
直前のaccess_logファイルの絶対パスが表示されるのでファイル名だけerror_logに書き換えます。
”access_log”の部分を Backspaceで一文字ずつ消すと面倒なので、
「Escape + Backspace」で単語ごと削除します。

直前コマンドの最後の引数が覚えておければ絶対パスの入力も一発です。
絶対パスの方が現在の位置に依存しないので、第三者からみてもわかりやすいと思います。

ということで「Escapeキー + ドット(.) 」の多用はおすすめな感じです。
※これが言いたかったことですが、知らないとそもそも検索されないと思ったので、cdをメインとしたタイトルにしました。

## Escapeキー + ドット(.) のメリット
- 絶対パスの入力が一発
- むやみなcdがなくなりコマンド履歴が綺麗になる
- コマンド履歴を第三者がみてわかりやすい

こんな感じです。

## 関連してよく使うショートカット
Escapeキー + ドット(.) に関連して合わせてよく使うコマンドです。

- **Escapeキー + Backspace**
単語の削除ができます。 
Escapeキー + ドット(.) で直前コマンド最後引数が絶対パスで表示されたあと、最後の部分を消してディレクトリを変えたいとか、ファイル名を変えたいと行った場合に使えます。

- **Controlキー + a** 
コマンドの先頭にカーソル移動できます。 
例えば、lsコマンドでファイルの存在確認をやって、そのあとにそのファイルを開きたいといったケースで 「ls」を「less」とかに変更するときに現在カーソルを先頭にもってこれるので便利です。 
ショートカットキーの覚え方のイメージは、アルファベットの「先頭はa」とか。

- **Controlキー + e** 
コマンドの最後尾にカーソル移動できます。 
先頭に移動したあとにまた最後にカーソル移動したいときとか、よく使います。 
ショートカットキーの覚え方のイメージは、「最後はendのe」とか。

- **Controlキー + k** 
現在のカーソル位置から後方の文字をすべて削除できます。 
例えば先頭（Contorol+a）にカーソル移動して Control+k を入力すればコマンド全部消せます。
なにか入力ミスしたときとか使うかもです。 
覚え方のイメージは、「カットのk」とか。

- **Controlキー + r** 
履歴コマンド検索です。 
コマンド履歴がhistoryで保存されていますが、その直前に入力したhistoryからさかのぼって文字列検索ができます。 
文字列にヒットするコマンドをまるごと出力できるので便利です。 
ただ、検索文字列を工夫しないと想定外のところでマッチしたりするので、ミスが多くなりがちなので注意です。
流れでうっちゃうと意図しないコマンドを実行してしまうことにも繋がります。 
覚え方のイメージは、「Rirekiのr」とか。

- **pushd, podを使う** 
cdの話をしていたので関連して pushd, popd コマンドについても触れます。 
「cd 移動先」 の代わりに 「pushd 移動先」 とすると、 
popd コマンドで直前にいた場所に戻るといったことができるようになります。 
スタックに積んで戻すというそれなので、cdは使わずずっと pushd で移動して戻りたくなったらpopするってやり方もあります。 
便利そうだけど使ってる人見たことないです。

## cdするタイミング
趣味の問題かと思いますが
cdする、つまりカレントディレクトリを移動するケースとはどういったケースか・・・
個人的にはその場でファイルを作成／編集したりする場合、に作業用ディレクトリをきって移動します。
だからもうずっと /tmp 下でいいんじゃないかと思うくらい。
残したいファイルがあればユーザディレクトリ下にディレクトリきって作業するとか。

## まとめ
- Escapeキー + ドット(.) 便利なので多用したい
- cdしてまた戻ってくるくらいならcdしなくていい

以上です。