OmniAICreator/Qiita-1.07M huggingface dataset:
FludSynth.jlを使ってJuliaで音を鳴らす

Juliaアドベントカレンダー10日目です。

Juliaを使ってmidiの演奏をしてみたいと思います。
音を鳴らしても良い環境でお楽しみください。

# 環境
Ubuntu18.04での動作を想定してます。
他の環境だとfluidsynth.jlを直さないと動きません…。

# 準備
今回はfluidsynthというオープンソースのソフトウェアシンセサイザーをJuliaから操作します。

## midiの用意
一定以上の年齢の人はお世話になったはず。
隠し持ったmidiを引っ張り出してくるもよし、[MuseScore](https://musescore.com/)などで探すも良しです。

## SoundFontの用意
midiファイルは楽譜のようなもので、どのタイミングで、どの楽器の、どの音階を鳴らすかという情報は持っていますが、楽器の音色の情報は持っていません。
ですので、midiだけでは音が出せません。
音色の情報を持つのがSoundFontというファイルです。
[ダウンロード可能なサウンドファイルのリスト](https://musescore.org/ja/handbook/sauntofuontoto-sfz-fuairu#list)からダウンロードするか、aptからも以下で入手可能です。

```
sudo apt install fluid-soundfont-gm
```

ちなみにFludSynth.jlのtestフォルダにもヴァイオリンの音色のみですが、SoundFontが含まれているので、探すのが面倒な人はそちらを使用しても良いです。


## ライブラリのインストール
Pkg REPL-modeでPkg.addしてください。

```julia
add https://github.com/yukota/FluidSynth.jl.git
```
お気づきでしょうか…。私の自作ライブラリです。このあいだ作りました。
依存ライブラリも自動で入るようにしていますが、失敗するようならlibfluidsynth-devをaptで入れてください。

# 実装
midi(test.mid)、SoundFile(violin_sample.sf2)を読み込んでスピーカーから音を鳴らします。

```julia

using FluidSynth

settings = Settings()

# Mac, Windows, LinuxでJackを使用している人は以下をコメントアウトしてください
setstr(settings, "audio.driver", "pulseaudio")

synth = Synth(settings)
sfload(synth, "violin_sample.sf2")

player = Player(synth)
audio_driver = AudioDriver(settings, synth)


add(player, "test.mid")
play(player)

FluidSynth.join(player)

```

# 解説

## サウンドサーバー
```julia
setstr(settings, "audio.driver", "pulseaudio")
```
この行のpluseaudioってなんだろうと思った人がいるかもしれません。
Linuxで音を出す場合、ALSAという層がオーディオインターフェースなどに対する、デバイスドライバになります。
このALSAの一つ上の層、どのデバイスから音を出すか、音量の調節などを受け持っているのがサウンドサーバーになります。
サウンドサーバーには大きく2つのソフトがあり、今回指定したPluseAudioとJACKがあります。
UbuntuのデフォルトだとPluseAudioが採用されています。
fludsynthのデフォルトはJACKになっているため、今回はこのパラメータを設定しました。
逆にUbuntu StduioだとJACKが採用されているため、デフォルトのままで大丈夫です。

## midiの作り方
楽譜作成ソフトなどで作れます。
[MuseScore](https://musescore.org/)が無料でおすすめです。
aptでも入ります。

## SoundFontの作り方
録音環境については割愛します。
強いて言うなら、新しくオーディオインターフェースを買うぞ！と思っている人は以下のサイトでALSAが対応しているやつを確認してから買いましょう。
https://www.alsa-project.org/main/index.php/Matrix:Main
https://wiki.linuxaudio.org/wiki/hardware_support
ちなみに私のRoladのQUAD CAPTUREはUSBを指した時のボリュームから変更ができないという微妙な動きをしてました…。
面倒だったのでWindowsで録音しました…。
録音したwavを入力に、[POLYPHONE](https://www.polyphone-soundfonts.com/)でサウンドフォントが作れます。


# まとめ
好きな音楽を鳴らすことはできたでしょうか？
それでは良いクリスマスを。
Cloud Functionsでimport文を使う

* babel-cli babel-preset-es2015をdevDependenciesに追加する

```
yarn add --dev babel-cli babel-preset-es2015
```

*  .babelrcのファイルを作成しpresetの記述をする

```
{
  "presets": [
    [
      "es2015", {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}
```

* transpileをscriptsに追加する

```package.json
 "main" : "ディレクトリ名"
 "scripts" :{
  "serve": "npm run transpile && firebase serve --only functions",
},
 "devDependencies": {
  "babel-cli": バージョン名,
  "babel-preset-es2025: バージョン名
}
```
Rails5 アプリ制作から Heroku デプロイ まで 

久しぶりに新しくアプリ作ったらやり方忘れてたのでメモ

#Railsアプリを作成
```
$ rails new newapp -d postgrasql
$ cd newapp
$ bundle
$ rails db:create
$ rails db:migrate
```
Railsアプリ作成まで

#Herokuアプリ名
```
$ heroku create newapp
```
Herokuのアプリ名を決めたい場合は先に作っておく

#Herokuにアップ
```
$ git init
$ git add .
$ git commit -am "testup"
$ git push heroku master
```
Herokuにアップする
これでアップまではできるはず。
Windows Server 2012 R2環境にSnippingToolをインストールしてみる

# 目的
- 開発環境にAWSでWindowsServerを使っているが  
WindowsServerにはデフォルトでSnippingToolが入っていないようなので、インストールした時のメモ

# 環境
- Windows Server 2012 R2 日本語版

# やってみる
1. サーバーマネージャーを起動する
![2018-11-24-12-55-19.png](https://qiita-image-store.s3.amazonaws.com/0/79318/3b4e5ead-120f-ac4b-c212-0cb1b4bd3b99.png)

2. 機能と役割の追加をクリック  
![2018-11-24-12-56-17.png](https://qiita-image-store.s3.amazonaws.com/0/79318/3e59ed1f-69e6-cea5-ee1b-1bf12a05383f.png)

3. 右側の「機能」のところまで進める  
![2018-11-24-12-58-25.png](https://qiita-image-store.s3.amazonaws.com/0/79318/448b279b-32e5-6525-aec3-ce0e25a89f98.png)
![2018-11-24-12-59-16.png](https://qiita-image-store.s3.amazonaws.com/0/79318/8774f507-fd22-4055-c9b6-edca7be7faca.png)
![2018-11-24-12-57-27.png](https://qiita-image-store.s3.amazonaws.com/0/79318/9d32d903-db4d-3428-514f-2cfb504bc3f4.png)
![2018-11-24-12-57-45.png](https://qiita-image-store.s3.amazonaws.com/0/79318/11036a96-803c-216b-f306-f11b13b27cdf.png)
![2018-11-24-12-58-09.png](https://qiita-image-store.s3.amazonaws.com/0/79318/6caa49fd-3bd1-e134-30a7-04508e2a37c9.png)


4. 「User Interfaces and Infrastructure」を開いて「DesctopExperience」にチェックをつける
![2018-11-24-12-59-38.png](https://qiita-image-store.s3.amazonaws.com/0/79318/7957f9f6-7ff6-4b1c-b7c5-27860bd23ac3.png)

5. 「機能の追加」をクリック  
![2018-11-24-13-02-43.png](https://qiita-image-store.s3.amazonaws.com/0/79318/f9dff592-fb19-f841-9cb4-b15526129ca7.png)
![2018-11-24-13-01-11.png](https://qiita-image-store.s3.amazonaws.com/0/79318/bb625130-dee1-e87a-05cc-e6169c8a2917.png)

6. 「インストール」を実行  
どうやら一緒にペイント系のソフトもついてくるみたい
（スクショ取り損なった。。。。）

7. インストール完了  
![2018-11-24-13-07-15.png](https://qiita-image-store.s3.amazonaws.com/0/79318/6bda10c7-0bf0-4595-a37a-58f5e0218ae6.png)

8. 再起動で完了  
![2018-11-24-13-13-45.png](https://qiita-image-store.s3.amazonaws.com/0/79318/0a299cd7-3c8a-8d24-c023-6ffcfa0f7378.png)

# 参考
- こちらのサイトを参考にさせていただきました（ほぼそのままですが...  
http://coelacanth.jp.net/windows-server-2012-r2%E3%81%ABsnipping-tool%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/

# 感想
- 個人開発用は Windows Server 2016 なんだけど、最初から一式入ってるんだよねぇ。  
環境差異ってほんと面倒。（でもそれが面白い）
【Unity(C#)】Rayの判定(Tag、Layerを使って衝突させたいオブジェクトの選定)


　　
　　
　　
この記事は

**『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』**

の記事です。そのつもりでお読みください。 

##Rayってなんやねん
まず**Rayってなんやねん**って思ったので調べて使ってみました。
　　
指定した方向とか指定したゲームオブジェクトから**レーザー光線をだせる機能**っぽいです。
だからといって敵を倒したりunityの必殺技だったりするわけでは無いっぽいです。
 
なぜなら、**Rayは基本的に目視できません**でした。
  
デバック時にシーン上に表示することはできるようですが、ゲーム画面には出てきません。
ゲーム画面に光線を出すには別のコンポーネントでレンダリングした光線っぽいやつを作らないと
(私がアホなだけで方法はあるのかもしれませんが)できませんでした。

##Rayを出して衝突を判定する 
どうやらRayというレーザー光線は**衝突判定**を行えるようで、とても便利でした。

`Physics.Raycast(①Ray ray, ②out RaycasatHit hitInfo, ③float maxDistance, ④int layerMask)`
 

②のout修飾子は正直あんまわかんないです。

[参考サイト](http://stpsysdev.blogspot.com/2015/11/c-refout.html)
↑これを見て、out修飾子を使う理由は
"レイが「何か」に当たる度に変数を「何か」に書き換えることができますよ"
であると勝手に解釈しました。

```C#
 Ray ray = new Ray(transform.position, transform.forward);

 RaycastHit hit; //レイが衝突したオブジェクト

       
 if (Physics.Raycast(ray, out hit, Mathf.Infinity))

  {
   //もしrayとhitが衝突した場合．．．の処理内容
  }
```

###Tagと一致しているか判定してさらに分岐させる

Inspector画面でTagをつけてきましょう。
あと、このやり方だとTagのついたオブジェクトにはコライダーが必要です。

```C#
if (hit.collider.CompareTag("Block"))
 {
    //もしhitのタグが"Block"と一致していた場合．．．の処理内容
 }
```

あとはマウスからレイを出して．．．とか敵の目線からレイを出して．．．とかを
適当に書き加えて使ってください。

---
2019/5/31 追記

**Physics.Raycast(Ray ray, out RaycasatHit hitInfo, float maxDistance, int layerMask)**
について、4つ目の引数である**layerMask**について理解が乏しかったので追記します。

###LayerMask
衝突させたいオブジェクト、させたくないオブジェクトをlayerで判定します。
デフォルトでは0になっているので何も書かないとlayerがDefaultのオブジェクトにのみ衝突します。

例えば1～7番までのLayerを無視したい場合は
このように宣言してから引数としてlayerMaskを渡せば1~7を無視することができます。

```C#
int layerMask = 1 << 8;
```


↓これと同じですね。

```C#
int layerMask = 256;
```

↓逆に8だけ無視したい場合はこうです。

```C#
int layerMask = 1 << 8;
layerMask = ~layerMask;
```
`= ~`を使うことで逆になります。
![layer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/5684b01f-3f63-2cf5-10ea-3272de521b27.png)



###LayerMask.NameToLayer
名前で直接指定して判定できる分、こちらの方が使い勝手がいいような気もします。

```C#
if (hit.collider.gameObject.layer == LayerMask.NameToLayer("レイヤーの名前"))
 {
    //もしhitのレイヤーが指定した"レイヤーの名前"と一致していた場合．．．の処理内容
 }
```

---
2019/3/30 追記

```C#
 Debug.DrawRay(ray.origin, ray.direction*100, Color.red,  0.1f);
```
Rayをデバッグ時に表示。コピペするだけ。
Railsのmigration時にafterを指定しても、場所指定できない（PostgreSQL）

## 動作検証

### CREATE TABLE
```ruby
class CreatePictures < ActiveRecord::Migration[5.2]
  def change
    create_table :pictures do |t|
      t.string :title, null: false
      t.string :subtitle
      t.timestamps
    end
  end
end
```

mysqlの場合

|title|subtitle|created_at|updated_at|
| --- | --- | --- | --- |

postgresの場合

|title|subtitle|created_at|updated_at|
| --- | --- | --- | --- |

この時点では変わらない

### ADD COLUMN
```ruby
class AddUrlToPictures < ActiveRecord::Migration[5.2]
  def change
    add_column :pictures, :url, :text, null: true, after: :subtitle
  end
end
```

mysqlの場合

|title|subtitle|url|created_at|updated_at|
| --- | --- | --- | --- | --- |

postgresの場合

|title|subtitle|created_at|updated_at|url|
| --- | --- | --- | --- | --- |

ここで、PostgreSQLの場合はurlが一番最後に追加される。
そもそもPostgreSQLにAFTERの機能がないため、指定しても意味ない。
vuexのstateとform binding

vuex stateとform bindingのパターンと、
どの方式で試すかの試行錯誤メモ
（vuex側のcodeは省略してます）

# computed propertyで吸収

```html
<input type="text" v-model="parameterName" />
<input type="text" v-model="parameterTel" />
```

```js
computed: {
  ...mapState(['parameters']),
  parameterName: {
    get() { return this.parameters.name },
    set(v) { this.$store.commit('updateParameters', { name: v }) },
  },
  parameterTel: {
    get() { return this.parameters.tel },
    set(v) { this.$store.commit('updateParameters', { tel: v }) },
  },
}
```

* v-modelが使える
* 値は即時stateに反映される
* bindしたい値ごとにcomputed propertyの定義が必要
    * このままだと名前付けも冗長になるため、parameters form部を別componentに切り出すのが良い

面倒...computed propertyだらけになる


# eventで反映

```html
<input type="text"
  :value="parameters.name"
  @change="updateParameters('name', $event)" />
<input type="text"
  :value="parameters.tel"
  @change="updateParameters('tel', $event)" />
```

```js
computed: {
  ...mapState(['parameters'])
},
method: {
  updateParameters (key, value) {
    this.$store.commit('updateParameters', { [key]: value })
  }
}
```


* v-modelの代わりに、`:value`, `@change`
* 値は即時stateに反映される


一番正攻法な気がする


# viewで異なるobjectとして扱い、deep watchで反映

```html
<input type="text" v-model="parameters.name" />
<input type="text" v-model="parameters.tel" />
```

```js
beforeMount: {
  this.parameters = _.cloneDeep(this.$store.state.parameters)
},
data: {
  parameters: {}
},
watch: {
  parameters: {
    handler: function (v, old) {
      this.$store.commit('updateParameters', v)
    },
    deep: true
  }
}
```

* v-modelが使える
* 値は即時stateに反映される
* templateの見通しが良い
* 比較的、処理が重い
    * event連携(v-model含む)と違って、object内の全ての値がobserveしてるため
    * bindするobjectのpropertyが大量 or 階層が深い場合、cloneDeepの処理で必要なpropertyだけ切り出すなど考えた方が良い

codeはsimple. 処理は重め

# viewで異なるobjectとして扱い、eventで反映


```html
<input type="text"
  :v-model="parameters.name" @change="updateParameters" />
<input type="text"
  :v-model="parameters.tel" @change="updateParameters" />
```

or 

```html
<input type="text" :v-model="parameters.name" />
<input type="text" :v-model="parameters.tel" />
<button @click="updateParameters">検索</button>
```


```js
beforeMount: {
  this.parameters = _.cloneDeep(this.$store.state.parameters)
},
data: {
  parameters: {}
},
method: {
  updateParameters () {
    this.$store.commit('updateParameters', this.parameters)
  }
}
```

* v-modelが使える
* 値はstateに即時反映と任意のタイミングの反映のどちらも可能
* 編集状況のdataはview側で管理し、サーバーの最新データはvuex stateで分けて管理できる

# 結論

様々なケースに柔軟に対応できるので最後のコレが良さそう

> viewで異なるobjectとして扱い、eventで反映

下記のような様々なケースに対応しやすそう

* viewの編集作業をキャンセル
    * vuex stateからデータ取り直しだけで済み低負荷
* 編集途中に他画面に遷移した場合、その編集内容は他画面に共有されないようにしたい
    * 気づかず誤って編集してしまっていた場合も含む
* 検索条件formでは、次の検索まで今表示されてるデータの検索条件はvuexに残したい
    * 結果に条件を表示したいケース
    * 定期pollingでデータ再取得をしたいケース
* websocketでリアルタイム更新時、vuex stateは最新化したいが、formにまで反映させたくないケース

etc..
IPythonistaのためのiPadとJunoによるiOSデータ分析環境の勧め

## はじめに
みなさん、新しいiPadProは購入しましたか？
新しいiPad最高ですよ。
Split Viewで本を読みながら、applepencilで手書きのメモをとれたり、
キーボードをつけて、ほぼPCと同じようにも使えます。~~（escがないところを除けば快適）~~
論文のpdfをダウンロードしてきて、線を引いたり、メモをしながら読むなんてことのお手の物です。

アップルの宣伝通り、もはやこいつはタブレットという枠組みの中には収まりきらない怪物なような気がします。無限の可能性を感じます。

そうなると、やりたくなるのは、やっぱりiPadでのコーディングですよね。
開発には[pythonistaという最強の統合開発環境アプリ](http://hitoriblog.com/?p=42145)がiOSには存在していました。

しかし、データ分析環境はどうでしょうか？
[pythonistaだけで「ゼロから作るDeepLearnintg」を学ぶという猛者](http://tomohiko37-i.hatenablog.jp/entry/2016/10/30/070051)もいらっしゃるようですが、
pythonistaではpandasが使えなかったりするようなので、
pandasがないとなにもできない系男子の私にとっては、その時点で詰みです。

safariやchromeなどのブラウザからcolaboratoryに接続して、クラウド上でjupyterを使おうとしても、escがないせいでセル間の移動がめっちゃしずらかったり、矢印移動もiOSのブラウザからの入力には対応していないのかうまく動きません。詰んだ...

しかし、Jupyterの対話的なUIを一度体験してしまうと、
それ以外の環境でデータを分析しようなんて思えません。

なんとしてでもiPad上でJupyterを使いたい！
しかし、iPad Proとはいっても、さすがにデータ分析環境までは整えられないのか...
いいえ、そんなことはありません。そう、iPadならね。

## Juno
<img width="1366" alt="IMG_0051.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/177919/2a297f41-ea70-4683-d37f-a00c44b4e7e1.jpeg">

>We believe developers and researchers deserve better tools, so that they can focus on building new exciting things. That is why we have made Juno, a Jupyter/IPython notebook client for your iPhone and iPad. Juno lets you connect to a notebook server and do everything you do on desktop, anywhere.

開発者や研究者が新しくてエキサイティングなものの構築に集中できるように、より良いツールを使うことがふさわしいと私たちは考えています。これが私たちがJunoを作った理由です。JunoはiPhoneとiPad向けのJupyter/IPython notebookクライアントです。Junoを使えば、notebookサーバーへ接続して、どこでもデスクトップ環境と同じことでできます。

つまり、Junoを使えば、iOSからリモートのjupyternotebookサーバーへ接続して、
iOSに最適化された快適なインターフェースでjupyternotebookを使うことができるのです。

## 試してみた

JunoにはFreeライセンスとProライセンスの2種類あり、
Freeライセンスでは、以下のテンポラリーノートブックのみ利用でき、ノートの保存はできないようです。
<img width="540" alt="IMG_0052.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/177919/cdbc1afe-abd8-2162-20a7-b01694132d06.jpeg">

proライセンスを購入すると、以下のようにAzure Notebooksに接続することができて、
JunoからAzureサーバーにアクセスして、notebookを作ることができます。
（Add Jupyter Notebook Server... から自分で立てたjupyterにもアクセスすることができるようですが、私のようなへっぽこにはそもそもjupyterサーバーを立てること自体がハードルが高いので、ここはMicroSoft様の力を存分にお借りします。）

<img width="538" alt="IMG_0053.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/177919/d60686f6-bfaf-67d4-8b4d-c99e70c59e24.jpeg">

ちなみに、Proライセンスのお値段は$14.99ですが、今なら$10.99で購入することができます。（2018/11/24現在）
日本円だと1300円でした。
某Pythonnista3とほぼ同じ値段なので、購入するしかないですね！

さあ、ここまでくると後は、いつも通りです。
numpyを使ってスクラッチで機械学習アルゴリズムを実装するなり、
pandasを使って、pythonをエクセルのように使いこなすなり、
matplotlibを使って可視化するなり、
scikit-learnを使ってお手軽機械学習をするなり、
stats-modelsを使って統計モデリングを行うなり、
なんなりと好きなことをiPadでやってください。

もう私たちにはPCすら必要ないのです。

## 気になった点

* IMEが日本語に対応していないらしく、日本語を入力することができない点（同様のコメントがappStore上にもあり、アップデートによっていずれ使えるようになるらしい）
* セル削除のショートカットがDDではなく、D一回で消えるらしく、慣れていないせいで、セルを消しすぎてしまう
* アウトプットの文字をコピペできない？

## 最後に
完全に、PCと同じようにとまでは行きませんが、十分快適にIPadでデータ分析をできるかんきょうが整っています。
IPythonistaのみなさん！ぜひ、[Juno](https://itunes.apple.com/app/juno-jupyter-notebook-client/id1315744137)をインストールして、iPad上での快適なJupyter生活を送りましょう


## 参考

https://navoshta.com/juno/

https://juno.sh
dockerコンテナのCPU/メモリ使用率を一覧表示する

こんにちは。初めて投稿します。
調べ物でよくお世話になっているので、
たまには発信しようと思います。

# 起こっていたこと
docker+nginxで複数サイトを稼働させているのですが、
dockerホストでtopコマンドを実行したときに、
1つのapacheプロセスがCPU使用率が100%で張り付きになっていました。
UIDからdockerコンテナのどれか何だろうと言うのは察しがつきましたが、
どのコンテナなのかが分かりませんでした。

# 解決までの流れ
docker psでコンテナの一覧とコンテナIDを取得
　↓
docker top <コンテナID> auxでコンテナのCPU/メモリ使用率を確認
　↓
原因のコンテナを再起動して、解決！

# コマンド
docker psでコンテナの一覧とコンテナIDが分かるものの、全台分確認するのはちょっと面倒なので、
実際はawkのワンライナーで楽をします。

```
for i in `docker ps | awk 'NR>=2 {print$1}'`; do echo $i; docker top $i aux | awk '{print $3,$4,$11}'; echo ""; done
```


全台分の%CPUと%MEMの使用率一覧が表示されるので、値が異常なコンテナを特定します。

# シェルスクリプト化
再利用できるようにシェルスクリプト化しておきます。

```docker_top_cpu_mem.sh
#!/bin/bash

for i in `docker ps | awk 'NR>=2 {print$1}'`; 
    do echo $i; 
    docker top $i aux | awk '{print $3,$4,$11}'; 
    echo ""; 
done
```
実行結果は上記コマンドと同じ。
# 実行結果

```
$ ./docker_top_cpu_mem.sh
dcc0f5ddbf03
%CPU %MEM COMMAND
0.0 1.2 apache2
0.0 0.0 apache2
0.0 1.4 apache2
0.0 1.5 apache2
0.0 1.3 apache2
0.1 1.2 apache2
0.0 1.4 apache2
0.0 1.4 apache2
0.0 1.4 apache2
0.0 1.3 apache2
0.0 1.2 apache2

…（全てのコンテナについて同様に出力される）
```

コンテナIDも出力しているので、
これを使ってdocker restart <コンテナID>等でコンテナを再起動して完了。

# 参考
[docker topを使用して、コンテナで実行しているプロセスを確認する](http://alpha-will.co.jp/app-def/S-102/grm/it/docker-top/)
ハローワールド前にまたこける

#Filesystem Case-Sensitivity Mismatch
作成したプロジェクトの保存先の外付けハードディクスを大文字小文字区別するタイプでフォーマットしていたのが原因らしい

#対処
ターミナルから

cd "/Applications/Android Studio.app/Contents/bin"

と移動してから

vi idea.properties

viでidea.propertiesを開き編集

idea.case.sensitive.fs=true

を追加し、セーブ(:w)して閉じる(:q)

Android Studioを再起動したら動いた。

#愚痴
飛ばされた先が
https://confluence.jetbrains.com/display/IDEADEV/Filesystem+Case-Sensitivity+Mismatch
英語は読みたくありません。

ググってもidea.propertiesの場所よくわからんし
開発環境作るのめんどくさい、挫折しそう。

色々な情報には感謝（人）
助かりました。
[mac] brew - rbenv で rubyをバージョン指定でインストール

# はじめに

既にRubyをインストールしているMacに、バージョンを指定してRubyをインストールします。
Homebrewとrbenvを使用してruby2.5.3を入れます。

Macの環境はこんな感じです。
![macOS_version.png](https://qiita-image-store.s3.amazonaws.com/0/52392/c86ec682-8487-d742-857c-550b7d19d868.png)


# Homebrewのアップデート

```
$ brew update

$ brew -v
Homebrew 1.8.3
Homebrew/homebrew-core (git revision 2941c; last commit 2018-11-23)
```

# ruby-buildのアップデート

インストール可能なrubyのバージョンをアップデートします。

```
$ brew upgrade ruby-build

$ rbenv install -l
Available versions:
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
  ...(中略)
  2.5.3
  2.6.0-dev
  2.6.0-preview1
  2.6.0-preview2
  2.6.0-preview3
　　　　...(中略)
  truffleruby-1.0.0-rc8
  truffleruby-1.0.0-rc9

```

# rubyインストール

rbenvでバージョンを指定してインストールします。

```
$ rbenv install 2.5.3
```

使うバージョンを指定してインストールができていることを確認

```
$ rbenv global 2.5.3
$ rbenv version
2.5.3 (set by /Users/knoth/.rbenv/version)
$ ruby -v
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin17]
```

出来ました。
YubiKey 5 で出来ること（これから買う人向け）

初投稿です。
[YubiKey 5 NFC](https://www.yubico.com/product/yubikey-5-nfc/#yubikey-5-nfc) を購入して1ヶ月近く使った気がするので、「 **まだ買ってないけど興味がある** 」人に何ができて何ができないのか、超個人的な目線のまとめになります。

Yubikey 5 シリーズを購入する際に参考になれば幸いです。

# 期待通りに動作したもの

* FIDO U2F
    + イメージ通りの「2要素認証のときに使用するセキュリティキー」
    + **これだけを期待するなら [Security Key by Yubico](https://www.yubico.com/product/security-key-by-yubico/#security-key)  で充分**
* 固定文字列パスワードの保存、タップでの入力
    + [Yubico Manager](https://www.yubico.com/products/services-software/download/yubikey-manager/) を使用することで設定できます
    + 1Password のパスワード入力の補助（パスワード丸々ではなく、一部文字列をキーボード入力）で使用してます、TouchID のないパソコンでは超便利

# 使ってみると良いもの

* PGP
    + 例えば暗号化済みのファイルを復号したい場合、復号するマシンに対となる公開鍵を取り込んでおくことで、YubiKey に保存されている秘密鍵を使用してくれます
    + 秘密鍵を `keytocard` した後に `save` せず `quit` すると、YubiKey に秘密鍵をコピーしただけの状態になるので便利（逆に `save` すると、秘密鍵使用時に Yubikey の挿入が常時求められます）
    + 参考になるガイド: https://github.com/drduh/YubiKey-Guide
* TOTP （よくある6桁のワンタイムパスワード）
    + [Yubico Authenticator](https://www.yubico.com/products/services-software/download/yubico-authenticator/) (Windows/macOS/Linux/android) を導入すると YubiKey に TOTP を保存できます
    + TOTP のバックアップ用途にちょうど良いかなと思ってます

# 想像と違うもの

* NFC (iOS)
    + ウェブブラウザを含め、 **「iPhone に YubiKey 5 をかざす」ことを想定したアプリがありません** （もし見かけたらコメント欄へ）
* FIDO U2F のセキュリティキーとして 1 個しか登録できないサイトがある
    + aws, Twitter お前らのことやぞ

# 動作しないもの

* [YubiKey for Windows Hello](https://support.yubico.com/support/solutions/articles/15000006472-using-your-yubikey-with-the-windows-hello-app)
    + YubiKey を使って Windows 10 のログインを試みるもの
    + 現状 YubiKey 4 シリーズでしか動作しないっぽいです、残念


# 最後に

TOTPの複製やPGP鍵の取り扱い方など、記事の一部に「セキュリティ的に悪化してない？」と思う記述があったと思いますが、程よくセキュリティを担保しつつも利便性が向上する方法を選択していますのでご容赦ください。

2018年11月24日現在において、リセラーの[ソフト技研](https://yubikey.yubion.com)さんにも5シリーズはまだ卸してないらしく、5シリーズを購入したい場合は [Yubico の公式ストア (www.yubico.com)](https://www.yubico.com/store/) 以外の選択肢がないようです。

ちなみに USB Type-C だけの MacBook 使ってるので、使い道のない NFC の機能よりも、常時さしっぱなし運用できる [YubiKey 5C Nano](https://www.yubico.com/product/yubikey-5c-nano/#yubikey-5c-nano) を買えばよかったなーと思ってます。

# 2019/11/13 追記

いつの間にかソフト技研さんで Yubikey 5 シリーズ取り扱ってました。日本でも手に入りやすくなったのは良いですね。

さて今回の追記は iOS13.2 (Public Beta 2) からセキュリティキーがサポートされた件について。
Yubikey 5Ci なる USB-C + Lightning というデバイスも出てきましたが、私は当セキュリティキーは持ってません。しかし Yubikey 5 NFC の **NFC がまともに使える日がやってきました** 。なんと iPhone 7 以降の NFC 付きのデバイスであれば、セキュリティキーを U2F として使用可能です。
しかし Microsoft のログインで利用可能な FIDO2 による **パスワードレスログイン** （セキュリティキー + PIN）や、各種サービスにおける **セキュリティキーの追加** において **NFC では** 失敗してしまいました。
もしかすると 5Ci や、 Lightning→USB に変換するものを使用して物理的に接続すれば動作する可能性がありますし、動作確認したのは Public Beta なので正式リリースまでにこれらが改善するかもしれません。
もし動作する/した際には、きっと優しい方がコメント欄に「できました」報告してくれるでしょう。
spring.jpa.hibernate.ddl-auto に設定可能な値


`application.properties` で `spring.jpa.hibernate.ddl-auto` を設定できます。
この値によって、データベーススキーマ(テーブル)がうまいこと生成されます。

設定可能な値を一覧にしました。

* none
    * 何もしません
* validate
    * 検証をします。 でもデータベースには変更を加えません。
* update
    * アプリケーション起動時に、Entityに対応するテーブルがなければ作成します。
* create
    * アプリケーション作成時に、Entityに対応するテーブルがなければ作成します。 もしあれば、 データを削除します。
* create-drop
    * アプリケーション作成時に、Entityに対応するテーブルがなければ作成します。 セッション終了時にスキーマを削除します。
Modelicaで最適化をする方法をまとめてみた(OSS編)

# Modelicaでの最適化

## OpenModelicaの場合
* Optimizationクラスを使用する
* OMOptimを使用する
* CasADiとOpenModelicaをOpenModelica Python Interfaceで接続する

---

### Optimizationクラスを使用する
OpenModelica, JModelicaにはOptimizationクラスが用意されており最適化を行うことが出来る
https://qiita.com/UedaShigenori/items/fbd2209363c117476827

### OMOptimを使用する
OpenModelicaには最適化ツールOMOptimがあるが長らくバグを抱えて動かない(半年ほど前の記憶)
唯一一個ずつ手動で解析を実行するOne Simulationだけが動くが最適化でもパラスタでも何でもない

### CasADiとOpenModelicaをOpenModelica Python Interfaceで接続する
この機能についても試したのでどこかで報告したい

---

## JModelicaの場合

JModelicaのOptimizationクラスで試した結果はこちら
https://qiita.com/UedaShigenori/items/4452d95cfa440658163a

---

## Excelの場合

Excelでインターフェースを作った結果はこちら
https://qiita.com/UedaShigenori/items/01c01f865e728e63baf9

---

## ライブラリを使う
以下のようなライブラリがあるが使い方が不明
https://github.com/modelica-3rdparty/Optimisers
RubyでAC法を用いた文字列探索を行うサンプル

普通、Rubyで文字列探索といえば正規表現だと思うのですが、若干特殊なケースに遭遇した際の解決方法としてAho-Corasick法というアルゴリズムを用いた探索というのを使ったので、経緯とかちょっとまとめてみます。

## 前提知識的なもの（読み飛ばしてもok)
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%A4%E3%83%9B%E2%80%93%E3%82%B3%E3%83%A9%E3%82%B7%E3%83%83%E3%82%AF%E6%B3%95

http://d.hatena.ne.jp/naoya/20090405/aho_corasick


## 準備
当初自分でAC法のアルゴリズムを実装しようと思ってやってみたんですけど、普通にしんどかったのでライブラリ使いました。先人の皆様の努力に感謝致します。

```bash
$ gem install aho_corasick_matcher
```
参考: https://github.com/altmetric/aho_corasick_matcher

## どんなケースに有用か
サンプルコードを見てもらったほうが早い。

```ruby:ac_sample.rb
require 'aho_corasick_matcher'

# 正規表現のunionだとorでの探索になるので最長は返ってこない
reg = Regexp.union(/cheese/,/burger/,/cheeseburger/)
p 'cheeseburger'.scan(reg)

# AC法を用いると全部返ってくる
matcher = AhoCorasickMatcher.new(['cheese', 'burger', 'cheeseburger'])
p matcher.match('cheeseburger')

```

実行結果

``` bash
["cheese", "burger"]
["cheese", "cheeseburger", "burger"]
```

## 余談
調べてみるとAC法は高速！みたいな記事がよくでてきますが、少なくともRubyでは正規表現のほうが早いです（やってることが違うから当前）。上記のような特殊なケースだったり、登場する回数をお手軽に調べたいとかっていう時にはこのライブラリを使うほうがラクだなと思います。

## さらに余談
goでも作ってる方がいますね
https://github.com/cloudflare/ahocorasick
nestを導入してみる

ExpressはJavascriptぽさが強い印象があるので、最近のTypescriptで書けるフレームワークはどうなっているだろうと検索していたら、Nestというのがあった。NestはAngularそっくりの書き方ができて、デコレータによりユーザからのリクエストへの応答が書きやすくなっている。

試しにサンプルを動かしてみる。

* 公式サイト: https://docs.nestjs.com/ 

#インストール
いつも通りnpmでインストール & サンプルはCLIを使って作成。

```
$ npm i -g @nestjs/cli
$ nest new <プロジェクト名>
```

#サンプルの中身
Angularにかなり近い構造になっていて、

* main.ts
* app.module
 * app.controller
 * app.service

## main.ts
アプリケーションを起動する。サンプルでは3000番ポートでサーバを起動する。

```typescript:main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();
```

## app.module.ts
アプリケーション本体。コントローラ(HTTPリクエストに応答する部品)`AppController`と、サービス(リクエストと関係ない機能を提供する部品)`AppService`からなることが記述されている。

```typescript:app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
```

## app.controller.ts
ルート"/"へのGETリクエストに対して、`AppService`が提供する文字列を返す。`AppService`はお馴染みDependency Injectionで与えられる。

```typescript:app.controller.ts
import { Get, Controller } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  root(): string {
    return this.appService.root();
  }
}
```

## app.service.ts
応答とは関係なく存在する機能やデータを扱う部品。データベースに問い合わせたり編、ファイルを保存したりする機能はサービスとして実現することになると思う。このサンプルでは、`root()`が呼ばれると"Hello World!"という文字列を返す。

```typescript:app.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  root(): string {
    return 'Hello World!';
  }
}
```

## 実行結果
プロジェクトのフォルダで以下のコマンドを実行し、`localhost:3000`にアクセスすると以下のような"Hello World!"が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/296170/64b2ed50-f88d-82f5-9079-fe2e4bc3b310.png)
初めてkintoneアプリのカスタマイズをした感想@kintoneCafe_kochi

初めてのQiita投稿になります！
サイボウズが提供するクラウドサービスのkintoneの勉強会に参加してきました。kintoneはインターン先の業務でデータ入力をしたことくらいでしか触ったことがなかったので、どんな使い方ができるのか聞ければと思っての参加。
内容はサイボウズ社の方からKintoneの説明、その後はスライドを見ながら簡単なkintoneアプリの編集をしました。
![IMG_1819.JPG](https://qiita-image-store.s3.amazonaws.com/0/222071/ac9a7538-0585-ede2-c46a-946e5112b69d.jpeg)

##kintoneについて詳しく
Kintoneはざっくり言うと、社内で利用する業務アプリのほか、ウェブサービスのデータベースとして利用できます。僕のインターン先ではアプリのデータベースとして利用していました。日本ではすでにかなりシェアがあり、導入企業はmerrcari、CyberAgent、SoftBankなどなどかなり大手も利用しているようです。
[![動画を開くことができませんでした](http://img.youtube.com/vi/7BR3viuOnDA/0.jpg)](http://www.youtube.com/watch?v=7BR3viuOnDA)
競合は国内にはあまりないのかな？と思いますが、海外のzohoが提供している[ZohoCreator](https://www.zoho.com/creator/videos.html)など。

##kintoneを触った感想
kintoneではたくさんアプリを用意してくれていて、業務別・業種別で分けてくれています。
![スクリーンショット 2018-11-24 0.13.09.png](https://qiita-image-store.s3.amazonaws.com/0/222071/d2986af7-b7a1-54e8-4bb6-7cabbe1d7c84.png)
例えば業務別の「営業・セールス」であれば、

* 顧客リスト
* 案件管理
* 問い合わせ管理
* 出勤申請
* 商談報告書

なんかがあります。なんだか便利そうですねー。

![スクリーンショット 2018-11-24 0.14.07.png](https://qiita-image-store.s3.amazonaws.com/0/222071/b4577f36-abe9-3541-1bf8-7a9533649764.png)
kintoneアプリストアでは業種別・業務別でアプリを選べます。それから初めから自分でアプリを作成することも可能。

今日はカスタマイズの体験ということで、もともと用意されていた「顧客管理」と「問い合わせ管理」のアプリをカスタマイズしてみました。
基本的にGUIで簡単にできるので、スラスラと進められました。入力画面の作成も「ラベル」「ボタン」「リンク」などいろんなパーツを用意してくれていて、ドラッグ＆ドロップするだけ。個人的にはXcodeの操作に少し似ているなと思いました。
![スクリーンショット 2018-11-24 0.48.56.png](https://qiita-image-store.s3.amazonaws.com/0/222071/dd4c0b78-a88b-f0de-a634-aa9dc736ebb2.png)
これで基本的なアプリの仕組みは作れます。ただ、さらにプログラムチックなことをしたい場合もありますよね？例えば、「もし〜の場合、この処理をする」といったように。そのようなカスタマイズをする場合は、[Customine](https://customine.gusuku.io/ja/)というkintoneと連動できるツールを使うことができます。
![スクリーンショット_2018-11-24_0_54_30.png](https://qiita-image-store.s3.amazonaws.com/0/222071/b7c60089-df8b-457a-a804-6b1adc6b703e.png)
Customineではいろいろな条件を指定できるようになっています。ぽちぽちしてれば処理を設計できるのでとても楽ですね。また、今回はしませんでしたが、JavaScriptでのカスタマイズも可能になっています。
条件や処理はたくさんあって探すのが大変なので、「キーワードで検索」を使うとだいぶ楽になります。
![スクリーンショット_2018-11-24_0_56_21.png](https://qiita-image-store.s3.amazonaws.com/0/222071/dbe0afc9-58e4-dd5e-1ee0-8fb944499842.png)

##まとめ
最後に今回わかったkintoneの特徴をまとめます。

* 様々な業種・業務で使えるアプリが豊富
* GUIで視覚的にDBを構築できる
* スマホアプリでも同期して利用できる

今回はアプリカスタマイズの基本をかじっただけだったので、他に発展した利用方法を試してみたいです。無料版が30日あるので後29日、まずはもう少し触ってみます！

以下の記事も参考になります。
[kintoneとはなにか真面目に調べてみた](https://qiita.com/ryokdy/items/41bfa7a008a70ae863d1)
Pythonで伺かのSSTPを使って通信する方法


#SSTPとは

Sakura Script Transfer Protocolの略称で、伺かにおける独自の通信プロトコル。実はIANAにも記載されている国際規格。(Secure Socket Tunneling Protocolではない。というかこっちの方が先だったはず)
ベースウェア(SSP)はこのプロトコルのポートが解放されたサーバーとしての機能を持つ。

SSTPに関する資料(特に具体的なコード)が少なくて苦労したので備忘録として置いておく

#サンプル

```python
# -*- coding:utf-8 -*-
import socket

host = "127.0.0.1"  #localhost
port = 9801  #The port number of SSTP

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect((host, port))

test = "NOTIFY SSTP/1.5\r\n\
Sender: リサ\r\n\
Event: OnRelease\r\n\
Script: \\0\s[1]This text is sent from Python.\\nCan you see this？\\1This is a test\e\r\n\
Option: nodescript, notranslate\r\n\
Charset: UTF-8\r\n\
\r\n"

client.send(test.encode())
#send() receives in bytes representation

response = client.recv(4096)
#recv() determines the length(bytes) of response
client.close()
print(response.decode())
#The return is also byte-type so decode it

```
Senderは何でもよい(普通プログラム名にしておく)。Pythonでは\0,\1,\nはエスケープして\\\0,\\\1,\\\nとしないと正常に動かない。
OptionのnodesrciptはSSTPマーカーを非表示、notranslateはSHIORI EVENTのOnTranslateに処理を渡さない用のオプション。必要に応じて付ける。
またNOTIFY以外にもEXECUTEなど別の処理も存在する。http://www.ooyashima.net/db/sstp.html を参照。

この処理はIFGhostを使って次のように書くこともできる:

```python
"NOTIFY SSTP/1.5\r\n\
Sender: test\r\n\
Event: OnRelease\r\n\
IfGhost: リサ\r\n\
Script: \\0\s[1]Lisa is speaking now.\r\n\
IfGhost: エミリ, さくら\r\n\
Script: \\0\s[1]Sakura or Emily is speaking now.\r\n\
Option: nodescript, notranslate\r\n\
Charset: UTF-8\r\n\
\r\n"
```
IfGhostでヒットしなかった場合は一番上に書いた分岐が採用される(今の場合IfGhost:リサの分岐)

#動作例
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/154714/76d84221-fff7-6d32-a1fb-9bfdae1043db.png)

#何に使えるか
* 今までSAORIを使って外部プログラムを実行していた時、YAYA及び里々ではマルチスレッドに対応していなかったのでSAORIの処理が終わるまでゴースト側は何も反応できず、処理に時間がかかるものを実行しているとフリーズしているように見えてしまう問題があった。
そこでSAORIの処理そのものをマルチスレッドで書き、別のスレッドで実行した結果をSSTPで渡すことでこの問題を解決できる。(実際音楽を再生するSAORIであるmciaudior.dllはこの方法を使っている……はず)
PowerShellで「.」でメソッドチェーンせずに「|」でメソッドをつなぎたい！

## やりたいこと

以下のようにすれば、https://example.com のHTTPのBody部分が取れます。

```powershell
(Invoke-WebRequest -Uri https://example.com).Content
```

ですが`()`をつけずに`|`でパイプしたいときがあります。理想としては、以下みたいな感じにしたいです。

```powershell:理想
# 注意：これは理想です
Invoke-WebRequest -Uri https://example.com | <何らかの記法>.Content
```

## 方法

追記（2018-11-24）：
@KyoPeeee さんにコメントで教わった方法のほうが短くてタイプしやすいので、先に書かせていただきます。


```powershell
Invoke-WebRequest -Uri https://example.com | % Content
```


以下のようにつなげていくことも可能ですね。

```powershell
Invoke-WebRequest -Uri https://example.com | % Content | % Length
```

追記おわり
- - - 

`コマンド | %{$_.プロパティ}`で行けそうです。
具体例は、以下のとおりです。

```powershell
Invoke-WebRequest -Uri https://example.com | %{$_.Content}    
```

参考：[PowerShell で 関数実行結果の型をパイプラインの先に伝搬する - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2015/01/20/034358)

```:出力
<!doctype html>                                                                                                        <html>                                                                                                                 <head>                                                                                                                     <title>Example Domain</title>                                                                                      

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        
    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>    
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
```
Ruby単体でRedisを触るサンプル

Railsからredisを使うみたいな記事は結構見つけたんですが、もうちょっとシンプルに試してみたいなと調べてたら意外と情報少なかったので書いてみます。

## 環境
Windows10
ruby 2.4.4p296

## 準備
Redisをローカルにインストール
http://kageura.hatenadiary.jp/entry/2017/11/30/Windows%E7%89%88Redis%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B

gem redis をインストール

```
$ gem install redis
```

## 適当なフォルダでこのコードを実行
```ruby:redis_sample.rb

require 'redis'

@redis = Redis.new

def set_data(*args)
  args.each_with_index do |val, idx|
    @redis.set val, idx
  end
end

def output_data
  keys = @redis.keys

  rows = []
  keys.each do |key|
    ret = @redis.get(key.to_s)
    rows << [key.to_s, ret.to_s]
  end
  p rows
end

# 値をset
set_data('fuga')
set_data('red', 'green', 'blue')
output_data

# 値を削除
@redis.del 'red'
output_data

# 値を全て削除
@redis.flushall
output_data
```

## 結果
```
["red", "0"], ["fuga", "0"], ["blue", "2"], ["green", "1"]]
[["fuga", "0"], ["blue", "2"], ["green", "1"]]
[]
```

## 参考記事
https://inokara.hateblo.jp/entry/2013/06/30/144815
http://redis.shibu.jp/commandreference/
【Laravel】foreach文における$loop変数に感動した

loop変数はLaravel5.3から追加された変数。
foreach文とかで繰り返しの「ループの最初」や「ループの5回目で」という処理を書くことがあるが...

```php
@foreach ($users as $key => $value) {
  @if ($key === 1)
    // ループの１回目だけの処理
  @endif
}
```

## ループ変数

foreach文の中で`$loop`変数を使うと、`$key=>$value`にしなくてもインデックスを取ることができる。その他いろんなプロパティも持つ。

### 繰り返しの回数に関するプロパティ

```php
@foreach ($users as $user)
    // 初回ループ
    @if ($loop->first)
        // 最初の繰り返し
    @endif

    @if ($loop->index === 0)
        // 最初の繰り返し(インデックスが取れる)
    @endif
    
    @if ($loop->iteration　=== 1)
        // 最初の繰り返し(現在の繰り返し数が取れる)
    @endif

    // 最後のループ
    @if ($loop->last)
        // 最後の繰り返し
    @endif

    @if ($loop->remaining === 1)
        // 最後の繰り返し (残りの繰り返し数が取れる)
    @endif
@endforeach
```

### その他のプロパティ

```php
@foreach
    // 配列の総アイテム数
    @if ($loop->count === 10)
        // 配列の総アイテム数が10
    @endif

    // 現在のループのネストレベル
    @if ($loop->depth === 1)
        // ネストレベル1
    @endif
    
    // ループがネストしてる場合に、親のループ変数を使いたい場合
    @foreach ($user->posts as $post)
        @if ($loop->parent->first)
            // 親のループの最初の繰り返し
            echo ($loop->iteration) // 1
        @endif
    @endforeach
@endforeach
```
### $loop変数のプロパティ一覧
|プロパティ|説明|
|-----------------|------------------|
|$loop->index|	現在のループのインデックス（初期値0）|
|$loop->iteration|	現在の繰り返し数（初期値1）|
|$loop->remaining|	繰り返しの残り数|
|$loop->count|	繰り返し中の配列の総アイテム数|
|$loop->first|	ループの最初の繰り返しか|
|$loop->last|	ループの最後の繰り返しか|
|$loop->depth|	現在のループのネストレベル|
|$loop->parent|	ループがネストしている場合、親のループ変数|


## まとめ

* 統一されたものを使えば書いた人による差分が出ないので、積極的に使いたい。

## 参考
* [The new $loop variable in Laravel 5.3
](https://mattstauffer.com/blog/the-new-loop-variable-in-laravel-5-3/)
TypeScriptの型定義をアップデートしたら動かなくなった話

## 事の発端
開発してるWEBアプリケーションで使ってたnpmパッケージが全体的に古くなってきたので、パッケージの更新を行った。

・・・すると、コンパイルが失敗するようになってしまい、アプリケーションが動かなくなってしまった！

## 問題なったコード
関連箇所のみ抜粋。

```json:package.json
{
  "dependencies": {
    "query-string": "^6.2.0",
  },
  "devDependencies": {
    "@types/query-string": "6.1.0",
  }
}
```

```typescript:App.tsx
import * as React from 'react';
import { parse } from 'query-string';

class App extends React.Component {
  private id: number;

  constructor(props: Readonly<{}>) {
    super(props);

    // ここから問題箇所。
    // query-stringというOSSのparseメソッドを使って
    // URLのクエリからidのパラメータが数字の文字列なら、変数idを代入する事をしたい
    const parsedHash = parse(location.search);
    // @types/query-string のバージョンが6.1.1だと、この下の行でコンパイルエラーになる
    if (isFinite(parsedHash.id)) { 
      this.id = Number(parsedHash.id);
    }
  }
  
  render() {
    // 略
  }
}
```

## 起こった出来事について
原因は「@types/query-string」のバージョンアップでした。

※「@types/」から始まる名前のパッケージについて知らない方は[こちら](https://qiita.com/pepo/items/81e2b71b624633ba272e)をご覧ください。

6.1.0から6.1.1に更新したことによって、parseメソッドの返り値の型が変わってしまいました。

| version | parseの返り値の型 |
| :---: | :--- |
| 6.1.0 | any |
| 6.1.1 | OutputParams（実態は [key: string]: string &#124; string[] &#124; undefined;） |

返り値の型が違うので、parsedHashに結果を代入する時に型推論の結果が変わってしまい、その後の処理の型の整合性が合わなくなってしまった・・・ということでした。

↓エラーの様子
<img width="637" alt="スクリーンショット 2018-11-24 10.30.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/116289/1eaece04-3134-f935-fc52-aed1d72a3346.png">

その後、新しい型定義に合うようコードを修正して解決しました。

```typescript
const parsedHash = parse(location.search);

if (isFinite(Number(parsedHash.id))) {
  this.id = Number(parsedHash.id);
}
```

## まとめ
「@types/」から始まる名前のパッケージを更新するときや、自プロダクトで書いた型定義を更新する時はちゃんとコンパイルが通るかを確認しましょう（当たり前なことではありますががが）

「@types/」から始まる名前のパッケージを更新する時に、どんな事が起こる可能性があるのかが想像できてなかったのでいい勉強になりました。

今回の例は「@types/query-string」でしたが、他のパッケージでも起こる可能性はあるので、気をつけましょう。
DOCKERでよく使うコマンド

## この記事について

dockerでlinuxのディストリビューションをセットし、コンテナにtomcatを入れてみました。  [ここのチュートリアル](https://knowledge.sakura.ad.jp/14427/)に従っただけですが・・・
チュートリアルにあるコマンドで今後もよく使うであろうものをメモ程度にまとめています。

## コマンド一覧
### コンテナの作成から起動、操作、停止まで
* リモートリポジトリからイメージを取得
`# docker pull {イメージ名}`

* 取得したイメージの初回起動
`# docker run -it -d -p　{ローカルのポート（任意）:リモートリポジトリのポート}　-v {localでコンテナのログを保存するディレクトリのパス}:{/share/logs} --name 
 {imageから生成したいコンテナ名} {利用するimageの名前}`

* ローカルのファイルをdockerに移動

`# docker cp {ホスト側のファイル} {コンテナ名}:{コンテナ内のコピー先ディレクトリ}`
 \*ローカルの参照できるディレクトリはdockerの設定によって制限されています。
　`docker>preference>file sharing`で設定されているディレクトリはdockerとシェアすることが可能です

* コンテナをコマンド操作できる状態にする
`# docker -it {コンテナ名} bash`
> これでコマンドラインで入力したコマンドはdockerを操作するコマンドになる
* docker stop {コンテナ名}
* コンテナの再起動
`docker start {コンテナ名}`

### 作成したコンテナからイメージを作る
`docker commit {コンテナ名} {作成するDockerイメージ名}`
VisualStudio2015でデバッグ実行中にコードを変更する方法

# 概要
VisualStudio2015でデバッグ実行中に、コードを変更しようとすると、
「Changes are not allowed while code is running」
というエラーダイアログが表示されて、コードを変更することができませんでした。
日本語で見つからなかったので、備忘録として残しておきます。

# 確認環境
Windows10
VisualStudio2015


# 解決方法
メニューの「Tools」→「Options」→「Debugging」→「General」にある、
「Enable Edit and Continue」のチェックボックスを外すと、デバッグ実行中にもコードを変更できるようになりました。

ちなみに、デバッグ実行中はこの項目のチェックボックスを変更することができないようです。

参考元
https://social.msdn.microsoft.com/Forums/vstudio/en-US/19cc453d-35b5-49d7-9f90-9e0bdec4914a/changes-are-not-allowed-while-code-is-running?forum=visualstudiogeneral
babelでトランスパイルしたときに、this を void 0 に変えてしまう設定を無効化したメモ

## 現象

* elmの吐き出したjsをbabelにかけたら動作しなくなった
* `(this)`が`void 0` に変更されていたのが原因。

### 対応

babel.config.jsにoverridesオプションをつけて対応

```js:babel.config.js-before
const presets = [
  [
    "@babel/env",
    {
      targets: {
        chrome: "70"
      },
      useBuiltIns: "entry"
    },
  ],
];

module.exports = { presets };
```

```js:babel.config.js-after
const presets = [
  [
    "@babel/env",
    {
      targets: {
        chrome: "70"
      },
      useBuiltIns: "entry"
    },
  ],
];
const overrides = [{
  test: "./src/assets/elm/ElmTest.js",
  sourceType: "script",
}];
module.exports = { presets, overrides };
```

### 結果

```js:src/assets/elm/ElmTest.js-before
// 省略
  _Platform_export({
    'Main': {
      'init': author$project$Main$main(elm$json$Json$Decode$succeed(0))(0)
    }
  });
})(void 0);
```

```js:src/assets/elm/ElmTest.js-after
// 省略
  _Platform_export({
    'Main': {
      'init': author$project$Main$main(elm$json$Json$Decode$succeed(0))(0)
    }
  });
})(this);
```
## 参考

[stack over flow: how to stop babel from transpiling this to undefined](https://stackoverflow.com/questions/34973442/how-to-stop-babel-from-transpiling-this-to-undefined)
[stack over flow: how to properly overrides](https://stackoverflow.com/questions/52129579/how-to-properly-override-babel7-plugins-for-separate-webpack-server-client-conf)
[babel overrides](https://babeljs.io/docs/en/options#overrides)
手軽にeslint-config-airbnbを導入

## 概要

規則正しく美しいJavascriptコードを書くためにESLintを導入しておきたいが、Lintルールをイチから検討するのはなかなか大変...
そこでAirbnbのJavascript style guideのLintルールを、お手軽に導入しようという試み

想定する導入所要時間： 10分程度


## 導入プロジェクト環境

node 10.13.0
webpack 4.26.0


## ESLint構築

### 必要パッケージのインストール

ESlint

```
$ npm i -D eslint
```

今回の環境ではwebpack用のloaderも入れておく

```
$ npm i -D eslint-loader
```

airbnbルールベースのプラグインを使用するが、
reactを利用しているかどうかでプラグインを変える必要がある

#### reactを利用する場合

```
$ npm i -D eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react
```

#### reactを利用しない場合

```
$ npm i -D eslint-config-airbnb-base eslint-plugin-import
```

---

### ESLint設定

プロジェクトルート直下に `.eslintrc` を作成
こちらもreactを利用するかどうかで記述を変える

#### reactを利用する場合

```:.eslintrc
{
  "extends": "airbnb"
}
```

#### reactを利用しない場合

```:.eslintrc
{
  "extends": "airbnb-base"
}
```

この段階で、エディタ側でLintエラー表示できる設定をしていれば、Lintルールが適用されていることがわかる

---

### webpack連携

webpackでjsバンドルしている場合は、下記の設定をwebpackコンフィグに記述する

`pre` セクションを使用して、安全に他のloader（babel-loaderなど）によって変更されていないjsファイルをチェックすることが可能

```:webpack.config.js
module.exports = {
  (snip)
  module: {
    rules: [
      {
        enforce: 'pre',
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
      },
    ],
  },
}
```

## まとめ

とても手軽にLintルールを適用することができた

もちろんプラグインルールをベースに独自ルールを追加拡張することも可能

```:.eslintrc
{
  "extends": "airbnb",
  "rules": {
    "comma-dangle": 0
  }
}
```

### Appendix

eslint configの書き方
https://eslint.org/docs/user-guide/configuring

eslintルール一覧
https://eslint.org/docs/rules/
値が０or nil の場合 falseの後置if

現在スクレピングにより値を取得し、それらに準じた処理をしようとしています。

その際に値が0でなければ値を表示するというメソッドを組みました。

```ruby:hoge.rb
def show_hoge(hoge)
    puts "HOGE                 #{hoge}" if !hoge.zero?
end
```

この際にスクレイピングの時点でnilがhogeに入っていた場合、

`=> undefined method zero? for nil:NilClass`

こちらが出力されてしまいました。

一旦nilかどうか確認する必要があるのですが、こちらはto_iを使うことによって綺麗に書くことができます。

nilはto_iをすると0になります。
この仕組を使い、以下のように記述します。

```ruby:hoge.rb
def show_various_index(fuga)
    puts "HOGE                 #{fuga.hoge}" if !fuga.hoge.to_i.zero?
end
```

これでスッキリ書くことができました。
たぶん最速！LINE Things ハンズオン in Node学園祭2018 #nodefest


Node学園祭2018で初心者向けのハンズオンやっております。

## 今日のハンズオンについて

今日は全体参加者的に人数が少ないことが見込まれるので、参加者の人たちの様子みながら適宜資料更新していきます。

## この資料について

![](https://i.gyazo.com/eb4eb1e94a09bbdeee0546ca76eb3fb5.png)

* この資料をハンズオンなどに活用してNode.js普及を促進させてもらえたら幸いです。
	* 使うときにコメント欄にコメント貰えると嬉しいです！
	* ハンズオン進めてみた感想などもコメント貰えると嬉しいです！

## 今日の流れ

全体を通して、Node.jsを触るキッカケが作れればいいなと思っています。
NodeSchoolで基礎をやりつつ、LINE BOTやLINE Thingsは「Node.jsやJSで具体的にこんなの作れるよ」というコンテンツ例として採用しているイメージです。

ずっとNodeSchoolやってたい！って人はそのままNodeSchoolやっててもOKです。

全3部です。スポットだけ混ざってもやれると思います。

## 1部: 「Node School」でNode.jsの基礎を学ぼう

[Node School](https://nodeschool.io/)はNode.jsの学習ワークショップツールです。

![](https://i.gyazo.com/462b366edd0e379ca5d281916dd8841b.png)

色々なレッスンがあります。

* javascripting: JSの勉強

```
npm install -g javascripting
```

* learnyounode

```
npm install -g learnyounode
```

**進められる人は自分の好きなレッスンをインストールして進めてみましょう。**

ん？情報少なくね？これだけだと無理！って人は

ちゃんとく先生の[NodeSchoolでNode.jsの学習を始めよう！インストール手順から基本操作までステップ別解説](https://dotstud.io/blog/node-school-before-learn/)を見ながら進めてみましょう。

## 2部: LINE BOT ハンズオン

Node.jsでLINE BOTを作ってみます。コピペでいけるので初心者の方でもお気軽です。

ちなみに資料は昨年のハンズオンの資料を使います。（少しアップデートしました）

> [1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)

早く終わった人は@kenakamuさんの続きの資料があります。

> [LINE BOOT AWARDS 公式夏期講習 ～2018 年 7 月時点での LINE Bot の機能を振り返る～](https://qiita.com/kenakamu/items/b2580f2546b925832045)

* リッチメニュー
* URL スキーム ( カメラ/GPSなど)
* Flex Message
* LINE Pay
* LIFF

## 3部: LINE Things ハンズオン

LINE BOTを作った続きになります。以下の二つの資料を進めていきます。

**LINE ThingsはWeb Bluetoothに似た仕様で、ブラウザ(LIFF)のJavaScriptからBluetoothを制御できる技術です。**

今回はJavaScriptを書いてデバイスと連携する部分を作ってみます。

* 前半資料: [さっそくLINE Thingsを触ってみた（ESP32でリモートLチカ） #linedevday](https://qiita.com/n0bisuke/items/b0541a32f01007f938a4)
* 後半資料: [LINE ThingsのLIFFアプリ(とデバイス)を自前で作る](https://qiita.com/n0bisuke/items/0c09ae5da43b551e98b1)

今日はM5Stackを5台用意しています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/35387/0a88059d-d896-bb7b-4250-ca72543fb14b.png" width="200">
React + Node.js + Express を始める時のリンク

## 参考リンク
- [React JavaScript Tutorial in Visual Studio Code](https://code.visualstudio.com/docs/nodejs/reactjs-tutorial)
  - Reactのプロジェクトを作成してVSCodeでデバッグするまで

- [GitHub \- Microsoft/vscode\-react\-sample: React todo demo for Build conference](https://github.com/Microsoft/vscode-react-sample)
  - 補足：手元の環境ではnpm installでエラーがあり動かせなかった（2018/11/24）

- [Node\.js, Express, sequelize, React で始めるモダン WEB アプリケーション入門（React編） \- Qiita](https://qiita.com/tatsurou313/items/8ebccf349e37f6185bb6)
  - バックエンドをNode.js, Express, フロントエンドをReactで動かす

- [Node\.js, Express, sequelize, React で始めるモダン WEB アプリケーション入門（Bootstrap番外編） \- Qiita](https://qiita.com/tatsurou313/items/051d4af5fbe57de8d876)
  - フロントエンドをReact + Bootstrapで動かす

- [Node\.js, Express, sequelize, React で始めるモダン WEB アプリケーション入門 \(CI/CD編\) \- Qiita](https://qiita.com/tatsurou313/items/0f8af5b8dbd1e10340ed)
  - CI/CD を行う
Visual Studio Codeのカスタマイズ

###### Visual Studio Codeをカスタマイズします

**Visual Studio Code / git はHomebrewでインストール済み*
**npm はNodebrewでインストール済み*


1.日本語化します

[Marketplace](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)

2.アイコンを [Material Icon Theme](https://github.com/PKief/vscode-material-icon-theme.git) にします

``` command:iTerm
git clone https://github.com/PKief/vscode-material-icon-theme.git ~/.vscode/extensions/material-icon
cd ~/.vscode/extensions/material-icon
npm install
npm run build
```

3.インデントを [Indent-Rainbow](https://github.com/oderwat/vscode-indent-rainbow.git) にします

``` command:iTerm
git clone https://github.com/oderwat/vscode-indent-rainbow.git ~/.vscode/extensions/indent-rainbow
cd ~/.vscode/extensions/indent-rainbow
npm install
npm run vscode:prepublish
```

4.括弧の対チェック等を [Bracket Pair Colorizer 2 (Beta)](https://github.com/CoenraadS/Bracket-Pair-Colorizer-2.git) にします

``` command:iTerm
git clone https://github.com/CoenraadS/Bracket-Pair-Colorizer-2.git ~/.vscode/extensions/Bracket-Pair-Colorizer-2
cd ~/.vscode/extensions/Bracket-Pair-Colorizer-2
npm install
npm audit fix
npm audit
```
Gitのリポジトリ（履歴）を初期化する

リポジトリのURLはそのままで、履歴を完全削除したい。
（公開前の準備履歴を消したいときのメモ。必要になることは少ないと思う。）

1. remoteのURLを保存
```
git remote -v
```
2. `rm -rf .git`
3. フォルダを綺麗にして、新規にInitial commitしたい内容にする。
4. `git init`
5. `git add .`
6. `git commit -a -m"Initial Commit"`
7. `git remote add origin {手順1のURL}`
8. "-f"でリモート側の履歴が強制的に上書きされるので注意。`git push -u origin main -f`

これで、リモートリポジトリに"Initial Commit"のコミット履歴だけがある状態になる。
ciscoルータ/スイッチでのハードウェアの正常性確認コマンド

・とりあえずざっくり行きたい時
show tech
show log - ルータのtechにはshow logが含まれない。

err,error,failあたりをキーワードにしてgrep掛ければ、何かあればだいたい引っかかる

・個別のコマンド
show clock - 時刻ずれないか確認のために必ず取ること
show version - uptimeやreload reasonを確認する。ちなみにIOSのpower-onはIOS-XEではpower failure。failとあるがただの電源断を示しているだけなので騒がない。
show run - まあ一応とっとく。
show log - 何かエラーがないか見る。
dir all | inc crash - crashinfoがないか探す。あったら要解析。あっても直ちにハードウェアの故障を示す訳ではないことに留意。
show int count err - スイッチ限定。FCSなどのエラーがあがってないか。いくつか上がってても問題ないカウンタがある。詳細はぐぐること。
show int | inc error - ルータ版。エラーないか確認。
show int status - スイッチ限定。インターフェースの状態(uo/down)の一覧。上がるべきポートが落ちてないか確認。show int でもいいけどこっちのが見やすい。
show int - インターフェースの状態を見る。ルータくらいのポート数なら一個づつ見てもいいかも。
show mod - シャーシタイプ用。各モジュールのステータスが見れる。
show env / show env all - ファンと電源の状態。
show post - 機種限定。たしかスイッチのみ。起動時の自己診断の結果が表示される。passしてなかったらアウト。
Zipcoda APIの紹介

ちょっとしたAPIですが便利に使っている、[Zipcoda](https://zipcoda.net/apidoc)というAPIを紹介します。

## 意外とめんどくさい、郵便番号や住所のハンドリング

郵便番号の元データは日本郵便のサイトから落とせる…のはいいのですが、[元のデータ形式が残念すぎて](https://qiita.com/nanasess/items/0f0aeaa1f72f599b9142)ハンドリングに手間取ります。そして、住所も住所で、都道府県や市区町村を切り出すだけですら[ある程度のデータが必要となります](https://qiita.com/jkr_2255/items/c7958b1e62696a1fe183)。ということで、既存のサービスがあれば使いたくなるものです。

ということで、郵便番号から住所を検索するAPIはよく見かけるのですが、逆に住所から郵便番号を検索するAPIは（無料で使える範囲内では）なかなか見つかりませんでした。一方、このZipcodaは、無償提供なのに逆引きも用意してくれているのです。

## 使い方

JSONもしくはJSONPを返す、シンプルなインターフェースです（[公式](https://zipcoda.net/apidoc)）。

* `http://zipcoda.net/api?zipcode=xxx-yyyy`…郵便番号から住所のリストを得る
* `http://zipcoda.net/api?address=○○県××市△△`…住所から郵便番号のリストを得る（都道府県から入れないと動かなかったです）


## 使ってみての感想

郵便番号→住所は不満なく利用可能ですが、住所→郵便番号では、

* 施設などの個別郵便番号がリストに出てくる
* 表記ゆれには対応しきれない
* 「○○」で検索して「○○本町」のようなものまでヒットする

など、正しく探すことの難しさを改めて感じました。あと、このAPIを使っていて、先方のサーバが2回ほどトラブルで停止したことがあります。個人管理ということで、管理者に連絡したら対応はしてもらえましたが、「無保証」ということを改めて感じた次第です。
XAMPPでPHP＋MariaDB(MySQL互換)環境を構築する 2018年12月版

この記事は、「[【連載】初めてのWindows用Laravel 5.7開発環境構築入門](https://qiita.com/hitotch/items/a646972fe1992611e92b)」の子記事です。環境などの条件は、親記事をご覧ください。

---
　連載初回となる今回からは、まず今後開発マシンとなるWindows 10にXAMPPを導入し、PHPとMariaDBで基本的なPHP Webアプリケーションが動作する状態の構築を目指します。以下のステップに分けて、孫記事にしてきます。

- [XAMPPをインストールしてPHPとMariaDBが使えるようにする](https://qiita.com/hitotch/items/fe70fc2992746fafab54)
- [Visual Studio CodeでXAMPPのPHPコーディング環境を作る](https://qiita.com/hitotch/items/ab791fbc11a4e2a6cefd)
- [XAMPPのPHPをXDebugでデバッグできるようにする](https://qiita.com/hitotch/items/7b2895f9822ded3fa7db)
- [XAMPPのMariaDBを管理するためHeidiSQLを導入する](https://qiita.com/hitotch/items/eebda7f9ec40b46a6345)
- [XAMPPのPHPからMariaDBを操作する](https://qiita.com/hitotch/items/4d6d8f8d03b55ea20909)

以下、なぜ今回この環境なのかを説明していますが、本題ではないので、早速孫記事に入っていただいて問題ありません。

# なぜMySQLではなくMariaDBなのか
　これまで、有名なオープンソースアプリなどはPHPと組み合わせて使うデータベースにMySQL使うことが多く、私もずっとMySQLを使い続けているひとりです。しかし2018年時点ではMariaDBを選択したほうが良い状況になりつつあります。

- レンタルサーバーでよく利用されているCentOSなどでMySQLじゃなくてMariaDBが標準になってきている。(*1)
- WordPressなど有名なオープンソースを見てもMariaDBが公式にサポートされ始めている。
- GoogleもMySQLをやめてMariaDBに乗り換えた。(*2)
- そもそもXAMPPがMySQLをやめてMariaDBにした。

　したがって、今回は時代の流れに逆らわずにMariaDBで進めることにします。

# なぜXAMPPなのか
　「Apache、PHP、MariaDBのインストールを１から自分で実施する」という技術は、開発とは別の技術です。そもそも最近のレンタルサーバーではDedicatedサーバーでも「Managed」になっているため、本番環境でも契約した時点ですでにこういった環境のインストールが終わってる状態からスタートになります。
　したがって、こういった労力は今回のゴールのためには不要（むしろ無駄）であると判断し、XAMPPでの一括インストールを採用します。

# 参考資料
*1 [各LinuxディストリビューションにおけるMariaDB](https://qiita.com/cherubim1111/items/e493b27343a3cde5f431)
*2 [Google swaps out MySQL, moves to MariaDB](https://www.theregister.co.uk/2013/09/12/google_mariadb_mysql_migration/)