OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptの三項演算子が読みにくいらしいので、if式ならぬ if関数を作りました。そしてもっと読みにくい感。

# 三項演算子がよみにくい！

という噂を聞きました。

なので、VB6とかVBAのIIF関数ならぬ、if関数を考えてみました。

誰でも考えるっぽい関数ですかね。

名前、ifExpression とか ifFunc とか、iff とか、名前考えたのですが、しっくりこなかったので、if_ にしました。

こんな感じです。

# if関数の実装です

```js

const isFunction = (value) => {
  return (typeof value === 'function');
};

const functionValue = (value) => {
  if (isFunction(value)) {
    return value();
  } else {
    return value;
  }
};

const if_ = (condition) => {
  if (condition) {
    return (args) => {
      return functionValue(args.then);
    };
  } else {
    return (args) => {
      return functionValue(args.else);
    }
  }
};

//----------
// 使い方

const thenValue = 'THEN';
const elseValue = 'ELSE';

// [1]
var value1 = true;
console.log( if_(value1)({ then: thenValue, else: elseValue }) );   // THEN と表示される

// [2]
var value1 = false;
console.log( if_(value1)({ then: thenValue, else: elseValue }) );   // ELSE と表示される

// [3]
var value1 = true;
console.log( if_(value1)({ then: _=>thenValue, else: _=>elseValue }) );   // THEN と表示される

// [4]
var value1 = false;
console.log( if_(value1)({ then: _=>thenValue, else: _=>elseValue }) );   // ELSE と表示される

```

[1][2]の使い方は、引数として渡した then/elseプロパティの値が取得できます。
[3][4]の使い方は、then/elseプロパティにわたす値はアロー関数なので、その戻り値が取得されています。

関数渡しの場合は、if_(true/false)の値によって、呼び出されるかどうかが制御されるので、三項演算子的に使えるでしょう。


他段階の場合、三項演算子より、明らかに読みやすい！

```js

const value2 = if_(true)({
  then: 'trueの値',
  else: 'falseの値'
});

const value3 = if_(true)({
  then: 
    if_(true)({
      then: 'true-trueの時の値',
      else: 'true-falseの時の値'
    }),
  else: 'falseの値'
});
```
読みやすい！...か？？



こんなの作るくらいなら、三項演算子になれる方が読みやすくないか？

という遊びネタでした。

# 追記
2019/03/21(木)

if_関数 を組み込んだライブラリを npm で配信しています。TypeScriptコードです。

standard-software/copipejs: simple code parts
https://github.com/standard-software/copipejs

https://github.com/standard-software/copipejs/blob/master/build/tsc/node/copipe_core.js
このあたりのソースをみると実装がわかり、
https://github.com/standard-software/copipejs/blob/master/source/test/node/test_copipe_core.js
こちらのテストコードをみると使い方がわかります。

# 追記の追記

こちらのコメントで書きました。
https://qiita.com/Yametaro/items/17f5a0434afa9b88c3b1#comment-d69a71e5cd6e2f9f4a5b

```js

if(true/false){ then: value, else: value }
if(true/false){ then: function, else: function }
if(true/false)(value, value)
if(true/false)(function, function)
if(true/false).then(value).else(value)
if(true/false).then(function).else(function)
if(true/false).else(value).then(value)
if(true/false).else(function).then(function)
```

上記書式に対応した、if_ 関数作ってみました。
https://github.com/standard-software/partsjs/blob/v5.5.0/source_code/syntax/syntax.js#L135

テストコードです。
https://github.com/standard-software/partsjs/blob/v5.5.0/source_code/syntax/syntax.test.js#L312
iOSで開発向け機能の実装する時に使うテクニック

## はじめに
- iosで開発の効率を上げるためにデバッグ機能やダミーのデータを使うことがあると思います。
そのようなコードは本番環境では必要なく、無駄なリソースとなってしまいます。
今回は本番環境に含めないための方法についてまとめます。

## 環境
```
Xcode 10.1
Build version 10B61
Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
Target: x86_64-apple-darwin18.2.0
```

## 本番と開発で実行されるコードを分けるとき
- xcodeの`build settings`→ `Swift Compiler – Custom Flags` → `Active Compilation Conditions`でビルドコンフィギュレーション毎にフラグを設定できる　

<img width="768" alt="スクリーンショット 2018-12-09 19.32.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/245f344a-1d17-4f0b-4818-e670bf3533c9.png">

- 本番と開発環境で分岐を作ることができる

```swift
#if DEBUG
 print("開発")
#else
 print("その他")
#endif
```

## 本番で開発のファイルを含めたくないとき
- xcodeの`build settings`→ `Excluded Source File Names`で除外したいファイルをビルドコンフィギュレーション毎に指定できる
<img width="912" alt="スクリーンショット 2018-12-09 20.00.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/722b09b4-2e97-279d-a6f4-4dd8a98e7d03.png">
- 上記では`Debug+`のついたファイルを除外する設定にしている。
- swiftのファイルはもちろんのこと、`asset catalog`や`plist`の除外も可能なので余分なリソースを本番環境から除外できる

## 参考リンク
- [[Xcode] Xcode 8.0から「Active Compilation Conditions」が追加されて#if, #elseif, #else, #endifによる分岐設定がちょっと楽になってます](https://dev.classmethod.jp/smartphone/iphone/xcode-8-active-compilation-conditions/)
- [ビルド設定に応じて特定のファイルを除外する](https://qiita.com/ktysne/items/3af10d9b37f53e97644d)
スプレッド演算子と分割代入

この記事は[JavaScript Advent Calendar 2018](https://qiita.com/advent-calendar/2018/javascript) 14日目の記事です。

何かと役立ちそうなスプレッド演算子と分割代入についてです。
ブラウザで使用する際はBabelにかけた方が良いと思います。

## スプレッド演算子

スプレッド演算子は配列やオブジェクトなどをその場に展開します。

```javascript
let array = [1, 2, 3];
func(...array); // => func(1, 2, 3);
```
```javascript
let array1 = [1, 2, 3];
let array2 = [...array1, 4, 5]; // => [1, 2, 3, 4, 5]
```

関数の引数にスプレッド演算子を使えば、配列のメソッドが使用できます。

```javascript
function increment (...nums) {
  return nums.map(v => v + 1);
}

increment(1, 2, 3); // => [2, 3, 4]
```

関数の引数の情報をもったargumentsオブジェクトがありますが、こちらはArray-likeオブジェクトのため配列のメソッドは使用できません。

## 分割代入

配列やオブジェクトの値を別個の変数に値を代入できます。

```javascript
let [a, b, c] = [1, 2, 3];
console.log(a); // => 1
console.log(b); // => 2
console.log(c); // => 3

let {x: foo, y: bar} = {x: 1, y: 2};
console.log(foo); // => 1
console.log(bar); // => 2
```

以下のようにすれば、変数の値を簡単に入れ替えられます。

```javascript
[a, b] = [b, a];
[a, b, c] = [c, b, a];
```

## 組み合わせて使う

スプレッド演算子と分割代入を組み合わせて使うと便利です。
以下のようにすれば、配列の残りの部分を変数に格納できます。

```javascript
let [a, b, ...c] = [1, 2, 3, 4, 5];
console.log(a); // => 1
console.log(b); // => 2
console.log(c); // => [3, 4, 5]
```

なお、配列の最初の方を取り出すことはできないようです。

```javascript
let [...a, b, c] = [1, 2, 3, 4, 5]; // => エラー
```

文字列を`.split('')`のように分割できます。

```javascript
let [...str] = 'hello';
console.log(str); // => ['h', 'e', 'l', 'l', 'o']
```
```javascript
function upperEven (str) {
	return [...str].map((v, i) => (i + 1) % 2 === 0 ? v.toUpperCase() : v).join('');
}
upperEven('hello'); // => 'hElLo'
```

## 参考

[スプレッド構文 \| MDN](https://developer.mozilla.org/)

[【JavaScript】スプレッド演算子の便利な使い方まとめ \- Qiita](https://qiita.com/Nossa/items/e6f503cbb95c8e6967f8)

[JSのスプレッド演算子を理解する \- Qiita](https://qiita.com/akisx/items/682a4283c13fe336c547)

[分割代入 \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)

---

明日は@OldBigBuddhaさんです。
シクシク素数列 (Kotlin)


|シクシク素数列|https://qiita.com/advent-calendar/2018/4949prime-series|
|:--|:--|
|Crystal|https://qiita.com/cielavenir/items/4c95fdf14b7a247e51e0|
|Kuin|https://qiita.com/cielavenir/items/60993a2b2885690a3a4a|
|Swift|https://qiita.com/cielavenir/items/db4c93532a53bfa33ac2|
|Kotlin|https://qiita.com/cielavenir/items/f3ccdd5ebf245aba417c|
|Pascal|https://qiita.com/cielavenir/items/4c962db6825d9a5eb511|

```kotlin:4949.kt
fun isqrt(n:Int):Int{
	if(n<=0)return 0
	if(n<4)return 1
	var x=0
	var y=n
	while(x!=y&&x+1!=y){x=y;y=(n/y+y)/2}
	return x
}

fun isPrime(i:Int):Boolean{
	if(i<2){
		return false
	}
	for(j in 2..isqrt(i)){
		if(i%j<1){
			return false
		}
	}
	return true
}

fun is4949(i:Int):Boolean{
	if(i<=0)return false
	if(i%10==4||i%10==9)return true
	return is4949(i/10)
}

fun main(args: Array<String>){
	val n=readLine()!!.toInt()
	var i=2
	var cnt=0
	while(cnt<n){
		if(is4949(i)&&isPrime(i)){
			print(i)
			if(cnt<n-1){
				print(",")
			}else{
				println()
			}
			cnt+=1
		}
		i+=1
	}
}
```
シェルでcontainみたいなことする時にダサい書き方をしてしまった（そしてカッコよくした）

## なにがあったの
AにBが含まれるか？を判定したい場面はたくさんある。
他のプログラミング言語でいうとcontain的な処理。
それをシェル初心者な私はださーい書き方をしてしまったので、備忘録。

今回は、`git@github.com:natsumisawa/github-convs.git` に `git@` が含まれているかどうかを判定したかった。

## 私がやってしまったダサい書き方
検索したい文字列である `git@` でgrepして、行数出力して1だったら、それは含まれるということだ〜！と思った。
ダサい書き方、というか私が自己流雰囲気でシェルやってるだけでふつうはこう書かないのか。

```
$ if [ `echo 'git@natsumisawa:github-convs' | grep git@ | grep -c ''` -eq 1 ] ; then ; echo "ssh認証です" ; fi
ssh認証です
```

ちなみにgrep -c ''じゃなくてwc -lで書いたらうまく動作しなかった。

（しかも含まれない場合なんかエラー出てるし・・・）

```
$ if [ `echo 'https://natsumisawa:github-convs' | grep git@ | grep -c ''` -eq 1 ] ; then ; echo "ssh認証です" ; else ; echo "https認証です" ;fi
[: unknown condition: -eq
https認証です
```

## カッコイイ書き方
ふつうはこうやって書くらしい。

```
$ if echo 'git@natsumisawa:github-convs' | grep 'git@' ; then ; echo "ssh認証です" ; else ; echo "https認証です" ; fi
ssh認証です
```

## 一番大切なこと：原理を知る
if文の条件式の中が空文字だとfalseとして判定されるらしい。
そもそも条件式の中をbooleanにしないといけない、とは誰も言ってないもんな。
スクリプト言語ではよくあることらしく、奥が深いなと思った。
まだまだシェル芸習得までの道のりは長い・・・。
NodeJSでTypeScriptのホットリロード

# はじめに
**TypeScript**は「型チェック」や「静的型付け」などに対応している言語です。実行する際はtscコマンドで一旦javascriptにコンパイルする作業が必要となります。
NodeJS/Typescriptを書くときに一々tscでコンパイルする操作が面倒だったので、ホットリロード的な機能がないか探してみました。

# ts-nodeとnodemonを使う
ホットリロードを実現するには、ts-nodeとnodemonを組み合わせます。

[ts-node](https://github.com/TypeStrong/ts-node)
NodeJS上で直接tsファイルを実行できるライブラリ。

[nodemon](https://github.com/remy/nodemon)
ファイルを監視し、変更があればnodeプロセスを再起動するライブラリです。

今回は

1. ts-nodeでnode上からtsファイルを実行
2. nodemonでtsファイルを監視する

という手順を組み合わせます。

# インストール
```
npm install -g typescript
```

```
npm install -g ts-node
```
```
npm install -g nodemon
```

# nodemonにts用の設定を追加する
プロジェクトルートに以下のように記述します。

```nodemon.json
{
    // 監視するフォルダ
    "watch": ["src"],   
     // .tsを監視する
     "ext": "ts",   
     // nodemonを起動したらts-nodeを実行する
    "exec": "ts-node ./src/index.ts"  
}
```

# nodemonの実行

```
$ nodemon
```




# 参考リンク
- [【ホットリロード】nodejs + TypeScriptでサーバーサイドを開発している時に、コードを編集したら自動リロードさせる。](https://aknow2.hatenablog.com/entry/2018/04/09/150006)
- [ts-nodeでCLI上でのtypescriptの検証がめっちゃ楽になった話](https://www.te-nu.com/entry/2017/11/11/184846)

reddit読むとtscに**watchオプション**があるみたいです。

- [Typescript with Node: Should I use ts-node or tsc & node?](https://www.reddit.com/r/typescript/comments/8vkvzy/typescript_with_node_should_i_use_tsnode_or_tsc/)
- [Configuring Watch
](https://www.typescriptlang.org/docs/handbook/configuring-watch.html)
Goでwebサーバーを立てる３ステップ

## Goでローカルサーバーを立てる
Goでは標準でnet/httpパッケージが用意されており、少ないコードでwebサーバーを立てることができます。画像のように、ローカルで簡単なCSSをつけた静的コンテンツを表示させてみたいと思います。

<img width="886" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3236303832342f62666564383163322d336632362d356362372d306230642d6139613835633565363562392e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/260824/887e8726-b81e-4d6e-dd7f-77bf8b7cd6ad.png">


## 1.ディレクトリを作る
以下の構成でディレクトリを作っていきます。

```
$HOME/go_tutorial
- main.go
- static/
- - index.html
- - styles/
- - - style.css
```

ホームディレクトリ以下にに「go_tutorial」ディレクトリを作り、メインのコードを書くmain.goとコンテンツを入れるstaticディレクトリを配置します。

```
$ mkdir go_tutorial
$ cd go_tutorial
```
```
$ touch main.go
$ mkdir -p static/stylesheets
$ touch static/index.html static/stylesheets/styles.css
```

## 2.main.goとhtml・cssを用意する
```main.go
package main

import (
	"log"
	"net/http"
)

func main() {
    //ディレクトリを指定する
	fs := http.FileServer(http.Dir("static"))
    //ルーティング設定。"/"というアクセスがきたらstaticディレクトリのコンテンツを表示させる
	http.Handle("/", fs)

	log.Println("Listening...")
    // 3000ポートでサーバーを立ち上げる
	http.ListenAndServe(":3000", nil)
}

```
```~/static/index.html
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>A static page</title>
  <link rel="stylesheet" href="/stylesheets/styles.css">
</head>
<body>
  <h1>Hellooooooooooooo</h1>
</body>
</html>
```
```~/static/stylesheets/styles.css
body {color: #c0392b}
```

##3.サーバーを立ち上げる
コードがかけたらmain.goを動かします。

```
$ go run main.go
```

その上で　http://localhost:3000/
にアクセスすればコンテンツが表示されます。

## ServeMuxとは何か
Goのhttpパッケージの文脈で、Servemuxという用語がよく出てきます。
・ServeMuxとは、HTTPリクエストに対するルーターです。URLのパターンにマッチするハンドラーを呼び出します。
・Muxというのはmultiplexor（直訳すると、「多重装置」）の略で、色々なパターンのURLリクエストに対して対応するハンドラーに振り分けます。
・ハンドラーはHTTPレスポンスヘッダーとボディを返します。
・DefalutServeMuxという用語もよく登場しますが、これはHTTPパッケージを使うときに最初に定義されているServemuxのことです。


##参考
Creating simple webserver with golang
https://tutorialedge.net/golang/creating-simple-web-server-with-golang/
Serving static sites with Go
https://www.alexedwards.net/blog/serving-static-sites-with-go
Understanding Go Standard Http Libraries : ServeMux, Handler, Handle and HandleFunc
https://rickyanto.com/understanding-go-standard-http-libraries-servemux-handler-handle-and-handlefunc/
A Recap of Request Handling in Go
https://www.alexedwards.net/blog/a-recap-of-request-handling
RFIDアプリ開発の前に知りたかった5つの事

今年は、1からRFIDアプリの開発をする機会がありました。
RFIDタグは便利な半面、使用上気をつけなければいけない点が多数あります。
なので、最初からこれを知ってたらスムーズに開発できたなあと思う特性を忘れないよう書き記しておきます。
これからRFIDを活用したアプリを作成する人の助けになれたら嬉しいです。

#　RFIDタグとは
遠隔で電波を使って読み取れるタグ。
RFIDの読み取り機を使って遠隔でタグの内容を読み込むことが出来ます。
一度に広範囲（数ｍ程度）のタグを一気に読めるのが、QRコードなどと大きく違うメリットとなっています。
このメリットを生かして、倉庫の在庫管理や、GUなどで商品の自動精算に役立てられています。

## 1. 電波強度から距離を推定するのは困難
障害物による電波の反射などの影響で、距離と電波強度の関係は一定にはなりません。
直接遮るものがなくても、近くに壁があるだけで距離が遠くても電波が強くなる箇所が出てきまします。
角度によっても向きによっても強度が変わるので、距離を図るのにはかなり向いてないと言えます。

## 2. タグに向きがある
タグはアンテナなので、向きがあります。
強く読める読み取り方向と、弱くなってしまう読み取り方向があります。
使用時はどの方向から読まれるかわからないので、1の特性とあいまって読み取り距離の調整は非常に難しくなります。


## 3. 金属や人体と接着すると読むのが難しくなる
RFIDタグは、金属や水に弱いとよく言われています。
しかし実際には、金属の中にあっても問題なく読み取れたりします。
ただしRFIDタグが金属に触れているととたんに読めなくなります。
また、人体は水で出来ているのでタグが人体に触れていても読み取れなくなります。
これらに対応した専用のRFIDタグがあるようなので、必要があればそれらのタグを使うのが良いでしょう。

## 4. タグ同士が密着すると読み取りが難しくなる
3の状況よりも起きやすくやっかいな特性です。
2枚のタグが重なっていると、片方しか読めなかったり両方読めなかったりといった現象が起きます。
このせいでタグの貼り方を工夫する必要があります。

## 5. 大量のタグを一気に読むのは得意だが、特定のタグだけ読むのは難しい
今まで上げてきたものが原因で、読み取り範囲を指定することは困難です。
そのため、例えば大量にRFIDがある倉庫の中で眼の前のタグだけを読みたい、という用途には向いていないと言えます。
逆に大量のタグから、IDが分かっているタグを見つけ出すのは得意としている分野です。


### 終わりに
RFIDタグは便利な半面癖もあるので、上手な使い方をして欠点をカバーして利点を最大限活用できると良いですね。
スマブラ発売日のせいで記事公開がギリギリになってしまった...
Laravel+nginx+php-fpmをdockerで環境構築

#はじめに

みなさんこんばんわ。月火水木金土日が出勤日の男nishiharaです。
今回の記事を書く経緯としては、以前から仲良くさせていただいているよっちゃん(@yoshixj)からの依頼だったので、微力ながら参加させていただこうと思い、ここに寄稿させていただきました。
さて、タイトルにもあるように今回は近年日本でも大分本などが出版されて注目度が上がってきたLaravel、そしてみんな大好きDockerという構成で今すぐ簡単なアプリケーションを開発できるようなベースファイルを作成しましたので、それを紹介したいと思います。

今回のプロジェクトにおけるディレクトリ構成は以下のようになっています(参考までに）

>Project/
>┣ laravel/
>┣ mysql/
>┣ etc/
>└docker-compose.yml
>└.env
>└.Dockerfile

mysqlフォルダはdocker-compose upで作成したDBを永続化するために作成しています。(mysql/volumesを/var/lib/myqlにマッピング)
etc/ フォルダの中ではnginxの設定とBasic認証用のファイルを格納しています。


##docker
今回のプロジェクトにおけるdocker-compose内で定義するミドルウェアの構成としては、nginx、php-fpm,mysqlを選定しました。

では早速docker-compose.ymlファイルを紹介

```yml:docker-compose.yml
version: "2"

services:
  nginx:
    image: nginx:alpine
    volumes:
      - ./etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./etc/nginx/.htpasswd:/etc/nginx/.htpasswd
      - ./laravel/public:/var/www/laravel/public
    ports:
      - 80:80
    links:
      - phpfpm
    depends_on:
      - phpfpm
  phpfpm:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./laravel:/var/www/laravel
    links:
      - mysql
    depends_on:
      - mysql
    env_file: .env
  mysql:
    image: mysql:5.7
    env_file: .env
    volumes:
      - ./mysql/volumes:/var/lib/mysql
    ports:
      - 4306:3306
```

php fpm 用のDocker ファイルは以下のようになっています

```Dockerfile:Dockerfile

FROM php:7.2-fpm-alpine

RUN docker-php-ext-install pdo_mysql
```

.envファイルは以下のようになっています(xxxxxの部分は適宜自分で変更してください）

```env:.env

DB_HOST=mysql
DB_DATABASE=xxxxxxxx
DB_USERNAME=xxxxxxxx
DB_PASSWORD=xxxxxxxx

MYSQL_ROOT_PASSWORD=xxxxxxxx
MYSQL_DATABASE=xxxxxxx
```

これで環境の下準備は終了です

##Laravelを用意

次にLaravelプロジェクトを作成します
いくつかプロジェクトの作成方法はありますが、私はこれでやることが多いです。

```ruby:プロジェクト作成コマンド
composer create-project --prefer-dist laravel/laravel プロジェクト名 "5.5.*"
```
しばらく待っているとプロジェクトが作成されます。（ほんと一瞬だからすごい）
Laravelフォルダーに移動して

```ruby:env作成
cp .env.example .env
```
みたいな感じで.envファイルを作成しましょう。中身は適宜必要な形で書いてください。

```ruby:
composer install 
```
のコマンドを打つと必要なライブラリがインストールされます。ここまできたらプロジェクトフォルダに戻りdocker-compose upと打つとlaravelと書かれた。プロジェクトが立ち上がると思います。

以上！ほんと簡単！

##おわりに
ご意見コメント等ございましたらぜひぜひご記載ください。
よろしければ ツイッターもやっているので
https://twitter.com/nobu_ne
をフォローお願いします。（技術的な話をつぶやくことは少ない笑）
"メソッドを呼ぶ"と表現するのをやめたら、オブジェクト指向の理解が進んだ気がした

書籍などでクラスAからクラスBのメソッドを使用することを、
稀に「メッセージを送る」と表現していて何を言っているんだろうと思っていました。

例えば、Rubyのレーシーバーのメソッドを呼び出すメソッドも、
`call`ではなく`send`が使われています。

ただ、以下のサイトではsendメソッドの説明は`レシーバの持っているメソッドを呼び出します`
となっていて、送るのか呼び出すのか厳密な違いはないような気もします。
https://ref.xaio.jp/ruby/classes/object/send

>obj.send(name, [arg, ...])
>sendメソッドは、レシーバの持っているメソッドを呼び出します。第1引数nameにはメソッド名をシンボルか文字列で指定します。メソッドの引数を指定したいときは、第2引数arg以降に引数を並べます。戻り値は、呼び出したメソッドの戻り値が返ります。

入門書ではメソッドは呼び出すものと紹介されていることが多いので、
自分もメソッドは呼ぶものとずっと思っていたし、多くの入門者がメソッドを呼ぶと表現しているのではと思います。

ここ最近、メソッドを"呼ぶ"というのを止めて、"送る"と念じていたら、
理解が良い方向に変わった気がするので、違いをまとめてみました。

# メソッドを呼び出す時のイメージ
![Group.png](https://qiita-image-store.s3.amazonaws.com/0/162167/6ef44f71-cbf7-5b70-1e2e-bf50f4a684f2.png)

### クラスAはクラスBのメソッドを呼び出すことで、メソッドの処理を取り込み、把握して利用する
メソッドを呼び出すという言葉には、メソッドを持ってきて実行するというニュアンスを感じていて、
その理解から以下のように思考していました。

- クラスAはクラスBのメソッドのことを何でも知っている
- 処理は全て分かっているので、メソッドの名前は重要ではない
- メソッドに処理が複雑でも、取り込み理解しているので、使いこなせるはず
- クラスAは色々なメソッドの処理が混じり合う、複雑で重いものだ

# メッセージを送る時のイメージ

![Group 2.png](https://qiita-image-store.s3.amazonaws.com/0/162167/10012280-4c2c-546e-7377-24fe395c0353.png)

### クラスAはクラスBにメッセージを送り、処理を代行させたり、メッセージの返り値を利用する
一方でメッセージを送るという言葉には、メッセージを送る相手は分かっているけど、
その相手が何をしているかは分からず、処理の結果だけ返ってくるという思考になりました。
その結果、

- クラスAはクラスBについてメッセージの名前のみ知っている
- 具体的な処理はわからないので、メッセージの名前は重要だ
- メッセージを送り実行される処理が複雑だと、名前をつけられないので、単一責任にするべきだ
- クラスAは必要に応じてメッセージを送り、処理を肩代わりしてもらう。クラスAが責任を持つのは、クラスAの処理だけだ


メソッドを呼び出すイメージより、メッセージを送るイメージの方が、カプセル化的な文脈を理解しやすくなるし、
クラスAを調べている際に、過度にその他のクラスのメソッドの処理について気にしなくなったので、
メッセージを呼ぶというのを止めて、送ると言った方がスッキリした話でした。
オルタナティブweb3であるweb3xの紹介

## スマートコントラクトアプリ作り始めたけどweb3.js周りが辛かった

10月からethereumのスマートコントラクトを用いたアプリケーション開発を始めましたが、だいぶリポジトリの構成に苦戦しました。

初めはAngular（&typescript）でやろうとしていたのですが、webpackの構成でnodejs shimをoffにしているがweb3がnodejsアプリとのコンパーチブルで開発されているのでパッチを当てる必要[^1]があったり、web3.js自体がbetaで破壊的変更を繰り返しているため`@type/web3`のtype定義が合っていないなどに加え、web3.jsのメジャー1がまだbetaでとてもbuggyなため、初心者にはどこに問題があるかの切り分けが大変でした。[^2]

ちょうどその頃、twitterでethereumの月間活動報告みたいなreportが流れてきて、typescriptネイティブで書き直されたというweb3xというPJを知りました。

typescriptベースでアプリケーションを作ろうとしたら非常に興味深いPJなので記事にまとめてみます。

# web3.jsの辛いところ

githubスター7000超えでmetamaskやtruffleやgethなどあちこちの重要PJに使われていますが、けっこうしんどい状況だなと思います。

- コードアセットが古い
  - nodejsアプリを前提にして作られているためかブラウザアプリ開発としては一世代古いコード資産になっている
  - 開発環境が古く、babelやtypescriptといったトランスパイラもなし
  - node6（まだ一部のES2015しか導入されていない）レベルが中心になってる
  - 非同期ハンドリングがコールバックのみでPromiseがない。
- 開発の迷走
  - メジャー1がbetaで開発中だがbetaだけに安定しない。
  - 途中でd.tsが追加されたが、現在は除外されている。
  - ESModule移行ブランチが起こされたが保留になっている。今見ると消えているので諦めた？
  - beta36が8月にリリースされたがbuggyでダウングレードするPJが相次ぐ。[^3]

# web3xとは

リポジトリ: https://github.com/xf00f/web3x

web3のjsオルタナ実装です。良さみを挙げていきます。

- typescriptネイティブである
  - libraryもbuild targetもES2015で構成されている。
      - IEのサポートは要らないし、通信アダプタなのでSEO/OGPの考慮も要らないのでこれで良いですね。
  - 当たり前ながら全てに型を付けられる。
  - 外部境界であるABI.jsonも専用ツールで型ファイルを作ることができる。
      - OpenAPI（swaggerなど）のようにというか、function定義まで入ってくるのでAST（abstractSynataxTree）というか。
  - 非同期はPromiseベース。ただしES2017targetではないのでasync/awaitはネイティブではないpolyfillになる。
      - `async/await`でリポジトリ検索しても大半はテストファイルにしか使われていないが一部ライブラリコードにも使われているのでバグ解析では考慮必要かも。 
- commonjsとESModuleの二つのビルド
  - 割り切ってNPM packageが2つに分かれている。[^4]
  - ブラウザアプリ開発では`web3x-es`をincludeする。
  - 静的解析が効くのでwebpackやrollupのtreeShakingが行える。
     - web3.jsだと800kbだが、web3xだと150kbになるとのこと。[^5]

# 注意点

- ライセンスがLGPL-3なのでツールやサイドチェーンに組み込む際には注意。ただし、移植作業が進みコードの書き換えが増えればMITに移行できるかもねとのこと。[^6]
- ピュアな移植ではなく破壊的変更を明記しているのでweb3ドキュメントと一部APIが変わる。
- 現状では適用できる場面がweb3を生で使う時に限定される。ツールやサイドチェーンがweb3.jsをdependenciesに組み込んでいると使えない、もしくは二重化必至。

# web3xを使ってみませんか？

おそらく普段最新環境でやっているwebフロントエンドの開発者でも満足できるだけのレベルに引き上がってきてるんじゃないでしょうか。私はそうです。なんといってもtypescriptネイティブなので、本体と型定義がずれることもなければ、型安全もかなり行き届ける可能性が上がるわけです。contractのABIにもツールを開発しているのは驚きがありました。

もちろんweb3.jsが動いてくれるのが最善ではあると思う[^7]のですが、既存稼働アプリとの互換性などありtypescriptベースで書き換えするのは難しそうな気がします。ES Module移行ブランチも諦められたようですし。（これはnodejs界隈からしてカオスなので仕方がないとは思う。）

もし、web3xがおもしろそうだなと思ったらリポジトリにスター付けたりコントリビューションしていきましょう！

[^1]: https://gist.github.com/niespodd/1fa82da6f8c901d1c33d2fcbb762947d
[^2]: https://github.com/ethereum/web3.js/issues/1916#issuecomment-432547562
[^3]: https://github.com/loomnetwork/loom-js/pull/142
[^4]: tsconfigのmoduleを分けている。ブラウザアプリ用 https://www.npmjs.com/package/web3x-es nodejs用 https://www.npmjs.com/package/web3x
[^5]: https://github.com/xf00f/web3x/blob/master/README.md
[^6]: https://github.com/xf00f/web3x/issues/10#issuecomment-445048343
[^7]: この記事を書いている日に約4ヶ月ぶりの最新1.0.0-beta37がリリースされました🎉
【Laravel 5.7】標準のログアウト先を変更する

`php artisan make:auth` で標準のログイン機能をつけたときに、ログアウト先が自動的にルートになってしまうのを変更する場合。



```
LoginController.php

use Illuminate\Http\Request;

class LoginController extends Controller
{
   // 追加
   public function logout(Request $request)
    {
        Auth::logout();

        $this->guard()->logout();

        $request->session()->invalidate();
        
        // /homeに変更
        return $this->loggedOut($request) ?: redirect('/home');
    }
```
機械学習での線形代数の必要性

# はじめに
先日，courseraというオンライン講座にある機械学習のコースを修了したので，私自身の理解度チェックと備忘を兼ねて何回かに分けて記事にしておこうというのが目的です．
## courseraとは
courseraとは海外の有名な大学の教授さんたちが作成しているオンライン講座です．
https://www.coursera.org

受講した機械学習の講座は計11週のボリュームで，動画による聴講が基本で，動画の途中で確認問題が出たり，週終わりに確認テスト，プログラミング演習などがあります．私にとっては理想的な内容だったので受講しました．

# 機械学習とは
機械学習というワードの前に，AIとの関連性や細かいところ（チューリングテストとか強いAI/弱いAIとか）も重要なキーワードがありますが．．．

大雑把に言うと機械学習とは，分類や回帰などといった予測を計算できるモデルで使用するパラメータ（数学の関数でいうところの係数）を観測データを基に算出するというもの．ほかの言い方をすれば，予測モデルのパラメータを観測データを使って最適化するというもの．
機械学習では，このパラメータの算出・最適化を観測データ（学習データ）を使って求めるのが主要分野になる．


# 線形代数の必要性
学習させるモデルは，基本的に$y=\theta x+b$のような1次式（線形関数）で表すようになる．ニューラルネットワークやボルツマンマシンなどといったモデルを扱うようになると複雑な式になっていく．併せて課題も増えていく．
この$x$が入力データを入れる部分で，入力値が3つなら$y=\theta_1x_1+\theta_2x_2+\theta_3x_3+b$と，入力値に比例して増えていく．つまり，求めたいパラメータ$(\theta,b)$を観測した$x$と$y$から求めることとなる．
ここまでに出てきたものをまとめて，多数の学習データとモデルのパラメータを使って連立方程式を組み立てていく．

```math
y^{(1)}=\theta_1x^{(1)}_{1}+\theta_2x^{(1)}_{2}+\theta_3x^{(1)}_{3}+b\\
y^{(2)}=\theta_1x^{(2)}_{1}+\theta_2x^{(2)}_{2}+\theta_3x^{(2)}_{3}+b\\
y^{(3)}=\theta_1x^{(3)}_{1}+\theta_2x^{(3)}_{2}+\theta_3x^{(3)}_{3}+b\\
y^{(4)}=\theta_1x^{(4)}_{1}+\theta_2x^{(4)}_{2}+\theta_3x^{(4)}_{3}+b\\
y^{(5)}=\theta_1x^{(5)}_{1}+\theta_2x^{(5)}_{2}+\theta_3x^{(5)}_{3}+b\\
```

上式では，パラメータが3つで学習データ数が5つの場合である．$x$の上添え字が学習データのインデックス，した添え字が入力データのインデックスとなっている．
通常，学習データ数は1,000とか10,000とかのオーダーまで増えることもある．また画像処理の領域では，パラメータ数が100とか1,000とかも当たり前のように出てくる．
このことから，普通の連立方程式の発想では，手に負えなくなるボリュームになるため，簡単に扱えるようにパラメータや観測データを1つの塊にして扱えるように工夫する．ここから線形代数の出番となる．
前準備として$\theta$と$b$をバラバラに扱うのは面倒なので，$b=1 \times \theta_0$としておく．
線形代数での記述を使えば，以下のように整理できる．

```math
Y=\left(
\begin{matrix}
y^{(1)} \\
y^{(2)} \\
y^{(3)} \\
y^{(4)} \\
y^{(5)} \\
\end{matrix}
\right) \\

\Theta=\left(
\begin{matrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\theta_3 \\
\end{matrix}
\right)
\\

X=\left(
\begin{matrix}
1 && x^{(1)}_{1} && x^{(1)}_{2} && x^{(1)}_{3} \\
1 && x^{(2)}_{1} && x^{(2)}_{2} && x^{(2)}_{3} \\
1 && x^{(3)}_{1} && x^{(3)}_{2} && x^{(3)}_{3} \\
1 && x^{(4)}_{1} && x^{(4)}_{2} && x^{(4)}_{3} \\
1 && x^{(5)}_{1} && x^{(5)}_{2} && x^{(5)}_{3} \\
\end{matrix}
\right)
=\left(
\begin{matrix}
(x^{(1)})^T \\
(x^{(2)})^T \\
(x^{(3)})^T \\
(x^{(4)})^T \\
(x^{(5)})^T \\
\end{matrix}
\right)
\\
```
とベクトルと行列の表現にして各情報をまとめることが出来る．
ここから．．．

```math
y^{(i)} = x^{(i)} \Theta
```

という1本の数式を求めることが出来るようになる．
期待値となる$\bf\it{y_i}$と計算した$\bf\it{x_i}\Theta$の誤差が最小になるようなパラメータ$\Theta$を求めれば良いのだが，学習データが多すぎるとすべてのデータに見合ったパラメータ$\Theta$を求めることが出来ない．それらしい値，つまり最適解を求めることとなる．

これは数式にすると

```math
\min_{\Theta} \frac{1}{2m} \sum^{m}_{i=1}\|x^{(i)}\Theta - y^{(i)}\|^2 \\
```

という最適化問題になる．
この問題を解くのは，勾配降下法/最急降下法(gradient descent)が良く使われる．
行列とベクトルを用いたこのような数式にすることで，専用ライブラリ（BLASなど）による並列処理が行えたり，分散コンピューティング（Map-Reduceなど）の手法を取り入れたりすることが容易になる．
そして，この解法と手順は1次式に限らず，多項式やニューラルネットワークのような複雑なモデルにも適用できる．

# まとめ
機械学習では，大量の学習データを用いて複数のパラメータの最適解を求めるというもの．
このパラメータを求めるには，一度に大量のデータを並列処理する必要があるため，行列やベクトルを用いた線形代数の分野が活躍する．
ARメガネを自作したい

①どのシングルボードコンピュータを使う？Arduino,ラズパイじゃダメ？ ②どういう処理、何のシステムをつかって表示する？ 
すいません。プログラミングに関係のない質問かもしれません。
何も知らないただの学生です。
具体的にはカラーlcdを透明にして両目の前に配置、ジャイロセンサをつけて、ネットから画像、動画を引っ張ってきて3次元的に体の周りに配置させて表示したいと思っています。 
重要なのはただ目の前に画像を表示させたいだけではないということです。ジャイロセンサの値を加味したうえで表示させたいのです。どこから手を付ければいいのでしょうか。 Arduinoで文字を表示したり画像を表示したりする仕組みは何となく想像できますが、ジャイロセンサを考慮するとなると全く想像がつきません。どういったプロセスでひょうじさせるのが一番効率がいいのでしょうか。
Scope作成時に気をつけたいこと + Solidusにおけるscope追加方法

# はじめに
本記事は、以下の目次に従って書きました。

*環境
Ruby 2.5.1
Rails 5.2.1
例に使用したgem solidus*

1. そもそもscopeとは何か？
2. solidusにおけるscopeの定義のやり方
3. 具体例とscope作成時に気をつけたいこと
4. scope作成時にハマったこと
5. おわりに

# 1. そもそもscopeとは何か？
> スコープを設定することで、関連オブジェクトやモデルへのメソッド呼び出しとして参照される、よく使用されるクエリを指定することができます。スコープでは、where、joins、includesなど、これまでに登場したすべてのメソッドを使用できます。

参考　[RAILS GUIDES](https://railsguides.jp/active_record_querying.html#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)

つまり、**モデルに対して使用するSQL文をメソッド化**できます。よく使いそうなクエリなどを、わかりやすいメソッド名をつけて定義してあげると、凡用性が上がりそうです。

# 2. solidusにおけるscopeの定義のやり方
1. 名前に`_decorator`とつける
2. 作成したいdecorator内で、`モデル名.class_eval`と定義する
3. 作成したいscopeを定義

```Ruby:product_decorator.rb
Hoge::Product.class_eval do
  scope :stock_products, -> { where(sold: false) }
end
```

# 3. 具体例とscope作成時に気をつけたいこと

*(scope使用前)*

```Ruby:products_controller.rb
class Hoge::ProductsController < ApplicationController
  def show
    @product = Hoge::Product.find(params[:id])
    @latest_products = Hoge::Product.where(sold: false).
     order(created_at: :desc).limit(10).reject { |product| product == @product }
  end
end
```
**改善すべき点**
・可読性があまりよくない。クエリのメソッドが連結していて、わかりにくい。
・再現性が低い。似た処理を別の場所で実装したい時、同様の処理を書かなければならない。
・`reject`(Rubyのメソッド)より、SQLレベルで処理した方がパフォーマンスが良くなる。また、インスタンス変数に依存している。


*(scope使用後)*

```Ruby:products_controller.rb
class Hoge::ProductsController < ApplicationController
  DISPLAY_LIMIT = 10

  def show
    @product = Hoge::Product.find(params[:id])
    @latest_products = Hoge::Product.stock_products.latest(DISPLAY_LIMIT).
     without_self(@product)
  end
end
```

```Ruby:product_decorator.rb
Hoge::Product.class_eval do
  scope :stock_products, -> { where(sold: false) }
  scope :latest, ->(number) { order(created_at: :desc).limit(number) }
  scope :without_self, ->(product) { where.not(id: product.id) }
end
```
**改善した点**
それぞれの処理を細かく分けて、わかりやすい名前をつけたscopeを作成し、`:latest, ->(number)`のように引数も渡せるように処理しています。

また、` DISPLAY_LIMIT = 10`とコントローラー側で定義することによって、何の数字かわかりやすいようにしてあります。

こうすることによって、コントローラー側での可読性が上がりますし、他の処理にも使いまわせそうです。

# 4. scope作成時にハマってしまったこと
自分は下記のような実装をしてしまい、ハマりました。
・scopeが常に何のオブジェクトになるか、を全く考慮していない
・`ActiveRecord::Relation`オブジェクトは処理する直前に遅延評価を実行することを知らなかった
・scope内で`reject`というRubyのメソッドを使用している
・scope内でインスタンス変数を使用して依存度を上げている

```Ruby:product_decorator.rb
Hoge::Product.class_eval do
  scope :products_display, -> { order(created_at: :desc).reject { |product| product == @product } }
end
```

> どのスコープメソッドも、常にActiveRecord::Relationオブジェクトを返します。

`reject`はArrayクラス(参考　[Rubyリファレンス] (https://ref.xaio.jp/ruby/classes/array/reject)) なので、この中で使用してしまうと`ActiveRecord::Relation`ではなくなり、Arrayになってしまいます。

また、Relationオブジェクトは遅延評価するということから、使用するコントローラーの実装内容や、scopeで定義したメソッドを使用する順番によって、エラーが出る可能性があります。実装する順番にかなり依存してしまったり、メソッドチェーンが使用できなかったりします。

# 5. 終わりに
以上、ご一読ありがとうございました。
ご指摘等ございましたらご一報いただけると幸いです。
Django で テンプレートを使う

次のプログラムでテンプレートを使ってみます。
[Django で簡単なページ遷移をする](https://qiita.com/ekzemplaro/items/6038954d0ed672d1c887)

次のページでテンプレートを使います。
>http://127.0.0.1:8000/app01/
>http://127.0.0.1:8000/app02/

app01 にテンプレートを入れるフォルダーを作成します。

```bash
mkdir app01/templates
mkdir app01/templates/app01
```


app02 にテンプレートを入れるフォルダーを作成します。

```bash
mkdir app02/templates
mkdir app02/templates/app02
```                

テンプレートファイル

```text:app01/templates/app01/app01.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>app01</title>
</head>
<body>
<h2>app01 template!</h2>
{{ hour }}時{{ minute }}分です。<br>
{{ message }}<p />
<hr />
<a href="../">Return</a><p />
app01.html<p />
Dec/09/2018 PM 18:30<p />
</body>
</html>
```

```text:app02/templates/app02/app02.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>app02</title>
</head>
<body>
<h2>app02 template!</h2>
{{ hour }}時{{ minute }}分です。<br>
{{ message }}<p />
<hr />
<a href="../">Return</a><p />
app02.html<p />
Dec/09/2018 PM 18:30<p />
</body>
</html>
```

app01/views.py を修正

```py:app01/views.py
from datetime import datetime

from django.http import HttpResponse
from django.shortcuts import render

def index(request):
    dd = {
        'hour': datetime.now().hour,
        'minute': datetime.now().minute,
        'message': 'app01 からのメッセージです。',
    }
    return render(request, 'app01/app01.html', dd)
```

app02/views.py を修正

```py:app02/views.py
from datetime import datetime

from django.http import HttpResponse
from django.shortcuts import render

def index(request):
    dd = {
        'hour': datetime.now().hour,
        'minute': datetime.now().minute,
        'message': 'app02 からのメッセージです。',
    }
    return render(request, 'app02/app02.html', dd)
```

開発サーバーを起動して確認

```bash
python manage.py runserver
```

![app01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/2ccaa8ba-cb97-0437-d754-32214ffdff81.png)

![app02.png](https://qiita-image-store.s3.amazonaws.com/0/179446/b20365af-f2fa-11be-beb3-c59685be25d5.png)

時間設定を日本時間にするには proj01/settings.py を編集します。

```text:proj01/settings.py
（省略）
TIME_ZONE = 'Asia/Tokyo'
（省略）
```

次のバージョンで確認しました。

```text
$ python --version
Python 3.9.5

$ django-admin --version
3.2.5
```
php-master-changes 2018-12-08

今日はコンパイラの若干のリファクタリング、ext/oci8 のバグ修正、バージョン更新、ドキュメントの更新、デフォルトの php.ini へ imap.enable_insecure_rsh の情報を追加する修正があった！

# 2018-12-08
## dstogov: Improve zend_check_live_ranges()
- https://github.com/php/php-src/commit/99658f682e996fb893a372e229d24b280f349c53
- zend_check_live_ranges() のリファクタリング
- [#62210](https://bugs.php.net/bug.php?id=62210) の対応で[入った](https://github.com/php/php-src/commit/0ac73fe7174bec9de9a610319a98b259bea67f7f)一時変数の生存期間チェック処理あたりかな

## dstogov: Reorder conditions
- https://github.com/php/php-src/commit/f12e6a076fe7aa1f7a19eebb9152af2e78ef734a
- 条件分岐の順序を変更

## KoenigsKind: When releasing an oci8 connection always set the resource to null.
- https://github.com/php/php-src/commit/3c91851874f64061f5054f710cf145a53f55757f
- [7.2~]
- ext/oci8 で、persistent 接続の解放が正常に行われるよう修正
- [PR:3491](https://github.com/php/php-src/pull/3491) のやつ

## cjbj: Update NEWS
- https://github.com/php/php-src/commit/78c299ae2d770f9f02de3cc520799437297c1fd6
- [7.2~]
- ↑の修正を NEWS に追記

## cjbj: Bump OCI8 version
- https://github.com/php/php-src/commit/2d53040a6df08e966ed4f2efd318e379d59800bb
- ext/oci8 のバージョンを更新

## cjbj: Fix resource warning value
- https://github.com/php/php-src/commit/dd0a8091f469e66321c2ddd9176ccac09a88b203
- [7.2~]
- ext/oci8 の警告メッセージの出力に使う値を修正

## remicollet: missing entry for [#77020](https://bugs.php.net/bug.php?id=77020)
- https://github.com/php/php-src/commit/431ff36f51e2117cc2b7697fd5a7dc72629e1694
- [7.1~]
- NEWS に [#77020](https://bugs.php.net/bug.php?id=77020) の修正のエントリを追加

## cjbj: Don't skip with 18c DB
- https://github.com/php/php-src/commit/9a0ec35fa3db78e7a5575978984842bcad8de0d1
- ext/oci8 で、テストのスキップ条件 / 期待出力のバージョンを修正

## cjbj: Note that PECL install now works on PHP 7.3
- https://github.com/php/php-src/commit/43adf3dc5e139f235d6694d4ea34f12d84857f4b
- [7.2~]
- ext/oci8 のパッケージ情報で、PHP 7.3 での PECL インストールの修正を付記

## remicollet: add imap.enable_insecure_rsh in php.ini
- https://github.com/php/php-src/commit/4288674651e18360e8e3988c528e9a8c66666ff0
- [7.1~]
- デフォルトの php.ini に imap.enable_insecure_rsh の情報を追加
HTTPエージェントによるAWS監視（手探り）

Zabbix 4.0 ではHTTPエージェント機能がリリースされました。
この機能によりAPIにアクセスして値を取得する事が可能になります。
JSONやXML、RAW形式のリクエストを投げることができます。
また、GETだけでなく、POSTリクエストにも対応することができます。
<img width="553" alt="2018-12-09_18h38_57.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/a9f97218-4931-23fd-5f02-e1ea964dd0a5.png">

#手探り
ひとまず[Making API Requests](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/APIReference/making-api-requests.html)のドキュメントに従って、APIリクエストを組み立ててみます。

POSTリクエストでHOSTはmonitoring.<リージョン>.amazonaws.comとなっているので
そのように設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/04c103b8-7086-a5c7-8ede-28fd1c477aef.png)

APIリクエストを投げる場合は
x-amz-targetと書かれているので、ヘッダー設定に加えてみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/4d6f9d7b-e5be-923c-b990-8842e6869ace.png)

[サンプルリクエスト](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)に載っているサンプルリクエストをそのままコピペしてみます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/7e690b06-01a6-38af-ab90-c3092cc6ca78.png)

どのようなデータが取れてくるかを見たいので、ボディーとヘッダーを取得します。
<img width="462" alt="2018-12-09_18h48_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/def1ce1a-3a17-8043-62d3-5a74b465a69a.png">

#レスポンス
<img width="940" alt="2018-12-09_18h49_07.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/9438e231-aecd-877f-c866-3907aabe32f4.png">
まだ目的の値はとれませんが、とりあえずコネクション自体はできている模様。
Laravel+Reactのセットアップメモ

以下、composerがインストールされていることが前提になります。

# セットアップ
## プロジェクト作成
```shell
composer create-project --prefer-dist laravel/laravel $project_name
```

## プロジェクトフォルダへ移動
```shell
cd $project_name
```

## react環境のセットアップ
```shell
php artisan preset react
npm install && npm run dev
```

以上でlaravel+react環境のセットアップ完了

# 動作確認
## 開発サーバ起動
```shell
php artisan serve
```
`http://localhost:8000`にアクセスして、laravelの動作を確認

## React環境の動作確認
`/resources/views/welcome.blade.php`のbodyの中身を以下のように書き換えて、再度`http://localhost:8000`にアクセスすると、ビルド元の`/resources/assets/js/components/Example.js`の内容が表示されるはず。

```
<body>
        <div id="example"></div>
        <script src="{{mix('js/app.js')}}" ></script>
</body>
```

## ファイル監視の起動
```
npm run watch
```
これで`/resources/assets/js/components/Example.js`をいじると自動ビルドされるはずなので、再度`http://localhost:8000`にアクセスすれば、変更が適用されるはずです。

# 参考ページ
[PHPフレームワーク「Laravel」を使ってReactデビューしてみよう！](https://liginc.co.jp/375726)
[Laravel 5.7 インストール](https://readouble.com/laravel/5.7/ja/installation.html)
インフラ勉強会の検証基盤にNutanix CEを導入しようとしてトラブった話

# インフラ勉強会の検証基盤にNutanix CEを導入しようとしてトラブった話

## 結論
紆余曲折あったけれど、HW構成が悪かった。最終的にはこんなパフォーマンスのコンテナ検証環境が出来た。
**教訓**：ちゃんとドキュメントを読もう。
![perf.png](https://qiita-image-store.s3.amazonaws.com/0/190013/a3cf12c1-9906-fc73-2548-8d6a0fe62a33.png)
なお、ホスト故障にもフェイルオーバで対応するし、自動バックアップ機能もある、リモートサイトへのレプリケーションもできる、ライブマイグレーションもできる、マネージドのファイルサービスも存在する検証環境。

## 背景
[インフラ勉強会](https://wp.infra-workshop.tech/)では勉強会のイベント管理にWordPressを用いている。当該環境は仮想マシンベースとなっているが、**筆者の脳内**では
「インフラ勉強会のインフラって仮想マシン使ってるんだってー？」
「もうコンテナ技術が主流なのに時代遅れだよねー！」
という言葉が飛び交っていたので、インフラ勉強会にコンテナ技術の検証基盤を導入することとした。

### そもそもなんで仮想マシンを使ってたの？
結論を言うと筆者の知識が乏しかったから。
インフラ勉強会が発足したのは2017年12月23日、[インフラ勉強会のWiki](https://wiki.infra-workshop.tech/)が稼働したのは2日後の2017年12月25日である。
![wiki.png](https://qiita-image-store.s3.amazonaws.com/0/190013/58aba355-01b7-ea4c-3a16-0cc1b809bc60.png)
インフラ勉強会の勢いを阻害しないために、極力早く環境を構築しようと考えていた。
当時の筆者はDockerを一切触れたことが無かったため、当たり前の様に仮想マシンを用いて構築した。
つまり筆者が生み出した**技術的負債**である。

## 検討
コンテナオーケストレーション製品の候補としてはKubernetes、Docker Swarm、OpenShiftなどの製品名が出ていた。
様々なプロダクトを並行で検証できるように、これらのホストを物理サーバに直接インストールするのではなく仮想マシン上にインストールすることとし、ハイパーバイザ層には(筆者の独断で)Nutanix CEを採用した。
Nutanix CEはコミュニティメンバーであれば無償で使用できるハイパーバイザであり、製品版のNutanixにはKarbonというManagedでKubernetesを提供する機能も存在する。
現最新バージョンのNutanix CEにはKarbonはリリースされていないが、リリースされた後には
「インフラ勉強会の次期インフラとしてKubernetesを採用した場合には、Karbonを用いてKubernetesを容易に管理できるだろう・・」
という淡い期待もある。

## 構築
ドハマリした。
適当なサーバを用意したが、Diskの組み合わせに問題があった。
用意したHWは以下の通りである。

|種別|型番|
|---|---|
|サーバ筐体 |PRIMERGY　RX1330 M3|
|CPU        |E3-1230v6|
|Memory     |SMD4-E64G48M-24R-Q|
|Disk(Hot Tier)|Samsung SSD 960 EVO 500GB|
|Disk(Cold Tier)|Samsung SSD 960 EVO 1TB|
|Boot Disk|適当なUSBフラッシュメモリ|
|NIC        |X550-T2|

### CVMのインストールが失敗する
Nutanix CEをインストールする時の流れは以下の通りだ。
1. Nutanix CEのイメージをUSBフラッシュメモリに書き込み、AHVを起動する
2. installユーザでログインし、初期設定を行う
3. 初期設定の内容を基にCVMがインストールされる

3の処理内でAHVからCVMへの通信が発生する動作となっているが、用意したハードウェア構成ではタイムアウトしCVMのインストールに失敗した。

### 原因はDisk構成。Hot TierとCold TierにNVMeのDiskを使用したこと
筆者の宗教上、Disk IO待ちで検証が滞るという状況は禁忌であるため、少しでもDisk性能を高めるためにNVMe SSDを採用した。
でも以下に書いてあった。
[RECOMMENDED COMMUNITY EDITION HARDWARE](https://portal.nutanix.com/#/page/docs/details?targetId=Nutanix-Community-Edition-Getting-Started:com-sysreqs-ce-r.html)
> NVMe-based drives are not supported

Nutanix では、主にキャッシュ用途で使用するHot Tier用のDiskと、データのストア領域として使用するCold Tier用のDiskを必要とする。
用意したハードウェアでは、Hot TierおよびCold TierにNVMeを採用していた。
Hot Tierのみの構成であればNVMeをサポートするとの情報があったため、以下のようにハードウェアを変更して対処した。

|種別|型番|
|---|---|
|Disk(Hot Tier)|Samsung SSD 960 EVO 500GB|
|Disk(Cold Tier)|**SanDisk SDSSDH3 1TB**|

結果、すんなり動いた。

## まとめ
- ドキュメントちゃんと読もう
- Nutanix早くて楽だよ使おう
【Xcode10】Exportボタンがない！？　あっ、Distribute Appにまとめられたんですね

## Exportボタンがない！？

DeployGateでアプリを配布するために、Xcode10でExportをしようとしました。
いつものようにArchiveをして、さてExportというときになって、Exportボタンがないことに気がついてあせりました。

<img width="1312" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/98168cd4-deb8-91c4-b902-21f6ed624dad.png">

Xcode9ではたしかにこの画面にあったはずなのに……

<img width="1312" alt="002.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/5723563c-1f63-74ae-baa2-b58e0d67416a.png">


## Distribute Appにまとめられてました

答えはタイトル通りですが、App StoreへのアップロードとExportがDistribute Appボタンにまとめられました。

<img width="1312" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/f89a934f-67dd-edd9-0fd6-c824e399b04a.png">


Distribute Appボタンをクリックすると、iOS App StoreやAd Hocなどが並んでいるので、Ad Hocを選択してNextボタンをクリックします。

<img width="1312" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/76185f87-03ae-e794-b9d3-ed1eb017935d.png">


あとは、今までどおりオプションの設定などをしていくと、IPAファイルをExportできます。

めでたしめでたし。
Nuxt.js & TypeScript で payjp.js を使う

## まえがき

前提として、Nuxt.js 側ではカード情報のトークン化だけ行い、取得したトークンをバックエンドに投げます。
なので、カード情報のトークン化にのみ特化した PAY.JP 公式のライブラリ [payjp.js](https://pay.jp/docs/payjs) を使います。

## payjp.js の読み込み

> payjp.jsライブラリは、 https://js.pay.jp にホストされているので、このドメインを読み込んで使います。

とあるので、

```html
<script type="text/javascript" src="https://js.pay.jp/">
```

を記述する必要があります。
しかし、Nuxt.js には index.html みたいなファイルは用意されていないので、 `nuxt.config.js` に記述します。

```js:nuxt.config.js
module.exports = {
  head: {
    script: [
      { src: 'https://js.pay.jp/' }
    ]
  }
}
```

payjp.js を使うページが限られている場合は下手にこれを読み込んでも無駄になってしまうので、[ローカルな設定](ローカルな設定) でも良いかもしれないですね。

*参考：[外部リソース - Nuxt.js](https://ja.nuxtjs.org/faq/)*

## `Payjp` を使うと出るエラーと闘う

payjp.js の[ドキュメント](https://pay.jp/docs/payjs)に従って、pages の vue ファイルから

```js:before
Payjp.setPublicKey("pk_test_0383a1b8f91e8a6e3ea0e2a9"); // これとか

Payjp.createToken(card, function(status, response) {...}); // これとか
```

をやっていきたい！

しかし、このままだと `Cannot find name 'Payjp'.` とエラーが出ます。それはそう。
`Payjp` は読み込まれてグローバル変数になっているので、 **`window.Payjp`** として丁寧に呼び出してみましょう。

```js:after
window.Payjp.setPublicKey("pk_test_0383a1b8f91e8a6e3ea0e2a9"); // こんな

window.Payjp.createToken(card, function(status, response) {...}); // かんじで！
```

すると次は `Property 'Payjp' does not exist on type 'Window'.` とエラーが出ました。
window の型にはもともと `Payjp` は無いので怒られてます。**window の型を拡張**していきましょう。
アプリケーション全体の型定義の書かれた `index.d.ts` がプロジェクトのディレクトリ直下にあるかと思います（無ければ作る）。そこに以下を記述します。

```typescript:index.d.ts
declare global {
  interface Window {
    Payjp: any;
  }
}
```

*参考：[TypeScript の型定義ファイルと仲良くなろう - Hatena Developer Blog](http://developer.hatenastaff.com/entry/2016/06/27/140931#declare-global---%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)*

これでさっきの `window.Pay` で呼び出した payjp.js はエラー無く動くようになりました ✌️
WordPress5.0でプラグインの新規追加画面・編集画面が真っ白になった場合の対処

**2018-12-10追記**

翌日に後述のコードを外したところ、不具合が出なくなっていました。
諸々検証していますが、原因は特定できていません…すみません。詳しくはコメントを参照ください。

---

既出かもしれませんが、WordPress5.0からの新しいブロックエディタ「Gutenberg」と、何かを登録する前提となっているプラグインの衝突に関して共有しておきます。

- ACF Pro 5.7.8と、MW WP Form 4.0.4で確認しています。
- ブラウザはMacOS Chromeの最新バージョンです。
- 「Advanced Custom Fields」については、次期バージョンではブロックエディタにも対応したいとのことなので、暫定措置と捉えてください。

## なぜ真っ白になるのか

こちらで高橋文樹さんが詳細に解説してくださっていますが、プラグインの編集画面が「エディタが存在しない投稿タイプ」となっている関係で、ブロックエディタが有効になっているとエラーになるそうです。

https://capitalp.jp/2018/08/14/fate-of-customfield-craftmans/

つまり、それぞれのプラグインが投稿タイプを持っているはずで、そのときにブロックエディタを無効にできれば直るはずです。

## 結論

function.phpに、以下のコードを追加してください。
高橋さんのサンプルコードでは無効にしなくて良い場合はtrueを返していませんでしたが、私の環境ではtrueを返さないとすべての投稿タイプで無効になってしまいました。

### ACFの場合
```php:acf_on_wp5.php
function WS_remove_block_editor( $user_block_editor, $post ) {
    if ( $post->post_type === 'acf-field-group' ) {
        $use_block_editor = false;
    } else {
        $use_block_editor = true;
    }
    return $use_block_editor;
}
add_filter( 'use_block_editor_for_post', 'WS_remove_block_editor', 10, 2 );
```

### MW WP Formの場合
```php:mwwpf_on_wp5.php
function WS_remove_block_editor( $user_block_editor, $post ) {
    if ( $post->post_type === 'mw-wp-form' ) {
        $use_block_editor = false;
    } else {
        $use_block_editor = true;
    }
    return $use_block_editor;
}
add_filter( 'use_block_editor_for_post', 'WS_remove_block_editor', 10, 2 );
```

### 両方の場合
```php:mwwpf_on_wp5.php
function WS_remove_block_editor( $user_block_editor, $post ) {
    if (
        ( $post->post_type === 'acf-field-group' )
        ||( $post->post_type === 'mw-wp-form' )
    ) {
        $use_block_editor = false;
    } else {
        $use_block_editor = true;
    }
    return $use_block_editor;
}
add_filter( 'use_block_editor_for_post', 'WS_remove_block_editor', 10, 2 );
```

## Gutenbergさんと仲良くするために

高橋文樹さんのブログ内連載「Before Gutenberg」に目を通しておくと、当面の疑問は解消されるかと思います。

https://capitalp.jp/tag/before-gutenberg/
Reagent から material-ui v3 を利用してハマった時に見る記事

この記事は Clojure Advent Calendar 2018 10日目の記事です。
前日の記事は @uochan  さんの [Vim で Clojure 開発するためのプラグイン vim-iced を作った話](https://scrapbox.io/uochan/Vim_%E3%81%A7_Clojure_%E9%96%8B%E7%99%BA%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_vim-iced_%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F%E8%A9%B1) でした。 cider に迫る多機能で便利なプラグインの作者直々の記事ですので、 Vimmer の方はぜひ一度ご覧ください :pray: 

この記事は著者が material-ui v3 を使って[とあるwebアプリケーション](https://github.com/boxp/vr-match)を作っている中でハマった点をまとめたものです。

まだまだ開発途中なので今後も追記していきます。

# 前提条件

以下の構成のアプリケーションを想定しています。

- ビルドツールに Leiningen を使用
- material-ui は [cljsjs/material-ui](https://github.com/cljsjs/packages/tree/master/material-ui) を使用

# props が変化する度に withStyles を利用して生成したコンポーネントが再マウントされてしまう

`withStyles` を利用したコンポーネントをレンダリングする度に再生成している場合、 `withStyles` から生成されるクラス名が再生成の度に変化するためコンポーネントが再マウントされてしまいます。

以下のように一度だけ `withStyles` を利用してコンポーネントを生成させるべきです。

*Bad*

```cljs
(defn approach
  [props]
  [(r/adapt-react-class ((mui/with-styles approach-styles) (r/reactify-component approach-component))) props])
```

*Good*

```cljs
(def approach
  (r/adapt-react-class ((mui/with-styles approach-styles) (r/reactify-component approach-component))))
```

また、そもそもとして `withStyles` のような Higher-Order Components を利用してコンポーネントを生成する場合、 render メソッド (reagent で言う　`(defn hoge [props] [...])` 相当) 内での生成はコンポーネントの再マウントを招くので[React 公式ドキュメント](https://reactjs.org/docs/higher-order-components.html#dont-use-hocs-inside-the-render-method)でも非推奨とされています。

~~このハマり方をした人はおそらく[Reagentのドキュメント](https://github.com/reagent-project/reagent/blob/master/doc/InteropWithReact.md#example-decorator-higher-order-components)を見てそれに習った方だと思うので、誤解のないように[ドキュメントの修正PR](https://github.com/reagent-project/reagent/pull/415)を出しています。~~
↑この記事の投稿前に[ドキュメントの修正PR](https://github.com/reagent-project/reagent/pull/415)がマージされました :tada: 

# SSR を行っている場合、 hydrate 時にコンポーネントが再マウントされてしまう

[公式ドキュメント](https://material-ui.com/guides/server-rendering/)に従ってSSRを行っていながらこの状態となる場合、サーバーサイドとフロントエンドで設定されている `process.env.NODE_ENV` が異なっていて生成されるクラス名が変化している可能性があります。

特に、通常 `process.env.NODE_ENV` はビルド時の環境変数によって変化するものですが、cljsjsのライブラリを利用している場合はその限りでなくライブラリに既に値が埋め込まれており、 **:optimization が :none の時のみ 'development' 、それ以外は 'production'で固定** となります。

ここについては [ClojureScript のドキュメント](https://clojurescript.org/reference/compiler-options#foreign-libs)に書かれている通りで、読み込まれるライブラリが `:optimization` によって別のファイルになる事に起因するものなので、 `process.env.NODE_ENV = 'production'` でもコードは最適化しないと言った事は事実上不可能です。（そもそも[ここで議論されている](https://github.com/raxjs/server-side-rendering-comparison/pull/10#issuecomment-273012995)通りサーバーサイドでもコードの最適化をしていなければパフォーマンス的に不利益を被るため、やること自体にメリットはないかも知れませんが）

つまり、本番用ビルドの場合はサーバーサイドも `{:optimization :simple}` か `{:optimization :advanced}` に設定しておく必要があります。
[自分用メモ]iOSのビルドに失敗した時のメモ

【バージョン】
Unity：2017.4.8f1 (64bit)
Xcode：10.1 (10B61)
端末：iPad Pro 10.5 (OS：12.1)
#エラー：This application does not support this device's CPU type.
というエラーがXcodeでビルドしている時に表示された。
これはUnity側の設定で64bitに対応していないことが原因？なので、
下記の設定を変更して64bitにも対応する。
iOS側が64bitに対応していないアプリはストア上から消すようになった？ためだと思う。
# Unityのビルド設定
Unityの「Build Settings」から「Player Settings」を選択
「Other Settings」の「Scripting Backend」を「IL2CPP」にすると
同リスト内の「Architecture」が選択可能になる
そこの選択を「Universal」にする。

これでUnityで「Build」をしなおして、Xcodeでビルドをすると通った。
【入門】SharedPreferences

# SharedPreferencesとは
データベースを用いずとも、Key-Value形式で簡易的にデータを保持する（データ永続化）ことができる仕組み。
XMLファイルとして保存されます。
メモリ上にキャッシュするものなので、膨大なデータを保存することには向いていませんが、頻繁にアクセスするデータなどに対しては非常に有効だと言えるでしょう。

#使い方
SharedPreferencesの主な使い方には、大きく分けて以下の2つのプロセスがあります。

- データの書き込み（保存）
- データの読み込み（取得）

例として、アプリを起動した日付に関して、keyを"LAUNCH_DATE"、valueを"date"として保存するケースを考えます。順を追って説明しましょう。

### データの書き込み（保存）

インスタンスの取得方法にも様々あるのですが、今回はgetDefaultSharedPreferencesを用います。

```java
// インスタンスを生成し、edit()を呼び出します
SharedPreferences pref = getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = pref.edit();
// KeyとValueを保存します
editor.putString(LAUNCH_DATE, date);
// 保存したデータを書き込みます
editor.apply();
```

### データの読み込み（取得）

```java
// 引数に先ほど設定したkeyを渡して、valueを取得します
String launch_date = pref.getString(LAUNCH_DATE, null);
```

---
基本はこれだけ！
[公式ドキュメント](https://developer.android.com/reference/android/content/SharedPreferences?hl=ja)にもSharedPreferencesの記述があるので参考にしてみてはいかがでしょうか。
bashの暗黙的な動作まとめ

## 対象
* bashでスクリプトを書こうとしている人
* bashでスクリプトを書くことをやめさせたいので、説得のためのネタを探してる人

## はじめに
暗黙的とは、特に指定していないのに自動で行われる処理を示してます。
型の自動変換や環境変数による挙動の差異など、知らないで実装すると後々トラブルになる可能性があるため、スクリプトを書く際の注意を自分なりにまとめておきます。

## 暗黙的な動作の説明
### ループなどに指定するデータの区切り文字は `IFS`環境変数が効いている
以下はどのような動作になるかわかるでしょうか？

```bash:terminal
$ dat="a b c d"
$ for i in ${dat}
do
  echo $i
done
```

上記は `IFS` 環境変数によって挙動が異なります。
IFSには区切り文字を定義することができるため、`IFS=","` という前提があると、上記プログラムの出力結果は `a b c d` になります。

_ある関数でIFSを上書き設定している記述があり、そのせいで後続のfor文が想定外の動作を起こすという素敵な事故がありました。_

### `|` を使うとサブプロセスになる

```bash:terminal
$ command1 | command2
```

上記のコマンドは以下のように解釈されます。

```bash:terminal
$ ( command1 | command2 )
```

bashでは `()`がつくとサブシェル扱いになるため、サブシェル内で変数を定義しても親シェルに引き継ぐ事ができません。
このため、whileなどは記述によって動作が変わります。

```bash:terminal
$ wc -l test.txt
       4 test.txt
$ cnt=0
$ cat test.txt  | while read line
do
  cnt=`expr ${cnt} + 1`
done
$ echo $cnt
0
```

```bash:terminal
$ cnt=0
$ while read line
do
  cnt=`expr ${cnt} + 1`
done < test.txt
$ echo $cnt
4
```

_こちらは基本的に実装時にわかりますし、影響範囲も少ないので迷惑度は少ないと思います。_

### 引数の展開
grepを使う時などの注意で、shellはまずワイルドカードを展開してからコマンドを解釈します。
正規表現には `*` などのshellの展開に使う記述もあるので、これが原因で意図しない動作に繋がることがあります。

例えば以下のテキストファイルからfoo＊txtに該当する行を取る場合。


```text:foo.txt
foo.txt
foobar.txt
barfoo.txt
bar.txt
```

以下は悪い例で、ワイルドカードが展開されてからgrepしてしまうため `foobar.txt`が抽出できません。

```bash:terminal
$ ls -1
foo.txt

$ grep foo.* foo.txt
foo.txt
barfoo.txt
```

展開したくないなら `'`囲みにするなどして対応する

```bash:terminal
$ grep 'foo.*' foo.txt
foo.txt
foobar.txt
barfoo.txt
```

_気をつけろよ！で済めばいいんですが、レビュー漏れすると本番にリリースした後、しばらくしてから「何もしてない」のに不具合が出るということにも・・・。_

## 最後に
滅多なことでは問題にならないと思うけど、マーフィーの法則とかもあわせて考えるとやっぱ怖い。
PHPStorm + Laravelの開発時に使うと便利な小技集

# さいしょに
普段Laravel+PHPStormを使っていて、「これは便利だなー」と思った小技を今回紹介していきます。

## 縦・横分割
##### Window -> Editor Tabs -> Split Vertically（垂直）
##### Window -> Editor Tabs -> Split Horizontally（水平）

膨大なコードを取り扱う以上どのエディタでもほぼ必須な分割機能ですが、私もショートカットにカスタム登録するくらいには活用してます。

（むしろデフォルトで登録されていないのは何故かと思うくらいに）

特に横長なディスプレイを使用していると縦分割の使用頻度が高く、

- 同じファイルの前半（定義エリア等）と後半（実装部分等）を同時に見る
- 参考にするファイルを開きながら実装するファイルを開いて書く

といったケースで使用したりしてます。

## 静的解析
##### Code -> Inspect Code...

コード量が多くなるとどうしてもタイプミスや変数の定義忘れ・未使用といった事が発生しがちになり、
それらを人力で探すのがとても困難になるため最近意識して使用するようになりました。

基本的には **General** が出現しなければまず最低限の問題はクリアしていると見て良いです。

このGeneral項目が出る大半の理由は文法ミス（Syntax error）が多く、例えば意図しないtypo（```;```で終わっている行に不要な文字が続けて入っている等）があったりした場合はここで報告されます。

本来であればコミット時に合わせてこの静的解析も合わせて使用出来ますが、gitの処理はすべてSourceTreeで行っているため、実際にコミット前の最後の段階でこの処理を実行するようにしています。

## ToDo
##### View -> Tool Windows -> TODO
名前の通り、コメントに ```todo:``` と付けるだけで勝手にToDoリストにまとめてくれる機能です。
わざわざ書き出すほどでもないけど、一応後々のために覚書を残しておこうといった時によく使います。

## Laravel Plugin
##### https://github.com/Haehnchen/idea-php-laravel-plugin

Laravelの開発をする上で必須と言えるくらいなプラグイン。
コントローラー・モデル・ビューにおける補完処理が行え格段にタイプ数が減るので、これだけでも入れる価値はあります。

## Laravel 5 IDE Helper Generator
##### https://github.com/Barryvdh/laravel-ide-helper

上のプラグインと合わせてほぼ必須なライブラリ。
例えばLaravel標準のメソッドであったり、独自のクラス・メソッドを作った際に上手くPHPStormが解釈せず「（クラス|メソッド）が見つからない」といったエラーが多数発生せず済みます。

詳しくは140秒弱で分かる公式解説動画がありますのでこちらをどうぞ。

https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15

## Doctrine Database Abstraction Layer
##### https://github.com/doctrine/dbal

このライブラリ自体を直接使っているわけではありませんが、

上のIDE Helper Generatorと合わせる事で、モデルのプロパティを使ったphpDocも合わせて作ってくれます。（README中盤記載）

こちらは何が便利かというと、モデル内のスコープやフォーマッタメソッドだけでなく直接テーブル上を参照しカラムの型も含めてphpDoc化してくれるので、

よくありがちな「あのカラムはどんな型の何の名前だったっけ？」が減ったり、Eloquentを使用している際に独自のスコープが正しく認識されたりします。

（ただしモデルを書き換えたら都度書き込みコマンドを実行する必要があります）

# さいごに
PHPStormとLaravelの組み合わせを使い始めてまだ2,3年程ですが、使っていくうちに「あ、こんな便利な機能があったんだ」と思うようなことがまだまだ出てきています。

どんなに高級なIDEを使っていても実際はその半分も使いこなしていないという事なのだろうなという思いで、色々と調べてみると意外な発見が出てきたりするかもしれません。

この記事も誰かの参考になれば幸いです。