OmniAICreator/Qiita-1.07M huggingface dataset:
VisualStudio2017で、Python3/OpenCVを使って動画を加工する

#はじめに
唐突に画像と動画を加工してみたくなり、VisualStudio2017でPython3/OpenCVを使ってみました。

この記事の続きです。
[VisualStudio2017で、Python3/OpenCVを使って画像を表示する](https://qiita.com/kaysquare1231/items/10234dbb3a5663d095c4)


#実装
##やったこと
###実装した処理
・動画を読み込む
・縦100px, 横200px を切り取る
・動画を表示
・動画を保存

※gif形式では動画の入出力ができなかったので、手動でavi形式とgif形式の変換を行いました。

###Before
![sample_clip.gif](https://qiita-image-store.s3.amazonaws.com/0/308224/06a0d225-c671-9504-01bb-98bf7c127b63.gif)

###After
![sample_clip_after.gif](https://qiita-image-store.s3.amazonaws.com/0/308224/66c080c8-ace3-37bd-5886-cf566117a446.gif)


##サンプルソース
```Sample.py
import numpy as np
import cv2

#任意のパスを指定
clip = cv2.VideoCapture("sample\path\sample_clip.avi")

#読み込んだ動画の情報を取得
clipFps = clip.get(cv2.CAP_PROP_FPS)
clipHeight = clip.get(cv2.CAP_PROP_FRAME_HEIGHT)
clipWidth = clip.get(cv2.CAP_PROP_FRAME_WIDTH)

#対応してないコーデックを指定すると、上手く動画が出力されない
codec = cv2.VideoWriter_fourcc(*'DIVX')

#出力する動画の情報を指定
editedClipHeight = 100
editedClipWidth = 200

#出力先の任意のパスを指定
outputPathAndFilename = 'sample\path\output.avi'

#出力する動画の解像度と指定した解像度がずれると、上手く動画が出力されない
clipWriter = cv2.VideoWriter(outputPathAndFilename, codec, clipFps, (editedClipWidth, editedClipHeight))

while(clip.isOpened()):
    ret, frame = clip.read()
    if ret == True:

        #左上を起点に、[縦100px, 横200px]を切り出す
        editedClip = frame[0:editedClipHeight,0:editedClipWidth]
        
        clipWriter.write(editedClip)
        cv2.imshow('SampleClip', editedClip)

    #[ q ]を押すと表示が終了する
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

clip.release()
clipWriter.release()
cv2.destroyAllWindows()
```

##はまったポイント
何も考えずに下記のソースをコピペしたら、動画が上手く保存できなかったので備忘。
[動画を保存する — 動画を扱う — OpenCV-Python Tutorials 1 documentation](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html#id5)

下記の現象が発生していましたが、設定しなおすことで解決しました。
>ファイルは出力される。
>しかし、再生しようとしても動画が流れない。
>ファイルプロパティを確認すると、サイズが小さい。



他の解決策をご存知の方がいれば、教えていただきたいです。

###1. 対応していないコーデックを指定している
```Sample.py
#対応してないコーデックを指定すると、上手く動画が出力されない
codec = cv2.VideoWriter_fourcc(*'DIVX')
```
環境によって利用可能なコーデックが異なるようです。

###2. 出力する動画の解像度と、VideoWriterで指定した解像度が違う
```Sample.py
#出力する動画の解像度と指定した解像度がずれると、上手く動画が出力されない
clipWriter = cv2.VideoWriter(outputPathAndFilename, codec, clipFps, (editedClipWidth, editedClipHeight))
```

#参考資料
[動画を扱う — OpenCV-Python Tutorials 1 documentation](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_video_display/py_video_display.html)
AWS Labmdaでtwitterscraperがエラーがでる時の対処法

Pythonのtwitterscraperが、AWS Lambdaでエラーが出てしまい動かなかったので、対処法を記録しておきます。


## AWS Labmdaでtwitterscraperがエラーがでる時の対処法
残念ながら、twitterscraperで使用されているmultiprocessing.Poolがサポートされていないため、AWS Labmdaでtwitterscraperを使うことは出来ません。

対処法としては。他のスクレイピングライブラリを使うか。インフラを変更する必要があります。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Timestamp型のデータを時分秒切り捨てで取得する

	<resultMap id="javaTypePlus2" class="java.util.HashMap">
		<result column="seirino" property="seirino" />
		<result column="time2" property="time2" jdbcType="Timestamp"
			javaType="java.util.Date" />
		<result column="time1" property="time1" jdbcType="Timestamp"
			javaType="java.sql.Timestamp" />
	</resultMap>

	<select id="gettime" resultMap="javaTypePlus2" parameterClass="Map">
		SELECT seirino,time1,time2 FROM TIME
	</select>


時分秒切り捨てしたい場合
⇒time2の様にjavaTypeにjava.util.Date型を指定する

時分秒も取得したい場合
⇒time1の様に、javaTypeにjava.sql.Timestamp型を指定する

また以下の通り、DBサーバー側の型は問わない（jdbcTypeがTimestamp型でもsqlMap上Date型でも取得可能）

	<resultMap id="javaTypePlus2" class="java.util.HashMap">
		<result column="seirino" property="seirino" />
		<result column="time2" property="time2" jdbcType="java.util.Date"
			javaType="java.util.Date" />
		<result column="time1" property="time1" jdbcType="java.util.Date"
			javaType="java.sql.Timestamp" />
	</resultMap>
Windows7環境にPostgreSQLをインストールしてみた

# インストール
以下サイトを参照してインストール。
[【初心者向け】PostgreSQLのダウンロード及びインストール方法](https://eng-entrance.com/postgresql-download-install)
# ログイン
コマンドプロンプトを起動し、以下コマンドを入力。

```postgres:cmd
C:\Users\xxx>psql -l -U postgres

ユーザ postgres のパスワード:
                                             データベース一覧
   名前    |  所有者  | エンコーディング |      照合順序      | Ctype(変換演算子)  |     アクセス権限
-----------+----------+------------------+--------------------+--------------------+-----------------------
 postgres  | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
 template0 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |          |                  |                    |                    | postgres=CTc/postgres
 template1 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |          |                  |                    |                    | postgres=CTc/postgres
(3 行)
```
RHEL7でのCloudFormation

# はじめに
Amazon LinuxだとCloudFormationのヘルパースクリプトのパッケージaws-cfn-bootstrapが初めからインストール済みだけど、RHEL7のAMIを使うと入っていないので、どうやってインストールしようかって話。

# rpmによるインストール
公式サイトではrpmでインストール可能と記載されているのでそれに倣ってみる
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.html

```
sudo yum install -y https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.amzn1.noarch.rpm
```

だけどこれでテンプレートを実行しても期待どおりに動作しない。
試しに sudo /opt/aws/bin/cfn-initを実行してみると以下URL冒頭のようなエラーが出力される
http://huliad.blogspot.com/2015/12/solved-cent-os-7-importerror-no-module.html

対策としては上記URLに記載されているとおり、シンボリックリンクを作成したらとりあえず動いた。（パスは若干違ったけど）

# easy_installによるインストール
rpmを使わない方法もある。AWSがgithubで公開しているテンプレートとして以下URLのものがある。
https://github.com/awslabs/aws-cloudformation-templates/blob/master/aws/solutions/HelperNonAmaznAmi/RHEL7_cfn-hup.template
このファイル内では以下のように導入している

```
         "#!/bin/bash -xe\n",
         "yum update -y\n",
         "yum install -y python-setuptools\n",
         "yum install -y wget\n",
         "mkdir -p /opt/aws/bin\n",
         "wget https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
         "easy_install --script-dir /opt/aws/bin aws-cfn-bootstrap-latest.tar.gz\n",
```
wgetでダウンロードしてeasy-installする流れか。

# まとめ
どちらのインストール方法でもURLべた書きするのってどうなの？って気が若干してしまうがまぁ仕方ないのかな。
とりあえずインストール・実行はどちらの方法でもできたので後はまぁ運用性で違いがあるかどうか考えて決めればいいのかな。
Github-Pagesで画像が表示されない件

なんかhugoで作ったサイトをGithub-Pagesで公開しようと思ったら画像が綺麗さっぱり表示されてなかったから原因解明していこうと思う。
![Snip20190224_5.png](https://qiita-image-store.s3.amazonaws.com/0/367062/a55263af-9a73-8367-5236-06fdab4e8dbc.png)
↑実際はこうなってほしいのに
↓こうなる
![Snip20190224_6.png](https://qiita-image-store.s3.amazonaws.com/0/367062/3abd2039-e12d-68c5-c8eb-69c7b73efdc0.png)
github-pagesを開くとテキストやurlの内容は更新されていたので、おそらくhugo側に原因がある。
でhugoコマンドを実行してできるpublicディレクトリのindex.htmlを確認してみた。
![Snip20190224_7.png](https://qiita-image-store.s3.amazonaws.com/0/367062/d8b946f4-bde3-24b0-3706-5aa0b53c0a3e.png)
明らかにこの//example.org/がいらなかったので消したら全部解決した。
なんでこんないらんものついてくるんや...
WorkoutWednesday2019week08 - パレート図

最近TableauでVIZを作ることにはまっている。毎週やっているWorkoutWednesdayという企画についてせっかくなのでメモを書いていこうと思う。ちなみにWorkoutWednesdayとは毎週水曜日にこのVIZを作ってみよという課題が提示されて頑張って解くというもの。普段使わないテクニックを知れたり、面白い表現方法を学ぶ場としてとても良い。似た取り組みにMakeoverMondayというのもある。こちらはデータとそのビジュアライズが提示されて、もっと良いビジュアライズにしたらどうしたらいいか考えてMakeover(作りなおす)してみるというもの。

<img width="1230" alt="Screen Shot 2019-02-24 at 22.56.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/200471/64c05408-6c76-7196-5a6d-c89e8c0f589c.png">
http://www.workout-wednesday.com/2019-week-8-what-percentage-of-products-make-up-80-of-sales/

前段が長くなったが、今回は2019年の第8週のテーマについて元記事の簡単な翻訳と作ったVIZのポイントをまとめていきます。かなりザクっと書いています。時間があればおいおい細かい解説も書いていこうと思います。

元記事は以下。

# 今週のテーマ（ざっくり翻訳）
## 概要
今週は私の好きなチャートタイプであるパレート図をみていこう。パレート図の目的はxの20％がyの80％を占めるという一般的な仮定のもとに、xの何％がyの何％を占めるかを調べることにある。今週のワークアウトでは、xの％がyの80％と交差するポイントを特定する。また、xの任意のサブセットの実際の値を詳しく調べることも実現する。この課題の重要な部分は、Tableauの基本機能を利用して実現するという所にあります。2個以下の計算フィールドで作り上げましょう。

## 要件
- Dashboardサイズは 1200x500。シートは２枚。
- 売上合計の全体に占める割合が80%を超えるポイントに円マークを配置する
- 売上合計の80%と製品合計の20%にリファレンスラインをかく
- 使っていい計算式は二つまで。あとはビルトインの機能を使いましょう
- パレート図から製品を選んでダイナミックに表示/非表示を切り替える
- 内側パディングとして、全シートの全方向と、タイトルとラインセパレータの左右に15pxを設定する
- ツールチップとフォントと書式で色を揃える

## データセット
Tableau2018.3のサンプルスーパーストアのデータを使う。[data.world](https://data.world/stanke/sample-superstore-2018/workspace/file?filename=Sample+-+Superstore.xls
)からもダウンロード可能。

メモ：海外版と日本語版で内容が異なる可能性もあるのでTableau2018.3を使っていたとしてもdata.worldのデータを使った方が良いと思われる。

# 作レポ
結果的に計算式は1個しか使わなかった。何か観点が漏れてるかも。

## パレート図を作る
このサイトを参考にさせていただいた。ただしこの記事ではTableauバージョンが古いので、今は標準機能でできることが多く読み替えは必要。パレート図を作るだけであれば計算式を書く必要はない。
https://www.theinformationlab.co.uk/2014/08/27/pareto-charts-tableau/

## 80%を超えるポイントに円マークを作る
ここが一番苦労した。そしてここで1個計算式を作った。パレート図は計算フィールドを使わずとも標準機能で作れるのだが、流石にここは計算フィールドを使った。
作った計算フィールドは以下。
<img width="675" alt="Screen Shot 2019-02-24 at 22.42.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/200471/67f82931-a0a8-7816-1ba5-46ee7b04357f.png">

**売上の累計（合計に占める割合）**を```running_sum(sum([Sales]))/window_sum(sum([Sales]))```で表しています。running_sumもwindow_sumもどっちも表計算で、表（横）で計算しています。前者は累計、後者は表横方向つまり全部のマークの合計を算出しています。

そして、**売上の累計（合計に占める割合）**が80%を超えてて、かつ1個前のその値は80%を超えていない場合にのみ、**売上の累計（合計に占める割合）**を示すという計算式。1個前の値を見るためにlookup関数を使っています。

ちなみにテキストでも書いておきます

```
if running_sum(sum([Sales]))/window_sum(sum([Sales])) > 0.8
and lookup(running_sum(sum([Sales]))/window_sum(sum([Sales])),-1) < 0.8
then running_sum(sum([Sales]))/window_sum(sum([Sales]))
end
```

これさえできてしまえばあとは二重軸にして軸の値を同期してマークを円にして適切な色とサイズを設定すればOK.

## 詳細な売上を表示させる
ここはもう1個シートを作ってセットアクションで連動させます。作ったシートの完成品はこれ。
<img width="1216" alt="Screen Shot 2019-02-24 at 22.49.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/200471/99155bdb-3403-9254-1eb6-f236bc19ab75.png">

## ダッシュボードを作成
- 水平コンテナを使って左にパレート図のVIZ、右にリストのVIZを配置する。
- ダッシュボードアクションでセットアクションを選んでパレート図で選んだものがセットに入るようにする。選択がなくなった場合は全部セットから排除する。
- リストのVIZのタイトルを非表示にしておくと何も選んでいない状態では表示するものがなくなるので自動的にVIZが非表示になってパレート図のサイズが大きくなる。
- パレート図のVIZもタイトルは非表示にしておく
- あとは適当にタイトルを入れて完成！

# 所感
基本的な図でありながら作り方を覚えていないパレート図について理解が深まった。VIZ上の特定の１点を強調して表示するのは様々なテクニックがあるので、WoWで引き出しを増やせるのはかなり良い。セットアクションを使って詳細にもダイブできる作りは仕事でも使えそう。
Kotlin のコレクション・配列早見表

Kotlin でコレクションや配列を使うときにどれを使ったらいいのかいつも忘れてしまうのでメモ。
間違いなどありましたらご指摘お願いします。

# コレクション

次の3種類がある。要素や要素数の変更はできない。

| 名前  |  機能 | 作り方 | 
|:--|:--|:--|
| List | リスト | listOf() |
| Set  | 重複なしのリスト | setOf() |
| Map  | key と value を保持する | mapOf() | 

要素や要素数を変更できるようにした、MutableList、 MutableSet、MutableMap もある。

# 配列

Kotlin で配列を使おうとするといくつか種類があって迷ってしまうのでまとめ。
~~基本的に要素と要素数の変更を認めるかで使い分ければよさそう。~~
-> 基本的には要素を変更しない場合は List、変更する場合は MutableList でよさそう。(@sdkei さんのコメント参照)

| Kotlin | Java の対応 | 作り方　| 要素の変更 | 要素数の変更 |
|:--:|:--: |:--: |:--:|:--:|
|List\<T>| List\<T> | listOf() | ☓ | ☓ |
|Array\<T>| T[] | arrayOf() | ○ | ☓ |
|ArrayList\<T>| ArrayList\<T> | arrayListOf() | ○ | ○ |
|MutableList\<T>| ArrayList\<T> | mutableListOf() | ○ | ○ |


- Array<T> には T がプリミティブ型の場合のクラス (IntArray、ByteArray など) が用意されている。
- MutableList と ArrayList は同じと考えて良い(MutableList は裏側では ArrayList を呼び出している。)。
将来的に MutableList の裏側の実装が変更される可能性はあるらしい。使い分けとしては、基本的には MutableList を使い、
ArrayList でなければならないというときのみ ArrayList を使うということでよさそう。(Kotlin の ArrayList の実体は Java の ArrayList なので、Java との相互運用を考えた場合とか？？？)


## 参考等
- [Kotlin 公式(Arrayについて)](http://kotlinlang.org/docs/reference/basic-types.html#arrays)
- [MutableList と ArrayList の違いについて (Stack Overflow)](https://stackoverflow.com/questions/43114367/difference-between-arrayliststring-and-mutablelistofstring-in-kotlin)

Kotlinの公式ドキュメントは平易な英語で書かれていてわりかし読みやすい。
ECSのinput JSON の雛形


* これなら動いたのでメモ

```
{
    "cluster": "ecs-cluster-sample-springboot",
    "taskDefinition": "ecs-task-sample-springboot",
    "count": 1,
    "launchType": "FARGATE",
    "platformVersion": "1.3.0",
    "networkConfiguration": {
        "awsvpcConfiguration": {
            "subnets": [
                "subnet-*****"
            ],
            "securityGroups": [
                "sg-*****"
            ],
            "assignPublicIp": "ENABLED"
        }
    }
}
```
minilogue xdで参照できる外部変数について

minilogue xdには外部変数として、下記のものが `osc_api.sym` に定義されている。

```
k_osc_api_version = 0x0800f000;
midi_to_hz_lut_f = 0x0800f100;
sqrtm2log_lut_f = 0x0800f360;
tanpi_lut_f = 0x0800f764;
log_lut_f = 0x0800fb68;
bitres_lut_f = 0x0800ff6c;
wt_par_lut_f = 0x08010170;
wt_par_notes = 0x08010f8c;
wt_sqr_lut_f = 0x08010f94;
wt_sqr_notes = 0x08011db0;
wt_saw_lut_f = 0x08011db8;
wt_saw_notes = 0x08012bd4;
wt_sine_lut_f = 0x08012bdc;
schetzen_lut_f = 0x08012de0;
cubicsat_lut_f = 0x08012fe4;
wavesA = 0x080131e8;
wavesB = 0x0801546c;
wavesC = 0x080174ec;
wavesD = 0x0801915c;
wavesE = 0x0801abc4;
wavesF = 0x0801ca3c;
_osc_mcu_hash = 0x0801eabc;
_osc_bl_saw_idx = 0x0801eac8;
_osc_bl_sqr_idx = 0x0801ebb0;
_osc_bl_par_idx = 0x0801ec98;
_osc_rand = 0x0801ed80;
_osc_white = 0x0801edb8;
```

以下、それぞれの変数について判明し次第追記:

* `k_osc_api_version` 
    * logue SDKのAPI番号が入っている？
* `midi_to_hz_lut_f`
    * midiのノート番号と発振周波数の対応テーブル
    * おそらく、マイクロチューニングを切り替えるたびに中身が変わる -> 確かめてないので違うかも
* `sqrtm2log_lut_f`
    * `sqrt(-2*log(x))` を計算するためのテーブル
    * `osc_api` や `fx_api` にこれを使った関数が定義されているので、このテーブルを直接使うことはなさげ
* `tanpi_lut_f`
    * `tan(pi*x)` を計算するためのテーブル。これも直接使うことはなさげ。
* `log_lut_f`
    * `log(x)` を計算するためのテーブル。同上。
* `bitres_lut_f`
    * bit depthの変換テーブル？ `osc_bitresf`関数で使用。
* `wt_par_lut_f`
    * 放物線波形テーブル。`osc_parf`関数で使用
* `wt_par_notes`
    * 不明
* `wt_sqr_lut_f`
    * 矩形波テーブル
* `wt_sqr_notes`
    * 不明
* `wt_saw_lut_f`
    * ノコギリ波テーブル
* `wt_saw_notes`
    * 不明
* `wt_sine_lut_f`
    * サイン波テーブル
* `schetzen_lut_f`
    * `osc_api`のソースコメントには "Schetzen saturation" と書いてある
    * 歪み用のテーブル？
* `cubicsat_lut_f`
    * `osc_api` のソースコメントには "Cubic saturation" と書いてある
    * 歪み用のテーブル？
* `wavesA〜D`
    * プリセットのUser OSCで使っている六種類のwavetable
    * それぞれ16個の波形を格納
* `_osc_mcu_hash`
    * マイコンに関する何かのハッシュ値を返す関数？
* `_osc_bl_saw_idx`
    * "Get band-limited sawtooth wave index for note."とある
    * バンドリミットされたノコギリ波に関連するなんかのindexを返す関数なのだが、使用例がないのでよくわからない
    * どうでもいいが、引数のレンジが[0-151]なのに型が`float`なのは変
* `_osc_bl_sqr_idx`
    * 矩形波に関すること以外は同上
* `_osc_bl_par_idx`
    * 放物線波形に関すること以外は同上
* `_osc_rand`
    * ランダム関数
    * 0からUINT_MAXまでの整数値をランダムに返す
* `_osc_white`
    * ホワイトノイズを返す関数（=返り値がfloatのランダム関数)
PhpStormのショートカットで最下部or最上部に移動する方法 for Mac

# PhpStormで最下部or最上部へ移動

PhpStormを使い始めていくつかのショートカットが従来のエディタとは異なり少し困惑したので一応記事として残していくとします。

最上部へ移動 = `command` + `fn` + `↑`
最下部へ移動 = `command` + `fn` + `↓`

今までのエディアは`command` + `↑`などで移動できていたのでちょっと困惑しました。
MacBookPro(2016)で日本語入力ON時にフリーズする現象を倒す

## タイトル読んでもいまいちわからないけどどういうこと？
1. MacBookPro(2016)を用意します
2. Safariを立ち上げます
3. テキスト入力するフォームを開きます
4. macos標準の日本語入力がONの状態で入力します
5. 数秒間フリーズします

cloud9で入力が全然出来なくてキレちまったよ…ってなったので倒すことにしました。
しょうもない理由で倒しに行くあたり、異世界転生モノっぽいですね。

## 検証環境

- macOS High Sierra 10.13.6
- Safari 12.0.3(12606.4.5.3.1)

## てっとりばやい解決方法

以下のいずれかを採用すると、それだけで解消します。

- Safariを使わず、ChromeやFirefoxを使う
- mac標準の日本語入力を捨て、Google日本語入力等に乗り換える

## それでも純正の組み合わせで使いたい！

少数派だと思いますが、OS標準機能だけ使ってると安心という層の方はまぁまぁいらっしゃいます。
ぼくもその一人、ここはどうにかしてSafariとmacOS標準日本語入力だけで使いたいのだ！
修正は設定を変えるだけなので、サクっと終わります。
いざやっていきましょう。

まずは「システム環境設定」の「キーボード」を開きます。

<img width="669" alt="スクリーンショット_2019-02-24_22_21_52.png" src="https://qiita-image-store.s3.amazonaws.com/0/304374/aee52535-bb81-aeaa-7b90-b3fc43e4f275.png">

次に「ユーザー辞書」の「Touch Barに入力候補を表示」の**チェックを外します**。
なんでこの機能がユーザー辞書に含まれているのか理解に苦しみますが、これで解決です。
おつかれさまでした。

<img width="670" alt="スクリーンショット_2019-02-24_22_22_46.png" src="https://qiita-image-store.s3.amazonaws.com/0/304374/16c92e43-2c52-6c06-1c5c-c0db981d1d7b.png">

~~ん？ユーザー辞書がおかしい？気にしてる暇があるなら艦これで一番気合が入ってる金剛型二番艦の比叡ちゃんをすこれ。~~

## (当然だけど)Touch barに変換候補が出なくなる
この機能を使っている方をとんと見たことがないのですが、使っている方には悲報以外の何物でもないですね。
諦めてOSをHigh SierraからMojaveいきましょう。直ってるらしいですよ。
iOS 12 SDK の NSURLSession が NSPOSIXErrorDomain (Code=53) で失敗することがある

# iOS 12 SDK の NSURLSession が NSPOSIXErrorDomain (Code=53) で失敗することがある

以下の場合に NSPOSIXError で失敗することがあります

1. Background Session ではない NSURLSession の通信中にアプリをバックグラウンドに移行し、フォアグラウンドへ戻すと失敗する
2. [iOS12の実機でwillEnterForegroundのタイミングで通信すると失敗する](https://qiita.com/akasaaa/items/ac95c54f9a574115a3ca)

本記事では、(1.) について説明します。
なお、この問題については [AFNetworking/issue/4279](https://github.com/AFNetworking/AFNetworking/issues/4279) にて詳細に議論されています。
本記事の解決方法も概ね上記を参考にしています。

## 解決方法

解決方法は以下が考えられます

* エラーの場合にリトライする
  * リクエストのべき等性が保証される場合、最もシンプルな解決法です
* backgroundSessionConfiguration を使用する
  * 巨大なファイルのダウンロードなど、非常に時間がかかることが分かっている時は Background Session の使用を検討すべきです
* UIApplication のバックグラウンドタスクを使用する
  * リクエストが比較的短時間 (180 秒以内程度) の場合、UIApplication の Backgraund Task が有効です

```objc
__block UIBackgroundTaskIdentifier bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
   [[UIApplication sharedApplication] endBackgroundTask:bgTaskId];
    bgTaskId = UIBackgroundTaskInvalid;
}];

[[session dataTaskWithURL:url
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            // do something...
        }] resume];

[[UIApplication sharedApplication] endBackgroundTask:bgTaskId];
bgTaskId = UIBackgroundTaskInvalid;
```

## 所感

この問題は以下の条件を満たさないと顕在化しないため、あまり問題にはならないかもしれません。

* リクエストが完了するまで微妙に長い
* Background Session を使用していない

また、Apple 側では解決済み……らしいので次のアップデートに含まれることを祈りましょう。

## 参考

* https://qiita.com/akasaaa/items/ac95c54f9a574115a3ca
* https://github.com/AFNetworking/AFNetworking/issues/4279
できるリーダー(テックリード)になるためのトレーニング法②

## はじめに
うめりんです。前回は[概算見積もりのためのトレーニング](https://qiita.com/umerin/items/ab85c834502d4fb3f648)でした。
まだご覧になっていない方は、記事に順序性は無いので後からでもご参考にして頂ければと思います。

## ②すぐに決断ができるように、普段から裁量の範囲を意識し影響範囲を把握しておく
考え方はエンジニアに限ったものでは無く、誰でも身につけられるものです。

##なぜ必要なのか？
リーダーになると何かにつけて
「どうしましょう？」と相談されたり
想定外の調査依頼や不具合対応などによる割り込み作業が圧倒的に多くなります。

その際、時間をかけても質や内容が変わらないものの決断を先延ばしにしてしまうと、その間にも後から来た相談・依頼が更に積まれることになり、精神的にも辛くなりがちです。

##具体的に何をすれば良いのか
まずは、決断には以下の種類があることを知って下さい。
端的に表現するなら、ルール把握と言えます。
・自分独りで決められる（決めても良い）正解があるもの
・自分独りで決められる（決めても良い）正解がないもの
・自分独りでは決められない（決めてはいけない）正解があるもの
・自分独りでは決められない（決めてはいけない）正解がないもの
・他者が決断するために情報を提示するもの
迷いがちな方は、上記の種類のどれに当てはまる事象なのかを自身で整理が出来ていない時が多いので、「決めるべき人（決断主体）は誰か」「正解の有無」を常に考えるようにして下さい。

次に、何を聞かれているのか（求められているのか）を正しく理解する（確認する）癖を付けて下さい。
端的に表現するなら、状況把握と言えます。
特にメンバーや他職種や上司から、やりたいことの手段だけを提示された場合、その手段が実は最適では無いことが往々にしてあります。
「本当にやりたいこと（実現したいこと）は何か」を簡易な言葉で明確にすることで、求められていることの誤解が避けられます。

そして最後に、シミュレーションする癖を付けて下さい。
端的に表現するなら、先読みと言えます。
何かの方針や基準を決める時、その決定の影響は誰がいつまで受けるのか。やることを決める時、増やす・減らす・変えるのどれかになると思いますが、関連して変化するものが無いのか。これらを答えられないとすれば、それは事前に調査・把握しておかなければなりません。
自身の頭の中で（書き出しても大丈夫ですので）時間を進めてみて、決定した内容がインプットになり次に何が起こるかを想像してみて下さい。将棋で相手の打ち手を読む時の感覚が分かりやすいかも知れません。次の自分の手番も含め多くても5手先までを読むようにすれば、十分なことが多いです。

## おわりに
ルール把握⇒状況把握⇒先読み、これらを習慣づけることで決断内容の正確性向上とスピードアップが期待できますので、お試し下さい。
画像認識・ゲーム開発からカフェ作りまで、今年のデブサミを紹介

2019年2月14日から15日まで、ホテル雅叙園東京で開かれた今年のデブサミのテーマは「SHARE YOUR FUN!」。最新技術から組織運営、エンジニアのキャリア相談などまで、今年もさまざまな興味深い講演が多数発表されました。デブサミの講演はメディアにそれほど掲載されないのですが、講演資料の多くがイベント後に公開されますので、その中から興味深いものをピックアップして紹介します。まずは、AWSで提供しているディープラーニング技術による画像認識サービス”REKOGNITION”を提供しているAWSからの講演をふたつ。ゲーム開発に関連する発表も結構ありますが、ドラゴンクエストXを支える失敗という題にてスクエアエニックスの青山さんが行った講演、そして最後に、AWS運営で有名やクラスメソッド社がDEVELOPERS.IO CAFEを作った経緯を語ってくれた講演をご紹介します。

※下記サイトからの転載。ビッグデータ・AIなどに関するトピックを毎週取り上げています。
[TechCrowd: https://www.techcrowd.jp/related/](https://www.techcrowd.jp/related/)


#[コンピュータビジョンを支える深層学習技術の新潮流] (https://www.slideshare.net/devsumi/14c7-132694149)

アマゾン　ウェブ　サービス　ジャパンの鮫島 正樹氏の講演です。ディープラーニング技術を用いているコンピュータビジョン・画像認識のサービスであるREKOGNITIONを運営しているAWSのSolution Architectによる、最新のコンピュータビジョン関連の技術動向からAWSで提供しているサービスの進歩などを紹介してくれています。

まずは、コンピュータビジョンの認識精度で2010年代に入り、飛躍的に向上しているという動向を紹介。衛星画像への適用や画像の奥行推定なども進んでいること、一方で、学習に利用するデータ量が少なくても高精度なモデルを構築することに対する挑戦も進んでいること、などコンピュータビジョンに関連するトピックスをまず紹介してくれています。

その後に、コンピュータビジョンを用いたシステム開発の課題として、高性能なアルゴリズム実装の難しさ、深層学習フレームワークの乱立、デバッグの困難さおよびデータ処理・データ加工・モデル調整作業にかかる作業の大変さと、それに対する解決策への取り組みの最新事例を紹介してくれています。その中には、予測アルゴリズムをデータから自動的に設定してくれるAWSのAutoMLサービス “Amazon Forecast”の紹介も含まれています。

コンピュータビジョン運用の課題としても、構築されたモデルを使ったコンピュータビジョンによる認識を高速、あるいは低スペックなハードウェアで実行可能とするための技術として、深層学習コンパイラなどの紹介をしてくれています。深層学習のモデルを実行するハードウェアに応じてモデルを変換して、モデルの推論速度を向上させるもので、AWSであればSageMaker Neoなどのサービスが提供されています。


#[入社半年での開発ストーリー　- 千人規模の顔認証受付サービスを1ヶ月で作った話 -] (https://speakerdeck.com/hariby/dev-summit-2019?slide=2)

やはりAWSのSolution Architectである、針原 佳貴氏による講演です。2018年4月にAWS Japanに入社した大学院卒の5人のSolution Architectのストーリ紹介です。

シアトルのアマゾン本社で、フリーアドレスになった新オフィスでの人探しサービスを顔認識で実現するものを作るという話から、社内イベントの顔認識受付のサービスを作ることに話が変わっていったようです。基本的にAWSのDeep Learningを用いた画像認識のサービスAmazon REKOGNITIONを使ってシステムは構築。環境による違いはあるものの、REKOGNITIONのAPIの応答時間は500msほどなので、イベント受付で入場者の画像をとってREKOGNITIONに送ればリアルタイムの認証が可能となります。

認証失敗の一番の原因は登録もれだったとのこと。顔認証のみではなく社員証の所持と合わせた2要素認証として、オフィスネットワークからのIP制限、APIエンドポイントを自前で作らないなどがセキュリティ上の考慮点としてあげています。

イベント当日のコストは$20以下とのこと。REKOGNITIONが$15, その他のAWSのコストを合わせても2,000円程度とは安いと思いました。気がついたら、いろいろなところに利用されるようになるかもしれませんね。


#[ドラゴンクエストXを支える失敗事例] (https://www.slideshare.net/devsumi/15a1x)

スクウェア・エニックスでドラゴンクエストX　オンラインのプロデューサーで責任者である青山 公士氏による講演です。

開発においても運営経験、運営における視点をもっていることが重要という観点で、ドラゴンクエストX オンラインの失敗事例を３つ紹介してくれています。

１つ目が、効果音が鳴り続いたり、ノイズが発生することがあったこと。ほかの不具合修正によるエンバグだったとのこと。教訓は影響範囲を明確にするとともに影響範囲は極力狭く認定するのが安全ということ。

２つ目が、オートマッチング機能が機能しない場合があったとのこと。これも別のデータフォーマット変更対応における暫定対応で、ソースに条件をベタ書きしたものを忘れてそのままにしたこと。教訓は暫定対応は本対応完了までをチケット管理するべきとのこと。

３つ目が、獲得した獲物のサイズが誤って判定されることがあったこと。こちらの教訓は表面化していない不具合でもある前提で対応すべきとのこと。

最後に全体を通しての教訓として、リリース後の改修は要注意という話でしめています。


#[顧客体験にこだわった「Developers.IO CAFE」が生まれるまで] (https://weekly.ascii.jp/elem/000/000/425/425656/)

週刊アスキーに掲載された、クラスメソッド代表取締役の横田聡氏によるデブサミ2019での講演レポートです。レジに並ばずに商品を購入できるコンビニとして注目を集めている「Amazon GO」を作ってみたいという野望にチャレンジした「Developers.IO CAFE」プロジェクトを聴衆に披露した記事です。

クラスメソッド社はAWSのプレミアコンサルティングパートナー。AWSのインフラや運用保守を強みとし、2月12日にはレジレスカフェである「Developers.IO CAFE」を秋葉原にオープンしました。

オープンまで、シーズン1、シーズン2、シーズン3と、メンバを変えていって、クラスメソッドの会社全体をあげて取り組んでいった様子をすごく感じられる記事となっています。

ぜひご覧になってください。わたしも秋葉原のお店に行ってみたいと感じました。
調整

# 入り口

<img width="1440" alt="スクリーンショット 2019-02-24 22.20.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/139047/85f6128a-d64f-4bf3-f3ab-700db9a0da69.png">

# 出席簿
<img width="1440" alt="スクリーンショット 2019-02-24 22.22.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/139047/32207860-186c-4e46-e1fc-f8a02346fe55.png">

# 入力
<img width="1440" alt="スクリーンショット 2019-02-24 22.22.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/139047/4427a77a-7d4f-0ada-5574-1d3a18e36105.png">

# 反映
<img width="1440" alt="スクリーンショット 2019-02-24 22.23.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/139047/6bdbf378-19bf-518e-9de6-1dec136b9bfc.png">
Anaconda のWindows版のインストール

２年ほど前、Pythonを使っていたが、最近使っていないので忘れてしまっていた。環境を作り直して、再チャレンジということでAnacondaをインストール。

# インストール
[Anacondaの配布サイト](https://www.anaconda.com/distribution/)に言って、Windows版を落とします。
ここで、Windows / maxOS / Linuxの３つがありますので、何もしないとmacOSになっています。
Windowsのところをクリックして、Windows版を落としましょう。2019/2/24の時点では、2018.12版＝Python3.7.1が最新となっています。やりたいことに必要なライブラリによってはPythonの古いバージョンでないと動かない場合があるので、注意しましょう。また、64bit版と32bit版が選べます。自分に適したものを落としましょう。

落とし終えたら、
「Anaconda3-2018.12-Windows-x86_64.exe」
を実行。

メッセージに従ってインストールするだけ。

最後に、Visual Studio Codeの最新版をインストールするかを聞いてくる。どうやら、Visual Studio Codeと連携できるらしい。統合環境としてSpyderがあるので、存在意義はわからんが、好みの問題かもしれない。これから使っていく中でわかったら、投稿していきます。
（２年前とは時代が変わったものだ・・・）

# アンインストール
やり直しをしたくてアンインストールを実施。けど、最後の注意にもあるところをちょっとだけ悩んだのでメモがてら記載。
「スタートメニュー」→「設定」→「アプリと機能」
で
「Python 3.7.1 (Anaconda3 2018.12 64-bit)」
を探します。

注意：迷うのは、「Anaconda」というものはありません。が、上のものを指定してAnacondaはアンイントールされます。
アセットパイプラインについて

## まずアセット(asset)とは
JavaScriptコードやスタイルシート、画像などアプリで扱うソース一式の総称

# アセットパイプラインとは
自分達が書いたCSSやJavaScript、画像などのリソース(asset)を効率的に扱うための仕組み。
sprockets-railsというgemにて提供されているSprockets機能を使い、ブラウザが読み取れる形式で、実行速度が速く、ブラウザキャッシュ(データを取り出しやすい状態にしておくこと)に対して最適化すること。

## アセットパイプラインの処理の流れ

### 1. 高級言語のコンパイル
CoffeeScript(JavaScriptコードを書くのが楽になる高級言語)、SCSS(cssを書くのが楽になるsassの記法の一つ。)、ERB、Slim(ERBよりスッキリした記述のテンプレートエンジン)等で記述されたコードをコンパイルして、ブラウザが認識できるJavaScript、CSSファイルにする。

### 2. アセットの連結
複数のJavaScript、CSSファイルを一つのファイル(application.jsやapplication.css)に連結することで、読み込みに必要となるリクエスト数を減らし、読み込みの時間を短縮する。

### 3. アセットの最小化
スペーズ、改行、コメントを削除して、ファイルを最小化し、通信量を節約する。

### 4. ダイジェストの付与
コードの内容からハッシュ値(ダイジェスト)を算出してファイル名の末尾に付与する。これによってコードが変更されればファイル名が変更されるため、ブラウザのキャッシュの影響で修正が反映されないという問題を防ぐことができる。

## Railsでcssとjavascriptを読み込ませる
Railsで読み込む方法としてヘルパーメソッド（stylesheet_link_tag, javascript_include_tag）を使う。

```
= stylesheet_link_tag 'application', media: 'all', 'data-turbolink': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
```

# マニフェストファイルを作成し、各ファイルを連結する
マニフェストファイルとは読み込みたいアセットのリスト一覧のこと。具体的にどのソースコード同士を連結するのかをマニフェストファイルにあらかじめ記述しておくしておく必要がある。
Railsにはデフォルトで下記のマニフェストが用意されています。

・/app/assets/javascripts/applications.js
・/app/assets/stylesheets/applications.css

## マニフェストを定義する
Sprocketsを利用するにはまずマニフェストを記述しておく必要がある。マニフェストファイルに連結したいファイルを記述する。

```applications.js
//= require jquery
//= require_tree.
```

```applications.css
/*
*= require_tree
*= require responsive.css
*/
```

マニフェストの定義はそれぞれコメントの配下にJavaScriptは「//= require」、
cssは「/* *= require */」の形式で表す。
・require... 指定したファイルを記述した位置に取り込む。
・require_tree... 指定されたディレクトリ配下の全ファイルの内容を統合し、記述した位置に取り込む。
Tasmota TLS 設定

※超初心者が書いた自分への備忘録です。

## Mosquitto TLS 通信する為に [Tasmota にフィンガープリント](https://github.com/arendst/Sonoff-Tasmota/wiki/Securing-your-IoT-from-hacking) を設定する
- mosquitto のフィンガープリントを取得する（Pi にログインして実行する）

```bash
openssl s_client -connect localhost:8883 < /dev/null 2>/dev/null | openssl x509 -fingerprint -noout -in /dev/stdin | sed 's/^.*=//' | sed 's/:/ /g'
```
- [user_config.h](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/my_user_config.h) の91～92行に フィンガープリント、ユーザー名、パスワードをセットする

```
define MQTT_FINGERPRINT1      "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07"  // [MqttFingerprint1]
define MQTT_FINGERPRINT2      "A5 02 FF 13 99 9F 8B 39 8E F1 83 4F 11 23 65 0B 32 36 FC 07"  // [MqttFingerprint2]
define MQTT_PORT              8883              // [MqttPort] MQTT port (10123 on CloudMQTT)
define MQTT_USER              "DVES_USER"       // [MqttUser] MQTT user
define MQTT_PASS              "DVES_PASS"       // [MqttPassword] MQTT password
```



### [ビルドする。](https://qiita.com/beginnnnner/items/0b7017dd719e3579edc9)
MAMPでphpのmemory_limitを変更したい

[MAMP & MAMP PRO](https://www.mamp.info/en/)も2018年春頃にMAMP5がリリースされました。
バージョンごとにGUIも少しづつ変更しています。

取り急ぎの動作確認や簡潔な開発をするときは、お手軽に使えます。

MAMP PROは有料ですが、サイトによりphpのバージョンが違う場合、それぞれバージョンを指定出来ます。


以前なら、php.iniを直で書き換えて有効だったのですが、いつも間にapacheを再起動したらデフォルトに戻ってしまうようです。

`Configuration File (php.ini) Path	/Applications/MAMP/bin/php/php7.2.7/conf
Loaded Configuration File	/Library/Application Support/appsolute/MAMP PRO/conf/php7.2.7.ini
`

apacheを再起動しても有効になるようにするには、MAMPのGUIで操作します。

左メニューの「LANGUAGES」のphpを選択、「Default version」のバージョンの右にある右矢印のアイコンでMAMPのエディタが起動し、php.iniが表示出来ます。
変更したい箇所を修正して保存し、apacheの再起動で有効になります。
vvvv Rekorderノードでタイトルバーを非表示にしてgif出力する

#vvvv Rekorderノードでタイトルバーを非表示にしてgif出力する
Rekorderノードの入力ピン:Show Cursorに1を入力した状態(↓画像)で書き出しを行う。
![0_2019.02.24-21.55.38.png](https://qiita-image-store.s3.amazonaws.com/0/348343/75abbbbe-f303-da33-4f89-011bb284349f.png)

そうすると↓画像のようにタイトルバーが非表示の状態でgifが出力されます。
![0-Renderer_2019.02.24-21.58.32.png](https://qiita-image-store.s3.amazonaws.com/0/348343/92cb83a8-3fb3-6c10-22b4-c2fb023a280b.png)

#Rekorderノードを使ったgifの書き出し方法
Rekorderノードを使ったgifの書き出し方法は下記サイトが参考になります。
[Introducing: The Rekorder](https://vvvv.org/blog/introducing-the-rekorder)
[【vvvv50】Rekorderでgifを書き出す](http://reiji1020.hatenablog.com/entry/2017/01/14/222404)
ダイエットでわかる目標管理と成果指標設計のコツ

# はじめに
OKR、KGI/KPI…と3つの英字で表現される目標管理ツール。無駄に英字のせいで「KPI設計(成果指標設計)」と言われると難しいものと思ってしまいがちです。本来は皆さんも普段から実践しているシンプルなものであるはずなのに、英字のせいで「PVが〜」「CPAが〜」とそれらしいけど的はずれなことをしてしまうのです。

この記事では、ダイエットを例に成果指標設計のコツを伝えます。

# ダイエットでわかる目標管理
![無題のプレゼンテーション.jpg](https://qiita-image-store.s3.amazonaws.com/0/94249/5ba3c7cd-6c54-cc83-1af2-a8787a95d5a5.jpeg)
私の言いたいことは、この図ですべて言い表されています。ダイエットで考えると「えっ、これだけ!?」と思われるかもしれません。目標管理や成果指標、OKRツリー、KPIツリーなどと難しい言葉で表現しても、実際やっていることは当たり前のことなのです。

## 定性目標
定性指標は、あなたが成し遂げたいことを文で表現したものです。OKRのObjectiveに相当します。

単純に見えて一番難しいのが定性目標の設定かもしれません。「痩せないと〜」という人は多いですが、どうして痩せなければならないのかを明確に答えられる人は多くありません。「痩せないと〜」と口に出しても痩せるための納得できる理由がなければ、「まっ、いいか」となり、モチベーションを維持できません。ダイエットなら個人の問題ですが、複数人で共通の意味のある目標を考えるのは至難の業です。意識の高い本は「ビジョナリー・カンパニーになろう！」とか簡単に言ってきますが、痩せる理由すら明文化できる人は多くないことを真摯に受け止めるべきです。

## 成果指標（遅行指標）
成果指標は、定性目標を達成するために基準となる指標です。OKRのKey ResultsやKPIに相当します。

体重が減ること自体は目的ではありませんが、体重が減れば憧れの服を着られるのに近づきます。どのくらい目標に近づいているかのマイルストーンになるのが成果指標です。

成果指標は往々にして遅行指標であることが多いです。遅行指標は、遅れて数字が変動する指標で、直接はコントロールできない数字です。「体重を減らそう」と思っても、通常直接体重自体を減らすことはできません。（体重の場合、脂肪吸引手術のように直接減らす荒業もありますが、普通は取られない手段です。）

目標管理でよくある失敗は、作るのを成果指標(遅行指標)までで止めてしまうことです。遅行指標は、直接コントロールできないので、遅行指標だけを見ていても何をすればいいかがわかりません。りんごダイエットやバターコーヒーダイエットなど※当てずっぽうで施策を打って、上がった下がったと一喜一憂し、一度あたった施策が効果がなくなるまで、使い潰すということをしてしまいます。これをしないようにするのが先行指標です。

※ りんごダイエットやバターコーヒーダイエットも摂取カロリーをコントロールする置き換えダイエットとして行うなら構いません。世の中には、これをしてさえいれば、いくらでも代わりに食べてもいいという発想の人もいます。そういう人のことをここでは当てずっぽうの施策と言っています。

## 先行指標
先行指標は、成果指標(遅行指標)を変動させる因果関係を持った指標です。OKRツリーやKPIツリーの末端(葉)よりの指標です。技術的に一番設定が難しいのが先行指標かもしれません。

体重を減らしたい場合、体重自体ではなく一日の摂取カロリーと代謝カロリーをコントロールしようとするでしょう。摂取カロリーや代謝カロリーは自らの行動でコントロールできるものであり、摂取カロリーを抑えたり代謝カロリーを増やしたりすれば、その結果、体重が減ることがわかっているからです。レコーディングダイエットは、先行指標を管理することで痩せようとしているダイエット法と言えるかもしれません。

体重だと既にカロリーが影響するということはわかっていますが、そうでない成果指標の場合は、因果関係を持っている指標を自ら探さなければなりません。[疑似相関](https://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E7%9B%B8%E9%96%A2)を持った指標を誤って設定しないように、統計学的な素養が必要です。これは、難しいは難しいですが、あくまでテクニックの問題です。感情的なものが混ざる定性目標と比べれば、まだ解決しやすい問題です。

## 施策
施策は、先行指標を変動させるための行動です。正しい先行指標を見つけ出せさえすれば、難しい話ではありません。摂取カロリーを抑えたいなら、お菓子や日々の食事の量を減らせばいいですし、代謝カロリーを増やしたいなら運動量を増やせばいいのです。欲望に負けちゃって、実践が難しいというのはまた別の問題です。

もし、施策がパッと思いつかないとすれば、先行指標の抽象度が未だ高いのかもしれません。先行指標の先行指標を見つけ出し(ここで、OKRツリーやKPIツリーをなぜ作るべきかがわかりますね！)、施策がスッとでてくるようにしましょう。

# おわりに
厳密に言えば、目標管理や成果指標設計について、ダイエットの例では適当ではない部分もありますし、企業固有の難しい問題もあります。しかしながら、その難しい問題に至る前に躓いている企業や部署は少なくないと思っています。

この記事は、そういう企業や部署向けに当たり前のことだけを書きました。小難しい本を読む前に、この記事を読んで「何を当たり前のことを言っているんだ」と言いながら、自社・自部署を振り返ってみていただければと思います。私自身も、常には実践できてはいません。多分、適切な目標を設定し、PDCAサイクルを回すというのは、当たり前ですが容易なことではないと思うのです。

これよりも若干テクニックよりの目標管理の話は、『[なぜKPIよりもOKRと言われるのか？OKRの勘所](https://qiita.com/Trickey/items/1b99cd19bff2f328d9a0)』で行っています。
よければご覧ください。
CentOS 7-8 インストール備忘録

###CentOS 7 セットアップ時の基本構成のメモ（手順書）
※ あくまで、自分向けですよ〜

####ISOのダウロード
公式サイト
https://www.centos.org/download/

特定のバージョンを使いたいときは、公式サイトからでなくここから
[http://archive.kernel.org/centos-vault/](http://archive.kernel.org/centos-vault/)

####インストールメディアを作成
今時は光学ドライブがないことが多いのでUSBメモリに

Rufus
[https://rufus.ie/](https://rufus.ie/)

VMwareなどでは、解像度が小さくボタンが表示されなことがあるので
ブートメニューで、[Tab]キーを押下。

```
resolution= 
(例) resolution=1024x768
```

解像度を入力する。

<img width="752" alt="スクリーンショット 2019-02-24 21.32.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/333729/55c41aff-00a2-c20e-16ea-e1b5a1d0e63c.png">

###インストール
####言語・キーボードを設定
<img width="912" alt="スクリーンショット 2019-09-27 2.38.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333729/d6d8c0e7-5cd5-e633-c0f2-42905fad4370.png">

####最小構成でインストールをする。

####パーティションの設定
+ 開発機や個人使用（ライトユーザ）の場合のパーティションは、「標準パーティション」を選択。
※ LVMの恩恵を受けるのはごく一部の方のみと思うので、基本「標準パーティション」を選択で問題ない.

* ファイルシステムは、「xfs」を選択。
※ 安定と実績の「ext」は今後（RHEL 8以降）のことを考えて選択しない。（RHELがxfsベースのFSを開発する？という噂があるので）
→ 宿題:ext4 と xfs のメリットデメリットを考える

* 寿命を考えSSDの場合swapは作成しない。
※ HDDの場合は、swap領域は作成する。

<img width="1136" alt="スクリーンショット 2019-02-24 21.44.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/333729/64f036e2-524c-8318-0121-3190f45f7a6e.png">

+ 本番機や個人使用（ガチユーザ）の場合のパーティションは、「LVM」を選択。

(下記区切り方で問題ないか検証中）

+ システム系は、VG00
+ データ系は、VG01
- 保守・バックアップ系は、VG02（ここでは、載せてません）

![スクリーンショット 2019-10-28 5.25.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333729/f1ef3a72-389d-2c4a-002a-1cb50a8c4986.png)

####ネットワーク
+ ホスト名を入力
+ IPアドレスを固定にする場合は、ここで入力しておく
- IPv6は、LANやイントラネットでは基本いらないと思うのでオフにする


###インストール後に最初にやるべきこと
####管理者ユーザの作成
rootは便利だけど基本使わないように心がける

```
# hogeを作成
useradd hogehoge
# hogeを管理者グループに追加する
usermod -G wheel hogehoge
# 
```

####SELinuxを無効化
```
# getenforce を実行した結果、enableになっていたら有効になっている
$ getenforce
$ sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
$ getenforce
# 設定を反映するため、reboot
$ reboot
# getenforce を実行した結果、disabledになっていたら成功
$ getenforce
```

####GRUBの起動オプションを編集
```
vim /etc/default/grub
# 下記設定を追加
# eth表記にする 追記→ biosdevname=0 net.ifnames=0 ipv6.disable=1
# 起動画面のRHGBを無効化 削除 → rhgb quiet
# 解像度低くする（VMwareの場合解像度引く方が便利） → video=800x600
grub2-mkconfig -o /boot/grub2/grub.cfg
```

####IPv6の無効化
※ しかしIPv6を無効化にするというのは、今時ナンセンス。要改良
（Windows10, iOS でもIPv6は優先的に扱われるのだから）

```
sudo echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/disable_ipv6.conf
sudo echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.d/disable_ipv6.conf
# 設定を反映させる
sudo sysctl -p/etc/sysctl.d/disable_ipv6.conf
```

####SSHの設定
```
# rootでのログインを禁止
sed -i -e 's/#PermitRootLogin yes´/PermitRootLogin no' /etc/ssh/sshd_config
sudo systemctl restart sshd
```
[Microsoft] PowerBI Visuals Tools バージョン3が出ます

PowerBI Visuals Tools 3.0 が出ます！

https://microsoft.github.io/PowerBI-visuals/docs/how-to-guide/migrating-to-powerbi-visuals-tools-3-0/

※ 2019年2月時点ではベータ版です。


何が変わったのか、気づいた点を挙げていってみます。

# TypeScript関係

## バージョン3になった！

TypeScriptのバージョンが2から3にあがりました。
嬉しい！


## モジュールになった！

2.x時代は`namespace`を使っていましたので、数多ある外部ライブラリを使うのは厄介でした。
これからは普通に`import`できます。



## 出力先がディレクトリになった！

今までは`out`オプションで1ファイルにまとめていましたが、バラバラのファイルに出力するようになりました。
外部ライブラリ使うにはこれがいい。

## ターゲットがES5からES6に！

ES6も指定してOKになりましたよ。
やったね。

 
# CLI関係

証明書関係のコマンドがなくなった。

`--create-cert`がなくなりました。


# 早速使ってみましょう

```console:
$ npm install powerbi-visuals-tools@beta -g
$ pbiview new ExBeta3
$ cd exBeta3
$ pbiviz start

 info   Starting server...
 info   Start preparing plugin template
(node:53190) DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` instead
 error  ENOENT: no such file or directory, open '/Users/sengoku/Documents/PowerBI/exBeta3/.tmp/precompile/visualPlugin.ts'
(node:53190) UnhandledPromiseRejectionWarning: Error: Failed to generate visualPlugin.ts
    at generateVisualPlugin.then.catch.ex (/usr/local/lib/node_modules/powerbi-visuals-tools/node_modules/powerbi-visuals-webpack-plugin/index.js:168:12)
(node:53190) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:53190) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```

まだ動かないみたいですね。。。

## 環境

- macOS 10.13.6
- node 11.8
ActiveRecordのorderメソッドに引数を複数渡す場合の具体例

[自分のブログ](https://yuya-tequila.hatenablog.com/entry/2019/02/24/210208)の転載記事です。

### はじめに
ActiveRecordのorderメソッドに引数を複数渡せることは有名だと思います。
ですが「複数の値を渡すとどのようにソートされるのか」について具体的に言及している記事が少ないように感じたので、簡単な例を挙げてまとめてみたいと思います。
(自分の検索能力が低いだけかも知れませんが)

### 検証準備
複数のカラムを持つUserテーブルを定義して、以下のレコードを格納します。

|id|name|gender|role|
|---|---|---|---|
|1|Alice|2|1|
|2|Bob|1|1|
|3|Carol|2|2|
|4|Dave|1|2|
カラムはそれぞれ、名前、性別、ロールです。それぞれ単なる検証用の値なので、深い意味はありません。
そしてUserモデルの中に、以下のメソッドを定義します。

```ruby
class User < ApplicationRecord
  def print
    puts "id:#{id} name:#{name} gender:#{gender} role:#{role}"
  end
end
```

これで準備は完了です。

### 引数が一つの場合
まずは簡単な例からやってみましょう。nameをorderの引数にする場合です。

```ruby
# 名前昇順
irb(main):001:0> users = User.all.order(:name)
irb(main):002:0> users.each {|user| user.print}
id:1 name:Alice gender:2 role:1
id:2 name:Bob gender:1 role:1
id:3 name:Carol gender:2 role:2
id:4 name:Dave gender:1 role:2
```

ユーザーの名前はアルファベット順になっているので、このような結果になります。
genderやroleを引数にした場合は以下のとおりです。

```ruby
# 性別昇順
irb(main):001:0> users = User.all.order(:gender)
irb(main):002:0> users.each {|user| user.print}
id:2 name:Bob gender:1 role:1
id:4 name:Dave gender:1 role:2
id:1 name:Alice gender:2 role:1
id:3 name:Carol gender:2 role:2

# ロール昇順
irb(main):003:0> users = User.all.order(:role)
irb(main):004:0> users.each {|user| user.print}
id:1 name:Alice gender:2 role:1
id:2 name:Bob gender:1 role:1
id:3 name:Carol gender:2 role:2
id:4 name:Dave gender:1 role:2
```

gender, roleの場合、それぞれが1, 2という順で並びます。

#### 引数が2つの場合
ここからが本題です。引数が複数渡された場合、どのような順序になるのでしょう。  

```ruby
# 性別昇順、ロール昇順
irb(main):001:0> users = User.all.order(:gender, role: :asc)
irb(main):002:0> users.each {|user| user.print}
id:2 name:Bob gender:1 role:1
id:4 name:Dave gender:1 role:2
id:1 name:Alice gender:2 role:1
id:3 name:Carol gender:2 role:2

# 性別昇順、ロール降順
irb(main):003:0> users = User.all.order(:gender, role: :desc)
irb(main):004:0> users.each {|user| user.print}
id:4 name:Dave gender:1 role:2
id:2 name:Bob gender:1 role:1
id:3 name:Carol gender:2 role:2
id:1 name:Alice gender:2 role:1
```

最初に渡される引数は性別で、後に渡される引数はロールです。
その場合、性別がまず優先してソートされ、1が先、2が後という順序になります。
その後、第二引数として渡されたロールの順序によってソートされているのがわかるでしょうか。

つまりorderメソッドに引数を複数渡す場合、「先に渡した引数が優先条件としてソートされ、その後、後に渡した引数を条件としてソートされる」ということになります。

もうひとつの例として、ロール、性別の順で引数を渡した場合を見てみます。

```ruby
# ロール降順、性別昇順
irb(main):001:0> users = User.all.order(role: :desc, gender: :asc)
irb(main):002:0> users.each {|user| user.print}
id:4 name:Dave gender:1 role:2
id:3 name:Carol gender:2 role:2
id:2 name:Bob gender:1 role:1
id:1 name:Alice gender:2 role:1

# ロール降順、性別降順
irb(main):001:0> users = User.all.order(role: :desc, gender: :desc)
irb(main):002:0> users.each {|user| user.print}
id:3 name:Carol gender:2 role:2
id:4 name:Dave gender:1 role:2
id:1 name:Alice gender:2 role:1
id:2 name:Bob gender:1 role:1
```

第一引数がロールの降順なので、2→1としてソートされた後、性別でソートされていますね。

以上、複数の引数でorderした場合の簡単な例でした。
Rubyのブロックを使う配列のメソッド

#map/collect
mapメソッド(collectはエイリアスメソッド)
mapは各要素に対してブロックを評価した結果を新しい配列にして返すメソッド。

```ruby
#mapを使わない場合↓
numbers = [1,2,3,4]
new_numbers = []

numbers.each{|n| new_numbers << n * 10 }
puts new_numbers
=> [10,20,30,40]

#mapを使った場合↓
numbers = [1,2,3,4]
new_numbers = numbers.map{ |n| n * 10}
puts new_numbers
=> [10,20,30,40]
```
空の配列を用意して他の配列をループ処理した結果を空の配列に入れるような処理の多くは、mapメソッドを使って置き換えることができる。

#select/find_all/reject
selectメソッド(find_allはエイリアスメソッド)
各要素に対してブロックを評価し、その戻り値が真の要素を集めた配列を返すメソッド。

```ruby
#selectメソッド
#配列から偶数だけを集めた配列を作る場合
numbers = [1,2,3,4,5,6]
even_numbers = numbers.select{|n| n.even?}
even_numbers
=>[2,4,6]
```

rejectメソッドはselectメソッドの反対で、ブロックの戻り値が真になった要素を除外します。言い換えると戻り値が偽である要素を集めるメソッドです。

```ruby
#rejectメソッド
#2で割り切れる数字はrejectで省かれる。つまり２で割り切れない数字だけの配列ができる。
numbers = [1,2,3,4,5,6]
non_multiples_of_two = numbers.reject{ |n| n % 2 == 0}
non_multiples_of_two
=>[1,3,5]
```

#find/detect
findメソッド(detectはエイリアスメソッド)はブロックの戻り値が真になった最初の要素を返します。

```ruby
numbers = [1,2,3,4,5,6]
even_number = numbers.find{ |n| n.even?}
even_number
=> 2
```

#inject/reduce
injectメソッド(エイリアスメソッドはreduce)

```ruby
numbers = [1,2,3,4]
sum = numbers.inject(0){ |result,n| result + n}
sum
=> 10
```

- 1回目：result=0,n=1で、0+1=1。これが次のresultに入る。
- 2回目：result=1,n=2で、1+2=3。これが次のresultに入る。
- 3回目：result=3,n=3で、3+3=6。これが次のresultに入る。 
- 4回目：result=6,n=4で、6+4=10。最後の要素に達したのでこれがinjectの戻り値になる。


#&とシンボルを使ってもっと簡潔に書く

```ruby

['apple','banana','mango'].map {|n| n.upcase}
=>["APPLE", "BANANA", "MANGO"]
#こう書くこともできる。
['apple','banana','mango'].map(&:upcase)
=>["APPLE", "BANANA", "MANGO"]

```
下記の条件が揃ったときにはこの書き方が使える。

- ブロック引数が一つだけ
- ブロックの中で呼び出すメソッドには引数が無い。
- ブロックの中では、ブロック引数に対してメソッドを一回呼び出す以外の処理がない。
少し前のflutter_blocとblocはもうリリースビルドでコケます

その名の通り。
codemagicでビルドしてて気づいた。

# 出てたエラー

```
   Building AOT snapshot in release mode (ios-release)...          

    Compiler message:
    file:///Users/greenhouse/.pub-cache/hosted/pub.dartlang.org/bloc-0.8.4/lib/src/bloc.dart:24:44: Error: No named parameter with the name 'seedValue'.
        _stateSubject = BehaviorSubject<State>(seedValue: initialState);
                                               ^^^^^^^^^
    file:///Users/greenhouse/.pub-cache/hosted/pub.dartlang.org/rxdart-0.21.0/lib/src/subjects/behavior_subject.dart:49:11: Context: Found this candidate, but the arguments don't match.
      factory BehaviorSubject({
              ^
    Compiler terminated unexpectedly.
    Failed to build /Users/greenhouse/tmp63sy_u0s.

Encountered error while building for device.
```

# 修正

```yaml

diff --git a/pubspec.yaml b/pubspec.yaml
index 01b513e..31f8195 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -24,8 +24,8 @@ dependencies:
   google_sign_in: ^4.0.0
   firebase_core: ^0.3.0
   flutter_facebook_login: ^1.2.0
-  bloc: ^0.8.0
-  flutter_bloc: ^0.5.0
+  bloc: ^0.9.3
+  flutter_bloc: ^0.7.0
   meta: ^1.1.6
   equatable: ^0.1.6
```
git で未追加なファイルと更新されたファイルを一覧する 



Web系受託開発やってるとよくあるんですが、お客さんが自分で本場サーバの言語ファイルや画像をいじってることがちょくちょくあります。

普段はとくに困ることないんですが、そのままだと次に何らかの修正をかけるときに、画像が差し替わってるのがわからずに、リリース時に古いファイルに差し替わったり、言語ファイルを上書きして、お客さんが書き換えたメッセージがとんだりってことがたまにあります…

というわけでリリース前とかに本番環境で、

- 追加された画像等のファイルがないか？
- 変更されたファイルは無いか？

というのを確認したいなぁと思ってました。

調べれば大抵のことは解決策がみつかる git なので、このニーズを満たしてくれるコマンドもちゃんと用意されてました。

```
git ls-files --others --exclude-standard --modified
```

これで、まだ追加されてないファイルと、更新されたファイルが一覧されます。

でもってこれを git add しようとおもったら下記でいけるようです。

```
git ls-files --others --exclude-standard --modified | xargs git add
```

というわけで今後リリース前や改修する前にはこのチェック作業を行うようにするつもりです。

# 参考
- [gitでaddしていない(untrackedな)ファイルを一覧表示する — Hello a (　　) world.](http://helloaworld.com/2015/08/25/git_memo.html)
githubでforkされたリポジトリからプルリクされた際に、自分のローカルで環境する方法

# はじめに
githubでforkされたリポジトリからプルリクされた際に、自分のローカルで環境する方法です。
結論からいうと、自端末で確認用のbranchを作成し、直接相手のリポジトリをpullすればよいです。

```
# 確認用branchを作成
git checkout -b fetch-repository-test

# 相手のリポジトリpullする
# git pull [リポジトリURL] [branch名]
# 下記は例
git pull https://github.com/nsuzuki7713/a6s-cloud-backend/ add_stacktrace_function#7
```
時系列データで知っておくべきこと(Mediumより)

[Mediumの記事](https://towardsdatascience.com/almost-everything-you-need-to-know-about-time-series-860241bdc578)を読んでとても役に立ったのでメモしておきます。

#まとめ
・時系列データを使った予測において、定常性(stationary)、季節性(seasonality)、自己相関(autocorrelation)に注意しなければいけない。
・主なモデル化手法として移動平均法、指数平滑法、ARIMA等がある。
・詳しく知りたい人用のチュートリアルは[こちら](https://towardsdatascience.com/end-to-end-time-series-analysis-and-modelling-8c34f09a3014)

#前置き
・トレンドや金融市場などの予測では"時間"が重要な要素となる。
・時系列データとは、時系列に沿って並んだデータのこと。
・時系列データにおいて、時間は説明変数(independent variable)である。
　※説明変数：何かの原因となっている変数　⇔　目的変数：結果となっている変数。
　　(例)バネにおもりをつける事象の場合、説明変数は「おもりの重さ」、目的変数は「バネの伸び」となる。
・時系列データを使う目的は将来の予測。
・時系列データを利用する際の注意点として、定常性(stationary)、季節性(seasonality)、自己相関(autocorrelation)が挙げられる。
#自己相関
・自己相関とは、時間差に応じて発生する観測点の間の類似性と言える。
![autocorrelation.png](https://qiita-image-store.s3.amazonaws.com/0/354185/dea63433-f761-bb93-092f-6b92790519c6.png)
・この画像で、時刻0と時刻24、時刻12と時刻36などの関係を、自己相関が高いと言う。
・自己相関は季節性のヒントとなる。
#季節性
・周期的な変動、のこと。例えば電気消費量は日中に増え夜間に減る、クリスマス前にネット販売は増える、など。
![seasonality](https://cdn-images-1.medium.com/max/1600/1*tCCq8QoJGYTmrJZiYafLlw.png)
・これは明らかな季節性の時系列データ。夜間に向けてピークを迎え、日付が変わるころに最低となる。
・「自己相関が見られるデータの間隔」が季節の長さとなる。

#定常性
・統計量が期間を通じて変化しないことを定常性と言う。つまり、平均と分散、共分散が時刻に依存しなければ定常性があると言える。
![seasonality](https://cdn-images-1.medium.com/max/1600/1*tCCq8QoJGYTmrJZiYafLlw.png)
・これは平均も分散も大きく変動していないため、定常性がある時系列データである。
・株式価格の推移は定常性がないことがある。例えば上昇相場の場合やボラティリティが増加していく場合には、平均や分散が変動するため定常性がない。
・モデリングにおいては定常性のある時系列データがあることが理想的。
・全ての時系列データに定常性があるわけではないが、適切なデータの変換によって定常性を持たせることが出来る。

#定常性の有無の検証方法
・Dickey-Fuller検定で定常性の有無を検証できる。これは単位根の有無を検証する仮設検定である。単位根が存在するのであれば定常性がない。
[(参考)Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%83%83%E3%82%AD%E3%83%BC%E2%80%93%E3%83%95%E3%83%A9%E3%83%BC%E6%A4%9C%E5%AE%9A)
・検定の帰無仮説は単位根が存在すること、対立仮説は単位根が存在しないこと。
・帰無仮説が棄却できない->単位根が存在する＝定常性がない。
・帰無仮説が棄却できる->単位根は存在しない＝定常性がある。
![DickeyFuller](https://cdn-images-1.medium.com/max/1600/1*1-836SFvfceTixAK1ERvcA.png)
・これは平均が一定ではないため定常性がない。

#時系列データのモデリング
・ここでは移動平均法、指数平滑法、ARIMA(Autoregressive, Integrated and Moving Average:自己回帰和分移動平均)を挙げる。
・移動平均法は最も単純で、過去データの平均を以って次のデータの予測値とするモデルのこと。単純だが、モデリングの入り口としては良く、トレンドの発見にも使える。
・(単純)指数平滑法は移動平均法と似ているが、予測時点から離れたデータほど重みを小さくし、遠い過去のデータの重要性を小さくしている。
![Exponential smoothing](https://cdn-images-1.medium.com/max/1200/1*0XOdCfCaZ6Xbrzg_AT8FnA.png)
・数式で表すとこのようになる。αは平滑化定数で、古いデータの重要性をどれだけ早く減らすかを決定する(αが0に近づくと移動平均法へ近づく)。

・二重指数平滑法は、指数平滑を二回繰り返したモデル。
![Double exponential smoothing](https://cdn-images-1.medium.com/max/1200/1*23R2PWfpY5_3A3S8lSp3-Q.png)
・上記式が二重指数平滑法を表しており、βはトレンド平滑化定数。

・三重指数平滑法は、更に季節性平滑化定数(※)を追加したモデル。
(※正しい日本語訳か自信ないです)
![Triple exponential smoothing](https://cdn-images-1.medium.com/max/1200/1*Tt19NBbANCBAze3-vajMXg.png)
・季節性をモデリングすることが出来る。

・SARIMA(Seasonal autoregressive integraded moving average model )は自己回帰モデル(AR(p)モデル)と季節性を組み合わせたモデル。
・詳しく知りたい人はこちらの[チュートリアル](https://towardsdatascience.com/end-to-end-time-series-analysis-and-modelling-8c34f09a3014)参照。

#所感
証券アナリストの勉強をしていて時系列データ分析のさわりが出てきたことを思い出した。当時は理論的な部分をざっくり学習しただけだったが、せっかくチュートリアルを見つけたので次はコーディングをしてみようと思う。
【Xamarin.Forms&Prism】iPhone実機を選択してビルドするとエラー

# はじめに
落ちているすべての石ころに躓いていく・・・

iPhone実機を選択してビルドするとビルドエラーがでた。

<img width="1477" alt="スクリーンショット 2019-02-24 20.41.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/b83053c7-d030-8797-2dff-461dd8136bdb.png">

> /Users/{username}/.nuget/packages/mobile.buildtools/1.4.0.638/build/Mobile.BuildTools.targets(25,25): Error MSB4184: 式 "[System.IO.Path]::GetDirectoryName('')" を評価できません。Invalid path (MSB4184) (Trial.iOS)

Prismを導入しないただのXamarin.Formsプロジェクトでは問題なかったので、きっとPrismの問題なんだろうなぁとおもっていたら、こちらのサイトで解決方法がありました。

http://johnny06r.hatenablog.com/entry/2018/08/29/012710

おかげで解決できました。ありがとうございます！


#環境
- macOS 10.14 Mojave
- Visual Studio Community 2017 for MAC(7.8.1)
- Prism.Autofac.Forms(7.1.0.431)

#実機デバッグの設定
こちらのサイトを参考にしました。感謝です！

- [VisualStudio for macでXamarin.Formsを実機デバッグする](https://qiita.com/KakeruFukuda/items/176c0aef5db0e04d6859)
- [XcodeでiPhoneをワイヤレスでデバッグする](https://qiita.com/Shinji-Hashimoto/items/0660158b2336329af635)

#解決方法
iOSプロジェクトのオプションを開いて[ビルド]-[iOS IPAオプション]を選択し、「iTunes Package Archive(IPA)をビルドする」チェックボックスが外れていたので、チェックをつけてOKボタンをクリックします。
<img width="1194" alt="スクリーンショット 2019-02-24 21.00.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/e3724df8-cdc5-5819-0651-8d069eacb4d8.png">

<img width="1194" alt="スクリーンショット 2019-02-24 21.04.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/79f9a661-6644-f4c6-738d-4f5896e4ef34.png">

ビルドすると、ビルドエラーがなくなりました！

<img width="1238" alt="スクリーンショット 2019-02-24 21.06.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/93e78761-e682-87d1-dcb0-725fd827eede.png">

デバッグ実行すると、無事iPhone実機上で起動できました。
<img width="375" alt="Screen Shot 2019-02-24 at 21.07.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/342629/182eae60-2033-fe9d-baa1-3c62a930f40a.png">
pjsip2.8 でarm64向けにビルドする(iOS)

# iOS向けにビルドする(arm64編)

VoIPを実現する時にpjsipというライブラリーを使ったのだが、ビルドするまでに相当苦労したのでメモ用に。
Archtectureを指定するのがポイント。

```terminal:terminal
ARCH='-arch arm64' ./configure-iphone
```

今後は他のアーキテクチャ用にもビルドしてからFatLibraryなるものを作る必要がありそうなので、その時にはまた追記。

## ビデオ機能

ビデオ通話機能を追加するためには以下のことをやらなければならなそう。

- `openh264`をgit cloneして、makeする。

- 上のコマンドに少し追加して、打つ。
 
```terminal:terminal
ARCH='-arch arm64' ./configure-iphone --with-openh264
```

- `config_site.h`というファイルに`#define PJMEDIA_HAS_VIDEO 1`というものを書く。
 //追記：defineしたら、assertion_errorなるものが発生したのでやらないほうがいいかも？
- 生成された`openh264.a`ファイルをプロジェクトをXcodeで開いて、`Frameworks`フォルダに追加する。(この時に、TargetsのBuild Phasesの中のLink Binary With Librariesに追加されていることを確認する。)

[このページ](https://trac.pjsip.org/repos/ticket/1947)がとても参考になった。

---


2019/02/24