OmniAICreator/Qiita-1.07M huggingface dataset:
汚れたDB上でmigrationをやり直す

## 環境
```
Rails 5.0.3
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin17]
Mysql: Server version: 5.7.21
```

## 現象
Railsの開発でたまに起きたことです。ブランチの切り替えるより、すでにmigrationを適用済みで、またmigrationを修正して、適用しようとすると、以下のエラーが起きます。

```ruby
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'xxx_jobs' already exists: ...
Mysql2::Error: Table 'xxx_jobs' already exists
...
Tasks: TOP => db:migrate
```

## 対策
### ロールバックできる
`rake db:migration:status`でmigrationのステータスを確認した上でrollbackして、migrationを再実行すれば行けるはずです。

```ruby
rake db:migration:status
rake db:rollback
...
rake db:migration
```

### ロールバックできない
#### DBを作り直す
  - やる前に、mysqldumpでDBをダンプして保存してください、
  - DBを作り直す `rake db:drop; rake db:create; rake db:migrate`
  - ダンプしたデータをインポートする
  - `rake db:migration:status`

**注意**: もし新しいmigrationで外部キーの追加などが含まれている場合は、ダンプしたデータをそのままインポートすると、migrationが古いほうに戻される可能性があるため、ご注意ください。

その場合は↓の方法でやるしかないです。

#### 適用済みのmigrationをDBから消して、migrationを再実行する
**最悪**の場合はロールバックできなくて、手動で新規追加された外部キー、インデックス、コラム、テーブルなどを消さないと行けない。

```sql
show create table table-name

-- 外部キー削除
alter table table-name drop foreign key key-name

-- インデックス削除
alter table table-name drop index index-name

-- コラム削除
alter table table-name drop column column-name
```

全部消し終わったら、`rake db:migration:status`で状況を確認して、schema_migrationsテーブルからいらないversionを消してから、再度migrationを実行するとうまく行けるはずです。

**注意**: schema_migrationsテーブルからいらないversionを消さないと対するmigrationを再実行できないので、ご注意。
vue-cliでつくったやつをGitHub Pagesに公開

### config/index.jsを編集

```
assetsPublicPath: '/'　→  assetsPublicPath: ''
```

詳しくはこっちに
https://qiita.com/tiwu_official/items/43dc554ec43dd951812a

```config/index.js
'use strict'
// Template version: 1.2.5
// see http://vuejs-templates.github.io/webpack for documentation.

const path = require('path')

module.exports = {
  dev: {
     // 省略
  },

  build: {
    // 省略

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '', ←ここ

    // 省略
  }
}
```


### ビルド

```
npm run build
```

### distをgh-pagesブランチにプッシュ

```
git subtree push --prefix dist/ origin gh-pages
```

### 参考ページ
[vue-cliでwebアプリケーションを作って、GitHubPagesで無料で爆速でリリースした話]
(https://qiita.com/tiwu_official/items/43dc554ec43dd951812a)
vcpkgに気を付けましょう　OpenCVと不思議なzlib1.dll

メモ

vcpkgを面白半分でインストールしたのです。
そのことをすっかり忘れてOpenCVをビルドしたら、binディレクトリにzlib1.dllというdllがコピーされていて、これがないと動かなくなってしまいました。自前ビルドでstaticリンクしているのに変だと思ってvcpkgのことを思い出し、削除したらもとに戻ったみたいです。
libtiffやlibpng、libjpegは特にそういうことはなかったので不思議な体験でした。

1日損しました。

以上、よろしくお願いします。
Railsで取得したレコードから複数のカラムの値を取得

Userモデルのレコードからname, emailだけ取りたいとかなら

```rb
user = User.first
columns = ["name", "email"]
columns.map { |col| user.send(col) }
# -> ["NAME", "EMAIL"] の形の配列で返ってくる
```

もっと楽なのないかな･･･
CWL conformance test 111に関して

conformance test 111
====================

# 概要

## 入力

`cat3-nodocker.cwl`
`file-literal.yml`

## 期待される出力

18バイト

`Hello file literal`

conformance test としては、これが含まれている情報。

## 説明

`inputs` で `file1` として
`File` が指定されている。
しかしこれらは、`location`, `path`が指定されていないので、
ファイルを作って、`contents`の内容を書き出す。

仕様としては、以下になる。

[Common Workflow Language \(CWL\) Command Line Tool Description, v1\.0\.2](https://www.commonwl.org/v1.0/CommandLineTool.html#File)
【codility】Lesson 3: Time Complexity TapeEquilibrium

#subject
与えられたN個の要素から成り立つ配列Aを前半の長さPと後半の長さ（N-P）に切断して差分を比較し、最も少ない差分値を返す問題。
例）
`A = {3, 1, 2, 4, 3}`が与えられた場合の返却値は`1`である。 
`P = 1, difference = |3 - 10| = 7` もう少し詳しく書くと、前半の配列`Af = {3} `と後半の配列`Ab = {1, 2, 4, 3}`のそれぞれの合計の差である。
同様に、下記も求めていく。
`P = 2, difference = |4 - 9| = 5` 
`P = 3, difference = |6 - 7| = 1` 
`P = 4, difference = |10 - 3| = 7` 
`P = 1~4`の中で一番値の低いものを返却する。 

#submit
とても長い戦い。やっととれたscore100!!!
![image.png](https://qiita-image-store.s3.amazonaws.com/0/237869/69d30df2-6c56-b0ac-9115-dbe50b1ef29a.png)
#program
**Point:あらかじめSUMを取っておくこと**
前半の配列の和frontSumと、後半の配列の和backSumとそれぞれ和をもとめておくことで、１つの要素の移動だけでfront,backの和が計算でき、差を求めることができる。
今回、ネックだったのは要素はマイナスの値も含まれているところ。加えて、配列が２つの時のケースを場合分けするところだった。結構時間がかかってしまった。

```c++:tapeEquilibrium.cpp
#include<iostream>
#include<vector>
using namespace std;

int solution(vector<int> &A) {
	int frontSum = 0;
	int backSum = 0;
	int val = 0;

	if (!A.empty()) {
		if((int)A.size() == 2){
			return (abs(A[0] - A[1]));
		}
		frontSum = A[0];
		for (int i = 1; i < (int)A.size(); ++i) {
			backSum += A[i];
		}

		int min = abs(frontSum - backSum);
		for (int i = 1; i < ((int)A.size() - 1); ++i) {
		    frontSum += A[i];
		    backSum  -= A[i];
			val = abs(frontSum - backSum);
			if (val < min)
				min = val;
		}
		return min;
	}
	return 0;
}
```
Amazon CloudFront & Lambda@EdgeでレスポンスBodyを(少々強引に)改変する

Amazon CloudFrontのLambda@Edgeは、HTTPリクエスト/レスポンスに対して任意のタイミングでLambdaをカマす機能です。

さて、今回はレスポンスのHTMLをちょっと加工したいなと思って調べました。

実装例のドキュメントはこちら。

- [リクエストトリガーでの HTTP レスポンスの生成 - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-generating-http-responses.html)
- [origin-response トリガーでの HTTP レスポンスの更新 - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/lambda-updating-http-responses.html)

> 追記: bodyさわれるようになりましたね。以下はもうoutdated

----

これらによると、以下の制限があるとのこと。

> HTTP レスポンスを使用する場合、Lambda@Edge は、オリジンサーバーから返された HTML 本文を origin-response トリガーに公開しません。


bodyに手を出せないのかよ！ オリジンからのレスポンスに対する通常の利用範囲内では、bodyはまるごと上書きのみ可能、とのこと。
ちょっと内容変更して配信したい、というケースに対応するには。。？

そこでヒントにしたのがこちら。

- [Amazon CloudFront & Lambda@Edge で画像をリサイズする | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/resizing-images-with-amazon-cloudfront-lambdaedge-aws-cdn-blog/)

わりとそのまんまの解決策だった。これをすこし方針変更してテキスト処理にすればよさそう。

## 方針

- 改変したいのはHTMLだけ
- オリジンはAmazon S3

## How to

- origin-responseの時点でLambdaコール
  - ここで書き換えればキャッシュにのるので
- STATUS=200かつ`.html`のリクエストを判定
  - ヘッダは使い回す
  - bodyには、S3からオブジェクトを直接取得してから改変したコンテンツを突っ込む
- IAM Roleに割り当てるPolicyではgetObjectを許可

## コード

で、origin-responseイベントのところで動作するLambdaスクリプトをこのようにしました。
content-lengthの再計算いるかなと思ったけど、このイベントの時点ではcontent-lengthヘッダはついてなかったので、レスポンス最終段階で付与されるんだろうと。

サンプルではBody中の`WordPress`という単語を`getShifter`に置換してます。


```javascript:origin_response.js
'use strict';
const util = require('util');
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
  signatureVersion: 'v4',
});

exports.handler = (event, context, callback) => {
  console.log(util.inspect(event.Records[0].cf));
  let response = event.Records[0].cf.response;

  if (response.status == 200) {
    let request = event.Records[0].cf.request;
    let bucket = request.origin.s3.domainName.split('.')[0];
    let path = request.uri;

    if (path.endsWith('\.html')) {
      let key = path.substring(1);
      S3.getObject({ Bucket: bucket, Key: key }).promise()
        // perform the replace operation
        .then(data => data.Body.toString()
          .replace(/WordPress/g, 'getShifter')
        )
        .then(buffer => {
          // console.log(buffer);
          response.body = buffer;
          callback(null, response);
          return;
        })
        .catch( err => {
          console.log("Exception while reading source :%j",err);
        });
    } else {
      callback(null, response);
    }
  } else {
    callback(null, response);
  }
};
```

一応Edgeの厳し目なタイムアウト制限(5s)の範囲には収まっているっぽく、置換されたコンテンツを取得できました。

パススルー用のcallbackをelseの外に置いてたらうまくいかなかったのはなんでやろうなあ。。


## 使用前/使用後

![before.png](https://qiita-image-store.s3.amazonaws.com/0/7454/36ec7843-8bc6-7fae-5838-a4ff64c97a57.png)

↓↓↓変わった。

![after.png](https://qiita-image-store.s3.amazonaws.com/0/7454/15cd1d9d-0b7c-b7fe-aacd-ea31a2168a23.png)

初回ちょっと遅いけど、キャッシュには改変後が乗るのでよいかな。
テクスチャ食い込みに関して

# 直面した問題
ハイポリ等、人物のボーンの上に服が重なっているモデルの場合、
時々意図せず服が破れ、肉体が露見してしまう時がある。

# 解決方法
`PlayerSettings` → `QualitySettings` → `BlendWeights`
この設定が2bonesの場合は、4bonesに変更すると解消される可能性がある。

[Unity QualitySettings](https://docs.unity3d.com/ja/current/Manual/class-QualitySettings.html)

>アニメーションのときにひとつの頂点に影響を与えることができるボーンの数。使用可能なオプションは、1 つ,2 つ,4 つのボーンです。

なるほどですね。

## TODO
> 悩ましいのは、更にAndroidやiOSの実機確認をした時に解消されるわけではないパターンの時。
ここは具体的にまだ掘り下げられていないので、後述するかもしれない。

解消したので、記述。

# QualitySettingsのデフォルトを確認しよう

Unity上で、QualitySettingのレベルの選択をいくら変えたところで
対象プラットフォームの実際の設定が変わるわけではないことを初めて知る。。

<img width="383" alt="スクリーンショット 2018-06-06 5.43.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/22934/27a8582a-11dc-67e2-80b7-af1310ece0cd.png">

上記画像を参考にして頂きたいが、Unity上で選択しているのは`Beautiful`である。
行選択してる感が出てるよね。

ただし、Unity上でいくらレベルをFantasticに選択して、シュミレーターで反映されていると満足しても、
ビルド後には、プラットフォームごとに**緑色のチェックが入っているQuality**が設定をされる。

この場合は、iOSとAndroidの場合`Good`が**適応**される。

~~一瞬、この緑動かねーんじゃねーのと思い、Unityめんどくせぇってなりかけたけど、僕の思い込みでした。~~

一番下の行の`Default`→`▼ ▼ ▼`と表示されている三角を押下すると
プラットフォームごとのデフォルトを変更することが出来る。

文句の一つでも書こうかとマニュアルを確認すると

>マトリクスの下の Default と書かれた行は画質設定そのものはではありませんが、各プラットフォームで使用されるデフォルトの画質を設定します (列の緑のチェックボックスは、現在、そのプラットフォームに選択されたレベルを表します)

マニュアルきちんと読めてない僕の頭の中が腐ってました苦笑
ransack で一番スマートに AND/OR検索

initializer で頑張ると、いろいろと検索条件が追加できる。
　というのを、今日気づく。ひたすらソース読解。

どうしてもcontrollerは汚したくない。
全画面的に使う条件なので猶更。
かといって、JSで頑張るのはもう嫌…。
というわけで、ransack自体をチューニング。

結果はこちら。
大成功 :rainbow:

```
/config/initializers/ransack.rb
Ransack.configure do |config|
  # tokenize検索 (AND/OR)
  config.add_predicate 'contains_all',
         arel_predicate: 'matches_all',
         formatter: ->(v){ v.split(/[\p{blank}\p{cntrl}\p{punct}\s、・]+/).compact.map {|s| "%#{Ransack::Constants.escape_wildcards(s)}%" } },
         type: :string,
         compounds: false
  config.add_predicate 'contains_any',
         arel_predicate: 'matches_any',
         formatter: ->(v){ v.split(/[\p{blank}\p{cntrl}\p{punct}\s、・]+/).compact.map {|s| "%#{Ransack::Constants.escape_wildcards(s)}%" } },
         type: :string,
         compounds: false
end
```
　

※ arel_predicateにmatchesではなく contを使いたかった
　しかし、contは使用不可(matchesの拡張）
　→　contの実装を解読してformatterを展開する方針で。
　/ransack/adapters/active_record/ransack/constants.rb
※ stringを配列化している関係で、compounds（=any,allの自動生成）が使えない。
　→　個別実装
※　正規表現で日本語の記号が難しい。とりま読点と中黒で逃げる

参考までに、類似のドキュメントをいろいろと。
この情報、少なくてつらかったゎー

## 参考
[公式Wiki](https://github.com/activerecord-hackery/ransack/wiki/custom-predicates)
[公式 サンプル](https://github.com/activerecord-hackery/ransack/wiki/using-ransackers#2-convert-a-user-string-input-and-a-database-datetime-field-to-the-same-date-format-to-find-all-records-with-a-datetime-field-created_at-in-this-example-equal-to-that-date-)
[Ransackで日付検索](http://www.tom08.net/entry/2016/07/19/180127)
[Ransackで年齢検索](https://qiita.com/ryosuke_sato/items/a120ec6acc09c79a95ed)
[RansackでNull許容検索](https://qiita.com/t_fujise/items/2140ee4fe27859369fad)

[正規表現](http://www.kt.rim.or.jp/~kbk/regex/regex.html#CLASSNAME)
[正規表現　全角記号　こちらはrubyでは難しいみたい](http://squid.xii.jp/archives/2010/02/23_000052)
AmazonLinux2.xでFluentdをrootユーザで実行する

# 概要

Amazon Linux 2.x(ami-2724cf58)でtd-agent（v3.1.1-0.el2）をroot権限で実行する方法を残したいと思います
※CentOS7.xも共通なのかは未検証
以下の方法以外にもやり方がありましたら、ご教授いただければ幸いです

# やりかた

1. Amazon Linux 2.xではサービスはすべてsystemctlが管理しているので、**td-agent.serviceのUserとGroupをrootに変更**

    ```ini:/lib/systemd/system/td-agent.service
    [Service]
    User=root
    Group=root
    ~~ 中略 ~~
    ExecStart=/opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
    ExecStop=/bin/kill -TERM ${MAINPID}
    ExecReload=/bin/kill -HUP ${MAINPID}
    Restart=always
    TimeoutStopSec=120

    [Install]
    WantedBy=multi-user.target

    ```
2. serviceファイルの変更をsystemctlに適用する

    ```
    > systemctl daemon-reload
    ```
3. td-agent serviceの（再）起動


# 気になること

Amazon Linux 1.x の実行パラメータに`--use-v1-config` があったが、2.xにはない
追加する場合は、上記のtd-agent.serviceのExecStartに追加すればOK
「lombok.javac.apt.LombokProcessor could not be initialized. Lombok will not run during this compilation」は突然に

java素人です。

あくまで素人の備忘録です。

# 最初に結論

java_homeが最新の10になっていた

# 何が起きたか

ある日テストを実行しようとコマンドを叩きました。

```sh
./gradlew test
```

すると、下記のエラーが表示されてテストが実施出来ない。

```shell-session
lombok.javac.apt.LombokProcessor could not be initialized. Lombok will not run during this compilation
```

プロジェクトの他メンバーは問題なくて自分だけ。

さすがにこれは環境依存かもと思い色々調べると、どうやらjavaのバージョン指定が怪しい様子。

```shell-session
$ echo $JAVA_HOME
(何も表示されない)
```

特段明示的に指定されてないことがわかった

## 現状のjava_homeを調べる

```shell-session
$ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
```

あれ、10になってる

## 明示的にJAVA_HOMEを指定する

```sh
$ vim ~/.zshrc.local
```

以下を追記

```shell-session
export JAVA_HOME=`/usr/libexec/java_home -v 1.8
```

# 参考になった記事

助かりました、ありがとうございます。

https://qiita.com/seri_k/items/e978c1339ce51f13e297
自作したnpm packageをローカルでテストする方法

# 概要
タイトルの通りですが、自作したnpm packageをローカル環境でテストする方法です。

# 基本方針
`npm link` を使う方法が一番楽なのでその方法で説明します。

`npm link` の基本的な使い方は下記の記事が参考になりました。

（参考）[npm linkの基本的な使い方まとめ](https://qiita.com/103ma2/items/284b3f00948121f23ee4)

# テスト対象のnpm package

[aws-lambda-node-logger](https://github.com/nekonomokochan/aws-lambda-node-logger)

# 動作確認用のプロジェクト

[aws-lambda-node-logger-test](https://github.com/nekonomokochan/aws-lambda-node-logger-test)

# テスト対象のnpm package直下に移動し `npm link` を実行する

`npm link` を実行します。

# 「動作確認用のプロジェクト上」で `npm link パッケージ名` を実行する

`npm link @nekonomokochan/aws-lambda-node-logger` のように実行します。

すると下記のようにシンボリックリンクが貼られている事が確認出来るかと思います。

<img width="530" alt="aws-lambda-node-logger-test-node_modules.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/8158d731-ad3f-3f12-1708-3721b55905d5.png">

# 「動作確認用のプロジェクト」上で動作確認を行う

動作確認を行います。
詳細な手順はpackage毎に異なると思うので、省略させて頂きます。

# 後片付けその1（「動作確認用のプロジェクト」から `npm unlink` を実行する）

動作確認が済んだら、linkの解除を行っておきます。

「動作確認用のプロジェクト」直下に移動し以下のコマンドを実行します。

`npm unlink @nekonomokochan/aws-lambda-node-logger`

# 後片付けその2（「テスト対象のnpm package」を `npm unlink` する）

「テスト対象のnpm package」直下に移動し `npm unlink` を実行します。

# 修正版のpackageをnpmに公開する

修正が問題なければ修正版をnpmに公開しましょう。

詳細な手順は割愛しますが、[初めてのnpm パッケージ公開](https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2) という記事が非常に丁寧に解説されており参考になるのでこちらで紹介させて頂きます。

私の場合は [scoped package](https://docs.npmjs.com/getting-started/scoped-packages)（package名の先頭にユーザー名が入る方式）を利用しているので `npm publish --access=public` としています。

（参考）[npmで名前空間を持ったモジュールを公開する方法(scoped modules)](https://efcl.info/2015/04/30/npm-namespace/)

これは余談ですが、package名はグローバルで一意になる必要があるので、自作packageを公開する時はscoped packageを使って名前の衝突を避けるのが無難かと思います。

この記事の内容は以上になります。

最後まで読んで頂きありがとうございます。
GitLabにSSHで接続するまでの手順

# 概要
職場の環境にGitLabが仮設置されたのですが、HTTP接続ではPushのたびに毎回パスワードを聞かれ煩わしいので、SSH接続を利用してパスワード入力なしでpush出来るようにしました。今回、そのための手順をまとめてみた。

# 環境
Server：GitLab Community Edition 10.7.3
Client：Git Bash(Git for Windows 2.17.1)
Client OS：Windows10(1803)

#手順
概略としてはSSHキーの鍵ペア（公開鍵と秘密鍵）を作成し、公開鍵をGitLabに登録。秘密鍵を使ってクライアントからGitLabにアクセスするという手順になります。

- GitLabにユーザー登録、プロジェクト追加（割愛）
- Git Bashのインストール（割愛）
- SSHキーの作成  
 - sshキーファイルを格納するフォルダに移動  
 **$ cd ~/.ssh**  
 - sshキーを作成  
 **$ ssh-keygen -t [鍵タイプ] -f [ファイル名]**

```bash

$ ssh-keygen -t rsa -f gitlab_rsa

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):   // パスワード不要ならすぐリターン
Enter same passphrase again:
Your identification has been saved in gitlab_rsa.
Your public key has been saved in gitlab_rsa.pub.
The key fingerprint is:
SHA256:XZhiuvhCcZYuGVK6loKtMQGYY0+KfY2VHuXWiuAF6tE
The key's randomart image is:
+---[RSA 2048]----+
|..  .  o.        |
// 省略
|     ..          |
+----[SHA256]-----+

```

- GitLabにSSHキーの公開鍵を登録  
 - C:\Users\hoge\\.ssh\gitlab_rsa.pubをエディタで開き、すべての内容をコピーする。 
 - GitLabの[User Settings－SSH Keys]を開き、[Key]に公開鍵の内容を貼り付ける。
 - [Title]に適当な名前を付けて[Add key]を押す  
![gitlab-ssh.png](https://qiita-image-store.s3.amazonaws.com/0/41649/917eade6-f3a7-f0e7-cc2c-227589b15ce4.png)

- GitLabアクセス時のSSHキーを設定
 - ~/.ssh/configファイルにGitLabで使用するSSHキーを記述する。
 - configファイルがなければconfigファイルを作成  
 **$ touch config**

```config

Host local-gitlab  // ホスト
	HostName local-gitlab  // ホスト名
	User hoge // ユーザー名
	IdentityFile ~/.ssh/gitlab_rsa // 秘密鍵ファイル
```

- GitLabからクローンする
作業ディレクトリに移動して、次のコマンドを入力するとリポジトリがクローンされる  
 **$ git clone git@gitlab:<username>/test.git**

```sh
$ git clone git@gitlab:<username>/test.git
Cloning into 'test'...
remote: Counting objects: 13, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 13 (delta 3), reused 0 (delta 0)
Receiving objects: 100% (13/13), done.
Resolving deltas: 100% (3/3), done.
```

- GitLabにプッシュする  
**$ touch sample**  
**$ git add sample**   
**$ git commit -m"add sample"**  
**$ git push**

```sh
$ git push
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 228 bytes | 228.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To gitlab:<username>/test.git
   52a6236..91052a0  develop -> develop
```
PHP の可変長引数リストと型宣言を組み合わせると配列のタイプヒントができて便利

個人的な感想ですが、PHP で大きめな規模の開発をする上で、関数の宣言で型の指定を要求できるのは非常に便利だと感じています。
とくに開発に関与するプロジェクトのメンバーが増えたときや、開発期間が伸びて規模が大きくなるにつれて威力が発揮すると思っていて、誰よりも自分が恩恵に預かっています。（自分が自分のI/Fを誰よりも忘れがちだから）

そんな型宣言ですが、使っていて地味に行き届かない感を抱いていたのが配列とかを使う場合でした。

イメージとしては、こんな関数で `int[]` という要求をしたい場合とか

```php
function sum(array $num): int {
  return array_sum($num);
}
```

仕方が無いから、必要に応じてバリデーションを書いたりしていたのですが、PHP ドキュメントを読んでいたら

> ... トークンの前に、 タイプヒント を付加することもできます。

という、そのものずばりな解決方法がありました。

```php
function sum(int ...$num): int {
  return array_sum($num);
}
```

これは便利！

可変長引数リストは引数の設計に依存するので、I/Fが判り難くなってしまったり使い勝手が悪くなる場合とかもあるとは思いますが、可変長引数リストを使ってラップしたり工夫次第で活用できる場面は多いように思います。

```php
class Collection
{
    public function __construct(array $items)
    {
        $this->registerItem(...$items);
    }
    private function registerItem(ItemInterface ...$items): void
    {
        $this->items = $items;
    }
}
```

書き忘れていたので追記ですが、可変長引数リストが使いやすい理由のもう一つが、「配列変数や Traversable クラスを引数リストに含めることができる」ので、例えば Laravel とかで開発しているときにコレクションをそのまま使えることなんかが非常に便利です。（これに気づいてなかったときは、いちいち `all()` メソッドで配列にしてから渡してた）

```php
$a = collect([1, 2, 3]);
$f = function (int ...$args) {
    return array_sum($args) * 2;
};
$f(...$a); // => 12
```

- [可変長引数リスト](http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list)
- [型宣言](http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration)
PHP7対応プロファイラを試す（XHProfを入れたら502エラーが頻発した件）

# はじめに
株式会社オークファンの佐藤です。
Truly Ergonomic社が新しいキーボードのファンディングを始めたことに動揺している今日このごろです。
https://www.trulyergonomic.com/store/index.php

本記事では、私が半年前にハマった、PHP7環境対応のプロファイラ選びの話をお届けします。


# 前提
高いユーザビリティを保つためには、レスポンス速度は重要です。[サイトが遅ければ遅いほど離脱率が上がる](https://blog.kissmetrics.com/loading-time/?wide=1)のは、もはや周知の事実です。
しかし、それを定量的に測定するのはなかなか大変なこと。そして、原因を追求するのも大変なことです。そこで、弊社のメインサービスである **[オークファン](https://aucfan.com/)** の開発環境にプロファイラを入れることにしました。
これにより、エンジニア側で（だいたい、プログラムを遅くするのはエンジニアの仕業です）問題を早期把握できるようにしています。

オークファンはPHP7 + Nginx環境で稼働しています。プロファイラもPHP7対応版を入れなければいけません。
今回はFacebookが作成したことで有名な[XHProf](https://github.com/phacility/xhprof)の、[PHP7非公式版](https://github.com/Yaoguais/phpng-xhprof)を利用しました。

非公式とはいえ、手順通りにインストールして終わりかと思ったら……

# 502エラーが頻発
ここで大きな問題が発生しました。
プロファイラを入れた途端、リクエストが不定期に、しかし高頻度で502エラーを返すのです。

有料プロファイラとして有名な[Tidewaysのバージョン](https://github.com/tideways/php-xhprof-extension)ならもうちょっと信頼できるかと思ったら、今度は100%の確率で502エラーを返すようになりました。

ぐぐっても似たような現象は出てこないため、PHP7環境一般というより、オークファン固有の問題と考えざるを得ません。
そのあたりを想像しながら、ライブラリを入れ替えたり、コアダンプを取ったりして調査しました。

# 解決
特定のプロファイラを入れたら解決しました。
https://github.com/longxinH/xhprof

（´-`）.｡oO（なんか納得行かない……）
なので、もうちょっと調べてみました。

# なぜ？
異常終了したコアダンプを見ると、メモリ解放系の処理のところで落ちています。

```example.dmp
Core was generated by `php-fpm: pool www            '.
Program terminated with signal 11, Segmentation fault.
#0  hp_fast_alloc_hprof_entry () at /phpng-xhprof/phpng_xhprof.c:1163
1163			XHG(entry_free_list) = p->prev_hprof;
Missing separate debuginfos, use: debuginfo-install php-fpm-7.1.11-1.el6.remi.x86_64
```
この段階でマルチプロセス系の問題かな、と予想しました。

# 実質マルチプロセス

実は、オークファンのサイト上では、**内部で自分にcurlを送っているコード**がいくつかあるのです。

自分にcurlするということは、最低2つのプロセスが同時に存在しているということです。
そのときに、

1. プログラムAが起動し、同時にプロファイラA'が起動する
2. プログラムAが同一サーバーの別プログラムBにCurlする
3. プログラムBが起動し、同時にプロファイラB'が起動する
4. プログラムBが終了し、同時にプロファイラB'が終了する
5. プログラムBの終了時点で、プロファイラB'の終了処理が呼び出される
6. **プロファイラB'の終了処理が、プロファイラ共有のメモリ領域を破壊する**
7. プログラムAが再開するが、プロファイラA'のメモリ領域は破壊されているので異常終了する

といった現象が発生しているのでは？
つまり、うまくいくプロファイラは、関連するリクエストが終了するまでメモリ領域を保管できているのでは？

~~実際、うまくいくソースコードとうまくいかないソースコードを見ると、うまくいく方はメモリの解放位置が違いました。~~
~~PHP_MSHUTDOWN_FUNCTION()とPHP_RSHUTDOWN_FUNCTION()を使い分けることで、マルチプロセスに対応できたのかなと思いました。~~

↑現時点でソースコードを見る限り、原因はこれじゃないかもしれません……

# 結論
（´-`）.｡oO（ライブラリを使う際は幅広く検討しましょう……）

# 最後に
株式会社オークファンでは、~~予想外の要求~~**数百億件のデータ**と戦う、PHPエンジニア・Javaエンジニアを募集中です。
データは使ってこそ価値を持ちます。価値を生むのはあなたのコードです！
ExcelでURLのステータスチェック

Excelの関数等を使って動的サイトのURLをどばぁーっと作って管理してたりしてませんか？
表示確認するときに一旦一覧にまとめて、そこからごっそりクリックしてチェックかけてませんか？
巡回ソフトとか使ってもいいんですが、痒いところに手が届かない感があってどうも。。。

なのでVBAを使ってしっぽりやってみました。

```vb
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private objHTTP As Object

' URLのステータスをチェック。404ページは背景を赤にする
Sub URLStatusChecking()
    Dim c As Range
    For Each c In Selection
        If LCase(c.value) Like "http://*" Or LCase(c.value) Like "https://*" Then
            DoByStatus c.value, c
            'Sleep 200    'サーバに負荷かけたくないときは適宜
            DoEvents      'ESCで離脱
        End If
    Next
    Set objHTTP = Nothing
End Sub

' URLのステータス毎に処理を実行
Function DoByStatus(url As String, c As Range)
    Dim statusCode As Variant
    Dim redirectUrl As String
    
    statusCode = CheckURL(url)
    'Debug.Print url & ": " & statusCode
    
    If statusCode = 200 Then
        '
    ElseIf statusCode = 404 Then
        ' ページが存在しない場合は背景色を赤に設定
        c.Interior.Color = RGB(255, 128, 128)
    ElseIf statusCode = 301 Or statusCode = 302 Then
        ' リダイレクトの場合は再帰的に処理をする
        'Debug.Print objHTTP.GetAllResponseHeaders
         redirectUrl = getLocation(objHTTP.GetAllResponseHeaders)
         DoByStatus redirectUrl, c
    Else
        c.Interior.Color = RGB(0, 255, 0)
    End If

End Function

' URLのステータスをチェック
Function CheckURL(ByVal strURL As String) As Variant
    Dim num As Variant
    On Error GoTo ErrHandler
    If objHTTP Is Nothing Then
         Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
    End If
    
    objHTTP.Open "HEAD", strURL, False
    objHTTP.Send
    
    CheckURL = objHTTP.status
    Exit Function
ErrHandler:
    If Err() <> 0 Then
        CheckURL = "n.a"
    End If
End Function

' ヘッダ情報からLocationのURLを抜き出す
Function getLocation(headers As String) As String
    Dim lines As Variant
    Dim result As Object
    Dim result2 As Object
    Dim url As String
    Dim re As Object
    
    Set re = CreateObject("VBScript.RegExp")
    lines = Split(headers, vbCrLf)
    For Each l In lines
        With re
            .Pattern = "Location: (.*)"
            .Global = True
        End With
        Set result = re.Execute(l)
        If result.Count > 0 Then
            Set result2 = result(0).SubMatches
            For i = 0 To result2.Count - 1
                url = result2(i)
            Next
        End If
    Next
    
    getLocation = url
    
    Set result = Nothing
    Set result2 = Nothing
    Set re = Nothing
End Function
```

やっつけ感満載ですが使い捨てのコードだからいいんです。
そういうスクリプトに限ってやたら使い続けたりするんですが、その時はその時にリファクタリングするなりなんなりすればいいだけなので、これでいいんです（笑）
Raspberry Pi用Zabbixパッケージのビルド

Raspberry PiもZabbixで監視したいなぁ、でもパッケージ公開されていないんだよね、ソースからのインストール面倒だなぁ、とお嘆きの方に、Raspberry Pi上のRaspbianでのパッケージビルド方法を確認したのでご紹介します。

環境としては、以下の環境で確認しました。

ハードウェア： Raspberry Pi 3 Model B
OS： Raspbian Stretch
Zabbix： 3.4.10(2018/06/05現在)

ただし、Raspberry PiのSDカードだけでのZabbixサーバーの運用はお勧めしません。
データベースへの読み書きが大量なので、SDカードの寿命が早く来やすくなってしまうようです。


# Zabbix用リポジトリの登録

まず、作業用のディレクトリに、Zabbixのリポジトリ登録用のパッケージをダウンロードしてインストールします。
下記の例は、Zabbix 3.4用のパッケージです。

別のバージョンのビルドを行いたい場合は、そのバージョン用のリポジトリを登録するようにしてください。

```
$ cd ~/Downloads/
$ wget http://repo.zabbix.com/zabbix/3.4/debian/pool/main/z/zabbix-release/zabbix-release_3.4-1%2Bstretch_all.deb
$ sudo dpkg -i zabbix-release_3.4-1+stretch_all.deb
$ sudo apt-get update
```

新しいリポジトリを登録したら、「apt-get update」を実行して、必ずリポジトリの情報を更新しておいてください。


# ビルド用ツールのインストール

ビルドを始める前に、ビルド作業自体に必要なツールとZabbixのパッケージをビルドするために必要なパッケージをインストールしておきます。

```
$ sudo apt-get install devscripts
$ sudo apt-get build-dep zabbix
```

# Zabbixのソースパッケージの取得

ビルドの環境は準備できたので、ビルドするソースファイルを取得します。

```
$ mkdir Zabbix3.4
$ cd Zabbix3.4/
$ apt-get source zabbix
```

# Zabbixパッケージのビルド

ソースが正常に取得できたら、あとはビルドの実行です。
以下の例は、取得できたソースが、3.4.10であった場合の実行例です。
そして、debuildの引数で「-uc -us」を指定しているのは、パッケージへの署名を行わないためです。

```
$ cd zabbix-3.4.10
$ debuild -uc -us
$ cd ..
$ ls *.deb
zabbix-agent-dbgsym_3.4.10-1+stretch_armhf.deb
zabbix-agent_3.4.10-1+stretch_armhf.deb
zabbix-frontend-php_3.4.10-1+stretch_all.deb
zabbix-get-dbgsym_3.4.10-1+stretch_armhf.deb
zabbix-get_3.4.10-1+stretch_armhf.deb
zabbix-java-gateway_3.4.10-1+stretch_all.deb
zabbix-proxy-mysql-dbgsym_3.4.10-1+stretch_armhf.deb
zabbix-proxy-mysql_3.4.10-1+stretch_armhf.deb
zabbix-proxy-pgsql-dbgsym_3.4.10-1+stretch_armhf.deb
zabbix-proxy-pgsql_3.4.10-1+stretch_armhf.deb
zabbix-proxy-sqlite3-dbgsym_3.4.10-1+stretch_armhf.deb
zabbix-proxy-sqlite3_3.4.10-1+stretch_armhf.deb
zabbix-sender-dbgsym_3.4.10-1+stretch_armhf.deb
zabbix-sender_3.4.10-1+stretch_armhf.deb
zabbix-server-mysql-dbgsym_3.4.10-1+stretch_armhf.deb
zabbix-server-mysql_3.4.10-1+stretch_armhf.deb
zabbix-server-pgsql-dbgsym_3.4.10-1+stretch_armhf.deb
zabbix-server-pgsql_3.4.10-1+stretch_armhf.deb
$
```

これで、debパッケージができたので、あとはaptを使用するか、gdebiを利用するなどしてインストールすればよいでしょう。
ただし、今回ビルドしたのは、署名されていないパッケージです。インストール時に警告されるのでご注意ください。
テーブル内で特定の単語を含む行の背景色を変更する (jQuery,CSS)

ほとんど自分用メモです。

WebGridなどで作ったテーブルのどこかの列に、状態を示す値が入っている場合（送信/未送信 など）、どちらかの値を含むときにはその行の背景色を変えたいというようなケースを想定しています。

参考: http://shiru-web.com/2017/09/03/01-72/

```HTML
// テーブル内の特定の単語を含む行の背景色をピンクに変更

<script type="text/javascript">
	$('td:contains("ここに単語を入れる")').parent("tr").css("background-color", "#FFDBC9");
</script>
```
【備忘録】credentials.yml.encにdatabase設定を保存する

# はじめに

Rails5.2から`credentials.yml.enc`に機密情報を格納させることができるようになったので、databaseの設定を保存させてみました。

# credentials.yml.enc

`credentials.yml.enc`にdatabaseの設定を記述する

```
# credentials.yml.encをviで開く
$ EDITOR="vi" bin/rails credentials:edit
```

```yaml:credentials.yml.enc
db:
  host:     xxxxx
  database: xxxxx
  username: xxxxx
  password: xxxxx
```

# database.yml

`database.yml`で`credentials.yml.enc`に指定した値を利用するように設定する

```yaml:config/database.yml
# 省略
production:
  <<: *default
  # 省略
  host:     <%= Rails.application.credentials.db[:host] %>
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
```

# 所感／宿題
- master.keyを総当たりされると復号できてしまうので、**public**リポジトリではやらないほうがいい
- データベースが1つだけの環境であれば、`credentials.yml.enc`に格納させておくのが楽ちん
- データベースが複数ある環境での運用方法がわからない
ローカルからの認証でOAuth::Unauthorized 401 Unauthorized

まず確認したのは以下。
https://qiita.com/hirokishirai/items/5a43977a38ecd922bfb9

# 解決法
単純にアクセスするURLが間違っていました。
アプリの設定画面は ⇒ http://127.0.0.1:3000
ローカルでアクセスしたURL ⇒ http://localhost:3000

これを、http://127.0.0.1:3000 でアクセスすれば問題なく認証できました。

# 最後に
これで、2日ハマった、、
ARKit2で出来るようになったWorldMapをまとめてみた

# はじめに

[@shu223さんの記事](http://shu223.hatenablog.com/entry/2018/06/05/115031)を参考に、
補足という形にはなりますが、調べた範囲でまとめたいと思います。
また、NDAがありますので、スクショは貼りません。

## ARKit2
今回発表されたARKit2では、大きく6つのアップデートがありました。

### Improved face tracking
舌判定の追加。何に使うんでしょうね(白目)
### Image detaction and tracking
画像の検出とトラッキング。これは1.5からの内容ですね。
### 3D object detection
3D物体の検出
オブジェクトに画像など重ねて貼り付けたりする事ができます。
### Persistent experiences
継続。一度オブジェクトを配置して、移動させたりしても、次からまた同じ状態からスタートできる
### Shared experiences
AR空間の共有。同時に複数人で同じAR空間を見る事ができます。発表された内容では対戦ゲームができます。(現地でやりましたがかなり楽しいです)

今回はこのShared experiencesで主に使われる、ARWorldMapについて調べてみました
## ARWorldMap
ARKitは、現実空間におけるユーザーのデバイスの位置を特定するために使用するすべての空間マッピング情報が含まれています。

また、マッピングのデータなど確認する事ができます。

```swift
//世界地図に記録された空間マッピングデータの粗い表現。
var rawFeaturePoints: ARPointCloud
```

精度は分かりませんが、点群データを取得できればARだけでなく、深度推定などにも応用できそうですね。

このWorldMapをキャプチャするには、あらかじめ空間を認識しておく必要があるみたく、今どのくらい取得するのに適した状態かステータスを確認する事ができます

## ARFrame.WorldMappingStatus
ARKitのフレームがどの程度マッピングを行なっているかの状態
### 取得方法
```swift
func session(_ session: ARSession, didUpdate frame: ARFrame) {
        // frame.worldMappingStatus
    }
```
### WorldMappingStatus
#### notAvailable
WorldMapがまだ利用できない状態

セッションはカメラから見えるデバイスの周りの現実空間のない内部マップ、またシーンを持っていません。
このときに呼び出すと、エラーが発生してしまうので、利用させないような工夫が必要です。

#### limited
WorldTrackingを行うには、現在のデバイス位置の周辺の領域をまだ十分にマッピングしていない状態。
一応この状態でも保存はできますが、読み込み時に位置がずれたりする場合があります。

この状態で保存するのは好ましくないので、もう少し認識させる必要があります。

#### extending
WorldTrackingは現在のデバイスの位置をマッピングしている状態。
デバイスの位置とそこから見えるシーンをマッピングするためのデータを取得できる状態です。

この状態から保存をしても問題なく利用できるとのことです。

#### mapped
この状態であれば問題なくマッピングが高品質な状態で保存できるはずです。
ここから新たに別のデバイスやセッションで読み込みを行うことで、保存したWorldMapのような
位置や状態が再度読み込めれるはずです。

では早速WorldMapの取得方法を見てみましょう

## getCurrentWorldMap(completionHandler:)
実行中のARSessionからWorldTrackingセッションの空間マッピング状態とアンカーのセットをカプセル化したオブジェクトを取得します

取得に失敗した際はnilが返ってきます。安心ですね。

このオブジェクトには、
ARKitがデバイスを移動する物理空間（ARKitがデバイスの位置と向きを決定するために使用する）と、
セッションに追加されたオブジェクト（検出された実際の機能や配置された仮想コンテンツ）の情報が入っています。


## 再読み込み

```swift

if let unarchived = try? NSKeyedUnarchiver.unarchivedObject(of: ARWorldMap.classForKeyedUnarchiver(), from: data),
    let worldMap = unarchived as? ARWorldMap {
    
    // Run the session with the received world map.
    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = .horizontal
    // 読み込んだWorldMapをセット
    configuration.initialWorldMap = worldMap
    sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}
    
```

サンプルでは、NSKeyedUnarchiverを使用して保存・読み込みを行なっています。

読み込みの前に、
1.ワールドマップを共有する前に、送信デバイス上のローカルの空間を認識させておく
2.受信側と送信側のデバイスを隣接さセルこと(両方が同じ環境のビューになるようになります)


## 最後に
こちらの内容は公開されておりますが、変更がある可能性があります。

また、間違いなどありましたらコメントをよろしくお願いします。

参考
http://shu223.hatenablog.com/entry/2018/06/05/115031
Oracle DB接続覚書

Oracle DBへの接続でエラーになることが多いので覚書。12c対象

##データベースの名前
###名前の整理
|名前に関する項目|説明|
|:--------------|:--|
|データベース識別子(DBID)|RMANでDBの識別に利用。スタンバイDBはプライマリDBと同じID。|
|DB名(DB_NAME)          |RACの各インスタンスは同じデータベース名|
|DB_UNIQUE_NAME         |通常DB_NAMEと同じ。プライマリDBとスタンバイDBはDB_NAMEを変えずこれを変更。|
|ドメイン名(DB_DOMAIN)   |RACの場合必須(と書いてあるが構築すると空)。|
|インスタンス名(INSTANCE_NAME)|シングルDBの場合通常DB名と同じ。RACの場合DB_NAMEと異なる。|
|システム識別子(SID)      |通常はインスタンス名と同じだが別にすることも可能。ローカル接続で利用。サーバ内でユニーク。|
|ORACLE_SID              |ローカルDB接続時のSIDを設定しておく環境変更。（但し「. oraenv」コマンドではデータベース名を入力するため、接続時はインスタンス名に変更する必要がある。また、PDB名は設定不可)|
|サービス名(SERVICE_NAMES)|リスナ経由接続先を指定する名前。デフォルト(通常変更しない)はDB_UNIQUE_NAME.DB_DOMAIN。PDBはPDB名.DB_DOMAIN。(複数登録可能で、例えば、RACでサービス名により稼働インスタンスを制限可能)|
|NET_SERVICE_NAME|ネットサービス名、TNSサービス名、接続識別子|クライアントのtnsnames.oraに記載する識別子。通常サービス名と同じにするが、異なる名前でも設定可能|
|GLOBAL_NAME|グローバル・データベース名。DBLINKで利用。(使ったことないので下記参照先）|

###名前の調べ方
```sql
SQL> select DBID from v$database;
SQL> show parameter db_name
SQL> show parameter db_unique_name
SQL> show parameter db_domain
SQL> show parameter instance_name
-- SIDは/etc/oratab参照。SERVICE_NAMESはリスナに登録
SQL> SELECT * FROM GLOBAL_NAME;
```
##接続方法
###sqlplus
|接続タイプ|コマンド形式|説明|
|:--------|:----------|:---|
|ローカル  |ORACLE_SID=システム識別子 sqlplus / as sysdba|OS認証によるsys接続|
|〃       |ORACLE_SID=システム識別子 ユーザ名/パスワード[ as sysdba]|パスワード認証による接続|
|リモート  |sqlplus ユーザ名/パスワード@ネットサービス名|tnsnames.oraに登録された名前で接続|
|〃       |sqlplus ユーザ名/パスワード@ホスト[:ポート][/サービス名]|listenerに登録されているサービス名で接続。|

###JDBC thin接続
|接続タイプ|コマンド形式|説明|
|:--------|:----------|:---|
|リモート  |jdbc:oracle:thin:@ホスト:ポート:インスタンス名|インスタンス名で接続|
|〃       |jdbc:oracle:thin:@//ホスト:ポート/サービス名|サービス名で接続。(//は省略可だがエラーになるケースもあるのでつけておく)|

###補足
+ 接続タイプ
    + ローカル接続はリスナを経由せずDBに接続する。内部接続、BEQ接続とも言う。
    + リモート接続はリスナを経由する。ホスト、ポートは(SCAN)リスナが待機している場所を指定。ホストはIPも可。ポート省略時1521
+ RACの場合
    + サービス名にはDB_UNIQUE_NAME,DB_UNIQUE_NAME.DB_DOMAINの両方が動的に登録
    + SCANリスナは生きているインスタンスにバランスして接続するため通常こちらに接続
    + インスタンスを固定して接続したい場合、(ローカル)リスナに接続する
    + クライアントのtnsnames.oraで接続先インスタンスを制御したい場合も(ローカル)リスナを設定

###参照
+ [データベース名の詳しい説明](https://www.shift-the-oracle.com/config/change-database_name.html)
+ [ネットワーク経由で接続](http://www.oracle.com/technetwork/jp/database/articles/kusakabe/kusakabe-3-4490049-ja.html)
+ [サーバ上でJDBC接続を確認する簡単な方法](http://tc.hatenablog.com/entry/2013/02/07/203846)

###更新履歴
+ 2020/02/13 SID、ORACLE_SID、ローカル接続の説明を修正
VisualStudio2017 > Reactテンプレート(core 2.1) > leaflet


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/092ff9f3-d1a6-73d4-a559-6436236c35fc.png)


### 環境
バージョン：asp.net core 2.1

asp.net core 2.0のReactテンプレートはTypeScriptでしたが、
asp.net core 2.1から、ES6(JavaScript)に変わり、create-react-appで作成されるプロジェクトがベースとなりました。

今回はそこにLeafletを追加します。



## プロジェクト作成

React.jsテンプレートを使ってプロジェクトを作成します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/6205274d-a50c-3725-3419-b7801fe7aaf7.png" width=400 />



## package.json

leafletを追加します。

```
"dependencies": {
    "leaflet": "1.3.1"
}
```


## components

### 不要ファイル削除

ClientApp/src/components/配下の不要なファイルを削除
以下のファイル群はすぱっと消す

* FetchData.js
* Counter.js
* NavMenu.js
* NavMenu.cs

## ファイル修正

### App.js

ファイルを削除したのでルーター設定も変更する。

```react:App.js
import React, { Component } from 'react';
import { Route } from 'react-router';
import { Layout } from './components/Layout';
import { Home } from './components/Home';

export default class App extends Component {
  displayName = App.name

  render() {
    return (
      <Layout>
        <Route exact path='/' component={Home} />
      </Layout>
    );
  }
}
```

### Layout.js

ClientApp/src/components/Layout.js
マップを全画面表示にする。

```js:Layout.js
import * as React from 'react';

export interface LayoutProps {
    children?: React.ReactNode;
}

export class Layout extends React.Component<LayoutProps, {}> {
    public render() {
        return <div id='root'>
            {this.props.children}
        </div>;
    }
}

```

### index.css

ClientApp/src/index.css

マップを全画面表示にするためのCSS設定。

```css:index.css
html, body {
    margin: 0;
    padding: 0;
    height: 100%;
    width: 100%;
}

#react-app, #root, #map, #mapUI {
    width: inherit;
    height: inherit;
    background-color: #fffff;
}
```

### MapWorld.js

ClientApp/src/components/MapWorld.js を追加

※Leafletを表示するコンポーネントとなる。

```js:MapWorld.js
import React, { Component } from 'react';
import * as L from 'leaflet';
import 'leaflet/dist/leaflet.css';

export class MapWorld extends React.Component {
    componentDidMount() {
        let map = L.map('map').setView([35.6693863, 139.6012974], 5);
        let basemapLayer = new L.TileLayer('http://{s}.tiles.mapbox.com/v3/github.map-xgq2svrz/{z}/{x}/{y}.png');
        map.addLayer(basemapLayer);
    }

    render() {
        return <div id="mapUI">
            <div id='map'>a</div>
        </div>;
    }
}
```



### Home.js

Leafletを表示するコンポーネントを表示する。

```js:Home.js
import React, { Component } from 'react';
import { MapWorld } from './MapWorld';

export class Home extends Component {
  displayName = Home.name

  render() {
    return (
        <MapWorld />
    );
  }
}

```

## 結果

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/092ff9f3-d1a6-73d4-a559-6436236c35fc.png)

以上
Python3の環境導入方法

# **はじめに**

## **Pythonの環境構築なんていくらでもあるやん？**

今の時代、Pythonに限らずプログラミング言語の環境構築なんてブラウザで調べればいくらでもでてきます。

ぶっちゃけこの記事書いた理由としては以下の2点です。

1. 初めて書く記事なので、練習として環境構築の内容を取り上げた。
2. Python3を始めたいという方のために、わかりやすい記事を書きたかった。

初めての投稿内容ですが、プログラミング自体がはじめての人にもわかるような記事にしたいと思います。

# **PythonのWebサイトからインストール**

## **公式サイトに飛ぶ**
まずはPythonの公式サイトに行きます(https://www.python.org/)
そうすると以下のような画面が出るはずです。

この画面のAbout Downloads ... Eventsと書いてありますが、Downloadsをクリックしてください。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/142735/f87f52c5-fe46-a67d-3b16-07804ebf2c62.png)

## **Downloads画面**
クリックするとこのような画面が見えるはずです。
ここには過去のバージョンから現在の最新バージョンのpythonがあります。
ここでは最新バージョンのpython3.6.5をクリックしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142735/df46933e-d4a1-ef83-cdfc-97de6f07d2c6.png)


## **インストールOS,バージョン選択画面**
python3.6.5をクリックした後、画面をスクロールすると、このような画面が見えるはずです。
下の画面のようにexecutable installerをクリックしてください。ダウンロードが自動で始まります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142735/6dfd3872-f967-bd67-eeca-026e6aab8e47.png)

## **python3.6.5のインストール**
ダウンロードが終わったらexeファイルを起動してください。そうすると以下のような画面になるはずです。
まず、一番下にあるAdd Python 3.6 to PATHにチェックを入れてください。
その後、Install Nowをクリックすると、インストールが自動で始まります。
 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142735/9369a21a-354f-4ed7-609e-bff7bd4fa11c.png)

インストールが終わるとこのような画面になります。これでPython3のインストールは完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142735/b082444e-14b7-002d-47ec-f1f0a3cdbc28.png)

# **python3の動作確認**

## **pythonの起動**
python3が正常に動作するかどうかを確認します。
Windowsのスタート画面からコマンドプロンプトを起動してください。
起動後、pythonと入力してください。そうすると以下のようになります。(編集雑で申し訳ないです)
この画面は対話モードと呼ばれていて、python独自の機能です。この状態で一文一文プログラムコードを打つことが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142735/217817ed-2955-93bc-4814-c2e85ff0eccc.png)

## **Hello Worldと表示してみる**
print("Hello World!")と入力してみてください。そうするとHello World!と表示されるはずです。
これで実行環境の構築は終了です、お疲れ様でした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/142735/ea779a97-9caa-0562-ddf8-7056e2318d77.png)

# **さいごに**
いかがでしたか？たぶんこれでpython3の環境構築は出来たと思います。
pythonはWebアプリ, AI, 最近ではゲームなどにも使われていて、最近ではとてもメジャーな言語になっています。
是非、勉強されてはいかがでしょうか。
ではでは(^_^)/~

# おまけ(おすすめ開発環境)

### Visual Studio Code
エディタといったらこれ、便利な拡張機能が大量にあります。
これだけで開発環境が構築できます。
 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142735/6f66f81e-9b46-f2a0-8c61-e2268a2be81b.png)
EmbulkでBigQueryに大きい(4G以上の)ファイルを送ろうとしてエラーになる場合の対処法

embulk-output-bigqueryを利用して、BigQueryに大きい(4G以上の)ファイルを送ろうとしてエラーになる際の対処法を聞いたのでメモ。
https://github.com/embulk/embulk-output-bigquery

大きいファイルを送るときに、GZIPオプションを付けたくなるが、BigQuery側では圧縮ファイルの最大ファイル数が小さめ。
そのため非圧縮にして送ればOK。以下の設定を削除する。

```
compression: GZIP
```
非圧縮で5TB以上だとファイルを分割するのがよい。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/249016/e2a29235-80ce-fbb5-e679-5f1a3f830320.png)
エリック・エヴァンスのドメイン駆動設計　第4部14章 継続的な統合、コンテキストマップ、共有カーネル、顧客・供給者の開発チーム　まとめ

## 第4部　戦略的設計
14章　モデルの整合性を維持する

以下は、モデルの整合性を維持するためのテクニック？的な感じの説明なのかなたぶん

- 継続的な統合
- コンテキストマップ
- 共有カーネル
- 顧客・供給者の開発チーム

---

# 継続的な統合

---

継続的な統合　とは(雑)
-

チームみんなでちゃんと話し合って共通認識を作った上で、コピペコードとか書かないでちゃんと実装しよ

---

継続的な統合　あるある
-

- 複数人とかで開発してると同じ機能が重複して実装されたりするよね
- なんか既存の機能よくわからないからコピペして新しい機能実装しよ

→　アカン！

---

継続的な統合　やる意味
-

継続的に実装(コード)とか概念(モデル)とか統合していかないとモデルの正当性や一貫性が保てないよ！

---

継続的な統合　とは
-

> 継続的な統合とは、そのコンテキスト内で行われるすべての作業について、頻繁にマージして一貫性を保つことにより、分派が見られたときにすぐに発見して修正できるようにすることを意味する

*エリック・エヴァンスのドメイン駆動設計 p350*

---

継続的な統合　具体的話
-

- XP(エクストリーム・プログラミング)おすすめ　(アジャイル的な)
- 1日に1回コードをマージする(できるだけ頻繁に統合したほうがいい)
- 自動化テストあったほうがいいよ
- ユビキタス言語の執拗な鍛錬(概念は別々の人々の頭の中で進化していくよ)
- 仕事を必要以上に大きくしないこと(境界づけられたコンテキスト内での話だよ)

---

# コンテキストマップ

---

コンテキストマップ　とは(雑)
-

境界づけられたコンテキストのマップ(図)

　→　コンテキストを意識したモデル(共通概念)の図的なもの

![IMG_2254.JPG](https://qiita-image-store.s3.amazonaws.com/0/70276/f1566617-ca21-0886-3a28-e1f6dcc82db8.jpeg)

---

コンテキストマップ　メリット
-

- チーム全員のモデルを共通化できる
- 説明があいまいにならないですむ
- あいまいな箇所がわかる

---

コンテキストマップ　作り方
-

- ドキュメントじゃなくてもいいけどドキュメントにしたほうがいいと思う(チームがわかっていればなんでもいい)
- それぞれの境界づけられたコンテキストに名前(ユビキタス言語)をつける
- PJにあるモデルのコンテキスト全てに関する全体的な視点
- モデル同士の接点も書く
- わかりにくいところには概略を述べ、強調すべきところは強調して書く

---

コンテキストマップ　注意点
-

-  常にありのままの現状を書く(こうなってほしいとか、今後こういう修正を加えるとかは書かない)
-  コンテキストマップにしにくかったら修正したほうがいい
-  修正したほうがいいなーと思ったらマップにはドラゴンを書いて、一旦おいておく
-  最優先は明確なコンテキストマップを一旦書くこと
-  境界づけられたコンテキストには名前をつける(そした、その名前をユビキタス言語にする)
-  チーム全員がすべての境界を認識し、理解する。また、そのコミュニケーションを惜しまない

---

コンテキストマップ　まとめ
-

> 「ジョージのチームが担当しているものが変更されているから、それと通信するこちら側の部分も変更しなければならない」
↓
「**運送ネットワークモデル**が変更されているから、**予約コンテキスト**向けの変換サービスを変更する必要がある」

エリック・エヴァンスのドメイン駆動設計　　p361

---

# 共有カーネル

---

共有カーネル　とは(雑)
-

あっちのコンテキストからも使いたいし、こっちのコンテキストからも使いたいなーって感じだったら、そこは共通部分にしてしまってもええで！

例：同じAPIを使用している複数アプリのAPI側とか
 ※この例は間違っている可能性があります

![IMG_2253.JPG](https://qiita-image-store.s3.amazonaws.com/0/70276/d99dd1c6-04a7-8841-a783-a3147adde6d4.jpeg)

---

共有カーネル　注意点
-

- 共有カーネルにするかどうかは慎重に検討してね
- 他の設計より簡単に変更できないよ
- 他の部分が1日に1回マージするぐらいの頻度だったら、共有カーネルは週1ぐらいのイメージ
- 変更する場合はそれぞれのコンテキストの関係者の合意が必要(つまりめんどくさい)
- 両方のテストを通過しないとリリースできない

---

# 顧客・供給者の開発チーム

---

顧客・供給者の開発チーム　とは(雑)
-

上流のシステム(API)と下流のシステム(アプリ)の開発をするときは、上流=供給者、下流＝顧客としてPJを進めていくとうまくいくんじゃないかな

---

顧客・供給者の開発チーム　とは(雑)
-

まぁ、お互いのスタンス(顧客・供給者)とルールを決めておくとスムーズに行くよって話

---

顧客・供給者の開発チーム　注意点
-

- 供給者は顧客の要望を尊重する(顧客の要望が基本的には最優先)
- 下流の代表は上流のMTGに参加する(機能の提供の約束とスケジュールを全員で理解する)
- 下流は上流に対する要望を自動テスト化する(下流と上流が協力してテストを作成する)
- 上流はこのテストを毎回実行し、確実に通過するものを納品する
- テストを修正する場合はお互いに話し合う(もちろん実装も変わるしね)
- 利用が単方向である
AzureのFunction AppでGoogleカレンダーAPIを呼び出す

https://developers.google.com/calendar/quickstart/nodejs
上記URLに掲載されているサンプルコードを少し修正して、AzureのFunction Appで実行しようとしたが、うまく動作しない。下記コードのところで、進んでいないよう。

```Js:index.js
//一部抜粋
const authUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES,
  });
```

「コンソールにURLが表示されて、そのURLにアクセスして、Googleアカウントでログインして、アプリケーションを承認して、発行されたトークンをコピーしてコンソールのプロンプトに貼り付ける」
という流れができない。

「高度なツール (Kudu)」のコンソールから実行してやれば（下記）、上記のoauthのプロセスを完了することができた。
`node test.js`
これで承認情報は保存されるので、次回からはFunction Appのタイマーで動かすことができた。

# アプリケーション環境
ランタイム バージョン: 2.0.11776.0 (beta)
nodejs：8.9.4
nodejsがFunction Appのデフォルトのバージョンだと、googleapisが動かなかった。
Atomに最新のPlantUMLを読み込ませる方法 Windows版

# これは何？

Atom＋PlantUML ViewerでER図を書こうと思ったら、プラグインに同梱されているplantuml.jarのバージョンが古くて書けなかったので涙目になってググりながら最新バージョンを導入したときのメモです。

書きたかったER図の解説はこちらです。
[PlantUML で ER 図（ERD）を描く（似非ではないです） \- Qiita](https://qiita.com/Tachy_Pochy/items/752ef6e3d38e970378f0)

このメモを書く前に確認した環境はWindows版なので、Macをお使いの方は[【Atom】最新のPlantUMLをインストールしてbreak文をループ内に書く方法](https://blog.stedplay.com/how-to-install-latest-plantuml-in-atom/)を参照してください。

# 手順

公式サイトから最新のplantuml.jarを[ダウンロード](http://plantuml.com/download)して、PlantUML Viewerが参照しているフォルダにあるjarを置き換えるだけです。

Windows8だと以下のディレクトリ内にplantuml.jarがあります。
他のバージョンもそんなに場所は違わないはずです。

```
C:\Users\ユーザー名\.atom\packages\plantuml-viewer\node_modules\node-plantuml\vendor
```

## バージョンについて

このメモを書いた時点のplautumlの最新バージョンは

```
PlantUML version 1.2018.06 (Mon May 21 19:34:53 JST 2018)
```

でした。
今まで見ていたplantumlのバージョンは

```
PlantUML version 8047 (Fri Aug 26 00:59:30 JST 2016)
```

なので相当古い…。
react-navigation v2でパフォーマンスが落ちたときにしたこと

## 起きたこと
・ react-navigation を 2.0.1にした => タブの切り替えが重い。。(特にandroid)。。体感1~2secかかるようになった。

## 結論
・ バグでした。
　  - 今すぐ2.1.0にバージョンあげましょう
https://github.com/react-navigation/react-navigation/issues/4412

とはいえ、それ以外にもパフォーマンスを改善するためにしたことがあるので以下記録として。。。

## やったこと
・ 可能な限りstateless function を使う
　- listの中はもちろんですが、ボタンやcontainer的に使っているコンポネントも可能な限りstatelessに。
　- 無理な場合で、pureComponentにできるものはPureComponentに

・ listはFlatListを使用。

・ navigationOptionでlazyLoad={true}に変更

・ view コンポネントで不要な要素は消す。必要以上にnestしない

## 所感
・ stateless function にするのは体感値ベースでもかなり変わります。
【AWS SDK for Ruby】describe_instances()の小さなサンプルメモ

AWS SDKv3

# サンプルメモ

```ruby:sample-ec.rb
require 'aws-sdk'

Aws.config.update(
    :access_key_id     => "xxxxx",
    :secret_access_key => "xxxxx",
    :region            => "ap-northeast-1"
)

ec2_client = Aws::EC2::Client.new()
response = ec2.describe_instances()

# ★インスタンスIDの取得
p response .reservations[0].instances[0].instance_id # => "i-xxxxx"
```

# 参考

https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/EC2/Client.html#describe_instances-instance_method
AE　平行四辺形　作成

#斜めのボックスを綺麗に作りたい時のエクスプレッション
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/68c12997-e396-2c8f-6bb7-219ed8de4ec4.jpeg)

前提として
・シェイプレイヤーに４つのポイントを持ったパスがある事が
・シェイプレイヤー自身にスライダーが２つ追加されている事。(今回のエクスプレッションで使用しているだけ)
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/056fb3fd-7cb3-bec6-d205-383a58ae8494.jpeg)

エクスプレッションソース

```js
tw = thisComp.width;　
th = thisComp.height;
Linelength = effect("Line length")("スライダー");
LineShift = effect("Line Shift")("スライダー");
createPath(points = [[0,-th/2], [Linelength,-th/2], [Linelength+LineShift ,th/2],[0+LineShift,th/2],], inTangents = [], outTangents = [], is_closed = true)
```
ST-Link/V2を使ってLPC812にfirmwareを書き込む

###Stlin/V2とyatagarasu V2を接続する。
![stkin_wired.jpg](https://qiita-image-store.s3.amazonaws.com/0/148248/bcc36d27-5876-2324-2156-98c424ab280f.jpeg)

###STLink/V2 pinアサイン

| | | | | | | | | | |  
|---|---|-----|---|-----|----|---|---|---|---|
|19|17|15|13|11|9|7|5|3|1|
|20|18|16|14|12|10|8|6|4|2

###ジャンパ配線



**U10へ書き込む場合**

|STLink/V2|yatagarasu V2|
|---------|-------------|
|2(赤)　　 |SWS_V_G_1    |
|4(黒)    |SWD_V_G_2    |
|7(黃)    |SWD2_CONN1_1 |
|9(青)    |SWD2_CONN1_2 |


**U11へ書き込む場合**

|STLink/V2|yatagarasu V2|
|---------|-------------|
|2(赤)　　 |SWS_V_G_1    |
|4(黒)    |SWD_V_G_2    |
|7(黃)    |SWD2_CONN2_1 |
|9(青)    |SWD2_CONN2_2 |


**U12へ書き込む場合**

|STLink/V2|yatagarasu V2|
|---------|-------------|
|2(赤)　　 |SWS_V_G_1    |
|4(黒)    |SWD_V_G_2    |
|7(黃)    |SWD2_CONN3_1 |
|9(青)    |SWD2_CONN3_2 |

###OpenOCDを起動する。
    miyamoto@ubuntu-16:~$ openocd -f interface/stlink-v2.cfg -f target/lpc812.cfg
    Open On-Chip Debugger 
    0.10.0+dev-00414-gcdf1e82 (2018-06-02-07:47)
    Licensed under GNU GPL v2
    For bug reports, read
	    http://openocd.org/doc/doxygen/bugs.html
    WARNING: interface/stlink-v2.cfg is deprecated, please switch to interface/stlink.cfg
    Info : auto-selecting first available session transport "hla_swd". To override use 'transport select 
    <transport>'.
    Info : The selected transport took over low-level target control. The results might differ compared to    
    plain JTAG/SWD
    adapter speed: 10 kHz
    adapter_nsrst_delay: 200
    Info : Listening on port 6666 for tcl connections
    Info : Listening on port 4444 for telnet connections
    Info : Unable to match requested speed 10 kHz, using 5 kHz
    Info : Unable to match requested speed 10 kHz, using 5 kHz
    Info : clock speed 5 kHz
    Info : STLINK v2 JTAG v29 API v2 SWIM v7 VID 0x0483 PID 0x3748
    Info : using stlink api v2
    Info : Target voltage: 3.234098
    Info : lpc812.cpu: hardware has 4 breakpoints, 2 watchpoints
    Info : Listening on port 3333 for gdb connections
 


###telnetでlocalhostのport 4444に接続してfirmwareを書き込む。
    miyamoto@ubuntu-16:~$ telnet localhost 4444
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    Open On-Chip Debugger
    > reset halt
    target halted due to debug-request, current mode: Thread 
    xPSR: 0xf1000000 pc: 0x1fff0008 msp: 0x10000ffc
    > flash write_image erase /home/miyamoto/git/junkyard/uubridge/build/uubridge.elf
    auto erase enabled
    target halted due to breakpoint, current mode: Thread 
    xPSR: 0x61000000 pc: 0x10000004 msp: 0x10000104
    Verification will fail since checksum in image (0x0000030d) to be written to flash is different from 
    calculated vector checksum (0xefffddbe).
    To remove this warning modify build tools on developer PC to inject correct LPC vector checksum.
Lumberyardに触れる(1)-Lumberyard紹介編


※2018年1月17日時点の情報です。

[Lumberyardに触れる(2)-インストール編 →](https://qiita.com/OrotiYamatano/items/81db95cf326da0b77a06)

世の中には様々なゲームエンジンがある。
その中でLumberyardというエンジンのベータ版がダウンロード出来る。
Unity、Unreal Engineの次に続くと言われているイカしたヤツだ。（ホントかよ？）
ゲーム業界人のプログラマとしては一人としてコイツを触らないわけにはないだろうと触ることにした。
せっかくなので内容を展開していきたい。
#Lumberyardって何？
- Amazonが作ったゲームエンジン！
CryEngineというゲームエンジンを元に作られている。
CryEngineはCrytek社が開発しており、日本では馴染みは薄いが海外では人気ともいるゲームエンジンだ。
とはいえLumberyardはCryEngineを元にしているとはいえ、元のソースコードは50％以下。ほぼ新規の物と言える。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/a02a1bd0-b03a-9855-84a3-504787f75ec0.png)

サンプル動画
https://www.youtube.com/watch?v=JXPA0LOf9JA
↑公式動画

#どんなゲーム作成に向いているか
- 一人称シューティング
- サバイバルおよびサンドボックスゲーム
- レースゲーム
- スポーツゲーム
- MOBA (複数プレーヤーに対応したオンライン　バトルフィールドアリーナ) ゲーム

#私が思う欠点
- Amazon以外の代替Webサービス使用は禁止
- まだBETA版のため動作が少し不安定
- 2Dゲームには特化していない
- 対応プラットフォームがまだ少ない
- ゲームスクリプト言語がLuaのみ

#私が思う利点
- Twitchとの連携機能
- 完全無料(改造したエンジンの配布は禁止)
AWS カスタマーアグリーメント
https://d1.awsstatic.com/legal/aws-customer-agreement/AWS_Customer_Agreement_Japanese.pdf
AWS サービス条件(57番にAmazon Lumberyard Engine)
https://aws.amazon.com/jp/service-terms/

- サポートやチュートリアルが(英語だが)充実
- ScriptCanvasでコーディングをしなくてもゲームが作れる
- Lumberyard Cloud Gemでクラウド接続型の機能をゲーム用に簡単に作成可能

#対応プラットフォーム
- PC・Xbox One・PlayStation4
- iOS(iPhone5S以降及びiOS 7.0以降)
- Android(Nexus5同等程度、OpenGL3.0以降)
- WindowsやLinuxで動作する専用サーバをサポート
- MacOS
- AppleTV

#エンジンの推奨動作環境
- Windows 7（64 ビット）
- 8GB以上の RAM、60 GB のハードディスク
- 3GHz以上のクアッドコアプロセッサ、2GB 以上、DX11以上の互換性のあるビデオカードを搭載するPC
- Windows 10（64 ビット）もサポート

#まとめ
BETA版と言うこともあって動作が不安定であり、廃止予定機能(LEGACY)が盛り込まれている。
まだ商用利用としては適さない印象。
しかし、実績ある会社と連携しゲームエンジンが作られている為、使い勝手や操作感は中々良く、動作実績もある為、信頼できる。
今後が期待できるゲームエンジン。
PHPStormで"multiple definitions exist for class"の解決方法

PHPStormで、 `multiple definitions exist for class` の警告がたくさん出て困っていたのですが解決方法を見つけました。


## 原因

プロジェクト内に `*.phar` ファイルがある場合、PHPStormは phar内のライブラリも探索対象にしてしまうので、ライブラリが重複して存在することになってしまう。

## 解決方法

「プロジェクト」ビューから、 pharファイルを右クリック → "Exclude phar from project"

<img width="366" alt="Screen Shot 2018-06-05 at 15.06.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/18740/2bd05bf9-f168-6029-0fa6-2350ca4dc7cc.png">