OmniAICreator/Qiita-1.07M huggingface dataset:
Twitterのフォローとフォローバックの悩みを考える。SNSのインターフェイスが社会力学に与える影響。

Twitterのフォローとフォローバックの悩みを考える。SNSのインターフェイスが社会力学に与える影響。

# Points

- Twitterはフォローされたらフォローを返すべきなの？人間関係的なあれで
- それとも自由に、そもそもの機能としての、単なるフォローをすべきなの？
- フォロワー1000人を目指している人もいるけど、それは何が嬉しいの？

# Twitterで悩んでいることの1つは、フォローすることとフォロー外す事についてです。

![image](https://user-images.githubusercontent.com/13635059/51093478-42f8da00-17e7-11e9-95ea-1a4d7ff1bd04.png)
￼

これは多くの人が悩んでいることなのではないでしょうか。Twitterのユーザならいちどは同じことを考えたことがあるかもしれません。もしかしたら。

#	Twitterのフォローとユーザ個人の趣味趣向と理解

Twitterのフォローの運用というのは人によってそれぞれの趣味嗜好が出るものですね。だから一口にフォローといっても、そこには様々な社会的な力学が働いているわけです。

1つはフォローを数字だと考えている人。ゲームのように数字を伸ばしたいと考えている人。

1つはフォローを単なる数字だと考えている人。それよりもリアルな人間関係というか、量より質こそが大事だと考えている人。

1つはフォローそもそものTwitterのコンセプトである所の、単にその人の情報を見たいものだと考えている人。フォローと言うその言葉の定義を忠実に理解している人。

1つはフォロー社会的な行為だと感じ取っている人。これが大多数かもしれませんね。Facebookやミクシィの友達申請のように、人間関係の1部としてフォローを理解している人。

#	フォローはただのフォローなのに

システム的なフォローと社会学的なフォローはまた別軸で流れています。SNSの世界においては、1つのシステムが存在するときには、ただシステムという枠にそれを留めておくことができません。

1つのシステムが存在する所には、必ず社会的な働きが生じます。これは絶対に断ち切ることができません。

だからフォローをシステムに過ぎないと考える人がいても、実際の働きとして、社会力学が生じているじゃないかと考える人がいても、これはどちらも正しいのだと思います。

#	人間関係に失礼なTwitterユーザ

だから僕はこのシステム的なフォローと、社会学的なフォローの間で気持ちが引き裂かれてしまいます。

ただシステムを考えるならば、自分のフォローをしたい人をフォローして、手に入れたい情報だけを手に入れて、タイムラインをクリーンに保っておけばよいでしょう。

だけど逆に、確かに、恋愛の一方通行というか、自分がフォローしていないのに絶対にフォロー返してくれない人に対しては、社会的な、心理的な不満を感じてフォローをはずしたりしてしまう自分と言うユーザに気付いたりするのです。

だから、Twitterのフォローを単にシステムだと考えている人も、きっと無意識にどこかでは、人間関係の仕組みの1つとしてフォローが働いていることに気づくのではないでしょうか。ユーザという自分自身によく目を凝らして敏感になれば。

#	だからTwitterもある時ついに、フォローはしているけど、タイムラインからはミュートすると言う機能を追加しましたね。

これはTwitterにおいて、システムよりも社会力学的な面が大きくなって、ついにもともとのシステムを溢れ出した瞬間と言えるかもしれません。

僕自身もTwitterのフォローどのような運用で回していけばいいかまだ答えが出ていません。話が長くなりましたのでまたこの点については別のトピックに書き記したいと思います。

#	システムに対しての自分自身の理解を他のユーザに対して宣言する


要するに、フォローと言うシステム1つとってみても、個人個人によってシステム的に理解しているか、社会的な働きとして理解しているかが違い、そのバランスもいろいろなので、ユーザの間にいろいろなギャップが生じているのではないかと思います。

これを埋めるには、やはり、Twitterのプロフィールなので、自分自身がフォローと言うものをどう考えているかについて言及することがベストなのかもしれません。

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues












<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Codableで型を保ったままUserDefaultsに保存する

`UserDefaults`はちょっとしたデータ保存に便利です。
保存するとき`Struct`や`Class`をそのまま保存できれば便利ではないですか？
それができるのです。
`UserDefaults`は`Data型`を保存可能です。
またStruct、ClassをSwift 4から導入されたCodableプロトコルに準拠すれば、Data型にエンコードできます。
これを組み合わせることで、型をまるごと保存することが可能です。

#　開発環境
* Xcode 10.1
* Swift 4.2

# ソースの全体像

```swift
import Foundation

protocol Storable {
    func data(forKey: String) -> Data?
    func set(_ data :Any?, forKey: String)
}

// テスト用スタブのため
extension UserDefaults: Storable{}

// 責務：データの永続化
struct StoreManager {

    let store: Storable

    init(store: Storable = UserDefaults.standard) {
        self.store = store
    }

    func save<T: Codable>(value: T, key: String) throws {
        do {
            let encodedData = try JSONEncoder().encode(value)
            store.set(encodedData, forKey: key)
        } catch let error {
            throw error
        }
    }

    func load<T: Codable>(key: String) -> T? {
        guard let data = store.data(forKey: key) else { return nil }
        do {
            let decode = try JSONDecoder().decode(T.self, from: data)
            return decode
        } catch let error {
            print(error.localizedDescription)
            return nil
        }
    }
}
```

## 解説 データの保存

```swift
    func save<T: Codable>(value: T, key: String) throws {
        do {
            let encodedData = try JSONEncoder().encode(value)
            store.set(encodedData, forKey: key)
        } catch let error {
            throw error
        }
    }
```

の`let encodedData = try JSONEncoder().encode(value)`にてCodableに準拠した型をData型に変換しています。

そして`store.set(encodedData, forKey: key)`でUserDefaultsに保存をしています。

## 解説　データの読み出し

```swift
    func load<T: Codable>(key: String) -> T? {
        guard let data = store.data(forKey: key) else { return nil }
        do {
            let decode = try JSONDecoder().decode(T.self, from: data)
            return decode
        } catch let error {
            print(error.localizedDescription)
            return nil
        }
    }
```
`guard let data = store.data(forKey: key) else { return nil }`でUserDefaultsからData型を読み出します。
`let decode = try JSONDecoder().decode(T.self, from: data)`で読み出したData型をデコードします。

# まとめ
Codableに準拠したインスタンスをUserDefaultsに保存する方法を解説しました。
型情報があるととても便利です。
ぜひ使ってみてください。
Qiitaのタグからの流入はもう死んでしまったのだろうか？

Qiitaのタグからの流入はもう死んでしまったのだろうか？

最近久しぶりにQiitaのトレンドに記事が載ってみてわかったけれど、いいねがつく数の激しさの違いがすごすぎる。

タグ流入はもう死んでしまって、Twitter経由などで最初の着火を迎えた記事が、トレンドでさらに上り詰める、富めるものはさらに富む世界になったのだろうか。

アクセス解析とかしてないので実感でしかないポエム。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9767df52-8a69-79cc-875f-4805026cf5e4.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6b0b5794-b813-9c34-da48-7dfd9b779b7a.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
テーブルにカラム作成のため、マイグレーションファイルを実行したところ、NoMethodErrorが発生

テーブルにカラムを作成するため、マイグレーションファイルを実行したのですが、

rake aborted!
NoMethodError: undefined method `new' for Blog:Module

と表示され、カラムがPHPに作成されません。
newというメソッドはまだどこにも作っていないのに、このような表示が出るのはなぜでしょうか。
よろしくお願いします。
ユーザー努力の限界点とデバイスの技術的限界点との間にあるベストポイントについて考えたい。by 不器用すぎるエンジニア

ユーザー努力の限界点とデバイスの技術的限界点との間にあるベストポイントについて考えたい。by 不器用すぎるエンジニア
￼
![image](https://user-images.githubusercontent.com/13635059/51093241-dc72bc80-17e4-11e9-9256-e1fccccff2ac.png)

# ベストポイント

このことについて割とずっと語りたかった。

ユーザが器用になると言う事と、デバイスを選ぶと言うこと。このどちらかに偏りがちかもしれないけど、ユーザーは自分の努力でデバイスをハックして、肉体的にも手先の動作を訓練したりして、最適を目指すことができる。

# 不器用なエンジニア

僕は最近自分で手足がすごく不器用なことに気づいて、デバイスにただ期待していた自分に気づいた。

だけど自分の体の動作とかを器用にすることによって、デバイスやソフトウェアに対応することができることにも気づいた。僕としては、自分の体の動作を改善させることができるなんて、全くそんな発想はなかったのだ。灯台もと暗しというか。

#	重なり合う部分

ユーザのハックとデバイスは、お互いに寄り添いあって、ベストなポイントを見つけるのが良い。

なんというか実際にはもう少したくさんの軸が流れていて、良いデバイスを選ぶのもユーザ自分自身だし、そのデバイスの使い方を向上させるのも自分自身と言うユーザだし、時代の流れでデバイスやサービス自体が進歩すると言う時期もあるし、実際には3つの場を描くことができるかもしれない。

ただ、ここで言いたいのは、デバイスの進歩をまったり、良いデバイスを選ぶと言う軸の他にも、自分自身の動作や学習をすると言う宿も、はっきりと理解して認識しておいた方が良いと言うポイントだ。

#	デバイス軸とユーザー軸

例えば今iPhoneで音声入力をしながらテキストを書いているのだけれど、デバイスの軸しか持っていないと、音声入力の日本語の認識精度が悪い時に、なんだこれは使えないじゃないかと思って、これを使うのやめてしまうかもしれない。

だけど、全く灯台もと暗しなのだけど、そもそも自分がはっきりと聞き取りやすい日本語をしゃべることによって、デバイスの足りないところを補うというか、歩み寄ることができる。

ちなみにここで言うデバイスと言うのは、ざっくりとした言い方で、デバイスで扱える色々な機能やサービス全般のことを示す。

# このように、僕らエンジニアは特に

デバイスやサービスの至らない点を、不満足を覚えてただ単に文句を言うだけかもしれない。だけど逆に自分の肉体と言うデバイスをハックして、その扱いを向上させることができるのだ。

これは職種によっては思いもよらないと思う人もいるかもしれないけど、どうやら少なくとも僕と言うエンジニアはとにかく不器用なので、ユーザによる肉体的なハック、ユーザ学習による適用をあきらめてしまっていた部分があると思う。これは本当に最近気づいたことだ。

#	 そして思う事は、ユーザの努力と、デバイス側の努力は

それぞれが中心点を目指して歩み寄るべきだということだ。そこにベストなポイントがある。

ユーザにも、これ以上は喋るときの滑舌は良くなれないぜと言う限界点があるし、デバイスの側にも、今現在の技術的な限界と言うものがある。どんなに良いデバイスやサービスを選んだとしても、現時点でのマックスに歩み寄れる時点と言うのはあるのだ。例えば、Googleやアップルの技術をもってしても、音声入力の精度が完璧にはまだ遠いみたい。

#	僕らが1番素晴らしいデジタルユートピア生活を送るためには

デジタルそれじゃあ大作戦を遂行するためには、最高のデバイスを選び、最高の把握を行い、そして自分自身の肉体的動作も把握して、最高のマウンテンポイントというか、高みに登れるいただきのポイントを見つけるべきなのだ。


それが幸せなデジタルライフ生活に直結するのだと思っている僕。


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
JUCEで作ったアプリでBluetooth MIDIの設定ダイアログを出す

たった1行でOK。ただしiOSとAndroid以外では非対応。

```sample.cpp
juce::BluetoothMidiDevicePairingDialogue::open();
```

サンプルプロジェクトを作った。
https://github.com/masanaohayashi/Ring2JUCETips/tree/main/IOSAudioDeviceTest1
Twitterのリプライと引用リツイートの違いってなんだろう？ユーザーインターフェイスが人間の行動を変えるのが不思議で仕方ない。

Twitterのリプライと引用リツイートの違いってなんだろう？ユーザーインターフェイスが人間の行動を変えるのが不思議で仕方ない。

# これを言語化してみたら2019年すげー爽やかな気分だぜ。ちょっとだけ謎が解けた気がするぞ。


![image](https://user-images.githubusercontent.com/13635059/51093208-7e45d980-17e4-11e9-82a4-1fd45a9cdaf8.png)
￼

#	そうそうTwitterのリプライと引用リツイートの違いの話です。

初心者には全然違わないじゃんて思えるけれど、人間全員が同じルールで動くことで、社会力学が変わるんだな。

最初僕はTwitterの引用リツイートとリプライの違いが全然わからなかった。

もちろんシステムの違いがわかるけど、それはどうやって使い分けたらいいかがまるで見当がつかなかった。

どういう時にリプライをすべきなのか、どういう時に引用リツイートをすべきなのかと言う事がわからず、言語化できず、なぜその小さな違いがTwitter全体では大きな違いとなり、うねりを生み出しているのかがわからなかった。

#	ファミコンとスーパーファミコンの違いがわからないお母さんみたいな感じ

これは、実際に自分がTwitterを使ってみなければわからない感覚なんだな。

昔のお母さんと言うものは、ファミコンとスーパーファミコンどころか、ファミコンとプレイステーションの違いもわからず、全部ファミコンと呼んでしまうみたいな感じで。

ファミコンに興味のないお母さんにとっては、すべてのゲーム機はファミコンなのだ。たとえプレイステーション4であろうとNintendo Switchであろうと、いまだにファミコンと呼び続けている世界のどこかのお母さんは存在することであろう。

それと同じように僕もTwitterで他の人と関わることを全くしていなかったときには、リプライと引用リツイートが一体どんな本質的な違いを持っているのかについて、実感として全くわかっていなかったのだと思う。

#	なかなか言語化できない、システムが社会性のうねりを生み出すことについて

それにしても、リプライと引用リツイートはとても似ているように見えるけれど、全く性質が違って、本質的な差を生み出していることがどうしても不思議でたまらなかった。

だってTwitterのアプリのフラットなユーザインターフェースで見たら、本当に大した違いなんかあるわけないと思えるではないか。

だけど僕は最近ついに思い至った。オレオレのユリーカ。

#	多くの人間が同じルールで動くと言う事

Twitterはただのサービスでありアプリケーションにすぎないけれど、ほんの些細なシステム上の違いであっても、そのわずかな角度が、積算では大きな違いとなる。

なぜかというと、リプライや引用リツイートと言うシステムの上で、膨大なユーザがルール作りを無意識的に行って、多くの人間が同じルールで動くようになるからだ。この社会力学的作用は、参加するユーザが多ければ多いほど兄弟で確固たるものになる。

つまりTwitterで言うと、リプライがダイレクトに相手に投げかける行為。引用リツイートはちょっと遠くから眺めるもの。

こういう暗黙的なルールの上に多くのユーザが共通認識を持っているがゆえに、アプリケーションのインターフェイスの枠を超えて、リプライはダイレクトなもの、引用リツイートは距離感のあるものとして社会的に機能するのである。

#	サービスを利用しているのはやはり人間とその人間の集合なんだな

つまりユーザインターフェイスが直接的にユーザ行動や反応の違いを生むのではなくて、房インターフェイスによって生み出された人間の理解や暗黙的なルールが、一段クッションを置いて、社会的な働きを生み出しているのだと考えられる。

このことがわかって、ユーザインターフェースの謎がまた1つ解けたように僕は思った。

ユーザインターフェースというとても無機質なものがなぜ有機的な人間の行動を変えてしまうのか。本当にこれは不思議で少しでも言語化したいと常々思っていたことだ。

これで少しだけすっきりしたぞ。爽快な気分だ。ハハハ！


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
React Reduxでオブジェクトの一部のプロパティだけ更新したい

## 概要
React Reduxでstateにオブジェクト形式で値を保持する場合、画面から何かしら更新が発生した場合にstateの一部のプロパティだけ、更新したいケースがあると思います。どういうふうに実装したらよいか少し悩んだので、結果のメモを残しておきます。
## 実装メモ
下記のように2つのアクションタイプで更新するプロパティを各々の、ものだけにするときの実装方法です。対象はreducersになります。

```reducer.js
const initialState = {
  testObject: {
    name1: '',
    name2: ''
  }
};

export default function inputReducer(state = initialState, action) {
  switch (action.type) {
    case 'INPUT_NAME1':
      return {
        testObject: {...state.testObject, name1: action.payload.name1}
      };
    case 'INPUT_NAME2':
      return {
        testObject: {...state.testObject, name2: action.payload.name2}
      };
    default:
      return state;
  }
}
```
nodenvの使い方とか


###  まえがき
いろいろ考えたが、`nodenv` をしばらくmacで使うことにした。
その他の候補は一応メモっとく。

### セットアップ

```
brew doctor
brew install nodenv
```

### 基礎コマンド

```
$ which nodenv
/usr/local/bin/nodenv

$ nodenv help

$ nodenv version //現在のnodeのバージョン

$ nodenv versions //使用可能なnodeのリスト
```

### 環境変数

以下を `bashrc` に設定して、`.bash_profile` から読み込んだ

```
export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"
```

### 動作確認

上記の設定を終え、ちゃんと使えるかを確認した。

```
node -v
npm -v
```


### nodenv

```
nodenv install 10.15.0 //vはいらない

nodenv global 10.15.0 //グローバルに指定

nodenv versions
* 10.15.0 (set by /Users/abc/.nodenv/version) //現在
  8.15.0
  9.11.2

cd ~/someProj/ && nodenv local x.xx.xx //そのプロジェクトだけそのバージョン
```

※詳しいことはここらへんで
https://qiita.com/1000ch/items/41ea7caffe8c42c5211c
https://joppot.info/2016/10/17/3210
https://qiita.com/tonkotsuboy_com/items/5322d226b6783d25b5df
https://qiita.com/daskepon/items/e47f7ee3ade252cdf2e6
http://resistance-underground.hateblo.jp/entry/2018/04/27/123138
https://joshmorel.ca/blog/node-virtual-environments-with-nodenv/
https://github.com/nodenv/nodenv


### その他の候補とか

nodebrewのインストール
https://qiita.com/takeshi81/items/805f504503cd93151ca6
https://parsetree.jp/blog/20180828/

nodebrew本体の削除
https://medium.com/@nagofox/brew-uninstall-nodebrew-8b10254c747f
https://qiita.com/tonkotsuboy_com/items/f5d17f0b9698554a7716

nvm
https://qiita.com/sansaisoba/items/242a8ba95bf70ba179d3
https://note.mu/o_matsuo/n/n748e0503fc3a

tj/n
https://github.com/tj/n

### あとがき

nodenv と別に  ndenv ってのがあるがコンセプトは一緒。
だが、コミットが活発なので nodenv だったからそっちにしたけ。
とりあえず様子見。
論文まとめ：ANOMALY DETECTION WITH GENERATIVE ADVERSARIAL NETWORKS

# はじめに
ICLR 2018 から以下の論文
[1] L. Deecke, et. al. "ANOMALY DETECTION WITH GENERATIVE ADVERSARIAL NETWORKS"
のまとめ

論文のページ
https://openreview.net/forum?id=S1EfylZ0Z

関連記事としてGANsを使ったモデル anoGAN のまとめ
https://qiita.com/masataka46/items/09e4e13be097a68174cd

特にanoGANとの違い、という観点でまとめる


# 概要

まずanoGANと同じ点。

- GANsを使った異常検知モデル
- GANsで正常データを生成するよう学習した後に、与えられた画像に対応するノイズを探索することでその画像が正常か異常かを判定する

次にanoGANと違う点。

- ノイズ探索フェーズにおいて、$z$ の初期値を複数とり、異常scoreの算出においてはそれらの平均値を用いる
- ノイズ探索フェーズにおいて、generatorのパラメータも更新する
- ノイズ探索、及び異常scoreの算出にdiscriminatorの出力（または中間層の出力）を用いない

# ノイズ探索フェーズのアルゴリズム

以下（[1]algorithm 1）がノイズ探索フェーズでのアルゴリズム。

<img width="975" alt="ADGAN_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/759b6bd4-b418-9445-1e95-1e0b59cd2031.png">

ロス：$l$
generatorのパラメータ：$\theta$ 
ノイズ：$z$

### ノイズ探索の学習

anoGANと同様にノイズ $z$ を勾配降下法で更新する。

```math
z_{j,l} \leftarrow z_{j,l-1} - \gamma \cdot \nabla_{z_{j,l-1}} l (g_{\theta_{j,l-1}} (z_{j,l-1}), x)
```

anoGANと違ってgeneratorのパラメータも更新する。

```math
\theta_{j,l} \leftarrow \theta_{j,l-1} - \gamma_{\theta} \cdot \nabla_{\theta_{j,l-1}} l (g_{\theta_{j,l-1}} (z_{j,l-1}), x)
```

<font color="MediumBlue">generatorのパラメータまで更新してしまって大丈夫なの？って疑問が湧くだろう。更新された $g'(z)$ は正常値で学習した $g(z)$ とは異なるので、それで正常・異常の判定ができるのか？と。</font>

その辺、Bojanowski[2]とかに書かれているらしいが、ちゃんと読んでません。

### 異常scoreの算出
anoGANと違って探索は $z$ の初期値を変えて $n_{seed}$ 回行う。 異常scoreはこれらの平均値とする。

```math
A(x) = \frac{1}{n_{seed}} \sum^{n_{seed}}_{j=1} {l}(g_{\theta_{j,l-1}} (z_{j,l-1}), x)
```


 

# reference
[2] P. Bojanowski, et. al."Optimizing the Latent Space of Generative Networks"
yamlのアンカー機能でDeploymentのラベル付を少し楽にする

# 目的
- 運用管理のためにリソースにlabel付を強制したい
- Deploymentでは`deployment.metadata.label`だけでなく`deployment.spec.template.metadata.label`にもラベルを付けたい
    - Deploymentが作成するReplicaSetやPodなどにもラベルをつけるために`deployment.spec.template.metadata.label`のラベル付が必要
    - 絶対忘れるので`deployment.metadata.label`を設定するだけで良いようにしたい

# 対策
- label付強制の方法は別途検討(OPAなどのvalidationを利用）
- `deployment.spec.template.metadata.label`にラベルつけ忘れる問題に対しては、yamlのアンカー機能を利用する

# yamlのアンカー機能とは
- YAML では、データに「&name」で印をつけ、「*name」で参照することができる
    - 前者をアンカー (Anchor)、後者をエイリアス (Alias) という
    - 参照の方法にはいくつか種類があり、以下ではExtend（`<<`）を利用する
- 詳しくは「 [YamlのAnchor&、Extend<<、Extended Inline<< &について - Kekeの日記](https://www.1915keke.com/entry/2018/08/08/025328)」を参照


# やってみる
- `deployment.metadata.label`のラベルを`deployment.spec.template.metadata.label`で参照するようにする

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels: &top_labels
    name: paper2
    version: v1.0
    app: nginx
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        <<: *top_labels
    spec:
      containers:
      - image: nginx
        name: nginx
```

これをKubernetesに適用すると以下のような結果になります。

```bash
⇒ kubectl get all --show-labels
NAME                        READY   STATUS    RESTARTS   AGE   LABELS
pod/nginx-dfcb86c9c-twzks   1/1     Running   0          19m   app=nginx,name=paper2,pod-template-hash=dfcb86c9c,version=v1.0
...

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
deployment.apps/nginx   1/1     1            1           19m   app=nginx,name=paper2,version=v1.0

NAME                              DESIRED   CURRENT   READY   AGE   LABELS
replicaset.apps/nginx-dfcb86c9c   1         1         1       19m   app=nginx,name=paper2,pod-template-hash=dfcb86c9c,version=v1.0
```


`deployment.spec.template.metadata.label`にlabelを付けているのでpodやreplicasetにもラベルが付きました。
この設定により、ラベルを指定したpodの選択ができたりします。ツールによってはpodのラベルを指定するようなツールもあるので利用できます。

```bash
⇒ kubectl get po -l app=nginx
NAME                   READY   STATUS    RESTARTS   AGE
nginx-5c7588df-8f8fz   1/1     Running   0          2m6s
```

# まとめ
アンカー機能を用いてDeploymentのラベル付を簡易化しました。付け忘れ防止にもつながると考えています。
CodersRank.ioを使ってGitHub上でのスキルを数値化し、ランキングをチェックしてみる

こんにちは、[@y_temp4](https://twitter.com/y_temp4)です。

みなさんは [CodersRank](https://codersrank.io/) というサービスをご存知でしょうか？

![スクリーンショット 2019-01-13 16.13.06.png](https://qiita-image-store.s3.amazonaws.com/0/90682/88e7d2a1-1d87-849e-2eed-7da42c9adffa.png)

イメージとしては日本だと [Findy](https://findy-code.io/) のようなサービスです。
GitHub 連携をして、GitHub でのコントリビューションなどを元に自分のスキルを数値化し、その数値からユーザーのランキングを算出できるようになっています。

## さっそく登録してみる

右上のRegisterボタンから登録ができます。ちなみに、自分の評価結果はこんな感じでした（2018年1月13日現在）。

![スクリーンショット 2019-01-13 16.16.37.png](https://qiita-image-store.s3.amazonaws.com/0/90682/b32de49d-fee1-2110-7642-5bf52db2cacb.png)

このサービスの面白いところは、自分の住んでいる地域を登録すると、その地域でのランキングも表示してくれる点です。

自分はなぜか現時点だと Vue で日本一位になってしまっていますが、おそらくこれは日本での登録ユーザーが少なすぎることが原因だと思います😅

ちなみに CodersRank の [Increase my ranking](https://codersrank.io/increase-my-ranking/) というページによると、

> - コミット数
- コミットの時間
- コミットしたリポジトリのサイズとスター数
- その他のデータ

がスコアに影響しているようです（コミットの時間はいまいち分かりませんが）。おそらく自分の Vue のスコアは、[このリポジトリ](https://github.com/AlisProject/frontend-application)の影響が大きそうです。

## その他の機能

また、CodersRank には [LeaderBoard](https://profile.codersrank.io/leaderboard) という機能もあり、ランキングを地域や技術から絞り込んで検索することもできます。

<img width="1245" alt="スクリーンショット 2019-01-13 16.26.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/90682/27f02a96-3390-d300-089c-bb1188d588b1.png">

その他にも、登録すると仕事のオファーのようなものが表示されますが、このサービスの開発元の地域（ヨーロッパあたり）にある会社しか表示されないため、あまり日本のユーザーにとっては実用的とはいえないですね😅

## さいごに

この手のサービスが算出するスコアにどれくらい信憑性があるかは分かりませんが、ランキングが出るのは面白いので、気が向いたら試しに登録してみるのもいいかな、と思います👍

[CodersRank](https://codersrank.io/)
KotlinでInstantiationException: No default constructor for entityになった時の解決策

```kotlin:Exceptionが発生するコード
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id

@Entity
data class Car (var brand: String,
                var model: String,
                var color: String,
                var registerNumber: String,
                var year: Int,
                var price: Int,
                @Id
                @GeneratedValue(strategy = GenerationType.AUTO)
                var id: Long)
```

デフォルト値を設定しないとエラーが発生するとのことなので、各フィールドにデフォルト値を設定したらエラーが解消した。

```kotlin:Exceptionが発生しないコード
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id

@Entity
data class Car (var brand: String = "",
                var model: String = "",
                var color: String = "",
                var registerNumber: String = "",
                var year: Int = 0,
                var price: Int = 0,
                @Id
                @GeneratedValue(strategy = GenerationType.AUTO)
                var id: Long = -1)
```

## 参考

- [Spring Boot（Kotlin） + Flywayでサーバサイドアプリケーション作ってみた](https://qiita.com/morimorim/items/2447048c0275c843b89c)
VSCodeでUnityのコード補完やインテリセンスが効かなくなる時の対処

自分用メモです。

## 対処

Unityのメニュー `Assets > Open C# Project` から開くと各種ファイルが生成される。

## 原因

この「各種ファイル」が正しく生成されていないとコード補完やインテリセンスが効かなくなる模様。
UnityやVSCodeの挙動をちゃんと理解できていないのも原因だった。勉強になった。

## 参考
https://gomafrontier.com/unity/1936
世界の全てがGitになる事は正義かもしれない。妻とLINEで路線情報のスクリーンショットをやり取りしていて思ったぞ。

世界の全てがGitになる事は正義かもしれない。妻とLINEで路線情報のスクリーンショットをやり取りしていて思ったぞ。

￼
![image](https://user-images.githubusercontent.com/13635059/51092859-c4e50500-17df-11e9-8942-c140fd66a3ac.png)


# 二回のスクリーンショットの差分は？

今日妻との待ち合わせで、Yahoo!路線情報の路線図を妻が送ってきてくれたんだけど、待ち合わせ時間を変えて欲しいらしくて、次にまた新しいスクリーンショットが送られてきた。

だけど夫である僕は、その差分を、目でチェックして、待ち合わせ時間が10分後になったと言うことを自分で理解しなければいけなかった。これにはなかなか高いコストがかかる。

# 路線情報のgitがあれば良いな

だけどこんな時にGit的な差分を表示する仕組みがあったらなかなか便利だろうと思った。僕らの脳と言うのは差分を検出するのには向いていないみたいだから。と言うよりも、物事の本質的に、差分の検出と言うのはそもそも難しかったりするのかなあ。

いやいや、差分と言うものの大元にはデータが存在するわけだから、その固定されたデータさえあれば、そして、そのデータを上手に扱うことさえできれば、差分検出は人間よりずっとうまくできるはずなのだ。

# 翻訳家もgitを使う時代

最近文筆業、小説家や、デザイナーさえもGitを使い始めた時代であると言うから、日常生活の中へ、もっときっとGit的なものが混じり込んできてもおかしくは無い。

ちょうどかゆいところに手が届く感じで、きっと的なものが、今後に人間の生活のコストをどんどん下げてくれて言ったらいいのになぁ。

日常エンジニアリング論でした。

---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
C++望洋本を初心者におすすめしない理由

#はじめに
　これは，中学生プログラミング初心者がC++を望洋本で学ぼうとしたときの挫折記録である．
　現在筆者はC++，Java，Python，JavaScript，HTML/CSSなどを習得．
　経験から一般法則を導き出そうとする帰納法という魂胆．
　私は中学校からプログラミングをはじめましたが，すべて実体験です．

#当時の開発環境
○PC……Windows8 Dynabook(TOSHIBA)
○CPU……Intel Corei7
○メモリ……RAM 8GB
○グラボ……オンボード

#C++を選んだ理由
##ゲーム開発に優れている
　そう，私はDirectXを使ってゲーム開発をしてみたかった．
　MMORPGを一人で開発してみたいなどと，今では全く思わないような無謀なことを考えていた．
　そのため，
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330590/218aaef6-ef50-c059-3a3f-367a334f6901.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330590/34d68ff9-cf72-2d73-628a-aa11e25baa10.png)
　などといったまさに技術書を買い漁っていた．今思えばとんだ散財だったと思う．当然，本が劣っていたのは本ではなく，私の頭だ．
　塾が個人塾でパソコン使い放題だったので，ろくに勉強もせず先生にDirectXのリファレンスページの和訳を補佐してもらっていた．
##遅いが速い
　遅いというのは習得までが遅いという意味であり，業界のスピードスターである．
　私も玄人向けの高速言語というところにひかれ，まんまとその罠（もともと仕掛けられてもいない）にハマってしまった．

#中学生，望洋本を買う
「プログラミングを始めたい」．筆者は中学生の時に初めてそう思った．理由はなんとなくかっこよかったから．
　プログラミングを職業にしたいと考えてなどいなかった．
　そんな私はノンプログラマーの両親に市内の大型書店につれられ，プログラミングコーナーへと直行．
　そしてプログラミングコーナーで大きくC++と書かれた場所でこの本に出会う．↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330590/b04261e9-d340-d9c1-e8d9-fe4792a27de1.png)
　C++を選んだ理由は上記．
　私が買った当時は第２版だった．
　選んだ理由は解説がとても詳しそう．今でも一部を覗いてその思いは変わらない．

#最初の挫折
　List1-1．「まずは画面に表示」とうたった最初の章で，以下の言葉にである．
「コンパイルの手順やプログラムの実行方法は処理系によって異なりますので，マニュアルなどを参照して作業を行いましょう」
　ちょっと何言ってるかよくわからない．

　当時全くの初心者だったため，コンパイルと処理系がわからなかった．
　そのため，「コンパイル」と調べてみたところ，
「プログラムのソースコードをコンピューターが実行可能な機械語に翻訳すること」ｂｙコトバンク
　やっぱり何言ってるかわからない．
　ソースコードの説明はあったため，機械語について調べてみるも，なんだか怪しげなやばい言語としかわからなかったため，諦めて「処理系」を調べてみることに．
「コンピューターのプログラミング環境のこと」
　あ，そうなの．．．
　結局，「コンパイラ　C++　おすすめ」で調べることを思いついたのは，３日ほど後だった．

#次の挫折
　C++の挫折ポイントは複数あるが，私が中でも強調したいのはこちら．

**「おもしろくない」**

　そう，テストプログラムはちっとも面白くない．
　ポインタなどの説明は面白く，配列が腑に落ちた部分が多かったのだが，一番はこれだった．
　結局，ポインタを学び終えて文字列への接続あたりで止めてしまった．

#クッション
　当分C++などやる気にはなれなかった．
　しかしプログラミングを諦めるのは嫌で手にとったのはなぜかこの本．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330590/fa0e72c6-a478-6f14-423a-23ee8d64ae4a.png)
　超入門シリーズはどこらへんが神かというと，**初心者でも面白い**というところを一番に強調したい．
　とにかく面白かった．
　簡単なRPGを作るところは特にハマり，後に重要な，「エンジニアの知的生産術」の言葉を引用すると「実践」となる，「プログラムの自作」をすることができた．

　そしてプログラミングの面白さを思い出し，現在ではちゃっかり望洋本の上級編まで終わらせている．

#まとめ
##C++望洋本の対象とは
○プログラミングの初心者ではない人
○例題が面白くなくても忍耐力のある人
○コツコツ学べる人
○超重要な基礎を本格的に網羅的に学びたい人（オライリーで代用可）
　である．
　まずC++といえばコンパイラ言語，とスラスラ分かる人でなければ難しいだろう．
##おすすめ入門本
　その上でおすすめしたいC++の入門本がこちら．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330590/0c9c79d2-686d-89a3-f4fb-78c196980bab.png)
　「やさしい」と聞くと「やさしい理系数学」のように胡散臭いと思ってしまいがちだが，これは本当に優しい．
　Visual Studioの導入から本格的に説明しているからだ．
　しかし個人的には，g++を使ったコンパイルをおすすめしたいと思う．
　要するに，

**「C++望洋本はプログラミング入門者向けではない」**
Kerasで学習したモデルをUnityで使う時の注意点

# Kerasで学習したモデルをUnityへ
Unity内でエラーが出ましたので
見つけた対処法をまとめます

## 1.Kerasで出力ノードの名前をyにしました

```python:
predictions = Dense(16, activation='softmax', name='y')(x)　##出力ノード名をyに
```
このままUnity内で、出力ノード名を**y**で設定したところ

```python:
NullReferenceException: Object reference not set to an instance of an object
```
このようなエラーが出て動きませんでした
## 2.学習済みモデルをテキストで書き出して中を見ると

![errocapr.jpg](https://qiita-image-store.s3.amazonaws.com/0/339755/ada1b67a-b86c-b740-1c98-7a39c566f150.jpeg)
出力ノード名が"**y/Softmax**"に書き換わっています


## 3.Unity内で出力ノード名を書き直します
調べた結果に合わせて、出力ノード名を"**y/Softmax**"にしたところ
エラーはでなくなりました
テキスト解析、日本語の文章解析して間違えを指摘してくれる Yahoo API を見つけた。

テキスト解析、日本語の文章解析して間違えを指摘してくれる Yahoo API を見つけた。

# iPhone音声入力で入力した日本語をスペルチェック、文章修正したいけどGoogleでも無理。

そしたら見つけたやつ

[テキスト解析:校正支援 - Yahoo!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/jlp/kousei/v1/kousei.html)


# 元テキスト

なんだかんだ言って、コストの高さを少しでも感じているなら、そのアクションは続かないことが多い。湯沢何度も何度も努力を強いられることになるから。ユーザインターフェースに大手行って1回のステップの数が重大な重みを帯びてくると言うのはここだ。

例えば僕は、ブログに技術的な記事を書くときに、1番最後に自分のTwitterへのリンクを署名としてつけている。だけど、これをMacBookの素早いキーボードショートカットで一瞬で出せはするものの、そこで今、にかいのキーボードアクションが必要な状態だ。

これはものの一瞬で行うことができるのだけれど、2回のアクションと言うことがだんだんと重みを帯びてくる。肉体が、僕の手と足がそのにかいのアクションを格闘ゲームの必殺技のように1階のチャンクで認識できれば良いのだろうけれど、ユーザの脳がチャンクをまとめて学習しない限りは、それがどんなに瞬断的なアクションの連続であろうとも、アクションは脳に対して理解と認識されるのではないだろうか。

# [文章校正ツール](https://so-zou.jp/web-app/text/proofreading/)

解析はしてくれたが自動修正はしてくれないっぽい。

![image](https://user-images.githubusercontent.com/13635059/51092259-97e12400-17d8-11e9-9f4b-0e7ad2990d20.png)

# Gmail

日本語無理。

![image](https://user-images.githubusercontent.com/13635059/51092281-d24ac100-17d8-11e9-995c-42580f90eed8.png)

# Googleが無理ならもう無理では

# google ドキュメント

![image](https://user-images.githubusercontent.com/13635059/51092318-29509600-17d9-11e9-94f1-6f5845fe45eb.png)
![image](https://user-images.githubusercontent.com/13635059/51092320-29e92c80-17d9-11e9-8706-e5a2af9d2c64.png)

こちらも英語のみ対応？

![image](https://user-images.githubusercontent.com/13635059/51092330-48e7be80-17d9-11e9-9a72-4bc7c933ebf4.png)


# [日本語校正サポート](https://www.kiji-check.com/)

Yahoo 系らしいので最初のと同じ

# [テキスト解析:校正支援 - Yahoo!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/jlp/kousei/v1/kousei.html)
こんなのがあるらしい。

API 経由で自作で頑張ればなにかできそうなきもした。


---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PowerApps モデル駆動型アプリとDynamics365

# 記事の趣旨
PowerAppsのモデル駆動形アプリを使うことで、Plan2のライセンス（月額4,320円）で
Dynamics365を（ダッシュボードやグラフ、ワークフローなどの機能が使える）をベースとした
アプリケーションの開発ができます。お得だと思います。
自分もまだまだ勉強中ですが調査結果をまとめました。

# PowerAppsとは
ノンプログラミングでアプリケーションを作成できるサービスです。
アプリケーションの種類は2種類あります。
下図は作成をアプリの作成を押したところです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/72fb82d8-e9f4-bb12-7cc6-5e2de2dabebc.png)

・「キャンバス型アプリ」
一般的にイメージとして浸透しているのはこちらのような気がします。
PowerPointのようなUIでアプリを作れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/84703ed1-583f-b39f-ed86-a7d775efb204.png)
・「モデル駆動形アプリ」
見た目はDynamics365で、URLも[環境名].crm7.dynamics.comとなっています。
グラフやダッシュボードなど、Dynamics365の機能を使用できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/f0451aaf-4b91-56c2-8b1a-2115e2bc06e1.png)


# モデル駆動形アプリを使用するメリット
## ライセンスについて
https://powerapps.microsoft.com/ja-jp/pricing/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/b4eb656e-f553-d7a6-a0f5-e93ec86c5fe3.png)

PowerApps Plan2で使用できます。
Dynamics365 Customer Engagementは12,350円で、PowerApps Plan2は4,320円です。

PowerAppsにはSFA（営業支援）などの機能はありませんが、それらを使用しない場合はPowerAppsを活用したほうがお得です。
以前より不動産の土地データを管理したい場合など
SFA機能は特に不要だがDynamics365を適用できないかという場面がありましたが、
そういう場面で活用できればいいなと思っています。

## Common Data Service(CDS)の活用
CDSは様々なデータと連携しやすいデータベースというイメージです。
まだ試せていませんが、CDSは他システムやcsvファイルからのデータ統合が可能です。
他システム連携はバッチやWEBアプリの開発が必要なイメージがありますが、
最近ではWEBAPIによるデータ連携が考慮されたシステムも多く（特にクラウド）
WEBAPIがある場合にはそのままCDSにデータを取り込めるパターンもあると思われます。

CSVファイルならば多くのシステムは出力可能だと思われるので、
初期導入では、CSVファイルの連携でとりあえず運用してみるということも考えられます。

詳しくは私がよく参考にさせていただくMS吉田さんの１時間弱の下記のウェビナーがとても参考になりました。
https://info.microsoft.com/JA-DynOps-WBNR-FY19-12Dec-13-Businessapplicationdevelopmentsixth-MCW0010620_02OnDemandRegistration-ForminBody.html

## PowerBI, Microsoft Flow, PowerAppsキャンバスアプリとの連携
利用に制限はありますがPowerBiやFlowも使えるので、
CDSに蓄積したデータをPowerBIで分析したり、FlowでSharePoint等との連携したりできます。
上記で書いたキャンバスアプリも、同じCDSに対して作成可能なので
例えば、各営業担当はキャンバスアプリでデータ入力、マネージャーはモデル駆動型アプリで実績を分析する
などすれば、便利ではないでしょうか。
こんなイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/f13c0d57-2c3c-c493-ca16-844af72f03a9.png)
Spring Boot in KotlinでLoggerの宣言方法が分からなかった時のメモ

```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CardatabaseApplication {
  private static final Logger logger = LoggerFactory.getLogger(CardatabaseApplication.class);
  public static void main(String[] args) {
    SpringApplication.run(CardatabaseApplication.class, args);
    logger.info("Hello Spring Boot");
  }
}
```

```kotlin
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class CardatabaseApplication

val logger: Logger = LoggerFactory.getLogger(CardatabaseApplication::class.java)
fun main(args: Array<String>) {
	runApplication<CardatabaseApplication>(*args)
    logger.info("Hello Spring Boot")
}
```

## 参考

- Hands-On Full Stack Development with Spring Boot 2.0 and React(Packt)
- sdeleuze/spring-boot-kotlin-demo(GitHub)
2進数を利用した組み合わせ(Combination)生成による与えられた文字列中の全ての文字列を返すコード

2進数を利用した、Combination生成による、与えられた文字列に含まれる全ての文字列を返すコード。

Combinationを求めるアルゴリズムは、技術評論社刊、「C言語による最新アルゴリズム辞典」（奥村晴彦　著）を参考にしました。（2進数を用いた非常に巧妙な方法です）

順序は入れ替わりません。

for terminal.

```alice.c
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
int	N; 
int	K;
int	t;
typedef unsigned long set;
char	word[1024];
#define	first(n)	((set) ((1U << (n)) -1U))

set nextset(set x)
{
		set smallest,ripple,new_smallest,ones;

	smallest = x & -x;
	ripple = x +smallest;
	new_smallest = ripple & -ripple;
	ones =((new_smallest /smallest) >>1)-1;
	return ripple| ones;
}
void printset(set s)
{
	int	i;

	for(i=1;i<=N;i++) {
	if (s & 1) printf("%c",word[i-1]);
	s>>=1;
	}
	printf("\n");
}

void conv()
{
	int i;
	set x;

	x=first(K);
	while(! (x&~first(N))) {
		printf("%5d :",t); printset(x);
		x=nextset(x); t++;
	}
}
int main(int argc,char *argv[]) {

	if (argc!=2) {
		fprintf(stderr,"Usage alice word\n");
		exit(0);
		}

	sscanf(*(++argv),"%s",word);
	N=strlen(word);
	t=1;
	for(K=1;K<=N;K++) {
		conv();
		}
}
```

特に環境依存的なところはないので、Cの開発環境があれば、簡単にコンパイルができます。

To compile: `cc alice.c -o alice`
Usage: `alice word`
実行結果：

```
$ alice alice
    1 :a
    2 :l
    3 :i
    4 :c
    5 :e
    6 :al
    7 :ai
    8 :li
    9 :ac
   10 :lc
   11 :ic
   12 :ae
   13 :le
   14 :ie
   15 :ce
   16 :ali
   17 :alc
   18 :aic
   19 :lic
   20 :ale
   21 :aie
   22 :lie
   23 :ace
   24 :lce
   25 :ice
   26 :alic
   27 :alie
   28 :alce
   29 :aice
   30 :lice
   31 :alice
$
```
Q.非同期I/Oを使わない理由とは？　A.使う理由がないから。

[2019年にもなって未だに非同期I/Oを使わずPHP、Python、Ruby等でProcessを浪費しているサービスが増える理由とは！](https://qiita.com/YukiMiyatake/items/9904ed5b481e3f307bba)

釣り記事ですね。以下、問題点を上げる。

## 学習コストという概念が抜け落ちてる

人は新しいことを覚えようとするのにそれなりの労力や金銭が必要なもので、これを「学習コスト」と言う訳なんだけれども、この記事にはそこへの言及が全くないことから、筆者には学習コストの概念が全く抜け落ちていることが分かる。

いくらパフォーマンス的に優秀なやり方があっても、それを使うためのコストがそれに引き合わないんでは「じゃあ使わない」という結論を出す方が人として当然だし賢い。

別に趣味でやるんなら勝手にすればいいけれども、使おうとしない人を

> 新しい言語、フレームワークを覚えたくない人
> 特定言語にこだわる人
> 非同期対応の言語を覚えられない人

などと言って馬鹿扱いするのは単純に間違っていて、そんなことを言う方が馬鹿だとしか言いようがない。

このあたりの記述はさっさと取り消し線を入れておいたほうがいい。

## そもそもパフォーマンスを必要とされるかどうか

パフォーマンスに関しては個々の案件で判断されるもので、開発速度やらメンテナンスコストが重視されるなら旧来からの使い古されたシステムを使うほうがいいし、膨大なアクセス数が見込まれるならパフォーマンスの出るシステム（非同期I/Oだけじゃなくて最新ハードウェアを導入する等色々）を使わないといけないだろう。

そうした検討の上でその結果非同期I/Oを使われなかったということは「そこまでのパフォーマンスが必要とされなかったから」だったり「パフォーマンスがコストと見合わないと判断されたから」というだけの話になる。

## 筆者のプログラマーとしての資質への疑問

記事内容から、**この記事の筆者はプログラマーとしての徳に欠ける**と判断する。

ここで言う「徳」とは「プログラマー三大美徳」のことで、

1. 怠惰
2. 短気
3. 傲慢

この3つのうち今回は特に**「怠惰」の徳に欠けている**。

これは学習コストを無視していることから分かることで、言ってしまえば「努力教」の人であり、プロジェクトで一番ボトルネックになるタイプ。

要するに、プログラマーに向いてないので転職したほうがいいのでは？　と思う。
rxjs6 でクリックとドラッグを識別する

## TL;DR

[サンプルコード](https://jsfiddle.net/hivesbee/46uyqwm7/) があるのでそれでだいたい分かると思う。

## はじめに

同じ DOM に対して クリック処理とドラッグ処理をさせたいときってありますよね？
rxjs6 ならそこそこ楽に書けますよ。

## 実装

まずこちらの html と css を用意して

```html
<div id="sample" />
```

```css
#sample {
  position: absolute;
  top: 100px;
  left: 100px;
  width: 100px;
  height: 100px;
  background-color: #00a1e9;
}
```
`#sample` に対するクリックとドラッグの識別をやってみます。

具体的には **ドラッグ開始** と **クリック** を識別します。それぞれ以下と定義します。
1. ドラッグ開始 … マウスが押されてから一定時間押しっぱなしであること
2. クリック … マウスが押されてから一定時間にマウスが離されること
上記処理の **早く発火した方** を拾うことができればいいわけです。

まず source のストリームを作ります。

`1.` `2.` をそれぞれ `of(e).pipe(delay(200))` 、`fromEvent(el, 'mouseup')` と実装しています。
これらのストリームを `merge` して `first` で早く発火したほうを次へ流します。
最後に `share` で以降のドラッグとクリックの subscribe で同一のストリームを受け取るようにします。

```javascript
const el = document.getElementById('sample')

const source = fromEvent(el, 'mousedown').pipe(
	switchMap((e) =>{
    // 200ms 遅延した mousedown イベント または
    // mouseup イベントの
    // どちらか早く発火した方を次へ流す
    return merge(
      of(e).pipe(delay(200)),
      fromEvent(el, 'mouseup')
    ).pipe(first())
  }),
  share()
)
```

続いて subscribe の実装ですが、`e.type === 'mouseup'` でクリックかドラッグ開始か判別しています。
あとは煮るなり焼くなりしてみてください。

```js
// e.type でクリックかドラッグか識別する
const click = source.pipe(
  filter((e) => e.type === 'mouseup')
).subscribe((e) => {
  alert('click！')
})

const drag = source.pipe(
  filter((e) => e.type !== 'mouseup')
).subscribe((e) => {
  alert('drag！')
})
```

## まとめ
楽ですね。
string vectorの、sort and uniq (C++)

string のソート、ユニークをしたい時は多々あります。
ここに、メモを兼ねて、基本中の基本のコードを上げておきます。
このコードは、`$ cat - | sort | uniq`と、同じ働きをします。

```sortuniq.cpp
//
// String vector の、sort | uniq
//
#include	<iostream>
#include	<algorithm>
#include	<vector>
#include	<string>

using namespace std;

int	main()
{
  vector<string> data;
  string  str;

	data.clear();   // データのクリア

  while(1) {      // EOF (Ctrl-D)まで読み込み
    cin >> str;
    if (cin.eof()) break;
    data.push_back(str); 
    }

  sort(data.begin(), data.end());                            // sort

  data.erase(unique(data.begin(), data.end()), data.end());  // uniq

	for(auto i:data) cout << i <<endl;   // 表示

	exit(0);
}
```
【JavaScript】【for文駆逐作戦】forEachメソッドの使い方


## この記事の内容
- javaScriptの「forEach」の使い方について
- for文は駆逐していく方針です

## なぜ駆逐するのか
- 読みづらいし、ナウくないから。

## さっそく書き方

### いつもの「for文」

```javascript

var colors = ['red', 'blue', 'green'];

  for (var i = 0;  i < colors.length;  i++ ) {
    console.log(colors[i]);
  }

//結果：red、blue、green
```
    
### 「forEach文」
```javascript
var colors = ['red', 'blue', 'green'];

 colors.forEach(function(color) {
    console.log(color);
 });

//結果：red、blue、green
```

### 補足
- forEachはコールバック関数です！（コールバック関数？）

 `function(){}`

- 処理全部含めて「コールバック関数」という（名前がない関数は匿名関数って言われるらしい）
- forEachの場合、配列の中身１個１個（color）に対して,処理が実行される
- ↓みたいな書き方もできる

```javascript

var colors = ['red', 'blue', 'green'];

function displayColors(color) {
  console.log(color);
}
  colors.forEach(displayColors);
//結果：red、blue、green
```

コールバック関数をforEach文に書かずに、先に定義しておいて
forEach文で呼び出す手法です

## まとめ
- ずっとforEachを使い続けるとやみつきになるとのこと
- for文を使い続けると、トレンドから置いていかれるらしいので、やめましょう。

### コメントいただきました！（うれしい）

以下、いただいたコメントです。
 
- 再代入しない変数は const で宣言
- 無名関数 → アロー関数
 
にすると、よりそれっぽくなるかと思いました。

```javascript

const colors = ['red', 'blue', 'green'];

colors.forEach((color) => {
  console.log(color);
});
```

実は、
まだアロー関数・constまで勉強ができておらず、
今回はこの書き方になっております。

記事としてはいけてないのですが、
ちゃんと学んだあかつきには、この記事をリライトしたいと思います！
Matplotlibでレーダーチャートを描く（16行）

# サンプル
![radar.png](https://qiita-image-store.s3.amazonaws.com/0/146259/5826f4fd-decd-b94e-7f3d-e962e81e350a.png)

# モチベーション
* [公式](https://matplotlib.org/examples/api/radar_chart.html)のサンプルはうまくプロットできないし、コードが長くて死ぬ。
* シンプルにレーダーチャートを描きたいだけなのに…。

# コード
```Python3
import matplotlib.pyplot as plt
import numpy as np

def plot_polar(labels, values, imgname):
    angles = np.linspace(0, 2 * np.pi, len(labels) + 1, endpoint=True)
    values = np.concatenate((values, [values[0]]))  # 閉じた多角形にする
    fig = plt.figure()
    ax = fig.add_subplot(111, polar=True)
    ax.plot(angles, values, 'o-')  # 外枠
    ax.fill(angles, values, alpha=0.25)  # 塗りつぶし
    ax.set_thetagrids(angles[:-1] * 180 / np.pi, labels)  # 軸ラベル
    ax.set_rlim(0 ,250)
    fig.savefig(imgname)
    plt.close(fig)

labels = ['HP', 'Attack', 'Defense', 'Speed']
values = [155, 156, 188, 139]
plot_polar(labels, values, "radar.png")
```

要約すると

1. 極座標のAxesオブジェクトを作って、
1. そこにポリゴンを描画する。
1. 塗りつぶしても良し。

凡例やタイトルの追加、複数データのプロットは通常のグラフ同様にできるので省略。

# 既存資料
* 公式 https://matplotlib.org/examples/api/radar_chart.html
    * 修正 https://qiita.com/k1iguchi/items/765dbfbd65ca0632e80c
* 直接参考にした記事 https://typewind.github.io/2017/09/29/radar-chart/
【Angular】画像のアップロードとPreview表示について



Angularでの開発を最近開始したのですが、ファイルアップロードのところでかなり詰まってしまったので、備忘録として残しておきます。

// 1/14追記あり

## 前提
・Twitterのようなアプリケーションを作成する
・その中に画像のアップロードとその画像の表示を行う


## 今回のゴール
・画像のアップロード
・アップロード画像の表示

## 詰まったとこ
・そもそも、アップロードどうやってやるのかわからない

## まとめ
・Fileを扱う時にはFile Readerを用いる
・htmlのimgタグの中で表示させるためには、urlの形にする必要がある
・File Readerの中でurlを生成するためには、readAsDataUrlを用いる（これを用いることによって、readerのresultプロパティにurlの文字列が入る）

## ソースコード
以下、新たなツイートをする部分のhtmlとtypescript

```content-main.component.html
<div class="home-tweet-box tweet-box-component tweet-user">
    <input class="tweet-input" [(ngModel)]="newTweetContents" placeholder="いまどうしてる？">
    <button (click)="setTweetContents(newTweetContents)">ツイート</button>
    <input type='file' accept="image/*" (change)="onChangeInput($event)">
</div>
<img [src]=imageSrc alt="" />
```

``` content-main.component.ts
imageSrc = '';
reader = new FileReader();

onChangeInput(evt) {
 const file = evt.target.files[0];
 this.reader.onload = ((e) => {
   this.imageSrc = e.target['result'];
 });
 this.reader.readAsDataURL(file);
}
```

## 最終的に参考にしたURL
https://stackoverflow.com/questions/38476315/angular2-file-input-onchange/38476440
https://developer.mozilla.org/ja/docs/Web/API/FileReader
https://developer.mozilla.org/ja/docs/Web/API/FileReader/readAsDataURL

## お願い
もし、他にベストプラクティス（普通こうやってやるでしょ）がありましたら知りたいです。

よろしくお願いいたします。


## 追記
この内容について、NgFormで書き換えることをしました。
https://qiita.com/TakahitoNakashima/items/d1d6fa314d1619f0ce45
GiteaのDBをMariaDBにする


* `DB_HOST=db:3306`の箇所がポイントdockerネットワークでは指定した名前でホスト名のアクセスできる。ここではwebかdbでそれぞれのコンテナにアクセスできる。
* ここでの3306ポートは外側に出していないので競合しない。

```yml:docker-compose.yml
version: '3'
services:
  web:
    image: gitea/gitea:1.7
    volumes:
      - ./gitea-data:/data
    ports:
      - "3000:3000"
      - "10022:10022"
    environment:
      - DB_TYPE=mysql
      - DB_HOST=db:3306
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=gitea
      - TZ=Japan
      - SSH_PORT=10022
    depends_on:
      - db
    restart: always
  db:
    image: mariadb:10
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
    volumes:
      - ./mysql-data:/var/lib/mysql
```

```
$ docker-compose up
```


# 参考

[gitea/gitea \- Docker Hub](https://hub.docker.com/r/gitea/gitea/)
TypeScript で `--target "es5"` としつつ ES6+ の機能を使う

## TL;DR

`--lib es6` のように `lib` オプションを指定し, [core-js](https://github.com/zloirock/core-js) のような polyfill を利用する.

## バージョン

```bash
$ tsc --version
Version 3.2.2
```

## きっかけ

TypeScript + Vue.js に入門しようと思って公式ドキュメントを読み, だいたい概要をつかめたところで [quick start guides
](https://www.typescriptlang.org/samples/index.html) をやってみた.
すると, "!" マークを `enthusiasm` 個連続して結合した文字列を返すという部分で[こんなコード](https://github.com/Microsoft/TypeScript-Vue-Starter/blob/299ccb31df60023d89704ca7c129277e410cf323/src/components/HelloDecorator.vue#L31)が書かれているではないか:

```js:HelloDecorator.vue
get exclamationMarks(): string {
    return Array(this.enthusiasm + 1).join('!');
}
```

この部分は ES6 で追加された [String.prototype.repeat()
](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/repeat) メソッドによって, 以下のようにもっと簡単に書けるはずである:

```js:HelloDecorator.vue
get exclamationMarks(): string {
    return "!".repeat(this.enthusiasm);
}
```

早速手元で書きかえて試してみると, 次のようなエラーが出た:

```
TS2339: Property 'repeat' does not exist on type '"!"'.
```

あれ, おかしいな... と思って調べてみると, こんな [issue](https://github.com/Microsoft/TypeScript/issues/6468) があった.

> I think you're confusing transpilation with auto-polyfilling. TypeScript doesn't automatically polyfill for you like Babel does, but does perform syntactic downleveling (e.g. for arrow functions).
> If you want to use ES6 runtime prototype methods, I'd simply include an appropriate ES6 polyfill and its accompanying definition file.

確かにこの時点では筆者も TypeScript のコンパイラはトランスパイルと polyfill を同時に行ってくれるものだと思い込んでしまっていた.
しかし実際のところ TypeScript が行うのは, 例えば arrow functions のような ES6 の **構文** を ES5 に変換することであって, Babel のような polyfill (ES6 で追加されたメソッドやオブジェクトを ES5 の仕様でエミュレートするコードを挿入すること) は行わない (と筆者は理解した). なので [core-js](https://github.com/zloirock/core-js) のような polyfill 集と, その型宣言ファイルを導入する必要があるということになる. [^6468#issuecomment-171400551]

[^6468#issuecomment-171400551]: https://github.com/Microsoft/TypeScript/issues/6468#issuecomment-171400551

### `--lib` オプション

TypeScript 2.0 からは `--lib` オプションを指定することでビルトインの型宣言を利用できるようになっていたようだ. [^including-built-in-type-declarations-with---lib]

[^including-built-in-type-declarations-with---lib]: https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript#including-built-in-type-declarations-with---lib


したがって `--lib es6` のように指定すれば, あとはただコード内で polyfill を `import` などすれば良い.

まだ良く理解できていないけど, `--lib es2018` とすれば `String.prototype.repeat()` も使えるし, ES7 で追加された `Array.prototype.includes()` も使える. `es2018` を指定すれば自動的に ES5 から ES2018 までの全ての型宣言ファイルが読み込まれるということなのかな.

## 注意事項とお願い

筆者は TypeScript や JavaScript には全然詳しくないので, 内容に誤りが含まれる可能性があります.
もし何かあればコメントでご指摘いただけると嬉しいです.
vagrant upに失敗するときの対処法

## はじめに

久し振りにVagrantを使おうとしたら `vagrant up` でエラーになったので、その対処法を載せます。

## 環境(更新後)

- OS：macOS Mojave 10.14
- VirtualBox：6.0.0 r127566
- Vagrant：2.2.3

## vagrant upに失敗するときの対処法

```shell-session
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Resuming suspended VM...
==> default: Booting VM...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "{半角英数の羅列}", "--type", "headless"]

Stderr: VBoxManage: error: The virtual machine 'centos73_wordpress_default_XXXXXXXXXXXXX_XXXXX' has terminated unexpectedly during startup with exit code 1 (0x1)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MachineWrap, interface IMachine
```

→VirtualBoxのアプリを削除し、最新版をインストール

```shell-session
$ vagrant up
The provider 'virtualbox' that was requested to back the machine
'default' is reporting that it isn't usable on this system. The
reason is shown below:

Vagrant has detected that you have a version of VirtualBox installed
that is not supported by this version of Vagrant. Please install one of
the supported versions listed below to use Vagrant:

4.0, 4.1, 4.2, 4.3, 5.0, 5.1, 5.2

A Vagrant update may also be available that adds support for the version
you specified. Please check www.vagrantup.com/downloads.html to download
the latest version.
```

→Vagrantの最新版をインストール

```shell-session
$ vagrant up
Vagrant failed to initialize at a very early stage:

The plugins failed to initialize correctly. This may be due to manual
modifications made within the Vagrant home directory. Vagrant can
attempt to automatically correct this issue by running:

  vagrant plugin repair

If Vagrant was recently updated, this error may be due to incompatible
versions of dependencies. To fix this problem please remove and re-install
all plugins. Vagrant can attempt to do this automatically by running:

  vagrant plugin expunge --reinstall

Or you may want to try updating the installed plugins to their latest
versions:

  vagrant plugin update

Error message given during initialization: Unable to resolve dependency: user requested 'vagrant-vbguest(= 0.15.0)'
```

→ `vagrant plugin update` を実行

```shell-session
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Resuming suspended VM...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
  default: SSH address: 127.0.0.1:2222
  default: SSH username: vagrant
  default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provision
```

→(若干気になるメッセージが出ていますが) __起動に成功！__

## おわりに

3回失敗しましたが、エラーの内容通りに対応することで無事に起動することができました。

## 参考リンク

- [vagrant upができなかった時に取った対処法 - Qiita](https://qiita.com/hiroki5123/items/445b381fc875cd1bca98)
vim-plugでvimの楽々プラグイン管理

vim-plugというパッケージマネージャーに感動したのでメモ。
今まではdein-vimでパッケージを管理していた。
しかしvim-pluginはさらにその上を行く。

## 導入
macの場合は以下をコマンドで実行するだけで良いらしい。

```bash
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

vimrcに以下を記述した後、

```vim
" Plugins will be downloaded under the specified directory.
call plug#begin('~/.vim/plugged')

" Declare the list of plugins.
Plug 'tpope/vim-sensible'
Plug 'junegunn/seoul256.vim'

" List ends here. Plugins become visible to Vim after this call.
call plug#end()
```
vimをリスタートする
:PlugInstall
とvim内から打つと、
あら不思議
`tpope/vim-sensible'
'junegunn/seoul256.vim'
の二つのプラグインがダウンロード出来る。

お手軽になったなあ。
nginx + PHP-FPMでCentOS 7にPHPの実行環境を作る

#環境
 - macOS 10.12.6
 - MacBook pro 2016
 - VirtualBox 5.2.18
 - CentOS 7.6-1810

#はじめに
nginx上でPHPの実行環境を作ってブラウザ確認までしようと思います。
nginxのインストールはこちらの記事をご覧ください↓
　　- [CentOS 7にnginxをインストールしてブラウザ確認するまで](https://qiita.com/nooboolean/items/ffcd6b2229f846f195ec)
CentOS 7の環境構築はこちらの記事をご覧ください↓
　　- [MacでVirtualBoxを使ってCentOS 7をインストールしてみた](https://qiita.com/nooboolean/items/de4e6bbae5df040177af)
　　- [VirtualBoxのネットワーク設定をいじって安全で快適な開発ができるようにした](https://qiita.com/nooboolean/items/96ae44d0090794dce8d1)

#nginxでPHPを動かすには
Apacheはインストールした時点でPHPの実行環境が整っています。
PHPはApache用に、同一プロセスで動くモジュール版というものが用意されていて、これがApacheのインストール時に一緒に入っているので、PHPのプログラムを動かすことができるのです。

それに比べて、nginxはインストールしただけではPHPのプログラムを動かせません。
なぜなら、nginx用のモジュール版は用意されていないからです。よってnginxでPHPを動かすには、CGI版のPHPを使わなくてはなりません。（ちなみに、ApacheにはCGI版もあるみたいです…！欲張りですね。）
CGI版のPHPを動かすには、`PHP-CGI`というものにリクエストを送らなくてはならないのですが、nginxだけだとそれができません。。。（なんでできないのかは後ほど調べよ〜っと）

ではどうするか、そこで登場するのが、`PHP-FPM`というプログラムです！
この、PHP-FPMがうまいこと、nginxからPHP-CGIへのリクエストをさばいてくれて、やっとPHPのプログラムが動いてくれるというわけです。

まあ、とにかくPHPをnginxで動かしたいならPHP-FPM入れなさいってことですね。

#PHPのインストール
yumでチャチャっとインストール。

```
// インストール
# yum -y install php
// 確認
# php --version
```
phpの用意はこれだけで十分です。

#PHP-FPMのインストールと設定
こちらもyumでインストール。

```
# yum -y install php-fpm
```
設定ファイルは、`/etc/php-fpm.d/`配下の、`www.conf`というファイルです。

```
# vi /etc/php-fpm.d/www.conf
```
設定内容は以下です。

```diff:www.conf
- user = apache
- group = apache
+ user = nginx
+ group = nginx
```

#nginxでの設定
設定ファイルは、`/etc/nginx/conf.d/`配下の、`default.conf`というファイルです。

```
# vi /etc/nginx/conf.d/default.conf
```
```default.conf
# ...（省略）
   location / {
        root   /usr/share/nginx/html;
        index  index.php; # index.phpを設定
    }
# ...(省略)
　　# 以下の部分のコメントアウトを消す
　　location ~ \.php$ {
        root           /usr/share/nginx/html; # ドキュメントルートを設定
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; # デフォルトでは、「/scripts」となっているので、「ドキュメントルート（$document_root）」に変更する
        include        fastcgi_params;
    }
# ...(省略)
```

#表示するPHPファイルを用意

上記の設定で、ドキュメントルートを`/usr/share/nginx/html`にしていますので、`/usr/share/nginx/html`配下に、`index.php`を作成しましょう。

```
# touch /usr/share/nginx/html/index.php
```
確認用なので、適当にechoしてみましょう。

```php:index.php
<?php
　echo('PHP動いたよ！');
?>
```

#ブラウザで確認
nginxとphp-fpmの設定を変えたので、両方とも再起動して設定を反映させます。

```
# systemstl restart nginx
# systemctl restart php-fpm
※CentOS 6 以下は、serviceコマンドを使ってください。
```
あとは、`http://CentOSのIP:nginxで設定したポート番号/index.php`でアクセスして、ブラウザ確認できたら完了！
<img width="430" alt="スクリーンショット 2019-01-14 0.20.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/183984/c86495c4-076a-5b53-c678-233cc5efcaac.png">
(Windows10、laravel) homesteadのDBクライアントのインストールと接続

Windows10環境に構築したhomesteadのデータ操作のためにMysql クライアントをインストールしhomesteadへの接続を設定します。
####前提条件
homestead:7.20.0
homesteadはHomestead.yamlのsites以外は初期設定
#### MySQL Workbenchのインストール
- Visual C++  2015 Restributableのインストール
[Visual C++  2015 Restributable](https://www.microsoft.com/ja-JP/download/details.aspx?id=48145)

- MySQL Workbenchをインストール
[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)

- MySQL Workbenchのホーム画面下部の`Add Connection`ボタンから下記のパラメータでコネクションを追加

```
SSH Hostname: 192.168.10.10
SSH username: vagrant
SSH password: (not used)
SSH key file: <<homestead接続用のsshkeyのprivatekeyのパス>>
MySql hostname: 127.0.0.1
MySQL ServerPort: 3306
username: homestead
password: secret


```
#### 参考
[https://laracasts.com/discuss/channels/general-discussion/homestead-unable-to-connect-with-mysql-workbench-to-mysql-database]
(https://laracasts.com/discuss/channels/general-discussion/homestead-unable-to-connect-with-mysql-workbench-to-mysql-database)