OmniAICreator/Qiita-1.07M huggingface dataset:
material-ui ComponentのTextFieldの値をtest内で設定する

Material-uiの`TextField`コンポーネントに入力された値を使ってデータをSubmitする際など、テスト環境で適当な値を使って目的のfunctionがちゃんと呼ばれるかをテストしようと思った所、上手く値を設定できずに少し困りました。

`wapper`に入っているのは`enzyme`で`mount`された親のComponentで、`TextField`には`ref=username`としてrefを設定しています。

結論からすると、値を入れた後に`change`をsimulateする必要があった、と言う部分で躓きました。
この挙動はMaterial-ui自体の挙動になるので、よりシンプルな形としては`onChange`内で`state`を変更して、テスト内ではinputではなくstateを変更するだけで良いのかも知れません。

```js
let username = wrapper.ref('username').find('input')
username.node.value = 'first'
username.simulate('change', username)
wrapper.instance().onSubmit() // 最終的なfunctionを呼び出して適宜値のチェックを行うなど
```
async-await内で並列処理


async-await内で並列的に実行したい場合

```typescript
function sleepAndSay(time: number, msg: string): Promise<void> {
    return new Promise<void>(resolve => {
        setTimeout(() => {
            console.log(msg)
            resolve();
        }, time);
    });
}

async function main() {
    await sleepAndSay(200, 'test1')
    await sleepAndSay(100, 'test2')
    await Promise.all([
        (async () => {
            await sleepAndSay(50, 'in promise.all 1-1');
            await sleepAndSay(40, 'in promise.all 1-2');
            await sleepAndSay(40, 'in promise.all 1-3');
            return;
        })(),
        (async () => {
            await  sleepAndSay(30, 'in promise.all 2-1');
            await  sleepAndSay(20, 'in promise.all 2-2');
            await  sleepAndSay(20, 'in promise.all 2-3');
            return;
        })(),
    ])

    await sleepAndSay(100, 'test3')
    
}

```

実行結果

```
test1
test2
in promise.all 2-1
in promise.all 1-1
in promise.all 2-2
in promise.all 2-3
in promise.all 1-2
in promise.all 1-3
test3
```

目的通り動くけどPromise.allはpromiseを受け取る。
*async* はpromiseを *返す* 関数を作るので all内で実行する必要があり、`(`が少しうざい。

改善案としてpararels関数を作る

```typescript
function pararels(...promises: (() => Promise<any>)[]) {
  return Promise.all(promises.map(p => p()));
}

async function main2() {
    await sleepAndSay(200, 'test1')
    await sleepAndSay(100, 'test2')
    await pararels(
        async () => {
            await sleepAndSay(50, 'in promise.all 1-1');
            await sleepAndSay(40, 'in promise.all 1-2');
            await sleepAndSay(40, 'in promise.all 1-3');
            return;
        },
        async () => {
            await  sleepAndSay(30, 'in promise.all 2-1');
            await  sleepAndSay(20, 'in promise.all 2-2');
            await  sleepAndSay(20, 'in promise.all 2-3');
            return;
        },
    )

    await sleepAndSay(100, 'test3')
    
}
```

実行結果

```
test1
test2
in promise.all 2-1
in promise.all 1-1
in promise.all 2-2
in promise.all 2-3
in promise.all 1-2
in promise.all 1-3
test3
```

少し楽になった
PHP:特定dirからファイル名のみ取り出すやり方色々

# 概要
特定dirからファイル名のみ取り出すやり方色々あったのでまとめとく

## opendir()&readdir()

ここに書いてあった内容
https://syncer.jp/php-how-to-get-directory-file-list

```:php

$dir = "/img/";
$fileList = array();

// ディレクトリの存在を確認し、ハンドルを取得
	if( is_dir( $dir ) && $handle = opendir( $dir ) ) {
		
		// ループ処理
		while( ($file = readdir($handle)) !== false ) {
			// ファイルのみ取得
			if( filetype( $path = $dir . $file ) == "file" ) {
				/********************

				  各ファイルへの処理

				  $file ファイル名
				  $path ファイルのパス

				********************/
            array_push($fileList,$file);
			
			}
		}
	}
```

```:var_dump($fileList);
array (size=4)
  0 => string 'hoge.jpg' (length=8)
  1 => string 'foo.jpg' (length=7)
  2 => string 'bar.jpg' (length=7)
  3 => string 'hage.jpg' (length=8)
```

### 特徴
* 少し回りくどい？？
* シンプルにファイルのみ返ってきてよさそう

## scandir()

```:php

$dir = "/img/";
$fileList = scandir($dir);

```

```:var_dump($fileList);
array (size=6)
  0 => string '.' (length=1)
  1 => string '..' (length=2)
  2 => string 'hoge.jpg' (length=8)
  3 => string 'foo.jpg' (length=7)
  4 => string 'bar.jpg' (length=7)
  5 => string 'hage.jpg' (length=8)
```

### 特徴
* あれ、dir名入ってる
* まあシンプル

## glob()

```:php
$dir = "/img/";
$fileList = glob($dir.'*.{jpeg,gif,png}', GLOB_BRACE);
```

```:var_dump($fileList);
array (size=4)
  0 => string '/home/ubuntu/workspace/img/hoge.jpg' (length=35)
  1 => string '/home/ubuntu/workspace/img/foo.jpg' (length=34)
  2 => string '/home/ubuntu/workspace/img/bar.jpg' (length=34)
  3 => string '/home/ubuntu/workspace/img/hage.jpg' (length=35)
```

### 特徴
* フルパス
* シンプルで指定も楽

# 最後に

他に良いやり方もあったりするんかなーー。まあこんなもんか。
Chainer 2.0へのアップデート方法（Windows + CUDA 8.0 + CUDNN)

##この記事の目的
Chainer2.0では、cupyが独立したりして、プログラムの構成が変わりました。
アップデートする時、少し引っかかったので、覚書レベルだけど手順を書いてみた。

##前提環境
基本的な環境の作り方は、以下のページを参照してください。
[Windows10にChainer+CUDA 8.0をインストール](http://qiita.com/mash0510/items/fcc8fe717de4bcee90b2)

アップデート前の環境
- Windows 10 (64bit)
- Python 3.6.0 :: Anaconda 4.3.0 (64-bit)
- CUDA 8.0
- CUDNN 5.1
- Visual Studio 2015

## アップデート手順
####1.Chainerのアンインストール
`pip uninstall chainer`

####2. CUDNNのアップデート(6.0）
新しいChainerはcupy(CUDA機能を持ったnumpyライブラリ）が分離したので、CUPYインストール時にCUDNNに対するコンパイルが行われます。
現在のcupy(1.0.0.1)は、cudnnのv6.0が必要です。なので、NVIDIAからv6を取得します。
https://developer.nvidia.com/cudnn
注意：メンバー登録が必要です

ダウンロードしたzipファイルを展開して、cudaフォルダ以下のbin, include, libをフォルダごと
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0
にコピーする。


####3. cupy インストール
pipを使ってインストール
`pip install cupy`
1分ほどかかる。すんなり終わる場合は、cudnnが認識されていないので環境変数を見直しましょう。

確認作業
```python```
```>>> import cupy```
```>>> import cupy.cudnn```
エラーが出なければ成功です。

####4. chainerインストール
`pip install cahiner --no-cache-dir`

## まとめ
既にcudnn付きの環境で動作させていたので、今回は比較的楽にできたが、
初期環境から作るなら、pathやincludeの環境変数の設定を再度見直す必要がありそうです。
（たぶん、少し簡単になっているはず！？）
作ったアプリを消す必要性

![wfc20161109000.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/546fc594-c0e4-fc89-bfa4-8c30d2f9b94f.jpeg)

SaaSForceは、1つのIDと1つのメールアドレスで1ヶ月無料で利用できるクラウド環境で使うアプリケーション開発環境です。

もちろん有料版もあり、その違いの一つが作れるアプリの数に上限が設けられていること。

作れる数は10以上のようですが、それでもたくさん作りすぎるとそれ以上アプリが作れないわけです。

逆に言うと、無料版を使っている以上は「それほど必要ない」アプリを消していかなければいけません。

このときに2つの作業が必要です。

まずはテーブル項目定義で作ったものを消すこと、それと画面作成で作ったものを消すこと。

この二つをすることで初めて「消せた」といえます。

順番はどちらからでもいいのですが、今回は画面作成側からアプリを消していこうと思います。

選ぶのは、「画面項目定義」でも「画面レイアウト作成」でもどちらでもかまいません。

![wfc20161109001.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/6e6ba6a4-c6d8-e3e9-2976-3f35d428a8b3.jpeg)

消したいアプリのごみバケツのアイコンをクリックします。

![wfc20161109002.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/165331c7-8bc9-964d-b67a-8435b4d45d90.jpeg)

このようなメッセージが出るので「OK」を押します。

以上です。

次に、テーブルから「テーブル定義.作成」を選び、同じように消したいテーブルを選択します。

押すアイコンは同じです。

![wfc20161109004.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/61076f7f-bd27-fe3f-6d91-9445aa47646d.jpeg)

このように「該当テーブル」を削除すると以下のメッセージが出るので、「OK」を押して終了です。

個人的な経験ですが、画面を消すよりもテーブルを消す回数が多かったと思います。

それは、一つの画面で2つ以上のテーブルを表示させるなどをやったから、当然テーブルのほうが多くなったのですね。

また、全てを消したくなった場合は別の記事でシステムをクリアする方法をご紹介しているので、そちらが早いかと思います。
cakePHP3 validation 2つのfieldが空である事ときにエラーを表示

# 要求仕様

message_ja
message_en
共にemptyの時、validationエラーとする。

# 変更前（うまく動かなかったやつ）
```php
    ->allowEmpty('message_ja')
    ->add('message_ja',
        'custom', [
            'rule' => function($value, $context){
                if (    (empty($context['data']['message_en']))
                     && (empty($context['data']['message_ja'])))
                {
                    return false;
                }
                return true;
            },
            'message' => __('送信メッセージ 本文（日本語 もしくは 英語）を入力してください。'),
        ])
    ->allowEmpty('message_en')
    ->add('message_en',
        'custom', [
            'rule' => function($value, $context){
                if (    (empty($context['data']['message_en']))
                     && (empty($context['data']['message_ja'])))
                {
                    return false;
                }
                return true;
            },
            'message' => __('送信メッセージ 本文（日本語 もしくは 英語）を入力してください。'),
        ])
```

# 変更後（いけたやつ）
```php
    ->allowEmpty('message_ja',
        function($context) {
            if (    (empty($context['data']['message_ja']))
                &&  (empty($context['data']['message_en'])))
            {
                return false;
            }
            return true;
        },
        __('送信メッセージ 本文（日本語 もしくは 英語）を入力してください。')
    )
    ->allowEmpty('message_en',
        function($context) {
            if (    (empty($context['data']['message_ja']))
                &&  (empty($context['data']['message_en'])))
            {
                return false;
            }
            return true;
        },
        __('送信メッセージ 本文（日本語 もしくは 英語）を入力してください。')
    )
```

## さらに、
```php
    ->allowEmpty('message_ja',
        function($context) {
            if (empty($context['data']['message_en'])) {
                return false;
            }
            return true;
        },
        __('送信メッセージ 本文（日本語 もしくは 英語）を入力してください。')
    )
    ->allowEmpty('message_en',
        function($context) {
            if (empty($context['data']['message_ja'])) {
                return false;
            }
            return true;
        },
        __('送信メッセージ 本文（日本語 もしくは 英語）を入力してください。')
    )
```
Managing State in Angular Applications メモ

Savkin先生の記事を雑にメモする。これらの記事はngrx/storeを使う方法に誘導する感じがあるが、先生がまとめる問題点と解決策を整理してなんとかngrxよりも軽量でAngularにあった状態管理の方法を考えたい動機 :thinking: (なのでReduxについての記述は飛ばしがち)

# [Managing State in Angular Applications](https://blog.nrwl.io/managing-state-in-angular-applications-22b75ef5625f)

複数のバックエンドにあるサーバー、WebWorker、UIコンポーネントが並行して状態を更新するので、状態の管理は難しい。

何をメモリに、URLに保持すべきか？UIコンポーネントがローカルに保持すべきものは？これらの状態を同期するにはどうしたら良いか？

この記事では状態を6つに分類し、一般的な間違いとそれに変わるパターンを紹介する。

## Types of State

- Server state
- Persistent state
- URL, router state
- Client state
- Transient client state
- Local UI state

## Server state

サーバーで保持される状態。REST APIなどで提供される。

## Persistent state

Server stateをクライアントサイドのメモリに保持したもの。Server stateのキャッシュと捉えることができる。実際はより良いUXのために楽観的更新がされる。

## Client state

Client stateはサーバーに保存されない。リストをフィルタする設定がいい例になる。リストのアイテム自体はサーバーが保存しているが、それをフィルタする設定はそうではない。

> Persistent stateと Client stateの両方をURLに反映するのはいいプラクティス
> (It’s a good practice to reflect both the persistent and client state in the URL.) (Persistent stateもURLに反映する？？)


## Transient client state

URLには反映されないクライアントに保存される状態がよくある。例えば、Youtubeは再生している時間を保存していて、次に再生するときはそこから再生が始まる。この情報はURLに反映されないので、誰かにそのリンクを送るとその人は最初から動画を再生する。これがTransient client stateとなる。

## Local UI state

ボタンの色や、メニューが展開されているかどうかがLocal UI stateにあたる。

> 状態の種類を決めるときは、それが共有されるかと、ライフタイムについて着目する

## State Synchronization

Persistent stateとServer stateはは同じ情報を保持する。Client stateとURLも同様。なのでこれらを同期する必要がある。

_...普通の実装をしてSavkin先生がツッコミを入れる図_

## Mistakes

- 状態を計算するところとサービスから、状態の管理を分離しなかった
- Persistent stateとServer stateを同期する戦略を明確にしていなかった
- Client stateとURLを同期する戦略を明確にしていなかった
- モデルがmutableだった

## Refactoring 1: 状態管理の分離

- 分離
    - サービス
    - 状態管理
- Redux
    - Redux自体がゴールではない
    - 非Local stateを1箇所で管理する
    - Immutable data

> Rule 1: 状態の管理をアプリケーションの残りの部分と分離する
> Rule 2: 楽観的更新はエラーに対処するために分離したアクションを必要とする
> Rule 3: Persistent stateとClient stateにはImmutable dataを使う
> Rule 4: Reduxは目的を達成するためのものであり、それ自体が目的ではない

## Refactoring 2: Routerと状態

- Router is the source of truth
    - Persistent stateとClient stateを管理するが、Client stateは管理しない
    - アクションを発行する

> Rule 5: 常にRouterをsource of truthとして扱う
使う頻度が少なくて忘れやすいvim機能についてまとめ


今度はたまに使うけど緊要なvim機能（pluinから提供している機能を含めて）について整理する。
物覚えが悪い自分のための記事だ。
そんなわけでどんどん更新する。

## 複数行に対して一気に文字を挿入したい場合

1. 「ctrl + v」した後、複数行を選ぶ。
2. そして、「shift + i」した後、一気に入れたい文字列をタイピングする。
3. 「ESC」キーを押すことで文字列が複数行に挿入される。

## 繰り返して文字を挿入する

normalモードで「80、i、挿入文字」順で入力してEscキーを押すと「挿入文字」が80個挿入される。

## ページ移動

| キー     | 説明         |
| ---      | ---          |
| ctrl + u | 半画面分上へ |
| ctrl + d | 半画面分下へ |
| ctrl + b | 一画面分上へ |
| ctrl + f | 一画面分下へ |

## 編集画面のファイルタイプを確認

vimの設定ファイル（.vimrc）にてmappingをするときfiletype別に設定する場合がある。
該当ファイルのタイプを誤ってしまうと正常に動作しない。
ファイルのタイプを確認したい場合はこうする。

```vim
:set filetype?

" erbの場合、出力結果
filetype=eruby
```

## 長い行を持つファイルを開く場合、重くなるのを防ぐ

デザインさんが作業したhtmlファイルを開くとたまに長い行があってその時vimがめちゃ重くなる症状があった。
それを防ぐための設定で、値は200~300程度で設定する。

```vim
:set synmaxcol=200
```

## 行末で折り返し

* 折り返し有効

```vim
:set wrap
```

* 折り返し無効

```vim
:set nowrap
```

## クリップボードの内容をvimへペーストするときindentしない。

* indentしない

```vim
:set paste
```

* indentする

```vim
:set nopaste
```

nopasteになっている場合でもvisualモードでペーストした部分を選んで、「=」を入力すればindentなしで貼ってくれる。

## sudo権限でセーブが必要な場合

sudo権限が必要なファイルをsudoなしで開いて修正した場合、セーブができない。
そのとき、有用なpluginがsudo.vimというpluginだ。

### 設置

```vim
Plug 'sudo.vim'
```

### 使い方

```vim
:w sudo:%
Password: ＜パスワードを入力＞
```

## vim-easy-alignでテーブルを整形

### 設置

```vim
Plug 'junegunn/vim-easy-align'

... snip ...

vmap <CR> <Plug>(EasyAlign)
```

### 使い方

以下のキーはvisualモードで範囲を指定して＜Enter＞キーを押した後に入力する。

| キー | 説明                      |
| ---  | ---                       |
| =    | 最初の＝に合わせて整列    |
| 3=   | 三つ目の=に合わせて整列   |
| *=   | すべての=に合わせて整列   |
| **=  | =を基準として左・右で整列 |

=は例として上げただけであって、他の演算子でも使える。
主にmarkdownのテーブルを整形するときに使う。
BigQueryのおとーさん達、JordanとFelipeに話しを聞いてきた

# はじめに
これは2017/06/14の[Google Cloud Community fes @ Google Cloud Next'17 Tokyo](https://www.meetup.com/GDG-Cloud-Tokyo/events/240052509/)での[#bq_sushi](https://bq-sushi.connpass.com/event/57722/)にて開催されましたセッション『**Jordan本人だけどなんか質問ある？**』の内容となります。
端折っている部分や記憶が若干曖昧な部分、ごにょごにょもありますが、ご了承ください。

# お題１：スロットとは何か？もう少し教えてください！あと、事前にTierを知る方法はありますか？
*Jordanおとーさん：*
その質問は良く聞かれる。知りたい理由も知っている。
現在、1スロットに割り当てられるメモリなど処理能力はわかっているのだが、あえて答えていない。なぜ答えないのかは、その**処理能力が日々向上している**からなんだ。だから、知っておいてほしいのは**1スロットというのが並列処理されている数**だと認識してほしい。
あと**Tierの制限については遠くない未来に廃止したいと思っている。**もう少し待ってほしい。
また、事前に知る方法は今は無いんだよね。

# お題２：LegacySQLとStandardSQLどっちがいいの？スロットの使われ方も違うように思うが。
*Jordanおとーさん：*
LegacySQLというのは元々Google社内で使っていたものだ。
しかし、**今はStandardSQLを利用すべきだ。スピードも速いはずだ。**同じSQLでLegacySQLが速いなら、それはバグだ！
なぜ速いかというと、**StandardSQLにはオプティマイザが実装されている。**

*司会：*
LegacySQLは無くなるのか？

*Jordanおとーさん：*
よほどのことが無い限りなくなることはない。しかし、進化もしない。
StandardSQLはこれからも新しい機能を実装していく。

# お題３：Custom Quotaの設定をCloud Console or API or bqで設定したいです。
*Jordanおとーさん：*
それは難しいんだ。詳しくは話せないが、BigQueryの構造上、**申請を受けるたびにBigQueryのエンジニアが手作業で行っている。**（※まぢか！）
言っていることは理解出来るが、実装はかなり厳しい。

# お題４：table_partitionを利用したテーブルへのupdateはいつぐらいに実装されるのか？
*Jordanおとーさん：*
実はこれも難しくてね。要望があるのは知っているし、自分たちも取り組んでいる。
**もう少し待っててくれないかな。**

# お題５：障害が発生することがたまにある。長時間だと業務影響があり、正直しんどい。。。。。
*Jordanおとーさん：*
すでに今年も大きな障害が何度か発生し、みんなが困っているのは知っている。自分たちもそれは認識している。
だから、**今は機能よりも安定を優先している。**実は開発が終わっていて、実装できる機能もいくつかあるのだが安定性を考えてもう少し様子をみている。
また、当初考えつかなかったような使い方をしているユーザ（とてつもないStreamingInsertとか）が出てきているのも事実であり、そういう使い方をされても他のユーザに迷惑がかからないような機能を実装していっている。

# お題６：USやEUのデータ固定はあるが、asia（特に日本）のリージョン固定はできるようになるか？
*Jodanおとーさん：*
asiaということ？それともTokyoリージョン固定？どっちがいいのかな？

*ここでみんなから挙手でアンケート*
Tokyo 9 : asia 1 （業務系データとログに分かれたような感じ）

*Jordanおとーさん：*
ふむ。以前、スイスで同じようなことを言われて出来るよって簡単に答えた。
でも、実際には6ヶ月もかかってしまったんだよね。だから、簡単に出来るとは答えることが出来ないんだよ。

*kaz-san：*
でも、どうだろうか？Flatrateのユーザが100人ぐらいになったら？

*Jordanおとーさん：*
**そりゃお金払ってくれるならやるよ！**（※会場爆笑。どっちやねん！）

# お題７：Spannerなどから簡単にデータをBigQueryに持っていきたい！何か開発しているようなものはありますか？

*kaz-san：*
あれ？それは『ピー（すいません。伏せ字的な）』がそろそろ。。。。

*司会：*
コラ～！それはまだ言っちゃダメ！（※会場爆笑）

*Jordanおとーさん：*
すでにGoogle社内では様々なデータをBigQueryに取り込むようなツールは利用されている。
無責任なことは言えないけど、**そんなに遠くない未来にリリースされることもあるんじゃないかな？**

*Felipeおとーさん：*
この質問者はなんて読むんだい？娘ってことか？

*kaz-san：*
あ、それは**GAEが好きすぎて嫁にしたいと思っているユーザが居るんだよ**（※会場爆笑）

*司会：*
あ、sinmetalさんですね。はい。

# お題８：データインポートのエラーログが昔よりそっけない。エラー行とかわかんないから人的コストが。。。。

*Jordanおとーさん：*
あー。それか。（クスクス）
**ごめん。バグ！**（※バグかーーーーい！というツッコミ）

*Felipeおとーさん：*
うん。Issueに上がってるから、Trackingしてみて！

*Jordanおとーさん：*
しかし、理解してもらいたいこともあるんだ。BigQueryは分散処理で成り立っているのは知っているよね？つまりデータのロードも分散処理なわけだよ。そこで、分散された単体ならそうでもないが全体の何行目にエラーがあるとかは非常に難しいんだよ。だから、解決に時間がかかっているんだよね。

# 最後に
参加者は50名程度でしたが、ほぼBQユーザということで質問の内容にみんな『そーそー！』とか『それな！』とか『なんやと！』などリアクションがわかりやすく、会場一体での熱気に溢れたセッションでした。
BigQueryの認知度だけでなく、実際のユーザがかなり増えてきて成熟期にきたのかな？という感想を持ちました。
もっと、#bq_sushiのイベントなどを行って、事例の共有なんかをやっていきたいと思います。

忙しい合間を縫って、登壇してくれたJordanとFelipe、そして参加頂いた方々、ありがとうございました。
aigis と Windows の組み合わせで ENOTEMPTY エラーが出たときの対処

スタイルガイドジェネレータの [aigis](https://pxgrid.github.io/aigis/), Mac だとすんなり動いたのですが Windows環境でちょっとつまづいたので、対処メモ

## 確認した環境

- Windows 7 / Windows 10
- node.js 4.8.3
- gulp 3.9.1
- aigis 1.4.0
- gulp-aigis 1.3.0

## 現象

こんなかんじで gulp-aigis 経由で aigis を実行すると

```js
const gulp = require('gulp');
const aigis = require('gulp-aigis');

gulp.task('aigis', () => {
  return gulp.src('./path/to/aigis_config.yml')
    .pipe(aigis());
});
```

こんなエラーが

```
[Info] Start: Generate Styleguide
Unhandled rejection Error: Error: ENOTEMPTY: directory not empty, rmdir 'foo¥aigis_assets¥css'
    at bar¥node_modules¥node-aigis¥lib¥Aigis.js:103:17
```

ふむ？ ディレクトリの削除に失敗している？
ちなみに Mac環境では何も問題なし。

## 対策

ちょっと調べたけどはっきりした原因はわからず。ひとまずの対処として、対象フォルダを [del](https://github.com/sindresorhus/del) を使って先に削除しておくようにしました。その後に aigis が動くよう、gulpfile のタスクをこんな感じに変更。

```js
const del = require('del');

gulp.task('aigis',() => {
  del('./path/to/styleguide').then(() => {
    return gulp.src('./path/to/aigis_config.yml')
      .pipe(aigis());
  });
});
```

今のところ、これで対処できています。
Raspberry PiとNano Piの比較

# はじめに
- [こちらの記事](http://qiita.com/derori/items/eae9d389cf2f3af5e620)を見てたら欲しくなって、[NanoPi Neo2](http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO2)を注文してしまいました。（まだ届いてない）

---

# GPIOピンの比較
- Raspberry Pi対応の拡張ボードが、NanoPiでどれくらい使えそうか気になったので比較してみました。
    - GPIOとしての使い方は気にしてません。
    - 表中の太字部分が互換がありそうなところで、電源（+5V／+3.3V／GND）／UART／I2C／SPIは問題なさそう。
    - NanoPi側はUARTがもう1ch（UART2）使えそうなので、[この記事](http://qiita.com/katsumin/items/27fbae6b61edd1fa8167)でやっていたUART通信のキャプチャには合っているかも。
- 拡張ボードをPCB設計する際には、NanoPi用の取り付け穴も考慮しようかな、と思います。

|NanoPi NEO2||||Raspberry Pi||||
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|Pin#|Name|Pin#|Name|Pin#|Name|Pin#|Name|
|1|**SYS_3.3V**|2|**VDD_5V**|1|**3v3 Power**|2|**5v Power**|
|3|**I2C0_SDA/GPIOA12**|4|**VDD_5V**|3|**I2C1_SDA/BCM2**|4|**5v Power**|
|5|**I2C0_SCL/GPIOA11**|6|**GND**|5|**I2C1_SCL/BCM3**|6|**Ground**|
|7|GPIOG11|8|**UART1_TX/GPIOG6**|7|GPCLK0/BCM4|8|**TXD/BCM14**|
|9|**GND**|10|**UART1_RX/GPIOG7**|9|**Ground**|10|**RXD/BCM15**|
|11|UART2_TX/GPIOA0|12|GPIOA6|11|BCM17|12|PWM0/BCM18|
|13|UART2_RTS/GPIOA2|14|**GND**|13|BCM27|14|**Ground**|
|15|UART2_CTS/GPIOA3|16|UART1_RTS/GPIOG8|15|BCM22|16|BCM23|
|17|**SYS_3.3V**|18|UART1_CTS/GPIOG9|17|**3v3 Power**|18|BCM24|
|19|**SPI0_MOSI/GPIOC0**|20|**GND**|19|**SPI0_MOSI/BCM10**|20|**Ground**|
|21|**SPI0_MISO/GPIOC1**|22|UART2_RX/GPIOA1|21|**SPI0_MISO/BCM9**|22|BCM25|
|23|**SPI0_CLK/GPIOC2**|24|**SPI0_CS/GPIOC3**|23|**SPI0_SCLK/BCM11**|24|**SPI0_CE0/BCM8**|
|||||25|Ground|26|SPI0_CE1/BCM7|
|||||27|ID_SD/BCM0|28|ID_SC/BCM1|
|||||29|BCM5|30|Ground|
|||||31|BCM6|32|PWM0/BCM12|
|||||33|PWM1/BCM13|34|Ground|
|||||35|SPI1_MISO/BCM19|36|BCM16|
|||||37|BCM26|38|SPI1_MOSI/BCM20|
|||||39|Ground|40|SPI1_SCLK/BCM21|

- 機械的な嵌合について
    - NanoPi NEO2が届いたので、拡張ボードと合わせてみました。
    - そのままコネクタに刺すと、USBコネクタが当たってしまうようです。
    ![IMG_2564.JPG](https://qiita-image-store.s3.amazonaws.com/0/166435/4fdcc811-d21e-deec-c889-7c9d95d9f118.jpeg)

    - 連結コネクタを２段にして高さを稼げば、何とかなりそう。
    ![IMG_2567.JPG](https://qiita-image-store.s3.amazonaws.com/0/166435/4a64f8c7-2ab1-4388-cf9b-455f6a9e1310.jpeg)

    - [ラズパイ用スタッキングコネクタ](http://akizukidenshi.com/catalog/g/gC-10702/)を使うのが正解かな。（13.5mmと、高さが5mm高い）
Python2→3のprint利用時の注意

初めてPythonを触り、お約束どおり"Hello, world!"したところエラーで進まず。
環境はPython3.6.1。たぶんこれあちこちでTips。
Python初学用のサイトを見ていたのだが

```py3:
print "Hello, world!"
```
は [Missing parentheses in call to 'print'] になる。

原因としてはPython3ではprintは関数型で記述するように文法が変更されていたとのこと。。。

```py3:
print("Hello, world!")
```

こちらは正常に通った。
ウェブの情報は記述されたタイミングなどの問題があるのでバージョンについては十分注意が必要なのは分かっているつもりだったが、やらかしてしまった(^^;
Selenium IDEでループ処理を行う

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/Selenium-IDE%E3%81%A7%E3%83%AB%E3%83%BC%E3%83%97%E5%87%A6%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86/)をご覧ください😀

## はじめに

Selenium IDEのみではループ処理が出来ないため、同じ処理を繰り返し行いたいときにとても不便です。

この記事ではループできるようにする方法と簡単なサンプルについて書きます。

※かなり今更な内容ですが、たまにやろうとしたときに忘れてるのでメモ。

## ループできるようにする

拡張jsやアドオン追加でループできるようになります。

今回はsideflow.jsを使いました。

### sideflow.js

拡張用のjsファイルです。

https://github.com/73rhodes/sideflow
からダウンロード

Selenium IDEのオプション→設定→一般タブ
『Selenium Core拡張スクリプト（user-extentions.js）のパス』にダウンロードしたsideflow.jsを指定

これでforやwhileのループが使えます。

### SelBlocks

アドオンなのでインストールが簡単そうなのですが、署名エラーにより有効にできなかったので諦めました。
https://addons.mozilla.org/en-US/firefox/addon/selenium-ide-sel-blocks/


## ループのサンプル

URLが異なるページでなにかしら処理をするサンプルです。

<table>
<tr>
	<th>コマンド</th>
	<th>対象</th>
	<th>値</th>
	<th>※解説</th>
</tr>

<tr>
	<td>for</td>
	<td>i=1; i &lt;= 10; i++</td>
	<td>i</td>
	<td>ループの開始。10回ループ。値をiに格納</td>
</tr>
<tr>
	<td>echo</td>
	<td>${i}</td>
	<td></td>
	<td>ただのデバッグ（SeleniumIDEの『ログ』タブに表示されるよ）</td>
</tr>
<tr>
	<td>open</td>
	<td>http://qiita.com/tags/SeleniumIDE/items?page=${i}</td>
	<td></td>
	<td>URLを開く。${i}が変数</td>
</tr>
<tr>
	<td>pause</td>
	<td>3000</td>
	<td></td>
	<td>3秒待つ（いつもwaitかsleepか悩むのでメモ...）</td>
</tr>
<tr>
	<td>assertTextPresent</td>
	<td>SeleniumIDE</td>
	<td></td>
	<td>ページのどこかに『SeleniumIDE』と表示されているか確認</td>
</tr>
<tr>
	<td>endFor</td>
	<td></td>
	<td></td>
	<td>ループの終了</td>
</tr>
</table>

## さいごに

Selenium IDE便利ですね。ステキです。
Macに色々なバージョンのPython+OpenCV+FFmpeg環境を入れてみた

# はじめに

- 色々環境を整える上で、今回FFmpegを使いたかったので、環境構築をしてみました。
- また、Python+OpenCVの構築手順がネットに転がりすぎて戸惑うのとバージョンの組み合わせで色々使い分けなければいけない場面があるのでまとめました。
- Homebrewやpip、pyenvの構築手順は省いています。PATH貼ったりする手順も省いてます。
- OpenCVやFFmpegはmakeに時間がかかるので、余裕のあるときに行うのが吉です。

# 今まで試したこと

## Python2.7+OpenCv2

### Homebrewのみ

```zsh
brew install python
brew install opencv
```

## Python2.7+OpenCv3

### Homebrew + pip

```zsh
brew install python
pip install opencv-python
```

### pyenv + pip

- pyenvはanyenvから入れました。

```zsh
pyenv install 2.7
pip install opencv-python
```

## Python3.6+OpenCv3

### Homebrew + pip

```zsh
brew install python3
pip3 install opencv-python
```

## Python3.6+OpenCv3+FFmpeg

- どうやらpipではOpenCVと一緒にFFmpegをコンパイルしてくれないみたいです。
[video related functionality is not supported (not compiled with FFmpeg)
](https://pypi.python.org/pypi/opencv-python)
- 以下のファイルができれば成功です。/usr/local/lib/python3.6/site-packagesにシンボリックリンクを貼ってあげてください。（なぜか前回このファイルが何度やってもできなくて諦めました。）
```zsh
/usr/local/Cellar/opencv3/3.2.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so
```

### Homebrewのみ

```zsh
brew install opencv3 --with-python3 --with-ffmpeg　--without-python
```
チェックしたい本

<h1>ディレクション関係</h1>

<h2>Webディレクションの新・標準ルール 現場の効率をアップする最新ワークフローとマネジメント</h2>

[アマゾンリンク](https://www.amazon.co.jp/Web%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%96%B0-%E6%A8%99%E6%BA%96%E3%83%AB%E3%83%BC%E3%83%AB-%E7%8F%BE%E5%A0%B4%E3%81%AE%E5%8A%B9%E7%8E%87%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%E6%9C%80%E6%96%B0%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A8%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88-%E6%A0%84%E5%89%8D%E7%94%B0-%E5%8B%9D%E5%A4%AA%E9%83%8E/dp/4844366467/ref=pd_sim_14_3?_encoding=UTF8&psc=1&refRID=NJ8G2T52NGCMTSRD9RPM)
phpenvのPHPインストール時のオプションメモ(PHP7.1.6版)

phpenv派です（anyenvで統一できるから）。

とうとうPHP7の世界にはいりました。

消えるといけないのでQiitaにメモ。

```sh
$ YACC="$(brew --prefix bison27)/bin/bison" CONFIGURE_OPTS="--disable-dba --disable-fpm --enable-bcmath --enable-calendar --enable-cgi --enable-ctype --enable-dom --enable-exif --enable-fileinfo --enable-ftp --enable-gd-native-ttf --enable-gd-jis-conv --enable-hash --enable-intl --with-icu-dir=$(brew --prefix icu4c) --enable-json --enable-mbregex --enable-mbstring --enable-pcntl --enable-phar --enable-shmop --enable-simplexml --enable-soap --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-tokenizer --enable-wddx --enable-zip --with-bz2 --with-curl --with-enchant --with-gd --with-gettext --with-gmp --with-kerberos --with-layout=GNU --with-mhash=yes --with-onig --with-pcre-regex --with-pear --with-pic --with-png-dir --with-xmlrpc --with-zlib --with-zlib-dir --without-mm --with-mcrypt --enable-opcache --with-iconv=$(brew --prefix libiconv) --with-libxml-dir=$(brew --prefix libxml2) --with-openssl=$(brew --prefix openssl) --with-pgsql=$(brew --prefix postgresql) --with-pdo-pgsql=$(brew --prefix postgresql) --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd" phpenv install 7.1.6
```

PHP5.6.28版は [こちら](http://qiita.com/k1LoW/items/6dba8cb565fcd3925afd)
apm link --devしてCannot find module 'xxxx'とか出たときの対処

## 初めて、他の人が作ったatom packageをforkして、コードを修正してみようと思った

普段、WindowsでC++とか、C#をいじってる。

javascriptとか、いじったのは20年前で、既に他の言語感がある。

当然、coffee scriptって何?ってレベル。 (聞いたことあるけど・・・)

ちょっと、使ってみたいpackageがあったけど、不具合があって、issue投げても反応がない。

で、forkしてみようかな。。。って。


## apm link --devでエラーが出る

取り敢えずforkしたらgit clone。

その後は、以下のサイトを参照。

https://www.kaitoy.xyz/2015/08/21/japanese-word-selection/

git cloneしたローカルのpackageのフォルダで、

> apm link --dev

を実行。

> Cannot find module 'atom-space-pen-views'

とか出て上手くいかない。

> apm install 'atom-space-pen-views'

で、どうかな？

と思ったけど無理。

結局、ここみて、

https://discuss.atom.io/t/cannot-find-module-atom-space-pen-views/15691

> package depen

で解決した。

以上。
MySQLでソートしてn番目のカラムを取得する


limit句とoffset句を使うと簡単にできる

以下の例は小さい方から2番めのデータを取得する例

```sql
SELECT
  column_name
FROM
  table_name
ORDER BY column_name
LIMIT 1
OFFSET 1
```

単純にOFFSET使って何番目のデータを取得するか指定しているだけ
軽量DIコンテナ BtInjector を作ってみた

# DIコンテナを作ってみた
パフォーマンスがイマイチor要件に合わないコンテナが多かったので作ってみた
https://github.com/chalharu/BtInjector
nugetでBtInjectorで検索すると使えます

## 使い方
 
### コンテナの登録
```csharp
// まずコンテナインスタンスの作成
var container = new Container();

// シングルトンインスタンスの登録
// インターフェイス - 実体の型を登録
container.For<IService1>().As<Service1>(Lifecycle.Singleton);
// インスタンスを登録
container.For<IService2>().As(service2);
// ラムダ式で登録
container.For<IService3>().As(() => new Service3(), Lifecycle.Singleton);
container.For<IService4>().As((IService3 service3) => new Service4(service5), Lifecycle.Singleton);

// 都度生成の場合
// インターフェイス - 実体の型を登録
container.For<IService6>().As<Service6>(Lifecycle.Transient);
// ラムダ式で登録
container.For<IService7>().As(() => new Service7(), Lifecycle.Transient);
container.For<IService8>().As((IService7 service7) => new Service8(service7), Lifecycle.Transient);

// スレッド単位生成の場合
// インターフェイス - 実体の型を登録
container.For<IService9>().As<Service6>(Lifecycle.ThreadLocal);
// ラムダ式で登録
container.For<IService10>().As(() => new Service10(), Lifecycle.ThreadLocal);
container.For<IService11>().As((IService10 service10) => new Service11(service10), Lifecycle.ThreadLocal);
```

### インスタンスの生成
```csharp
// 通常通り生成
container.GetInstance<IService1>();
// 生成するデリゲートを出力
container.GetInstance<Func<IService6>>();
// 遅延生成
container.GetInstance<Lazy<IService7>>();
```

## ポイント
- Func<T>で生成できる
- ラムダ式で登録できる
- かなり軽量（のつもり）
- いろんなプラットフォームに対応
  - .NET Framwork 4.0
  - PCL(Profile 5)
  - iOS(実機がないので不明だがとりあえずFullAOTで動く)
  - .NET Standard 1.1

# DIコンテナを評価してみる

参考: http://www.nuits.jp/entry/ioc-battle-in-2017

## 前提条件
- MacBook Pro Retina 2014
- Memory 8G
- Mono 5.0.0
- .NET Framework 4.6.2ターゲット

## 評価内容
- Singlton時のコンテナ登録時間
- Singlton時の初回インスタンス取得時間
- Singlton時の２回目以降インスタンス取得時間（100万インスタンス）
- インスタンス都度生成時のコンテナ登録時間
- インスタンス都度生成時の初回インスタンス取得時間
- インスタンス都度生成時の２回目以降インスタンス取得時間（100万インスタンス）

### 変更点
- 初回インスタンス取得時間の追加
  - 初回のインスタンス取得が非常に重たいコンテナが多く、別途測定する必要があると思われる
- Singletonと都度生成のそれぞれでAppDomainを生成した
  - 型がキャッシュされている場合が多いため

## 評価結果

| Container | Singleton - Registartion[ms] | Singleton - Resolve first[ms] | Singleton - Resolve[ms] | Transient - Registartion[ms] | Transient - Resolve first[ms] | Transient - Resolve[ms] |
|:-:|--:|--:|--:|--:|--:|--:|
| new Operator | 0.11 | 0.47 | 17.09 | 0.10 | 0.47 | 175.38 | 
| BtInjector | 3.18 | 26.20 | 79.25 | 3.19 | 25.15 | 299.24 |
| BtInjector Lambda | 4.60 | 2.99 | 79.72 | 4.43 | 2.70 | 515.70 |
| DryIoc.dll | 26.22 | 16.85 | 35.71 | 26.45 | 20.40 | 202.12 |
| AutoFac | 38.48 | 56.94 | 758.52 | 39.45 | 63.03 | 35,440.41 |
| AutoFac Lambda | 37.71 | 7.14 | 745.74 | 37.09 | 5.59 | 10,345.82 |
| StructureMap | 30.50 | 105.62 | 1,026.37 | 27.60 | 98.85 | 7,869.01 |
| SimpleInjector | 29.29 | 70.27 | 73.17 | 32.33 | 64.46 | 257.75 |
| Unity | 24.60 | 90.24 | 1,041.28 | 23.61 | 86.98 | 24,289.29 |

BtInjectorはコンテナの登録・初回生成を含めるとかなり健闘しているはず。
iTerm2のエラーメッセージからRubyMineで該当のファイルを開く

`iTerm2->Preferences->Profiles->Advances->Semantic History`で`Run command`に設定して

```
/Applications/RubyMine.app/Contents/MacOS/rubymine \5 --line \2 \1
```

と書けばOK。`⌘+クリック`該当行にジャンプできます。何故か`/usr/local/bin/mine`の方を使うとうまくいきません。あれは何のためにあるんでしょう？
粒子法MPSにおける圧力振動の発生と影響半径の設定について

#背景
- 粒子法では圧力の解が振動（圧力振動）するような数値誤差が存在する．
- 圧力振動の発生によってシミュレーション品質が損なわれる．

#適切な影響半径の設定について
以下の図は静水槽の底面における圧力振動を比較したものである．それぞれ，粒子径をd[m]とした時，緑が理論値，オレンジが影響半径reを4.1d[m]，青が2.1d[m]としたときのものである．図からわかる通り，__影響半径が大きい方（オレンジのre=4.1)が圧力振動が少ない__ことが分かる．これは圧力の解が1STEP毎に影響半径の範囲内で各粒子に伝播するためである．ゆえに，小さい影響半径では伝搬の次数が増え圧力振動が増大した．また，青の影響半径re=2.1は途中で計算が破綻しているためグラフは途中で切れている．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187379/c6525ed4-8546-86a0-397e-024d8c7e42e8.png)
__図. 圧力振動の比較__

しかし，影響半径を大きくした場合，計算コストが増大するのは自明（影響半径内の粒子が増える）であり，シミュレーション系に応じた適切なパラメータ選択が必要である．例えば，__静水槽では影響半径は4.1，水柱崩壊では影響半径は2.1__ぐらいが推奨されるだろう．
__表. 影響半径と圧力振動__
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187379/b7726016-1d51-76fd-4deb-798a9916c001.png)

#結論
- 圧力振動の発生と計算時間の速さはトレードオフの関係にあり，シミュレーションユーザはシミュレーション系に応じた適切なパラメータ設定が求められる．
Twitterのユーザーアイコンを丸から角丸に変えるChrome Extensionを作ってみた

Twitter Web Clientの急な仕様変更によりユーザーアイコンが丸くなったので
手前味噌で角丸に変えるChrome Extension作ってみたよ:v:

- Before
![beforeIcon.png](https://qiita-image-store.s3.amazonaws.com/0/72064/e2f76d6b-f185-a904-7a11-ab9b873df138.png)

- After
![afterIcon.png](https://qiita-image-store.s3.amazonaws.com/0/72064/1bbb1029-ead4-2e1e-7af0-992bc0f7fd3f.png)

使い方は他のChrome Extensionと同じで
ソースをダウンロードして解答したのち
右上の設定ボタン🍔から```その他ツール > 拡張機能```と選択して設定していけば:ok:

ソースと詳しい使い方はGitHubのリポジトリを参照してね:feet:

https://github.com/cia-rana/just-fitting-twitter-icon

現場からは以上です(｀･ω･´)ゞ

## 解説
って程でもないです．ご想像の通り，StyleSheetを注入するJSを書いただけです:innocent:
Windows7 PHP+Xdebug＋Chrome＋XDCデバッグ環境

#環境
今回試した環境
Windowws7 Pro 64bit
Apache/2.4.18 (Win32) OpenSSL/1.0.2e PHP/7.0.8
Xdebug php_xdebug-2.5.4-7.0-vc14.dll
XDebugClient Version:1.0 beta 3
Apahe、Chrome、XDCはすべて同じPCで動作させる。

#インストール
Xdebug dll Download　[XDEBUG EXTENSION FOR PHP | DOWNLOADS](http://www.xdebug.org/download.php)
XDC Download [Google Code Archive XDebugClient](https://code.google.com/archive/p/xdebugclient/downloads)
Chrome Extension [Xdebug helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc?hl=ja)

PHP,ApacheはXAMPPでインストールした。
phpinfo()などでDebug Build→noを確認しておく。
Xdebugのdllは、動作しているPHPに合わせる（32bitか64bitかはOSによらない）。
私の環境はThread Safety	enabledなので"_TS"付き（ファイル名は"-nts"無し）をダウンロード。
XDCは最新の物をダウンロード、適当なディレクトリに展開しておいた。
Xdebug helperをChromeに追加。

#設定
##php.ini
php.iniにzend_extensionを追加。私の環境はdllを C:\xampp\php\ext（デフォルトのextensionのディレクトリ）に置いたため、フルパスの記述は必要ないので
```zend_extension=php_xdebug-2.5.4-7.0-vc14.dll```
を; Dynamic Extensions ;のコメントのあるブロックの最後に挿入。

根拠は無いが、Extensions の最後に読み込ませたいので、この位置。
PHP5.4以降はzend_extension_TSやzend_extension_debugではなく、zend_extensionにするようだ。

##Apache再起動
ここまでで、Apacheを再起動

##IDE Key
phpinfoで項目xdebugを確認。IDE Key→gdbpになっているはずなので、ChromeのXdebug helperアイコン右クリック->オプションを開きIDE Key をそれに合わせて Other gdbp に変更。

#デバッグ
XDCを立ち上げ、Debug->Start listeningしておく。
Chromeでデバッグしたいローカルサイトのページを表示し、Xdebug helperのDebugをアクティブにしてからリロード。
XDCにソースが表示され、先頭行で停止する。
Swift4 Multi-Line String Literals

# はじめに
Swift4から複数行の文字列リテラルが導入されるので、試してみました。

# 開発環境
|category | Version| 
|---|---|
| Swift | 4.0 |
| XCode | 9.0 beta (9M136h) |

# とりあえずplaygroundで書いてみた。

```swift:playground
let multiLineStr = """
FirstLine
SecondLine
ThirdLine
“""

// -> "FirstLine\nSecondLine\nThirdLine"
```

複数行の文字列を表現できました!
一応、文字列比較もしてみました。

```swift:playground
import UIKit

let str = "FirstLine\nSecondLine\nThirdLine"

let multiLineStr = """
FirstLine
SecondLine
ThirdLine
"""

if str == multiLineStr {
    print("str is equal to multiLineStr.")
} else {
    print("str is not equal to multiLineStr.")
}

// -> str is equal to multiLineStr.
```

当然ですが、同じ!!
ただ、なんとなく読みにくい。。

# playgroundの次は、プロジェクトで。
playgroundで動作確認できたので、次にプロジェクトを作成して同じコードを書いてみました。
(サンプルなので、とりあえずViewControllerに。)

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        multiLineString()
    }
    
    func multiLineString() {
        let str = "FirstLine\nSecondLine\nThirdLine"
        
        let multiLineStr = """
FirstLine
SecondLine
ThirdLine
"""
        
        if str == multiLineStr {
            print("str is equal to multiLineStr.")
        } else {
            print("str is not equal to multiLineStr.")
        }
    }
}
```

""”書いてreturn押したら、カーソル左端に行くし、
control + i (インデントの調整のショートカット)押しても、上記コードのままでした。

インデントはこれが正しいのでしょうか?!

# さいごに
インデントはどうすべきなのかイマイチ分かりませんでしたが、
とりあえず、複数行の文字列リテラル使ってみました。

本記事内にコード全部書いてしまいましたが、Githubに作成したサンプルをあげてあります。
https://github.com/stv-yokudera/swift4-multi-line-string-literals
【Fixed】Qiitaのコメント欄や記事本文でbootstrapのクラスが効く

#問題のコード

```
<div class="navbar navbar-default navbar-fixed-top">
　　　　<div class="alert alert-warning" role="alert">
　　　　　　　　^o^
　　　　</div>
</div>
```


```
<div class="navbar navbar-default navbar-fixed-bottom">
　　　　<div class="alert alert-warning" role="alert">
　　　　　　　　ウィキペディアの寄付<br>
　　　　　　　　　　　　ウィキペディア読者のみなさまへ。 <br>私たちは世界で5番目のウェブサイトを運営する小さな非営利組織です。 わずか150人のスタッフが4億5千万人のユーザーを支えており、他のトップサイトのようにサーバー、電力、家賃、プログラム、人件費がかかります。 ウィキペディアは特別なものです。例えるなら、みんなの図書館のようなもの、また知の神殿のようなものでもあります。私たちが考え、学ぶことができる場所です。 独立性を守るため、私たちは広告を掲載しません。政府からの援助も一切受けません。 私たちはみなさまの寄付で運営されており、その平均額は¥3000です。今、あなたの支援が必要です。もしこのメッセージをお読みのみなさまがコーヒー1杯分の価格ずつご寄付くださったとしたら、この資金募集は1時間以内に終わります。ウィキペディアがお役に立ちましたら、また1年広告なしで運営できるよう1分のお時間をください。 私たちが資金募集のことを忘れてまたウィキペディアの仕事へ戻れるよう、どうかご協力ください。 よろしくお願いします。
　　　　</div>
</div>
```


応用すれば実害ありそう

# 追記

例のfont-awesome関係も含めて対策されてました:relaxed:(17-06-17 04:11現在)
Twitter がやたら丸くなったので反抗して真四角にしてやるCSS

# はじめに
2017/6/16 0時頃、突如として Web 版 Twitter があちこち丸くなる現象が発生しました。同様の変更がモバイルアプリや TweetDeck にも適用されています。
思えば数日前からボタンの角が丸くなっていたので、UI 変更の予兆だったのかもしれませんね。

![スクリーンショット 2017-06-16 01.51.38.png](https://qiita-image-store.s3.amazonaws.com/0/163084/30bff88f-315a-7b00-e56b-898d3cf1a722.png)

CSS を覗いてみると `.edge-design` というクラスが出現していて、ここにある `border-radius:50%` が各所に適用されているようです。 [(L_tan さんありがとうございます)](https://twitter.com/L_tan/status/875382939126603776) 

Twitter を眺めてると(少なくとも自分の観測範囲では)阿鼻叫喚なので、どうせだったら徹底的に対抗してやる！と思い、**全部** `border-radius:0px` **にしてやりました**。

# やり方
1. [Stylish](https://userstyles.org/) というアドオンをインストールします。
2. URL に `twitter.com` を指定して、以下の CSS を入力します。

```css:tofu.css
@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document domain("twitter.com") {
  * {
      border-radius: 0px !important; 
  }

  .global-nav .search-input
  {
	  padding: 8px 32px 8px 8px;
  }
  
  .RichEditor div[contenteditable],
  .RichEditor div[contenteditable]:focus,
  .RichEditor div.fake-focus[contenteditable]
  {
	  padding: 8px 8px;
  }
}
```

<font color="Thistle">ユニバーサルセレクタが効かなくてクラスちまちま追加してたんですが `!important` の存在を忘れていました……</font>

こんな感じになります。エッジが効いてますね。

![スクリーンショット 2017-06-16 01.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/163084/7f8e78ea-eae7-7acd-39bf-8aa38b073166.png)

# おわりに
サッポロビールも「丸くなるな、星になれ。」と言っているので、あとはいいねをふぁぼに戻したら完璧だと思います(適当)。
適当に作ったので、ご指摘ありましたらよろしくお願いします。
【Android】アクションメッセージ、エラーメッセージの表示ルールを提案します

正常に処理が行われたことを伝えるメッセージや、エラーが発生したことを伝えるメッセージを表示することは、ユーザーフレンドリーなアプリを提供する上で必要不可欠な行いになります。
Androidアプリでは、このようなメッセージを表示するために、昔から [Toast](https://developer.android.com/reference/android/widget/Toast.html) や [AlertDialog](https://developer.android.com/reference/android/app/AlertDialog.html) 、Material Designが生まれてからは追加で [Snackbar](https://developer.android.com/reference/android/support/design/widget/Snackbar.html) が提供されています。

しかし、いざメッセージ表示を実装しようとするとToastを使えば良いのか、AlertDialogを使えば良いのか、Snackbarを使えば良いのか、正直よくわかりません。
ToastとSnackbarに関しては [Material Desiginのガイドライン](https://material.io/guidelines/components/snackbars-toasts.html) で以下のように定義されていますがはっきりしていません。

- __Snackbars__ contain a single line of text directly related to the operation performed. They may contain a text action, but no icons.

- __Toasts__ (Android only) are primarily used for system messaging. They also display at the bottom of the screen, but may not be swiped off-screen.

そこで今回は私が勝手に解釈したメッセージの表示ルールをみなさんに提案したいと思います。

## Toast
Toastは __必要なパーミッションが許可されていない、通信処理を行いたいのにネットワークに繋がっていない、などのOS側の設定に近いエラーメッセージ__ を表示する際に最適だと考えています。

Toastはアプリそのものよりも上のレイヤーに表示されますし、Snackbarが登場してからはプライオリティが高いメッセージを表示するものに格上げされたと勝手に解釈しているのでこのように考えました。
また、アプリ内でのクリティカルな位置づけのメッセージを表示する際にも使って良いと思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/40539/d70b654d-91da-b529-6c02-dbee5ffae60c.png" width="360px" />

## AlertDialog
AlertDialogは __ユーザーの操作ミスやサーバーエラーなどの、ユーザーにメッセージをしっかり読んでもらいたいエラーメッセージ__ を表示する際に最適だと考えています。

SnackbarやToastと違って、ボタンをタップしないとメッセージが閉じないものになっているため、長文を表示させたり重要なメッセージを表示させたりする場合にも有効になってくると考えています。
_＊SnackbarやToastも長時間表示させることは可能ですが、本来の姿ではないと解釈しています_

<img src="https://qiita-image-store.s3.amazonaws.com/0/40539/d5c5d13d-5363-f3ba-36d4-974647e4fe4b.png" width="360px" />

## Snackbar
Snackbarは __ユーザーの能動的なアクションによるメッセージ__ を表示する際に最適だと考えています。

Snackbarはメッセージの右側にアクションボタンが付けられるため、UNDOやRETRYが可能なメッセージを表示したい場合に有効になってくると考えています。
個人的にSnackbarにはポジティブなメッセージだけを表示させたい欲がありますが、必要であればエラーメッセージを表示させても良いと解釈しています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/40539/84098335-e7c7-5dd3-15ef-72565b2327ae.png" width="360px" />

## その他（TextView）
バリデーションエラーや、Toast・AlertDialog・Snackbarを使うほどでもないメッセージに関しては、体験的にActivity/Fragment上に作ったTextViewに表示させるのが最適だと考えています。

## まとめ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ユーザーの能動的なアクションによる通知 → Snackbar、<br>ユーザーにメッセージを読ませたいユーザーの操作ミスや、サーバーエラーによる通知 → AlertDialog、<br>パーミッションが取れないとか、ネットワークに繋がっていないとかのシステム側に近いエラー → Toast</p>&mdash; nissiy（にっしー） (@yoichinishimura) <a href="https://twitter.com/yoichinishimura/status/875033333612167168">2017年6月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

今回は私が勝手に解釈した内容を提案してみましたが、各々のアプリの世界観やルールにあわせてカスタマイズすることでより良いものになると思いますので、メッセージの表示ルールの策定をしてみてはいかがでしょうか。
Mac OS 10.12 で JAVA_HOME を正しく設定する


## まとめ

どうも正しくはこうあるべきの様です。

```
# 適切なパスを自動で取得できます.
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
```


今までフルパス直書きでした。 (しかもリンク切れてた)

```
# これは悪い例.
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
```

## 設定のしかた

まだ [JDK] が入っていない人は Oracle のダウンロードサイトからダウンロードしてインストールをします.

* http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

エディタで ``~/.bash_profile`` を開いて ``export JAVA_HOME=...`` を追加します.

```
$ vi ~/.bash_profile

...

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
```

Terminal.app を開き直すか、以下のコマンドで ``~/.bash_profile`` の再読込をします.

```
$ source ~/.bash_profile
```

意図したとおりに設定出来ているか確認します.

```
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
```

[JDK]:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
みなさま、おはようございます。Rubyラジオ体操第１でございます。

rubyラジオ体操が始まります<span class="fa fa-spin">:chicken:</span>

# 問題
### 第1問　〜深呼吸の運動〜

```ruby
nil.nil?
# => true
[nil, nil, nil].nil?
# => ?
```

### 第2問　〜腕を振ってあしをまげのばす運動〜

```ruby
[1, 3].nil?
# => false
nil?
# => ?
[1, 3].present?
# => true
present?
# => ?
```

### 第3問　〜腕をまわす運動〜

```ruby
:hoge
# => :hoge
:"hoge"
# => ?
:1
# => ?
:"1"
# => ?
```

### 第4問　〜胸をそらす運動〜
```ruby
"abc"["ab"]
# => ?
"abc"[/ab/]
# => ?
"abc"[/a.*c/]
# => ?
```

.
.
.
.
.
.


# 答え
### 第1問

```ruby
[nil, nil, nil].nil?
# => false
```

配列の中のnilを見る・・・なんてことはいたしません:hugging_face:
Arrayがあるのでfalseを返します。

### 第2問

```ruby
nil?
# => false
present?
# => true
```

レシーバになにも書かなくてもエラーにはならず、
`nil?`はfalseを返し、
`present?`はtrueを返します:innocent:

### 第3問

```ruby
:hoge
# => :hoge
:"hoge"
# => :hoge
:1
# => SyntaxError: unexpected tINTEGER, expecting tSTRING_CONTENT or tSTRING_DBEG or tSTRING_DVAR or tSTRING_END
:"1"
# => :"1"
```

`:1`はひっかけでございました:dango:
数字はシンボルにできないですが、
`""`で囲むと`""`ごとシンボルになります。

### 第4問

```ruby
"abc"["ab"]
# => "ab" (String)
"abc"[/ab/]
# => "ab" (String)
"abc"[/a.*c/]
# => "abc" (String)
```

知っていれば難しくないですが、
文字列は`[]`で正規表現を使えます、というご紹介でした:curry:

# ラジオ体操は、このへんで。
<span class="fa fa-spin">:white_flower:</span><span class="fa fa-spin">:white_flower:</span><span class="fa fa-spin">:white_flower:</span>今日も１日、どうぞお元気にお過ごしください<span class="fa fa-spin">:white_flower:</span><span class="fa fa-spin">:white_flower:</span><span class="fa fa-spin">:white_flower:</span>
Docker コンテナお掃除コマンド


docker rmとdocker ps -qの合わせ技でいい感じにコンテナを消せる。
## docker ps -q
起動コンテナの**IDのみの一覧**を表示する。
qの前にオプションつけると色んなフィルターをかけれる。
docker rmするときにこのコマンドも合わせれば結構便利。

## 停止コンテナを全部消す
```
docker rm $(docker ps -aq)
```

## 最後に作成したコンテナを消す
```
docker rm $(docker ps -lq)
```

他にも便利なコマンドがあれば教えて頂けると幸いです。

## 参考書籍
https://www.amazon.co.jp/Docker-Adrian-Mouat/dp/4873117763/ref=sr_1_3?ie=UTF8&qid=1497542250&sr=8-3&keywords=docker
【Rails】enum カラム用 select Form Helper を実装

model で enum を指定したカラムを form select で扱いやすくする Form Helper を実装した．

# 追記

gemにしました ⇢ [enum_select_rails](https://github.com/tanakaworld/enum_select_rails)

# 前提
* Rails 5.0.3
* Ruby 2.4.0

# User 作成

```bash
$ bundle exec rails g scaffold User name:string gender:integer
```

gender カラムは enum を適用して整数値を格納する．

初期状態のフォームは下図の通り．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/c384b8a1-4ffa-8bf0-1faf-c46456930b67.png)


# [enum](http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html) を定義

```ruby:app/models/user.rb
class User < ApplicationRecord
  enum gender: {
      female: 0,
      male: 1,
      unanswered: 2
  }
end
```

# enum　に合わせてフォームを変更

model に enum を定義すると，下記のように enum の一覧が取得できる．
`number_field` ではなく `select` に変更する．

```erb:app/views/users/_form.html.erb
<!-- 初期状態 -->
<div class="field">
  <%= f.label :gender %>
  <%= f.number_field :gender %>
</div>

<!-- 下記に変更 -->
<div class="field">
  <%= f.label :gender %>
  <%= f.select :gender, User.genders.keys.map {|k| [k, k]} %>
</div>
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/298c6ecb-012d-04c1-0703-3a0c9c2b4611.png)


# i18n対応

## [enum_help](https://github.com/zmbacker/enum_help) をインストール

この gem を用いて i18n の日本語文字列を扱いやすくする．

```ruby:Gemfile
gem 'enum_help'
```


## 設定追加
application.rb を更新し，自作した locales が読み込まれるようにする．

```ruby:config/application.rb
# i18n
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
config.i18n.default_locale = :ja
config.i18n.available_locales = [:ja, :en]
```

## locale作成

locale ファイルを作成する．
`User.genders_i18n` のように サフィックスに `_i18n` をつけることで下記のように定義した値が取得できるようになる．


```yml:config/locales/models/user/ja.yml
ja:
  activerecord:
    models:
      user: ユーザー
    attributes:
      user:
        name: 氏名
        gender: 性別
  enums:
    user:
      gender:
        female: 女性
        male: 男性
        unanswered: 未回答
```

## フォーム更新

```erb:app/views/users/_form.html.erb
<!-- 下記に変更 -->
<div class="field">
  <%= f.label :gender %>
  <%= f.select :gender, User.genders_i18n.keys.map {|k| [User.genders_i18n[k], k]} %>
</div>
```

このように Select が日本語化できる．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/3ea72b01-a131-8006-15bb-9075de3b87b1.png)


# Form Helper を拡張

毎回書くのは冗長なので共通化する．

```config/initializer/extensions/form_helper_extension.rb
class ActionView::Helpers::FormBuilder
  def enum_select(record, options = {}, html_options = {})
    pluralized = record.to_s.pluralize
    klass = self.object.class
    base = klass.send(pluralized)
    i18n = klass.send("#{pluralized}_i18n")
    select record.to_sym, base.keys.map { |k| [i18n[k], k] }, options, html_options
  end
end
```

`enum_select` を適用．

```erb:app/views/users/_form.html.erb
<div class="field">
  <%= f.label :gender %>
  <%= f.enum_select :gender %>
</div>
```

# gem/サンプル

* [enum_select_rails](https://github.com/tanakaworld/enum_select_rails)
* [GitHub - rails-enum-select-sample](https://github.com/tanakaworld/rails-enum-select-sample)
Debian/Ubuntuにnodejsとyarnをinstall

## 背景

一次資料にあたれ、で終わる話であって本来こんな記事は不要ですが、
`ubuntu install nodejs npm`みたいに検索すると上位のQiitaやblog記事のほとんどが古い手順だったため、あえて書き残します。

## 手順

公式サイトの手順に従うことが近道です（当たり前）。

### nodejs

https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-debian-ubuntu-linux


```
$curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$sudo apt-get install -y nodejs
```

上記で6系が入ります。
6系にしたのは現在LTS(Long-term Support)のversionだからです。
https://github.com/nodejs/LTS

最近ではTLS/https周りで初のRegressionが起こり、LTSの対応リリースがなされました。
https://github.com/nodejs/LTS/issues/193

まもなく8系がLTSになるので、その時上記も古い手順となります。
おそらく`setup_8.x`に変えれば動くでしょうが、必ずQiitaやStack Overflowに頼らず公式ページを確認ください。

### yarn

https://yarnpkg.com/lang/en/docs/install/#linux-tab

```
$curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$sudo apt-get update && sudo apt-get install yarn
```

## 解説

どちらの手順でも、apt-get前にしていることはpkg取得先mirrorの登録作業(URLと鍵の登録)です。

```
$less /etc/apt/sources.list
(defaultのmirrorが記載)
$ls /etc/apt/sources.list.d/
nodesource.list yarn.list
$cat /etc/apt/sources.list.d/nodesource.list
deb https://deb.nodesource.com/node_6.x trusty main
deb-src https://deb.nodesource.com/node_6.x trusty main
```

ちなみに自分が初めて触ったUbuntuは、会社が独自にカスタマイズしたイメージで作られたものだったので、
sources.listの中が全部会社ドメインのmirrorでした。
当然置いてあるパッケージのバージョンも古く、
`sudo apt-get nodejs npm`ではEOLバージョンのnodejsが、npmに関しては`E: Unable to locate package npm`と管理さえされてませんでしたorz
PlantUMLでSysMLの要求図を描いてみる

#SysMLとは
巷ではIoTが叫ばれていますが、複数のシステムが複雑に連携するサービスが増えるにつれ、ソフトウェアだけではなく、システムをモデリングできる言語が必要とされ、開発されました。
#要求図とは
世の中には、要求を階層的に記述する手法として、USDM(Universal Specification Describing Manner)[^1]などが開発されているが、SysMLの要求図もその一種で、ダイアグラムを使って記述する方法です。
[^1]: (株)システムクリエイツの清水 吉男 氏が提唱する表記法
##今回の趣旨
SysMLを記述するツールとしては、[EnterpriseArchitect](http://www.sparxsystems.jp/products/EA/ea.htm)や[astah*SysML](http://astah.change-vision.com/ja/product/astah-sysml.html)などが代表的ですが、個人で購入するには敷居が高いのが正直なところ。eclipse上でモデリングできるソフトもいくつかありますが、どうも学習用には取っつきにくい印象があります。そこで、テキストに記述した内容からUMLのダイアグラムを気軽に生成できる[PlantUML](http://plantuml.com/)を使用して、要求図のモデリングが可能か試してみたいと思います。
###題材
いきなり仮想の要求図を描いてもいいのですが、ツールの実力を試すために、すでに何かしらのSysMLモデリングツールを使用して作成された題材を使い、その再現性を確認してみようと思います。今回選んだのは、オージス総研さんのウェブサイトにあった[記事](https://www.ogis-ri.co.jp/otc/hiroba/technical/SysEngSysML/SysEngSysML2.html)の中の図５の要求図を選びました。
###モデリング結果
![req.png](https://qiita-image-store.s3.amazonaws.com/0/132380/1f58c3ac-7909-5919-d5ba-030d54d81240.png)
###再現性の確認
ダイアグラムとしては、もともと要求図はクラス図をベースに開発されているので、大きな差異は出なかったです。SysMLの要求図を試しに描いてみたい人には十分ではないでしょうか。
###再現できなかった点
- ~~同じ要求名のブロック作成ができない。~~
- レイアウトの再現性

~~PlantUMLはクラス名で個々のブロックを識別しているので、題材のように「利用部品」という同じ名称の要求を別のブロックとして取り扱うことができませんでした。仕方なく「利用部品1」というように連番で名称を変えました。~~
キーワード as を使用することで、同じクラス名でも定義名を分けることで、同じ名称の「利用部品」という要求を複数作成することが可能となりました。

レイアウトに関しては、かなり近いところまでは再現できたとは思いますが、PlantUMLは、レイアウトの制御は最低限なので、関連に対するノートは、「なぜそこに入れる！」と言いたくなる位置です。

##まとめ
SysMLの要求図を学習したり、スケッチしたりする目的には、PlantUMLは十分利用できるといえるのではないでしょうか。
次は、他のダイアグラムについても検証してみたいと思います。

####おまけ
作図に使用したソースコードです。

```rq.pu
@startuml

hide circle
hide empty members
hide method

!define REQ1 "主要求"
!define REQ2 "実現可能性"
!define REQ3 "コスト"
!define REQ4 "利用部品"
!define REQ5 "利用部品"
!define REQ6 "利用部品"
!define REQ7 "手段"

!definelong req(name,txt,label)
class "name" as label <<requirement>> {
Text=txt
}
!enddefinelong

!definelong freq(name,txt,label)
class "name" as label <<functionalRequirement>> {
Text=txt
}
!enddefinelong

!definelong dcnstr(name,txt,label)
class "name" as label <<designConstraint>> {
Text=txt
}
!enddefinelong

!define nest(x,y) x +-- y
!define derive(x,y) x <.. y : <<deriveReqt>>
!define refine(x,y) x <.. y : <<refine>>
!define derivel(x,y) x <.. y : <<deriveReqt>> link


title 図5 サービスレベル要求図

package "req サービス要求" <<Frame>> {
    req(REQ1,システムエンジニアリングを経験する,A1)
    freq(REQ2,ハードウェアを含めて実現可能である,A2)
    dcnstr(REQ3,なるべくコストをかけない,A3)
    dcnstr(REQ4,使える既存システムは流用する,A4)
    dcnstr(REQ5,CPLDを利用する,A5)
    dcnstr(REQ6,既存の電光掲示板システムを流用する,A6)
    req(REQ7,電光掲示板をCPLD駆動に変更する,A7)
    note "allocatedFrom\n<<useCase>>システムエンジニアリングを経験する" as N2
}

nest(A1,A2)
nest(A1,A3)
nest(A1,A4)

derive(A2,A5)
note top on link : <<rationale>>\nCPLDならハードウェア\n回路の変更が容易
derive(A3,A5)
derive(A3,A6)
derive(A4,A6)
derive(A5,A7)
derive(A6,A7)

refine(A1,A7)

N2 .. A1

@enduml
```
コマンドのみでユーザディレクトリ名の言語を変更する

# 背景
GUIであれば以下の方法で変更できます

* 以下のコマンドを実行  
`LANG=C xdg-user-dirs-gtk-update`
* 表示されたダイアログで「Update Names」を選択

この方法だとCUIのみの環境では変更できないので、CUIのみで変更する方法をメモ

# 方法
* 以下のコマンドを実行  
`LANG=C xdg-user-dirs-update --force`

# 備考
元々あった日本語のディレクトリの中身は変更後のディレクトリへ移動されないようなので、必要に応じて手動で移動するしかなさそうです