OmniAICreator/Qiita-1.07M huggingface dataset:
WinActorを使って社内でRPAを展開したメモ

# 導入の経緯
親部門である総務部が営業から紹介されて試験導入を行う。
システムに関することなので、うち手動で進めることになる。

# RPAの展開方法
RPAの展開方法は、2つある。

1. システム部門が主導となって各部門のRPA化要望をヒアリングしてRPA化を行う
2. ユーザ部門が主導となってRPA化を行う

WinActorは開発版で**90万円/年**の費用がかかる。
つまり、1台導入した場合は、**90万円分の業務工数が削減**できないとペイできない。
普通に考えてユーザ部門にWinActorを渡してそれだけの工数削減ができるだろうか？
うちの会社では絶対無理そう。なので、"1. システム部門"が主導でRPA化を展開することにした。

# WinActorのダメなところ
## 変数がグローバルしかない
ローカル変数を定義できないので、ループのカウンタ変数が増えていく。
また、一時取得したいだけの値格納のためにも、変数が乱立していく。
![WS000012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/d6e93b80-1ca3-95d9-18b0-02908c4cdb4b.jpeg)

## 変数が検索できない
変数が検索できず、どこで初期化されて、使われているのか分からない。
ライブラリの中で変数を指定するが、どのライブラリでどの変数を指定したかを自分で覚えておかないといけない。
作ってる最中ならともかく、作成して数か月経ったシナリオの中で、どこでどの変数使ったなんて覚えてるわけないやん。
これを保守させられると考えるとゾッとする。
![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/0e12afa5-9838-40ff-e62d-7cd650243fa7.jpeg)


## ライブラリが微妙過ぎる
* フォルダの存在チェックがない
* 200通のメールを送ろうとすると止まる

## 意図しない動作が多すぎる
* クリックしても反応しないときがある→とりあえず3回くらいクリックさせる
* 連続してアプリを起動すると時々こける→待機時間をすんごい入れる

## GUIがダルすぎる
複数のエクセルからデータを転記して集計用のエクセルに登録する業務がある。
よくある定型業務で展示会とかでもRPAするにはもってこいの業務だと宣伝している。
それをWinActorでやるとこうなる。
一つでも業務の流れが変わったらどうなるか・・・
これを作ったけど、結局VBAで作り直しました。
![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/65cc0194-eed8-3465-3dd3-7810da358ffc.jpeg)

# WinActor嫌いな同僚の名言
## ルンバを持っていてゴミ屋敷に案内される
RPA化できそうな業務をユーザ部門にヒアリングしに行くときに感じること。
その時に出てくるRPA化したい業務がゴミ屋敷レベルのことが大半。
こっちはルンバ(WinActor)を持って行ってるのに、そんな大掃除できるわけないやん。

## WinActorを覚えるコストとプログラミング言語を覚えるコストにそんなに差がない
WinActorも結局VBSの修正とかをしないとまともなことができない。
展示会とかでやってる電卓操作とか、超簡単なウェブアプリ操作とかなら標準ライブラリでできるが、フォルダの存在チェックとかは自分でVBS使ってライブラリを作らないとできない。
それなら、普通にプログラミング言語覚えてVBAでやった方が効率がいいのでは。
![WS000011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/ddce1bcd-57b7-5d57-2f64-21ab64d3e49e.jpeg)
【ヘルパー関数】ストアとコンポーネント間の通信


参考文献
Vue.js入門

Vueインスタンスにstoreを渡してあるものとします。

##ヘルパー関数
ヘルパー関数とは、コンポーネントからストアにアクセスする為の関数で下記の４つが用意されています。

・mapState
・mapMutations
・mapGetters
・mapActions

これを使い、コンポーネントの算出プロパティやメソッドに結び付けられます。

比較のためにthis.storeを使った参照の例を書きます。
###this.storeを使って参照

```javascript:store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment: function(state) {
      state.count++
    }
  }
})
```
```vue:App.vue
<template>
  <div id="app">
    <p>{{ count }}</p>
    <button v-on:click="increment(1)">add１</button>
  </div>
</template>

<script>
export default {
  computed: {
    count: function() {
      //store内のcountのstateを渡す
      return this.$store.state.count
    }
  },
  methods: {
    increment: function(value) {
      //ストア内の'increment'mutationをcommit
      this.$store.commit('increment', value)
    }
  }
}
</script>
```
###ヘルパー関数を使って参照

先ほどのApp.vueをmapStateとmapMutationsを使い記述した例です。

```vue:App.vue
<template>
  <div id="app">
    <p>{{ count }}</p>
    <button v-on:click="increment">add１</button>
  </div>
</template>

<script>
// 'mapState'と'mapMutations'を使えるようにする
import { mapState, mapMutations } from 'vuex'

export default {
  // '$sotre.state.count'をthis.countと結びつける
  computed: mapState([
    'count'
  ]),
  // 'this.$store.commit('increment', value)'を、this.increment(value)で呼び出せる
  methods: mapMutations([   
    'increment'
  ]),
}
</script>
```
また、 下記のようにヘルパー関数の引数にオブジェクトを渡すと、コンポーネント上で`this.プロパティ名`で参照可能になります。

```javascript:App.js
import { mapState } from 'vuex'

export default {
  // '$sotre.state.count'をthis.valueと結びつける
  computed: mapState({
    value: 'count'
  })
}
```
ヘルパー関数は簡単にコンポーネントからストアを使うことができますが、これでは通常の算出プロパティやメソッドを書く場所がなくなります。
そのような場合、ヘルパー関数の戻り値と通常のこれでは通常の算出プロパティ・メソッドの定義を、オブジェクトスプレッド演算子やobject.assign関数で結合し、両方一度に使うことができます。

下記はmapStateでstateのcountを結びながら通常の算出プロパティdoubleを定義しています。

```javascript:App.vue

import { mapState } from 'vuex'

export default {
  // 通常の算出プロパティを定義
  computed: {
    double: function() {
      return this.conut * 2
    },
    // 通常の算出プロパティとmapStateの戻り値を結合
    ...mapState([
      'count'
    ])
  }
}
```

名前空間つきのモジュールは、ヘルパー関数の第一引数に名前空間の文字列を渡すことにより記述できます。
下記は、counter名前空間にあるcountをthis.countに結ぶ例です。

```javascript:App.vue
import { mapState } from 'vuex'

export default {
  // '$store.state.counter.count'を'this.count'に結ぶ
  computed: mapState('counter',[
    'count'
  ])
}
```

---
以上です。
また学習が進み次第、更新、掲載していきます。
ここまでで補足や訂正などありましたらご教授いただけると嬉しいです。
最後まで読んでいただきありがとうございます。
KiCADにRSのライブラリを手動で追加

# はじめに
![RSのサイト](http://rs.componentsearchengine.com/)から、KiCADのライブラリを入手することができます。
通常は「ライブラリローダー」というツールを使用してKiCADにライブラリを読み込ませます。


__たまに上手く動かない__ケース や、 __ライブラリを編集したい__ケースがあり
 ライブラリローダー未使用でライブラリを追加した際の手順をまとめました。

# ライブラリの入手

まず![RSのサイト](http://rs.componentsearchengine.com/)で欲しい部品をサーチします。
今回はIntelのFPGA(10M08SAE144C8G)でやってみます。
「ECAD Model」の欄に↓のアイコンがあれば入手可能です。
「Build or Request」になっている場合はライブラリが無いので、リクエストが必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/244fe26a-c145-40ad-f269-21093a71c680.png)

アイコンをクリックすると下図のようなダウンロードページに飛びます。
ユーザー登録してあれば、「FREE DOWNLOAD」から入手できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/97fab0c7-1d2a-4c8a-d7e0-69036d4d623f.png)

ダウンロードしたZIPを展開します。
以下のように __KiCad__ のフォルダがあり、KiCADで必要なものはこの中に入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/8decb716-e564-36d0-c733-f0e07302e05f.png)

# 自前ライブラリの用意

1. 任意のフォルダに __拡張子 .lib__ のテキストファイルを作成(今回は__MyParts.lib__)
2.  同名で拡張子が __.dcm__のファイルを作成
3.  同名に __.pretty__を付加したフォルダを作成。
2. __.lib__ の中身を 自前ライブラリへコピーペースト
2. __.dcm__ の中身を 自前ライブラリへコピーペースト
3. __～.pretty__フォルダへ __～.kicad_mod__ ファイルをコピー

文字コード __UTF-8__ 改行は __LF__ であれば問題なさそうです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/a589f3bc-4103-736c-0547-c661e4c081b6.png)

# KiCADでライブラリの読込

## 回路図シンボルの読込
__シンボルライブラリーエディター__ の 「既存ライブラリーの追加」ボダンより、先ほど作成した __MyParts.lib__ を読み込ませると、ライブラリーに __MyParts__ のカテゴリが追加されて、ライブラリを認識します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/fc8de794-0538-fdb7-387d-729d574e80ea.png)

回路図エディターで 「10M08SAE144C8G」を検索すると呼び出し可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/97dfde5a-a81d-6caf-944d-d9f8b34ce17a.png)

## フットプリントの読込
フットプリントライブラリーエディター ⇒ 設定 ⇒ フットプリントライブラリーを管理 の順にたどります。
__ライブラリーを参照__ から 先ほど用意した __MyParts.pretty__ フォルダを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/2ebf77be-d029-5696-2690-2c71192d37b2.png)

これでフットプリントが認識されます。

# 確認
接続図にパーツを置いて、PCBに配置し、３Dビューワーで表示できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/1a4fe61a-91f4-8ab9-5ac6-c28b7d007fdb.png)



# ファイルの説明

## ~.libファイル
接続図で使用するシンボルの情報です。
__#__ の行はコメントのようです。
1ファイルがシンボルカテゴリーとなって、複数のシンボルを持つことができるようです。
１つのシンボルは __DEF__ から始まり __ENDDEF__ で終わっています。 
新たなシンボルを追記したい場合は __ENDDEF__ の後ろに 追加したいシンボルの __DEF__ ～ __ENDDEF__
の部分をコピペします。

## ～.dcmファイル
パーツの補足情報やデータシートのリンク先等が記載されているようです。

## ～.kicad_modファイル
これがフットプリントのデータです。
テキストファイルですが、編集の際はフットプリントエディターで編集するのが無難です。
Edge TPU Compiler

Edge TPU Compiler（`edgetpu_compiler`）は、TensorFlow Liteモデル（.tflite file）をEdge TPUと互換性のあるファイルにコンパイルするコマンドラインツールです。 このページでは、コンパイラの使い方と動作について説明します。

![微信图片_20190404110336.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/5c2a036c-1a8a-a9b8-95d0-2b1b2024c3b8.jpeg)


コンパイラを使用する前に、Edge TPUと互換性のあるモデルがあることを確認してください。

#システム要求

Edge TPU Compilerは、現代のあらゆるDebianベースのLinuxシステム上で実行することができます。 具体的には、次のとおりです。

Debian 6.0以降、またはその派生物（Ubuntu 10.0以降など）

ARMv8命令セットを使用したx86-64またはARM64のシステムアーキテクチャ

これには、Coral Dev Boardでのメンデルのサポートも含まれます。

# Download

次のコマンドを使用して、Linuxシステムにコンパイラをインストールできます。


```
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list

sudo apt update

sudo apt install edgetpu
```
#使用法

```
edgetpu_compiler [options] model...
```
コンパイラは、1つ以上のTensorFlow Liteモデル（ `model` 引数）へのファイルパスと任意のオプションを受け入れます。 複数のモデル（それぞれスペースで区切られている）を渡すと、それらはEdge TPUのRAMをパラメータデータキャッシュ用に共有できるようにまとめてコンパイルされます。

コンパイルされた各モデルのファイル名は`input_filename_edgetpu.tflite`です。`-out_dir`オプションを使用して指定しない限り、現在のディレクトリに保存されます。

Edge TPUは、1つのモデルのみを実行しているときに最高の推論速度を実現します。これは、Edge TPUで使用可能なキャッシュスペースが一度に複数のモデルに対応できないためです。 1つのEdge TPUで複数のモデルを実行できますが、モデルを交換するたびにキャッシュをクリアする必要があるため、パイプライン全体の速度が低下します。 このパフォーマンスのボトルネックを解決するには、各モデルを異なるEdge TPUで実行します。

Coral のハードウェアに使われている Edge TPU チップは、量子化されたモデルを使うように設計されています。量子化とは、精度への影響を最低限にとどめつつ、ベースとなるデータを圧縮して、小さく高速なモデルにすることを指します。

![maxresdefault (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/d8060ef1-f2cb-3588-2785-fda5c5222a3a.jpeg)

##### `代理店：https://store.gravitylink.com`

TensorFlow Lite Converter を使うと、すべてのトレーニング済み TensorFlow モデルを量子化できます。このテクニックの詳細は、トレーニング後の量子化をご覧ください。
次の簡単なコード スニペットは、TensorFlow Lite ナイトリー版と TensorFlow 2.0 アルファ版を使ってモデルを変換し、量子化する方法を示しています。
TDDのTはテディベアのT

テスト駆動開発のテストの役割とは?
実践してみて感じたことを書いてみました｡

(間違っているところがあればご指摘お願いします｡)

# TDDのテストと一般的なテストは別物

TDDを実践する目的､それは**｢動作するきれいなコード｣**を書くことである｡
ちょっと抽象的な表現かもしれませんが､私はこう解釈します｡

**仕様どおり動作する保守性の高いコード**

これが最終的に成果物として出力されることになります｡
つまりTDDのテストとは､**仕様どおり動作する保守性の高いコードを書くための作業**と言い換えることができます｡

一方､一般的にテストといえば､**バグの洗い出しやパフォーマンス検証**を目的としています｡
これは､**想定外の動作をしないことを証明するための作業**と言い換えることができます｡

上記の事から

- 一般的なテストはプログラミングの**結果に対してのみ作用**するもの
- TDDのテストはプログラミングの**過程に対しても作用**するもの

であると解釈できます｡

TDDは､プログラミングの過程すべてに作用します｡
とりわけ**設計**に関しては､最も直接的かつ効果的に作用する部分だと思います｡

# テストを書くということは設計するということ

TDDにおけるテストとは､**ふるまい**を定義するということです｡
例えばFizzBuzzの振る舞いを書くと以下のようになります｡

- 数を文字列として返す
- 数が3の倍数の場合は｢Fizz｣を返す
- 数が5の倍数の場合は｢Buzz｣を返す
- 数が3と5の倍数の場合は｢FizzBuzz｣を返す

これはそのままテストとして機能します｡
そして､このテストをパスする実装を書けば､FizzBuzzは完成します｡
つまり､テストを書くということは､設計していることと同義であると言えます｡

# ベアプログラミング

[プログラミング作法(Brian Kernighan著)](https://www.amazon.co.jp/dp/4756136494/ref=cm_sw_r_tw_dp_U_x_4-zjDbVDT2XDX )という本に､こんなエピソードが載っています｡

>自分のコードを誰かほかの人に説明して聞かせるのも効果的なテクニックだ｡
こうすると自分自身インバグが見えてくることが多い｡
場合によっては説明し始めた途端に気がついて｢あ､もういいや､変なところがわかったよ｡ごめん､ごめん｣などと言って照れくさい思いをすることもある｡
このテクニックは意外なほど有効だし､聞き手は別にプログラマでなくてもかまわない｡
ある大学の計算機センターのヘルプデスクのそばにはテディベアのぬいぐるみが常備されており､摩訶不思議なバグに悩む学生は､人間のスタッフに相談する前にぬいぐるみに向かって説明しなければならないことになっていた｡

有名な話なのでご存知のかたも多いと思いますが､簡単に説明すると

- 行き詰まっているときは､誰かに説明(相談)しよう｡
- 説明しようとすると､物事を整理するので思考がクリアになって問題の原因が見えてくるよ｡
- でも一方的に話して｢もういいや｣は迷惑なので､まず最初にぬいぐるみを相手に整理してみてね!

というものです｡

これは**テディベア効果**だとか､**ベアプログラミング**と呼ばれているのですが､なんとなくTDDのテストに似ていると感じます｡

# テストは高機能テディベア

実装したいプログラムの仕様を､テストとして書くことで頭の中が整理され､思考がクリアになり､よりきれいな設計でプログラムが書けるようになる｡
TDDのテストとは､テディベア効果､ベアプログラミングにおけるテディベアに相当するものだと思います｡
さらにこのテディベア､一度説明したことは覚えているし､そのプログラムが仕様から外れていれば､顔を真っ赤にして怒ってくれます｡
何回同じ質問をしても､どんなに酷使しても文句一つ言わないし､疲れもしません｡健気ですね

# まとめ

｢TDDってなんか難しそうだなあ......｣

そう思っていましたが､今ではもっと気軽に実践するべきなのかなと感じています｡
もしプログラムの設計に悩んでいるのであれば､今すぐ実践してみてください｡
TDDのテストは､別に品質の保証をするためのものではないですし､最初は汚いテストになってもいいと思います｡
部分的書いてみるのもいいかもしれません｡
TDDは全然ハードルが高いものではないと思います｡
むしろ中級者になりきれない初級者くらいの人こそ1番恩恵を得られるのかな､と感じました｡

おすすめの勉強方法ですが

- ｢[テスト駆動開発](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884)｣の1章と付録Cを読む
- [50分でわかるテスト駆動開発](https://channel9.msdn.com/Events/de-code/2017/DO03)を観る
- 残りの章を読み進めながら本文中のコードを写経する

この流れで学習していけば､比較的理解しやすいのではないかなと思います｡

TDDは実際に手を動かしてみないとどういうものか理解し辛いと思います｡
是非一度テストを書きながら設計してみてください｡
きっとあなたの良き相棒として手助けしてくれるはずです｡

# 参考
[テスト駆動開発](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884)
[50分でわかるテスト駆動開発](https://channel9.msdn.com/Events/de-code/2017/DO03)
[プログラミング作法](https://www.amazon.co.jp/dp/4756136494/ref=cm_sw_r_tw_dp_U_x_4-zjDbVDT2XDX )
Azure AD逆引きメモ

必要に迫られたAzure ADの逆引きメモです。

# 一般ユーザがAzure ADのポータルを参照できないようにする
* ホーム>既定のディレクトリ>ユーザーのユーザー設定で**Azure 管理ポータルへのアクセスを制限する**を**はい**へ変更
* ついでに**ユーザはアプリケーションを登録できる**を**いいえ**へ変更
* そのついでに**LinkedIn アカウントの接続**を**いいえ**へ変更

# 一般ユーザがAzure ADのPowerShellを参照できないようにする
1. 管理者でPowerShellを起動
1. ``Install-Module MSOnline``を実行
1. ``Connect-MsolService``を実行して管理者でログイン
1. ``Set-MsolCompanySettings -UsersPermissionToReadOtherUsersEnabled $false``を実行
1. ``Get-MsolCompanyInformation | fl UsersPermissionToReadOtherUsersEnabled``を実行して``UsersPermissionToReadOtherUsersEnabled : False``と表示されることを確認。
Rails6 のちょい足しな新機能を試す51（MySQL default編）

# はじめに

Rails 6 に追加されそうな新機能を試す第51段。 今回は、 `MySQL default` 編です。
Rails 6 では、 MySQL 8.0.13 以降のデータベースの場合に マイグレーションのカラムを追加するときに default オプションで式を指定できるようになりました。
言い換えると、MySQL 8.0.13 以降で カラムの default に式が使えるようになったことに、Rails が対応したということになります。

Ruby 2.6.3, Rails 6.0.0.rc1, MySQL 8.0.16 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

今回は、IPアドレスをソートして表示する機能を作ってみたいと思います。

# rails プロジェクトを作る

```
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
```

# scaffold で CRUD の機能を作る

scaffold で Host の CRUD を作成します。
カラム `aton` は、IPアドレスを数値に変換した値を保存します。

```
$ bin/rails g scaffold Host ip aton:integer
```
# migration ファイルを編集する

migration ファイルを編集します。

`ip` カラムに `null: false` を指定します。
`aton` のデフォルト値は、MySQL の関数 `INET_ATON()` を使って `ip` のカラムを変換した値にします。
`aton` に `limit: 5` を指定しているのは、 `255.255.255` を数値に変換した時に正しい値が保存されるようにするためです。

```ruby:db/migrate/20190706063437_create_hosts.rb
class CreateHosts < ActiveRecord::Migration[6.0]
  def change
    create_table :hosts do |t|
      t.string :ip, null: false
      t.integer :aton, limit: 5, default: -> { '(inet_aton(ip))' }

      t.timestamps
    end
  end
end
```

# `HostController#index` を変更する

IPアドレスをソートして表示するために、 `order` を追加します。
ソートのキーは `aton` にします。

```ruby:app/controllers/hosts_controller.rb
class HostsController < ApplicationController
  ...
  def index
    @hosts = Host.all.order(:aton)
  end
  ...
end
```

# seed データを作る

1件ずつブラウザでデータを登録するのは面倒なので、seed データを作っておきます。

```db/seeds.rb
Host.create(
  [
    { ip: '192.168.1.1' },
    { ip: '192.168.2.1' },
    { ip: '192.168.9.1' },
    { ip: '192.168.10.1' },
    { ip: '192.168.20.1' },
    { ip: '192.168.99.1' },
    { ip: '192.168.120.1' }
  ]
)
```

# データベースを作る

データベースを作って seed データを登録します。

```shell
$ bin/rails db:create db:migrate db:seed
```

# rails server を実行して Host の一覧を表示する

rails server を実行します。

```shell
$ bin/rails s
```

http://localhost:3000/hosts で一覧画面を表示します。
IPアドレスの順番にソートされています。
![host_order_by_aton.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/9f2931ff-fccd-a04a-45bd-3d9f3953251d.png)

ちなみに `order` で `:ip` を指定すると文字列としてソートされてしまいます。
![host_order_by_ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/2efbe21b-b048-2b9a-6627-3b2f138a1fcb.png)

# その他

ツッコミどころの多いソースかも知れませんが、今回は、あくまで default で式が使えることを確認する目的ですので見逃してください。
あと、今回は試してませんが、インデックスでも式を使うことができるようになっています。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try051_mysql_default_expression


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Support default expression and expression indexes for MySQL](https://github.com/rails/rails/pull/34307)
composerでautoloadのclassmapがうまくいかない時のメモ

composerでライブラリ管理をしている場合に、
composer installした際にautoloadのclassmapがうまく生成されず、
クラスがうまく読み込めていないため
``` class not found ```になってしまうことがあった。

そんな時に試してみたメモ

## clear-cache
~~~ 
php composer.phar clear-cache 
~~~

composerのライブラリはローカルに同バージョンのキャッシュがされているとダウンロードしないので、
一度キャッシュを削除してみる。
その後再度composer installする

## dump-autoload
~~~ 
php composer.phar dump-autoload 
~~~

autoloadのclassmapを再生成するコマンド。
【自分用メモ】Bitbucketでローカルリポジトリをプッシュする

何度やっても忘れて同じことを調べてる気がするので、まとめてみた。
#やりたいこと
ローカル環境にあるリポジトリをBitbucketにプッシュする。
公開鍵設定とかそのへんはやってあること前提です。

#手順
##１.プッシュしたいルートディレクトリまで移動する

```terminal:ターミナル
$ cd プッシュしたいルートディレクトリ
```

##2.ディレクトリの初期化

```terminal:ターミナル
$ git init
```
```Initialized empty Git repository in~```とやらが出てくれば成功。
##3.初期化したリポジトリにファイルを追加

```terminal:ターミナル
$ git add .
```
"add"と"."の間には半角スペースがあるのがポイント。
成功しても特に何も出てこない。

##4.ファイルをコミット

```terminal:ターミナル
$ git commit -m "initial commit of fuｌｌ repository"
```
Win民はダブルクォーテーションでないとうまくいかないらしい。
Mac民はシングルでもダブルでもお好きなほうをどうぞ。
成功すると１０行超の文章が出てくる。

##5.ローカルのGitリポジトリをBitbucketのリモートリポジトリに接続

```terminal:ターミナル
$ git remote add origin git@bitbucket.org:ユーザ名/BitbucketのURL
```
URLは```git clone```コマンドの横に載ってるのでありがたくコピペさせていただく。
成功しても特に何も出てこない。

##6.ローカルリポジトリの中のコードをBitbucketにプッシュ

```terminal:ターミナル
$ git push -u origin master
```
途中で端末のパスワードを求められる。
成功すると１０行超の文章の終わりに```Branch 'master' set up to track remote branch 'master' from 'origin'.```と出てくる。

お疲れさまでした。

#雑記
##作成したoriginを消したい

```terminal:ターミナル
$ git remote rm origin
```
手順5でスペルミスやってしまい、手順６で
```ssh: Could not resolve hostname bitbucket: nodename nor servname provided, or not known
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.```
とか出てきても、上のコマンドでやり直せば大丈夫

#参考サイト
[バージョン管理外のコードをリポジトリに追加する](https://confluence.atlassian.com/bitbucket/add-unversioned-code-to-a-repository-877177133.html)
[Gitで fatal: remote origin already exists. というメッセージが出る場合](http://pyoonn.hatenablog.com/entry/2014/10/29/191744)
[git/backlogで管理。pushをするときにエラーが出る](https://teratail.com/questions/39598)
Qiitaが422エラーで投稿出来なかった件

##はじめに
半年程度、Qiitaへの投稿が一切出来ない状況が続いていましたが解決したため投稿。
記事の投稿直前、利用規約への同意のうえ投稿ボタンをクリックしても動作しなかった。デベロッパーツールを確認すると、どうやら<B>422エラー</b>が発生しているそう。

https://qiita.com/arm_band/items/217672910cc7ac5b5de7
同じような症状が別記事で紹介されていて、Markdownのミスなのかな、とも思いつつ、既存の記事を再投稿してみたり、様々試してみても解決せず。

##解決法
###Qiita:Team Supportに問い合わせる！
サポートへ、以上の症状や環境、試した事などを報告すると、1日で以下のような回答が。

```
跡部 (Qiita/Qiita:Team Support)

7月9日 18:19 JST

kigchi999様

お問い合わせいただきありがとうございます。
Qiitaサポートの跡部です。

スパム対策のためにメールアドレスにフィルタを適用させていただいており、
そのフィルタに「@(捨てメルアドドメイン).com」が引っかかってしまていたようです。

投稿できるように設定しましたので、お手数ですが、再度お試しいただいてもよろしいでしょうか。

どうぞよろしくお願いいたします。
```

要するに、アカウント登録の際に捨てメルアドで登録していた事が原因の模様。
ごめんなさいQiitaさん、ありがとう跡部さん。
がんばって記事を投稿して罪滅ぼししますっ…！

##2019/07/11追記
コメントにてご指摘受けた点ですが、事前に記事掲載について確認し、快諾して頂きました。

```

跡部様

ご回答ありがとうございます。
Qiitaウェブサイトにて投稿を試行したところ、無事に投稿出来ました。
捨てメールアドレスで登録していたのが問題と思われます、ご迷惑おかけしました。

ちなみに、本エラーと解決への顛末をQiitaにて記事にしても差し支えありませんか？
※メールでのやり取りの掲載も含む

```

```
跡部 (Qiita/Qiita:Team Support)
7月11日 11:00 JST

kigchi999様

お世話になっております。
Qiitaサポートの跡部です。

とんでもございません。
投稿できるようになったようで何よりでございます。

掲載OKの確認が取れました。
メールでのやり取りを含めて記事にしていただいて問題ございません。

どうぞよろしくお願いいたします。
```

素敵✨
Railsのseeds.rbの書き方

#はじめに
Userモデルで書いてみます。

#書き方

###timesを使って書いてみる。

```rb:seeds.rb

if Rails.env == "development"
  10.times do |i|
    User.create!(email: "test#{i + 1}@example.com", password: "password", password_confirmation: "password")
  end
end

```
作成したユーザー↓

```

[1] pry(main)> User.all
  User Load (1.2ms)  SELECT "users".* FROM "users"
=> [#<User id: 1, email: "test1@example.com", created_at: "2019-07-11 02:13:55", updated_at: "2019-07-11 02:13:55">,
 #<User id: 2, email: "test2@example.com", created_at: "2019-07-11 02:13:55", updated_at: "2019-07-11 02:13:55">,
 #<User id: 3, email: "test3@example.com", created_at: "2019-07-11 02:13:56", updated_at: "2019-07-11 02:13:56">,
 #<User id: 4, email: "test4@example.com", created_at: "2019-07-11 02:13:56", updated_at: "2019-07-11 02:13:56">,
 #<User id: 5, email: "test5@example.com", created_at: "2019-07-11 02:13:56", updated_at: "2019-07-11 02:13:56">,
 #<User id: 6, email: "test6@example.com", created_at: "2019-07-11 02:13:56", updated_at: "2019-07-11 02:13:56">,
 #<User id: 7, email: "test7@example.com", created_at: "2019-07-11 02:13:56", updated_at: "2019-07-11 02:13:56">,
 #<User id: 8, email: "test8@example.com", created_at: "2019-07-11 02:13:56", updated_at: "2019-07-11 02:13:56">,
 #<User id: 9, email: "test9@example.com", created_at: "2019-07-11 02:13:56", updated_at: "2019-07-11 02:13:56">,
 #<User id: 10, email: "test10@example.com", created_at: "2019-07-11 02:13:56", updated_at: "2019-07-11 02:13:56">]

```

###範囲オブジェクトを使って書いて見る
上と同じ結果になります。

```rb:seeds.rb
if Rails.env == "development"
  (1..10).each do |i|
    User.create!(email: "test#{i}@example.com", password: "password", password_confirmation: "password")
  end
end
```

#create と create!
create!を使ったほうがいいと思います。
createだとvalidationに失敗したときに例外が発生しないため、思わぬ不具合が起きました。

今回、emailのバリデーションに一意性を追加しているのですが、createではエラーが出ず、ユーザーも最初の１人しか作成されませんでした。

###createでrails db:seedを実行する

```rb:seeds.rb

if Rails.env == "development"
  (1..10).each do |i|
    User.create(email: "test@example.com", password: "password", password_confirmation: "password")
  end
end
```

```
$ rails db:seed
$ 
```
作成したユーザー↓

```
[1] pry(main)> User.all
  User Load (2.9ms)  SELECT "users".* FROM "users"
=> [#<User id: 1, email: "test@example.com", created_at: "2019-07-11 02:33:34", updated_at: "2019-07-11 02:33:34">]
```

###create!でrails db:seedを実行
create!であればちゃんとエラーが出ました。

```rb:seeds.rb
if Rails.env == "development"
  (1..10).each do |i|
    User.create!(email: "test@example.com", password: "password", password_confirmation: "password")
  end
end
```
```
$ rails db:seed
rails aborted!
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
/Users/sakakin/rails/sample_sql/db/seeds.rb:3:in `block in <main>'
/Users/sakakin/rails/sample_sql/db/seeds.rb:2:in `<main>'
/Users/sakakin/rails/sample_sql/bin/rails:9:in `<top (required)>'
/Users/sakakin/rails/sample_sql/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
```
以上です。
【備忘録】Rを使ったCSVデータの読込について【まとめ】

#はじめに

業務でRを使ったデータ分析を行ったので、備忘録として学んだことを書いていきます。


データ分析の流れはすごく大雑把にいうと下記の流れだと思います。
１．課題定義
２．仮説立案
３．データ収集
４．データ加工
５．データ探索（いわゆるEDA）
６．切り口の決定
７．モデル構築
８．モデル評価

本記事では、3の部分に焦点を当てます。

#データ収集

データ収集方法は下記の２つに分類されると思います。
1. web上にある記事等からデータを取得する。
2. データ分析依頼先からデータを受け取る。

1. の場合スクレイピングが当てはまるかと思います。キーワードでいうと、

Python：beautiful soup
R：rvest
です。beautiful soupに関しては、Google Earth Engineの[記事](https://qiita.com/iwasaki_kenichi/items/ab920a72fa997792ae1a)で少し書いています。


今回は、２のため、２について書いていきます。

基本的にデータ読込は下記を使いました。
`df <- read.csv("sample.csv")`

オプションは下記のとおりです。

```
read.csv(file, header = TRUE, sep = ",", quote = "\"",
         dec = ".", fill = TRUE, comment.char = "", ...)
```

https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html

・header = TRUE
　１行目（ヘッダ）に名前が書いてある場合は、TRUE
  もし、１行目からデータが入っている場合は、FALSEを指定します。
  
・sep = ","
　セパレート記号です。カンマ区切りの場合は","です。
　もし、コロン区切りだった場合はsep=":"となります。
　
・dec = "."
　小数点です。国によっては小数点に,を使うところもあるみたいです。
　（それ用に、read.csv2という関数も用意されています）
　
・fill = TRUE
　ヘッダ数と読み込んだデータ数が異なるとエラーが出ます。通常エラーが発生します。
　しかしTRUEとすることでデータ数が異なっていてもデータを読み込みます。

・comment.char=""
　コメント行を表します。既定値は空文字をコメント行とするみたいです。
　
・encoding="UTF-8"
　エンコーディングを指定することができます。既定値はUTF-8です。

基本的にはread.csvだけで問題ありませんが、実際にいろいろなデータを読込と
エラーが発生します。

そのため、他には下記のようなファイル読込を使用しました。
１．`df <- read_csv("sample.csv")`
２．`df <- fread("sample.csv",data.table=False)`
３．`df <- pd$read_csv("sample.csv")`

１．は、readrに含まれるデータ読込関数です。
https://heavywatal.github.io/rstats/readr.html

２．は、data.tableに含まれるデータ読込関数です。
https://qiita.com/To_Murakami/items/d4145db0db9cfc3985cc

３．は、reticulateを使い、Pythonのpandasを呼び出して、Rスクリプト内で使用します。
https://qiita.com/yamano357/items/9319d4b073d82a261ed8

どのデータ読込関数も使いましたが、個人的には
freadがとても読込に早かったのでよかったです。
ただしfreadはdata.frameではなく、data.tableのため、data.frameとして
扱う場合には、オプションで
data.table=FALSEを指定する必要があるので、注意が必要です。


データ読込のとき、下記のような使い方を多用しました。
`df <- read.csv("sample.csv")%>%select(hoge1,hoge2,hoge3)`
や、
`df <- read.csv("sample.csv")%>%mutate(hogehoge = hoge1 + hoge2)%>%select(hoge1,hogehoge)`

パイプでつなげると、比較的早く読み込めた気がします。

#終わりに
関数によって読み込めないファイルがあったりなかったりと、工数を使ってしまった。
安定しているのはfreadなので、今後はfreadをメインに使っていきたいと思う。
SeleniumがCannot start the driver service on http://localhost:${port} を吐いて死ぬ

セレニウムを用いた再起テストを設計しなおすに当たって、C#で書くことを検討した
が、なぜか上記のエラーを吐いて永遠に動かなかった

#結論
*プロキシよまたお前か*
環境変数に`export no_proxy=localhost`を追加しましょう。
今回はC#だったので

```C#
 Environment.SetEnvironmentVariable("no_proxy","localhost");
```

こちらをSeleniumのドライバを呼ぶ前に刺しておくことでことなきを得ました。
【Windows】HHKBでUS配列のまま日本語入力

# 背景
US配列のキーボード HHKB (Happy Hacking Keyboard) を買ったけど、
日本語入力モードだと、JIS配列での入力になってしまって、
「’」キーを押すと「：」、「（」キー押すと「）」が入力されてストレスに。

# 問題
Windowsでは、US配列のまま日本語入力をするように設定できない。

# 解決方法
https://www.pfu.fujitsu.com/hhkeyboard/tooldownload.html
「HHKBキー配列切替ツール」をインストールする

# 備考
HHKBの場合、「半角・全角キー」が「\`」 →「Alt + \`」になります。
コンテナど素人が、EC2からECSにシステムリプレースした話

LTの発表用に、gitpitchのスライドでまとめてみました。

# スライド
https://gitpitch.com/matsuda-hiroki/slide?p=20190701_replace_EC2_to_ECS

#反省点
gitpitchでの画像表示が崩れてしまう  
qiitaへのスライド埋め込みがわからない
【VFX Graph】連番アニメーションを使ってみた



## はじめに
Visual Effect Graphでスプライトシートを使った連番アニメーションを使ってみました。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/f289fdc2-bc63-453c-5d44-a1c23b3336c9.gif)


## 環境
【Unityバージョン】
Unity2018.3.14f1

【パッケージ】
Hight Definition RP - Version 4.1.0(Preview)
Visual Effect Graph - Version 4.10.0(Preview)

【OS】
Windows 10

## Visual Effect Graph 完成図
今回作成したVisual Effect Graphは以下になります。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/71288d15-1d14-cd28-bc95-1e4b2c32bea9.png" height = 240>


## STEP0. スプライトシートの用意
今回のエフェクトでは、以下のテクスチャを使用しました。
Photoshopを使って手描きで作成しました。

<a href = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/da8778fd-9fd0-e193-e5bc-7bb997267e0b.png">スプライトシート(透過png)</a>
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/f19f5d93-4d86-edce-a79a-2af96717e91c.png" height = 256>


## STEP1. UV Mode = Flipbook に設定
Output系ノードの`Uv Mode`を`Flipbook`に設定し、スプライトシートのテクスチャとスプライトシート分割数を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/8ca02e7f-16d7-4d95-0ed3-d10e791ba31d.png)

ただし、これだけではまだテクスチャは動きません。

## STEP2. Flipbook Playerを追加
Updateノードに`Flipbook Player`ブロックを追加することで、アニメーションが**動くようになります**。
frameRateの部分にフレームレートを指定します。　今回は24を指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/b0ce43a4-de73-aa87-9546-5c16c44fde18.png)

以上でエフェクトは完成です。 

## 完成したエフェクト
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/f289fdc2-bc63-453c-5d44-a1c23b3336c9.gif)

炎が光っている感じはPost Processing StackのBloomを使って作っています。
#Ruby #Rails + #rspec で rspec-benchmark gem を ”使わず" に速度検証・ベンチマークテストをする

# Speed test and benchmark test "do not use" with rspec-benchmark gem with #Ruby #Rails + #rspec


# ポイント

- rspec を使うと色々とテストデータを作成/自動削除などしてくれるので、新しい仕組みを用意しなくて良い
- rspec-benchmark gem がなぜかうまく動かなかった
- 以下の例はデータ生成などはしていないが、 FactoryBot を組み合わせたりすると便利

# 速度を検証する

```rb
require 'benchmark'

describe 'sleep 5 seconds ( expect speed )' do
  subject do
    Benchmark.realtime { sleep 5 }
  end

  it { is_expected.to be < 6 }
end

# sleep 5 seconds ( expect speed )
#  should be < 6
```

# 速度は検証せず、標準出力で結果確認だけをする


```rb
require 'benchmark'

describe 'sleep 5 seconds ( not expect speed but stdout benchmark result )' do
  subject do
    Benchmark.realtime { sleep 5 }
  end

  it { puts subject }
end

# sleep 5 seconds ( not expect speed but stdout benchmark result )
# 5.003996700048447
#  example at ./spec/some_spec.rb:18
```

# 速度検証をしつつ、標準出力で結果も確認する

```rb
require 'benchmark'

describe 'sleep 5 seconds ( expect subject result and stdout benchmark result )' do
  subject do
    sleep 5
    true
  end

  it do
    subject_result = nil
    benchmark_time = Benchmark.realtime { subject_result = subject }
    puts benchmark_time

    expect(subject_result).to be true
    expect(benchmark_time).to be < 6
  end
end


# sleep 5 seconds ( expect subject result and stdout benchmark result )
# 5.005656399996951
#   should be < 6
```

# 結果の例

```
rspec -fd some_benchmark_spec.rb
```

![image](https://user-images.githubusercontent.com/13635059/61013831-531cfb00-a3bf-11e9-99ff-026ecefeefc6.png)



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Swift】ライブラリ Example を Carthage で管理する方法

# はじめに
Carthage でライブラリを管理する場合 Cartfile に `github "ReactiveX/RxSwift"` といった感じで設定を記述すると思います。実は、ここにはローカルリポジトリを指定することも可能です。
この機能を使って scheme を分けて example を作成しているライブラリを Carthage で管理する方法をご紹介します。

この記事は [AkkeyLab/RxScreenProtectKit](https://github.com/AkkeyLab/RxScreenProtectKit) というライブラリを作成・公開するにあたって学んだことをまとめたものになります。

# 問題
[ドキュメント](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#example-cartfile) にもある通り `git "file:///directory/to/project" "branch"` という形式で記述すればいいことがわかります。
しかし、相対パス指定ができません（私の環境・方法では）。

# 解決策
```sh
echo "git \"file://$($(dirname $0); pwd)\"" >> Cartfile
```
Cartfile の保存場所がライブラリの保存場所と同じ場合、このスクリプトを実行することで、問題を解決できます。やってることとしてはカレントディレクトリの絶対パスを生成して Cartfile に追加しているだけの単純なものです。

```ruby
git "file:///Users/name/Development/RxScreenProtectKit"
```

成功例も載せておきます。

# おわりに
[AkkeyLab/RxScreenProtectKit](https://github.com/AkkeyLab/RxScreenProtectKit) にも導入しておりますが、 example プロジェクトを動かしたい人用のスクリプトを準備しておくといいかもしれません。ここにも載せておきます。

```sh

#!/bin/bash

function command_exists {
  command -v "$1" > /dev/null;
}

echo "git \"file://$($(dirname $0); pwd)\"" >> Cartfile

# carthage
if ! command_exists brew ; then
  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  brew update
  brew upgrade --all
  brew doctor
  brew -v
fi

if ! command_exists carthage ; then
  brew install carthage
fi

carthage update --platform iOS --no-use-binaries --cache-builds

# SwiftLint
if ! command_exists swiftlint ; then
  brew install swiftlint
fi
```

# 追記
![Screen Shot 2019-07-12 at 16.27.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128344/0ba73230-7020-ac92-4d49-19024844529c.png)
実は Embedded Binaries の項目にビルドすることで自動生成される framework ファイルを追加する方法が一般的だと思います。ライブラリ開発時にサンプルを頻繁に使う場合、確実にこのほうが効率的です。この記事は方法の一つとしてご覧ください。
【Emmet】コーディング方法について

# Emmetとは
今回はHTMLの記述を簡略化するemmetについてまとめていきたいと思います。
Emmetは、ほとんどのエディターでプラグインとして用意されています。

Emmet（旧：Zen Coding）は既定形式の入力補完機能によりHTML、XML、XSL等を素早く編集できる、テキストエディタ用プラグインである。2008年にVadim Makeevが開発を始め、Sergey Chikuyonokと利用者によりMIT Licenseのオープンソースとして継続して開発されている。 多くの著名なエディタに実装されているが、特定のソフトウェアに特化して開発されておらず、どのテキストエディタにも偏向していない。-- [Wikipedia(日本語訳)](https://ja.wikipedia.org/wiki/Emmet)
# 使用方法
今回はatomでの使用方法について解説します。
環境設定のパッケージでemmetと入力しインストールだけで使用できます。
<img width="1024" alt="スクリーンショット 2019-07-11 10.56.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451805/6b36db4b-b129-c865-0a31-a181cf9d868a.png">

## 記述方法
記述したらtabキーで実行します。

``` html
div>ul>li*3
 <!-- tabキーで実行する-->
 <!--実行結果 -->
<div>
  <ul>
    <li></li>
    <li></li>
    <li></li>
  </ul>
</div>
```
上記ではdivタグの中にli*3でliタグを3つ作成しています。

``` html
p+ul>li
 <!-- tabキーで実行する-->
 <!--実行結果 -->
<p></p>
<ul>
	<li></li>
</ul>

```
親子にしたくない場合+で繋いだコードを入力します。

``` html
div#section>ul.list>li.item>a
 <!-- tabキーで実行する-->
 <!--実行結果 -->
<div id="section">
	<ul class="list">
		<li class="item"><a href=""></a></li>
	</ul>
</div>
```
.や#で、class名とid名を設定できます。

``` html
div>a[href=http://hogehoge.com]
 <!-- tabキーで実行する-->
 <!--実行結果 -->
<div><a href="http://hogehoge.com"></a></div>
```
"は自動で付けられます。
imgタグはimg[src=hoge.png]で同様に使用できます。

``` html
ul>(li>a{link$})*4
 <!-- tabキーで実行する-->
 <!--実行結果 -->
<ul>
	<li><a href="">link1</a></li>
	<li><a href="">link2</a></li>
	<li><a href="">link3</a></li>
	<li><a href="">link4</a></li>
</ul>
```
()でグループ化を行い、{}内にテキストを入力し、$を使用して連番を付け加え、*4でまとめてliタグ4つを作成しています。

# あとがき
以上、今回はEmmetについてまとめてみました。
Emmetを使用する事に捉われると逆に時間がかかったりする場合もあるので、普段面倒だなと感じる時に使うくらいが丁度良いかもしれませんね、、:ghost:
CocoaPods 1.7でCDNを使ったらSpecs更新が爆速だった

# tl;dr

CocoaPodsをv1.7系にしてCDNをsourceにして爆速！

## CocoaPods v1.7

CocoaPodsのv1.7系が5/23にリリースされています。
あまりCocoaPodsは追っていなかったのですが、Specsの更新が爆速になってて感動したのでまだの人は使ったほうがいいです！

## CDNサポート

v1.7からsourceとしてCDNがサポートされ
[1.7.2からFinalizeされNetlifyでホストされているようです。](http://blog.cocoapods.org/CocoaPods-1.7.2/)

Specs.gitのかわりにcdnをsourceに指定しましょう。

```diff
- source 'https://github.com/CocoaPods/Specs.git'
+ source 'https://cdn.cocoapods.org/'
```

でも使ってみた感じだとbeta1で案内されていたjsdelivr.netの方が早かったです。

### CDNソースだと必要なSpecだけ取得できる

以下のPodを利用している環境で試しました。

```
Crashlytics
DeallocationChecker
Fabric
Mockingjay
Periphery
SwiftFormat
SwiftGen
SwiftLint
URITemplate
```

ゼロからSpecs.gitを更新すると手元で2分かかるところが・・・
CDNだと利用しているPodのSpecだけDLされます

```
Resolving dependencies of `Podfile`
  CDN: jsdelivr-cocoa Relative path downloaded: Specs/5/e/d/SwiftFormat/index.txt, save ETag: W/"2eb-6gklZWWeegEzBbq63V1uA8xQgu8"
  CDN: jsdelivr-cocoa Relative path: Specs/5/e/d/SwiftFormat/index.txt modified during this run! Returning local
  CDN: jsdelivr-cocoa Relative path downloaded: Specs/5/e/d/SwiftFormat/0.13/SwiftFormat.podspec.json, save ETag: W/"1ea-z72pQ1Xtukf7S9Ip+lU60dloSNg"
  CDN: jsdelivr-cocoa Relative path downloaded: Specs/5/e/d/SwiftFormat/0.16/SwiftFormat.podspec.json, save ETag: W/"1ea-4yhY9JtA+tyAFcmG52nHey4IYGc"
  CDN: jsdelivr-cocoa Relative path downloaded: Specs/5/e/d/SwiftFormat/0.16.3/SwiftFormat.podspec.json, save ETag: W/"1ee-EDv9/GnjwZJZpIb/nCzuPNfAy+o"
  CDN: jsdelivr-cocoa Relative path downloaded: Specs/5/e/d/SwiftFormat/0.16.1/SwiftFormat.podspec.json, save ETag: W/"1ee-/+ETQMcayrjdya79gkc0dwEHyko"

略

bundle exec pod install --repo-update --verbose  1.75s user 1.37s system 78% cpu 3.955 total
```

**約4秒**で終わってしまいました！
なんてこった**30倍速**！

みんな使おう！

### CircleCI使ってる人向け

CircleCIではSpecs更新を高速化するために `cocoapods-specs.circleci.com/fetch-cocoapods-repo-from-s3.sh` が案内されています。
執筆時点のこのスクリプトの中身は従来のSpecs.gitを更新する内容になっています。

速いといっても4分ぐらいかかるので、上述のCDNからの必要Specだけの取得に比べると雲泥の差ですし
今後スクリプトの中身がCDN sourceに対応したのだとしても所要時間に意味のある差は生まれないと思いますので利用をやめて素朴な

```
[bundle exec] pod install [--repo-update]
```

するだけで良いと思います。
IBMCloud CLIがインストールできない問題

IBM dojoのハンズオン行こうとしたんですが、事前準備でこけてしまい断念。
というわけで、局所的ですがハンズオンの準備で困った人向け。

自分は国語力ないので読み飛ばしたかも？と思うも、同じところで詰まってる人いるかもなので。


## IBMCloud CLIがインストールできない
事前に配られたのはこちら

>手順書
>https://ibm.ent.box.com/notes/438467376834?s=02elenhgg2fblcwq6n5q3d9lsji48jcr

手順書の通り、IBMCloudCLIのコマンドを実行
`Set-ExecutionPolicy Unrestricted; iex(New-Object Net.WebClient).DownloadString('http://ibm.biz/idt-win-installer')`



**結果**
画面取り損ねたのでERRORメッセージが若干違うかもしれませんが以下のようなエラー

```
[main] --==[ IBM Cloud Developer Tools - Installer for Windows, v1.2.2 ]==--
[install] Starting Installation/Update...
[ERROR] C:\Program Files\IBM\Cloud\bin\ibmcloud.exe
is not recognized as the name of a cmdlet, function, script file, or operable program.
```



たしかに、こやつ、いれた覚えないですし。。。
C:\Program Files\IBM\Cloud\bin\ibmcloud.exe

## スタンドアロン IBM Cloud CLI のインストール

ということで、
こっちをやってみたらインストールできた

>スタンドアロン IBM Cloud CLI のインストール
>https://cloud.ibm.com/docs/cli?topic=cloud-cli-install-ibmcloud-cli&locale=ja#install-ibmcloud-cli

```
PS C:\Windows\system32> ibmcloud --version
C:\Program Files\IBM\Cloud\bin\ibmcloud.exe version 0.16.3+68cb57c-2019-06-20T08:59:16+00:00
PS C:\Windows\system32>
```

完了後、再度インストールコマンド実行
進んだ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/8bfe6d23-a568-9a7f-2334-290484a19ff8.png)


その後は手順書通りです。
再講演あればまたハンズオンにチャレンジしたいなー。と
Laravel --resourceコマンド

#何が言いたい
Laravelの`--resource `コマンドがうれしい。
自分のような初心者が一からCRUD機能付きアプリを実装したいとき、何をしたらいいかを示してくれる。
＝＞はじめの一歩でコケにくい。

#--resourceコマンド
Laravelでは`php artisan make:controller FooController`とコマンドを実行すると、FooControllerのひな型が作成されます。

```FooController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class FooController extends Controller
{
  //
}
```

これだけでもありがたいのですが、中身がまっさらなので初心者的にはこれからどうすればいいかわからない...

そこで、上記のコマンドを実行する代わりに、末尾に`--resource`を追加して、
`php artisan make:controller FooController --resource`とコマンドを実行すると...

```FooController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class FooController extends Controller
{
     /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    // 中略 //
    // create, store, show, edit, updateメソッドが含まれます //

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Foo  $foo
     * @return \Illuminate\Http\Response
     */
    public function destroy(Foo $foo)
    {
        //
    }
}
```

このように、登録・更新・参照・削除に必要なメソッドを簡単に用意してくれます🎉

次にこれらのメソッドを使用するために、ルーティングを設定しましょう。
と言っても...

```web.php
Route::resource('foo', 'FooController');
```

これをweb.phpファイルに追加して終了です。
`php artisan route:list`コマンドを実行すると、それぞれのルーティングが設定できているのが確認できると思います。


あとはそれぞれのメソッドの中に処理を書いていけばいいので、作業の見通しがつきますね！

#おわりに
間違いがある場合、もしくはより良い方法がある場合には、忌憚なくご指摘いただけると嬉しいです。
Kotlin のプロジェクトでもライブラリが Java8 に依存していれば compileOptions の指定が必要

## 結論  

Kotlin だけで書いてる Android のプロジェクトで Java8 が使われているライブラリを使用する場合でも、compileOptions が必要  
(Kotlin だけ使ってるプロジェクトだと意識しないから忘れがち)

```
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
```

## 今回の現象との遭遇  

[material-components 1.1.0-alpha08](https://github.com/material-components/material-components-android/releases/tag/1.1.0-alpha08) が出たので Kotlin だけで書いてるプロジェクトで使おうとしたら、以下の現象に遭遇しました。

* 実機デバッグの時にビルドは通るが layout の inflate でクラッシュしている
* assembleDebug をするとエラーが出る

```
Execution failed for task ':app:mergeExtDexDebug'.
> Could not resolve all files for configuration ':app:debugRuntimeClasspath'.
   > Failed to transform artifact 'material.aar (com.google.android.material:material:1.1.0-alpha08)' to match attributes {artifactType=android-dex, dexing-enable-desugaring=false, dexing-is-debuggable=true, dexing-min-sdk=21}.
``` 

よく見たら Java8 に依存してるて書いてるからもしかしてと思ったらそうだった:sweat_smile:
Webデザイン初心者に役立つ(と思う)サイト4選

### はじめに
某新宿のＩＴ系専門学校一年のYuumaと申します。
今学校の授業でhtmlでWebページを製作しているのですが制作している過程で役に立ちそうなサイトをいくつか見つけたので紹介していきたいと思います。

## Unsplash
知っている人も多いと思いますがこのサイトは60万枚以上の美麗な写真が著作権フリーで使えるサイトです。(しかも商業利用もＯＫ)
著作権フリーなので探せばいろいろなブログやサイトでこのサイトの写真が使われてます。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206739/ec56d207-cff3-561f-6565-2b487d2bd113.jpeg)

サイトには検索機能があるほかアカウントを作ればお気に入りを設定することもできますし複数の写真をまとめたコレクションといったものを作ることもできます。

![robert-bock-cV4qkkorDFY-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206739/4a3fd1c3-50ac-6caf-e5c7-077f78ee345b.jpeg)

↑こんな感じの綺麗でエモい画像がたくさんあります。
Url [https://unsplash.com/](https://unsplash.com/)

## fontisto
こちらは様々なアイコンが使えるCSSファイルを配布しているサイトです。また、アイコンを個別にsvgファイル形式でダウンロードすることも可能です。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206739/48cf44f2-ce6a-ca42-b214-0fdc70714ec4.jpeg)

fontistoにあるアイコンは例えば車や携帯、顔文字といった一般的なものからTwitterやInstagram,Lineなどといった有名なアプリのアイコンやappleやgoogleといったブランドのロゴ。果てはubuntuのロゴまであります。
また、ページにアクセスすると画面下部にメニューが表示されそのメニューの設定次第で背景のスタイルや角度回転のアニメーションなどが設定可能です。
Url [https://www.fontisto.com/icons](https://www.fontisto.com/icons)

## flatuicolors
このサイトは色を選ぶ際に使えるサイトです。![flatuicolors.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206739/a9b44f71-9931-4ed4-e28a-959087054537.jpeg)
サイトにアクセスすると上のような画面が出てきます。
画面の好きな色のボタンをクリックするとクリップボードに指定した色のカラーコードが保存できます。
サイトを作る際に色をどうしようかと迷った場合にとても役に立つサイトです。
Url [https://flatuicolors.com/](https://flatuicolors.com/)

<!---
  STDIO　2019/10/13追記
-->

## STUDIO
最近デザインの練習用に使っているサイトです。
コードを書かずにマウスでボックスや写真(Unsplashの写真を検索して配置するも機能あります)・文章などを配置するだけで簡単にwebページを作ることができるサイトです。
枠線やmargin,padding背景色hover時の状態boxの大きさといった細かい値をマウス一つで調整できるのはかなり便利です。
テンプレートもあるので初めての人でも扱いやすいかなと思います。
下の画像は30分ほどで適当に作ったログインフォーム的な何かです
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206739/e246abdc-ad7a-d53b-e733-d34be24e75b5.png)

最近私はこのサイトで仮のデザインを作成してそれを元にhtmlやcssを書いてます。

url [https://app.studio.design]
(https://app.studio.design)

##　おわり
この記事がWeb初心者の役に立てばいいなと思います。
良かったらいいね押していってくださいm(__)m
２枚の画像から中間画像を生成する

# はじめに

２枚の画像から中間画像をさくっと生成したかったので opencv を使って書いてみました。
メモ程度の内容ですが誰かの参考になればと思います。

# ソースコード

```python:generator.py
#coding:utf-8
import numpy
import cv2

split = 10
imgStart = cv2.imread("start.jpg")
imgEnd = cv2.imread("end.jpg")

# 0.0～1.0
imgStart = (imgStart / 255)
imgEnd = (imgEnd / 255)

calc = split - 1
for i in range(split):
    imgTmp = (imgStart / calc * (calc - i)) + (imgEnd / calc * i)
    imgRes = cv2.resize(imgTmp,(640, 480))
    
    cv2.imshow("color", imgRes)
    cv2.imwrite(str(i) + ".jpg", imgTmp * 255)
    cv2.waitKey(10)

cv2.waitKey(0)
cv2.destroyAllWindows()
```

# 実行結果

## 実行前

generator.py / start.jpg / end.jpg の３ファイルがある状態で実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/733ecac7-41b0-0696-5d41-3cfdd3c84a68.png)

## コマンド

```shell
python generator.py
```

## 実行後

0.jpg ～ 9.jpg の計１０枚の画像が出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/eb053f79-1e84-3421-b149-132aa4a5426d.png)

# 終わりに

*よければ ブログ「[Unity+AssetStoreおすすめ情報](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
これからを生きる。なぜエンジニアなのか

どうも！！！チャンクノです。
今回は技術的なことについてではありません。
私がなぜ前職を退職し、エンジニアを目指したのかを書きます。
同じ考えを持っている方がいてくださると私としても励みになります！
私はプロフィール欄に書いてある通り葬儀社で働いていました。
ここでは私が前職を退職した理由について書きます。

# ①新しいことにチャレンジしていく仕事がしたいと思ったから
前職では毎日のようにありがとうと言われるため、やりがいこそ感じていましたが、ほとんど毎日同じ作業の繰り返しでした。
そんな日々を過ごしていく中で、私自身あまり成長している実感が持てずにいました。
  一方エンジニアは常に新しい技術が生まれてくるため既存の知識も新しい知識も同時に習得していく必要があり、毎日新しいことに取り組めます。また、新しいことに挑戦すればするほど自分の将来の選択肢が広がっていく職業であると考えています。なので今回エンジニアに転職することを決めました。

# ②なぜエンジニアなのか
私がプログラミングをしっかり学ぼうと思った理由は二つです。
一つ目は自分の考えを形にできる職業だと感じたからから、二つ目はやってみたら結構楽しかったからです。

### １.自分の考えを形にできる職業だと感じたから
私は大学時代パワーポイントを使ってプレゼンテーションをする授業を受けて、自分の考えを形にすることが好きになっていました。
プログラミングスクールでは簡単なアプリを作成しそれを発表する機会があり、改めて自分で作成したものを人に見せる楽しさを再認識しました。
私には前職の経験から人々が経済的自由を得られるようにしたいという想いがあり、現代において誰もが見れるweb上で発信することが一番だと考えました。それを形にするためにはエンジニアになる必要があるためエンジニアを目指しています。

### ②やってみたら意外と楽しかった
これ結構大事なんじゃないですかね。私はhtmlに触れてみて楽しいと感じました。当然楽しいことばかりではないですけどね笑
むしろ今は辛いことの方が多いです。でも辛いのは当たり前のことだと思います。だって初めて学ぶことだもん。
まあ楽しいと感じるかどうかというよりもやってみるということが大事ですね。中にはプログラミングに全く触れずにスクールに通い、結果辞める方がいるみたいですが流石にそれは時間の無駄だと思います。有料のスクールだったらお金も無駄になってしまいます。今は無料で学べる環境が整っているみたいなのでまずはそちらで学んでみるのがいいでしょう。
現在プログラミングを学んでいる人はこれからもお互いに頑張っていきましょう！！！
では皆様のよきプログラミングライフを祈っております。
RHEL7にRをインストール

------2019/7/11追記------

X11のlibraryがないため、with-x=noとオプションをつけていましたが、
解決しました。下記パッケージをインストールすれば大丈夫です
`libXt-devel`
------2019/7/11追記------


時間がかかり、参考にしたサイトも複数あったので備忘録

※前提※
　もし、Python2系からPython3系に変更していた場合は、yumを使ったインストールで
　エラーが発生する。
　その場合は、下記サイトを参考にして当該ファイルを修正する。
  https://www.logw.jp/cloudserver/8702.html
　

方法１：yumを使ってインストール
方法２：Rのパッケージをダウンロードしてインストール

方法１は、下記サイトの通り
[https://weblabo.oscasierra.net/rlang-install-centos7/](https://weblabo.oscasierra.net/rlang-install-centos7/)

しかし、この方法だとエラーが起きてしまい、インストールすることができない
　（具体的なエラーはここhttp://urx.space/LVE1）

そこで、方法２よりインストールする。

方法２では、下記サイトが一番わかりやすかった
https://fmhk23.github.io/RonCentOS7.html

私の環境では、c++コンパイラが入っていないと
エラーが発生しました。同様なエラーが起きた場合は、下記サイトも参考にする
C++コンパイラインストール→https://rcmdnk.com/blog/2017/04/04/computer-linux/

※その他参考にしたサイト
　http://urx.space/AvuG
　https://www.21064.com/?p=747
　

以上
WebStormで自動保存時にPrettierを実行するようにしたら、キレイなコーディングがとても捗る。

本稿ではWebStromにPrettierを組み込んで、ファイル自動保存時にPrettierを実行するようにする設定方法を紹介する。


## 背景知識

* WebStorm: JavaScriptをターゲットとした統合開発環境。
* [Prettier](https://prettier.io/): Node.js製のコード整形ツールで、JavaScript、TypeScriptを始めととした複数のプログラミング言語をサポートする。
* [Opinionated and automated code formatting](https://www.thoughtworks.com/radar/techniques/opinionated-and-automated-code-formatting): 独断的で自動的なコード整形。コーディングスタイルについてチームで不毛な議論するのを避け、コーディングの本質(=動作すること)に集中するためのプラクティス。

## WebStormでファイル自動保存時にPrettierを実行する方法


1. 「Preference」→「Tools」→「File Watchers」を開き、「+」を押し、「Prettier」のテンプレートを選ぶ。
<img width="1178" alt="Screen_Shot_2019-07-11_at_10_24_27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/93656403-88c4-4aff-06e3-39384f9b9811.png">
2. 「File type」を「TypeScript」などを選択する。「Auto-save edited files to trigger the watcher」にチェックを入れて、ファイル自動保存時にPrettierが実行されるようにする。
<img width="692" alt="New_Watcher.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/3896b28e-6204-3a76-6c8c-296a6cf42c00.png">

以上。


※ToolsにFile Watchersが無い場合は、File WatchersプラグインをWebStormにインストールする必要がある。

## 所感

* コードを変更するたびに、コード整形が自動で走るので、雑に書いてもコードがわりとキレイな仕上がりになって楽ちん。
Implクラス Voクラス

https://matome.naver.jp/odai/2141432737100734901

```
-Implクラス接尾辞パターン

インターフェイス名には特別な接辞をつけず、
そのインターフェイスを実装したクラスに Impl 接尾辞をつけるパターン。
Javaなどで見られる。
```

へー　と思ったのでメモりますっ(^^)/
技術文書での長音記号について

日本工業規格(JIS)[1]にしたがうのを原則とする．
内閣告示第二号[2]やマイクロソフトの文書における慣例と原則が異なることに注意が必要である．

例えば， JISの原則では「コンピュータ」が内閣告示第二号の原則では「コンピューター」となる．

[1] 日本工業規格 JIS Z 8301：2008 https://kikakurui.com/z8/Z8301-2011-01.html
[2] 外来語の表記, 内閣告示第二号
http://www.mext.go.jp/b_menu/hakusho/nc/k19910628002/k19910628002.html
[3] 有限会社　山之内総合研究所, 実践テクニカルライティングセミナー, 第9部　用字用語の選び方と用例, 外来語のカタカナ表記, 技術文書での長音記号の扱い方
http://www.yamanouchi-yri.com/yrihp/techwrt-2-4s/t-2-4s07a-1.htm
[4] 一般財団法人テクニカルコミュニケーター協会, 外来語（カタカナ）表記ガイドライン
https://www.jtca.org/standardization/katakana_guide_3_20171222.pdf
https://www.jtca.org/standardization/
数の集合を受け取って、正規分布を仮定して、その正規分布に従う乱数を返す


難しい話ではないんですが、

ある数字の集合があったときに、それが正規分布に従うと仮定して、その正規分布に従う乱数をたくさん得たい。

これを実行する関数を作ってみました。


```python
import numpy as np
def random_gauss(numbers, size=10):
    return np.random.normal(loc = np.mean(numbers), scale = np.std(numbers), size  = size)
```

これで、たとえば得られた数字が [5, 4, 5, 6, 5, 4, 5] で、それが正規分布に従うと仮定して、その正規分布に従う乱数を 10 個得たいとします。


```python
obtained = [5, 4, 5, 6, 5, 4, 5]
random_gauss(obtained, 10)
```




    array([4.77977069, 4.6853802 , 5.26933192, 4.53865225, 5.24104428,
           3.92201318, 4.31394991, 5.11750001, 5.14838062, 3.23263734])



10x10 の配列にしたければ、このように使えます。


```python
obtained = [5, 4, 5, 6, 5, 4, 5]
random_gauss(obtained, (10, 10))
```




    array([[4.29329647, 5.2471627 , 4.71340084, 5.85465204, 5.89516407,
            4.55110482, 6.25525269, 4.64901171, 5.42536685, 5.58770788],
           [5.67861129, 4.94102328, 6.77790586, 3.8582164 , 5.36784665,
            5.43751184, 5.14030784, 4.78585029, 4.7084496 , 4.25353288],
           [4.26591012, 4.24099113, 5.46428238, 5.27744576, 4.41300475,
            6.07647302, 5.05453331, 5.97655124, 4.98670422, 5.17337313],
           [4.40873499, 4.5629429 , 3.73268542, 4.82958227, 4.40850147,
            6.28637949, 4.65911079, 4.15151204, 4.89566688, 5.28266135],
           [4.7034054 , 5.17026093, 4.4403553 , 4.62355895, 4.7855689 ,
            4.67839428, 6.01478859, 5.74358323, 5.11884483, 5.11134914],
           [4.0797462 , 3.95483888, 4.51260295, 5.84880821, 2.84667954,
            5.31916493, 4.73691626, 4.75109749, 4.58356682, 4.55128143],
           [5.84606006, 4.38274727, 5.324277  , 5.12168242, 3.60557967,
            4.92809603, 4.78279947, 5.85618519, 4.4952449 , 4.61218377],
           [4.06391996, 5.49536423, 3.91027041, 5.23696996, 4.64761352,
            3.98023659, 4.73758287, 5.12500023, 5.6862004 , 5.72124111],
           [4.8539152 , 5.50043533, 5.88674704, 4.3603309 , 4.56167419,
            4.94060109, 5.64930582, 4.28465173, 4.79660025, 4.69518196],
           [4.59096486, 5.24698098, 4.95728241, 5.00961799, 4.35292064,
            4.02801381, 5.58337414, 5.71661697, 4.38613982, 5.57674788]])

簡単、簡単。
【JavaScript】ifやswitchを使いたくなくて変数名も考えたくない時の方法

分岐が多くても見た目がカオスにならない三項演算子の代替的な何か。
ふと思いついたのでメモっておきます、結構便利。


# ズバリ
```js:JavaScript
const str = "aaa";
const num = 0;
const arg = "0123";

// 戻り値がある場合
const result = {
    "aaa": v => `${v}hoge`,
    "bbb": v => `${v}huga`
}[str](arg);

// 戻り値がない場合
({
    "aaa": v => console.log(`${v}hoge`),
    "bbb": v => console.log(`${v}huga`)
})[str](arg);

// プロパティ名ではなくメソッド名としてもOK
const result = {
    "aaa"(v){
        return `${v}hoge`;
    },
    "bbb"(v){
        return `${v}huga`;
    },
}[str](arg);

// オブジェクトの中身がリテラルや変数でもOK
const result = {
    "aaa": "hoge",
    "bbb": "huga"
}[str];

// 配列にも応用可能
const result = [
    v => `${v}00`,
    v => `${v}01`
][num](arg);
```


# SpecialThanks!
- [javascriptでifやswitchを書きたくない時に - Qiita](https://qiita.com/takayan_papa/items/1417ce7495a0f25d85cf)
Dockerで、さくっとGrafanaを起動するスクリプト


以下の内容を、```start-grafana.sh```ファイルで保存して実行。

```bash
IMAGE_NAME=grafana/grafana
CONTAINER_NAME=grafana

for container_id in $( docker container ls --all --quiet --filter name=$CONTAINER_NAME); do
  docker container rm --force ${container_id}
done

docker container run \
  --detach \
  --env "GF_SERVER_ROOT_URL=http://localhost:3000" \
  --env "GF_INSTALL_PLUGINS=grafana-polystat-panel,bessler-pictureit-panel" \
  --mount type=volume,source=grafana_lib,target=/var/lib/grafana \
  --name=$CONTAINER_NAME \
  --publish 3000:3000 \
  $IMAGE_NAME 

echo "http://localhost:3000 login to grafana with admin/admin"
```

プラグインを追加したい場合は、下記の部分にプラグイン名を追加して、再実行。

```bash
  --env "GF_INSTALL_PLUGINS=grafana-polystat-panel,bessler-pictureit-panel" \
```

## 追記

InfluxDB + Grafana を起動するサンプルも作りました。
https://github.com/satotka/docker-grafana

- docker-composeを利用。コンテナ起動オプションをYAMLファイルで定義。
- Makefileを利用。```make up```とコマンド打つだけで起動。
- Grafanaのプロビジョニングを利用し、データソース設定も事前定義可能。
  - ダッシュボードも事前定義出来そう。詳しくはこちら https://grafana.com/docs/administration/provisioning/