OmniAICreator/Qiita-1.07M huggingface dataset:
javascript　参考にした記事

https://qiita.com/ikkitang/items/593be955b2bf2c513cfe
空文字のチェック方法
https://qiita.com/banaoh/items/4119c0e23053b1cfa80b
javascriptで配列→csv書き出しの実現
https://qiita.com/maecho/items/9745d74d6776b2f9cd84
JavaScriptでCSVエクスポートを実装してみた。
https://qiita.com/pocket8137/items/df5afba90b51e90587a5
コールバック関数とは
http://info-i.net/fs-readfile
Node.jsでテキストファイルやバイナリファイルのデータを読み込む
https://qiita.com/To_BB/items/bf4d6384f7dce47bb216
【JavaScript】即時関数, 無名関数, クロージャについて
【Java】プロジェクト内のソースコードを行き来するときに知ってると捗るEclipseショートカット



# Ctrl + クリック 宣言を開く
宣言部分に移動することができます。メソッドの実装を確認したり、変更を加えたいときによく使います。
<img src="https://qiita-image-store.s3.amazonaws.com/0/284567/01249d7f-7bd1-9a82-04cf-ddb2b4d4a980.gif" width="400px"/>

# Ctrl + Alt + h 呼び出し階層を開く
フォーカスされているフィールドやメソッドなどが呼び出されている場所を調べることができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/284567/21a785b1-1911-7ceb-daaf-244a9f19a6f1.gif" width="400px"/>
# 関連記事
[新人研修でドヤ顔で披露したらウケたEclipseのショートカット集 - Qiita](https://qiita.com/arai-wa/items/c2eb7387b5bf37b4ace4)
Ultra96 向け Debian GNU/Linux (v2018.2版) の構築(PMUFW編)

## はじめに

Ultra96 に Debian GNU/Linux (v2018.2版) を構築する方法について、具体的な方法をいくつかに分けて説明します。

 * [Introduction](https://qiita.com/ikwzm/items/5ae07792143d8018bfea)
 * [Boot Loader](https://qiita.com/ikwzm/items/9c78e83298906447fe5d)
   - [Sample FPGA Design](https://qiita.com/ikwzm/items/0489b02962c6f0455783)
   - [FSBL   (First Stage Boot Loader)](https://qiita.com/ikwzm/items/fe9d6abda60660fc2f87)
   - __PMUFW  (Platform Manager Unit Firmware)(この記事)__
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/3c0d735cd3a605d269f3)
   - [U-Boot](https://qiita.com/ikwzm/items/11853d8cfdaf373beaef)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/af4420edd262e14feef9)
 * [Linux Kernel](https://qiita.com/ikwzm/items/02af5ac78a558c910e84)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/be06b07e26cbf05fec2b)

この記事では、Ultra96 の Boot Loader で使うための PMUFW  (Platform Manager Unit Firmware) の構築について説明をします。

## 必要な環境

 * Vivado SDK 2018.2

## Sample FPGA Design の構築

PMUFW の構築には Sample FPGA Design のハードウェア情報が必要です。[「Ultra96 向け Debian GNU/Linux (v2018.2版) の構築(Sample FPGA Design編)」](https://qiita.com/ikwzm/items/0489b02962c6f0455783)の通りに target/Ultra96/build-v2018.2/fpga/project.sdk/design_1_wrapper.hdf を作っておきます。

## PMUFW の構築

ここでは Vivado の hsi(Hardware Software Interface) を使って構築する方法を示します。GUI を使って手で入力するのは面倒なので Tcl スクリプトファイルを用意しています。Tcl スクリプトの詳しい内容は[「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)を参照してください。

```Tcl:target/Ultra96/build-v2018.2/fpga/build_zynqmp_pmufw.hsi
#!/usr/bin/tclsh

set app_name          "pmufw"
set app_type          "zynqmp_pmufw"
set hwspec_file       "design_1_wrapper.hdf"
set proc_name         "psu_pmu_0"
set project_name      "project"
set project_dir       [pwd]
set sdk_workspace     [file join $project_dir $project_name.sdk]
set app_dir           [file join $sdk_workspace $app_name]
set app_release_dir   [file join [pwd] ".." ]
set app_release_elf   "zynqmp_pmufw.elf"

set hw_design         [open_hw_design [file join $sdk_workspace $hwspec_file]]

generate_app -hw $hw_design -os standalone -proc $proc_name -app $app_type -compile -dir $app_dir
file copy -force [file join $app_dir "executable.elf"] [file join $app_release_dir $app_release_elf]
```


build_zynqmp_pmufw.hsi を Vivado で実行することにより、target/Ultra96/build-v2018.2/zynqmp_pmufw.elf が生成されます。

```console
vivado% cd target/Ultra96/build-v2018.2/fpga/
vivado% hsi -mode tcl -source build_zynqmp_pmufw.hsi
```

## 参考

 * [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」@Qiita](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)
OpenCV For Unityを使ってiPhone上でYOLOを動かす


## はじめに

[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)には色々なサンプルが入っており、その中にYOLOを使ったものがあります。

YOLOとは画像認識のアルゴリズムで、比較的処理が高速なことが知られています。

[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)に含まれているYOLOのデモは以下の2つで、[WebGLでのデモページ](https://enoxsoftware.github.io/OpenCVForUnity/webgl_example/index.html)からも試すことが出来ます。

- YoloObjectDetectionExample
    - 画像を使ったYOLOのデモ
- YoloObjectDetectionWebCamTextureExample
    - Webカメラを使ったYOLOのデモ

また、このデモをiPhone XSで動かした動画が以下になります。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">iPhoneでYOLOです <a href="https://t.co/zrqRHj4mpE">pic.twitter.com/zrqRHj4mpE</a></p>&mdash; Nakaji Kohki (@kohki_nakaji) <a href="https://twitter.com/kohki_nakaji/status/1055786287209168896?ref_src=twsrc%5Etfw">2018年10月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)はiOSを始めとして様々なプラットフォームに対応したアセットなのですが、2018/10/26現在の環境で動かすためにはいくつかの手順が必要でしたので、記しておきたいと思います。

## 手順

予め[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)をプロジェクトにインポートしておきます。

YOLOを使うためには、まずモデルデータをインポートする必要があります。ライセンスの関係でOpenCVForUnityのパッケージ自体には入っていないので、別途リポジトリからダウンロードしてきます。

必要なファイル以下の3つです。

- https://github.com/pjreddie/darknet/tree/master/data/coco.names
- https://github.com/pjreddie/darknet/blob/master/cfg/yolov3-tiny.cfg
- https://pjreddie.com/media/files/yolov3-tiny.weights
- https://github.com/pjreddie/darknet/blob/master/data/person.jpg
    - (YoloObjectDetectionExampleのみ必要)

これを、`Assets/StreamingAssets/dnn`以下に置いておく必要があります。

OpenCVForUnityの直下にある`StreamingAssets`に雛形があるので、フォルダ毎`Assets`直下に移動させると良いと思います。

*ちなみにですが、`StreamingAssets/dnn`以下にあるドキュメントでは`coco.names`の記述が抜けているのと、実行時のファイル参照エラーメッセージでは指定されているyoloのバージョンが異なっていました。罠っぽい…。*

ここまでやると、エディタ上で実行ができる状態になります。
`OpenCVForUnity/Examples/MainModules/dnn/YoloExample`以下にあるシーンを再生してみてください。

<img width="587" alt="スクリーンショット 2018-10-26 21.25.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/55365/41d0e489-b4fa-65e3-2f2e-b8ac7d435143.png">
*画像: `YoloObjectDetectionExample.unity`を再生した例*

iPhoneで再生するためにはもう一つ手順が必要です。

iOSで実行した場合`Utils.cs`の`string getFilePath (string filepath, bool refresh = false)`という関数内にある`File.Exists (destPath)`がtrueを返してくれない事象を確認しました。そのため、モデルデータを読み込めず、正常に実行されません。

対処としては、ファイルの存在チェックを行わずにpathを返すようにすれば良いです。

```変更前.cs
if (File.Exists (destPath)) {
    return destPath;
} else {
    return String.Empty;
}
```
```変更後.cs
return destPath;
```

この状態でビルドすれば冒頭の動画のように実行出来ると思います。
エンジニア流ホワイトボードのすヽめ

# エンジニア流ホワイトボードのすヽめ

ホワイトボードって便利ですよね
おうちにあるとできるエンジニアって感じですよね

- ホワイトボードの種類
    - 据え置き
        - ドーンと構えちゃいましょう
    - キャスター
        - コロコロしましょう
    - 壁掛け
        - 予定表みたいに使いましょう
    - 壁貼り付け
        - おすすめ。壁一面のホワイトボードで他を圧倒しましょう
    - 手持ち
        - 大喜利ができちゃいます
最近のNode.jsプロジェクトのだいたいテンプレ

## サンプルプロジェクト

https://github.com/maruware/nodejs-ts-project-sample

## 要素

* Typescript
* ts-node
* koajs
* koa-router
* tslint (standard)
* mocha, chai
* log4js
* config

## 説明

~~TypeScriptで書いて、tscはせずにts-nodeでそのまま動かしている。~~
ts-nodeだとサーバーなどは起動頻度が低くていいけど、コマンド実行系が遅くてめんどくさいのでtscするように変更。

Webまわりはkoajsを使っている。expressに差し替えても問題ない。
tslintは[tslint-config-standard](https://github.com/blakeembrey/tslint-config-standard)を使っているけどこのへんは好み。
DBは含めてないが、mongooseやsequelizeなどその都度好きなのを使う。

[index.ts](https://github.com/maruware/nodejs-ts-project-sample/blob/master/index.ts)と[server.ts](https://github.com/maruware/nodejs-ts-project-sample/blob/master/server.ts)を分けているのはAPIのテストを
走らせるため。

```ts
const server = new http.Server(app.callback())
```

いったん上記のようにhttpをはさんでいるのはsocket.ioなどを使うときのため。

Docker使わないときのサーバー上での起動はpm2を使っていて、デプロイも[pm2 deploy](https://pm2.io/doc/en/runtime/guide/easy-deploy-with-ssh/)を使っている。
サーバー側のpm2のセットアップは

```
npm i -g pm2
pm2 install typescript
```

としておく。
pm2のconfigは[ecosystem.config.js](https://github.com/maruware/nodejs-ts-project-sample/blob/master/ecosystem.config.js)のように書く。
【Rails】findとfind_byとwhereの使い分け

## データを探して取って来たい
1. 「id」がわかっていて、ひとつだけ取りたい
　　　→　findメソッド
2. 「id」がわからないが、それ以外の情報がわかっている。ひとつだけ取りたい
　　　→　find_byメソッド
3. ひとつの情報で、複数のデータを取りたい
　　　→ whereメソッド

## findメソッド

```
User.find(3)
```
・検索できるのは「id」のみです
・検索にかかったひとつのデータを取得します
・検索に該当するものがなかった場合は`ActiveRecord::RecordNotFound`を返します

```
pry(main)> User.find(3)
  User Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
=> #<User:0x00007f894b349aa0
 id: 3,
 email: "〜",
 crypted_password: "〜",
 salt: "〜",
 created_at: 〜,
 updated_at: 〜,
 reset_password_token: 〜,
 reset_password_token_expires_at: 〜,
 reset_password_email_sent_at: 〜,
 access_count_to_reset_password_page: 〜,
```
　`id = 3`のデータが取得できました

```
pry(main)> User.find(8)
  User Load (0.5ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 8 LIMIT 1
ActiveRecord::RecordNotFound: Couldn't find User with 'id'=8
```
`id = 8`のデータが存在しておらず、`ActiveRecord::RecordNotFound`が返っています。
コードによっては、この返り値で処理が止まってしまうことがあります。要注意です。

## find_byメソッド
```
User.find_by(name: "morikuma")
```
・「id」以外でも検索できます
・複数のデータが該当する場合、検索にかかった一番最初のデータをひとつだけ取得します
・検索に該当するものがなかった場合は`nil`を返します

```
pry(main)> User.find_by(name: "morikuma")
  User Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
=> #<User:0x00007f894b349aa0
 id: 4,
 name:""morikuma"
 email: "〜",
 crypted_password: "〜",
 salt: "〜",
 created_at: 〜,
 updated_at: 〜,
 reset_password_token: 〜,
 reset_password_token_expires_at: 〜,
 reset_password_email_sent_at: 〜,
 access_count_to_reset_password_page: 〜,
```
id以外の`name: "morikuma"`を使って、検索ができました。

``` 
pry(main)> User.find_by(name: "hogehogehoge")
  User Load (0.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 9 LIMIT 1
=> nil
```
該当しない名前で処理した場合`nil`が返ってきます。
エラー処理の分岐などを考える際に、押さえておくとつまづかずに済むポイントです。

## whereメソッド
```
User.where(place: "tokyo")
```
・「id」以外でも検索できます
・該当する複数のデータをすべて取得します
・検索に該当するものがなかった場合は空の配列を返します


```
pry(main)> User.where(place: "tokyo")
  User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3, 4)
=> [#<User:0x00007f8949c24460
 id: 1,
 name:""morikuma"
 email: "〜",
 place: "tokyo"
 〜〜〜
 〜〜〜,

 id: 3,
 name:"hayashikuma"
 email: "〜",
 place: "tokyo"
 〜〜〜
 〜〜〜,
```
一部データの表示を省略しましたが、一つの情報で複数のデータを取得できました。

```
pry(main)> User.where(place: hawaii)
  User Load (0.7ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 9
=> []
```
検索に該当するものがなかった場合は空の配列が返ってきます。




それぞれの挙動と、falseの返り値を踏まえて適切な方法をきちんと使い分けられるようになりたいです。
whereについては、まだ使い慣れていない所がありますので誤りなどありましたら恐れ入りますがご指摘ください。


今日はこのあたりで失礼します。


## 参考サイト


ActiveRecordのfindとfind_byとwhereの違いとか更新とか
https://t4traw.github.io/20140409how-to-active_record-find-and-find_by-and-where.html

find、find_by、whereの違い
https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3
Ultra96 向け Debian GNU/Linux (v2018.2版) の構築(FSBL編)

## はじめに

Ultra96 に Debian GNU/Linux (v2018.2版) を構築する方法について、具体的な方法をいくつかに分けて説明します。

 * [Introduction](https://qiita.com/ikwzm/items/5ae07792143d8018bfea)
 * [Boot Loader](https://qiita.com/ikwzm/items/9c78e83298906447fe5d)
   - [Sample FPGA Design](https://qiita.com/ikwzm/items/0489b02962c6f0455783)
   - __FSBL   (First Stage Boot Loader)(この記事)__
   - [PMUFW  (Platform Manager Unit Firmware)](https://qiita.com/ikwzm/items/00024adf956696dd51c6)
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/3c0d735cd3a605d269f3)
   - [U-Boot](https://qiita.com/ikwzm/items/11853d8cfdaf373beaef)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/af4420edd262e14feef9)
 * [Linux Kernel](https://qiita.com/ikwzm/items/02af5ac78a558c910e84)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/be06b07e26cbf05fec2b)

この記事では、Ultra96 の Boot Loader で使うための FSBL(First Stage Boot Loader) の構築について説明をします。

## 必要な環境

 * Vivado SDK 2018.2

## Sample FPGA Design の構築

FSBL の構築には Sample FPGA Design のハードウェア情報が必要です。[「Ultra96 向け Debian GNU/Linux (v2018.2版) の構築(Sample FPGA Design編)」](https://qiita.com/ikwzm/items/0489b02962c6f0455783)の通りに target/Ultra96/build-v2018.2/fpga/project.sdk/design_1_wrapper.hdf を作っておきます。

## FSBL の構築

ここでは Vivado の hsi(Hardware Software Interface) を使って構築する方法を示します。GUI を使って手で入力するのは面倒なので Tcl スクリプトファイルを用意しています。 Tcl スクリプトの詳しい内容は[「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)を参照してください。

```Tcl:target/Ultra96/build-v2018.2/fpga/build_zynqmp_fsbl.hsi
#!/usr/bin/tclsh

set app_name          "fsbl"
set app_type          "zynqmp_fsbl"
set hwspec_file       "design_1_wrapper.hdf"
set proc_name         "psu_cortexa53_0"
set project_name      "project"
set project_dir       [pwd]
set sdk_workspace     [file join $project_dir $project_name.sdk]
set app_dir           [file join $sdk_workspace $app_name]
set app_release_dir   [file join [pwd] ".." ]
set app_release_elf   "zynqmp_fsbl.elf"

set hw_design         [open_hw_design [file join $sdk_workspace $hwspec_file]]

generate_app -hw $hw_design -os standalone -proc $proc_name -app $app_type -compile -dir $app_dir
file copy -force [file join $app_dir "executable.elf"] [file join $app_release_dir $app_release_elf]
```

build_zynqmp_fsbl.hsi を Vivado で実行することにより target/Ultra96/build-v2018.2/zynqmp_fsbl.elf が生成されます。

```console
vivado% cd target/Ultra96/build-v2018.2/fpga/
vivado% hsi -mode tcl -source build_zynqmp_fsbl.hsi
```

## 参考

 * [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」@Qiita](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)
AzureCLIへの証明書インストール方法

# AzureCLIへの証明書インストール方法

## Azureのテナント制御
Azureにテナント制御という仕組みがあります。詳細はリンクを参照してください。
https://blogs.technet.microsoft.com/office365-tech-japan/2017/02/06/tenant-restrictions/

これは、自社のAzureテナントのみサインイン可能とする仕組みをプロキシサーバとAzureADを利用して実現するのですが、その際にプロキシでSSLインターセプトする必要があります。

## 証明書インストールの必要性
このSSLインターセプトをする際に、接続元にプロキシの証明書をインストールする必要があります。ブラウザでAzureポータルにサインインする場合は、インターネットオプションやMMCから証明書をインストールすれば良いのですが、AzureCLIはこれとは別に証明書ストアを持っています。そのためAzureCLIの実体であるPythonに証明書をインストールする必要があります。

## AzureCLIへの証明書インストール手順
### 証明書のエンコード形式
AzureCLIに証明書をインストールする場合は、Base64 エンコード形式を利用する必要があります。Base64 エンコード形式でない場合は以下の方法で変換可能です。

##### Base 64 エンコードへの変換手順
1. Windows 上で、証明書ファイルをダブルクリック

1. “詳細”タブにて、”ファイルにコピー”をクリック

1. 証明書のエクスポートウィザードが起動するので、 ”Base 64 encoded X.509(.CER)(S)”を選択、ファイル名を指定して、エクスポートする

### WindowsでのAzureCLIへの証明書インストール
Windowsの場合は、以下のコマンドを実行します
`C:\temp`に`Certificate_CA.cer`という名前の証明書を配置した場合のコマンド例です。

````text:cmd
type "C:\temp\Certificate_CA.cer" >> "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem"
````
### LinuxでのAzureCLIへの証明書インストール
Windowsの場合は、以下のコマンドを実行します
`/tmp`に`Certificate_CA.cer`という名前の証明書を配置した場合のコマンド例です。

````bash:bash
cat /tmp/Certificate_CA.cer >> /usr/lib64/az/lib/python2.7/site-packages/websocket/cacert.pem
````
CSSでヘッダーを上部に固定する方法

# CSSでヘッダーを上部に固定する方法
スクロールしていっても要素を表示しておきたい時に。
備忘録的に書いておきます。

## positionをfixedにする。
cssでposition: fixedにすると固定ができます。以下サンプル。

```html
<header>
  ヘッダーを上部に固定
</header>

```

```css
header {
    position: fixed;
    width: 100%;
    height: 200px;
    background-color: #d4d4d4;
}
```
チームラボにあったXSS

## チームラボのWebサイト

- https://www.team-lab.com/
- https://www.teamlab.art/jp/

2018年10月にあったXSS。
スクショなどは取り忘れてた。現在は修正済。

### Not Foundページ

Not Foundページで、URLの値をエスケープ無しでDOMに反映していた。
以下のようなURLでXSSができた

- [https://www.team-lab.com/">\<script>alert(1)\</script>](https://www.team-lab.com/"><script>alert(1)</script>)

### 検索ボックス

検索ボックスで、入力した値をエスケープ無しでDOMに反映していた部分があった。
以下のような制限がありJavaScriptを実行することはできなかった。

- <...> (任意のHTMLタグ)
    - タグを閉じたら無効だった。半開きのタグはセーフ
    - 例えば、`<img ~ > ~`は無効。`<img ~`はセーフ。
- javascript: ~
- onmouseover=などイベントハンドラ
- `<iframe`、`<meta`など一部の半開きなHTMLタグ

しかし、以下のようなことはできた。

**リダイレクト**

以下のようなURLで、(おおよそ)任意のページにリダイレクトすることができた。ここではGoogle。

- [https://www.teamlab.art/jp/?submit=1;URL=https://www.google.com"http-equiv="refresh"]([https://www.teamlab.art/jp/?submit=1;URL=https://www.google.com"http-equiv="refresh"])

**画像などの挿入**

画像の挿入。ここではGoogleのロゴ。

- [https://www.teamlab.art/jp/?submit="><img src="https://www.google.co.jp/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"width="100%"](https://www.teamlab.art/jp/?submit="><img src="https://www.google.co.jp/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"width="100%")

動画の挿入。DMMのサンプル動画が全画面表示で自動再生される。

- [https://www.teamlab.art/jp/?submit="><video src="http://cc3001.dmm.co.jp/litevideo/freepv/m/mid/mide00589/mide00589_sm_w.mp4"width="100%"autoplay](https://www.teamlab.art/jp/?submit="><video src="http://cc3001.dmm.co.jp/litevideo/freepv/m/mid/mide00589/mide00589_sm_w.mp4"width="100%"autoplay)


## チームラボが制作したWebサイト

チームラボの制作事例に載っているWebサイトのうち、5つにXSSかCSRFがあった。
全部報告はしてある(2018年10月27日)。
いずれ書く。

## 感想

XSSを発見した当時チームラボのバイトの面接を受けてたが、普通に落ちた。
残念。
VSTプラグインをMaxで使用する

#MaxでVSTプラグインのエフェクトを使用したい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/d38b86d9-8682-b858-e404-d17b469f0c60.png)
　Maxでは[vst~]というオブジェクトを使うと、自分が持っているVSTインストゥルメントやVSTプラグインを使えるようになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/bb8f54cb-cf3f-b05d-e424-d5af1a3617cd.png)
　[vst~]にメッセージで「plug」を送るとファイルを指定するウィンドウが表示される。


#VSTのありか
###Macでのパス
- Macintosh HD > ライブラリ > Audio > Plug-Ins > VST
など

###Windowsでのパス
- C¥ProgramFiles¥VSTPlugIns
- C¥ProgramFiles¥Steinberg¥VSTPlugins
- C¥ProgramFiles¥Steinberg¥Cubase¥VSTPlugins
など

ProgramFiles(x86)のフォルダには64bit対応のVSTプラグインが基本的に入っている。

###32bitと64bit
　Cycling '74の[Max 8ダウンロードページ](https://cycling74.com/downloads)によると、Max 8は32bitをサポートしていない。64bitで起動すると32bitで動くVSTプラグインは使用できなくなる。32bitのVSTプラグインを使用したい場合はMax 7で起動させる必要がある。
　VSTプラグインが読み込めないと、このようなエラーがmaxコンソールに表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/22f15839-016b-f111-27d8-5b89cab9f644.png)

#パラメータの変更

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/6f33a7a2-db4e-de18-1973-b70d98ea6987.png)

　ここではWavesのStudioRack Stereoを読み込み、内部でEQプラグインのQ2を読み込みました。このプラグインにメッセージを送ることでパラメーターを変更することも可能です。
　どのようなメッセージを送ればいいかは[vst~]の第３アウトレットに[print]を接続し、「param」メッセージを送ることで調べることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/db8b61b8-6c97-5f4e-aca0-9d2898857664.png)
　Waves Q2ではこのようなパラメーターのリストが出力されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/af579f70-137f-f920-1b88-81d511992f9b.png)
　変更したいパラメーターを選び、「パラメータ名＋数値」のメッセージを送ることで変更できます。パラメーター名にスペースが入っている場合は、そのまま送るとリストメッセージになりエラーになるので「"パラメーター名"」のように囲いましょう。
　数値は0.0～1.0の範囲となります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/2281f8a0-9fdc-4c0d-74bd-275419777c3f.png)
　上手くパラメーターを送信できた場合は、VSTプラグインのウィンドウで反映されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/802bb0eb-e18d-111a-8790-74108f096dc3.png)


#音声にエフェクトをかけてみる
　今回はMaxのオーディオ・サンプルのjongly.aifの音声にVSTプラグインをかけてみます。オーディオ・サンプルをドラッグ＆ドロップし[playlist~]を作成しました。このアウトを[vst~]の第１第２インレットに挿入します。
　[vst~]の第１インレットはステレオのL、第２インレットはRの信号を受け取ります。第１アウトレットはL、第２アウトレットはRの信号を出力します。　
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93396/6d6ae564-99a6-2931-0be3-2d623f0c394b.png)
　これだけでVSTプラグインのエフェクトがかけられた音声が出力されます。

#遅延について
　VSTプラグインは主にDAW上で使用するものであり、またスタジオでのミキシング・マスタリング用途として作られています。一方Maxは、素材づくりの為の音響処理から、ライブエレクトロニクスなどのリアルタイム処理などに使われます。そのためプラグインによっては、リアルタイム処理に向いていないものもあります。
　マルチチャンネル・コンプレッサーのような複雑な信号処理が行われるプラグインは、入力から出力までに70ms程の遅延が起こることがあります。この遅延はミキシングでは気になりませんが、ライブで使用するには演奏との差がありすぎていて使いにくいものになります。用途にあったプラグインを選択しましょう。
手っ取り早くunityで既存cppをdll化して動かすやり方

※これは動作確認テストのために、いろいろ端折ったものです。
　最低限すら守っていません。

動いてるcppプロジェクトのcppファイルに
exturn "C" _declspec(dllexport) int test(){return 0;}
って追加して
プロジェクトのプロパティからc/c++のsdlをnoにして
configuration Typeをdllに変更してビルド

生成されたdll群をunityに突っ込んで
using System.Runtime.InteropService;
[DllImport("dll名（拡張子要らない）")]private static extern int test();
って追加して

Debug.Log(test().toString());

ってStart(){}にでも突っ込む。
ElixirとPhoenixを触ってみる(mac版)

エンジニア歴数ヶ月の新人がElixirとPhoenixについて書いていきます。

##きっかけ
- 名前にそそられた
- これから伸びそう
- 福岡で盛り上がってるみたい

##目標
#####ざっくりと概要を理解してインストールができるようになる
##Elixirとは
[Elixir:ドキュメント](https://elixir-lang.jp/)
>Elixirは拡張性と保守性の高いアプリケーションを構築するためにデザインされた、動的で関数型のプログラミング言語です。
Elixirは、低レイテンシで分散型のフォールトトレラントシステムや、Webや組み込みシステムの領域で成功を収めている、Erlang VMを利用します。

- 耐障害性
- 分散アプリケーションの構築のしやすさ
- 関数型プログラミング
- Erlang VM(BEAM)上で動作する言語
- Erlangのいいとこ取りしている
- mixなどのビルドシステムがある

##Phoenixとは
[Phoenix:ドキュメント](https://phoenixframework.org/)

- Elixir製のWEBフレームワーク
- MVCパターンで書ける
- RubyonRails風

※ドキュメントを翻訳している方がいました。
[Phoenix Framework Guide をなんとなく訳してみた](https://qiita.com/rtbt525/items/afbf666e0c026c5658f4)
##インストール編
インストールするもの

- Homebrew
- Elixir
- Phoenix
- PostgreSQL

###Homebrew
※途中でOSのパスワード求められます

```ruby:ターミナル
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

###Elixirのインストールとバージョン確認
```ruby:ターミナル
#Elixirのインストール
$ brew install elixir
Erlang/OTP 21 [erts-10.1.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Elixir 1.7.3 (compiled with Erlang/OTP 21)

#Elixirのバージョン確認
$ elixir --version
Elixir 1.7.3 (compiled with Erlang/OTP 21)

```
###Postgresqlのインストールとバージョン確認

```ruby:ターミナル
#postgresqlのインストール
$ brew install postgresql

#postgresqlのバージョン確認
$ postgres --versio
postgres (PostgreSQL) 10.5

#起動(?)
$ pg_ctl -D /usr/local/var/postgres start

#DB追加
$ createdb

#ユーザー作成
$ createuser postgres

#接続
$ psql

# DB作成準備
[username=# ALTER USER postgres CREATEDB;

#終了
\q
```
###hexパッケージマネージャとPhoenix本体をインストール

```ruby:ターミナル
#hexパッケージマネージャ
$ mix local.hex
* creating /Users/****/.mix/archives/hex-0.18.1

#Phoenixインストール
$ mixarchive.installhttps://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
* creating /Users/****/.mix/archives/phoenix_new
```

###プロジェクト作成
```ruby:ターミナル
#プロジェクト作成
#$ mix phoenix.new [プロジェクト名]
$ mix phoenix.new example

#プロジェクトのディレクトリに移動
$cd example

#ビルドインサーバー起動
$ mix phoenix.server
http://localhost:4000
```

[http://localhost:4000](http://localhost:4000)にアクセスして表示されたら終わり！

####Error
プロジェクト作成時に以下のエラーが出る

```ruby:ターミナル
* error command failed to execute, please run the following command again after installation: "npm install && node node_modules/brunch/bin/brunch build"
ユーザーpc:プロジェクト名 ユーザー名$ 
```
このエラーがでた場合、ビルドインサーバーが起動しないが、以下のコマンドを書くことで起動されるようにりました

```ruby:ターミナル
#作成したプロジェクトのディレクトリに移動

$cd プロジェクト名
$ mix ecto.create
```
##まとめ
エラーが出たりしましたが、なんとかPhoenixの表示まで行えました。
概要を理解するにもわからない単語が多すぎて、何を言っているのかわからないので
実際に触りながら単語の意味を理解していきます。

###参考資料
[Elixirを勉強し始めたときに役立つトピック](https://qiita.com/eikoiwawa/items/7626a67334c12f28aeae)
[Elixir + Phoenixでリアルタイムアプリケーションを作ってみるメモ](https://qiita.com/shufo/items/9cfb7bfcecd363e0ea86)
[[翻訳] Railsの弟、Phoenix Frameworkで遊ぼう](https://qiita.com/HirofumiTamori/items/316e746948014cfa16e4)
[Phoenix-Frameworkの基礎知識](https://qiita.com/darui_kara/items/8860ccfbed04278cf4fa)
Qiitaの限定共有投稿で意図せずユーザーメンションすると通知がされて迷惑になるので注意しましょう

## 概要

下記の記事を自動投稿する仕組みを作っているときにやらかしてしまいました。

ランキングに記事が入っておられた皆さま、やたらめったと通知を飛ばしてしまい、申し訳ありませんでした。現在はメンションを利用せず、リンクに修正しています。　


Qiita週間ストック数ランキング【自動更新】
https://qiita.com/kai_kou/items/180a91fd88dbbbd746f6

Qiita週間コメント数ランキング【自動更新】
https://qiita.com/kai_kou/items/df87ebf338389a39062c


## 気をつけるべき点

@kai_kou とQiitaのユーザIDの前に```@``` をつけると自動でそのユーザーのプロフィールページへのリンクを生成してくれて便利だったので、上記のランキングでユーザーさん紹介に利用してみました。

ただ、すっかりと本来のメンションという機能のことが頭から抜けていて今回の失態にいたったという話でした。お恥ずかしい///


気がついたのは、検証時に利用していた限定共有投稿に妙にアクセスが付いてたので、やらかしているのが判明しました。そりゃそうなのですが、公開投稿だろうが限定共有投稿だろうがメンションつけてるのだから、通知されます。

このままメンション運用を続けていた思うと。。。危なかったです。


## まとめ

記事内でユーザーさんのプロフィールページを案内したい場合は、手を抜かずにリンクを生成しましょう。


```md:意図しないメンションだめ
@kai_kou
```

```md:リンクにしましょう
[kai_kou](https://qiita.com/kai_kou)
```
名前空間内クラスを変数で呼び出すときはグローバルプレフィックス演算子がいらない

ちょっと何言ってるのかよくわからない。

# 別の名前空間のクラスを呼び出す

[別の名前空間のクラスを呼び出す](http://php.net/manual/ja/language.namespaces.rules.php)ときは、以下のように完全修飾名で記述します。

```php
namespace FOO;
	class BAR{
		public function __construct(){echo 'BAZ';}
	}

namespace HOGE;
	new \FOO\BAR(); // BAZ
	new FOO\BAR(); // Fatal error: Uncaught Error: Class 'HOGE\FOO\BAR' not found
```

newの次にある名前空間の頭の`\`をグローバルプレフィックス演算子と言いますが、これを入れ忘れると、Class not foundのFatal errorが発生します。
なぜなら、`\`を使わない指定は名前空間`\HOGE`からの相対パス、`\HOGE\FOO\BAR`を表しているからで、当然そのようなクラスは存在しないためエラーになるわけです。
Linuxや`<script>`タグなどのディレクトリ指定と同じように、頭に`\`があるかないかで絶対パス[^1]か相対パスを識別しているということですね。


# 現象

ところでちょっとこれを見てくれ。

```php
namespace HOGE;
	$class = 'FOO\BAR';
	new $class; // BAZ ← ？？？
```

なんで？

さらに$classの中身は'FOO\\\BAR'でも'\FOO\BAR'でも'\\\FOO\\\BAR'でも'\\\FOO\BAR'でもどれでも動きます。
いみがわからなすぎるぞ。


どうやら変数からnewした場合、常に完全修飾名であると見做されてしまうようです。

```php
namespace FOO;
	class BAR{
		public function __construct(){echo 'BAZ';}
	}

	$class = 'BAR';
	new $class; // Fatal error: Uncaught Error: Class 'BAR' not found

	$class = 'FOO\BAR';
	new $class; // こちらならOK
```

`BAR`は`\FOO`からの相対パス`\FOO\BAR`ではなく、絶対パス`\BAR`として扱われています。

実はマニュアルの[名前空間と動的言語機能](http://php.net/manual/ja/language.namespaces.dynamic.php)という項目に、これについての記載があります。
あるのですが、

> 動的なクラス名、関数名あるいは定数名においては修飾名と完全修飾名に差はないので、 先頭のバックスラッシュはなくてもかまいません。

何言ってるのかわかんねえ。


# 原因


さて、この差の原因ですが、直接べた書きしたときはコンパイル時に名前解決が行われ、変数を経由したときは実行時に行われる、という違いのようです。

```php
namespace FOO;
	echo __NAMESPACE__; // FOO
	eval('echo __NAMESPACE__'); // "" ←
```

evalは実行時に評価が行われますが、その時点での`__NAMESPACE__`は空白になっています。

コンパイル時は名前空間に従って構文の解釈が行われます。
そして、コンパイル時に名前空間に関する情報は全て取り払われ、実行時には名前空間は無いものとして扱われます。

まあソースを読んだわけではなく現象からの推測ですが。
[ソースコードリーディング](https://github.com/php/php-src/blob/PHP-7.2.12/Zend/zend_compile.c#L6649)は挫折した。


# おまけ

名前空間内であれば、既存の組み込み関数やクラス、定数などと被る名前であっても堂々と命名できます。
わかりにくいのでやめたほうがいいですが。

```php
namespace FOO;
    function printf(){}
    class stdClass{}
    const PHP_VERSION = '6.0.0';
```

そして、何故か[ごく一部の定数だけ例外](http://php.net/manual/ja/language.namespaces.faq.php#language.namespaces.faq.builtinconst)があります。

```php
namespace FOO;
    const NULL = 1; // Fatal error: Cannot redeclare constant NULL
```

NULL・TRUE・FALSE・ZEND_THREAD_SAFE・ZEND_DEBUG_BUILDの5定数だけは、名前空間内であろうとも定義することができません。
前三つはわかるとしても、後ろの二つはなんぞ？

あと言語構造などの[キーワード](http://php.net/manual/ja/reserved.keywords.php)は関数名として使えません。

```php
namespace FOO;
    function print(){} // Parse error: syntax error, unexpected print
    function null(){} // こっちは使える
```

これに関する記載は[ユーザノート](http://php.net/manual/ja/reserved.keywords.php#119738)しか見当たらなかったんだけど、マニュアルにはどこかに記載はないのだろうか。

# その他

別名前空間の変数を見たいときはどうすればいいんだっけ。

```php
namespace FOO;
	const BAR = 1;
	$baz = 1;

namespace HOGE;
	echo constant('\FOO\BAR'); // 1
	echo \FOO\$vaz; // syntax error
```


[^1]: 正確にはルート相対パス
【Swift】AutoLayout計算後のViewのCGSizeを取得する

# はじめに

リファレンス(https://developer.apple.com/documentation/uikit/uiview/1622624-systemlayoutsizefittingsize)

```swift
/* The size fitting most closely to targetSize in which the receiver's subtree can be laid out while optimally satisfying the constraints. 
If you want the smallest possible size, pass UILayoutFittingCompressedSize; for the largest possible size, pass UILayoutFittingExpandedSize.
Also see the comment for UILayoutPriorityFittingSizeLevel.
*/
@available(iOS 6.0, *)
open func systemLayoutSizeFitting(_ targetSize: CGSize) -> CGSize // Equivalent to sending -systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority: with UILayoutPriorityFittingSizeLevel for both priorities.

@available(iOS 8.0, *)
open func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize
```

# 使い方

`targetSize`...返されるサイズのベースとなるサイズを指定します。表題の通り計算後のサイズぴったりとしたい場合は大抵`UIView.layoutFittingCompressedSize`（Viewが取りうる最小サイズ）を指定します。

`withHorizontalFittingPriority`...targetSizeで指定した横幅の優先度を指定します。例えば横幅に`500`を指定した状態で`.required`（優先度最大）を指定すると500pxになり、`.fittingSizeLevel`（優先度最低）を指定すると中身に合わせて横幅が変わるイメージです。
`verticalFittingPriority`...上記の縦幅バージョンです。

第2,3引数が省略された関数では、それぞれ`.fittingSizeLevel`で計算されます。

以下、popover表示するViewControllerのサイズを指定する例です。

```swift
// ContentVCを生成
let contentVC = ContentViewController()
contentVC.modalPresentationStyle = .popover
// 制約通りで最小サイズ
contentVC.preferredContentSize = contentVC.view.systemLayoutSizeFitting(CGSize(width: 300, height: 0),
                                                                        withHorizontalFittingPriority: .required,
                                                                        verticalFittingPriority: .fittingSizeLevel)
contentVC.popoverPresentationController?.sourceView = self.view
contentVC.popoverPresentationController?.sourceRect = button.frame
contentVC.popoverPresentationController?.permittedArrowDirections = .any
// 表示
self.present(contentVC, animated: true, completion: nil)
```
LINEbotを使った文化祭大賞投票システムについて

#はじめに
僕が通っている高校の文化祭では一番良かった出展を決める投票があります．
今までは紙の投票用紙に投票番号を書いてもらう形で投票を行っていましたが，3000票超の票を集計する手間や，絶対に集計ミスあるだろうという問題があり，今年からスマホを使った投票システムを作ろうという事になりました．
今回はそれを自分の備忘録的な意味も込めて記事にしたいと思います．
#なんでLINEbotでやろうと思ったの？
######アプリはユーザーが使用するハードルが高い
Wi-Fi環境下でしかインストールしたくない，そもそもアプリインストールってどうやるの？，あんしんフィルターェ...などなど
######LINEbotはユーザーが利用するハードルがめちゃめちゃ低い
アプリは上記の理由で難しい．それならWeb投票で良いんじゃないかと思う人もいるだろうが，Web投票はフロントエンドを作るのめんどくさいし，セキュリティの面もちょっと心配．
でも，LINEbotならユーザーが利用するハードルが極めて低い．QRコードを読み取って追加するだけでサービスを利用開始できる．その上，フロントエンドを丸投げできるからそもそも開発が楽だし，セキュリティに関してもあまり考えずに開発ができる（署名検証とかはしなくちゃいけないけど）
#実際にやってみて
###上手くいった点
・見込み通り集計の手間が減った

**以上！！！！！**

大失敗とまではいきませんでしたが，僕の見込みが甘かったですね...
失敗の理由は以下の通りです．
###上手くいかなかった点
######・友達追加時あいさつに投票方法を載せるのを忘れてしまい，追加したのに投票できなかった人が400人ほどいた
そこそこ致命的なミス．
コードに関しては当日まで最終チェックをしていたが，友達追加時あいさつなどのLINE@MANAGERで設定する項目に関してのチェックを忘れていた...
######・生徒による組織票が目立った
######・「投票番号〇〇番に投票してください！」というような文言と共に，QRコードをTwitterなどで拡散する生徒がいた.
以上の二つに関しては，生徒からの投票だけを防ぐことはできないので，来年はbeaconをグラウンド等に設置してその範囲内でしか投票出来ないようにするなどで対処する事もできるが...（詳しくは後述で）
######・想定より追加数が少なかった
これも詳しくは後述で
###想定より追加数が少なかったのはなぜか？
######・スマホを取り出してQRコードを読み取って追加して投票う番号を送信するより，紙に投票番号を書いて投票する方がはるかに楽
テクノロジーが先行してしまい，効率化や利便性向上という本来の目的を見失っていた
######・来場者は主に小学生（受験生）や保護者（4,50代）のため，LINEを使っていない人や，そもそもスマホを持っていない人がいた
ターゲットユーザーに対して適切なツールを選択できなかった．
先ほどbeaconを使うということを書いたが，beaconを使うにはLINEの設定から利用規約に同意して位置情報をオンにしないといけない．URLスキームを使えば多少は簡単になるだうが，そもそも投票アカウントを追加することすらめんどくさがる人たちにそれが出来るとは思えない．
######・友達追加をするとLINEの情報を抜き取られるのではないかと危惧する人がいた
パンフレットには取得する情報やその管理について明記したが，それを読まない人が大半だし，読んでもやはり怖いという人はいた．
##結局何が言いたいの？
LINEをやっていない人や，そもそもスマホを持っていない人，情報リテラシーがとても低い人（小学生など）がたくさん来る中で来場者の端末を使うのは非常に困難です．
さらに，ユーザーが日常的に使うサービスなら別ですが，一度しか使わないようなサービスにアプリやLINEbotを使うのは少しナンセンスな気がしました．（尚半年前の自分）
結局，こちらでタブレットを用意し，それを使って投票してもらうのが一番良いのではないかと思います．
ただ，ステージイベントの時間通知や席の予約など，LINEbotを使えばもっと便利に出来るんじゃないかなーと思うこともたくさんあります．来年はもっと上手くLINEbotを使っていけたら良いなーと思います！
少し特殊なケースなので参考になったかどうかわかりませんが，僕の失敗が誰かの役に立ってくれれば嬉しいです！
そのうち技術解説についても書くかも...
##おまけ
Twitter：https://twitter.com/unix_yuto
Azure ADでメンバーを出力するお話

#1 はじめに

業務の都合上、オンプレのADからAzureに移行したい。
出力はPowershellで実施する。
やりたいことは既存メンバーの特定グループへの権限追加。

その為に、現在のObject-IDが必要なので出力する。

がデフォルトで100人までしか出力できない。これは困った！
という事象の解決方法。

#2 使用環境準備

環境は2.0以降を推奨。
できることが増えているので。

Azure Active Directory でグループを管理するための PowerShell の例
https://docs.microsoft.com/ja-jp/azure/active-directory/users-groups-roles/groups-settings-v2-cmdlets

上記リンクを参考にインストール、インポートを実施。

>`PS C:\Windows\system32> install-module azuread
 PS C:\Windows\system32> import-module azuread`

環境構築は完了。

念の為Ver確認。
`PS C:\Windows\system32> get-module azuread`

以下の文字列が返ってきてVerがわかります。
`ModuleType Version    Name                                ExportedCommands`
`---------- -------    ----                                ----------------`
`Binary     2.0.1.16   AzureAD                             {Add-AzureADApplicationOwner, Add-AzureADDeviceRegisteredO...`


#3 実施手順


##　3-1 PowerShellを起動しAzureADに接続
Connectします。
`PS C:\Windows\system32> Connect-AzureAD`

## 3-2 ログインの画面が出るので資格情報を入力。
アドレスとパスワードです。

Powershellの画面に戻ります。

## 3-3 インポートするグループがあることを確認。
`PS C:\Windows\system32> get-azureadgroup`

返り値として一覧が出力されることを確認。
（環境次第ですがもっといっぱい出ます）
`ObjectId                             DisplayName                         Description`
`--------                             -----------                         -----------`
`aaaaaaaa-bbbb-cccc-dddd-xxxxxxxxxxxx test-group                           テスト用Group`

ここのObjectIdを控えます。使うので。

## 3-4 ユーザー情報を出力。
`get-azureadgroup -SearchString "test-group" | Get-AzureADGroupMember`

**ここで詰まりました。**
何度やっても100人しか出ない。。。

調べたところAllの引数を入れれば使えるとのこと。

やったろうやんけ。
と思ったけどエラーコードバンバン返ってくる。

よくよく見たらAllの引数渡した時にプール値が必要らしい。今回は1で設定。
デフォルト100っていう制限もなんとかしてもらいたいもんだが。。。仕方ない。

`Get-AzureADGroup -ALL 1 -Filter "DisplayName eq 'test-group'" | Get-AzureADGroupMember -ALL 1`

尚`$True`でも実施可能。$True=1みたいなもんですな。
`Get-AzureADGroup -ALL ＄True -Filter "DisplayName eq 'test-group'" | Get-AzureADGroupMember -ALL ＄True`

返り値はこんな感じ。
`ObjectId                             DisplayName                         Description
--------                             -----------                         -----------`
`11111111-2222-3333-4444-xxxxxxxxxxxx 中原 一也         xxxxxx.xxxxxxxxx@aaaaa.co.jp         Member`



*ObjectId*
ユーザーのObject-Id　紐付けの際に使用します。
*DisplayName*
ユーザー名です。
*Description*
メールアドレスです。

一番右は原則Memberかと思います。
場合によってはOwnerのパターンもありますが。


これで全員分のObject-Idが出力できたのでそれを紐付け。
Add-AzureADGRoupMember -objectId aaaaaaaa-bbbb-cccc-dddd-xxxxxxxxxxxx -RefObjectId 11111111-2222-3333-4444-xxxxxxxxxxxx

こんな感じでいい感じに整型できたら流し込みます。

### 4　参考にしたサイト
Managing Office 365 Groups Using Azure AD Powershell V2
https://drewmadelung.com/managing-office-365-group-using-azure-ad-powershell-v2/


### まとめ
Azureとは言え、Powershellみが強いなと思いました。
ただ、固有のConnectする時のGUIとかあるのでフルCLIでやりたい場合は別の方の記事を参考にするといいでしょう。

Blogもやってます。基本アウトプットはそっちでやろうと思ってます。
https://natsuo.jp/
time_selectでも日付の設定できるっぽい

時間だけじゃなく年月日の情報も保持させときたいなーと思っていたんですが

    time_select("#{row}", 'start',:default => {:year =>'2010' ,:month => '1' ,:day=>'1',:hour => '10', :minute => '00'})

設定できるんですね。

<img width="478" alt="スクリーンショット 2018-10-26 18.32.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/195314/43c3dbc9-fdd6-5007-ab62-21495ac83a79.png">

このままform_tagで投げれば時間だけでなく日付も一緒に送れる。
デフォルトだとその日ので設定されるっぽい
【入門】VS Code インストールと環境構築

VS Code（Visual Studio Code）は無料のエディタです。
プログラミングのコーディングで利用され、豊富な設定や拡張機能がありエディタ内でターミナルを開いたりデバッグなどもできます。

[こちらからVS Codeをダウンロード](https://code.visualstudio.com/download)

###ターミナル
######Git bashを利用するには
setting.jsonのUSER SETTINGSに以下を追記。
※C:~~は、bash.exeが置いてあるパス（場所）。

```
"terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
```

###拡張機能
- Settings Sync：VS Codeの設定・テーマ・ファイルアイコン・ショートカット・拡張機能などをGitに保存できる。VS Codeで変更があればGitに保存され、Gitから同期すれば他の端末でも同様の開発を再構築できる。設定のバックアップにもおすすめ。
- Color Picker：カラーコードを選択すると直接色が確認できる。
- Live Server：設定なしですぐ利用できる簡易なサーバー。
【入門】Ruby on Rails 環境構築 【Windows版】

### 動作環境
- OS: Windows10 (64bit)
- エディタ: VS code
- ターミナル: git bash
- Ruby 2.4.4
- Ruby on Rails 5.2.1　（以下、Rails）

### VSCodeインストール
※既にエディタを導入済みの方はスキップしてください。
Railsのコード編集・保存、ターミナル(Git bash)上でサーバー起動＆Gitの使用などができる。
**[【入門】VS Code インストールと環境構築](https://qiita.com/ruxes7/items/60922ffb11999c09942d)**

### GitBashインストール
※既にGitを導入済みの方はスキップしてください。

プログラムのバックアップ・変更履歴の記録・チームでの共有ができるツール。
**[【入門】Git　インストールと環境構築](https://qiita.com/ruxes7/items/f1190497fc7f5e5ac9c3)**

### Rubyインストール
- [RubyInstallerをここからインストール](https://rubyinstaller.org/downloads/)
 
（本記事ではRuby+Devkit 2.4.5-1 (x64)を使用。 ）
> Devkit:  MSYS2というRailsで活躍するツールが付属する。
> Ruby+Devkit 2.4.5-1 (x64): Windows 64bit版
> Ruby+Devkit 2.4.5-1 (x86): Window 32bit版

##### インストールの確認
git bash上で以下のコマンドを入力し、バージョンを確認。

```
$ ruby -v
```
### Railsインストール
```
$ gem install rails　#インストールコマンド
$ rails -v　　　　　　#インストール・バージョン確認コマンド
```

### Railsプロジェクト作成
 ”MyApp”は自分のアプリ名に置き換えてください。

```
$ mkdir RailsWorkspace # Railsアプリ用のワークスペースを作成します。
$ cd RailsWorkspace    # ワークスペースに移動します。
$ rails new MyApp　    # アプリ作成
$ cd MyApp　　　　　    # アプリのディレクトリ（フォルダ）に移動
$ rails server         # サーバー起動（アプリの立ち上げ）（rails sでもOK）
```
##### ブラウザで確認
サーバーが起動したのでRailsアプリのデフォルトの表示が確認できます。
Chromeなどのブラウザで、アドレスバーに以下のアドレスを入力し、アクセスします。
http://localhost:3000

### プロジェクト管理 by Git
※**[【入門】Git　インストールと環境構築](https://qiita.com/ruxes7/items/f1190497fc7f5e5ac9c3)**より、「リモートリポジトリの作成」の項から作業してください。

### デバッグ（内部の動作処理の確認・バグ発見）
```
$ rails console   # またはrails c
```
デバッグ・ログの閲覧コンソールがあります。
主にirbとpryの2種類が存在しますが、pryがより高機能で使いやすくオススメです。

###オススメGem
RailsルートディレクトリのGemfileで利用するGemを記述後、ターミナルでbundle install(または、bundle)を実行してください。
以下のようにgroup :development do　～　end 内にGemを記載していきます。

```
group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'

  # オススメのGemたち
  # make easy to see dubug console display
  gem 'awesome_print'
  # make cool error page and Use irb(rails c) on error page
  gem 'better_errors'
  # Use irb(rails c) on error page together better_errors
  gem 'binding_of_caller'
  # Use Awesome icons
  gem 'font-awesome-rails'
  # test frame work
  gem 'rspec-rails'
  # Pagenation
  gem 'kaminari'
  # make static pages
  gem 'high_voltage'
  # console tools
  gem 'pry'
  gem 'pry-doc'
  gem 'pry-rails'
  gem 'pry-byebug'
end
```

###学習参考

* [Railsチュートリアル](https://railstutorial.jp/)
* [Railsコマンドを短縮する](https://qiita.com/hirokishirai/items/9f907431db1afa3df581)
* [Gemランキング](http://bestgems.org/)
* [pryでよく使うコマンド](https://qiita.com/k-ta-yamada/items/04be1e8721ceb58387d8)
* [awesome_print - pry/ribをキレイに表示](https://qiita.com/okuramasafumi/items/e7d1a64ad9f45e3b2cc4)
DNSのテキストレコード設定について

spfやらDKIM設定する際に気になった事。
全てにダブルクォーテーションが必要なの？

ってとこで調べたメモ

**『空白を含む入力を行う場合、"（二重引用符）で"前後"を囲んでください。』**

解決！

引用元
>[https://jpdirect.jp/service/dns/apply.html](https://jpdirect.jp/service/dns/apply.html)[^1]

[^1]: JPDirect DNS 設定手順
Composerの使い方

## Composerとは
PHPのライブラリ管理ツールです。
ライブラリAを使用するためには、別のライブラリBを先にインストールする必要がある、なんてことがあります。
この時、ライブラリAはライブラリBに依存している、と言います。
Composerを使用することで依存関係にあるライブラリをまとめてインストールすることができます。

## Composerのインストール
Composerの公式サイトにアクセスして、Downloadをクリックしましょう。
各環境に合わせたインストール方法が表示されます。

Composer公式サイト
https://getcomposer.org/

> Macならbrewで簡単にインストールできます。
% brew install composer

インストールが完了したら-Vコマンドで正常にインストールされたことを確認しましょう。

    % composer -V
    Composer version 1.7.2 2018-08-16 16:57:12

## Composerのセットアップ
Composerを使用するにはcomposer.jsonファイルを作成する必要があります。
composer.jsonは、プロジェクトにインストールしたいライブラリ情報を記述するファイルです。
> composer.jsonはプロジェクトごとに作成します。

まずは、プロジェクトディレクトリを作成しましょう。


    % mkdir composer_project
    % cd composer_project

次にcomposer.jsonファイルを作成し、以下のように記述します。

```json:composer_project/composer.json
{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}
```

"require"の後に、パッケージ名：バージョン番号で、インストールしたいライブラリを指定します。
今回はロガーライブラリであるMonologをインストールしてみましょう。
別のライブラリについてはPackagist（Composerリポジトリ）を参照します。

Packagist
https://packagist.org/


## ライブラリのインストール
ではmonologをインストールしましょう。
インストールするには```composer install```コマンドを使用します。

    % composer install
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Package operations: 1 install, 0 updates, 0 removals
      - Installing monolog/monolog (1.0.2): Downloading (100%)
    Writing lock file
    Generating autoload files

インストールが完了したら何が変わったのか見てみましょう。
以下の要素が追加されていると思います。

- vendorディレクトリ
- composer.lock

vendorディレクトリにはインストールしたライブラリが保存されます。
vendor/monolog/monologディレクトリにライブラリが保存されているのを確認できると思います。

>バージョン管理ソフトで管理する場合、vendorディレクトリは外すと良いでしょう。

composer.lockファイルは実際にインストールされたライブラリを記録しています。
composer.jsonはライブラリのバージョンをワイルドカードで指定することもできるため、composer.lockの内容と必ずしも一致しません。
ほかのプロジェクトメンバーに共有する場合は、composer.jsonとcomposer.lockのどちらも共有する必要があります。

## オートローディング
インストールされたライブラリはオートローディング機能を用いて、自動的に読み込ませることができます。

```php
require 'vendor/autoload.php';
```
これでcomposer.jsonに記述されている全てのライブラリが読み込まれました。

## Monologを使用してみる
では、読み込まれたMonologを使用してみましょう。

```php:composer_project/Sample.php
<?php
require("vendor/autoload.php");

use \Monolog\Logger;
use \Monolog\Handler\StreamHandler;

// ロガー作成
$logger = new Logger('sample');
$logger->pushHandler(new StreamHandler('logs/sample.log', Logger::INFO));

try {
  // INFOログ出力
  $logger->info('情報ログ');

  // 例外発生
  throw new RuntimeException('ランタイム例外が発生しました。');

} catch (RuntimeException $e) {
  // ERRORログ出力
  $logger->error($e->getMessage());
}
```
sample.logファイルを見てみましょう。

```:logs/sample.log
[2018-10-26 08:30:51] sample.INFO: 情報ログ [] []
[2018-10-26 08:30:51] sample.ERROR: ランタイム例外が発生しました。 [] []
```

これでログ出力できるようになりました。

## 参考
https://getcomposer.org/doc/
DispatcherHelperクラス（MVVM Light Toolkit リファレンス）

# DispatcherHelper
## 概要

```csharp
public static class DispatcherHelper
```

- UIスレッドでメソッドを実行するためのヘルパー・クラス。

##### 名前空間
- `GalaSoft.MvvmLight.Threading`

#### アセンブリ
- GalaSoft.MvvmLight


## メソッド
### CheckBeginInvokeOnUI
<details><summary>CheckBeginInvokeOnUI</summary><div>

```csharp
public static void CheckBeginInvokeOnUI(System.Action action)
```

##### 概要
- `action`をUIスレッドで実行する。
- このメソッドをUIスレッドから呼んだ場合、`action`を同期的に実行する。
- このメソッドをUIスレッド以外から呼んだ場合、`action`をUIスレッドのディスパッチャーの待ち行列に入れ、非同期に実行する。
</div></details>


### Initialize
<details><summary>Initialize</summary><div>

```csharp
public static void Initialize()
```

##### 概要
- このメソッドをUIスレッドから呼び、`UIDispatcher`プロパティをUIスレッドのディスパッチャーで初期化する。
- WPFでは、`App`クラスの静的コンストラクターから呼ぶとよい。
</div></details>


### Reset
<details><summary>Reset</summary><div>

```csharp
public static void Reset()
```

##### 概要
- `UIDispatcher`プロパティを`null`にする。
</div></details>


### RunAsync
<details><summary>RunAsync</summary><div>

```csharp
public static System.Windows.Threading.DispatcherOperation RunAsync(System.Action action)
```

##### 概要
- `action`をUIスレッドのディスパッチャーの待ち行列に入れ、非同期に実行する。

##### 戻り値
- UIスレッドのディスパッチャーの待ち行列に入れた操作にアクセスするためのオブジェクト。
</div></details>


## プロパティ
### UIDispatcher
<details><summary>UIDispatcher</summary><div>

```csharp
public static System.Windows.Threading.Dispatcher UIDispatcher { get; private set; }

```

##### 概要
- UIスレッドのディスパッチャーを戻す。
</div></details>


## 参照
- [目次](https://qiita.com/h084/items/c5355fa734936c56ca50/)
専門卒21才のエンジニアが新卒1.5年でフリーランスになった話

どうもです。
前の記事からかなり時間たってしまったのですがその間に新卒入社した会社をやめてフリーランスになりました！
先ほど書類系を一旦終わったのでその辺の話とかします！
考えてる方とかまだ早いと思ってる方の参考になればと思います。

# お話したいこと
- 僕のステータス
- どうしてなったの？
- なるまでのフロー
- なるための書類
- なってみてどう？

# 僕のステータス
- ゲーム系専門2年卒
- スマホ向けゲーム会社に新卒入社
- 1.5年で退社
- a版、開発、運用、クローズの各フェーズのタイトルに参画
- 書ける言語:c#,scala,Js,c++
- やったことあるエンジンとかフレームワーク:Unity,cocos_2dx
- コミュ力>エンジニア力
- イベント開催とか好き

# どうしてなったの？
色々ありますが最後背中を押したのは💵ですね〜笑
元々賃金低めでしたが僕の場合は倍になりました！
あとは色々やってみたいので移りやすいのもあって選びました！

# なるまでのフロー
- こっそりエージェント会社とつながる
- 自分のスキルシートを提出
- 金額の提示
- 営業していただいてクライアントを探してもらう
- 選んで面接
- 通ったら決める
- 働く

# なるための書類
ここに書くのは最低限です！
あとまだ確定申告してないので後から実は・・・みたいのもあるかもです(あったら追記)
[税務署系参考](https://www.sumoviva.jp/trend-tips/20180613_1559.html)

- 税務署に提出
    - 青色申告承認申請書
    - 開業届
- 区役所に提出
    - 国保に切り替え
    - 国民保険に切り替え

割と申請サクッと終わりました！
区役所出張所だと申請できなかったのでお気をつけて。。

# なってみてどう？
正直僕は普通に会社に行って働くところにお邪魔しているので正社員とはそこまで変わらないですね
チームの方も面白い方が多いので楽しくやってます！
変わったのはレシートをひたすら貯めてることですかね〜
結構経費で落とせるものも多く結構レシートもらう習慣ついて来ました！
あとは確定申告頑張ろうって感じですね。。。。。
そんな感じで意外と楽しくやらせてもらってます！
僕で相談乗れることあればお気軽に[facebook](https://www.facebook.com/nkc.kagihiro)からメッセンジャーでご連絡ください！！
それではまた！
オブジェクト指向はプログラミングのパラダイムではない

『エリック・エヴァンスのドメイン駆動設計』（以後、DDD本）を読んで思ったことのメモ。

## オブジェクト指向はモデリングのパラダイムである

DDD本を読んで自分の中ですごく腑に落ちたのは、「オブジェクト指向はプログラミングのパラダイムではなく、モデリングのパラダイムである」ということ。

「オブジェクト指向のメリットは、現実をそのまま表現できること」と言われることがある。
これは、オブジェクト指向のモデリングパラダイムとしての側面を捉えた表現だ。

オブジェクト指向に限らず、リレーショナルモデルでも統計モデルでも、モデルというのは「現実世界の物事を、ある捉え方で表現したもの」みたいな定義だ。

現実世界の物事を「属性（フィールド）」と「振る舞い（メソッド）」の塊としてモデル化のがオブジェクト指向モデルだ。

## なぜモデル化するのか

「現実をそのまま表現する」と複雑すぎるので、オブジェクト指向モデルだったりリレーショナルモデルだったりで表現して整理するのだ。

モデル化せずにコンピュータの考え方でアプリケーションを作ろうとすると、ここはこういう分岐でこういうときはこうなって...とめちゃくちゃ複雑になる。

だから、現実世界をモデル化できない構造化プログラミングではなく、現実世界をモデル化できるオブジェクト指向プログラミングが良いとされるのだ。

## 様々なモデリング手法の中で、なぜオブジェクト指向なのか

複雑すぎる現実を単純化するために何らかのモデリングが必要なのだが、その中でオブジェクト指向が選ばれるの理由は以下の2つだ。

* オブジェクト指向モデルは、エンジニアでなくても理解できる
* オブジェクト指向モデルには、プログラミング言語で実装が与えられた

### オブジェクト指向モデルは、エンジニアでなくても理解できる

オブジェクト指向以外にも、リレーショナル、関数型、論理型など、様々なモデリング手法がある。

そんな中、オブジェクト指向だけは理解のハードルがめちゃくちゃ低い。

クラス図を見ながら「こういう役割のやつがいて、こんなふうに指示を出すんですよ」とか、ITの知識がなくても会話が成り立ちうる。

エンジニアと周りの人を繋ぐ共通言語となり、認識齟齬を減らしうるから、オブジェクト指向が良いとされるのだ。

### オブジェクト指向モデルには、プログラミング言語で実装が与えられた

いくらモデルが分かりやすくても、そのまま実装に落とせなければ、実装時にエンジニアの思い込みが入ってしまう。

オブジェクト指向の素晴らしいところは、モデルとして図に描いたりして議論した内容を、そのまま実装に落とせるところだ。

モデルをそのまま実装に落とすことで、こんなときはきっとこう動くんだろうなーとかも推測しやすくなる。

### つまり...

オブジェクト指向モデルが選ばれる理由は以下の2つだ

* だれでも理解できるモデルだから、エンジニアと周りの人の認識齟齬が生じにくい
* そのまま実装に落とせるため、要件と実装の乖離が減る

## オブジェクト指向とは何か

オブジェクト指向モデルとは、現実世界の物事を「属性（フィールド）」と「振る舞い（メソッド）」の塊である「オブジェクト」のやり取りで表現するモデルである。

難しいのは、物理的に実体のある物だけでなく、ポリシーのような概念もオブジェクトとして捉えるからだ。

## マイクロサービスもオブジェクト指向だ

オブジェクト指向はプログラミングではなくモデリングのパラダイムだと理解すると、あることに気付く。

「あれ？マイクロサービスもオブジェクト指向モデルなのでは？」

各サービスに「属性（DB）」を持たせて隠蔽し、「振る舞い（API）」によってやり取りするのは、まさにオブジェクト指向だ。

確かに「マイクロサービス オブジェクト指向」とググると、そういう話がたくさん出てくる。

やはり、オブジェクト指向はプログラミングパラダイムではなく、モデリングのパラダイムなのだ。

## マイクロサービスのヒントをオブジェクト指向から得る

マイクロサービス・アーキテクチャには、オブジェクト指向と似たデザインパターンがある。

例えば、Proxyパターンとサイドカー・パターン、FacadeパターンとBackend For Frontendは似ている。

他にも探せばたくさんありそうな気がしてくる。

マイクロサービスを構築するときは、オブジェクト指向の文脈を思い出してみるとヒントになるかもしれない。
【Swift 4.2】【Swift 5】HashableとCodableと継承を同時に使うとhashValueの参照でクラッシュする

##【概要】
Swift 4.2/5.0においてHashableとCodableと継承を同時に使うとhashValueの参照でクラッシュします。

## 【環境】
let lang = "Swift 4.2" + "Swift 5.0"
let env = "XCode10" + "XCode10.2"

## 【詳細内容】

まずSwift 4.2において導入された`func hash(into hasher: inout Hasher)`を使ってHashableを実装します。

`ただし、下記のクラスはテストファイル中ではなく、アプリ内のファイル（アプリバンドルない）に記述します。（2019/3/30更新）`

```swift

open class HashableTestModel: Hashable
{
    public var uniqueIdentifier: String
    
    public init()
    {
        self.uniqueIdentifier = String(arc4random())
    }
    
    // Equatable
    static public func ==(lhs: HashableTestModel, rhs: HashableTestModel) -> Bool
    {
        return true
    }
    
    public func hash(into hasher: inout Hasher)
    {
        hasher.combine(uniqueIdentifier)
    }
}

```

![スクリーンショット 2018-10-26 18.04.45.png](https://qiita-image-store.s3.amazonaws.com/0/37634/52f8e948-10dc-d6ef-213c-ba6e4815a4e5.png)


↑ここまでは問題ありません。次にHashableTestModelをCodableにします

```swift
open class HashableTestModel: Hashable, Codable
{
```

またHashableTestModelを継承したHashableTestModelChildを作成します。
HashableTestModelChildはブランクのままで構いません。

```swift

open class HashableTestModelChild: HashableTestModel
{

}

```

これでテストします。

```swift
    func testCoreModelHashable() {
        
        let val = HashableTestModel()
        print(val.hashValue)
    }
```

![スクリーンショット 2018-10-26 18.01.58.png](https://qiita-image-store.s3.amazonaws.com/0/37634/5ff7873e-8fb4-5d2e-ed0a-bd85d565b0a3.png)

クラッシュします。
Codableをやめるか、継承をやめると動作します。
また問題となっているクラスをテストファイル内に記述すると動作します。
不思議ですね。

通常は、どちらのコードもアプリのメインバンドルに記述されるはずなので、問題は起こりません。テストでは死にますが。

問題なのは、Embedded Frameworkを使っていて呼び出し元と当該クラスのバンドルが異なる場合でしょう。（実際自分のテストでは、メインバンドルから、Embedded Frameworkの上のクラスを呼び出すと同じくクラッシュしました。

## 【さらにわかったこと】
ベースクラスを、別バンドル（Embedded Framework内など）に置き、
継承クラスをメインバンドルに置いた状態で、インスタンスを作成し `print(val.hashValue)` を実行するとクラッシュしません。

`open class HashableTestModelChild: HashableTestModel`
を作成すると、ベースクラスの

```swift
    public func hash(into hasher: inout Hasher)
    {
        hasher.combine(uniqueIdentifier)
    }
```

が呼ばれなくなります。

## 【サンプルコード】

https://github.com/BlueEventHorizon/TestHashable

サンプルコードはこちらに置きました。

~~6月にWWDCに行くので、Appleのエンジニアに直接聞いてこようかと思います。~~

## 【解決しました】

```swift

open class HashableTestModel_Other: Codable
{
    public var uniqueIdentifier: String
    
    public init()
    {
        self.uniqueIdentifier = String(arc4random())
    }
    
    // Equatable
    static public func ==(lhs: HashableTestModel_Other, rhs: HashableTestModel_Other) -> Bool
    {
        return true
    }
}

extension HashableTestModel_Other: Hashable
{
    public func hash(into hasher: inout Hasher)
    {
        hasher.combine(uniqueIdentifier)
    }
}

open class HashableTestModelChild_Other: HashableTestModel_Other
{

}

```

このように、Hashableをextensionで記述するとクラッシュしないことが分かりました。
基礎から学ぶ Vue.js CHAPTER2 データの登録と登録 まとめ

# 基本のデータバインディグ

## リアクティブデータって何？
- イベントが起きた時に反応のできるデータのこと
- DOMの更新や最適化、加工データの同期とかをやってくれる

## データバインディング
- 設定によりDOMの更新を自動にやってくれる

## リアクティブデータの定義
- dataオプションに設定したものがインスタンス生成時にリアクティブなデータにしてくれる
- dataオプションの直下プロパティは後から追加できないので初期値を設定して持たせておくこと

# テキストと属性のデータバインディング

## テキスト
- 文字列のリアクティブデータを{{}}で囲むとバインディングされる（マスタッシュ記法）
- 変数を変えると自動でDOMが更新する

## オブジェクトや配列
- ルートプロパティじゃなくても大丈夫
- 式はOK、　文はNG

## 属性
- v-bind:を使う、v-bindは省略可能

### v-bindの修飾子

|修飾子|作用|
|---|---|---|
|.prop|属性の代わりにDOMプロパティとしてバインドする|
|.camel|ケバブケースの属性名をキャメルケースに変換する|
|.sync|双方向バインディングを行う|

## メソッドのデータアクセス
- thisをつける必要がある
- 無名関数のコールバックなどでthisを使う時は、thisが何を参照しているか把握が必要

## クラスとスタイル
- オブジェクトや配列をクラス、CSSとして展開される
- ハイフンをキャメルケースで表すことができる、クラスのハイフンは''で囲む
- プレーンな属性を書いた時は上書きマージされる
- 式を用いて記述することも可能、ただ算出プロパティを用意した方が綺麗
- データオプションにオブジェクトを書いてバインディングも可能

## 複数属性のバインディング
- v-bindディレクティブで一括設定が可能
- v-bindの設定後、v-bind:hogeで個別も可能

## SVGのバインディング
- 可能かつ相性が良い
- SVG自体をコンポーネント化できる

# テンプレートにおける条件分離
- テンプレートで条件分離ができる
- v-if, v-show

## v-if, v-showの違いと用途
- v-if: DOMレベル削除される（DOMが存在しない）
- v-show: display: none になる（DOMは存在する）

## v-ifのグループ化
- <template>タグで囲むと複数の要素をグループ化できる

## v-else-if, v-else
- v-ifでは、v-else-if, v-elseが使える
- ユニークなkey属性をつけておくと良い

# リストデータの表示と更新
- リストは理由がなければ、オブジェクトの配列にしておく方が良い

## 繰り返しの描画
- v-forディレクティブを使う
- v-for="(value, index) in list" で値とインデックス
- v-for="(value, key, index) in list" で値とキーとインデックス

## キーの役割
- キーを設定しておくと効率的な描画処理になるので設定すること
- キーの有無で描画処理の範囲が変わる

## 繰り返し中の条件適用
- 繰り返し中に、v-ifやv-showなどを使って描画ができる

## リストの更新の注意
- 更新できないケースがある
- ①インデックス数値を使った配列要素の更新
- ②後から追加されたプロパティの更新
- 対策は後ほど

## リストの要素の追加、削除、置き換え、プロパティの追加、プロパティの更新
- 追加: push, unshiftを使う
- 削除: spliceを使う
- 置き換え: Vue.set(this.$set)を使う
- プロパティの追加: Vue.set(this.$set)を使う
- プロパティの更新: プロパティはリアクティブデータなので、代入すればOK

## リストの置き換え
- リスト自体はリアクティブデータなので、代入すればOK

## v-for
- オプションデータを持たなくても、テンプレートに範囲や配列リテラルを書けば描画できる
- テキストを設定すると１文字づつになる

## 外部データからの取得
- JSONなどのデータはデータオプションに空のプロパティを用意してcreatedなどで追加する