OmniAICreator/Qiita-1.07M huggingface dataset:
マッピングウィンドウからフロー画面に戻る方法

# はじめに

マッピングウィンドウで処理を作ったり内容を確認したりするときに元のフロー画面を表示したいことがあります。フローを開いている数が数個ならマウス操作で対象のタブをクリックすればよいですが、いっぱい開いているとどれかわからなくなることがあります。そこでマッピングウィンドウからフロー画面に戻る方法について確認してみました。

# 環境

+ OS:Windows Server 2012 R2
+ ASTERIA WARP:1806
+ Java:1.8.0_151

# デザイナー操作
マッピングウィンドウの右下にある「フローに戻る」ボタンをクリック

![backtoflow1.png](https://qiita-image-store.s3.amazonaws.com/0/180292/759cb3d7-9c74-0d7f-0dae-5a4bdfb268ff.png)


これでマッパーが配置されているフローに戻ることができました。

# 終わりに

元に戻す(UNDO)/やり直し(REDO)ボタンと間違いそうですがツールバーにある「表示した順に戻る」、「表示した順に進む」ボタンでも戻れました。
![backtoflow2.png](https://qiita-image-store.s3.amazonaws.com/0/180292/7218ee80-70d8-7617-2070-57bea15624b8.png)


これでマッピングウィンドウから迷わずフロー画面に戻れるようになりました。

以上です。
XCode9でgeneramba使おうとしたらセットアップできない

VIPER,日本語記事やっぱ少ないですね。
iOS best practicesで検索するとclean architectureとかFlux, Reduxより全然多いんだけど海外ばかりなイメージ。

そんなVIPERを使う上で便利な[generamba](https://github.com/rambler-digital-solutions/Generamba)をセットアップしようとしたらハマったのでメモ。

` bundle exec generamba setup `

` bundler: failed to load command: generamba `
 
` RuntimeError: [Xcodeproj] Unknown object version. `

xcodeのを読み込めないらしい。

cocoapodsでもよく出るらしくこれが引っかかってくる。
http://hachinobu.hateblo.jp/entry/2018/03/16/130422

`  [sudo] gem install xcodeproj `

やったけど解決せず。。。

Ruby versionとかかと思って結構ハマって

https://github.com/rambler-digital-solutions/Generamba/issues/219

要はこうするようにとのことでした。
普通にissueにあったけど、Project formatを8.0~にしなさいとのことでした。
https://github.com/rambler-digital-solutions/Generamba/issues/203

色々質問に答えて…

` Rambafile successfully created! Now run `generamba template install`. `

成功しました！
kubeswitch: kubectl でcontextをラクに切り替える

kubectlでたくさんのクラスタを扱うと、contextをいちいち切り替えるのが大変なので、
簡単なコンテキストスイッチャーをBashコマンドにしました。
下記のやり方はOSXで検証していますが、Linux系でも問題なく動くかと思います。

# 使い方
![tty.gif](https://qiita-image-store.s3.amazonaws.com/0/67687/078edfe7-d15c-5f1c-90a3-be3ab75c0882.gif)


# Requirements
事前に[peco](https://github.com/peco/peco)のインストールが必要です。

## osx
```
brew install peco
```


# 実装
下記のコードを、`~/.bash_profile` などに追加すれば使えます。

```bash:~/.bash_profile
function kubeswitch() {
	kcontext=$(kubectl config get-contexts  | peco --initial-index=1 --prompt='kubectl config use-context > ' |  sed -e 's/^\*//' | awk '{print $1}')
	if [ -n "$kcontext" ]; then
		kubectl config use-context $kcontext
	fi
}
```

# 亜種: gcloudswitch

```
gcloudswitch () {
	project=$(gcloud projects list   | peco --initial-index=1 --prompt='gcloud config set project > ' |  sed -e 's/^\*//' | awk '{print $1}')
	if [ -n "$project" ]; then
		echo "Switch to ${project}."
        gcloud config set project $project
    fi
}
```


# 亜種2: awswitch
```
awswitch () {
    choice=$(aws configure list-profiles | peco --initial-index=1 --prompt='Choose profile' | awk '{print $1}')
    if [ -n "$choice" ]; then
		export AWS_PROFILE=$choice
    fi
}
```
KYDrawerControllerとUINavigationControllerの画面遷移

# 背景
今回アプリ作成にあたって下記Home画面にだけサイドメニューを置くという、あまり見ない形の実装をすることになった。
[Login]-[Home]
　　　　　├[View1-1]-[View1-2]...
　　　　　├[View2-1]-[View2-2]...
　　　　　└[View3-1]-[View3-2]...
※ 僕のイメージだとサイドメニューはtabcontrollerの代わりとして使うイメージ
※ そもそもiOSにこの手のメニューが無い

# 使うことにしたライブラリ
storyboard上でサクッとメニューを作れそうなので、これを使うことにした。
https://github.com/ykyouhei/KYDrawerController/
久しぶりにiOS周りやってるのと、サンプルがアレすぎて役に立たなかったのでメモ代わりにやったことを記載することにした。

# 実装した内容
概ねStoryboard上での設定はライブラリのreadmeおよびサンプルを見れば多少なんとかなるはずなので、省略。
メニュー画面で実装したコード。

```swift:SideMenuViewController.swift
    @IBAction func view1ActionButton(_ sender: UIButton) {
        if let drawerController = navigationController?.parent as? KYDrawerController {
            let storyBoard = UIStoryboard(name: "Main", bundle: nil)
            let view1 = storyBoard.instantiateViewController(withIdentifier: "view1")
            (drawerController.mainViewController as? UINavigationController)?.pushViewController(view1, animated: true)

            drawerController.setDrawerState(.closed, animated: true)
        }
    }

    @IBAction func view2ActionButton(_ sender: UIButton) {
        if let drawerController = navigationController?.parent as? KYDrawerController {
            let storyBoard = UIStoryboard(name: "Main", bundle: nil)
            let view2 = storyBoard.instantiateViewController(withIdentifier: "view2")
            (drawerController.mainViewController as? UINavigationController)?.pushViewController(view2, animated: true)

            drawerController.setDrawerState(.closed, animated: true)
        }
    }

    @IBAction func view3ActionButton(_ sender: UIButton) {
        if let drawerController = navigationController?.parent as? KYDrawerController {
            let storyBoard = UIStoryboard(name: "Main", bundle: nil)
            let view3 = storyBoard.instantiateViewController(withIdentifier: "view3")
            (drawerController.mainViewController as? UINavigationController)?.pushViewController(view3, animated: true)

            drawerController.setDrawerState(.closed, animated: true)
        }
    }

    @IBAction func logoutActionButton(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }

    @IBAction func closeActionButton(_ sender: UIButton) {
        if let drawerController = navigationController?.parent as? KYDrawerController {
            drawerController.setDrawerState(.closed, animated: true)
        }
    }
```
mainViewController側でnavigationさせるのがうまくいかずに大分消耗した。
別のライブラリに関するサイトだけど、下記を見て「あー」となったので気づけた。
よかったよかった:weary:
https://www.project-respite.com/slidemenucontroller/

# その他
* なんかstoryboard取得もっと短くかけた気がしたけど忘れた
* AutoLayout使ってるとメニューを`drawerController.setDrawerState(.opened, animated: true)`で呼び出す際、微妙に「にゅっ」とする。（AutoLayout切ると問題なくなるので、作りでなんとかできそうな予感はするが、優先度下げて後日対応)
* やはり標準で用意されてること以外やろうとすると何でも苦労するね
Tech Connect! Autumn 記事インデックス

この記事は**[リンク情報システム](https://www.lis.co.jp/)**が主催するイベント**2018 Tech Connect! Autumn**のインデックスです。
Tech Connect! Autumn は**秋のアドベントカレンダー**として、**engineer.hanzomon** のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちらから](https://ja-jp.facebook.com/lis.co.jp/)）

2018/9/10～2018/9/23の期間で実施します。
最終日は秋分の日です。

|日付|執筆者|タイトル|
|:--------:|:----------:|:----------|
|9/10（月）|@dgkz  |[（初日）java.io.InputStreamはリゾートカジノ白服ディーラー（カード担当）](https://qiita.com/dgkz/items/463f97bd44e340026cd0)|
|9/11（火）|@taisuke3|[小難しいセンサーは一切不要！！！ラズパイカメラだけでサクッとその場の人数を検出してみる](https://qiita.com/taisuke3/items/3f8690137672174ac8d0)|
|9/12（水）|@mk-takahashi|[spresenseで遊ぼう](https://qiita.com/mk-takahashi/items/12db1e17cd35578f7795)|
|9/13（木）|@cassetteTape|[Sourcetree + gitでMIDI音楽制作のデータ管理は出来るか](https://qiita.com/cassetteTape/items/1d562528d9a3bed3b423)|
|9/14（金）|@usankusai|[Eclipse+Tomcatでhttp2開発環境構築してみた](https://qiita.com/usankusai/items/677126cdb45bfac0e260)|
|9/15（土）|@r-ishikawa|[WindowsServer2008R2 と .NET Framework3.5のTLS 1.1/1.2対応](https://qiita.com/r-ishikawa/items/f77192a7ce6441c779e9)|
|9/16（日）|@n-tanimoto|[ansible_specを利用してAnsibleとServerspecを同一ディレクトリで管理してみる](https://qiita.com/n-tanimoto/items/7d2a902689d83443b6e2)|
|9/17（月）|@hura|[モテる”ITエンジニア”](https://qiita.com/hura/items/6a1e8dda48336ebe9212)|
|9/18（火）|@rysk001|[スマートライフを考える](https://qiita.com/rysk001/items/5bf38fd582d5f0fb641b)|
|9/19（水）|@totata|[ARDUBOYの設定から自作ゲームへ（１）](https://qiita.com/totata/items/9dc5ab1e2abe8ecf2c83)|
|9/20（木）|@mashed-p|[M5stack(M5GO)とM5UI.Flowであそんでみた](https://qiita.com/mashed-p/items/1ba7a3dc54e3b766c2a8)|
|9/21（金）|@h-yamasaki|[VRをはじめましょう](https://qiita.com/h-yamasaki/items/722fcbbd79079eccf5b0)|
|9/22（土）|@r-abe|[独身貴族のスマートホーム -Alexaからローカルの音楽を再生する-](https://qiita.com/r-abe/items/34bd22766075441cb57f)|
|9/23（日）<br>秋分の日|@mk-takahashi|（千秋楽）<br>[気軽にIoTデバイスをつくろう](https://qiita.com/mk-takahashi/items/cec22f7389bd6be4640d)|
C++におけるスレッド処理の実装

#ノーマルのスレッド処理

```header.h
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>

class Test{
    public:
        static void ThreadProcess1();
        static void ThreadProcess2();
        void MainFunction();
};
```

```main.cpp
include "header.h"

std::mutex mtx;

void Test::ThreadProcess1(){
    mtx.lock();    /*メモリの占有*/
    /*各スレッドで共有する関数や変数の処理はここに書く*/
    mtx.unlock();  /*解放*/
}
void Test::ThreadProcess2(){
    mtx.lock();    /*メモリの占有*/
    /*各スレッドで共有する関数や変数の処理はここに書く*/
    mtx.unlock();  /*解放*/
}

void Test::MainFunction(){
    std::thread th1(ThreadProcess1);
    std::thread th2(ThreadProcess2);
    th1.join();
    th2.join();
}

int main(int argc, char **argv){
    Test tc;
    tc.MainFunction();
    return 0;
}

```

#各スレッドのプライオリティの設定
```header.h
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <pthread.h>

class Test{
    public:
        static void ThreadProcess1();
        static void ThreadProcess2();
        void MainFunction();
};
```

```main.cpp
include "header.h"

std::mutex mtx;

void Test::ThreadProcess1(){
    mtx.lock();    /*メモリの占有*/
    /*各スレッドで共有する関数や変数の処理はここに書く*/
    mtx.unlock();  /*解放*/

    sched_param sch;
    int policy;
    pthread_getschedparam(pthread_self(), &policy, &sch);
    std::cout << "Thread_Priority(Process1): "<< sch.sched_priority << std::endl;
}
void Test::ThreadProcess2(){
    mtx.lock();    /*メモリの占有*/
    /*各スレッドで共有する関数や変数の処理はここに書く*/
    mtx.unlock();  /*解放*/

    sched_param sch;
    int policy;
    pthread_getschedparam(pthread_self(), &policy, &sch);
    std::cout << "Thread_Priority(Process2): " << sch.sched_priority << std::endl;

}

void Test::MainFunction(){
    sched_param sch;
    sch.sched_priority = 1;
    std::thread th1(ThreadProcess1);
    std::thread th2(ThreadProcess2);
    pthread_setschedparam(th1.native_handle(), SCHED_FIFO, &sch));
    th1.join();
    th2.join();
}

int main(int argc, char **argv){
    Test tc;
    tc.MainFunction();
    return 0;
}

```

```出力
Thread_Priority(Process1): 1
Thread_Priority(Process2): 0
```

いろいろいらないものがあるハズ。
Amazon LinuxからPostgreSQL(RDS)へ接続する

#なんで書いた？
EC2(Amazon Linux)をクライアントとしてRDS(PostgreSQL)に
接続したかったのですが、EC2にPostgreSQLをインストールする
記事にたどり着くことが多かったので書いてみました。

#どんな環境？
EC2(Amazon Linux AMI release 2018.03)
RDS(PostgreSQL 9.6.9)

#ざっくり言うと？
yumでpostgresqlのclientモジュールをインストールすれば接続できます。
（分かれば簡単だけど、調べ始めた時はクライアント用のモジュールが無い感じだったので困惑しました）

#やり方は？
##モジュールの確認
```
yum list | grep postgre
```

##クライアントモジュールのインストール
```
yum install postgresql96.x86_64
```

##インストールしたモジュールの確認
```
psql -V
```

##PostgreSQLへ接続
psql -h ＜RDSのエンドポイント＞ -U ＜DBのユーザ名＞ -d ＜DB名＞

```
（例）psql -h xxxxx.yyyyy.ap-northeast-1.rds.amazonaws.com -U hogeuser -d hogedb
```

##PostgreSQLでの操作による確認
```
SELECT version();
```
※バージョン表示のSQLで動作確認
##PostgreSQLの接続を切断
```
\q
```

#結論に至るまでに調べたこと
yum search postgresqlを実行するとpostgresql96.x86_64がクライアントプログラムであることがわかります。

```
postgresql96.x86_64 : PostgreSQL client programs
```

yum info postgresql96.x86_64でも同じことがわかります。
C++ forkを使ったセマフォのサンプルコード

注意点としては、ただforkしてもセマフォのsemは、プロセス間で共有されなくて別物になってしまうため、共有メモリのアドレスを割り当てる必要がある。

## ソースコード
```c++:semaphore.cpp
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>

#define NAME "/test"

// 開放
void my_free(sem_t *sem){
    // semaphore解放
    sem_destroy( sem );

    // 共有メモリ開放
    shm_unlink(NAME);
}

int main()
{
    int p_id;
    int status;
    int i;

    int fd;
    void *ptr;
    struct stat stat;

    // 共有メモリ作成
    fd = shm_open(NAME, O_CREAT | O_RDWR, 0666);
    ftruncate(fd, 1024);

    // 共有メモリをポインタに割り当てる
    ptr = mmap(NULL, stat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    
    // ポインタのアドレスをsemに割り当てる
    sem_t *sem = (sem_t*)ptr;

    // sempahoreの初期化:プロセス間を可能でsemの値0から
    if (sem_init( sem, 1, 0 ) < 0) {
        perror("init");
        my_free(sem);
        exit(EXIT_FAILURE);
    }

    // プロセスの生成
    if ((p_id = fork()) == 0) {
        cout << "プロセス生成" << endl;
        if(sem_wait(sem) < 0){ // waitする
            perror("wait");
            my_free(sem);
            exit(EXIT_FAILURE);
        }
        cout << "end" << endl;
        exit(EXIT_SUCCESS);
    }

    // 5秒数える
    for (i = 0; i < 5; i++) {
        sleep(1);
        cout << i + 1 << "秒経過" << endl;
        if (i+1 == 3) { // 3秒になったら実行
            if (sem_post(sem) < 0) { // postする
                perror("post");
                my_free(sem);
                exit(EXIT_FAILURE);
            }
            cout << "post" << endl;
        }
    }

    // 親の処理
    if (p_id != -1) {
        wait(&status); // 子プロセス全部終わるまで待つ
        cout << "子プロセス終了" << endl;
    } else {
        perror("親プロセス異常終了");
        my_free(sem);
        exit(EXIT_FAILURE);
    }

    my_free(sem);
    return return_code;
}
```

## 実行結果
`❯ g++ semaphore.cpp -lpthread -lrt`
`❯ ./a.out`

```:実行結果
プロセス生成
1秒経過
2秒経過
3秒経過
post
end
4秒経過
5秒経過
子プロセス終了
```
PC-88 画面キャプチャのサンプル

```scrcap.asm
; z88dk / PC-8001 mon
; z80asm -b -l scrcap.asm

	org	$b000
start:
	ld	de, buf
	ld	hl, $c000
	di
	out	($5c), a
	ld	a, (hl)
	ld	(de), a
	inc	de
	out	($5d), a
	ld	a, (hl)
	ld	(de), a
	inc	de
	out	($5e), a
	ld	a, (hl)
	ld	(de), a
	out	($5f), a
	ei
	halt

buf:	defs	3
```

アセンブルしたバイナリファイルをテープイメージにします。（手入力でも可）
PC-88のV1～V2モードでグラフィックを描きます。
![scrcap1.png](https://qiita-image-store.s3.amazonaws.com/0/257554/726fff31-4587-0b7e-147b-68385e48f0d5.png)

ディスクイメージが入っていれば取り出し、Nモードで起動します。
`mon`
`*L`
`*GB000`
のようにするとhaltで停止しますのでリセットします。
![scrcap2.png](https://qiita-image-store.s3.amazonaws.com/0/257554/b9e72878-bde7-75a0-b88b-259fbb30ca4b.png)
SlackのコードブロックにSyntax Highlightで色を付ける

# 背景

Slackでオペレーションの進捗を共有してたりしませんか？

弊社インフラチームでは本番作業の進捗をSlackで共有するのが一般的になっていますが、Slackは **コードブロックでシンタックスハイライトがされない** 仕様のため、とても読みにくいという問題が発生しています。

Slackにはシンタックスハイライトが有効な `Snippet` という機能も存在します。ただ、こちらは **添付ファイルとして扱われる** という仕様のため、アップロード時にタイトルやら何やらを入れなければならず、作業進捗を貼り付けるには面倒くさいという問題が発生します。

書く側も、読む側も、楽をしたい。
そう思って解決策を探しました。

# 解決策

## シンタックスハイライトした結果
まずは結果を見てください。

before
<img width="668" alt="before.png" src="https://qiita-image-store.s3.amazonaws.com/0/82212/da200afd-296e-1fa2-b3fe-4bc77c5d0309.png">

after
<img width="632" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/82212/54be1d41-8352-5408-245c-31d1d5fc1802.png">

## まずざっくり説明
これ、beforeはネイティブアプリ、afterはChromeです。
**Chrome拡張のTampermonkey(Greasemonkey)のコードを書いて実現しました。**

* https://github.com/etsxxx/userscripts#slack-code-syntax-highlight 

**ブラウザでSlackなんてマジかよ・・・**　って思った方、私もそう思ってます。
ただ、以下のように使い分けると意外と便利だったりします。

* 通常のチャット用にネイティブアプリのSlack
* 作業進捗確認用にブラウザ版Slack (with Tampermonkey)

このようにネイティブアプリと並行で使うときに、合わせてTampermonkeyに入れておくと便利なUserScriptをメモしておきます。

* サイドバーを縮めたりできるようにする
    * https://github.com/wamei/slack-plugins

## コードについて補足
内部的に [google-code-prettify](https://github.com/google/code-prettify) を利用してシンタックスハイライトを実現しています。言語は `bsh` に固定しています。
このコードには言語の自動的な判別機能がありますが、チャットでのコードやコンソールログのやり取りのように、部分的に転載するようなテキストに対しては上手に判定が効きません。オペレーションの共有用ということで、 `bsh` を選択しています。

スクリーンショットを見ていただくと分かりますが、色の付け方としては正確性はありません。しかし、読みやすさはぐっと向上します。

`diff` に対しての色付けが上手くできないため、この点は改善が必要だと思っています。

なお、私はJavascript初心者なので、コードの作りに突っ込みどころが多いかもしれません。修正のPR大歓迎です。


# まとめ

以上、ブラウザ版を利用してTampermonkeyで装飾するという、なんとも残念な解決策でコードを見やすくした話でした。
Slackがネイティブでシンタックスハイライトに対応してくれることを願うばかりです。
【Docker for Windows】500 errorでportに接続できないときの対処法

# 対応まとめ
- 暫定対応：「Quit Docker」して再度Dockerを起動
- 恒久対応：電源オプションの「高速スタートアップを有効にする」のチェックを外す。

# 事象
コンテナ起動時に以下のエラーが出て、コンテナが立ち上がらない、もしくはコンテナは起動するがPortの接続に失敗する。

```
  APIError: 500 Server Error: Internal Server Error ("driver failed programming external connectivity on endpoint [コンテナ名]: 
  Error starting userland proxy: mkdir /port/tcp:0.0.0.0:5432:tcp:172.17.0.2:5432: input/output error")
```

# 原因
コンテナが立ち上がったままWindowsをシャットダウンすると、ポートの開放がうまくいかないケースが存在。
「高速スタートアップを有効にする（推奨）」という、シャットダウン後の起動を高速にするための電源オプションが原因らしい。
※オプションが有効になっていても同様のエラーが再現しないPCもあり。

# 対処法詳細
### 暫定対応策
Dockerアイコンを右クリックし、「Quit Docker」でDockerのプログラム自体を停止し、再度起動する。

### 恒久対応策
Windowsの電源設定オプションを変更する。

1. 「コントロール パネル > ハードウェアとサウンド > 電源オプション > 電源ボタンの動作を選択する」の順に移動。

2. 「現在利用可能ではない設定を変更します」をクリック。要Admin権限。

3. 「高速スタートアップを有効にする」のチェックを外す。

![docker_batteryoption.png](https://qiita-image-store.s3.amazonaws.com/0/163075/c3c6e211-806a-ff1d-6e69-95c5e20b6de7.png)


# 参考
https://github.com/docker/for-win/issues/1038
GolandのTerminalでzshを使う

普段zshを使っていたのですが、`Goland`導入時にIDEのTerminalの設定でハマったのでメモしておきます
JetBrainsのIDEは軒並みしたの方法で行けそう

# GolandのTerminalでzshを使う
1. Preference > Tools > Terminalを開く
2. shell pathにzshのパスを記載 e.g.) /bin/zsh
3. Shell integrationのチェックを外す

# 参考リンク
* https://intellij-support.jetbrains.com/hc/en-us/community/posts/208567485-Pycharm-terminal-is-missing-part-of-PATH

# ついでに追加したalias
```bash
alias goland='open -b com.jetbrains.goland $(ghq root)/$(ghq list | peco)'
```
ghq管理のリポジトリをpecoで選択してGolandで開けて便利
温度付きsoftmax 覚書

# 温度付きsoftmax (softmax with temperature)

## いつ使うか
モデルの蒸留なんかに出てくる損失関数 (多分他にも出てくるんだろうけどあまり知らない)．
「ちょっと高い確率で出てきたクラスを重視して学習したい！」とか「低い確率のクラスを切り捨てずに学習したい！」ときに使われる．  

## 数式

$$
S(y_i)=\frac{e^{\frac{y_i}{T}}}{\Sigma{e^{\frac{y_k}{T}}}}
$$

## 実装(Chainer)

```python
import chainer
import numpy as np

def softmax_with_temperature(x, temperature: float) -> chainer.Variable:
    return F.softmax(x / temperature)

softmax_with_temperature(np.array([[-1, 0, 1]], dtype=np.float32), 0.5)
```

## 温度による変化
- 温度($T$)が$1$より大きいとき: 低い確率を強調
- 温度($T$)が$1$より小さいとき: 高い確率を強調
- $y=e(x)$は$x$が大きくなると飛躍的に$y$が大きくなるので$T$が小さい→$x$が大きくなる→高い確率が強調される

例

```python
import numpy as np
from scipy.stats import norm
from matplotlib import pyplot as plt

def plot():
    n_classes = 10
    left = np.linspace(0, n_classes-1, n_classes)
    # 適当に平均4, 分散1の正規分布をつくる．
    p = np.array([[norm.pdf(x=i, loc=4, scale=1) for i in range(n_classes)]], dtype=np.float32)
    softmax_p = softmax_with_temperature(p, 1)  # 普通のsoftmax
    softmax_p_t1 = softmax_with_temperature(p, 0.1)
    softmax_p_t2 = softmax_with_temperature(p, 0.5)
    softmax_p_t3 = softmax_with_temperature(p, 2)
    softmax_p_t4 = softmax_with_temperature(p, 10)
    ps = [softmax_p_t1, softmax_p_t2, softmax_p, softmax_p_t3, softmax_p_t4]
    labels = ['T='+str(i) for i in [0.1, 0.5, 1, 2, 10]]
    colors = ['red', 'orange', 'yellow', 'green', 'blue']
    for i, p in enumerate(ps):
        plt.bar(left, p.data.flatten(), color=colors[i], label=labels[i])
        plt.legend()
        plt.show()
```
温度が小さいとラベル4の確率が強調され，温度が大きいと低かった確率が伸びてくるのがわかる．
結構この温度うまいこと調整しないと意図した以上に強調が起きそう．

![T0_1.png](https://qiita-image-store.s3.amazonaws.com/0/103789/49fc101c-86e9-9229-0d29-8fc93058240b.png)
![T0_5.png](https://qiita-image-store.s3.amazonaws.com/0/103789/691b316d-34fb-69a7-f566-9f19c5916619.png)
![T1.png](https://qiita-image-store.s3.amazonaws.com/0/103789/76e52667-506e-0864-3947-0e4d0b98d0d8.png)
![T2.png](https://qiita-image-store.s3.amazonaws.com/0/103789/4d2c3eeb-130a-f276-420f-a079c96c1a59.png)
![T10.png](https://qiita-image-store.s3.amazonaws.com/0/103789/b352115d-6bbd-bf9e-c9b4-dafe882eb708.png)
UI上の長い文字列の扱いを考えてみる

普段UI周り触らない~~(触れない)~~人がUI関連触ってみましたシリーズ。
シリーズと言いつつ続く予定は特に無いですが・・・ね・・・。

本題！

ゲームつくっててUIに文字乗っけていい感じにレイアウト決めて・・・
ってやってると

後々データ更新したときに想定してたより文字数多くてUI上の表示がおかしくなる
んで　またレイアウト切り直し

っての結構あると思います。
なので　そんなときどうするかをゆる～く考えてみました。

普段UIに関わるところ触らないので微妙かな　と思いますが・・・。

---
###パターン1 縮小or改行する
uGUIであれば一番楽な方法
最小値のフォントサイズ以下にならないのである程度制御が可能
ただしあまりにも多い場合は結局表示崩れが起きるし
改行も行数に応じて下地になるパネルとかのサイズの調整も必要になるし
それによって大きさがバラバラになって統一感が薄れる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275100/11577f45-2ce6-4feb-055d-3abd53c071d3.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275100/261cd31d-940a-55eb-be0c-178d90ba29da.png)
これはちょっと極端だけどもｗ

###パターン2 省略記号を出す
マスク範囲外に出ちゃう場合に【…】などで省略されてますよ
って言うのをわかるようにしてあげる。
フォントサイズの統一は可能だけど　文字が途中でぶった切られるので使い所によってはその文字が何を表しているのかがわからなくなってしまう。
クリックすると詳細が出る場合とかならまぁあってもいいかな？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/275100/e093a7b5-2007-52e4-7d40-d23abae60466.png)


###パターン3 スクロールする
マスク範囲外にで出ちゃった文字分一定時間かけてスクロールするようにしてみる。
こうすることでレイアウトを変えずともどんな長さの文字列にも対応可能
長すぎると全部見るのに時間かかったり、
いくつもスクロールしちゃうようだと画面がうるさかったりそもそも重くなってしまったりするので結局使い所に注意。
![8e806ba3-0bab-788f-3da2-35fac93b7961.gif](https://qiita-image-store.s3.amazonaws.com/0/275100/fe5a0cd6-9599-75c1-8c19-1c2be284c08a.gif)

###終わり
結局の所それぞれ使い所によるなっていう話
最初から最大文字数決めてそれに対応したレイアウト組めばいいんだけど
そうは行かないのが世の常。

配布アイテムの文言表示とかで想定外に文字数多くなったりってよくあるし(あるよね・・・？)

なので　ある程度プログラム上でこういう表現にできますよ
ってのがあると作りやすくなるんじゃないかな？

個人的にはスクロールが好き　
![gaeeeed.gif](https://qiita-image-store.s3.amazonaws.com/0/275100/46c9a952-1b2c-bf1d-5fc8-48dbf2635850.gif)
　

##参考させていただいたところ
https://qiita.com/nmxi/items/7950fb12ef925efa276d
https://qiita.com/lycoris102/items/219455968fbfd29fddc9
static 設定

■スタティックルート設定
172.16.0.252には、何も設定していないのでつながらないが、
以下のように設定を入れれば設定できる。

C:\WINDOWS\system32>route -p add 172.16.0.252 mask 255.255.255.255 133.220.11.186 metric 1
 OK!

C:\WINDOWS\system32>
C:\WINDOWS\system32>
C:\WINDOWS\system32>ping 172.16.0.252

172.16.0.252 に ping を送信しています 32 バイトのデータ:
172.16.0.252 からの応答: バイト数 =32 時間 =4ms TTL=63
172.16.0.252 からの応答: バイト数 =32 時間 =3ms TTL=63
172.16.0.252 からの応答: バイト数 =32 時間 =3ms TTL=63
172.16.0.252 からの応答: バイト数 =32 時間 =3ms TTL=63

172.16.0.252 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 3ms、最大 = 4ms、平均 = 3ms

C:\WINDOWS\system32>
失敗談その１

標準入力について

Rubyの標準入力である`gets`。

`gets`は「get string」との略で、コンソールからキーボード入力した
文字を「文字列として取得」するメソッドなのだが･･･

単純に`gets`は標準入力として値をとる物と思っており、
某試験でコンソールでキーボード入力した値を計算する、という質問が出て。

コンソールから入力した数値をそのまま計算するだけか、問題ないかなと
以下の文を書いてみたところ。

```ruby:

input_lines = gets

input_lines = input_lines ** 2

input_lines = input_lines * 6

puts input_lines

Main.rb:4:in <main>': undefined method **' for "6":String (NoMethodError)
Did you mean?  *
```

```

え、何このエラー？
`**`って乗算で使えたよな･･･？とうろたえ。
色々試してみたものの上手くいかずその問題については見事タイムオーバー。

後でたのしいRubyを確認してみたら`gets`は入力した文字は文字列として
取得すると･･･
さらに詳しく調べてみたら`gets`は「get string」の略ですよと知り。

じゃあこうするべきだったのかとプログラムを修正。

```ruby:

input_lines = gets.to_i

input_lines = input_lines ** 2

input_lines = input_lines * 6

puts input_lines
```

```

無事プログラムを動かすことが出来ました。
`input_lines`に代入されてるのは文字列なので計算できないよ！という
エラーだったのね･･･
GCEやColaboratoryのストレージに連続で書きこむと徐々に遅くなってくる件

表題の通り、GCE (Google Compute Engine)のストレージは連続で書いていると遅くなってきます。最初は制限がないけど徐々に制限がかかってくるという表現の方が正確かもしれません。これはGCPに限らず他のクラウド事業者でも同様だと思います[^1]。

[^1]: 「最初だけ速い」というのはわざとやっているわけではなく、仕組み上そうなっているんじゃないか、という意味です

この現象は、次のようなコマンドをシェル上で打ち込めば確認できます。

```
$ for i in $(seq 1 100); do dd if=/dev/zero of=./dd.$i.tmp bs=1M count=30;　done
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.0514848 s, 611 MB/s
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.0977361 s, 322 MB/s
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.191857 s, 164 MB/s

（略）

31457280 bytes (31 MB) copied, 0.842787 s, 37.3 MB/s
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.838682 s, 37.5 MB/s
30+0 records in
30+0 records out
31457280 bytes (31 MB) copied, 0.913719 s, 34.4 MB/s
```

最初は600MB/sとかで書きこめているのに、3GBほど連続で書き込んでいると最終的には40MB/s程度まで落ちてきます。

こうした環境ではiSCSI的なネットワークストレージを採用していて、かつ内部LANのどこかで[^2]QoSが掛かっているせいでこんな挙動になるんでしょう。

[^2]: それともストレージ側の機能で実現してるんですかね…？

GCEだけでなくColaboratoryのローカルストレージも同様で、デカいファイルを操作しようと思うと案外遅くて難儀します。

こうした環境で書き込み性能を稼ぎたいような場合は `/dev/shm` (tmpfs) でファイル操作を行うのも選択肢の1つでしょう。

また、GCE環境で予算が十分ある場合[^3]はストレージサイズを上げるべきでしょう。AWSやGCPではストレージサイズを上げるとIOPSが上がります。Colaboratoryの場合はお金が払えないので困りますね。

[^3]: お仕事で必要なら予算はつくはず
php Using Multidimensional Arrays


```php:qiita.rb
//2018.0731
//Using Multidimensional Arrays

$meals = array('breakfast' => ['Walnut Bun','Coffee'],
               'lunch'     => ['Cashew Nuts','White Mushrooms'],
               'snack'     => ['Dried Mulberries','Salted Sesame Crab']);

$lunches = [['Chicken','Eggplant','Rice'],
            ['Beef','Scallions','Noodles'],
            ['Eggplant','Tofu']];

$flavors = array('Japanes' => array('hot' => 'wasabi',
                                    'salty' => 'soy sauce'),
                 'Chinese' => array('hot' => 'mustard',
                                    'papper-salty' => 'prickly ash'));

print $meals['lunch'][1];
print $lunches[0][1];
print $flavors['Japanes']['hot'];

$prices['dinner']['Sweet Corn and Asparagus'] = 12.50;
$prices['lunch']['Cashew Nuts and White Mushrooms'] = 4.95;
$prices['dinner']['Braised Bamboo Fungus'] = 8.95;

$prices['dinner']['total'] = $prices['dinner']['Sweet Corn and Asparagus'] +
                             $prices['dinner']['Braised Bamboo Fungus'];

$specials[0][0] = 'Chestnut Bun';
$specials[0][1] = 'Walnut Bun';
$specials[0][2] = 'Peanut Bun';
$specials[1][0] = 'Chestnut Salad';
$specials[1][1] = 'Walnut Salad';
// Leaving out the index adds it to the end of the array
// This creates $specials[1][2]
$specials[1][] = 'Peanut Salad';

$flavors = array('Japanese' => array('hot' => 'wasabi',
                                     'salty' => 'soy sauce'),
                'Chinese'   => array('hot' => 'mustard',
                                     'pepper-salty' => 'prickly ash'));

foreach ($flavors as $curture => $curture_flavor) {
  foreach ($curture_flavor as $flavor => $example) {
    print "A $curture $flavor flavor is $example.<br>";
  }
}
$specials = array(array('Chestnut Bun', 'Walnut Bun', 'Peanut Bun'),
                  array('Chestnut Salad','Walnut Salad', 'Peanut Salad'));

for ($i=0, $num_spacials = count($specials); $i < $num_spacials ; $i++) { 
  for ($m=0, $num_sub =count($specials[$i]); $m < $num_sub; $m++) { 
    print "<br><br>Element [$i][$m] is " . $specials[$i][$m] . "\n";
  }
}
```
```php:qiita.rb
Element [0][0] is Chestnut Bun 

Element [0][1] is Walnut Bun 

Element [0][2] is Peanut Bun 

Element [1][0] is Chestnut Salad 

Element [1][1] is Walnut Salad 

Element [1][2] is Peanut Salad
```
```php:qiita.rb
$cities = array('New York'     => array('NY' => '8175133'),
                'Los Angeles'  => array('CA' => '3792621'),
                'Chicago'      => array('IL' => '2695598'));

$cities_a = array('New York'    => ['NY','8175133'],
                'Los Angeles' => ['CA','3792621'],
                'Chicago'     => ['IL','2695598']);

foreach ($cities as $city => $place) {
 foreach ($place as $city_abb => $people) {
      print "$city '의 약자는' $city_abb 이고 인구는 $people 입니다.<br>";
  } 
}

print $cities_a['New York'][0];
```
PG0でプログラミング研修をしてみた

# はじめに
[PG0](https://www.nakka.com/soft/pg0/)は、プログラミング学習を目的としたプログラミング言語です。
PG0の詳細は『[初心者用プログラミング言語「PG0」のススメ](https://qiita.com/nakka_/items/adfe04d701640a72015d)』を参照してください。

今回のプログラミング研修対象者はプログラミング経験者だが、アルゴリズムの組み立てが苦手とのことだったので、PG0を使ってアルゴリズムの組み立て方を学んでもらうことにしました。

プログラミング研修でPG0を使ってみる場合の参考にしてください。
　→ [PG0がプログラミング研修に向いている理由](https://qiita.com/nakka_/items/16c99e3279c87a70fafc)

# 解説
PG0について[チュートリアル](https://www.nakka.com/soft/pg0/tutorial.html)を使って解説しました。

- 開発ツールの使い方
  - プログラムを書く場所
  - プログラムの実行方法(実行、ステップ実行、カーソル行まで実行、停止)
  - プログラム実行中の変数の見方
- 言語仕様
  - 使える型は「整数型」と「配列」のみ
  - 使える分岐は「if、else」のみ
  - 使える反復は「while」のみ
  - exitで実行結果出力
- 演習問題の進め方
  - 次の項目参照

# 演習問題
演習問題はPG0用の[演習問題(PDF)](https://www.nakka.com/soft/pg0/PG0_question.pdf)を渡して解いてもらいました。

演習問題を解く際に **「Webで検索するのを禁止」** という制約を設けました。
これはWeb検索すると色々なプログラミング言語で書かれたアルゴリズムが出てくるためです。
アルゴリズムを考えるのが目的だったので考え方がわからない場合は私に質問することとしました。
考え方の質問があった項目は演習問題のヒントとしてフィードバックしました。

演習問題は完成したら私宛てにチャットでプログラムを送ってもらい、机上レビューを実施しました。

進捗は4日間で、全26問中、21問完了しました。
順次、分岐、反復の基本問題はすべて完了できました。
応用問題については2問完了できました。

- 1日目8問完了
- 2日目7問完了
- 3日目3問完了
- 4日目3問完了

# レビュー指摘事項
アルゴリズムは考え方を伝えることで組めていたため、レビュー観点としては今後業務でプログラムを書くにあたって意識した方がいいこととしました。
レビュー指摘事項は以下になります。

- **空白の統一**
  - 数字と演算子の間の空白の数を統一することで可読性が向上
  - 開発環境がフォーマットしてくれることが多い

```php
//修正前
var  x= 16
x=  x+5
x=  x/10 *10
```

```php
//修正後
var x = 16
x = x + 5
x = x / 10 * 10
```

- **冗長な書き方**
  - 正しく動作するが、if文とelse文で同じ処理を書いてあるのは無駄
  - 改造等で修正漏れとなりバグの温床になる

```php
//修正前
var b
if (a == 0) {
	a = 1
	b = a * 10  //これと
} else {
	a = 2
	b = a * 10  //これが同じ処理
}
```

```php
//修正後
if (a == 0) {
	a = 1
} else {
	a = 2
}
var b = a * 10  //ここのみで処理
```

- **動いてはいけない処理**
  - 本来動いてはいけない条件でif文やelse文が動くと予期しない動作をしてしまうためNG

```php
//修正前
var y
if (x > 0) {
	y = 1
} else {
	y = -1  //xが0の時にも動く
}
if (x == 0) {
	y = 0  //xが0の時はここだけ動いてほしい
}
```

```php
//修正後
var y
if (x > 0) {
	y = 1
}
if (x < 0) {
	y = -1
}
if (x == 0) {
	y = 0  //xが0の時はここだけ動く
}
```

- **計算値を使う**
  - 固定の数値を使うと汎用性が無くなる
  - 計算で出せるものは計算する

```php
//修正前
//cnt(正の値)の半分(奇数は切捨て)までループ
var cnt = 7
var i = 0
while (i < 3) {  //cntが6か7の場合しか正しく動かない
	i = i + 1
}
```

```php
//修正後
//cnt(正の値)の半分(奇数は切捨て)までループ
var cnt = 7
var i = 0
while (i < cnt / 2) {  //cntがどんな数字でも動く
	i = i + 1
}
```

# 振り返り
プログラミング研修を受けた方からヒアリングした内容です。

- 感想
    - 自分の基礎的な考え方がまだまだと感じた
    - ツールは特に問題無かった
- 良かったこと
    - 曖昧に覚えていたものが明確になった(配列やwhileなど)
    - ためになった
- 悪かったこと
    - 考え方を教えてもらわないと進めない場面があった
    - for文やインクリメントを使いたかった<br />
      →[「PG0.5」](https://qiita.com/nakka_/items/138f64bf4f5d6782e601)のモードを追加してfor文やインクリメントを使えるようにしました

# リンク

- PG0
    - [https://www.nakka.com/soft/pg0/](https://www.nakka.com/soft/pg0/)
- PG0でプログラミング入門
    - [https://qiita.com/nakka_/items/e2a7640c6ecbb8d5cb52](https://qiita.com/nakka_/items/e2a7640c6ecbb8d5cb52)
- PG0.5でプログラミング練習
    - [https://qiita.com/nakka_/items/138f64bf4f5d6782e601](https://qiita.com/nakka_/items/138f64bf4f5d6782e601)
- PG0がプログラミング研修に向いている理由
    - [https://qiita.com/nakka_/items/16c99e3279c87a70fafc](https://qiita.com/nakka_/items/16c99e3279c87a70fafc)
VisualStudioCodeで言語ごとの文字エンコーディングを指定する

VisualStudioCodeで、言語ごとの文字エンコーディングを指定する備忘録。

## 基本情報

* 執筆：2018/7/31
* OS：Windows10
* VisualStudioCode：Ver.1.25.1

## tl;dr(ここだけ読めば使えます)
User Settingsを以下のとおりにすれば可。（batファイルがutf-8とみなされ、文字化けしてしまう事象を回避するケース。）

```
"[bat]": {
    "files.encoding": "shiftjis"
}
```

## 変更手順
### User Settingsの表示
『ファイル >> 基本設定 >> 設定』（ショートカットは ctrl + comma）

### 言語名の記述
エラー防止のためVSCodeに自動生成させます。
『表示 >> コマンドパレット』（ショートカットは ctrl + shift + p）を選択すると以下の入力項目が出現し、フォーカスが移るので「lang」とタイプすると候補が出てきます。![20180731_001.png](https://qiita-image-store.s3.amazonaws.com/0/237065/a7d07b21-c65b-bccf-800b-381ebbfc163c.png)
ここで、「基本設定：言語固有の設定を構成します...」を選択すると以下の選択項目が出現します。![20180731_002.png](https://qiita-image-store.s3.amazonaws.com/0/237065/77ae6746-8795-21d6-2f70-55d79a50b1d1.png)
ここで、例えばC++を選択すると、

```
"[cpp]": {
       
}
```
と、User Settingsの中にブランクの設定エリアが出現しますので、あとは先に記載している文字エンコーディングの設定を手入力してあげるだけです。エンコーディングの指定方法（書き方）についてですが、一覧として掲載されているところが見当たらなかったため、ProgramFiles内に含まれるそれらしき定義(cli.js)から以下にまとめてみました。（よって一部誤りがあるかもしれませんがその際はご容赦ください。）

| 文字エンコーディング | ID(files.encoding設定値) |
|:-------------------|:------------------------|
|UTF-8|utf8|
|UTF-16 LE|utf16le|
|UTF-16 BE|utf16be|
|Western (Windows 1252)|windows1252|
|Western (ISO 8859-1)|iso88591|
|Western (ISO 8859-3)|iso88593|
|Western (ISO 8859-15)|iso885915|
|Western (Mac Roman)|macroman|
|DOS (CP 437)|cp437|
|Arabic (Windows 1256)|windows1256|
|Arabic (ISO 8859-6)|iso88596|
|Baltic (Windows 1257)|windows1257|
|Baltic (ISO 8859-4)|iso88594|
|Celtic (ISO 8859-14)|iso885914|
|Central European (Windows 1250)|windows1250|
|Central European (ISO 8859-2)|iso88592|
|Central European (CP 852)|cp852|
|Cyrillic (Windows 1251)|windows1251|
|Cyrillic (CP 866)|cp866|
|Cyrillic (ISO 8859-5)|iso88595|
|Cyrillic (KOI8-R)|koi8r|
|Cyrillic (KOI8-U)|koi8u|
|Estonian (ISO 8859-13)|iso885913|
|Greek (Windows 1253)|windows1253|
|Greek (ISO 8859-7)|iso88597|
|Hebrew (Windows 1255)|windows1255|
|Hebrew (ISO 8859-8)|iso88598|
|Nordic (ISO 8859-10)|iso885910|
|Romanian (ISO 8859-16)|iso885916|
|Turkish (Windows 1254)|windows1254|
|Turkish (ISO 8859-9)|iso88599|
|Vietnamese (Windows 1258)|windows1258|
|Simplified Chinese (GBK)|gbk|
|Simplified Chinese (GB18030)|gb18030|
|Traditional Chinese (Big5)|cp950|
|Traditional Chinese (Big5-HKSCS)|big5hkscs|
|Japanese (Shift JIS)|shiftjis|
|Japanese (EUC-JP)|eucjp|
|Korean (EUC-KR)|euckr|
|Thai (Windows 874)|windows874|
|Latin/Thai (ISO 8859-11)|iso885911|
|Cyrillic (KOI8-RU)|koi8ru|
|Tajik (KOI8-T)|koi8t|
|Simplified Chinese (GB 2312)|gb2312|
|Nordic DOS (CP 865)|cp865|
|Western European DOS (CP 850)|cp850|

弊社ではエンジニアを募集中です。
https://www.nittsu-infosys.com/recruit/2019/index.html
自動テストの時代に手動テストのことを考える

テストコードがないプロジェクトはありませんか？
そんなプロジェクトに限ってテスト仕様書がフリーフォーマットだったりします。
（GitHubにテスト用のissueを作って、フリーフォーマットでテスト項目書く、みたいな）

テスト仕様書を書いたことがない人がそのプロジェクトにJOINしたときに、わかりにくいテスト項目を書かれると、テストするほうはもちろん、テスト書いたほうも質問攻めになって生産性ガタ落ちです。

で以下のようなことに注意すれば、だいたい問題ないんじゃないかという考察。

## テンプレート化
- 例えば必須の見出しを決める（`テスト概要（目的）` `テスト対象（画面、バッチなど）` `テスト内容`）
- かっこつけて、概要、目的、対象、詳細とかするとわからなくなるからもっとカジュアルに崩す

### どんな問題か
- これはまあissue見ればわかるから明記する必要はない
- issueに書かれている内容以外にも関連する問題を対応したとかあれば追記する

### どう対応したか（issueから読み取れない場合）
- issueに仕様のやり取りがあっても、長かったら追うの大変なので、簡潔に結果をまとめる
    - 例えば、issueは単に「○○が一覧で見たい」だったとして
        - どの画面に追加するか、CSVで出力でいいのか、どんな項目があればいいか、検索条件は、とかの話し合いが行われていると、結局どうなったかわからない
        - その状態でつらつらテスト項目書かれても、どんな注意を払ってテストしていいかわからないから
        - 例えば検索条件を新規に追加したとしても、テスト者は新規かどうかわからないから、境界値テストとか抜けてしまう

### どのあたりを注意して（中心に）みてほしいか
- テスト項目並べただけだと機械的に実行してしまうため
- 細かく指定する必要はない
    - 例えば、速度改善の対応だけど、SQL変更したから、変更前後で出力結果が変わらないこともみてほしいとか

### どうやってテストすればいいか
- 粒度はテスト項目作成者にまかせる
- **上から順に流せるように書く**
    - なにも考えずに羅列すると、テストできないデータになっているかもしれない
        - フラグが変わった、作成日付が登録された、など
    - 必要があれば、`もう一度新規でデータを作り直す` `直接DBのフラグを書き換える` などの一言を入れる
- 何をするか、実行手順をしっかり書く
    - 例えば変更前後の出力結果を見てほしいって上記で書いたからと言って、実行手順は省略しない
    - わるい例：
        1. バッチを実行して結果を確認　←これだけだと手順が省略されているのできつい
    - よい例：
        1. ブランチをmasterに切り替える
        2. 次のコマンドでバッチを実行する → `xxx.sh xxx xxx`
        3. あとで比較するので、出力結果をどこかにコピーしておく
        4. ブランチをXXXXに戻す
        5. 2と同様のコマンドを実行する
        6. 3でとっておいた出力結果と比較して、同じ結果になっていることを確認する
    - テストコードを埋め込んでもらう必要があるときは、きっちり行数を指定するより、行数はざっくりで前後のコードを記述する ↓

----
例えば、
102行目に次のコードを追加
    
```php
var_dump($saveData);
```

よりも、
100行目あたりを以下のように変更

```php
$saveData = [
    'userId' => $userId,
    'data' => $this->getSaveData($userId),
];

var_dump($saveData); // ← ここを追加

if ($data = $this->TestModel->find('first', ['conditions' => ['userId' => $userId]])) {
    $saveData['count'] = $data ['TestModel']['count'];
```

のように指示したほうがわかりやすい。

----

- 結果がどうなればOKなのかを書く
    - 例えば、
        - `○○をクリックする` → `○○をクリックし、エラーなくCSVがダウンロードされることを確認`
        - `画面を確認する` → `××画面を開き、対応内容が反映されていることを確認`
    - `～が正しいこと` は人によっては文句を言ってくるので注意
        - 一般的にはエラーなく、デグレなく、改修内容が反映されていることと思うけど
        - 「正しい」とはどうなれば「正しい」のですか？って言ってくる人はいる

## 最後に
私がフリーフォーマットでテスト項目書くときに気を付けているのはこんなところです。
これ以外にも思いついたら追記するかもしれません。
他に何かあれば、コメントお願いします。
CentOS7へのElasticsearch6.3 のインストール

CentOS7環境へのElasticsearchのインストールについて纏めます。環境は次の通りです。

・CentOS 7.5
・Elasticsearch 6.3


タイムゾーンをJST に変更

```
# timedatectl set-timezone Asia/Tokyo
```

JDK のインストール

```
# yum -y install java-1.8.0-openjdk-devel.x86_64
```

[こちら](https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html)を参考に、PGP keyのインポートとElasticsearch の yum リポジトリの登録

```
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

# vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

#<b>Elasticsearchのインストール</b>

```
# yum install -y elasticsearch
```

サービスの起動

```
# systemctl enable elasticsearch.service
# systemctl start elasticsearch.service
```

起動の確認

```
# curl localhost:9200
```
```
# curl localhost:9200
{
  "name" : "9QZvJ8A",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "fYubptPbRTOzsRpMrg2rjw",
  "version" : {
    "number" : "6.3.2",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "053779d",
    "build_date" : "2018-07-20T05:20:23.451332Z",
    "build_snapshot" : false,
    "lucene_version" : "7.3.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
```

#<b>可視化用 Kibanaのインストール</b>

```
# yum install -y kibana
```

kibana.yml の設定変更

```
# vi /etc/kibana/kibana.yml
server.host: X.X.X.X    (サーバのローカル IP アドレスを指定)
```

Kibanaの起動とFirewallの設定

```
# systemctl enable kibana.service
# systemctl start kibana.service

# firewall-cmd --add-port=5601/tcp --zone=public --permanent
# firewall-cmd --add-service=http --zone=public --permanent
# systemctl restart firewalld
```

#<b>Kibanaへのアクセス</b>

http://サーバのIPアドレス:5601/

![Kibana.JPG](https://qiita-image-store.s3.amazonaws.com/0/251519/c704d8bf-5d6e-ce36-0ed5-779bbd1bc7ef.jpeg)
Styled Components の component selector パターンで React Components を指定する

Styled Components の component selector パターンで若干ハマったので備忘録として書き留める。

Styled Components は [component selector パターン](https://www.styled-components.com/docs/advanced#referring-to-other-components "styled-components: Advanced") を使用することで他のコンポーネントを参照することが可能である。

```jsx
const A = styled.div``;

const B = styled.div`
  ${A} {
  }
`;
```

しかし、component selector パターンで React Components を指定するとエラーが発生する。

```jsx
class A extends React.Component {
  render() {
    return <div />;
  }
}

const B = styled.div`
  ${A} {
  }
`;
```

> TypeError: Cannot call a class as a function

勿論、 Functional Components もエラーが発生する。

```jsx
const A = () => <div />;

const B = styled.div`
  ${A} {
  }
`;
```

> TypeError: Cannot convert a Symbol value to a string

このエラーの原因としては、 component selector パターンは、 Styled Components のコンテキスト内でのみサポートされているためである。
上記の `A` コンポーネントは React.Component のインスタンスであり、Styled Component ではない。

`styled()` ファクトリー関数で React Component をラップすることで解決することができる。

```jsx
class A extends React.Component {
  render() {
    return <div />;
  }
}

const StyledA = styled(A)``;

const B = styled.div`
  ${StyledA} {
  }
`;
```

React Components を `import` した後、 `styled()` ファクトリー関数で毎度ラップするのが面倒な場合は、 `export` 時にラップしてあげれば良い。

```jsx
export default styled(A)``;
```

詳細については以下の記事を参照してください。

[全ての React コンポーネントを Styled Component として export すべきでは？というお話 - Qiita](https://qiita.com/kotarella1110/items/a7ce1a031afa61ba44ad)
sassでsyntax errorがでたよ

![スクリーンショット 2018-07-31 15.33.17.png](https://qiita-image-store.s3.amazonaws.com/0/274417/e273834a-ef32-4f6a-e422-d5c00f3e55a3.png)

```
Sass::SyntaxError in Messages#index
Showing/User/Username/space/application.html.haml whereline #6raised:

invalid CSS after"... height32px"::expected"{,was
```
sassで構文エラー出まして、どこの構文かなぁと思っていたら
どうやら、インデントが少しづれていたみたい。。。

なので、height等のインデントを揃えてあげると、うまく動いたよ〜〜。

やったね！
MacbookにインストールしたUbuntuのUpdateをしたらWi-Fiが使えなくなった

MacbookAirにデュアルブートでインストールしているUbuntuのアップデートをしたら、Wi-Fiが使用できなくなりました。メニューからWi-Fiが消えてしまいました。
(OSはUbuntuですが、GUIはLXDEを使用しています。)

![wifi.png](https://qiita-image-store.s3.amazonaws.com/0/136933/34cc75c2-7b7e-1759-f8f6-e9dfd81cefee.png)

### 注意
作業をするためには、Wi-Fi以外でネットワークに接続する方法を確保する必要があります。
Ubuntuは、iPhoneやWiMAXであればUSB-Etherとしてデバイスを認識させてインターネットに接続することができるので、事前に動作確認しておきましょう。

## Wi-Fiのドライバを再インストール
Wi-Fiのドライバの再インストール用コマンドなのですが、これを実行してもエラーで停止してしまいます。
```
sudo apt-get install --reinstall bcmwl-kernel-source
```
### ログファイルの内容

```
sudo apt-get install --reinstall bcmwl-kernel-source
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 0 not upgraded.
Need to get 0 B/1,126 kB of archives.
After this operation, 0 B of additional disk space will be used.
(Reading database ... 225024 files and directories currently installed.)
Preparing to unpack .../bcmwl-kernel-source_6.30.223.141+bdcom-0ubuntu2_amd64.deb ...
Removing all DKMS Modules
Done.
Unpacking bcmwl-kernel-source (6.30.223.141+bdcom-0ubuntu2) over (6.30.223.141+bdcom-0ubuntu2) ...
Setting up bcmwl-kernel-source (6.30.223.141+bdcom-0ubuntu2) ...
Loading new bcmwl-6.30.223.141+bdcom DKMS files...
Building only for 3.16.0-31-generic
Building for architecture x86_64
Building initial module for 3.16.0-31-generic
Error! Bad return status for module build on kernel: 3.16.0-31-generic (x86_64)
Consult /var/lib/dkms/bcmwl/6.30.223.141+bdcom/build/make.log for more information.
modprobe: FATAL: Module wl not found.
update-initramfs: deferring update (trigger activated)
Processing triggers for initramfs-tools (0.103ubuntu4.2) ...
update-initramfs: Generating /boot/initrd.img-3.16.0-31-generic

sudo modprobe wl
modprobe: FATAL: Module wl not found.
```

### 最新版のドライバパッケージをダウンロードする。
自分の場合は、18.04向けですが、このページから最新のパッケージをダウンロードしました。

https://launchpad.net/ubuntu/bionic/amd64/bcmwl-kernel-source/6.30.223.271+bdcom-0ubuntu4

ここをクリックして、パッケージをダウンロードします。
![2018-07-31-145442_1440x900_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/136933/6f9c5f24-8a13-432d-e23f-0b59a18a6d70.png)



### このパッケージをインストール
```
cd ~/ダウンロード
sudo apt-get install ./bcmwl-kernel-source_6.30.223.271+bdcom-0ubuntu4_amd64.deb
```
この作業で正しくWi-Fiのドライバをインストールすることができて、使用できるようになりました。
AWS SDK for Ruby を LocalStack で利用する際の設定について

先程ハマって解決できたのでメモを残しておきます。

開発時等で LocalStack を利用する際に aws sdk を使って s3 upload/download などをすると TCP エラーになるかと思います。この問題を解決するための設定が以下になります。(以下は rails 環境で s3 のみ設定する例です。)

```ruby
endpoint = ENV['AWS_S3_ENDPOINT'].to_s
if endpoint.present? && endpoint =~ /(localstack|localhost|127\.0\.0\.1)/
  Aws.config[:s3] = {
    endpoint: ENV['AWS_S3_ENDPOINT'].to_s,
    force_path_style: true,
  }
end
```

`force_path_style` を `true` にすることで endpoint に bucket 名が含まれなくなり意図した endpoint に接続できるようになります。
lazuriteでSW

#概要
lazuriteでSW（スイッチ）やってみた。

#写真

![CIMG2672.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/b2c5bf13-0f3f-8392-0deb-f5530ea1c72b.jpeg)


#回路図

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/f5f5493e-0508-e290-2ddf-4f638d2c271f.png)


#サンプルコード

```
void setup() {
	pinMode(7, INPUT_PULLUP);
	pinMode(6, INPUT_PULLUP);
	Serial.begin(115200);
	Serial.println("start");
}

void loop() {
	if (digitalRead(7) == LOW)
	{
		delay(100);
		if (digitalRead(7) == LOW)
		{
			Serial.println("7 on");
		}
	}
	if (digitalRead(6) == LOW)
	{
		delay(100);
		if (digitalRead(6) == LOW)
		{
			Serial.println("6 on");
		}
	}
}
```


以上。
AndroidでSingletonを使っていいのか

# 結論
「Android Singleton」で検索すると、Singletonを使うなという記事がたくさん出てきます。
しかし、公式のAndroid Developersには以下の通り「ほとんどのケースでは、Applicationのサブクラスを作るよりも、static Singletonの方がいい」と書いてあるので、使って大丈夫です。

> [Android Developers: Application](https://developer.android.com/reference/android/app/Application)
> Note: There is normally no need to subclass Application. In most situations, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), include Context.getApplicationContext() as a Context argument when invoking your singleton's getInstance() method.

# 参考情報

- [SO: Singletons vs. Application Context in Android?](https://stackoverflow.com/a/3827166)

>I prefer singletons over Application because it helps keep an app much more organized and modular -- instead of having one place where all of your global state across the app needs to be maintained, each separate piece can take care of itself. Also the fact that singletons lazily initialize (at request) instead of leading you down the path of doing all initialization up-front in Application.onCreate() is good.

- [Qiita: ContextのおさらいとApplicationContextをどこからでも参照できるようにする方法](https://qiita.com/eimei4coding/items/0585b8240873ec5e9c20)

> シングルトン（staticオブジェクト）のように、その寿命がApplicationの寿命と同じである場合、ApplicationContextを渡すのが望ましい

- [Kotlinでいい感じにSingletonパターンを書く](https://qiita.com/Shoeshock/items/a9dfc0c9df277971fde3)
vagrantを使ってdocker, docker-compose入りでホストOSとディレクトリ共有するCentOSを手に入れる方法

# 背景
普段dockerを使う際はCoreOSを使って作業をしていたけど、CoreOSにはvimが入ってなくてムキーってなったり、`ll`って打ってムキーってなったり、日本語フォントが入ってなくてムキーってなったりして効率が悪かったので、使い慣れたCentOSで作業したかった
※CoreOSにログインして作業をやるべきではないというのは置いていてください。。。

# やりたいこと
- vagrantを使ってCentOS7を立ち上げる
- CentOS7にdockerをインストールする
- CentOS7にdocker-composeをインストールする
- ホストOSとゲストOS(CentOS7)でディレクトリ共有する

# 前提条件
- vagrant がインストールされていること

# ディレクトリ構成
ディレクトリ構成はこんな感じ

```bash
${root_dir}
  - share         # dir
  - bootstrap.sh
  - Vagrantfile
```

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  config.vm.network :private_network, type: "dhcp", ip: "192.168.100.101"

  config.vm.synced_folder "./share", "/home/vagrant/share", id: "share", :nfs => true, :mount_options => ['nolock,vers=3,udp']

  config.vm.network :forwarded_port, host: 80, guest: 80

  config.vm.provision :shell, path: "./bootstrap.sh"
end
```

```shell:bootstrap.sh
# SELinux Permissive
sudo setenforce 0

# set timezone JST
sudo timedatectl set-timezone Asia/Tokyo

# EPEL
sudo yum install -y epel-release

sudo yum install -y vim git

# install docker
sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-selinux \
                docker-engine-selinux \
                docker-engine
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
sudo yum-config-manager \
  --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce

# install docker-compose
sudo mkdir -p /opt/bin/
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` > ./docker-compose
sudo mv docker-compose /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# vagrant user add docker group
sudo gpasswd -a vagrant docker

# docker running
sudo systemctl enable docker
sudo systemctl start docker
```

# 実行

```bash
$ cd ${root_dir}
$ vagrant up && vagrant ssh

･･･省略･･･

[vagrant@localhost ~]$
[vagrant@localhost ~]$ docker --version
Docker version 18.03.1-ce, build 9ee9f40
[vagrant@localhost ~]$ docker-compose --version
docker-compose version 1.21.2, build a133471
[vagrant@localhost ~]$ ll
drwxrwxrwx. 1 root    root    4096 Jul 30 10:54 share
[vagrant@localhost ~]$
```

# 終わりに
やりたいことが出来た！
php strlen, str_word_count

# 문서의 길이
```ruby:qiita.rb
<?php
echo strlen("Hello world!"); 
?> 
```
# 공백 포함
```ruby:qiita.rb
<?php
echo str_word_count("Hello world!"); // outputs 2
?>
```
# Syntax
```ruby:qiita.rb
define(name, value, case-insensitive)

<?php
define("GREETING", "Welcome to W3Schools.com!");
echo GREETING;
?>

<?php
define("GREETING", "Welcome to W3Schools.com!", true);
echo greeting;
?>

<?php
define("GREETING", "Welcome to W3Schools.com!");

function myTest() {
    echo GREETING;
}
myTest();
?>
```
Vue.jsのvue-routerを使ってネストしたコンポーネントにプロパティを受け渡す

## はじめに

Vue.jsを使ってアプリを開発しているものの、まだまだ勉強することが多いです。


今回、以下のような方を対象に記事を作成しています。

- vue-routerを使ってルーティング、コンポーネントの管理をしている
- ネストしたコンポーネントに対して、プロパティの値を受け渡したい
- URLのパスを使ったマッチングで値を受け渡すのではなく、テンプレート内で解決したい

## 前提
プロジェクトはvue-cliを使って初期化されたものを使用しています。

```
$ vue init webpack my-project
```

## 手順
### vue-routerを使用して単一コンポーネントを取り込む
```src/router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import Parent from '@/components/Parent'
import Child from '@/components/Child'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/parent',
      component: Parent,
      children: [
        {
          path: '/',
          components: {
            child: Child
          }
        }
      ]
    }
  ]
})
```

```src/components/Parent.vue
<template>
  <div class="parent-sample">
    <h2>Parent</h2>
    <input type="text">
    <!-- 単一コンポーネントを取り込み -->
    <router-view name="child"/>
  </div>
</template>
<script>
</script>
```

```src/components/Child.vue
<template>
  <div class="child-sample">
    <h2>Child</h2>
  </div>
</template>
<script>
</script>
```


#### ポイント
- index.jsのchildren内のコンポーネントの名称は、defaultではなく名前付きにすることで、今後複数のコンポーネントをネストすることになっても対応できる
- index.jsのchildren側のcomponentではなくcomponents

### 単一コンポーネントにプロパティを設定する

####ポイント
- router-viewにv-modelディレクティブを使ってプロパティを指定する。（今回のサンプルでは省略記法を採用）

```src/router/index.js(変更なし)
import Vue from 'vue'
import Router from 'vue-router'
import Parent from '@/components/Parent'
import Child from '@/components/Child'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/parent',
      component: Parent,
      children: [
        {
          path: '/',
          components: {
            child: Child
          }
        }
      ]
    }
  ]
})
```

```src/components/Parent.vue
<template>
  <div class="parent-sample">
    <h2>Parent</h2>
    <input v-model="key2">
    <!-- 単一コンポーネントを取り込み -->
    <router-view name="child" :key1="key1" :key2="key2" />
  </div>
</template>
<script>
export default {
  data: function () {
    return {
      key1: true,
      key2: 'foo'
    }
  }
}
</script>
```

```src/components/Child.vue
<template>
  <div class="child-sample">
    <h2>Child</h2>
    <p>{{key1}}</p>
    <p>{{key2}}</p>
  </div>
</template>
<script>
export default {
  props: {
    key1: Boolean,
    key2: String
  }
}
</script>
```

## まとめ
以上で、Vue.jsのvue-routerを使ってネストしたコンポーネントにプロパティを受け渡すサンプルが完成です。inputに入力した値がChildコンポーネントに反映されるはずです。

## 課題
vue-routerを使うとルーティングが非常に楽になるのですが、コンポーネントのネストがどれくらい深くできるのか調べていません。まぁ、深くならないように設計するのがベストとは思いますが。

## 参考(すべて公式ドキュメント)
プロパティ https://jp.vuejs.org/v2/guide/components-props.html
フォーム入力バインディング https://jp.vuejs.org/v2/guide/forms.html
名前付きビュー https://router.vuejs.org/guide/essentials/named-views.html
【Mysql】データベースのidを連番に変更する

テストの投稿があまりにも増えすぎてIDが半端なくスカスカ、なにがなんだかわからなくなってました。。。。
現状入っているデータを連番に出来ないと思って調べると以下のコードでIDを連番に変更できた。

```sql
SET @i := 0 ;
UPDATE `column` SET id = (@i := @i +1) ;

SET @i := 0 ;
UPDATE `カラム名` SET id = (@i := @i +1) ;
```

注意点として、変更するテーブルがリレーションしていると、関連テーブルは変更されないと思うので要注意です。