OmniAICreator/Qiita-1.07M huggingface dataset:
opencvのcvtColorで遊んでみた

画像にはRGBやグレースケール、HSVなどいろいろな形式？で表せる。
それを一発でそれぞれに変換できるopencvのcvtColorなるもので、わが大学の世界一おいしい学食を変換して遊んでみた。

## 元画像がこれ(RGB)
<img src='https://qiita-image-store.s3.amazonaws.com/0/195882/0285debc-aafd-c8a5-7660-e84f71eddd63.jpeg' width=50%>


## グレースケール
```python
img = cv2.imread('butamiso.jpg')
img_gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
```
めっちゃ趣でた
<img src='https://qiita-image-store.s3.amazonaws.com/0/195882/7cbe5b4e-e941-924a-ff25-979d04dff5d6.jpeg' width=50%>

##YCrCb
```
img_ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
```
ゴミみたい
<img src='https://qiita-image-store.s3.amazonaws.com/0/195882/e12bc73b-55f3-11fe-20f6-3602f8609719.jpeg' width=50%>


## HSV
```python
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
```
カビが生えたみたい
<img src='https://qiita-image-store.s3.amazonaws.com/0/195882/c153888e-0afe-92d6-31a4-ce065659f353.jpeg' width=50%>

## XYZ
```python
img_xyz = cv2.cvtColor(img, cv2.COLOR_BGR2XYZ)
```
とにかくやばい。宇宙人が食べていそう。
<img src='https://qiita-image-store.s3.amazonaws.com/0/195882/9910337a-5e94-7b02-6df1-f44d480c5dec.jpeg' width=50%>

## まとめ
特に意味のないことをやっていた。
この中で使うのってグレースケール変換くらいなのかな？
Xcodeプロジェクトの設定でStatus Bar Styleを変更すると実機ビルドできなくなる

# 検証環境
Xcode 9.1
Swift 4.0
iOS 9.1.1
端末 iPhone X

# 問題
Xcodeプロジェクトの設定（左側のプロジェクトナビゲータの青いやつ）/TARGETS/アプリ名/Generalの、
Deployment InfoのStatus Bar StyleをDefaultからLightに変更したところ問題が起きました。

# エラーメッセージ
```
App Installation failed
An unknown error has occurred.
```

#　対処法
その項目変更を元に戻す
それでもだめな場合は実機からアプリを削除する
Xcodeを再起動する
など。
Laravel5 で別環境（APP_ENV）で artisan コマンドを実行

`--env={APP_ENV}` オプションを指定することで、DBの接続先など `.env.{APP_ENV}` の中身を読み込んでコマンドを実行してくれる。


```bash
# .env.testing を読み込んで migrate と seed を実行
php artisan migrate --seed --env=testing
```

「テストを別DBで実行するため、事前にマイグレーション走らせておきたい」というときなどに便利。
opencvのめっちゃ基本的な操作

学校で画像処理をするので、opencvってかプログラミンから学び始めてた。
忘れっぽいんで、基本的な操作を備忘録的に。（随時更新）

## インポート
```python:
import cv2
```

## 画像読み込み
```python
img = cv2.imread('test.jpg')
img_gs = cv2.imread('test.jpg', 0) #グレースケール
```

## 画像表示
```python
cv2.imshow('img_show', img) #img_showという名前で表示している
cv2.waitKey(0)
```

## 画像を保存
```python
cv2.imwrite('write.jpg', img) #write.jpgという名前で保存している
```
Maven3 エラーメモ

# Maven3 エラーメモ

### maven-assembly-plugin:single failed: group id 'xxxxxx' is too big

依存しているjarをtar.gzでまとめようとしたら、assembly:singleが失敗した。
[FAQ](https://maven.apache.org/plugins/maven-assembly-plugin/faq.html#tarFileModes) を確認したらこう書いてあった。

> Tar complains about groupid value being too big
GNU tar has restrictions on max value of UID/GUID in tar files. Consider using the more well defined POSIX tar format, which should support larger values. Use tarLongFileMode=posix in the assembly:single goal.

```xml:pom.xml
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
          ...
          <tarLongFileMode>posix_warn</tarLongFileMode>
        </configuration>
        ...
      </plugin>
      ...
    </plugins>
```
高速シェルスクリプト(sortコマンド編)

## 前書き
Qiita初投稿です。よろしくお願いします。


シェルスクリプトを使って面倒な仕事をささっと片付けよう！

シェルスクリプトは主にちょっとした仕事を短時間で実装し、結果を得るのに向いています。
今回はよく行う「ユニーク数を数える処理」を早く実装し、早く結果を出そうと思います。


## 使用したマシンのスペック等
SSD 512GB
CentOS7
シェル: bash
CPU: Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz  


## サンプルデータ
テキストファイルからMeCab+NEologdで抽出した地名。(MeCabが地名と判断したもの)
4億行のtextファイル!

```
$ wc -l extracted_geo.txt # 行数 (= 抽出された地名の数)
488139214 extracted_geo.txt
$ head -n 30 extracted_geo.txt # ファイルの中身(先頭30行)
カレー
中東
岩井
日光
横浜
ベネチア
静岡
大学前
玉取
ケンタッキー
沖縄
函館
広橋
三橋
一日
東京
大阪
バッキンガム
三上
石川
8号
秋葉原
新台
サンセイ
東京
ムリ
福岡
関東
和歌山
関西
$ du -m extracted_geo.txt # データの大きさ(MB)
4037	extracted_geo.txt
```

余談ですが、MeCab( http://taku910.github.io/mecab/ )とは日本語の形態素解析器であり、日本語の文章を与えると、品詞を解析してくれたり、分かち書きをしてくれたりする優れものです。
NEologdは、多数のWeb上の言語資源から得た新語を追加することでカスタマイズした MeCab 用のシステム辞書です。詳しくは下記URLを参照してください。
https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md

## 地名が何種類含まれているか知りたい
サンプルファイルには地名が重複して入っています。
このファイル中に何種類の地名(ユニーク数)が含まれているか、調べてみましょう。

何も考えずにスクリプトを組むと、

```
$ time cat extracted_geo.txt | sort | uniq  | wc -l
^C

real	108m14.580s
user	108m5.770s
sys	0m1.845s

```

のようになりますが、これは100分経っても終わりませんでした。ちーん

## 高速化
2バイト文字に対応したために、sortコマンドが遅くなってしまっているらしいので、英語環境で実行しました。

コードの意味を日本語で表すなら、「(英語環境で)extracted_geo.txtの中身を標準出力し、行方向にソートして、同じものが続くなら一つにしたあと、行数を数える」という具合でしょうか。
単純に英語環境にしてみた結果、爆速になりました!

```
$ time cat extracted_geo.txt | LANG=C sort | uniq | wc -l
554332

real	3m36.962s
user	3m47.305s
sys	0m10.531s
```

引数にファイル名を与えるとさらに高速化!
user timeが増えていることから、並列化が有効になったと推測されます。

```
$ time LANG=C sort extracted_geo.txt | uniq | wc -l
554332

real	3m5.450s
user	8m43.576s
sys	0m6.934s
```

上記のコマンドはstable sortが無効になっていたので有効にしてみました。

最終形態！

```
$ time LANG=C sort -s extracted_geo.txt | uniq | wc -l
554332

real	2m59.063s
user	8m35.422s
sys	0m6.600s
```

ちょっと高速化!

標準入力で、データを与えるのではなく、引数にファイル名を与えてsortするときに、top -H で実行の様子を見たら、並列化されていることがわかりました。

のべ4.8億件の地名があったのに、55万程度しか種類がありませんでした。
sortは一般的に計算量がO(nlogn)だが、約4.8億行のソートに3分程度しかかかりませんでした。

## 結論
sortコマンドを使う時は、特に必要がなければLANG=Cを先頭につけましょう！

## 余談等
今回の処理ではわざわざsortをする必要はないですが、実装が楽(数秒で済む)なので上記のようなスクリプトを書きました。データの統計を短い実装時間で求めたいときにはシェルスクリプトをつかうことを考えてもいいとおもいます。
データ量がさらに多い場合や、何度も繰り返しする処理であるならば、シェルスクリプトを書かずに高速な言語でプログラミングをした方がいいと思います。 
シェルスクリプト(シェル芸)に限った話ではありませんが、使い所を考えることは大事ですね。
間違い等あればご指摘よろしくお願いします。
nvidia-dockerがver.2になったよ

## nvidia-dockerのバージョンが上がった
[nvidia-docker](https://github.com/NVIDIA/nvidia-docker)のversion 1.0がdeprecatedになりました。

使い方が以下のように変わります。

```bash
nvidia-docker run --rm nvidia/cuda nvidia-smi # これまで
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi # これから
```

version 2.0のインストール前には綺麗にversion 1.0を消さないといけません。[Installation](https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0))をしっかり見て更新しましょう。下には参考程度に現段階におけるUbuntu16.04での更新手順を載せます。


## Ubuntu16.04における更新手順
### 旧バージョンの削除
nvidia-docker (ver.1)によって開始された**全てのコンテナを停止**した後、

```bash:ubuntu
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge nvidia-docker
```

### 新バージョンのインストール
```bash
curl -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
sudo tee /etc/apt/sources.list.d/nvidia-docker.list <<< \
"deb https://nvidia.github.io/libnvidia-container/ubuntu16.04/amd64 /
deb https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/amd64 /
deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64 /"
sudo apt-get update

sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd
```
タイムアウト時のError(NSError)判定を短く書くのはどうでしょうか

## 結論

例えば次のようなExtensionどうよ、というのを思いついた。

```swift
extension Error {
    var isTimeOut: Bool {
        let nsError = self as NSError
        return (nsError.domain == NSURLErrorDomain && nsError.code == NSURLErrorTimedOut) ? true : false
    }
}
```

## 導入

FoundationのNSErrorでタイムアウトかどうかを判定する時、ErrorをNSErrorにキャストしてたりすると処理が冗長になったりする。

例えばこんな感じ

```swift
let nsError as error
if nsError.domain == NSURLErrorDomain && nsError.code == NSURLErrorTimedOut {
  // タイムアウト
}
```

このような2つの定数と比較するの短くしたいよねっていう思いつきの話です。

んで、APIKitを使っていると、SessionTaskErrorのenumからErrorを取り出さないといけなかったりする。

```swift
// APIKitのSessionTaskError

public enum SessionTaskError: Error {
    /// Error of `URLSession`.
    case connectionError(Error)

    /// Error while creating `URLReqeust` from `Request`.
    case requestError(Error)

    /// Error while creating `Request.Response` from `(Data, URLResponse)`.
    case responseError(Error)
}
```

ViewControllerでエラーに従ってハンドリングしたくなった場合はViewControllerでまずerrorを取り出して...とかやってるとコード読むの大変だなと。

```swift
if let error = error {
    if case .connectionError(let urlSessionError) = error, nsError.domain == NSURLErrorDomain && nsError.code == NSURLErrorTimedOut)
                 urlSessionError.isTimeOut {
```

なので、最初の結論に上げたようにExtensionでやったらどうなのよってのを思いついたわけです。

もちろん最初のコードは一行で書けるのでそこは好みや決めでいいとは思います。

```swift
extension Error {
    var isTimeOut: Bool {
        return (self as NSError).domain == NSURLErrorDomain && (self as NSError).code == NSURLErrorTimedOut
    }
}
```

最初、何で三項演算子使ってたかというと、条件判定の.domainと.codeが条件通りかどうかというのと、このメソッドがtrueかfalse返すのは結果がたまたま同じだから、その結果は別という考えがあるからです。理解されないかもしれないけど、条件は条件、結果は結果として表現したい。だからそのまま結果を返さなかったというわけです。

みなさんはどんな感じでしょうか？

## 追記

こうすれば簡単に比較できるんでextensionなんて作らないほうが良さそうですね...

```swift
if let error = self as? URLError, error.code == URLError.timedOut {
    return true
}
```

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">as URLError とか as CocoaError としてやると、codeにenum型がついていいですよ</p>&mdash; おもちメタル (@omochimetaru) <a href="https://twitter.com/omochimetaru/status/1067698153644744704?ref_src=twsrc%5Etfw">2018年11月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
キュー〇ー3分で作れるBitcoin Block Explorer

# 前置き
Bitcoin Block Explorerを作ってみたかった。それだけ。
キュー〇ーは関係ないです。けど、ダウンロード時間を除けばすぐにできます。3分は釣りですごめんなさい。

# 出来上がるもの
![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/c4b1e1af-7ae2-475d-f874-6cae6608cfb9.png)

# 用意するもの
- Ubuntu 14.04 (他のOSでもたぶん可能)
- 愛情

# 作り方
ほとんど[ここ](https://bitcore.io/guides/full-node/)に書いてあるとおりです。
下準備をします。

```
sudo apt-get update
```
nvmを用意します。(https://github.com/creationix/nvm)

```
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
```
※この後言われた通りに`~/.profile`に追記などしてください。追記後は`source ~/.profile`を。

Nodeをインストールします。

```
nvm install v4
```
ØMQなどをインストールします。

```
sudo apt-get install libzmq3-dev build-essential
```
メインのものをインストールして起動します。

```
npm install -g bitcore
bitcored
```

完成:relaxed:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/c4b1e1af-7ae2-475d-f874-6cae6608cfb9.png)


# 補足

- 起動して放置しておけば勝手に同期してくれます。140GBぐらいのデータ(2017年11月)を数日かけて取ってきます。
- ブロックチェーンのサイズは[Blockchain Size - Blockchain](https://blockchain.info/ja/charts/blocks-size)から見れます。綺麗。
- 私がやってるときは[エラー](https://github.com/bitpay/bitcore/issues/1454)がでました。anduckさんのプログラム書き換え案で動くようになりました。
- 設定をいじればBitcoinライクな通貨のExplorerが作れるらしいです。[MonacoinのExplorer](https://mona.chainsight.info/)とかもあります。同様にDogecoinとかのExplorerとかも作れるはずです。
- デフォルトでWebAPIが備わってます。insightで出来てるであろう公開されているサイトがいくつかありますが、API使えます。タダ乗りできますが、信用度は微妙なのでオススメしません。[GitHub - bitpay/insight-api](https://github.com/bitpay/insight-api)
- Vagrantで試しました。使ったVagrantfileは以下のものです。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
  end
end
```

# 宣伝
フォローお願いします🍞[@redshoga](https://twitter.com/redshoga)
MQL4のプロファイリング Symbol()を初期化するのは正解か

#はじめに

みなさんプロファイリングしてますか？
MQL4のIDEにはプロファイリング機能が備わっているので使ってみましょう
(プロファイリングで設計が間違っていたことに気がついて改修するので暇つぶしで書いてます。。)


# 経緯
やってみればわかりますが、大抵のプログラムはロジックの部分がボトルネックになっているはずです。

特に
```iRSI(...)```とか```iCustom(...)```とかのi系関数
は厄介です。

ロジックが複雑になればなるほどこれらの関数の呼び出し回数が増え、コストが馬鹿にならなくなります。

# 対処
基本的な対応は変数に格納してしまうことです。関数の呼び出しはコストが高いからです。

例)

```
double a;
string SYMBOL = Symbol();
int PERIOD = Period();

double ret;
a = iRSI(SYMBOL, PERIOD, 2, PRICE_CLOSE, 0);
for (int i=0; i<1000; ++i){
    ret += a;
}
```

`string SYMBOL = Symbol();`をグローバルで宣言するとSymbol()関数の呼び出し回数が減って高速化が図れるわけですね。

Symbol()を変数に格納して使用することで測定値で約1.5倍の速度になりました。


# では他の記述方法ではどうか
例えばiRSI関数の引数はこんな感じですが
```iRSI(symbol, timeframe, period, applied_price, shift)```

第1引数は次の4通り

 - NULL
 - Symbol()
 - SYMBOL ← 変数に格納したSymbol()
 - "USDJPY"

第2引数は次の5通り

 - NULL
 - Period()
 - 0
 - PERIOD ← 変数に格納したPeriod()
 - PERIOD_CURRENT

第3引数は定数なので無関係

第4引数は2通り

- PRICE_CLOSE
- 0 ←対応する実際の数値

第5引数は定数なので無関係

と5x4x2 = 40通りの記述方法があります！

ではどの記述方法が一番速いのか？

# 結論
プロファイリングの結果を載せようと思いましたが、コピペが面倒なので割愛します。(速い)>(遅い)で書いてます。

 - Symbol系 
"USDJPY" ≒ SYMBOL ≒ NULL >> Symbol()
当然の結果のように思います。

 - Period系
NULL > 0 ≒ PERIOD_CURRENT ≒ PERIOD >> Period()
意外なことにNULLが最も高速でした。

 - applied_price系
 0 ≒ PRICE_CLOSE
ほぼ差はありませんでした。

不等号の基準は

 - 「>>」: 明確な差があった
 - 「>」: 明確な差は無いものの、順位は入れ替わらなかった
 - 「≒」: 順位が入れ替わることがあった

です。測定では次のコードを使いまわしてそれぞれ10回ほど回しました。

```
int cnt = 1000;
int PERIOD = PERIOD_CURRENT;
string SYMBOL = Symbol();
int PRICE_KIND = PRICE_CLOSE;

void a(){
   double a;
   for (int i=0; i <cnt; ++i){
      a = iRSI(SYMBOL, NULL, 2, PRICE_CLOSE, 0);
   }
}

void b(){
   double b;
   for (int i=0; i <cnt; ++i){
      b = iRSI(SYMBOL, 0, 2, PRICE_CLOSE, 0);
   }
}

void OnStart(){
   for (int i=0; i<100; ++i){
      a();   
      b();
   }
}
```
DialogflowのUnity SDKはiOSで動かない

#はじめに

タイトルの通りです。Assetstoreのレビューにも書いてありますが、iOSでは動きません。Editorだと大丈夫なんですが。スレッド関係のエラーのように見えますが、どうやって直して良いかわかりません。

#どうするか

[REST API](https://dialogflow.com/docs/reference/agent/)を自分で叩いた方が良さそうです。自分は[Best HTTP(Pro edition)](https://www.assetstore.unity3d.com/jp/#!/content/10872)を使ってます。他のアセットも試しましたが、一番ストレスなく使えるのはこれでした。iOSでも安定して動作します。

<img width="784" alt="capture.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/58503/055accb2-03a6-a8af-cd34-199f05966a3d.jpeg">

サンプルコードはこんな感じです。

```csharp:TestBestHTTP
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BestHTTP;

public class TestBestHTTP : MonoBehaviour {

    public void OnClick(){
        HTTPRequest request = new HTTPRequest(new System.Uri("https://api.dialogflow.com/v1/query?v=20150910&lang=ja&query=声調の勉強&sessionId=12345&timezone=Asia/Tokyo"), OnRequestFinished); 
        request.AddHeader("Authorization", "Bearer c***f");
        request.Send();    
    }

    void OnRequestFinished(HTTPRequest request, HTTPResponse response)
    {
        Debug.Log("Request Finished! Text received: " + response.DataAsText);
    }
}
```
Headerに"Authorization"として"Bearer Client access token"が必要です。Client access tokenはDialogflowのエージェントの設定画面から取ってきます。

![c.png](https://qiita-image-store.s3.amazonaws.com/0/58503/69a20615-136e-7626-e167-7aaa00894dfc.png)


あと、URLにv=...でバージョンを入れる必要があります。これらについては[ここ](https://dialogflow.com/docs/reference/agent/)を参照。言語(lang)とsessionIDも指定します。

すると、JSON形式でレスポンスが返ってきます。

```json
{
  "id": "4*****8",
  "timestamp": "2017-11-15T09:42:31.482Z",
  "lang": "ja",
  "result": {
    "source": "agent",
    "resolvedQuery": "声調の勉強",
    "action": "",
    "actionIncomplete": false,
    "parameters": {
      "Tones": "声調"
    },
    "contexts": [],
    "metadata": {
      "intentId": "6*******e",
      "webhookUsed": "false",
      "webhookForSlotFillingUsed": "false",
      "intentName": "L*****h"
    },
    "fulfillment": {
      "speech": "<speak> <audio src=\"h******** </speak>",
      "messages": [
        {
          "type": 0,
          "speech": "<speak>\n<audio src=\"h*****</speak>"
        }
      ]
    },
    "score": 1.0
  },
  "status": {
    "code": 200,
    "errorType": "success",
    "webhookTimedOut": false
  },
  "sessionId": "12345"
}
```
一つ一つの意味については[こちら](https://dialogflow.com/docs/reference/agent/query#get_and_post_responses)を参照。

## 終わりに
公式のSDKでiOSにして欲しいですが、デベロッパーさんのアクティビティがだいぶ低いようなので望み薄です。自分でなんとかした方が良さそうです。
C/C++ から Cython によって生成されたコードを呼び出す(Mac版)

# 本日は

先日書きました

[C/C++ から Cython によって生成されたコードを呼び出す(Windows版)](https://qiita.com/SatoshiTerasaki/items/0df5970eebf9e0ab4031)

のMac版をやってみましょう．Pythonは pyenv でのどれかの環境を用いているものとします．

# Cythonコードを用意

頂点構造体を定義して座標を２倍にした頂点構造体を返す関数を作ってみましょう．

```cython:cytest.pyx
cdef public struct Point:
    double x
    double y

cdef public Point DoubleCoord(Point p):
    cdef Point q
    q.x=2*p.x
    q.y=2*p.y
    return q
```

`setup.py` も用意しましょう．

```py3:setup.py
from distutils.core import setup 
from Cython.Build import cythonize

setup(ext_modules=cythonize("cytest.pyx"))
```

# コード生成

```shell-session
$ python setup.py build_ext --inplace
```

こうすることで　　`cytest.h` `cytest.c` が生成されるはずです．

# 呼び出しコード作成

下のようにコードを書いてみましょう．


```C:call.c
#include <stdio.h>
#include <Python.h>
#include "cytest.h"

int main(int argc, char const *argv[])
{
    Py_Initialize();
    struct Point p;
    p.x=3.0;
    p.y=4.0;
    struct Point q = DoubleCoord(p);
    printf("Hello\n");
    printf("q.x=%f,q.y=%f\n",q.x,q.y);
    Py_Finalize();
    /* code */
    return 0;
}
```

ここで注意したいのが `cytest.h` をインクルードする前に `Python.h` をインクルードしないと

```shell-session
error: unknown type name 'PyMODINIT_FUNC'
```

と怒られちゃいます．

# レッツビルドの前に

ここでは pyenv 環境での 3.5.4 の場合で試してみます．

```shell-session
$ pyenv global
3.5.4
```
まず `Python.h` がどこにあるのかを確かめないといけません．
結論としては

`$HOME/.pyenv/versions/3.5.4/include/python3.5m`

となり，　Finder で眺めるとヘッダーファイルが並んでいると思います．

<img width="1277" alt="スクリーンショット 0029-11-15 午後6.53.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/135978/011a04ba-a53a-78b5-19d9-3b8a792ae09a.png">

リンかーがライブラリを探すので場所を教えないといけません．`include`と同階層に`lib`というのがあるのでここを眺めましょう．　

<img width="880" alt="スクリーンショット 0029-11-15 午後6.57.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/135978/5b56ade6-decc-bfa8-642a-9e1ca8a5883f.png">
 
見つかりましたね．

# レッツビルド

[コンパイラ(gccコマンド)の使い方](http://www.ysr.net.it-chiba.ac.jp/data/cc.html)

を参考に恐る恐る書いてみましょう．

```
gcc -Wall -I $HOME/.pyenv/versions/3.5.4/include/python3.5m -L $HOME/.pyenv/versions/3.5.4/lib -lpython3.5m call.c cytest.c
```

そうすると実行ファイル`a.out`ができるので

```shell-session
$ ./a.out 
Hello
q.x=6.000000,q.y=8.000000
```

と頂点座標が２倍になる様子が確認されました．
これでC/C++からPythonを呼び出せますし，　逆もCythonを介して呼び出せるのでどの方向からでも連携できるようになりました．
defined?の罠

たった一行のプログラムにはまったのでメモ

``` ruby
# variable_flagは未定義とする
variable_flag = defined?(variable_flag) ? true : false
puts variable_flag # true
```

``` ruby
# variable_flagは未定義とする
_variable_flag = defined?(variable_flag) ? true : false
puts _variable_flag # false
```

defined?で調べる変数の結果の代入先をその変数と同じにすると定義済み(true)結果が返る
Windows-Cygwin Gitリポジトリがコマンドプロンプトから操作できなくなる現象に遭遇

## 現象

Cygwinから利用しているローカルGitリポジトリについて、CMDなどWindows側から操作しようとすると、以下のようなエラーメッセージが表示されでGitリポジトリが操作不能になる。

```
D:\repos\myProject>git --version
git version 2.14.3.windows.1

D:\repos\myProject>git status
fatal: Invalid path '/cygdrive': No such file or directory
```

## 対応

<code>.git/conf</code>に書かれている以下の行を削除する

```
[Core]
   worktree = /cygdrive/d/repos/myProject
```
DOS窓+WSLでパスワード用文字列を簡単生成してみる

`windows10 fall creators update` 以降で DOS窓から直接 Windows Subsystem for Linux(以下 WSL)のコマンドを実行できるようになったらしいので、応用して WSL側の pwgen を直接たたいてパスワードリストを生成する実験。

# 完了目標
- WSL 環境へ `pwgen` パッケージを導入する
- DOS窓からWSLの pwgen をたたけるようにする。
- コマンド1行でデスクトップに textファイルでパスワードを直接吐き出せるようになる。

# 前提
- `windows10 fall creators update` を適用済みの環境。
- WSLは導入済みの環境。
- WSL導入方法参考:  http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html

# 検証

##  WSL内 にaptで pwgenをインストール
- sudo してインストール。(WSL導入時に設定したrootパスワードが必要)

```
wsl sudo apt update && wsl sudo apt install pwgen -y
```
- pwgen動作確認

```
wsl pwgen
```
# DOS窓から pwgen を直接実行。結果をテキストファイルとして保存する
- DOS環境の環境変数はそのまま使えるっぽい
- 数字、記号入り、複雑で紛らわしい文字を省いた 16文字のパスワードを5個 生成する例

``` 
wsl pwgen -cysB 16 5 -1 >  %HOMEPATH%\desktop\pw.txt
```

上記でデスクトップにパスワードリストが作成される事を確認。
他にも応用できるかも。

# pwgen 参考サイト
- https://linux.die.net/man/1/pwgen
- https://qiita.com/icedpasta1832/items/57d0d9805f04b6e79875
Visual Studio | WPF > はまりポイント > OnPropertyChanged() > INotifyPropertyChangedをクラス定義に付けないと効果がない

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

LiveCharts のサンプルコード。
https://lvcharts.net/App/examples/v1/wpf/Data%20Pagination

OnPropertyChanged()を使っている。

このコードの`private double _to;`以降をコピーして動かしてもボタン押下時の処理が実行されない。

[[C# WPF]Bindingソースの更新を表示に反映する -NotifyPropertyChanged- ](http://cswpf.seesaa.net/article/313833423.html)
> 赤字の部分を見てください。
更新を表示に反映させたいBindingソースを持つクラスに
INotifyPropertyChangedインターフェースを実装します。

```txt:動作しない例
    public partial class MainWindow : Window
    {
```

```txt:動作する例
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
```
flocssについてまとめてみた

# flocssについてまとめてみた
最近flocssを触っているのでいいタイミングだと思い今回まとめてみました。

## flocssとは
cssの設計思想の一つで、OOCSS、SMACSS、BEMなどのコンセプトが取り入れられています。

## cssでありがちなこと
## 基本原則
flocssでは次のようなレイヤーで構成されます。

```
- css/
    - foundation
    - layout
    - object
        - component
        - project
        - Utility
```
### foundation
ブラウザのデフォルトスタイルの初期化(Reset.cssやNormalize.cssなど)や、プロジェクトにおける基本的なスタイルを定義をする場所。

### layout
header,footer,メインコンテンツなどのページを構成する大枠の部分を指定する場所。
基本的にはページ内で唯一の存在になるのでIDを使用するのも可能だが、IDセレクタは高い詳細度を持つため、
接頭辞(l-◯◯など)をつけた命名規則を採用するか,[id="header"]のように属性セレクタを使用することが推奨されている。

### object
OOCSSのコンセプトを元に、プロジェクトで繰り返されるビジュアルパターンをすべてObjectと定義します。

- FLOCSSでのObjectは次のレイヤーに分けられます。

### component
再利用できる小さな単位のモジュールを定義する場所。
※最低限の機能を持つものとして定義され、それ自体が固有の幅や色などを持つことは避けるべき。

### project
プロジェクト固有のパターンで、いくつかのcomponentだったり、それに該当しない要素で構成されるもの定義する場所。

### utility
projectやcomponentをむやみやたらに増やさないように
細かいスタイル調整の便利なクラスなどを定義する場所。

例えば、component間のmarginやpaddingの調整など。


## 命名規則
命名規則はBEMから派生したMindBEMdingを採用しています。
Block、Element、Modifierを略してBEMと言います。
Blockは大枠、Elementは大枠内のパーツ()、Modifierは大枠、または大枠内のパーツの状態が違うとき。
軽く説明するとこんな感じです。

### component
接頭辞としてc-をつけます。

### project
接頭辞としてp-をつけます。

### utility
接頭辞としてu-をつけます。

## カスケーディング
モジュール間の上書きや、他のモジュールを親とする上書きは原則禁止になっています。

```css
.c-box {}
.c-button {}
.c-box .c-button {} //これはだめ
.p-mypage {}
.p-mypage .p-boxList {} //これはだめ
```

ただし、projectからcomponentモジュールは変更できます。

```css
.c-button {}
.p-mypage .c-button {}
```

## まとめ
bem周りは割と適当に書いてしまいましたが、別記事で書いてあるのでぜひ。↓
https://qiita.com/w-tdon/items/681d46e4b0d018ca54ff
Cocos2d-xのサーバー通信方法(JSON+PHP+MySQL) Part2

前回の[Cocos2d-xのサーバー通信方法(JSON+PHP+MySQL) Part1](https://qiita.com/708QBT/items/f1c8d1d83d277cf19fe8)の続き

#今回の内容

- リクエストURLのPHP作成

#準備する事
- レンタルサーバーまたはPHP、MySQLが使用できるサーバーを借りる
- MySQLのユーザー登録、テーブル作成、フィールド作成
- PHPファイルの作成環境、アップロード環境の構築

#PHPファイル作成

```php:sample.php
<?php
//HTTPリクエストから送られた文字データを受け取りJSON形式に変換
$postData = file_get_contents("php://input");
$inputData = json_decode($postData, true);
 
if ($inputData == NULL) { exit; }

//データベースアクセス
try {
    $pdo = new PDO('mysql:host=localhost;dbname=[データベース名];charset=utf8','ユーザー名','パスワード');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $Exception) { exit; }

//$inputDataは連想配列。JSONを作る時の[Key]にて値を変数に入力
$str = $inputData["str"];
$val1 = $inputData["val1"];
$val2 = $inputData["val2"];

//SQL文を作りMySQLにINSERTする
$sql = "INSERT INTO user (field1, field2, field3, date) VALUES (?, ?, ?, ?)";
$stmh = $pdo->prepare($sql);
$stmh->bindValue(1, $str);
$stmh->bindValue(2, $val1);
$stmh->bindValue(3, $val2);
$stmh->bindValue(4, date('c'));
$stmh->execute();
$pdo->null;
```

PHPはCocos2d-xのHTTPリクエストから送られたJSON文字列を連想配列に変換
その後にデータベースに書き込む

#PHPをサーバーにアップロード
作成したPHPファイルをサーバーにアップロードする
アップロードされたPHPファイルのパスを調べhttp://~/sample.phpまたはhttps://~/sample.phpのURLにする
~は自身のドメイン、フォルダ名になる

#URLを記入
[Cocos2d-xのサーバー通信方法(JSON+PHP+MySQL) Part1](https://qiita.com/708QBT/items/f1c8d1d83d277cf19fe8)にて
作成したHTTPリクエストのリクエストURLに調べたURLを記入
>request->setUrl("https://~/sample.php");

Cocos2d-xにてHTTPリクエストを送るとMySQLのデータベースに入力される

#実用例
- ユーザー登録
- ユーザーランキング

応用すればいろんなデータを送信することが可能

#Part3
次回は[データベースのデータ受信](https://qiita.com/708QBT/items/6c0f572184d1762c1a6d)
Capistrano 3で複数行のシェルスクリプト的なアレを実行する

タイトルの通りですが、Capistrano 3で複数コマンドの組み合わせみたいなのをssh先のサーバ上で実行する方法が分からず微妙に悩んだのでメモ。

結論だけ言えば、ヒアドキュメントに突っ込んでexecuteの引数に渡せばいけました。何を悩んでたんだか。


```sample.rake
task 'test' do
  on roles(:all) do
    testcmd = <<-EOS
      echo "This"
      echo
      echo "is"
      echo
      echo "test"
    EOS
    execute testcmd
  end
end
```

```
# output sample

$ bundle exec cap stg sample:test

00:00 sample:test
      01 echo "This"; echo; echo "is"; echo; echo "test"
      01 This
      01
      01 is
      01
      01 test
    ✔ 01 sample@host 0.063s
```
moment.min.jsをrequireしたらModule not foundになった

いろいろモジュールをrequireしてたらサイズがでかくなってしまったので、圧縮されてるものは圧縮ファイルを使おうとしたらハマったのでメモ。

# 元のプログラム

```js
const moment = require('moment');
const xxxx = reuqire('xxxxx');
...
```
という風にいろいろ圧縮されてないやつを使ってたらサイズが一気に増えてしまった。

圧縮されてるモジュールはそっちを使おうかと、でかいものから順に圧縮されたものを使ってたらmomentで引っかかりました。

# momentの圧縮ファイルを使う

momentの読み込み部分を以下のように変更

```js
const moment = require('moment/min/moment.min.js');
```

これだけ。

# Module not found

npm起動して動作確認しようとしたら「Module not found」の文字が目に入った。

その一文を書くと
```
Module not found: Error: Can't resolve './locale' in '/xxx/yyy/node_modules/moment/min'
```

というエラーが出現。

「ファイルの中身をこう直せばいいよ！」っていう記事はたくさんあったけど、極力元のコードは触りたくない。

しかも動作はちゃんとできてるので、なんとかそのエラーを消せないものかと奮闘（ぐぐる）。

で、[公式のgithub issues](https://github.com/moment/moment/issues/2979)に対策がありました。

プロジェクトwebpack.config.jsのplugins欄に

```js
// webpack.config.js
plugins: [
    ...
    new webpack.IgnorePlugin(/\.\/locale$/)
]
```

のように書けばおｋとのこと。

無視してるだけだから根本的な解決にはなってないと思うけど、とりあえず動作してればいいのでこれを採用。

無事、Module not foundは消えました。
複数のHTMLファイルで単語の置換

したいこと：
複数のHTMLファイルで単語の置換

ポイント：
% は　foreach のエイリアス

ls は　gci(get-childItem)でも同じ。

①Z01から始まるファイルでのみ、[Z010]を[W050]に置き換えて、同じフォルダ内に別の名前で保存
PS> ls -n Z01*.html | %{\$fname="new_"+$\__;cat $\__ | %{\$_ -replace "Z010","W050" >> $fname}}

②Z01から始まるファイルでのみ、[Z010]を[W050]に置き換えて、同じフォルダの中の[BK]フォルダに別の名前で保存
PS> ls -n Z01*.html | %{\$fname="BK\\\"+"new\_"+$\__;cat $\__ | %{\$_ -replace "Z010","W050" >> $fname}}

※以下からカンコピです。ありがとうございました。
https://life-is-command.com/powershell-replace-files-to-folders/
Grakn.ai - 0.17になって変わったことリスト - OpenJDK 8 オフィシャルサポートその他

##はじめに
先々週から始めてver. 0.16を使っていたが、OpenJDK 8がオフィシャルサポートされていない（テストが不充分）ということもあり気になっていた。先週Grakn LabsのMichellangero Bucciさんとお話しした際に「出来たら早めに0.17系に上げた方がいいよ」というアドバイスもあったので0.17系を再インストールする事にした。お話ではサンプルやドキュメントも結構力入れて直したらしい。

実際やってみると、インストールはしくじるポイントが無いので問題なく出来たが、PoCで作っていたオントロジーのロードでエラーが出たり、テストクエリがはじかれたりと案外往生したのでそのあたりを纏めておく。どうもユーザー要望で文法的には結構先祖がえりしたみたい。結構な割合のドキュメント（ほとんど）は元の文法に沿っていたので、これで整合性が取れた事になる。（ポジティブに取れば）

今回検証したバージョンは、今日時点で最新の0.17.1。
##オントロジー関連
いずれもエラーが相変わらず分かりにくいので、知ってないとツラい。ちなみに以下の3つ以外は検知されなかったが、rule等もっと複雑な定義をしているとそちらに影響が出ているかも知れない。
####insertがDefineに変更
0.16ではオントロジーもデータもinsertでの定義だったが、これがオントロジーはdefineに変わった

```bash:before
insert
  product sub entity
    has name
    plays product-to-coverage
    plays product-to-limit;
```

```bash:after
define
  product sub entity
    has name
    plays product-to-coverage
    plays product-to-limit;
```

#### relationがrelationshipに変更

```bash:before
  condition-coverage sub relation
    relates condition-to-coverage
    relates coverage-to-condition;
  condition-to-coverage sub role;
  coverage-to-condition sub role;
```

```bash:after
  condition-coverage sub relationship
    relates condition-to-coverage
    relates coverage-to-condition;
  condition-to-coverage sub role;
  coverage-to-condition sub role;
```

#### resourceがattributeに変更

```bash:before
  coverage_type sub resource datatype string;
```

```bash:after
  coverage_type sub attribute datatype string;
```

##graql（クエリ）関連
クエリは残念ながらまださほど複雑なものを0.16で試せていなかったので、下記以外にもあるかも知れない。（幸いクエリの方はエラーが分かり易い）
#### selectがgetに変更
```bash:before
match
$coverage isa coverage has name $coverage_name;
$benefit isa surgery_benefit has name $benefit_name;
($coverage, $benefit);
select $coverage_name, $benefit_name;
```

```bash:after
match
$coverage isa coverage has name $coverage_name;
$benefit isa surgery_benefit has name $benefit_name;
($coverage, $benefit);
get $coverage_name, $benefit_name;
```

##おわりに
今回は単純な変更かも知れないけど、えらい大胆な先祖がえりで「大丈夫か？」と思わせなくもないが、これ以外にもたくさん改善は入っており頑張ってるので引き続き応援したいと思う。
Data::Pokemon::GoというPerlモジュールをリリースした

[Data::Pokemon::Go](https://github.com/worthmine/Data-Pokemon-Go)というperlモジュールをリリースさせていただきましたので、取り急ぎ日本語版の解説をまとめさせていただきます。

# 共同編集者絶賛募集中！
正直、一人で更新／メンテするのは大変なデータ量(執筆時点で386種ですぜ！)なので、この場を借りてモジュールのコンセプトに共感してくださる（≒更新を手伝ってくださる）有志を募りたいと思います。

[大元のデータはYAML](https://github.com/worthmine/Data-Pokemon-Go/tree/master/data)なので、言語問わず、YAMLの編集が可能な方であればどなたでも[PR](https://github.com/worthmine/Data-Pokemon-Go/pulls)できます。よろしくお願いいたします。

# モジュールの概要
現時点では「直接ソース読めよ」というレベルの英語ドキュメントしか用意できてませんので、日本語のドキュメントを書くつもりでここに記しますね。

## 開発の動機
ポケモンGOにどハマりしてる割には、相性を全然覚えられなくて逐一ググってたので、[LINE BOT](https://line.me/R/ti/p/%40nsl8599t)を作成しました。
<img width="320" alt="8E634C74-94BE-45D9-936E-1483F839CC60.png" src="https://qiita-image-store.s3.amazonaws.com/0/10766/92d6bc7f-9bfe-1ee1-9bda-02e399f5cac0.png">[![q-kl0z-wez.png](https://qiita-image-store.s3.amazonaws.com/0/10766/3fe53dd5-6a5d-0039-c747-d0712366974d.png)](https://line.me/R/ti/p/%40nsl8599t)
同じような悩みをお持ちの方はぜひ友達になってください。**執筆時点で友達数は6人です（キリッ）**

で、このBOTで実装している、ポケモン名を認識させジム戦に有利なタイプのポケモンを提案するための[サブモジュールがこちら](https://github.com/worthmine/Data-Pokemon-Go/blob/master/lib/Data/Pokemon/Go/Pokemon.pm)になりまして、このBOTにゆくゆくは個体値推定などをさせたいと思って[途中まで実装したのがこちら](https://github.com/worthmine/Data-Pokemon-Go/blob/master/lib/Data/Pokemon/Go/IV.pm)。
スキルについて攻略サイトではDPS至上主義で掲載していることに疑問を感じ、評価基軸にEPSとモーションの小ささ（避けやすさ）を加味して評価点を再計算させようとしたのが[こちら](https://github.com/worthmine/Data-Pokemon-Go/blob/master/lib/Data/Pokemon/Go/Skill.pm)です。

166個のわざについて手入力をするまでは（その時は）どうにかなりましたが、386種のポケモンのタイプ（[入力済み](https://github.com/worthmine/Data-Pokemon-Go/blob/master/data/Pokemon.yaml)）、および覚えるわざと種族値、進化の系統など（[カントー地方のみ入力済み](https://github.com/worthmine/Data-Pokemon-Go/blob/master/data/Kanto.yaml)）を全て詳細に入力するのは骨が折れるので、いずれ公開予定だったものですから、公開を前倒しにして更新の手間を省けるなら、と思いました。

## 実装済みの機能

### 相性検索（高精度）

```pl
use Data::Pokemon::Go::Pokemon;
my $pg = Data::Pokemon::Go::Pokemon->new( name => 'カイリュー' );
print $pg->effective();    # こおり ドラゴン いわ フェアリー
print $pg->invalid();      # くさ みず むし じめん ほのお かくとう
print $pg->advantage();    # はがね でんき いわ
print $pg->disadvantage(); # むし かくとう ドラゴン くさ
print $pg->recommended();  # こおり いわ フェアリー
```

タイプ別の「こうかばつぐん」および「いまひとつ」の基本的な相性情報、およびそこから有利に戦える（敵の属性一致わざを軽減する）タイプの提案、その逆の提示、また、それらの情報を考慮して最終的に選ぶべき（敵の技を軽減しつつ大ダメージを与える）タイプの提案が可能です。複数候補がある場合は、効率の良い順にソートされた値を返します。

伝説レイドでカビゴン＆ハピナス使ってる方が未だに散見される点を、筆者は非常に残念に感じており、そういう人たちにこそ相性を検索して覚えて欲しいと思っています。

### 個体値計算
予定になかったのですが、[この記事](https://qiita.com/shuheilocale@github/items/0442944326bebdb42df9)を読んだら無性に実装したくなり、優先度を無視して実装してしまいました。

例えばたまごから孵化したてまたはレイドでゲットしたばかりの場合、理論上のCPの最大値が計算可能です。

```pl
use Data::Pokemon::Go::IV;
my $iv = Data::Pokemon::Go::IV->new();
print $iv->_calculate_CP( name => 'カイリュー', LV => 20, ST => 15, AT => 15, DF => 15 );
# 2046
```

例えばこれをオール14などにした場合、

```pl
print $iv->_calculate_CP( name => 'カイリュー', LV => 20, ST => 14, AT => 14, DF => 14 );
# 2029
```

妥協できる個体値を持つCPの目安を知ることができます（一部ガチ勢に重宝される機能？）

## TODO
- 日本語版ドキュメントの作成
- ジョウト地方およびホウエン地方のポケモンの詳細データのYAML化
- 多言語対応（英語以外も、全てのプレイ可能な言語に対応したモジュールにしたい）
- リーダーの評価から個体値を推定するアルゴリズムの作成（実装は思いついてるのですが、なかなかコードにする機会が見当たらない。） 
- testの厳格化(なかなかいいテストが思い浮かばない)

#最後に
細かなtypoの指摘とかでもいいです！どしどしPR送ってください！
[iOS]Unity+i-mobileで追加したフレームワーク内のヘッダファイルをXcodeが見つけてくれない時の対応

## まず結論
　XcodeのBuild Settingsにある、Search Paths->Framework Search Pathsにフレームワークの置き場所を追記すれば解決する。

## 何をやって何が起きたか
　i-mobileの ImobileSdkAds.framework を UnityEditor の OnPostprocessBuild 関数内で PBXProject.AddFile関数を使ってXcodeプロジェクトに自動で追加し、Xcodeでビルドしたところ、 ImobileSdkAds/ImobileSdkAds.h がfile not foundでビルドエラーが起きた。いやいや、そのフレームワークの中にそのヘッダファイルあるよ？ どうなってるのこれ。
　そんなわけでi-mobileに問い合わせたところ、マニュアル通り手動で追加すれば確実にビルドは通ります、との事でそれに従っていた。
　しかし、最近macOSをSierraからHigh Sierraへ、Xcodeも8から9.1へ移行したところ、手動で追加しても上述したヘッダファイルが見つからないという状況になってしまった。これは大変だ、実機デバッグできないぞ。

## 知らなかったことと、やったこと
　Xcodeの Build Settingsは素晴らしいと言うこと。
　Search Pathsの中で細かく検索パス設定が可能で、Framework Search Pathsという項目もあった。
　Xcode8までは、手動で追加することでビルドが通っていたのは、Serch Paths->Always Search User Pathsという項目が有効になっていて、追加すれば追加したフレームワークのパスが検索対象となっていたと思われる。
　しかしXcode9.1ではこの項目がDeprecatedとなっており、勝手に検索対象にはしてくれない。
　そこで上述通り、Framework Search Pathsに追加したいフレームワークのパスを追加した。

```C#:PostBuild.cs
  pbxProject.AddBuildProperty( target, "FRAMEWORK_SEARCH_PATHS", "フレームワークの置き場所" );
```

　上記のように書けば、Build Settingsへ自動で追記してくれる。
　ついでにPBXProject.AddFile関数でフレームワークを追加してやれば手動での追加も必要無くなり、自動化が実現出来た。
iTerm2のBroadcastでヒヤリハットした件

# 背景
本番環境とローカル環境を同じターミナルで接続し、作業していたらヒヤリハットに遭遇したのでご報告

# 現象
1. ステージングサーバの挙動が気になったので、ログを調査していた。

1. その際に、iTermで画面分割（Command + D)し、複数台あるステージングサーバにsshで接続して、iTerm2のBroadcast機能で、同時にコマンドを叩いていた。

1. 急遽ローカル環境で作業する必要が起きたのでiTermで別タブを開き（Command + T)、
ステージングサーバに接続したまま、ローカルで作業開始した

1. なんかgitの挙動が変になった。ブランチを切り替えようとしたらlockファイルがあるやら言われる

1. 排他ロックされているようなので、なんでかな？と調べてみると、全てのタブに対して同一のコマンドを流していた

1. ステージングサーバで意図せぬコマンドを叩いていた

# 原因
上記の「2」で
Command+option+Iとし、「Broadcast Input to All Panes in Current Tab」とするところを、Command+shift+Iとし、「Broadcast Input to All Panes in All Tab」としていた。


Command+option+I　・・・　現在のタブにある全ての窓に対して同一コマンドを送る
Command+shift+I　　　・・・　全てのタブにある全ての窓に対して同一コマンドを送る

![スクリーンショット 2017-11-14 10.38.43.png](https://qiita-image-store.s3.amazonaws.com/0/105662/36fdb5f5-107b-bdf6-954d-231ac1ebd05a.png)


#　所感
幸いにもステージングサーバだったのと、叩いたコマンドが「git chekuout」だったので特にサーバに影響はなかった。
が、ツールのショートカットにおける、オプションとシフトの違いなど普段無意識で実行しているので、視覚上違和感がなければ気づけないので、最悪本番データを削除する可能性もあった。

# 対策
iTermにはこの手のミスを予期したかのような機能があるので
「Show Background Pattern Indicator」にチェックを入れておく。
![スクリーンショット 2017-11-14 11.09.56.png](https://qiita-image-store.s3.amazonaws.com/0/105662/74aaf03c-cfad-72b6-5e5e-1e43ca57b0eb.png)

そうすると、以下のようにBroadcast中のターミナルは視覚上はっきり区別がつくようになる。

![スクリーンショット 2017-11-14 11.13.26.png](https://qiita-image-store.s3.amazonaws.com/0/105662/f07a8213-1836-6c47-4038-cd3798baf951.png)


#　結論
こういったどうでもよい現象で、この問題に気付けたのはよかった。
また、ヒヤリハットが起きたらチャンスと思い、必ず対策を検討しておきたいものですね。
iOSグラフ描画ライブラリ「Charts」を使って超シンプルな円グラフを書く

# Charts

![Charts](https://camo.githubusercontent.com/c6f7ce37a23ae05e72a70bf7e2978b0cd2ebdd6e/68747470733a2f2f7261772e6769746875622e636f6d2f64616e69656c67696e64692f4368617274732f6d61737465722f4173736574732f666561747572655f677261706869632e706e67)

https://github.com/danielgindi/Charts

# 超シンプルな円グラフの作り方
凡例も何もないシンプル円グラフを作りたい場合、意外と躓きます。
他のグラフについても似たような流れでシンプルなものが作れます。

```swift
let chart = PieChartView(frame: rect)
chart.highlightPerTapEnabled = false  // グラフがタップされたときのハイライトをOFF（任意）
chart.chartDescription?.enabled = false  // グラフの説明を非表示
chart.drawEntryLabelsEnabled = false  // グラフ上のデータラベルを非表示
chart.legend.enabled = false  // グラフの注釈を非表示
chart.rotationEnabled = false // グラフがぐるぐる動くのを無効化

// グラフに表示する適当なデータセットを定義
let dataSet = PieChartDataSet(values: [PieChartDataEntry(value: 10, label: "A"), PieChartDataEntry(value: 90, label: "B")], label: "Data")
dataSet.setColors(UIColor.green, UIColor.blue)

dataSet.drawValuesEnabled = false  // グラフ上のデータ値を非表示

chart.data = PieChartData(dataSet: dataSet)
```

# 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88572/bea52450-1233-1b72-b411-1945a5fd8605.png)

こんな感じのただの円グラフが作れます。
Githubのwikiに画像やpdfをサクッとシンプルに貼り付ける方法

#　背景
なんかissueやPRには画像やpdfを添付できるのに、wikiだとできない（Chromeブラウザで開いてしまう）
多分Chromeだけでなく、firefoxでもできなかったので、全般的にできない

# 方法
- なんでもいいのでissueを作成する


- 下記に画像やPDFをD&Dする
![スクリーンショット 2017-11-14 13.59.47.png](https://qiita-image-store.s3.amazonaws.com/0/105662/e8678b9c-d4f6-15da-71f7-796a4effab90.png)

- なんかこんな感じのリンクに変換されると思うので、それを
wikiに貼り付ける

```
![2016-10-07 21 21 20](https://user-images.githubusercontent.com/hogehoge.png)
```

- 上で作ったissueはいらないので保存しない

おしまい（もっといいやり方ないのか・・・・）
eslintやってみたら「Parsing error: Parenthesized pattern」エラー表示。⇒単なる設定ミスだった。

# 概要

初めてEslintしてみたら
「Parsing error: Parenthesized pattern」って出たよ。なぜ？
⇒単なる「設定ミスによる解析エラー」です、
って話。

"Parenthesized pattern" でググっても辿り着けなかったので記載する。
⇒「Parsing error」が本質。そりゃー、たどり着けないわ。

※この記事は、自分自身へのメモが目的です。


# 現象

「eslint --init」で、こんな感じに設定した後の話。
![eslint_init.png](https://qiita-image-store.s3.amazonaws.com/0/125588/f9719219-525a-5078-4ed0-41efa58ef3ce.png)

VSCodeにEslintプラグインを入れてみたら、アロー関数表記のところで、
「Parenthesized pattern」と出た。なんじゃこりゃ？

コマンドラインから、「eslint 対象ファイル.js」ってやると、その行数のところで、
「Parsing error: Parenthesized pattern」って同じエラー表示が出た。
なんじゃこりゃ？

※初めてEslint入れる＆VSCodeからの利用が目的、の場合の手順は以下のページに従って行った。分かり易くて良い。
https://garafu.blogspot.jp/2016/12/vscode-eslint.html


# 原因と解決方法

原因は「Eslintの設定を**"ES5"**にしておきながら、ES6で新導入された*アロー関数*を使ってたので、Eslintがパースエラーした」だった。そりゃー、エラーするわ。

解決方法は、「Eslintの設定を**"ES6"**にする」だけ。これで、アロー関数の部分も正しく解釈される（そしたら、セミコロン抜けとか、もろもろのエラーが正しく出ましたよ、っと）。

当初にES5で設定した理由？→「基本的にはES5で書いてるつもり」だったから。実際は、一部にES6の記法も混在したので、今回のエラー表示につながった。

Eslintに対する設定は、たとえ普段ES5で書いてるつもりでも、明確に「ES5の範囲しか使わない！」でない限りはES6で設定するのが良いみたい（＾＾；）。なお、ES6に設定後のEslintのコマンドライン結果は以下。へー、こんな感じになるのね。

```
  103:30  error  'reject' is defined but never used        no-unused-vars
  121:30  error  'reject' is defined but never used        no-unused-vars
  181:51  error  Missing semicolon                         semi
  202:31  error  'reject' is defined but never used        no-unused-vars
  209:5   error  Missing semicolon                         semi
  211:2   error  Missing semicolon                         semi
  240:48  error  'err' is defined but never used           no-unused-vars
```

# Eslintの設定メモ

結局、以下のように設定を変更した。当初の「eslint --init」で生成したに内容に対する変更箇所は以下。

 * 「"es6": true」を追加。
 * 「"indent"」を「off」った。
 * 「"quotes"」を「error → wran」へ変更。

```json:.eslintrc.json
{
    "env": {
        "es6": true,
        "browser": true,
        "commonjs": true,
        "node": true
    },
    "extends": "eslint:recommended",
    "rules": {
        "indent": [
            "off",
            4
        ],
        "linebreak-style": [
            "error",
            "windows"
        ],
        "quotes": [
            "warn",
            "double"
        ],
        "semi": [
            "error",
            "always"
        ]
    }
}
```

# 参考サイト

Eslint自体の設定ファイルの意味は、公式サイトの解説が分かり易い。下手に彷徨わず、この公式ページを見るのが良さげ。

* rulesのerror, warn, offの意味など。https://eslint.org/docs/user-guide/getting-started
* 定義されているrulesの内容。https://eslint.org/docs/rules/
PHPでログインが必要なサイトを作る方法(第1回)

こんにちは、片山学園 鉄道研究会です。

実は、鉄道研究会では部員専用サイトを作っています。

![rrc-portal-ss.png](https://qiita-image-store.s3.amazonaws.com/0/214176/ed987455-53f8-fff3-e8f3-84f49f211d2a.png)

こんな感じなんですが、当然見るためにはログインが必要です。

このサイトではApache+PHP+SQLite+Bootstrap+jQueryといった、結構普通の技術を使ってログイン機能を作っています。

それでは、具体的な作り方を紹介していきます。

# ログインをさせるための設定
どのページにアクセスしてもログインさせるためには、ページがリクエストされたときに、

* ログインしているか判定
* ログインしてなかったらログインページに飛ばす
* ログインしていたらページを表示

といった処理をする必要があります。

このサイトでは、すべて共通のファイルを最初に読み込んで、そのファイルでこれらの処理を行っています。

このとき大切なこととして、
<span style="font-size: 150%">絶対にログインページではこの処理をしてはいけない</span>ということです。

なぜなら、

1. ログインページにアクセス
1. ログインしているか判定
1. ログインしてないのでログインページにリダイレクト(1に戻る)

の無限ループが起こるからです。自分もここではまりました。

このサイトではログインしているユーザー名を`$_SESSION['user']`に保存しているので、

```php:/inc/auth.php
if(!isset($_SESSION['user'])){

	header('Location: ' . BASE_URL . '/login');

	exit();

}
```

という処理にしました。`BASE_URL`にはサイトトップのURLが入っています。

このファイルをすべてのページで`require_once`すれば、ログインを強制させられます。

このとき、`/inc/*`に対する直接アクセスを拒否します。
これについては次回に設定します。
次回：[PHPでログインが必要なサイトを作る方法(第2回)](https://qiita.com/rrc/items/4e4f68de5c506552b04b)
leJOS EV3にUSBケーブルでプログラムを転送 (Windows10環境)

ここに書いている通りにすればできます。

[EV3 (leJOS) driver installation under Windows 8, 10](https://jira.iais.fraunhofer.de/wiki/display/ORInfo/EV3+%28leJOS%29+driver+installation+under+Windows+8%2C+10)

### 1. Microsoftからドライバをダウンロード

[このページ](http://download.windowsupdate.com/msdownload/update/driver/drvs/2012/12/20342322_4b9970e3174b23b5cb2371af0837f939a71271ea.cab)からドライバをダウンロードします。
「*20342322_4b9970e3174b23b5cb2371af0837f939a71271ea.cab*」というファイルがダウンロードされます。

### 2. 7zipを使用して解凍

[7zip](https://sevenzip.osdn.jp/)を使用して、ダウンロードしたファイルを解凍してください。
中のファイルは「*rndis.cat*」と「*RNDIS.inf*」の2つです。
この2つを、「*connect_lejos_ev3_driver*」などといった適当なフォルダの中に入れてください。

### 3. デバイスマネージャーからインストール

デバイスマネージャーから、ドライバの入ったフォルダを参照し、インストールを行います。
EV3をUSBケーブルで繋いだ状態で、デバイスマネージャーを開くと「*ポート(COMとLPT)*」のカテゴリーが表示されているはずです。
この中の、「*USBシリアルデバイスCOM3*」や、*COM4*が、現在EV3用にインストールされているドライバになります。
この上で右クリックをし、「*ドライバーの更新*」を選択します。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/61622/270555e2-3c80-b3c6-e578-c002873aecf8.png)


次に、「*コンピュータを参照してドライバーソフトウェアを検索*」を選択し、先ほどドライバーを入れたフォルダを参照します。
![driver2.PNG](https://qiita-image-store.s3.amazonaws.com/0/61622/7214e053-131c-d564-3d48-7162c2a21cd3.png)


その後、「*次へ*」を押すと、ドライバーがインストールされます。

![driver3.PNG](https://qiita-image-store.s3.amazonaws.com/0/61622/ddbc0e7e-7204-a9a6-5bf4-8c390c3213a4.png)


### 4. pingをとばして確認

コマンドプロンプトで、10.0.1.1に対してpingをとばします。正常に返ってきたら成功です。
npm installにてRefusing to install handsontable as a dependency of itselfというエラーが発生する場合


http://root3.hatenablog.com/entry/2016/08/29/225231
package.jsonのnameプロパティと、インストールしようとしたnpmパッケージ名が同じ場合に発生します。

# 解決策
package.jsonのnameプロパティを、別の名前に変更する
APIを使ってGoogle Cloud StorageへUploadしてみた

## 初めに

やりたいことはすごく簡単なはずなのに、いろんなドキュメント見てもぱっと見て実装出来そうな良いのが無かったので書きます。

## やりたいこと(背景)

* Hadoopに入ってるアクセスログをHiveで抽出して、Google Cloud Storage(GCS)に上げる。
* それをGoogle Cloud Platform(GCP)の解析基盤に流してよしなにする。

このフローにおける前者の部分をサクッとバッチ化しました。  
PHPのクライアントライブラリを利用しています。


## 1. 取り敢えずHiveからファイル出力する

別にHiveの話したいわけじゃないので割愛します。  
こんなかんじ。

`sudo -u hdfs hive -e "$query" | grep -v WARN > $filename`

1.7GBくらいのファイルを走査して350MBくらいのファイルを吐きます。  
30秒位で終わる。優秀！（自画自賛）

## 2. 該当のファイルをUploadします。

アホなことしてないで本題に入ります。

### 事前準備

GCPへのプロジェクト追加やGCSへのバケット追加とかは割愛します。

詳細は[公式のリファレンス](https://cloud.google.com/storage/docs/apis?hl=ja)をご参照下さい。  
色々書いてあって、一通り読んでもよくわからないかもしれません。

今回はバッチとして自動的に動かすので、「[サービスアカウントによる認証](https://cloud.google.com/storage/docs/authentication?hl=ja#service_accounts)」を行います。  
鍵ファイルを事前にダウンロードしておいてそれを用いて認証を行うものです。  
鍵の取り扱いにはご注意を。

以下は8割位公式からのコピペですが大体このとおりです。

* 左上のハンバーガーメニューから「APIとサービス」->「認証情報」  
* [認証情報を作成する] をクリックします。
* [サービス アカウント キー] を選択します。
* [サービス アカウント キーの作成] ウィンドウが開きます。
* [サービス アカウント] の下にあるプルダウン ボックスをクリックし、[新しいサービス アカウント] をクリックします。
* [名前] にサービス アカウントの名前を入力します。
* デフォルトのサービス アカウント ID を使用するか、別の ID を作成します。
* [役割] に適切な権限範囲を割り当てましょう。ここでは「ストレージ」-> 「ストレージのオブジェクト作成者」にしておけばUploadはできます。
* [キーのタイプ] で JSON を選択します。
* [作成] をクリックします。
* [サービス アカウントの作成] ウィンドウが表示され、選択したキーのタイプの秘密鍵が自動的にダウンロードされます。

P12の鍵でも良いですが、私はJSONでやったのでそちらに寄せて書いてます。

さて、鍵はダウンロードできたのでそれを利用して通信を行うPHPコードを書きましょう。  
その前に[公式のクライアントライブラリに関するドキュメント](https://googlecloudplatform.github.io/google-cloud-php/#/docs/google-cloud/v0.43.0/storage/storageclient)に目を通しておくと良いと思います。(任意)

まずはcomposer使ってライブラリ落としておきます。

```bash
php composer.phar require google/cloud-storage
```

次に、先ほどDownloadしてきたJSONファイルを、バッチ実行したいサーバに置きます。  
パスは任意ですが権限には気をつけましょう。

続いて、そのファイルを示す環境変数を定義します。  
私の場合は ShellScript からPHPスクリプトを呼んでるのでそこでコマンド発行しています。

```bash
export GOOGLE_APPLICATION_CREDENTIALS=JSON_FILEPATH.json
```

あとは以下のようなコードでUploadできます。  
ShellScriptでファイル自動生成して、Argumentとしてファイル名を渡してます。

```php
<?php

# Includes the autoloader for libraries installed with composer
require __DIR__ . '/../vendor/autoload.php';

# Imports the Google Cloud client library
use Google\Cloud\Storage\StorageClient;

# Your Google Cloud Platform project ID
$projectId = 'YOUR_PROJECCT_ID';

# Instantiates a client
$storage = new StorageClient([
    'projectId' => $projectId
]);
$bucket = $storage->bucket('YOUR_BUCKET_NAME');

$object = $bucket->upload(
    fopen(__DIR__ . '/../' . $argv[1], 'r')
);
```

### おわりに

あんまり需要ないかもですが、コレをとっかかりに別のAPI叩いたりも出来るはず。  
GCPはドキュメント読むのがつらいので誰かのお役にでも立てれば幸いです。
【GIT】submoduleの使い方を含めて色々書いてみる

個人的に作っているツールでsubmoduleを使っているわけですが、
結構面倒なんですよねこのgitのsubmoduleという機能。

何かやるたびにググって・・・を繰り返しているので、
自分の理解を整理する意味でもちょっとまとめてみたいと思います。
それでもきっと翌日にはまたググるんだろうけど。


## まずは親プロジェクトをclone

main1というプロジェクトで、その中にサブモジュール（sub）を利用するシーンを想定。

`git clone https://github.com/myrepo/main1.git`

次にcloneしてきたmain1ディレクトリに入ってsubmoduleをclone

`git submodule add https://github.com/myrepo/sub.git`

この状態で、 `git status` を叩くと

```
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   .gitmodules
        new file:   sub
```

と言った感じで、追加したsubというサブモジュールと、サブモジュールを管理するドットファイル、.gitmodulesが追加されている。

### .gitmodulesって？

このgitmodulesをmain1に置いておくことで、別の環境や、別の人がこのmain1をcloneした際に、
gitmodulesファイルの中身をgitが勝手に読み込んでくれて別プロジェクトのソースをサブモジュールとしてcloneしてくれるという寸法。

中身はこんな感じになってる。

```.gitmodules
[submodule "sub"]
        path = sub
        url = https://github.com/myrepo/sub.git
```


## とりあえずこの状態でmain1をpush

`git add .`
`git commit -m "commit"`
`git push origin maseter`

これでgithubのほうをみると、

![スクリーンショット 2017-10-27 18.57.00.png](https://qiita-image-store.s3.amazonaws.com/0/186346/51911606-9010-f8e3-db01-884674895b0c.png)


これは「subというディレクトリはこちら（@ c1eb8af）を参照しています」ということ。
この`@ c1eb8af`はなんなのかというと、
subというプロジェクトのコミットIDのことを差している。

## submoduleはコミットIDを参照する
これがsubmoduleを理解するために非常に大事なポイントでして、
同時に理解を難しくしている所以のひとつでもあります。

コミットIDを参照していることで何が起こるかというと、
今この状態のまま、
別の人がsubというプロジェクトに対して更新を行ったとします。

その後、このmain1というプロジェクトの中で、git pullをしても、先程別の人がコミットした内容は取ってこれないということ。

じゃあどうすればいいのかというと、
main1直下ではなく、
main1/sub
に移動してこの配下でgit pull をします。
（main1直下で、 `git submodule foreach git pull origin master ` でもOK。こっちのほうがスタンダード？)

すると至って普通の形で別の人が更新した内容をローカルに持ってくることができます。

## ここで問題が発生する

main1/sub配下に入ってpullしてきたわけですが、
pullすることでsub配下のmasterブランチが参照しているコミット番号が変わります。
ところが親プロジェクトのmain1ではまだpullしてくる前のコミット番号を参照しています。

つまりmain1の中でgit statusを叩くと、差分があると言われます。（コミット番号に差分がある）

これはアカン状態です。

とはいっても別に難しいことはする必要はなく普通に、
`git add .`
`git commit -m 'さぶもじゅーる更新'`
`git push origin maseter`

のフローを踏んであげればOKです。

こうすることでリモートが持つmain1プロジェクト配下のsubというディレクトリが参照するコミット番号がsubプロジェクトのmasterのコミット番号を参照することになります。

## 使ってみた感想

最初はかなり躓いたりしてかなり悲しかったのですが一つ一つsubmoduleの性質を紐解いていけば普通に使えるものでした。

僕の場合、趣味でbotを作っているのですが、
それぞれ、
* line
* twitter
* slack

といて、それぞれが共通で使うライブラリをサブモジュールとしてcloneさせています。

そんな感じです。
vagrantに設置したnginxにApacheBenchで負荷をかけてみる

# 環境
vagrantに設置したCentOS
CentOS release 6.9 (Final)

MacからApache Benchで負荷をかけてみる

# Apache Benchインストール
MacにはもともとApacheがインストールされているので、それをそのまま利用する
Server version: Apache/2.4.27 (Unix)

# Apache Benchの実行
```
$ ab -n 1000 -c 100 http://192.168.33.10/
```
nは実行するリクエスト回数
cはコネクション数

```
Server Software:        nginx/1.12.2
Server Hostname:        192.168.33.10
Server Port:            80

Document Path:          /
Document Length:        612 bytes

Concurrency Level:      100
Time taken for tests:   0.871 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      845000 bytes
HTML transferred:       612000 bytes
Requests per second:    1147.97 [#/sec] (mean)
Time per request:       87.111 [ms] (mean)
Time per request:       0.871 [ms] (mean, across all concurrent requests)
Transfer rate:          947.30 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   1.2      0       5
Processing:     3   84  18.6     91     103
Waiting:        3   84  18.6     91     103
Total:          8   85  17.8     92     103

Percentage of the requests served within a certain time (ms)
  50%     92
  66%     93
  75%     94
  80%     94
  90%     97
  95%    100
  98%    101
  99%    102
 100%    103 (longest request)
```

Complete requests
ただ単にnginxを設置しただけなので全て成功

Requests per second
１秒間に処理したリクエスト数の平均

Time per request
1リクエストの処理にかかった時間

Connection Times (ms)
Connect・・・接続の確立までにかかる時間。同マシンなので流石に速い
Waiting・・・クライアントが接続確立からレスポンスを受けるまでの時間
Processing・・・サーバー側の処理時間

同じマシンから負荷をかけているせいか殆どWaitingとProcessingに差が見られず
NV12フォーマットのGEM FLINK名からテクスチャを生成する



YUVフォーマット（ここではNV12）のDRMバッファのGEM FLINK名がわかっている状態でそこからテクスチャを生成してみる。

GEM FLINKについては
https://qiita.com/maueki/items/8392decdd36c3fa19117#gem-flink

記載するコードについてはエラー処理は省略している。

# EGL, GLの初期化

省略

# GBMデバイスオープン

```cpp
int drv_fd = open("/dev/dri/card0", O_RDWR);
struct gbm_device* gbm = gbm_create_device(drv_fd);
```

# PRIME FD取得

GEM FLINK名は`uint32_t name`という変数に格納されているものとする。

```cpp
struct drm_gem_open gem_open = {};
gem_open.name = name;
drmIoctl(gbm_device_get_fd(gbm), DRM_IOCTL_GEM_OPEN, &gem_open));

struct drm_prime_handle prime_handle = {.handle = gem_open.handle, .flags = 0 /* O_CLOSEXEC */ };
drmIoctl(gbm_device_get_fd(gbm), DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime_handle);

int fd = prime_handle.fd;
```

`fd`がPRIME FDとなる

# eglImageKHR作成

EGL拡張の[EGL_EXT_image_dma_buf_import](https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import.txt)を使用してPRIME FDからeglImageKHRを取得する。

```cpp
    EGLint img_attribs[] = {
        EGL_WIDTH,                  <width>,
        EGL_HEIGHT,                 <height>,
        EGL_LINUX_DRM_FOURCC_EXT,   DRM_FORMAT_NV11, /// =0x3231564e,
        EGL_DMA_BUF_PLANE0_FD_EXT,  fd,
        EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0,
        EGL_DMA_BUF_PLANE0_PITCH_EXT, <一行あたりのバイト数(アライメント注意)>,
        EGL_DMA_BUF_PLANE1_FD_EXT,  fd,
        EGL_DMA_BUF_PLANE1_OFFSET_EXT, <PLANE1の開始位置>,
        EGL_DMA_BUF_PLANE1_PITCH_EXT, <一行あたりのバイト数(PLANE0と同じはず)>,
        EGL_NONE
    };

    EGLImageKHR eglImage = eglCreateImageKHR(egl_dpy, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, (EGLClientBuffer)0, img_attribs);
```

PLANEは２まであって、フォーマットに合わせて使い分ける。NV12の場合はYとUVの２面に分かれているのでPLANE0,PLANE1を使用する。
YUVフォーマットについて詳しくは以下参照
http://klabgames.tech.blog.jp.klab.com/archives/1054828175.html

`EGL_DMA_BUF_PLANE1_OFFSET_EXT`の値は基本的に`EGL_DMA_BUF_PLANE0_PITCH_EXT * EGL_HEIGHT`のはずだが、アライメント調整されることがあるので注意（自分の環境だと32の倍数である必要があってかなりハマった）

# テクスチャ作成

GL拡張の[GL_OES_EGL_image_external](https://www.khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt)を使用してテクスチャを作成する。

```cpp
glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id);
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, eglImage);
```

`GL_TEXTURE_2D`ではなく`GL_TEXTURE_EXTERNAL_OES`を使っていることに注意。

あとは通常のテクスチャ同様に描画すれば内部でNV12 -> RGBの変換を行ってくれる。

# 描画時の注意

`GL_TEXTURE_EXTERNAL_OES`を使っているため、`sampler2D`は使用できない。
フラグメントシェーダの先頭に

```glsl
#extension GL_OES_EGL_image_external: require
```
を記載し、`samplerExternalOES`を使用する。`texture2D()`は同様に使用可能。
スマホ実機から、Docker開発環境につなげる方法

#概要
現在Dockerで開発中の環境をスマホ実機からデバッグ出来るようにする方法
（Dockerあんま関係ないけどね...）

#事前準備
* Charlesインストール

https://www.charlesproxy.com/

## 設定方法
こちらの記事に説明が書いてありますので、ご参照下さい。
https://qiita.com/syannu/items/42802cde2baf9146788a

#確認方法
IPアドレスを打ち込んで、アクセスするときに、Charlesでポップアップが出てくるので、「allow」を押してあげて下さい。

##docker-machineの場合
開発PCで使っているdocker-machineでのアドレスをスマホからアクセス
192.168.99.100とかだと思います。

##Docker for Mac,Windowsの場合
↑の設定方法で確認した開発PCのIPアドレスを入力すれば、アクセス出来るはずです。

##dockerを使ってない場合
↑のDocker for Mac,Windowsの場合と同じ方法

#行った作業の説明
##変更前
スマホ
↓↑
Wifiルータ

開発PC
↓↑
Wifiルータ

##変更後
スマホ
↓↑
Ploxyサーバ（開発PCの8888ポート）
↓↑
開発PC
↓↑
Wifiルータ

つまり、開発PCがWifiを切ったら、スマホからインターネットに繋げられなくなる