OmniAICreator/Qiita-1.07M huggingface dataset:
モンスターがウヨウヨいるIT業界をサバイブするために、まず最低限知っていてほしいこと

#はじめに
[当社](http://www.techforward.co.jp/)のミッションの１つはIT人材の育成です。
なので、会社としてはまだまだ小さいものの、インターン生を採用しています。
モンスターがうようよいるIT業界をサバイブするために、インターン生が最低限知ってほしいことを書きました。

#目次
####1.開発手法
####2.必要なスキルセット
####3.IT（システム構成）の基本
####4.オススメの書籍リスト11選
####5.プロフェッショナルになるために

#1.開発手法
基本の「ウォータフォールモデル」
![Screen Shot 2018-09-22 at 2.00.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/5f6abac0-15c2-bacd-af32-cc5837df43eb.png)


もう一つの「アジャイルモデル」
※図はウォータフォールとの対比
![Screen Shot 2018-09-22 at 2.01.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/242700/28df7100-75f1-d435-da25-9d668d163516.png)

根本的には「DevOps」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242700/2a6d9e90-cdd6-af26-8bda-aac6bc57aed5.png)


#2.必要なスキルセット
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242700/64e08af9-5b40-095a-78b7-5130f4b4a2e0.png)
プログラミングはもちろん重要。
しかし、プログラミングだけではない。

#3.IT（システム構成）の基本
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242700/ad861e7d-0118-329c-7477-177a8662fd8d.png)
#4.オススメの書籍11選
####人生哲学
1.完訳 7つの習慣 人格主義の回復
https://amzn.to/2xFwtCB
####ビジネススキル
2.ゼロ秒思考
https://amzn.to/2MNeEXT

3.自分のアタマで考えよう――知識にだまされない思考の技術
https://amzn.to/2QPSibm

4.マーケット感覚を身につけよう---「これから何が売れるのか?」わかる人になる5つの方法
https://amzn.to/2PU67Ek

5.頭のよさはノートで決まる
https://amzn.to/2I70Zdg
####IT理解
6.業務別データベース設計のためのデータモデリング入門 
https://amzn.to/2I4nXBQ

7.アジャイル開発とスクラム~顧客・技術・経営をつなぐ協調的ソフトウェア開発マネジメント
https://amzn.to/2xPuPi3

8.基本情報技術者 合格教本 
https://amzn.to/2psNsnS

####プログラミング
9.作りながら学ぶ HTML/CSSデザインの教科書
https://amzn.to/2Dj8D5L

10.HTML5&CSS3デザインブック (ステップバイステップ形式でマスターできる)
https://amzn.to/2znEH4t

11.基礎からのMySQL 第3版 (基礎からシリーズ) 
https://amzn.to/2PQFOig

※プログラミングについては上記はほんの一部。100冊くらいはリストにあがります。


#5.プロフェッショナルになるために
以下の3つさえあれば誰でも短期間でITのプロフェッショナルになれます
###1.エンジニア同士で会話ができること
###２.技術的な好奇心、探究心があること
###３.無茶振りに応えれること

#追記
2019/1/26

合わせてこちらもどうぞ
####「ITエンジニアになるならこの本を読もう32選」
https://qiita.com/barcarunrun/items/5dfdc14c3c3e054b0a2e

####「完全にゼロからプロのITエンジニアになる方法」
https://qiita.com/barcarunrun/items/f7c4196ae29b364b8b41

####「ITエンジニアのスキル習得方法 ~特定の言語もしくはフレームワークを勉強する方法~」
https://qiita.com/barcarunrun/items/8b730ff341c736361958
cloud buildでの docker runコマンドの volume指定について

# cloud buildでの docker runコマンドの volume指定について

[Google Cloud Builde](https://cloud.google.com/cloud-build)はビルドスクリプトを容易に記述できて便利なのですが、[docker run](https://docs.docker.com/engine/reference/run/#volume-shared-filesystems)コマンドで volumeをマウントしようとすると大変です。

理由は、Cloud Build自体がコンテナで実行されており、その中からビルドステップをコンテナで実行しているため docker runコマンドで指定するホスト側のパスは Cloud Buildのホストのパスを指定する必要があるためです。

dockerを起動させたホスト側のパスは、以下のように [docker volume inspect](https://docs.docker.com/engine/reference/commandline/volume_inspect/)コマンドで確認することが可能です。

<pre>
$ docker volume ls -q --filter name=homevol|cloudbuild_ | xargs docker volume inspect
[
    {
        "CreatedAt": "2018-09-22T04:56:00Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/cloudbuild_vol_25da440e-a131-497c-8da5-a8ee5d20f565/_data",
        "Name": "cloudbuild_vol_25da440e-a131-497c-8da5-a8ee5d20f565",
        "Options": {}, 
        "Scope": "local"
    },
    {
        "CreatedAt": "2018-09-22T04:55:59Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/homevol/_data",
        "Name": "homevol",
        "Options": null,
        "Scope": "local"
    }
]
</pre>

cloud buildでは、ホームディレクトリの volumeに対して homevol という名前を割り当てています。

        // homeVolume is the name of the Docker volume that contains the build's
        // $HOME directory, mounted in as /builder/home.
        homeVolume = "homevol"
        homeDir    = "/builder/home"

https://github.com/GoogleCloudPlatform/cloud-build-local/blob/master/build/build.go#L53-L56


例えば、cloud buildのビルドステップのコンテナでのホームディレクトリ /builder/home に対応するホスト側のパスは以下のように取得できます。

<pre>
$ docker volume inspect --format '{{ .Mountpoint }}' homevol
/var/lib/docker/volumes/homevol/_data
</pre>



以下の cloud builのスクリプト [cloudbuild.yaml](https://cloud.google.com/cloud-build/docs/create-custom-build-steps) は１つ目のステップでホームディレクトリに testファイルを作成し、２つ目のステップでホームディレクトリを /mntにマウントして docker runを実行し、１つ目のステップで作成したファイルを表示するものです。

<pre>
steps:
- id: create-test-file
  name: ubuntu
  entrypoint: bash
  args:
  - -c
  - |
    cat << EOF > /builder/home/test
    hello
    world
    EOF
- id: cat-test-file-in-docker
  name: gcr.io/cloud-builders/docker
  entrypoint: bash
  args:
  - -c
  - |
    docker run -v $(docker volume inspect --format '{{ .Mountpoint }}' homevol):/mnt ubuntu cat /mnt/test
</pre>

Docker in Dockerの環境において、--volume オプションで volumeをマウントする場合も、同じ方法で対応可能です。
Rust のデバッグ環境構築


Rust, いいですね。現代の知見と技術に基づいて C++ を再設計したという感じがします。
Visual Studio Code を使ってブレークポイントを張ったり、変数の中身をみたりできるようにしてみましょう。

# 環境

- Rust 1.55.0 (stable)
- Visual Studio Code 1.60.2
- macOS Bit Sur 11.6

# Rust のインストール

```sh
$ curl https://sh.rustup.rs -sSf | sh
```

インストールオプションは 1 の default でよいです。

```
Current installation options:


   default host triple: aarch64-apple-darwin
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
```

インストーラが終了したら、

```sh
$ source $HOME/.cargo/env
```

で `$PATH` を更新します。

Rust の標準ライブラリのソースコードもインストールしておきます。デバッガで見られるようになります。

```sh
$ rustup component add rust-src
```

# LLDB のインストール

LLDB をインストールします。すでに Xcode がインストールされていれば不要です。

```sh
$ xcode-select --install
```

[Installing on MacOS](https://github.com/vadimcn/vscode-lldb/wiki/Installing-on-MacOS)

# Visual Studio Code プラグインのインストール

Rust (rls) と CodeLLDB をインストールします。Rust (rls) にはデバッグ機能はなく、CodeLLDB を使ってデバッグします。
![スクリーンショット 2018-09-22 14.14.43.png](https://qiita-image-store.s3.amazonaws.com/0/110491/d5105485-2c81-b34d-2fbb-35b6e6d8c4c6.png "スクリーンショット 2018-09-22 14.14.43.png")

# プロジェクトの設定

cargo で適当にプロジェクトを作って開きます。

```sh
$ cargo new hello_world
```

初回は rls をインストールするか聞かれるのインストールします。

![スクリーンショット 2018-09-22 14.19.26.png](https://qiita-image-store.s3.amazonaws.com/0/110491/f493cbad-e74b-c6a4-686b-c32e6a6adbec.png "スクリーンショット 2018-09-22 14.19.26.png")


Debug -> Start Debugging しようとすると使用するデバッガを聞かれるので LLDB を選択します。

![スクリーンショット 2018-09-22 14.19.56.png](https://qiita-image-store.s3.amazonaws.com/0/110491/da13c87c-9aeb-79ab-9b15-f56f747c1855.png "スクリーンショット 2018-09-22 14.19.56.png")

すると launch.json が作られるので次のように sourceMap の設定を追加します。これで先ほどインストールした Rust の標準ライブラリのソースコードも見られるようになります。

```json
            "sourceMap": {
                "/rustc/c8dfcfe046a7680554bf4eb612bad840e7631c4b/": "${env:HOME}/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/"
            }
```

`c8dfcfe046a7680554bf4eb612bad840e7631c4b` の部分は `rustc --version --verbose` で表示される Rust 自体の commit-hash です。

![スクリーンショット 2021-10-03 1.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110491/b2cd154d-c833-a4a1-2263-e53c2de403f5.png)

これでデバッグ実行できるようになるはずです。

![スクリーンショット 2018-09-22 14.35.17.png](https://qiita-image-store.s3.amazonaws.com/0/110491/781b6047-8970-e5bc-9080-45fc424a50b8.png "スクリーンショット 2018-09-22 14.35.17.png")
at coder beginner 025

B
直大くんと直子さんは双子の兄妹です。今日は家の廊下でスイカ割りの練習をすることになりました。
廊下は東西方向に無限に長く、途中の 1 箇所に直大くんの部屋の入り口があります。最初、直大くんの部屋の前に直大くんと直子さんがいます。
スイカ割りの練習では、以下の N 回の移動を順に実行します。
i 番目の移動 : 最初に直子さんが方角とメートル単位の距離 diを指定します。指定する方角は東か西で、di は正整数です。その後、直大くんが指定された方向を向いて、距離 di を目標に移動します。
直大くんは 1 回の移動において A メートルよりも少ない距離を移動することと、B メートルよりも多い距離を移動することが苦手です。そのため、目標移動距離が di メートルだったときの最終移動距離は以下のようになります。
di<A のとき、直大くんは向いている方向に A メートル進む。
A≦di≦B のとき、直大くんは向いている方向に di メートル進む。
di>B のとき、直大くんは向いている方向に B メートル進む。
あなたの課題は、直大くんが N 回の移動を終えたときにどこにいるのかを求めることです。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	int N, A, B;
	cin >> N >> A >> B;
	int count = 0;
	for (int i = 0; i < N; ++i) {
		string s;
		int d;
		cin >> s >> d;
		if (d < A) {
			d = A;
		}
		else if (d > B) {
			d = B;
		}
		if (s == "West")
			d *= -1;
		count += d;
	}
	if (count > 0)
		cout << "East" << " " << count << endl;
	else if (count < 0)
		cout << "West" << " " << -count<< endl;
	else
		cout << 0 << endl;
	return 0;
}
```
シンプルで的確なコードをかけるようになりたい
比較演算子「>」「>=」を使わなければ QOL が上昇する

タイトルは、本気である。
実際 15年ほど 前から比較演算子「`>`」「`>=`」を書いていない[^1]。

比較の際には

* 定数を左に書け
* 注目している値を先に書け

などの流儀があることは知っている。
しかし私がここ 15年ほど愛用しているのは、以前先輩から伝授された流儀

* 「`<`」と「`<=`」を使う。「`>`」と「`>=`」は使わない[^2]

である。大小比較のために「`>`」や「`>=`」を書くことはないので、エラーにしてほしいと思っている。

# `&&` や `||` との併用

`inside =( 1<=x && x<=10 );`
とか
`outside = ( x<1 || 10<x );`
のように、複数の比較演算を並べる際には小さい順に並べる。
これも、そうなっていなければエラーぐらいの気持ちで 100% そうする。

# メリット - 読みやすい

書きやすさはどちらでも同じだと思うが、読みやすさには大きな差があると考えている。
数の大小関係を考えるとき、数直線で考えるとわかりやすいという人も多いと思う。
不等号の向きを「右が大きい」に制限することで（そして前項に書いたとおり、複数の比較演算の順序をきちんと制御することで）比較の式と数直線の相性が良くなる。

# メリット - バグが減る

測定していないので自信はないが、比較順序にまつわるバグが減ると考えている。

`x>=1 || x<=10`
や
`x<1 && x>10`
のような式が間違っていることには気づきにくいと思うが、
`1<=x || x<=10`
や
`x<1 && 10<x`
のような式が間違っていることには気づきやすいと思う。どうだろう。

# メリット - 悩みが減る

人によってはどちらが読みやすいか悩んで時間を浪費してしまうこともあるのではないかと思う。

`>` や `>=` を一切使わないと決めていれば、悩みはない。
`<` と `<=` のどちらを使うのかは、どちらかが正解でもう一方は不正解のことが多いので、ちゃんと悩むべきだけど。

# デメリット

`>` や `>=` を含んでいる式が非常に複雑であるかのように感じ、そういう式を読む能力が下がる。

実際、私の場合、両方の向きの不等号が混在した式を見るとかなりつらい気持ちになる。

## 導入

利用している規約になにか記載がないのであれば、勝手に導入するのがいい。
一週間から数週間で、このスタイルが正しいことを実感できると思う。

実感したら同僚にも広めるといいと思う。

[^1]: 他人が使うためのライブラリで比較演算を定義する場合は、書くこともある。（書かないこともある）。あと、Gemfile は仕方ないね。
[^2]:  等値 (`==` など) と 非等値( `!=`, `<>` など )は、正直どっちでもいいと思っている。ヨーダ記法には特に賛成しない。読みやすいのはどちらなのか悩む余地が生じてしまうが、私の場合は「思いついた順」に書き、特に気にしないことにしている。
Mac ターミナル：よく使うコマンド集

# コマンド　
ホームディレクトリに移動
`$ cd`
一つ前のディレクトリに移動
`$ cd .. `
現在のディレクトリにあるファイルを一覧表示する
`$ ls`
デスクトップ下のフォルダ（folder01）に移動
`$ cd Desktop/folder01`
ホームディレクトリに移動
`$ cd ~/`
ルートディレクトリに移動
`$ cd /`
カレントディレクトリのフォルダを開く
`$ open .`
カレントディレクトリのフォルダを開く（linuxの場合）
`$ xdg-open .`


# メモ
### ホームディレクトリ、ルートディレクトリ
"~/"はユーザのホームディレクトリを指し、"/"はルートディレクトリを指しています。
root とは管理者のことで、絶対的な権限の持ち主であり、全てのファイル・ディレクトリにアクセスできます。UNIX系の OS では、一般的な操作は root としてではなく、一般ユーザーの権限で作業します。
Windows MRのスリープまでの時間を延長させる方法

# Windows MRのスリープまでの時間を延長させる方法

Windows MRはHMDを置いたまましばらくすると、スリープモードになってしまいます。
このままではVR開発やVR寝落ちに不便なため解決策を探したところ、下記にスリープまでの時間を延長させる方法があったので備忘録もかねて投稿します。  
https://forums.hololens.com/discussion/10152/deactivate-sleep-function-on-windows-mixed-reality-headset

※あくまで自己責任でお願いします。画面の焼き付きが起こる可能性が高くなります。

## レジストリに新しい値を登録する

1. まず、レジストリエディタを開きます。
  * 開き方一例：Windowsキー + Rキーで出る画面に「regedit」と入力、Enter押下。  

2. レジストリエディタで、「コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Holographic」に移動します。
3. 空いている場所で右クリック→新規→DWORD(32ビット値)を選択します  
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/133834/16ebe9a8-8116-98c0-7c5c-55cf9646bb9c.png)
4. 名前を「IdleTimerDuration」にします。
5. 名前を右クリック→修正で値を変更します(値はミリ秒です)。
機械学習実装時のコード（gpu、chainer、ubuntu） 

# 事前にインスールするもの（python3系）
`numpy, pandas, scipy, matplotlib, numba, chainer, sklearn` をpip3で。
他に
`tkiinter`を、`sudo apt-get -y install python3-tk`で

# gpu関連
1秒ごとにgpuの使用状況を表示
`nvidia-smi -l 1`

gpuを稼働するには、コードもgpu対応のものに書き換えないといけない。
https://qiita.com/ikeyasu/items/246515375b34e9fb4846

GPUで実行するには
Chainクラスはto_gpuメソッドを持ち、この引数にGPU IDを指定すると、指定したGPU IDのメモリ上にネットワークの全パラメータを転送します。こうしておくと、前進計算も学習の際のパラメータ更新なども全部GPU上で行われるようになります。GPU IDとして-1を使うと、すなわちこれはCPUを意味します。

chainer に GPU 計算をさせるときは model を GPU に移してから optimizer と紐付ける
http://buq.hateblo.jp/entry/2016/02/16/222006

numpy配列とcupy配列の変換は「cupy」の関数
・cupy ⇒ numpy配列へ変換：cupy.asnumpy
・numpy ⇒ cupy配列へ変換：cupy.asarray
を使うとできます。
https://qiita.com/samacoba/items/d18e6cf09f544477aff4

# pythonでgpuを駆動させるとき
`python3 ****.py -gpu 0`
を実行

# ほかに
「Chainer v4 ビギナー向けチュートリアル」
https://qiita.com/mitmul/items/1e35fba085eb07a92560
「Deep LearningフレームワークChainerのアドベントカレンダー」
https://qiita.com/advent-calendar/2017/chainer
「TensorFlow Advent Calendar 2016」
https://qiita.com/advent-calendar/2016/tensorflow
OctoberCMSで "Index column size too large. The maximum column size is 767 bytes." が発生したときの対処方法

## 概要
OctoberCMS(Laravel) + MySQL(InnoDB) でマイグレーションを実行したら下記エラーが発生した。

```
SQLSTATE[HY000]: General error: 1709 Index column size too large. The maximum column size is 767 bytes.
```
未確認だが、OctoberCMSかそれが依存するパッケージでデフォルトcharsetがutf8からutf8mb4になったようで、依存パッケージを更新したら発生するようになった。

utf8mb4になったことで１文字のバイト数がutf8の3バイトから4バイトになり、例えば長さ255のvarchar型はutf8だと255x3で765バイトでOKだが、utf8mb4だと1020バイトになり上限を超えてしまうために発生する。

対処方法としては、utf8を使うか、上限を上げるかが考えられるが、上限を上げる歩法をメモする。

ちなみに、utf8にするには `config/database.php` の `mysql.charset` や `mysql.collation` をutf8にするだけだ。

また、MySQL 5.7.7以上だとデフォルトでここにメモる方法をサポートする様になっているので、正攻法と言えるだろう。

## データベースレベルでの設定
[MySQL 5.7.7以上だとデフォルトでデータベースレベルの設定は有効](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix)になっているので不要だ。

5.7.7より下のバージョンでは、データベースレベルで下記を my.cnf に設定する。

```
[mysqld]
innodb_file_format=BARRACUDA
innodb_large_prefix=1
```

AWS RDSならRDSコンソールの Parameter groupsを作成して設定することができる。

ついでに、私が使っているdocker-composeだと `command` にオプションとして渡すだけで良い。

```yaml
version: '3'
services:
  my-db:
    image: mysql:5.6
    container_name: my-db
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --innodb_file_format=BARRACUDA --innodb_large_prefix=1
    ...
```

## テーブルレベルでの設定
そして、テーブルレベルで `ROW_FORMAT=DYNAMIC` を設定する。
これはマイグレーションファイルでテーブル作成時の `engine` で指定するようだ。

```php
public function up()
{
    Schema::create("my_table", function(Blueprint $table)
    {
        $table->engine = 'InnoDB ROW_FORMAT=DYNAMIC';
        ...
    }
}
```

以上！
Jetson Xavier の Python3 から OpenCV3(cv2.so) をインポートする

JetPack 4.0でOpenCV 3.3.1をXavierにインストールするとPython3からcv2ライブラリをインポートできません。
Jetson TX1, TX2 ではOpenCVをソースからビルドする必要がありました。
しかし今回はPython3対応の /usr/lib/python3.6/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so がありました。
そこでPython3仮想環境からシンボリックリンクをはることにしました。
virtualenv で構築した仮想環境(ex. ~/virtualenv/tensorflow ディレクトリ)からインポートしたいときは

```bash
$ cd ~/virtualenv/tensorflow/lib/python3.6/site-packages
$ ln -s /usr/lib/python3.6/dist-packages/cv2.cpython-36m-aarch64-linux-gnu.so cv2.so
$ source ~/virtualenv/tensorflow/bin/activate
$ python

```python
>>> import cv2
>>> cv2.__version__
'3.3.1'
>>>
```

[Xavier JetPack4.0 に対応した TensorFlow whlファイルは Nvidia Forum のこちら](https://devtalk.nvidia.com/default/topic/1041712/jetson-agx-xavier/tensorflow-wheel-for-jetpack-4-0-/)。
Cocoapodsを利用してライブラリのアップデートが出来ないとき

# Cocoapodsを利用してライブラリのアップデートが出来ないとき

### 環境

* Xcode 9.4.1
* Swift 4.1
* CocoaPods 1.5.3
* Buldler 1.16.2

## 対応方法

Realmのバージョンを上げるためPodfileを変更し

```
pod install
```
を実行したところ

```
[!] Unable to satisfy the following requirements:

- `RealmSwift (~> 2.8.2)` required by `Podfile`
- `RealmSwift (~> 2.8.2)` required by `Podfile`

None of your spec sources contain a spec satisfying the dependency: `RealmSwift (~> 2.8.2)`.

You have either:
 * out-of-date source repos which you can update with `pod repo update`.
 * mistyped the name or version.
 * not added the source repo that hosts the Podspec to your Podfile.

Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.
```

というエラーが...
CocoaPodsのSpecsを最新にするためのgit pullで止まっているらしい。
以下参照
http://d.akiroom.com/2015-08/pod-install-forever/

```
cd ~/.cocoapods/repos
git clone https://github.com/CocoaPods/Specs.git master
```

上記でCocoapodsのリポジトリをcloneした後に

```
pod setup
pod install
```
これで解決

私の場合はRelamでしたが、他のライブラリでもどうようなのではないかと思います。
誰かの助けになれば幸いです。
時刻をプログラムで扱いたい

初投稿。知り合いには気づかれたくないが、個人のメモを今後はこちらに移していこう。

## 日時時刻の扱い
- 2018/09/20 01:23:45.678901 のように、年月日時分秒で時刻を計算で使用したい
- CSVファイルに保存する
- python pandas では pd.to_datetime で変換できる。dtype は datetime64[ns] で保持。
- C/C++ではtime_tで保持。Cではprintfやstrftime() で、C++ では std::put_time で time_t を指定形式で書ける。

---
## テキストファイルでの保存
次のようなCSVファイル (log.csv)に保存されているとする。
   t,val
   2018/09/10 11:22:33.4,1.0
   2000/1/2 03:04:55.666,2.0

---
### python で読む
 
```test.py
import pandas as pd
df = pd.read_csv('log.csv')
df['t'] = pd.to_datetime(df.ts)
print(df.ts)
print(df.t)
```
---

### datetime64[ns]
最初のdf.ts はdtype が　object である。 

    0    2018/09/10 11:22:33.4
    1    2000/1/2 03:04:55.666
    Name: ts, dtype: object

pd.to_datetime を用いると、dtypeが datetime64[ns] になる。

    0   2018-09-10 11:22:33.400000
    1   2000-01-02 03:04:55.666000
    Name: t, dtype: datetime64[ns]

---
## time.h の time_t

```test_time_print.c
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main() {
    struct timeval ct;
    struct tm *t;

    gettimeofday( &ct, NULL );
    t = localtime(&ct.tv_sec);

    printf("%04d-%02d-%02d %02d:%02d:%02d.%03d\n",
                t->tm_year+1900,
                t->tm_mon+1,
                t->tm_mday,
                t->tm_hour,
                t->tm_min,
                t->tm_sec,
                (int)ct.tv_usec/1000
        );
    return 0;
}
```
---

##timt_t in strftime
- An alternative for printf of time_t variable.
- Link: [strftime を憶えられない](https://qiita.com/annyamonnya/items/97c5cb0cfa414b3592d7)
- [reference](http://www.cplusplus.com/reference/ctime/strftime/)

```c

  char buffer[256];
  strftime(buffer, sizeof(buffer), "%a %b %d %H:%M:%S %Y", &your_tm);
```
---
## strftime for C++: put_time

- [reference & example](https://en.cppreference.com/w/cpp/io/manip/put_time)
- Compile with g++ -std=C++11

```c++

#include <iostream>
#include <iomanip>
#include <ctime>
int main()
{
    std::time_t t = std::time(nullptr);
    std::tm tm = *std::localtime(&t);
    std::cout.imbue(std::locale("ru_RU.utf8"));
    std::cout << "ru_RU: " << std::put_time(&tm, "%c %Z") << '\n';
    std::cout.imbue(std::locale("ja_JP.utf8"));
    std::cout << "ja_JP: " << std::put_time(&tm, "%c %Z") << '\n';
}
```
---
# 備考
- うるう秒(leap second)の情報って、どうのように更新されるのかな。
- GPS week, time of week との変換はできるのだが、簡単なGUIを作りたい。
Xcodeのデバックでよく使うコマンドたち

# Xcodeのデバックでよく使うコマンドたち

### 環境

* Xcode 9.4.1
* Swift 4.1

## po String(data: data, encoding: .utf8)

通信で返ってきたData型を文字列でコンソール表示 Codableでパースする前のデータ確認など

## po dump(hogeEntity)

printではなくbumpを使う
自作のEntityやJSONをprintで見ると平文になってしまうが、 dumpなら構造を維持したママみれる

## po deviceToken.map { String(format: "%.2hhx", $0) }.joined()

デバイストークンを調べる

## exp hoge = "fuga"
デバック中に変数の値を書き換えるときに使う。 ユースケースとしては、API返り値が固定でデバッグしにくいので書き換えるとか。
Laravel ConsoleとHttpのログファイルを分ける

以前に[Laravel5.5 ConsoleとHttpのログファイルを分ける](https://qiita.com/ucan-lab/items/22d845f59b5dd0d7585e)という記事を投稿しましたが、Laravel5.6でログ周りの機能が刷新されて使えなくなってしまいました。
Laravel5.6以降でもログファイルの切り分けできるようにしました。

## ログの設定ファイル

`config/logger.php` なる設定ファイルが新たに追加されました。

詳細は公式ドキュメントやソースコードを参照。
https://readouble.com/laravel/5.7/ja/logging.html

## コマンドのログ、ウェブアクセスのログを分ける

```php
    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],
        ],

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 7,
            'tap' => [App\Logging\CustomFilenames::class],
        ],
    ],
```

`stack` チャンネルに `daily` を指定して、 `daily` チャンネルに `tap` 配列にクラスを指定することでMonologのカスタマイズが簡単に行えます。
新たにカスタマイズ用のディレクトリとファイルを作成します。

```sh
$ mkdir app/Logging
$ touch app/Logging/CustomFilenames.php
$ open $_
```

`app/Logging/CustomFilenames.php`

```php
<?php

namespace App\Logging;

use Monolog\Handler\RotatingFileHandler;

/**
 * 実行ユーザー毎にログファイルを出力する
 */
class CustomFilenames
{
    /**
     * Customize the given logger instance.
     *
     * @param  \Illuminate\Log\Logger $logger
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            if ($handler instanceof RotatingFileHandler) {
                $sapi = php_sapi_name();
                $handler->setFilenameFormat("{filename}-$sapi-{date}", 'Y-m-d');
            }
        }
    }
}
```

こんな感じにログファイルが出力されます。

- storage/logs/laravel-cli-2018-09-22.log
- storage/logs/laravel-cli-server-2018-09-22.log
- storage/logs/laravel-apache-2018-09-22.log

## 関連記事

- [Laravel SQLの実行クエリログを出力する](https://qiita.com/ucan-lab/items/753cb9d3e4ceeb245341)
- [Laravel リクエストログを出力する](https://qiita.com/ucan-lab/items/bfd15b096a916f811468)
AWS sesをSMTPサーバとして使用する手順メモ

# AWS sesをSMTPサーバとして使用する手順メモ


## 1. AWSコンソールからses管理画面へ移動
## 2. 画面左のメニューから"SMTP Settings"をクリックしページ移動
この画面にアクセスサーバ情報が書いてあります。

```
Server Name: email-smtp.us-west-2.amazonaws.com |
Port: 25, 465 or 587
```

### Portについて
25: SMTP
465: SMTPS
587: SMTP

#### 参考
https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7

## 3. "Create My SMTP Credentials"ボタンクリック
## 4.IAM作成フォームが表示されるので、任意の値を入力します。
ここで作成したユーザーでsesをコールする事になります。

## 5."ユーザーが正常に作成されました。"と表示されるので画面右下のボタンから認証情報のファイルをダウンロード

```csv:credentials.csv
IAM User Name,Smtp Username,Smtp Password
"SES_IAM_USER",SMTP_USER_NAME,Smtp Password
```

2で確認した`Server Name`、`Port`に
ファイルに記述されている`Smtp Username`,`Smtp Password`でアクセスすると
AWS sesサービスをファイルに記述されている`IAM User Name`で利用する事ができます
Java AudioSystem.getMixerInfo() で、文字化けの対処に挑戦

# Java AudioSystem.getMixerInfo() で、文字化け発生
## Javaのバグの様ですので完全には対処ができないが、とりあえず表示させてみました。
### バグ情報・・未対処？
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8177951

### バグの影響で正常に取得できていないので、最後に2バイト文字コードの1バイト目「 -125 」が入っている。無理やりスペースに変換する。

```java
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo() ;
for (int i = 0; i < mixerInfo.length; i++){
  byte b[] =  mixerInfo[i].getName().getBytes( java.nio.charset.StandardCharsets.ISO_8859_1 );
  if( b[b.length -1 ] == -125 ){ b[b.length -1 ] = 0x20 ; }
  String l = new String( b );
  system.out.println( l );
}
```
とりあえずとりあえず、文字化けをなくすだけ！！

## 実行結果
?v???C?}?? ?
?X?s?[?J?[ (Realtek High Definition A
?v???C?}?? ?T?E?
?X?e???I ?~?L?T?[ (Realtek Hig
Port ?X?s?[?J?[ (Realtek High D
Port ?X?e???I ?~?L?T?[ (Rea

## 実行結果（スペース変換前）
プライマリ ?
スピーカー (Realtek High Definition A
プライマリ サウ?
ステレオ ミキサー (Realtek Hig
Port スピーカー (Realtek High D
Port ステレオ ミキサー (Rea

## 実行結果（スペース変換後）
プライマリ
スピーカー (Realtek High Definition A
プライマリ サウ 
ステレオ ミキサー (Realtek Hig
Port スピーカー (Realtek High D
Port ステレオ ミキサー (Rea
InterfaceError:MacからSQL Serverへ急に接続できなくなったときのこと

MacからDockerに作ってあるSQL Serverへのpython使っての接続が急にできなくなってしまったので、その時の解決策をメモしておく。

#環境前提
- jupyter notebookからpyodbc,sqlalchemyを用いた接続。sqlalchemyの接続文字列や使い方は下記がとてもわかりやすかったので参照。
    - https://symfoware.blog.fc2.com/blog-entry-1372.html
- FreeTDSとかODBCドライバーをインストールしている。ODBCドライバーは下記URL参照
    - https://docs.microsoft.com/ja-jp/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017

#ぶち当たったこと
jupyter notebookからSQL Serverにつなぎに行こうと下記コード実行。

```python:jupyterのコード.ipynb
import sqlalchemy
import pyodbc
engine = sqlalchemy.create_engine("mssql+pyodbc://ユーザ名:パスワード@データソース名(DSN)")
connection = engine.connect()
```
したら下記エラーメッセージが出現。

```python:エラーメッセージ
InterfaceError: (pyodbc.InterfaceError) ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)') (Background on this error at: http://sqlalche.me/e/rvf5)
```

#調査

なんもいじってないのになーと思いながらターミナルから`odbcinst -j`で見ているiniファイルとかを確認する。

```
$ odbcinst -j
unixODBC 2.3.6
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /Users/Macのユーザ名/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
```
odbc.iniファイルにDSNが定義されているはずなので、中身を見ようと、`less /etc/odbc.ini`してもそんなファイルないよと怒られる。。。

絶対どっかにあるだろーと思い`find / -name odbc.ini`で探す。

```
$ find / -name odbc.ini
/usr/local/etc/odbc.ini
```
中身を確認

```
$ less /usr/local/etc/odbc.ini

[データソース名]
Driver=FreeTDS
Server=localhost
Port=1433
Database=データベース名
```
とても見覚えのあるデータソース名で定義があった。（juypter notebbokで使っているデータソース名）
これを上記のSYSTEM DATA SOURCESに放り込めばいいんじゃね？

#解決策

無邪気に/etcにコピー。/etcにはodbcinst.iniもなかったのでついでにそれもコピー

```
$ cp /usr/local/etc/odbc.ini /etc/odbc.ini
$ cp /usr/local/etc/odbcinst.ini /etc/odbcinst.ini
```

再度juypter notebookから接続確認して見たら、InterfaceErrorも出現せず、無事接続できました。
原因は不明だけど、めでたしめでたし。
Elixirの無名関数メモ

　Elixirの無名関数(Anonymous function または lambda)についての備忘録です。どの言語もそうですが、Elixirも覚えにくいシンタックスがあります。今回取り上げるのは無名関数です。


#１．無名関数呼び出しにはdotを付ける！

　以下は無名関数の定義ですが、fnとendの間に関数本体を定義し、それをdoubleという変数で受けています。

```elixir:無名関数の定義
iex(1)> double = fn x ->
...(1)>   2*x
...(1)> end
#Function<6.99386804/1 in :erl_eval.expr/5>
```

　以下が無名関数の呼び出しですが、doubleで呼び出すのではなく、double. で呼び出します。変数名の最後にdotを付けます。

```elixir:無名関数の呼び出し
iex(2)> double.(3)
6
```

　ちなみに dot なしで double で呼び出すと、以下のようにエラーになります。dot無しで呼び出すと、Elixirはdoubleを無名関数ではなく、通常の名前付き関数と解釈して、その定義を探すようです。その結果、undefined function エラーとなります。

```elixir:名前付き関数の呼び出し
iex(3)> double(4)
** (CompileError) iex:3: undefined function double/1
```



#２．無名関数の短縮定義 - \& operator

　以下は無名関数の普通の定義です。

```elixir:普通の定義
iex(3)> sum3 = fn x1, x2, x3 -> x1 + x2 + x3 end
#Function<18.99386804/3 in :erl_eval.expr/5>
iex(4)> sum3.(1,2,3)
6
```

　\& operatorを使うと以下のように短い定義が可能です。

```elixir:短縮定義
iex(5)> sum3 = &(&1 + &2 + &3)
#Function<18.99386804/3 in :erl_eval.expr/5>
iex(6)> sum3.(4,5,6)
15
```


　もう一つサンプルを示します。

```elixir:短縮定義２
iex(9)> hello = &IO.puts("Hello " <> &1)
#Function<6.99386804/1 in :erl_eval.expr/5>
iex(10)> hello.("Taro")
Hello Taro
:ok
```


以上です。
VirtualBox 5.2.18のVESAが動かない

#はじめに
VirtualBox 5.2.18のVESAでfbtermが動かなかったのでvboxvideoを無効にしてみました。

#VirtualBoxとVirtualBoxGuestAdditionsを更新したらfbtermでエラー発生
VirtualBoxを新しくしたところ、fbtermが動かなくなってしまいました。

```shell-session:fbtermを動かしたとき
BUG: unable to handle kernel paging request at ffffec8343800020
IP: [<ffffffffa71b6b6a>] fb_deferred_io_fault+0x4a/0xd0
PGD 3f7e0067
PUD 3f7df067
PMD 0

Oops: 0000 [#1] SMP
Modules linked in: vboxsf(O) joydev hid_generic crct10dif_pclmul crc32_pclmul usbhid vboxvideo(O) hid
ghash_clmulni_intel evdev intel_rapl_perf snd_intel8x0 pcspkr ac serio_raw snd_ac97_codec sg ac97_bus
battery ttm drm_kms_helper vboxguest(O) drm video snd_pcm snd_timer snd soundcore button ip_tables
x_tables autofs4 ext4 crc16 jbd2 crc32c_generic fscrypto ecb mbcache sr_mod cdrom sd_mod ata_generic
ohci_pci crc32c_intel aesni_intel aes_x86_64 glue_helper lrw gf128mul ablk_helper cryptd psmouse ahci
libahci ehci_pci ohci_hcd i2c_piix4 ehci_hcd ata_piix usbcore e1000 usb_common libata scsi_mod
CPU: 0 PID: 634 Comm: fbterm Tainted: G           O    4.9.0-8-amd64 #1 Debian 4.9.110
-3+deb9u4
Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
task: ffff9aa179e9b140 task.stack: ffffb8220056c000
RIP: 0010:[<ffffffffa71b6b6a>]  [<ffffffffa71b6b6a>] fb_deferred_io_fault+0x4a/0xd0
RSP: 0000:ffffb8220056fdc8  EFLAGS: 00010286
RAX: ffffec8343800000 RBX: ffffb8220056fde8 RCX: ffffc00000000fff
RDX: ffffec8343800000 RSI: 0000000000000063 RDI: 0000000000000000
RBP: ffff9aa1766ad190 R08: 0000000000000000 R09: 00007ff67fe83000
R10: ffff9aa1766ad190 R11: 0000000000000001 R12: ffffec8343800000
R13: 0000000000000000 R14: ffff9aa1766ad190 R15: ffffb8220056fe70
FS:  00007ff682cd5740(0000) GS:ffff9aa17fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffffec8343800020 CR3: 000000003a85a000 CR4: 0000000000040670
Stack:
 ffff9aa1766ad190 ffffb8220056fe68 0000000000000000 ffffffffa6fb4dc7
 024200ca00000055 0000000000000000 00007ff67fe83000 0000000000000000
 0000000000000000 ffff9aa1766ad190 26149015e51e46b1 ffff9aa1766ad190
Call Trace:
 [<ffffffffa6fb4dc7>] ? __do_fault+0x87/0x170
 [<ffffffffa6fb8dcd>] ? handle_mm_fault+0x58d/0x12b0
 [<ffffffffa6e61185>] ? __do_page_fault+0x255/0x4f0
 [<ffffffffa7417018>] ? page_fault+0x28/0x30
Code: b8 02 00 00 00 c3 41 54 55 48 89 fd 53 48 89 f3 48 8b b8 10 01 00 00 48 8b b0 f0 03 00 00 e8 fe
fe ff ff 48 85 c0 49 89 c4 74 52 <48> 8b 40 20 48 8d 78 ff a8 01 49 0f 44 fc f0 ff 47 1c 48 8b 07
RIP  [<ffffffffa71b6b6a>] fb_deferred_io_fault+0x4a/0xd0
 RSP <ffffb8220056fdc8>
CR2: ffffec8343800020
---[ end trace 8e50b1f11ba64ab9 ]---
```
#やった対策
vboxvideoを動かないようにしました。
フレームバッファが遅くなるかも知れません。

```:vboxvideoを無効化
echo "install vboxvideo /bin/true" | sudo tee -a /etc/modprobe.d/vboxvideo.conf
```

#他メモ (fbdevを有効にする方法と録画)
ブート時にgrubで止めて、カーネルオプションに追加してみた。
すると/dev/fb0が現れる。/dev/fb0のときは--vesa-mode=を使わない。

```:vesafb(grub)
video=vesafb:mtrr:3,y vga=0x311
```

録画もできる。vesaだと、未だ分からない。

```:録画(/dev/fb0)
ffmpeg -y -f fbdev -i /dev/fb0 -framerate 2 /tmp/out.gif
```
PCをインスタント・スパイカムにする

##PCに20行以内でスパイカムを作成する。(所要時間10分)
1.あらかじめusbで動作するpython(python,bottle,cv2) を用意する。
2.wifiを確認(アドレス　例は、192168.1.10)する。
3.下記のプログラムをusbに入れる。
4.実行する

``` spycam.py
from bottle import *
import cv2
class VideoCamera(object):
    def __init__(self):
        self.video = cv2.VideoCapture(0)
    def __del__(self):
        self.video.release()    
    def get_frame(self):
        return cv2.imencode('.jpg', self.video.read()[1])[1].tobytes()
def gen(camera):
    while True:
        yield (b'--frame\r\nContent-Type: image/jpeg\r\n\r\n' + camera.get_frame() + b'\r\n\r\n')
@route('/video_feed')
def video_feed():
    response.content_type = 'multipart/x-mixed-replace; boundary=frame'
    return gen(VideoCamera())
@route('/')
def index(): 
    return '<div align="center"><h1>Video Streaming</h1><img src="/video_feed"></div>'
run(host='192.168.1.10', port=911)
```
解説

``` py

return cv2.imencode('.jpg', self.video.read()[1])[1].tobytes()
```
tupleで返される値を一行に書いた。
一般的な御作法で書くと・・・

```py
success, image = self.video.read()       
ret, jpeg = cv2.imencode('.jpg', image)
return jpeg.tobytes()
```
yieldを用いてmotion jpegを作成

```py
yield (b'--frame\r\nContent-Type: image/jpeg\r\n\r\n' + camera.get_frame() + b'\r\n\r\n')
```
#### 「Stupid Phone」から http://192.168.1.10:911 アクセスする。
![cap1.PNG](https://qiita-image-store.s3.amazonaws.com/0/274715/9b5d9c45-73ee-f942-a2f3-a515c3d02c2f.png)
MicrosoftFlowのコネクタも万能ではないというお話（対処法含む）

# 今回の投稿背景
Microsoft Flowを使ってるけど、接続先コネクタの数が膨大っていうのはわかるけど
実際使ってみると・・・ってなったところを書いてみる

# FaceAPIを例にお話しをしてみます。

## FaceAPIコネクタのアクション数
全部で11個です。（2018/9/22現在）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/78b0ef71-9289-a765-0026-d1f8c7f5e387.png)

まぁこれだけで大概のことは確かにできるんですよ。
ユーザ作成したりとか、顔登録したりとか
何歳だとか、性別とか笑顔率とか・・・

ただ、実際やりたいことってのは
顔認証だったり、感情だったりそういうことじゃないかなと思うのですが
FaceAPIコネクタにはそれが実装されていません。

なにより、FaceAPIコネクタに写真を渡すときは、予め格納している写真ファイルのURLしか指定できません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/f71f09a2-28ff-c713-6d8a-a7c6726a843d.png)


## FaceAPIのアクション数
全部で57個です。（2018/9/22現在）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/78e0e3ae-e823-24fb-7f62-084c9fb3e4e8.png)

[FaceAPI Reference](https://westus.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236)

FaceAPI自体は顔写真データの提供にURL指定だけでなく、Binalyでの提供も問題ないとしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/7db878a7-99c7-5371-c7e1-0f8515b0adf5.png)

また、顔認証にはIdentifyという機能があります。

## 結論
コネクタの種類はいっぱいあるけど、そのコネクタ元の機能が<font color="MediumOrchid">**全部使えるとは限らない**</font>ということ。

# じゃあどうするのさ！
HTTPコネクタとJSON解析を使用しましょう。
※カスタムコネクタを作ればいいじゃないというお話は後ほど^^

## HTTPコネクタ
こちらのコネクタになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/cb8acfdf-0c7d-f5cc-8d4d-06b50dbc4793.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/d7cb580d-ecc7-03e8-a381-3c13662bdd74.png)

### FaceAPI の Idenifyを例にするとこんな感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/ea8e2016-55c9-e4f9-5ff6-b3ee41210d4f.png)

IdentifyはPOSTする仕様なので、方法はPOSTを指定する
URIは使用するFaceAPIのリージョンにあったURIを指定する。
※この場合は東日本リージョン
ヘッダーはIdentifyの要求するRequest Headersに合わせて登録する。
クエリはIdentifyにはないけど、URIにオプション指定するやつがある場合はここに指定する。
本文にIndentifyが指定するJSONを記載する（動的アクション指定可能）

すると出力結果はJSONで返ってきます。が
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/1d1f4fe7-6360-fb07-6a6c-79461d871f76.png)
こんな感じで返ってくるので、このままでは使えませんので、JSON解析を使用します。

## JSON解析
データ操作コネクタのJSONの解析アクションを使用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/e3433f3d-24af-a1bf-6d02-6b2bd2a9c632.png)

ここでコンテンツにHTTPコネクタの本文を指定（結果のJSONは本文に入っている）して、スキーマを宣言すればそこに各結果が動的アクションとして宣言されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/08f0616e-4b88-9d1a-cff2-2e4323c6e7e3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/b93864f7-f881-f90a-ad88-74dfc28cc251.png)


なお、スキーマを自分で宣言するのが難しい場合は、出力データからスキーマを自動生成することができるので活用ください。

# カスタムコネクタ・・・
試しに登録してみたんですけどね・・・
正直いろいろめんどくさくて、HTTPコネクタつかったほうが楽って気がするのは私だけですかね＾＾；
APIのJSONそのまま投げることも確かにできるんですが、いろいろ再定義しないといけないとかあるので
ほんとめんどくさいっすあれ。

# 総括
Flowを使っていく中で、これもしたいけどコネクタがない！なんてことにぶつかることもあるかと思います。その時は、使用したいデータの生成元にAPIがあるかどうかを確認し、実際にFlowで取得可能かお試しすると、道が切り開けるかもしれません。
なにより大事なことは、**あきらめない心** これはどんな仕事でも大事ですよね！
Railsのvalidatesで独自のバリデーションを使用する

# validatesで独自のバリデーションを使用する

標準validateに無いバリデーションを行いたい場合

```models/user.rb
class User < ActiveRecord::Base
  validate :name_valid?

  private

  def name_valid?
    if バリデーション条件
      errors.add(:name)
    end
  end
end
```
Gitコマンドを関数化してpush/pullを簡単化


# はじめに
自分はローカル環境とサーバ環境とのファイル共有のためにGitHubを使うことがある。この場合やりたいことは両環境でのファイル変更を反映させることだけなのだが、Gitコマンドはこれが意外と面倒。いちいち数行のコマンドを打つ必要が必要がある。

そこでこれらのコマンドをまとめて関数化してしまおうと思った。


# 関数定義
~/.bashrc に以下を記述して，再ログインまたは`source ~/.bashrc`で適用。
ここではホームディレクトリにあるDeropyというリポジトリを扱うことにする。

```bash
pullD() {
  cd ~/Deropy/  # ディレクトリ移動
  git pull https://github.com/derodero24/Deropy  # pull
  cd -  # もといたディレクトリに戻る
}

pushD() {
  cd ~/Deropy/  #　ディレクトリ移動
  git add .  # 変更をすべてadd
  git commit -m "from Server"  # コミットメッセージを設定
  git push origin master  # masterブランチにpush
  cd -  # もといたディレクトリに戻る
}
```


# ユーザ名・パスワードの省略
上記の関数を使ってもユーザ名とパスワードは毎回聞かれる。そこでこれらも別途保存してしまうことにする。

```
git config --global credential.helper store
````
と打ったあとに一度だけログインすると，ユーザ名・パスワードが ~/.git-credentials に保存されて，以降聞かれなくなる。


# 使ってみる

### pull
```shell
derodero:~$ pullD
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/derodero24/Deropy
 * branch            HEAD       -> FETCH_HEAD
Updating b7392af..e406476
Fast-forward
 common.py | 2 ++
 1 file changed, 2 insertions(+)
/home/derodero
```

### push
```shell
derodero:~$ pushD
[master daf4eb4] from Server
 1 file changed, 1 insertion(+)
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 290 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/derodero24/Deropy
   1bc2606..f3d1f53  master -> master
/home/derodero
```
IOS12で追加されたShortcutsアプリでQiitaの上位２０件の記事を所得してみた

IOS12から追加されたShortcuts(元workflow)でスクレイピングをしてみたく、簡単に組むことが出来たので共有します。


<img width="375" alt="IMG_5676.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/113524/a4869795-44eb-353c-69cc-b63a7437462d.png"><img width="375" alt="IMG_5677.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/113524/969800a5-9dc4-fb41-b5fe-e230a30c7d85.png">
<img width="375" alt="IMG_5678.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/113524/3207e2a2-9f19-5c84-437a-d07ecadd6f66.png"><img width="375" alt="IMG_5679.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/113524/7a33b49f-6349-f255-8072-ee433d5fb612.png">
<img width="375" alt="IMG_5680.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/113524/f9eac99f-f6aa-5517-78af-de6341fdb306.png">

**出力結果**
<img width="375" alt="IMG_5681.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/113524/d69e7555-a405-9b9e-4827-ca1c5c7cec35.png">


**やってること**
Qiitaから記事所得->
HTML化->
TOP20の所得->
タイトルの切り出し&余分なところの排除

みたいな感じです。
作成したものは[ここ][link-1]にもおいておきました。
[link-1]:https://www.icloud.com/shortcuts/398e2716e79c4b72ab061756497814f2

**感想**
本当はtag解析とかできるとより見やすくなったり高度なことができるので欲しいところです。
アプリでショートカットの拡張可能なのでそのうちできるようになるかもしれませんね。
とはいえ、標準状態でもshortcutsは結構複雑な動作もできるので、色々開発用にも使えそうです。
Elixir + Rustlerでベクトル演算を高速化しよう 〜初級者編 1.5〜

シリーズとしては**Elixirありきでrust( rustler )を使う人**をメインに据えています．
|> 「[Elixir + Rustlerでベクトル演算を高速化しよう〜Rustler初級者編 1 〜](https://qiita.com/hisaway/items/1785615119bf4633567e)」　

※この記事は「Elixir + Rustlerでベクトル演算を高速化しよう」の「よりみち」的な立ち位置です．

---

# はじめに
　Elixirでベクトル演算を扱うなら`list`もしくは`tuple`が必要です．
※ちなみに私の投稿記事では一貫して`list`を使っています．
（[前回の記事](Elixir + Rustlerでベクトル演算を高速化しよう〜Rustler初級者編 1 〜)では，rustの方でtupleにしましたが）

となると必然的に`list`作成を高速化したくなります．`Enum.to_list`が遅いって話は聞き逃せません．

これを機に`list`の`new`と`zeros`関数を自作して速度を測定してみました．

# 開発環境
- OTP-21.0.9
- Elixir(1.7.3)
- rustler(0.18.0)
- rust(1.28.0)

# コード


以下が使用したコードです．
**※内積計算の部分は省いています**

`@index 100_000_000`で定数指定しています．

```elixir:example.ex
defmodule NifExample do
	use Rustler, otp_app: :phx_rust, crate: :example

	@index 100_000_000

	# func with nif
	def new(_a), do: exit(:nif_not_loaded)
	def zeros(_a), do: exit(:nif_not_loaded)

	# func for list
	def new_ex(e1, e2) when e1 > e2, do: []
	def new_ex(e1, e2) do
		[e1] ++ new_ex(e1+1, e2)
	end

	def zeros_ex(n) when n < 1, do: []
	def zeros_ex(n) do
		[0] ++ zeros_ex(n-1)
	end

	def new_list_benchmark do
		:timer.tc( fn ->
			1..@index
			|> Enum.to_list
		end)
		|>elem(0)
		|>Kernel./(1_000_000)
	end

	def new_list_benchmark1 do
		:timer.tc( fn ->
			new_ex(1, @index) 
		end)
		|>elem(0)
		|>Kernel./(1_000_000)
	end

	def new_list_benchmark2 do
		:timer.tc( fn ->
			new(@index) 
		end)
		|>elem(0)
		|>Kernel./(1_000_000)
	end

	def zeros_benchmark do
		:timer.tc( fn ->
			List.duplicate(0, @index)
		end)
		|>elem(0)
		|>Kernel./(1_000_000)
	end 

	def zeros_benchmark1 do
		:timer.tc( fn ->
			zeros_ex(@index)
		end)
		|>elem(0)
		|>Kernel./(1_000_000)
	end
	
	def zeros_benchmark2 do
		:timer.tc( fn ->
			zeros(@index)
		end)
		|>elem(0)
		|>Kernel./(1_000_000)
	end
end
```

# 実行
## `new`
指定した数まで`list`を作成する

|| Elixir enum | Elixir reursive | rust |
|:-:|:-:|:-:|:-:|
|実行時間(一千万)|1.482213|0.593355|0.240299|
|倍率|(1.00)|2.49|6.16|
|||||
|実行時間（一億）|13.485997|6.70341|4.409689|
|倍率|(1.00)|2.01|3.05|

`Enum.to_list`と比較すると，自前の再帰呼び出しでも速度が上回っていますね．

## `zeros`
指定した数だけ要素`0`をもつ`list`を返す

|| List.duplicate | Elixir recursive| rust |
|:-:|:-:|:-:|:-:|
|実行時間(一千万)|0.201562|0.55816|0.354279|
|倍率|2.76|(1.00)|1.57|
|||||
|実行時間(一億)|1.8861|9.729135|6.261378|
|倍率|5.15|(1.00)|1.55|

`Enum`の`zeros`に相当するものが見つからなかったので，Erlangの`:lists.duplicate`の測定をしました．
rustより速いんですよね．[ソースコード](https://github.com/blackberry/Erlang-OTP/blob/master/lib/stdlib/src/lists.erl)を見に行ったら， 私が自前のElixirで実装した方法とは違う方法で再帰呼び出ししてます．
組み込み型に関数があるんならラップするだけでいいので自前の関数必要なかったですね．

```elixir
def zeros(num) do
  List.duplicate(0, num)
end
```
ただ`list`に対して`++/2`を使用するとパフォーマンスが落ちることはわかりました．
ちゃんと`head`と`tail`を使いましょう．

# まとめ
- やっぱり`Enum.to_list`遅い
- ~~`list`の`new`はrustが速い~~
    - Erlangのソースコードを眺めたら`:lists.duplicate`が応用できそうな気がするので一旦保留
- `zeros`，`ones`なら実装は組み込み型関数の利用で容易．

# 今後の記事予定
## メイン
1. NIF非同期呼び出しの実装
2. 並列処理の実装(CPU)
3. 並列処理の実装(GPU)
4. Elixirからrustに`range`(例 1..10_000_000 )を渡せるようにする関数`to_range`の実装

## よりみちの続き

- Erlangの関数を呼び出す vs Erlangと同じ挙動のコードをElixirを書いて呼び出す
  - パフォーマンスの比較
  - 移植性？の確認
  - 可読性の比較
初心者がRailsガイドを1から100まで読んでみる　Railsをはじめよう編その５　マイグレーション

####5.5.マイグレーションを実行する
マイグレーションっていうのはRubyのクラスのひとつで、データベーステーブルの操作を簡単にするものなんだって。

``` タイムスタンプ_create_articles.rb
class CreateArticles < ActiveRecord::Migration[5.1]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :text

      t.timestamps
    end
  end
end
```
changeっていうメソッドがあってその中でcreate_tableといういかにもテーブルを作ってくれそうな文が書いてある。
このファイル自体は今は特にいじる必要がなくて、以下のコマンドを打ってみよう。

`$ bin/rails db:migrate`
<img width="560" alt="スクリーンショット 2018-09-21 17.53.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/d78822e6-8b49-40fa-84da-ec55d83fad3b.png">
なんかcreate_tableされたみたい。

これでテーブルができたようだ。
データを格納する先だね。
5章の最初に、ルーティングの設定に`resources:articles`と追記してarticle関連のルートを一括で設定した。
今、そのarticleのデータを格納するテーブルができた。
役者が揃ってきた感じがするぞ。

その6
https://qiita.com/Natsuki_on_Rails/items/de9d80b2b44fee8ef2fb
Mac OS — クリップボードの画像を直接編集する


## クリップボードに画像をコピーしておく

例:

「スクリーンショット撮影」+「直接クリップボードにコピーする」モードなどで

( `Command + Shift + Control` )

## 画像例

こんな画像がクリップボードに入っているとする。

![image](https://user-images.githubusercontent.com/13635059/45910676-0d01a580-be46-11e8-9b33-8bef2cbd27f8.png)

[Doodle — Some creature sees straight – Yuma Inaura ( 稲浦悠馬 ) – Medium](https://medium.com/@YumaInaura/doodle-some-creature-sees-straight-11c0ddb9d90)


## Previewを使う

![image](https://user-images.githubusercontent.com/13635059/45910034-0290dd00-be41-11e8-9fe2-c395cbb0cda6.png)

### `Command + N` でクリップボードの画像を開く

![image](https://user-images.githubusercontent.com/13635059/45910049-1e947e80-be41-11e8-85b0-85205509d20f.png)

## 画像を編集する

![image](https://user-images.githubusercontent.com/13635059/45910625-a4b2c400-be45-11e8-977f-8fcf614bb826.png)


### 編集した画像をクリップボードにコピーする

**Command + C** でクリップボードにコピー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/368d513d-1f10-85b8-924a-419d244f0ef8.png)


### 編集後の画像をペーストできるになる

![image](https://user-images.githubusercontent.com/13635059/45910325-22c19b80-be43-11e8-9488-def65cb47bac.png)

## 使い方

GithubやQiitaなど、画像ペースト対応サイトであれば `Command + V` で画像をペーストできる

![image](https://user-images.githubusercontent.com/13635059/45910405-ac716900-be43-11e8-8ec0-a16a17d6feb3.png)

![image](https://user-images.githubusercontent.com/13635059/45910406-ada29600-be43-11e8-9213-0722703c0003.png)


## Versions

- Max OS X High Sierra

## Links

- [Gist](https://gist.github.com/YumaInaura/5baf3abd9411ae0b61f4516af75de999)
- [Medium—imported](https://medium.com/supersonic-generation/mac-os-edit-image-in-clipboard-directly-with-preview-e1200cbe8eab)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Xcode 10 - Swift 4.2への自動コンバートをやってみた

# はじめに

Xcode 10が正式リリースされたので、早速アップデートして、個人の趣味で開発しているプロジェクトをコンバートしてみました。

class数は25という、小規模なプロジェクトです。
OSSライブラリーは利用していません。

以前の環境は、Xcode 9.4 - Swift 4.1です。

# コンバート結果

結果は非常にスムーズで、特筆すべき事項はないです（笑）。
でも、スムーズだった、という結果を共有する意味も少しはあるだろうと思って、ログっておきます。

なお、Swift 4.1と4.2の変更点は、ググればたくさん出てくると思うので割愛します。

# ログ

Xcode 10にアップデート後、こんな感じの警告が表示されます。
![スクリーンショット 2018-09-22 8.02.52.png](https://qiita-image-store.s3.amazonaws.com/0/122917/ddffdfd1-5d3e-b507-dc88-1b49b5985dcb.png)

上の警告をクリックすると、ターゲットの選択になります。
![スクリーンショット 2018-09-22 8.03.06.png](https://qiita-image-store.s3.amazonaws.com/0/122917/b21bfae4-3d24-d83a-a6e7-51bb01288aa2.png)

「Next」をックリックすると、コンバートが始まります。
![スクリーンショット 2018-09-22 8.03.20.png](https://qiita-image-store.s3.amazonaws.com/0/122917/f3f086a5-346f-b088-e4f3-b86bf58a7ebc.png)

インジケーターが止まると、コンバート結果のプレビューが現れます。
![スクリーンショット 2018-09-22 8.04.53.png](https://qiita-image-store.s3.amazonaws.com/0/122917/3b92913e-7e62-2756-13ae-3f21945adedb.png)

「Save」をクリックすると、コンバート結果が保存されます。

# 今回のプロジェクトのコンバート内容

ほとんど、UIKitの仕様変更だけでした。
コンバート結果を自力で補正する必要もありませんでした。

全部ではないですが、コンバート結果のサンプルを貼っておきます。

```diff
-    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
+    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
```

```diff
-        self.addChildViewController(navigationViewController)
+        self.addChild(navigationViewController)
```

```diff
-    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
+    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
```

```diff
-            UIView.animate(withDuration: 0.3, delay: 0.0, options: UIViewAnimationOptions.curveEaseOut, animations: {
+            UIView.animate(withDuration: 0.3, delay: 0.0, options: UIView.AnimationOptions.curveEaseOut, animations: {
```

```diff
-                        let stringAttributes: [NSAttributedStringKey : Any] = [
+                        let stringAttributes: [NSAttributedString.Key : Any] = [
```
Google 翻訳の javascript が（ほんの少し）変わって、Google Home Notifier が動かない

Google 翻訳のサイトに設置されている javascript コードに変更があったようで、node.js のライブラリ [google-home-notifier](https://www.npmjs.com/package/google-home-notifier) が影響を受けている模様([issue](https://github.com/noelportugal/google-home-notifier/issues/46))。

依存ライブラリの [google-tts-api](https://www.npmjs.com/package/google-tts-api) で[対応済み](https://github.com/zlargon/google-tts/pull/14)だが、 [google-home-notifier](https://www.npmjs.com/package/google-home-notifier) はメンテナンスが停滞しているので、
手っ取り早く対応するには、[google-home-notifier](https://www.npmjs.com/package/google-home-notifier) の package.json を書き換えて、google-tts-api を消した後 `npm i` しなおすのが早そう。


```js:package.json(before)
  "dependencies": {
      :
    "google-tts-api": "0.0.2",
      :
  }
```

```js:package.json(after)
  "dependencies": {
      :
    "google-tts-api": "0.0.3",
      :
  }
```

一番重要なことを書き忘れていたので追記。
拙ライブラリの [esp8266-google-tts](https://github.com/horihiro/esp8266-google-tts) も対応して 1.0.6 として公開済み。
これで、[esp8266-google-home-notifier](https://github.com/horihiro/esp8266-google-home-notifier) も復活したと思う。
VLOOKUP関数を関数知識がなくても入力できるようになるツール

Excelを教えていますと、Excelを扱う人がすべて関数が扱えるわけではなく、中にはどうしても理解できない人もいます。
知識としてはわかるけど、実践となると急にできなくなることもあります。
そういう方のほうが、実はやりたいことは明確なことも多く、ジレンマに陥ります。
そのようなストレスがあることは避けたいと思いまして、関数知識がなくても関数を扱えるようになるツールがあるといいかなと思い、VBA識者の方への提案となります。
#VLOOKUP関数を関数理解なしで作成するツール
今回は、VLOOKUP関数での例を提示します。
せっかくなので、VLOOKUP関数だけだともったいないので（関数ウィザードと変わらない）、VLOOKUP関数と同時に設定されるものを考えてみます。
* VLOOKUP関数
* IFERROR関数
* 一覧からリスト入力の入力規則
* 選択値と一致した一覧表の箇所を色を付ける条件付き書式
* などなど
#作成手法
今回は、コード作成時間の短縮のために、これらを一旦マクロの記録で記録し、VBAコードを作成しました。
それからフォームを作成し、そのフォームに貼り付けて必要な箇所をフォームから入力できるようにしました。
工夫したのは、範囲選択された中で、始まりと終わりのセル位置の列のアルファベットと行の数値に分離するところです。
#実際に作成したもの
実際に作成したものは次の通りです。
###フォーム
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/8e9a65e7-6acc-5e02-9d41-1018de3dbf99.png)
ボックスの一覧は次の通りです。
* 項目名：一覧表範囲：RefEditで作成、Nameは「一覧範囲」
* 項目名：元の値のセル：RefEditで作成、Nameは「元の値」
* 項目名：出力セル：RefEditで作成、Nameは「出力」
* 項目名：一覧の何列目？：テキストボックスで作成、Nameは「列」
RefEditの使い方は<a href="https://qiita.com/yosatonet/items/b7083d7c95d2d81b1ffa">こちら</a>。

###フォームに対するVBA
```VBA
Private Sub CommandButton1_Click()

Dim str As String
Dim 一覧範囲lt As String
Dim 一覧範囲rt As String
Dim 一覧範囲ld As String
Dim 一覧範囲rd As String
Dim リスト範囲 As String

str = Mid(一覧範囲, InStr(1, 一覧範囲, "$") + 1, 500)
一覧範囲lt = Mid(str, 1, InStr(1, str, "$") - 1)
str = Mid(str, InStr(1, str, "$") + 1, 500)
一覧範囲rt = Mid(str, 1, InStr(1, str, ":") - 1)
str = Mid(str, InStr(1, str, "$") + 1, 500)
一覧範囲ld = Mid(str, 1, InStr(1, str, "$") - 1)
str = Mid(str, InStr(1, str, "$") + 1, 500)
一覧範囲rd = str

リスト範囲 = "=$" & 一覧範囲lt & "$" & 一覧範囲rt & ":$" & 一覧範囲lt & "$" & 一覧範囲rd

    Range(元の値).Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=リスト範囲
        .IgnoreBlank = True
        .InCellDropdown = True
        .IMEMode = xlIMEModeNoControl
        .ShowInput = True
        .ShowError = True
    End With
    Range(出力).Formula = "=IFERROR(VLOOKUP(" & 元の値 & "," & 一覧範囲 & "," & 列 & ",FALSE),"""")"
    Range("C2:D8").Select
    Application.CutCopyMode = False
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=" & 元の値 & "=$" & 一覧範囲lt & 一覧範囲rt
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0.8
    End With
    Selection.FormatConditions(1).StopIfTrue = False
End Sub

```
#実働するもの
![data5125.gif](https://qiita-image-store.s3.amazonaws.com/0/247287/47163a69-ed90-a944-28e9-7e588950f43e.gif)

#まとめ
このようなツールをどう運用すべきか、リボンに入れればいいのか、ショートカットキーで呼び出すのか、またはもっと他の方法があるのか、まだまだ検討の余地があります。
もっと入力しやすいような、フォーム自体がチュートリアルのようになっている必要もあるかもしれません。
機能についてももっと違ったアプローチがあるかもしれません。
VBAに関してももっと良いコードになる可能性も十分あるでしょう。
パソコンは何でもそうだと思うのですが、一定数の努力しても苦手な人がいます。それがたとえとてもマイノリティな数でも、このようなツールで支援し、デキル人と変わらないパソコン操作ができればいいなと思っています。
Unity(Android)のプロジェクトで#ziplibを使う際の注意点について

#Unityと#ziplib
Unityでwindows/iOS/androidの三者デバイズに対応したアプリを作っています。
で、暗号化zipを色々処理するために#ziplibを使っているのですが、どうもコイツがcp932なんて知らねぇよとエラーを吐きよるのです。（cp932というのはCodePage932。shiftJISの拡張版みたいなヤツね）

で、#ziplibの中身を確認してみると。

		public static string ConvertToString(byte[] data, int count)
		{
			if (data == null) {
				return string.Empty;
			}
			return Encoding.GetEncoding(DefaultCodePage).GetString(data, 0, count);
		}

https://github.com/icsharpcode/SharpZipLib
のZipConstants.csより

うん、どうもコード内を確認してみた限りcp932の直接の指定はないけども、このDefaultCodePageが932や437になって問題を起こしてるようだ。#ziplibはcp932やcp437に当然対応してると思ってGetEncodingを投げるのに、アプリはCodePageを知らないという流れかな。(windowsで動かすとcp437は対策しなくても動いたりdllを追加することでcp932も動いたりするので、デバイズ側も色々関係してそう。まぁ今回はそこは詰めないけど)

ということで、ここで力技の出番です。

#cp932の代わりにUTF-8として理解させる。
あえての完全無視。無理やりUTF-8として読む！
知らんコードページだとエラー吐くよりは、意味不明な文字列としてでも認識してくれた方が遥かにマシです。……というかぶっちゃけ、『半角英数でファイル名を管理するならどっちでも一緒』ですし。
追加したのは一行だけ（★のコメントをつけたところ）です。

		public static int DefaultCodePage {
			get {
                defaultCodePage = 65001;//★追加。一部のcpはAndroid等でエラー吐くので無理やりUTF8(cp65001)にして読ませる。
                return defaultCodePage;
			}
			set {
				if ((value < 0) || (value > 65535) ||
					(value == 1) || (value == 2) || (value == 3) || (value == 42)) {
					throw new ArgumentOutOfRangeException(nameof(value));
				}
				defaultCodePage = value;
			}
		}



Xamarinなら似たような状況でcp932自体をアプリに追加する手があるようなので手っ取り早いのですが……。Unityで同様にする手はどうも見当たらなかった。どなたか知ってれば教えてくださいな～。（windowsだけならUnityのフォルダの中からdll取って来て対応という手もあるのですが）
https://qiita.com/ShikaTech/items/7277af83f4fcb2f81192