OmniAICreator/Qiita-1.07M huggingface dataset:
誰でもディープラーニング？ Custom Vision Service - Object Detection 機能はスゴい

こんにちは、ドクです。

Azure Cognitive Services - [Custom Vison Service](https://customvision.ai/) の Object Detection 機能 (2018.07.12 時点で Preview) を使うと、従来、TensorFlow や CNTK などのディープラーニング ツールキットを使ってモデル構築をしないとできなかったことが、GUI だけで誰でもモデル構築を実現できるようになりました。 

もう使っていますか？
これ、ほんとこんなに簡単にしてしまって、、、ディープラーニングで商売している人達に影響出てしまうのではないかと思います。画像認識については、コモディティ化が一気に進んでいますね。

Classification (画像分類) では、様々なディープラーニング モデルにエクスポートできるようになっているので、Object Detection (物体認識) もエクスポートできるようになりそうですね。
モデルトレーニングが終わったら、Azure 関係なくなりますから、太っ腹です(笑)

この [Custom Vision Service - Object Detection 機能の利用方法と、API から返ってくる情報を画像にマップして可視化するサンプル WPF アプリケーション](https://github.com/seijim/CustomVisionWpfApp)を公開していますので、自由にご利用ください。
「EditorLineEnds.ttr を作成できません」の対処方法

Windows 7 (8.1でも発生する場合がある) 上で、RAD Studio/Delphi/C++Builder 2010 以前のバージョンを起動した際に発生する 
「"EditorLineEnds.ttr"を作成できません。プロセスはファイルにアクセスできません。別のプロセスが使用中です。｣
のエラーについての対処方法

- 最新のバージョンを使う（この記事を書いた時点の最新バージョンは 10.2 Tokyo）
- [IDEFixPack](https://www.idefixpack.de/blog/ide-tools/ide-fix-pack/) を適用する
- [dzEditorLineEndsFix](https://sourceforge.net/projects/dzeditorlineendsfix/) を使う
- 以下の起動スクリプトを作成して、製品を起動する (bds.exe の箇所のパスは実際の環境に修正してください)

```console
  del %temp%\EditorLineEnds*.ttr 
  set dt=%date%_%time:~3,2%-%time:~6,2%
  rename "%temp%\EditorLineEnds.ttr" "EditorLineEnds_%dt%.ttr"
  start "" "C:\Program Files\Borland\BDS\4.0\Bin\bds.exe"
```

##参考記事
http://support.embarcadero.com/article/44076
http://support.embarcadero.com/article/44023
http://support.embarcadero.com/article/44044
http://mrxray.on.coocan.jp/Delphi/Others/Windows7_Delphi7.htm#06
http://4river.a.la9.jp/gps/WinUpdate.htm
Pythonの配列アクセス速度比較

#背景
配列の要素に先頭から最後まで順番にアクセスしていく処理が必要になったが、配列が大きくなると、結構重い処理になる。少しでもアクセス速度を上げたい。
この記事の改良版→https://qiita.com/pegasusBS15/items/620985fdc21c75ad8026
#環境
- macOS High Sierra10.13.5
- Python3.6.4
- Jupyter notebook5.5.0

#方法
比較する配列の型は4種類
1. リスト
2. 辞書
3. タプル
4. Numpyのarray
各配列は一次元で0から999の数字を格納。
処理時間の計測はJupyter notebook上でマジックコマンド` %%timeit `を使用
複数回実行して、処理時間の平均・標準偏差を出してくれるので、処理時間にばらつきのあるプログラムの時に便利。

#コードと結果
###リスト型

```py
%%timeit
a=[i for i in range(10**3)]
b=0
for w in a:
    b+=w
```
81.3 µs ± 1.68 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

###辞書型 

```py
%%timeit
a=dict(zip([i for i in range(10**3)],[i for i in range(10**3)]))
b=0
for w in a:
    b+=w
```
164 µs ± 4.94 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

###タプル型 

```py
%%timeit
a=(i for i in range(10**3))
b=0
for w in a:
    b+=w
```
110 µs ± 5.48 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

###Numpyのarray型

```py
%%timeit
import numpy as np
a=np.array([i for i in range(10**3)])
b=0
for w in a:
    b+=w
```
194 µs ± 587 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

#結論
要素のアクセスに関してはリスト型が一番速い。漠然とNumpyが速いイメージだったので驚き。
※今回の例のような、要素の総和を求めるプログラムなら、本来は[numpy.sum](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html)で計算したほうが速い。
※そもそもリストの要素に何度もアクセスするようなコードを書かないほうが良い。
シリアル通信いろいろ

El Capitanに少しづつ移行するためにちょっと調べてみました。USBシリアルはMCP2221Aを使って確認しました。

MCP2221AはEl Capitanではシリアルポートとして認識されますが、雪豹では認識されませんでした。

# cu

```
$ sudo cu -s 115200  -l /dev/cu.usbmodem641 
```

unixに古くからあるコマンドです。雪豹くらいから属性ファイルを書き込むためにroot権限が必要になっています。

抜ける時：~ .

# screen

```
$ screen /dev/cu.usbmodem641 115200
```

FreeBSDではデフォルトでは入りませんが、Mac OS Xには入っているみたいです。

抜ける時：ctrl+a k

# jerm
オープンソースのツールです。ccでビルドする必要があります。昔cuのフロー制御で問題があって使うようになった記憶があります。サイトがなくなったので、ローカルエコーを追加してgithubに置きました。

https://github.com/yamori813/jerm

```
$ jerm -f none -b 115200 /dev/cu.usbmodem641
```

抜ける時：~ .

# minicom

たしか古くからあるオープンソースですが、おそらくオリジナルの開発者がやめてdebianが引き取ってるようです。試してません。

# CoolTerm

GUI版のオープンソースのフリーウエアです。

http://freeware.the-meiers.org

「開発元が未確認のため開けません。」で試していません。

たいていのシリアル通信のボーレートは9600、19200、38400、57600、115200のどれかです。

余談ですが、インターネットが普及する前のパソコン通信華やかし頃は、機能豊富なパソコン用のシリアル通信ソフトがたくさんありました。当時tipやcuしかないUNIX環境を恨めしく思ったのですが、逆にそれしか残っていないというのも、なんとも不思議なものです。

# Arduino IDE

シリアルモニタでシリアル通信できますが、El Capitanでは試していません。

# platformio

マイコンの開発環境なのですが、通信できます。

```
$ pio device monitor -b 115200
```

抜ける時：ctrl+c

# デバイスいろいろ

|メーカー|チップ|署名ありドライバ|電圧|
|:--|:--|:--|:--|
|Microchip|MCP2221A|○|5V|
|FTDI|FT232R,FT2232D|○|5V|
|FTDI|FT231,FT232H|○|3.3V|
|SiLabs|CP2102|○|3.3V|
|Prolific|PL2303HX|○|5V|
|WCH|CH341|○|5V,3.3V|

5Vのものもレギュレーターで3.3Vを作って流せば3.3Vで使えるものもあります。
Azure Cognitive Services - Computer Vision API (OCR) v2 を利用したサンプル WPF アプリケーション

こんにちは、ドクです。

GitHub に Azure Cognitive Services - Computer Vision API v2 の OCR 機能と Azure Cognitive Services - Text Analytics API v2 キーフレーズ自動抽出機能を利用した[サンプル WPF アプリケーション](https://github.com/seijim/ComputerVisionOCR)を公開しました。

Computer Vision API v2 の OCR 機能では、傾いたテキストの自動認識機能が加わっています。精度どうでしょうかね。

自由にご利用ください。
MSX PSG

z88dkのzccでMSX PSGを鳴らす。

```tone.c
/*
zcc +msx -lndos -create-app tone.c
bload"cas:",r
*/

#include <stdio.h>
#include <psg.h>

#define BOOL int
#define FALSE 0
#define TRUE 1

int snsmat(int line)
{
#asm
        ld      a, l
        call    $0141           ; SNSMAT
        ld      l, a
        ld      h, 0
#endasm
}

void main()
{
        BOOL press = FALSE;

        psg_init();
        sound(7, 076);  // ch.A tone enable

        puts("Press A key.\n");

        for (;;) {
                int bits = snsmat(2);
                if (bits & 0x40) {
                        if (press) {
                                sound(8, 0);
                                press = FALSE;
                        }
                } else {
                        if (! press) {
                                sound(0, 0xfe);
                                sound(1, 0);
                                sound(8, 12);
                                press = TRUE;
                        }
                }
        }
}
```

WebMSXのCassetteにa.casをドロップする。
DDT4ALLで自動車コーディング

この記事は、みんカラの整備手帳[DIYでDRLコーディング](https://minkara.carview.co.jp/userid/2829601/car/2436314/4871354/note.aspx)に関連したものです。
この記事を参考にされる場合は、こちらも参照してください。
この記事では、DDT4ALLの実行までを掲載します。

DDT4ALLとは、最強な外国人[cedricp](https://github.com/cedricp)さんが作ってくれた自動車互換診断ソフトです。
RENAULTと、一部の日産車、SMART453で使用できます。

**注意**
これ以降は自己責任で！
ECUに手を加えますので、不動車となり文鎮化しても責任は誰も取れません！！

Windows以外の環境の場合、ターミナルからインストール、実行を行います。
コンピュータの操作に慣れた方のみの作業をお勧めします。

#用意するもの
* PC (Win,Mac,Ubuntu)
 * 自分はMacで成功しました。Windowsではエラーが出て実行出来ませんでした。環境によるかも。因みにエラーはPythonの`Open()`で、UnicodeとShift-JISとのデコードエラーになりました。UTF-8で実行している筈なのですが、、、。解決出来る方、コメントお待ちします。

* ODB2アダプター (USBもしくはBluetoothのタイプで、elm327+ PIC18F25K80の組み合わせ)
 * [Amazon](https://www.amazon.co.jp/)や[eBay](https://www.ebay.com/)などで*elm327 25K80*と検索すると出てくると思います。GitHubでは中国製の模造品は不可となってます。が、一般的に模造品と言われるelm327のv1.5でも実行できました。ちなみに僕は中国サイトの[Aliexpless](https://ja.aliexpress.com/)で[USBタイプを購入しました](https://ja.aliexpress.com/item/ELM327-USB-V1-5-modified-for-Ford-ELMconfig-CH340-25K80-chip-HS-CAN-MS-CAN/32761065127.html)が、あまりお勧めはしません(笑)少し安いかも？USBだとドライバーのインストールが必要になります。互換性が低そうな場合はBluetoothの方がいいかもしれません。僕は動作未確認です。

* [DDT4ALL](https://github.com/cedricp/ddt4all)
 * GitHubで公開されているのでダウンロードします。Windowsの場合は[ここの](https://github.com/cedricp/ddt4all/releases)インストーラーでインストール出来ます。Unix系はターミナルから実行できます。

* DDT2000データベース　(2017年8月ver)
 * ルノーの正規診断機用のデータベースです。`./ecus`以下が必要になります。DDT4ALLではこのデータベースを流用します。インターネットで自力で探してください。17年8月verよりTWINGOⅢに対応したようです。

* Python2.7
* PyQt4.8 or 5.7
* 車

#環境構築
## ドライバーのインストール
今回Aliexplessから購入したアダプターはチップがCH340でしたので、対応したドライバーをインストールします。
###Windows(未確認)
[bbFly](http://www.bbflyobd.com/download.html)のサイトより、*VINT-TT55501 Driver Software*用のドライバーがCH340のものとなるのでダウンロードします。
rarを解凍して、exeを実行します。
###Mac
こちらの記事[Mac > CH341,CH340　のドライバ](https://qiita.com/sugasaki/items/f3258a8138c69d73069f)を参考にドライバーをインストールします。
Windowsでもこっちのほうがいいかも。
###Ubuntu
自力でお願いします。

##  DDT4ALLのインストール
###Windows
[ここ](https://github.com/cedricp/ddt4all/releases)でダウンロードしたインストーラーを実行すれば、デスクトップアイコンが作成されますので完了です。
インストール先のディレクトリ`C:\ProgramFile(x86)\ddt4all\`に、拾ってきた`ecus`をコピーしておきます。
###Mac
Macには標準でPython2.7がインストールされているので、残りのPyQtをインストールします。インストールは[Mac OS X で PyQt4 の開発環境を整える](https://blog.ymyzk.com/2014/11/mac-os-x-pyqt)を参考にしました。
GitHubからダウンロードしたファイルを解凍した中に、拾ってきた`ecus`をコピーします。
###Ubuntu
現存環境が無いのでGitHubを参考にされてください。`apt-get`でいけるみたいです。

#DDT4ALLの実行
Windowsでは、デスクトップのショートカットを開きます。
MacとUbuntuはターミナル・端末をダウンロードしたディレクトリ内で開き、

```shell
$ python ddt4all.py
```
で実行出来ます。

#お疲れ様でした。
無事に正しく実行する事が出来たでしょうか。
万が一エラーになると不動車のなる可能性がありますので十二分に注意して下さい。

デイライトコーディングについてはみんカラの方に書きたいと思います。
カッコいい車で楽しいカーライフを！

#参考
[DDT4ALL - GitHub](https://github.com/cedricp/ddt4all)
[2017 Smart 453 Fortwo Forfour coding/activating of features via DDT4ALL ‬- Youtube](https://youtu.be/mfVrV9vj8ZY)
[Coding of various features done with DDT4ALL!  Enjoy! - Smart 453 Forum](https://www.smart-453-forum.de/index.php?thread/2735-coding-of-various-features-done-with-ddt4all-enjoy/)
fastlaneのbundle exec pod installがRealmの部分でコケるときの対処法

## TL;DR

- fastlaneの`bundle exec pod install`が落ちる
- `sudo xcode-select -s /Applications/Xcode.app`を実行すれば治る
- Realm v2.10.1 + Xcode9に限ってこのエラーが発生する模様

## 環境

- macOSX v10.13.5 (High Sierra)
- Xcode 9.4.1

## エラーログ

```
...
[16:00:35]: $ bundle exec pod install
...
[16:00:36]: ▸ Installing Realm (2.10.1)
[16:01:01]: ▸ [!] /bin/bash -c
[16:01:01]: ▸ set -e
[16:01:01]: ▸ sh build.sh cocoapods-setup
[16:01:01]: ▸
[16:01:01]: Exit status of command 'bundle exec pod install' was 1 instead of 0.
Analyzing dependencies
Pre-downloading: `CocoaLumberjack` from `https://github.com/CocoaLumberjack/CocoaLumberjack.git`, commit `1e24be125f576a881790ac82124bb8c65d7dd018`
Pre-downloading: `IDMPhotoBrowser` from `https://github.com/ideaismobile/IDMPhotoBrowser`, commit `469246909043cdb71a9cc9d83b0dd4b86ad79c46`
Pre-downloading: `KLCPopup` from `https://github.com/jmascia/KLCPopup`, commit `ba17c211cbfa62761fddb58201f9381126ca1fe7`
Pre-downloading: `SDWebImage` from `https://github.com/rs/SDWebImage.git`, commit `740cd7f0902b5e9eddf4a52ff76ec630fdf753bc`
Pre-downloading: `evernote-cloud-sdk-ios` from `https://github.com/tamanyan/evernote-cloud-sdk-ios.git`, commit `bb06be1c41fda705c34fbc35d07db45b48c733b8`
Pre-downloading: `pop` from `https://github.com/facebook/pop.git`, commit `b1b1ca2c5da35548357fe1b3aa901d7e5094532f`
Downloading dependencies
Using AdobeMobileSDK (4.13.5)
Installing CocoaLumberjack (2.2.0)
Using DACircularProgress (2.3.1)
Using DZNEmptyDataSet (1.7.3)
Using GZIP (1.1.1)
Installing IDMPhotoBrowser (1.8.4)
Installing KLCPopup (1.1)
Using OHHTTPStubs (4.3.0)
Installing Realm (2.10.1)
[!] /bin/bash -c
set -e
sh build.sh cocoapods-setup
...
```

## 対処法

https://github.com/realm/realm-cocoa/issues/5337

このIssueが参考になりました。以下コマンドを実行すれば大丈夫です。

```
sudo xcode-select -s /Applications/Xcode.app
```
Consul のタグ書き換えでハマったお話

初投稿！

株式会社ミラティブでインフラエンジニアを担当している@Mirrativ_MasayaShimizuです。
はじめての投稿なもので、お見苦しい文があるかもしれませんがご了承ください。

今回はConsulでServiceTagsを設定した際に、API経由でのタグ書き換えに失敗してハマったお話をしたいと思います。

# 何にハマったの？
ConsulのAPI経由でServiceTagsの書き換えを行った際に、実行結果としてtrueが返ってくるのにも関わらず、
実際にはServiceTagsが書き換わらない謎現象に遭遇しました。

たとえば↓こんな感じで Service が定義されている場合・・・・

```json
$ curl -s http://127.0.0.1:8500/v1/catalog/service/db | jq .[0]
{
  "ModifyIndex": yyyyyy,
  "CreateIndex": zzzzzz,
  "ServiceEnableTagOverride": true,
  "ServicePort": 3306,
  "ServiceMeta": {},
  "ServiceAddress": "",
  "ServiceTags": [
    "master" <=現在はこれ！！
  ],
  "ID": "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Node": "test-node01",
  "Address": "10.0.0.5",
  "Datacenter": "dc01",
  "TaggedAddresses": {
    "wan": "10.0.0.5",
    "lan": "10.0.0.5"
  },
  "NodeMeta": {
    "consul-network-segment": ""
  },
  "ServiceID": "db",
  "ServiceName": "db"
}
```

下記リクエストを送ると、実行結果としてtrueが返ってくるのにも関わらず、ServiceTagsの書き換えに失敗します（汗

```json
$ curl -X PUT -d '{"Node":"test-node01", "Address":"10.0.0.5", "ServiceTags": ["slave"] }' http://127.0.0.1:8500/v1/catalog/register
true% <=成功してんじゃん

{
  "ModifyIndex": yyyyyy,
  "CreateIndex": zzzzzz,
  "ServiceEnableTagOverride": true,
  "ServicePort": 3306,
  "ServiceMeta": {},
  "ServiceAddress": "",
  "ServiceTags": [
    "master" <=あれ？書き換わってない・・・・
  ],
  "ID": "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Node": "test-node01",
  "Address": "10.0.0.5",
  "Datacenter": "dc01",
  "TaggedAddresses": {
    "wan": "10.0.0.5",
    "lan": "10.0.0.5"
  },
  "NodeMeta": {
    "consul-network-segment": ""
  },
  "ServiceID": "db",
  "ServiceName": "db"
}
```

# じゃあどうすりゃいいの？
下記のようにServiceの詳細を定義してリクエストを送ると成功します。

```json
$ curl -X PUT -d '{"Node":"test-node01", "Address":"10.0.0.5", "Service": {"ID":"db", "Service":"db", "Tags": ["slave"]} }' http://127.0.0.1:8500/v1/catalog/register
true%

$ curl -s http://127.0.0.1:8500/v1/catalog/service/db | jq .[0]
{
  "ModifyIndex": yyyyyy,
  "CreateIndex": zzzzzz,
  "ServiceEnableTagOverride": true,
  "ServicePort": 3306,
  "ServiceMeta": {},
  "ServiceAddress": "",
  "ServiceTags": [
    "slave" <=書き換わった！！
  ],
  "ID": "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "Node": "test-node01",
  "Address": "10.0.0.5",
  "Datacenter": "dc01",
  "TaggedAddresses": {
    "wan": "10.0.0.5",
    "lan": "10.0.0.5"
  },
  "NodeMeta": {
    "consul-network-segment": ""
  },
  "ServiceID": "db",
  "ServiceName": "db"
}
```

# 他にもハマった点
Serviceの定義に含まれる「ServiceEnableTagOverride」のデフォルトは「false」になっています。
この設定を「true」に変更しないと、Consul API経由でServiceTagsの書き換えを行った際に、
書き換え前のTagに戻されてしまうのでご注意ください。
IPアドレスの確認方法windows10

1.画面左下スタートボタンを右クリックし、一覧の中の「コントロールパネル」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/cd62a96f-0946-73a7-979a-ec46ee43df4d.png)
2.「コントロールパネル」が表示されますので「ネットワークの状態とタスクの表示」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/bbffc2a4-1782-dab4-4113-d4543ded4ec7.png)
3.「ネットワークと共有センター」画面が表示されます。「イーサネット」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/2a5333cd-0655-2873-ab8f-7b30316d46b3.png)
※無線接続の場合、「Wi-Fi（***********）」と表示されます。
4.「イーサネットの状態」画面が表示されます。「プロパティ」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/ea392910-6fcb-6512-a714-7d147b09fe44.png)
5.「イーサネットのプロパティ」画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/12f5f054-c145-d6d6-22ab-3f47cdc26c40.png)
「インターネットプロトコルバージョン4（TCP/IPv4）」を選択し「プロパティ」をクリックします。

※ 弊社サービスではIPv6に対応しておりません。
インターネットプロトコルバージョン6（TCP/IPv6）の左チェックボックスのチェックを外す設定に
されることをお勧めいたします。
6.「インターネットプロトコルバージョン4（TCP/IPv4）」のプロパティ」画面が表示されますので
以下のように設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/aa6de58f-89d1-8a6e-05f6-35266ec919a0.png)
■「IPアドレスを自動的に取得する」を選択してください。

■「DNSサーバーのアドレスを自動的に取得する」を選択してください。
選択ができましたら、「詳細設定」ボタンをクリックしてください。
7.「TCP/IP詳細設定」画面が開きます。「IP設定」タブでは以下のようになっているか確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/f7f6849d-14fa-7e16-e1da-489db56e189e.png)
8.「DNS」タブをクリックし、以下のようになっているか確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/11d64204-4336-1251-1ea2-6c5997576c23.png)
9.「WINS」タブをクリックし、以下のようになっているか確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/92bfb8e0-cd43-5d99-836b-4e1d8291d49b.png)
以上で設定は完了ですので、「OK」ボタンをクリックしてください。
Android EmulatorがAMD製CPUのサポートを開始したらしい

###0.始めに……
---
ついこの間、先生から教えてもらうまで知らなかったんですけど
android studioの機能であるエミュレーターを、AMD製のCPU（Ryzen）で動かすことが可能になったそうです！
ということで、色々と書きたいと思いますー。
###1.そもそも、AMDって何者？？？
---
正式名称：アドバンスト・マイクロ・デバイセズ（略称：AMD）
アメリカに本社を置く、PCパーツ（CPU、GPC）などの生産を行っている会社
日本の東京にも会社を置いているらしい

自作PCとか組んでる人は、知ってる人は多いんじゃないでしょうかね（Ryzenとか有名じゃん？）
###2.AMD製CPUでエミュレーターを動かすには…
---
エミュレーターを起動するには条件があるらしく、Windowsの設定を一部変えないといけないらしいです

セットアップ要件
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
・AMDのプロセッサー-推奨：AMD Ryzen のプロセッサー
・Android Studio 3.2 Beta以上 - [Android Studioのプレビューページ](https://developer.android.com/studio/preview/)からダウンロード
・Android Emulator v27.3.8 + - [Android Studio SDKマネージャ]
(https://developer.android.com/studio/intro/update#sdk-manager)からダウンロード
・x86 Android仮想デバイス（AVD） - [AVDを作成する](https://developer.android.com/studio/run/managing-avds#createavd)
・2018年4月のWindows 10アップデート
　時々、アップデートが来てるので確認しておきましょう。
・Windowsからの有効化機能：「Windows Hypervisor Platform」
　有効化した後は、再起動必須！！！

家では、Ryzen搭載のPCを使っているのでビルドしたらエミュレーターはつきましたね、はい
###最後に…
---
Ryzen搭載PCで開発したい人には朗報ですな～～～～
そういや、Ryzen Threadripper（通称：スリッパ）の第二世代が32コア・64スレッドって
すげぇーやばそうな性能してるなー（めっちゃ高そう…………絶対高いやろ！！！！）
Djnago2系　adminでDBの内容を更新した後になにか処理を行いたい

# やりたいこと
Djangoのデフォルトでついている管理画面上で、DBにデータを登録するフォームからデータをDBに登録後、
なんかしらの処理をしたい。


# 結論

```python
# Adminのモデル
from django.contrib import admin

# 管理画面上に表示したいDBフォーム
from myapp.models import ExampleModelなどのクラス名, クラス名, クラス名, ……

# DBに登録をAdminフォーム上から行った際に、処理を走らせるためのもの
from django.db.models.signals import post_save
from django.dispatch import receiver

# 登録処理後のタスク
@receiver(post_save, sender=ExampleModelなどのDBのクラス名)
def my_handler(sender, instance, **kwargs):
    # 引数の「instance」に、DBに書き込んだ内容が入っている
    # 行いたい処理
    print('とりあえずコンソールに文字表示')
```


# 参考
https://docs.djangoproject.com/en/2.0/ref/signals/#post-save
styled-componentsの「Cannot find namespace 'NodeJS'.」

Reactでスタイリングを行う時はstyled-componentsを使う人が増えてきた印象があります。
styled-componentsをTypeScriptで動かそうとすると、Node.jsのtypeがないと言われてしまいました。

# 発生環境
- styled-components : v3.3.3
- TypeScript : v2.9.2
- React : 16.4.0

## エラーメッセージ
```console

ERROR in [at-loader] ./node_modules/styled-components/typings/styled-components.d.ts:117:44
    TS2503: Cannot find namespace 'NodeJS'.
```

# 解決策
いくつか解決する方法があるみたいです。

## 解決策①
### @types/nodeをインストール
```
npm install --save-dev @types/node
```

or

```
yarn add -D @type/node
```

### tsconfig.jsonにtypeRootsを記述
```json

{
  "compilerOptions": {
    "typeRoots": [
      "node_modules/@types"
    ]
  }
}
```

## 解決策②

### @types/nodeをインストール
省略

#### tsconfig.jsonにtypesを記述

```json

{
  "compilerOptions": {
    "types": ["node"]
  }
}
```


これが`Cannot find namespace 'NodeJS'`を解決するセオリーみたいです。
ただ、これでも筆者はエラーを解決することができませんでした。

## 解決策③
### styled-componentsのバージョンを固定する
```
yarn remove styled-components
yarn add styled-components@3.1.6
```

これでNodeJSのエラーは解決しましたが

```console

ERROR in [at-loader] ./node_modules/styled-components/typings/styled-components.d.ts:75:48
    TS2344: Type 'keyof T' does not satisfy the constraint 'string'.
  Type 'string | number | symbol' is not assignable to type 'string'.
    Type 'number' is not assignable to type 'string'.
```

という別のエラーがでてきてしまいました。。。
styled-components@3.3.3ではこのエラーは発生しなくなっています。

## 解決策④
### 'NodeJS'をdeclearする
最終手段です。
node_modules/styled-components/typings/styled-components.d.tsを直接編集します。

```typescript

declare namespace NodeJS {
  export interface ReadableStream {

  }
}
```

これを適当な箇所に入れることでエラーがでなくなりました。

styled-componentsとTypeScriptの相性はあまり良くなさそうに感じる・・・。
Cの練習(九九表)

##C言語で九九表を表示する
今回はC言語を使って九九表を表示するプログラムを制作しました
##ソースコード
<div class="code-frame" data-lang="text"><div class="highlight">
<pre>
#include <stdio.h>

int main(void){


int x, y;
for(y = 1; y <= 9; y++) {
for(x = 1; x <= 9; x++) {
printf("%3d", x * y);
}
printf("\n");
}
  getchar();
  return 0;
}
</pre></div></div>
##結果![C九九.PNG](https://qiita-image-store.s3.amazonaws.com/0/249276/0c998ca5-d435-4572-6ca7-6f19e722180e.png)
##まとめ
1年数か月以来にC言語を使ってみるとコードの書き方をすっかり忘れてしまっていました。
プログラマには復習が必要だと思いました。
それとは別にデバッグ開始を押してコマンドプロンプトを表示すると結果が表示された瞬間にコマンドプロンプトが消えてしまったのでデバッグなしで開始を選んで結果の表示をしていました。
ネットで調べて出てきたreturn 0;の前にgetchar();を入れると問題は解消されました。
ionicプロジェクトでnodeの環境変数を使ってビルド環境を切り替えるのにちょっと面倒だった話

こちらは[あら便利カレンダー2018](https://benri2018.rnd.cloudpack.jp/)の記事です。

Webのフロントエンド開発においてwebpackを使ってビルドする場合、`NODE_ENV=development npm run build`や`NODE_ENV=production npm run build`といった具合にnodeの環境変数を使ってビルド内容を切り替えることはよくあると思います。

ionicもwebpackをベースにビルドが実行されているため、同じようにできると思っていたら出来ず。。
ちょっと面倒なことをしなければならなかったので、記事にまとめました。

## ionic関連のバージョンはこんな感じ

```
"ionic": "3.20.0",
"ionic-angular": "3.9.2",
"@ionic/app-scripts": "3.1.8",
```

## Ionic公式に書いてあるやつ
IONIC_ENVなるものが定義されていてそれを参照することでビルド時に切り替えが出来るよ！って書いてあるのですが、、、
https://ionicframework.com/docs/developer-resources/app-scripts/

```
if (process.env.IONIC_ENV === 'prod') {
  console.log('we got a production buildp');
} else {
  console.log('we got a development build');
}
```

## webpack.config.js内でしか参照できない！！
さきほどのIONIC_ENVはwebpackのconfigファイル内でしか参照できないです。
JSのソース内でIONIC_ENVを参照しても `undefined`　が返ってくるだけです。

## ionicプロジェクトでnodeの環境変数を使ってビルド環境を切り替える方法

1. ionicのビルド時に参照するwebpack configを作成して指定する (指定がない場合は@ionic/app-scriptsモジュール内にあるwebpack.config.jsが参照されています)
2. webpackに内包されているDefinePluginを使ってIONIC_ENVをJSソース内から参照できるよう定義しなおす
3. npm run buildとかでコマンド実行する

これだけです。

### webpack.config.jsを用意する
任意の場所にwebpack.config.jsを用意します。今回はプロジェクトのルートに置いています。
内容は以下のようになっています。

```js:webpack.config.js
const webpack = require('webpack');
// デフォルトで使われているwebpack configを取得
const ionicConfig = require('@ionic/app-scripts/config/webpack.config');

// nodeの環境変数をDefinePluginによって再定義
const definePlugin = new webpack.DefinePlugin({
  IONIC_ENV: JSON.stringify(process.env.IONIC_ENV)
});

// デフォルトのwebpack configにマージ
ionicConfig[ process.env.IONIC_ENV ].plugins.push(definePlugin);
module.exports = ionicConfig;
```

### ionicビルド時に参照するwebpack configを指定する
package.jsonに以下を追記します。

```json:package.json
{
  "dependencies": {
↓↓↓↓↓追加
  "config": {
    "ionic_webpack": "./webpack.config.js"
  }
}
```

### 実際にJSソース内から参照
JSのソース内から以下のように参照できます

```js:config.js
    declare const IONIC_ENV: any;

    endpoint: {
      prod: 'https://prod.example.com',
      dev: 'https://dev.example.com'
    }[IONIC_ENV || 'dev']
```

TypeScriptの型定義が必要なため `declare const IONIC_ENV: any;` でやってますが、ここをもうちょっとスマートにしたいなーとおもってます。
が、とにかくこれで参照できるようになりました。

## IONIC_ENV補足
IONIC_ENVは以下ionicコマンドによって値が切り替わります

* `ionic build`、`ionic serve`を実行すると `dev`
* `ionic build --prod` を実行すると `prod`

ちなみにcordovaのビルド環境切り替えも他の方法で出来るようですが、さらにややこしそうでやってません。。
Ionic公式フォーラムなどでもビルド環境切り替えをもっとシンプルに切り替えられる方法がほしいという内容の投稿が以前からあがっているので、今後のアップデートで変わる可能性はありますが現状ではこの方法が1番最短かと思います。
第20話 ゲルフォントの定数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第20話です。

```math
e^π-π≈20
```

この式はおおよそ20、という式です。厳密に計算するとこんな感じです。

```math
e^π-π=19.9990999792…
```

Wikipediaに”[ほとんど整数](https://ja.wikipedia.org/wiki/%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E6%95%B4%E6%95%B0)”という項目があります。
一見整数に見えないのに、計算してみると整数に近い、という式が載っています。

e^πはゲルフォントの定数と呼ばれます。
オイラーの式を変形することで、-1^(-i)という数になります。

```math
e^{iπ}=-1
```

両辺を-i乗します。

```math
e^{i\pi \cdot -i}=e^π=(-1)^{-i}
```

今回の式は、特にほとんど整数になる理由が見つかって無いようで、偶然という見解のようです。
ただ、$e^{\pi\sqrt{1}}$と考えると、偶然とはいえ、出来すぎているかもしれません…。
(この式は第43話で説明します。)

ところで、e$^π$は、$π^e$と近い数で、1未満しか離れていません。
どっちが大きいかわかりますか？

<details><summary>e$^π$と$π^e$はどちらが大きいかの解説</summary><div>
グーグル先生に聞けば一発です。

```math
e^\pi=23.1406926\cdots\\
\pi^e=22.4591577\cdots
```

ということなので、大きいのは、$e^π$なのですが、計算機無しで計算するのは難しいでしょう。
そこで、式を次のように変形します。

```math
e^{\pi}=e^{e\cdot\frac{1}{e}\cdot\pi} = e^{\frac{1}{e}\cdot e\pi}\\
\pi^{e}=\pi^{\pi\cdot\frac{1}{\pi}\cdot e} = \pi^{\frac{1}{\pi}\cdot e\pi}\\
```

つまり、$e^{1/e}$ と $π^{1/π}$、どっちが大きいか、という問題に変換できます。
そして、次の関数のグラフを考えてみます。

```math
f(x)= x^{\frac{1}{x}}
```

これの極大値、極小値を求めたいのですが、この関数を微分するのはかなり辛いです。
そこで、次の公式を使い、別の関数を調べてみましょう。

```math
a<b ならば、\log{a}<\log{b}\\

g(x)=\log{x^{\frac{1}{x}}}=\frac{1}{x}\log{x}
```
これを微分するのは、先程の関数よりかなり楽です。

```math
g'(x)=(-\frac{1}{x^2})\log{x}+\frac{1}{x}(\frac{1}{x})=\frac{1-\log{x}}{x^2}
```

では、g'(x)=0を計算しましょう。
ちなみに、x>0 とします。

```math
\begin{align}
\frac{1-\log{x}}{x^2}=0\\
1-\log{x}=0\\
\log{x}=1\\
x=e
\end{align}
```

あとは、表にまとめます。

| x | 0| ... | e | ... |
|:-:|:-:|:-:|:-:|:-:|
| g'(x)  | |  正  | 0 | 負 |
| f(x)  | |  ／  | e^(1/e)  | ＼  |

つまり、eのときに極大値を取ります。
ということは、以下のことがわかります。

```math
e^\pi>\pi^e
```

ちなみに、グラフはこんな感じになります。
わかりにくいですが、eを極大値としてほんの少しずつ下がっていきます。
![x_invx.png](https://qiita-image-store.s3.amazonaws.com/0/985/5ceac07e-bd25-84b7-6e50-74e531a3bc5e.png)

</div></details>
axios Interceptorsを使用して共通処理を作る。

## はじめに
この投稿は[Nuxt.js + Auth0 + Spring Boot で作る認証付きSPA](https://qiita.com/mijinco0612/items/00d8a1a9dbf7eb8b9de8)のおまけです。
リポジトリは以下
[フロント](https://github.com/mijinco0612-self-improvement/Nuxt-auth0)
[サーバサイド](https://github.com/mijinco0612-self-improvement/spring-auth0)
## 概要
axiosを使用して非同期通信を行う際
リクエスト時やエラー時などで共通処理を挟み込みたいことがあると思います。
今回は

- リクエスト時にAuthorizationヘッダーを付与すること
- エラー発生時にエラーの内容をトーストで表示すること

この二点をaxios Interceptorsを使用して実現したいと思います。

## エラー表示に使用するToastを設定する

### 先ずはトーストの準備をしましょう。 yarnでdependenciesに追加します。

```bash
yarn add @nuxtjs/toast
```

### nuxt.config.js　に設定を追加します。

```javascript:nuxt.config.js
 modules: [
    '@nuxtjs/axios',
    '@nuxtjs/proxy',
    '@nuxtjs/toast'   //追加
  ],
  toast: {
    position: 'top-center',  //トーストの表示位置
    duration: 2000           //トーストの表示されている時間（今回は2秒に設定）
  }
```

## axios Interceptorsの設定

### puluginsに追記します。

```javascript:nuxt.config.js
   plugins: [
    '~/plugins/auth0.js',
    '~/plugins/axios.js'  //追加
  ],
```

### plugins/axios.jsを作成します。

```javascript:axios.js

import Vue from 'vue'

export default function ({$axios}) {
  $axios.onRequest(config => {
    console.log('Making request to ' + config.url)
    config.headers.common['Authorization'] = 'Bearer ' + localStorage.getItem('idToken'); // リクエスト時にAuthorization　ヘッダを設定、設定値はlocalStorageのidTokenの値を使用する。
  })

  $axios.onError(error => {
    Vue.toasted.error(error)　//　エラー時はエラー内容をそのままトースト表示
  })
}
```

## 動作確認

### トーストの確認
![エラー時.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/82787/39b25b30-41ef-810b-a6c0-433fc669897f.gif)

認証前に認証が必要なリクエストを送信すると401エラーが返ってきています。
その内容がトーストで表示されていますね。

### Authorizationヘッダの確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82787/55dfd114-49ed-72f8-f4c5-555616788aff.png)

認証後に認証が必要なエンドポイント(/api/v1/private)にリクエストを送信しています。
200が返ってきていてAuthorizationヘッダが付与されていることがわかります。

想定通りの挙動になりました！成功です！

## 参考
https://legacy.gitbook.com/book/nuxt-community/axios/details
フォルダを作成　C#

```csharp

using System;
using System.IO;

namespace kadai
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"E:\Sample";

            Directory.CreateDirectory(path);

            Console.WriteLine("フォルダを作成しました");
            Console.ReadKey();
        }
    }
}
```


```
フォルダーを作成しました
```
Nodebrewとavnを使ってNode.jsのバージョン切り替えを自動化する

環境
OS : macOS High Sierra v10.13.5
Nodebrew導入済み

## avnとは
.node-versionファイルがあるディレクトリに移動すると、
自動的にNode.jsのバージョンを変えてくれるnpmパッケージ

## 設定手順
グローバルにavnとavn-nodebrewをインストールする
`npm install -g avn avn-nodebrew`

セットアップを実行する
`avn setup`

プロジェクトのルートディレクトリに.node-versionファイルを作成する
※任意のバージョンを書き込むこと
`echo v10.0.0 > .node-version`

## 設定の確認
.node-versionファイルを配置したディレクトリにterminalより移動する
以下のようなテキストが出力されていれば設定完了
`avn activated v8.7.0 (avn-nodebrew v8.7.0)`

## 補足
例えば、VSCodeのterminalでアクセスしてもavnが実行されるので、
設定次第ではワークスペースを開くだけでもバージョンが切り替わって便利です。
unsliderを触ってみたよ。

色々なサイトで画像がスライドする場所があって、実装方法が気になったので、調べました。

とりあえずこれ書けば動くレベルのソース、各パラメータの説明を載せておきます。オプションが豊富すぎるので、公式を元に色々弄るのが正道かな。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script type="text/javascript" src="jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="unslider.min.js"></script>
    <script type="text/javascript">
    $(function() {
    $('.banner').unslider({
      autoplay: false,          //自動的に画像がスライドするかどうか
      speed: 500,               // スライドの速さ
      delay: 3000,              // スライドの間隔
      arrows: {
            prev: '<a class="unslider-arrow prev">&#10094;</a>',
            next: '<a class="unslider-arrow next">&#10095;</a>'
        },  // 手動で移動させるアイコンの設定。falseで消える。こんな感じに上書きして設定することも可能。
      keys: true,               // キーボード操作の有無
      index: 'first',           // lastにすると、画面時にfirstからlastまで右スライド移動する
      nav: true,               // スライダーする画像の下のボタンの有無
      animateHeight: false,    // スライダーの高さの調整。falseは、高さが一番高い画像に合わせる。true時は、画像ごとにスライダーの高さを合わせる
      infinite: true          // スライダーが端の時に、次にどこに行くか(trueなら最初⇄最後)
    })
  });
    </script>
<link rel="stylesheet" href="unslider.css">
<style>
.banner {
  width: 600px;
  text-align: center;
  margin: 0 auto;
}
.banner { position: relative; overflow: auto; }
.banner ul { list-style: none; }
.unslider-arrow {
    position:absolute;
    top: 45%;
    z-index:2;
    width: 40px;
    height: 40px;
    line-height: 40px;
    font-size: 24px;
    color: #f9f9f9;
    text-align: center;
    border-radius: 50%;
    background-color: #333;
    cursor:pointer;
}
.unslider-arrow.prev { left:20px }
.unslider-arrow.next { right:20px }
</style>
  </head>
  <body bgcolor="green">
    <div class="banner">
      <ul>
        <li><img src="./img/sample01.png" width="500" height="400" alt=""></li>
        <li><img src="./img/sample02.png" width="500" height="400" alt=""></li>
        <li><img src="./img/sample03.jpeg" width="500" height="400" alt=""></li>
      </ul>
    </div>
  </body>
</html>
```

で、今回作成したものはこちら。
![unslider.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/231963/784d83f0-ac2a-e788-2a8c-4ca29b056129.gif)
Sublime Text3でEmmetのベンダープレフィックスが自動挿入されるのを無効にする

「Sublime text」 →　「Preferences」 →　「Package Settings」 →　「Emmet」 →　「Setteings-User」で以下を貼り付ければOK

```Emmet.sublime-settings
{
    "preferences": {
        "scss.autoInsertVendorPrefixes": false,
        "css.autoInsertVendorPrefixes": false
    },
}
```

他の記事では以下のようにすると書かれていたが、自分の場合はそれだとショートコードがおかしくなってしまった。

```Emmet.sublime-settings
{
    "preferences": {
        "scss.autoInsertVendorPrefixes": false,
        "autoInsertCssPrefixedEnabled": false
    },
}
```
文字列を連結するプログラムC#

文字列を連結

```csharp

using System;

namespace kadai
{
    class Program
    {
        static void Main(string[] args)
        {
            string a = "こんにちわ。";
            string b = "さようなら。";

            string c = a + b;

            Console.WriteLine(c);
        }
    }
}

```
実行結果
```こんにちわ。さようなら。
```
共通式って使ってる？？


# 共通式とは

サブクエリを定義し、あたかもテーブルかの様に仕様できる記述方法
__※以下のクエリ及び解説は全てSqlServerを想定して記述しています__

```sql
-- 注意事項：
-- 共通式の宣言の前に処理がある場合、必ず";"で区切られていること
-- ";"抜きだとエラー

-- 共通式の宣言 WITH 任意の共通式名 AS
WITH CTE_1 AS
(
    -- サブクエリの内容を記述
    SELECT ID FROM T_HOGE(NOLOCK)
    WHERE ID = 1
)
-- ","区切りで複数定義可能
, CTE_2 AS
(
    SELECT ID FROM T_HOGEHOGE(NOLOCK)
    WHERE ID = 2
)
SELECT * FROM T_HUGA (NOLOCK) AS HUGA
LEFT JOIN CTE_1 (NOLOCK) AS CTE
ON 
    HUGA.ID = CTE_1.ID
LEFT JOIN CTE_2 (NOLOCK) AS CTE
ON
    HUGA.ID = CTE_2.ID
```

## 一時テーブルとの違い

- 宣言直後のクエリでのみ参照可能
    - @テーブルの場合：宣言後、一連のクエリの処理が完了するまで参照可能
    - #テーブルの場合：宣言後、明示的にテーブルを削除するか、クエリセッションが切れるまで参照可能
- あくまでサブクエリの外だしなので、メモリ上で処理
    - @テーブルの場合、同じくメモリ上で処理
        - 注意事項：メモリで処理しきれない場合、実ファイルへの書き込みが発生
    - #テーブルの場合、実ファイルへ書き込み、実ファイル上から処理
- インデックスは付けられない（サブクエリなので）
    - @#テーブルの場合、インデックスを作成可能

## 上記の特徴から見た使えるケース

以下のケースで有効

- 一回限りの使用
    - 同クエリの内部で何度も使用するのであれば、一時テーブルした方が良い
- 使用する件数が少ないこと
    - 処理できる件数を制限する工夫が必要
- サブクエリが乱立して見にくい場合
    - 共通式として外出しする
    - 一時テーブルにするほどじゃない場合は有効

# 応用編

## 再帰処理

共通式は __自己参照ができる!!__</BR>
以下のクエリは、自己参照を行い、条件に合致するまで結合を繰り返す

```sql
-- 共通式(CTE)
-- 基本：サブクエリの外出し
-- 応用：下記のような再帰的処理(自己参照)

-- 今日から30日前までの日付を取得するクエリ
WITH DAYS AS 
(
  SELECT 
      CURRENT_TIMESTAMP AS YMD
  UNION ALL
  SELECT 
      DATEADD(Y, -1, YMD)
  FROM DAYS -- ここが再帰的(自己を参照している)
  WHERE 
      DAYS.YMD >= DATEADD(y, -30, CURRENT_TIMESTAMP)
      -- 30日前まで遡って自己結合を繰り返す 
)
SELECT * FROM DAYS

```
[メモ]PHP

※自分用のメモです。

####explode
(PHP 4, PHP 5, PHP 7)
文字列を文字列により分割する

```php
array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] )
// string の内容を delimiter で分割した文字列の配列を返します。
```

####implode
(PHP 4, PHP 5, PHP 7)
配列要素を文字列により連結する

```php
string implode ( string $glue , array $pieces )
// すべての配列要素の順序を変えずに、各要素間に glue 文字列をはさんで 1 つの文字列にして返します。 
```

####join
(PHP 4, PHP 5, PHP 7)
implode() のエイリアス

####strpos
(PHP 4, PHP 5, PHP 7)
文字列内の部分文字列が最初に現れる場所を見つける

```php
int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
// needle が見つかった位置を、 haystack 文字列の先頭 (offset の値とは無関係) からの相対位置で返します。 文字列の開始位置は 0。
// needle が見つからない場合は FALSE を返します。
```


####array_pop
(PHP 4, PHP 5, PHP 7)
配列の末尾から要素を取り除く

```php
mixed array_pop ( array &$array )
// 配列 array の最後の値を取り出して返します。 array が空 (または、配列でない) の場合、 NULL が返されます。
``` 


####strlen
(PHP 4, PHP 5, PHP 7)
文字列の長さを得る

```php
int strlen ( string $string )
// 成功した場合に string の長さ、 string が空の文字列だった場合に 0 を返します。 
```
OpenTextFileメソッドやOpenステートメントでのファイル操作や文字置き換えなど

業務でVBAを使う事がありまして、取り合えず動いたので自分のメモ用にこれを残します。
もっとこうした方が良いとかありましたらコメント頂けると助かります。

##Openステートメントでのファイル作成

```vb
Dim ii As Long
Dim bag As String
Dim bag2 As String
Dim f_path As String
Dim f_num As Integer

Set ii = 3
Set f_path = ActiveWorkbook.Path & "\SUM" & "\A_102.csv"
Set f_num = FreeFile

Open f_path For Output As f_num
    Do While Cells(ii, 16).Value <> ""
        If Cells(ii, 16).Value = "稼働中" And Cells(ii, 17).Value = "A" Then
             bag = Cells(ii, 17).Value
             bag2 = Cells(ii, 32).Value
             Print #f_num, bag & "." & bag2
        ElseIf Cells(ii, 16).Value = "待機中" And Cells(ii, 17).Value = "B" Then
             bag = Cells(ii, 17).Value
             bag2 = Cells(ii, 32).Value
             Print #f_num, bag & "." & bag2
        End If
    ii = ii + 1
    Loop
Close f_num
```


##OpenTextFileメソッドでの既存ファイルの読み込みとソート

```vb

Dim FSO As Object
Dim List As Object
Dim Fin As TextStream
Dim Fout As TextStream

Set FSO = CreateObject("Scripting.FileSystemObject")
Set List = CreateObject("System.Collections.ArrayList")
Set Fin = FSO.OpenTextFile(Filename:=f_path)
Do Until Fin.AtEndOfLine
  List.Add (Fin.ReadLine)
Loop
Fin.Close

List.Sort

f_path2 = ActiveWorkbook.Path & "\SUM_SORT" & "A_102"
Set Fout = FSO.CreateTextFile(Filename:=f_path2)
For Each Value In List
  Debug.Print Value
  Fout.WriteLine Value
Next
Fout.Close
```

##全体のセルを読み込んで、特定の文字を置き換える

```vb
Dim f_path As String
Dim buf As String

Set f_path = ActiveWorkbook.Path & "\SUM" & "\A_102.csv"

With FSO.GetFile(f_path).OpenAsTextStream
Set buf = .ReadAll
.Close
End With

FSO.GetFile(f_path).Delete
FSO.CreateTextFile f_path

buf = Replace(buf, "ABC", "A_B_C_D")
buf = Replace(buf, "XYZ", "X_Y_Z")

With FSO.GetFile(f_path).OpenAsTextStream(8)
.Write buf
.Close
End With
```

##セル内の改行文字の検知と、改行前の文字列取得

一つのセルに2行入ってる様なデータに対し
改行コードより前の、1行目のデータを取得する。

```vb
Dim bag3 As String
Dim bag4 As String

Set bag3 = Cells(ii, 17).Value

If InStr(bag3, vbLf) > 0 Then
Debug.Print "LFあり"
pos = InStr(1, bag3, vbLf)
bag4 = Left(bag3, pos - 1)

End If
```
1 on 1をやるにあたり聞く事（メモ）

https://jasonevanish.com/2014/05/29/101-questions-to-ask-in-1-on-1s/

素晴らしいと思ったのでメモ

下記のような事が記載されている。

-
短期目標についての質問
短期目標は、現在の四半期または月に行われることです。彼らはその人に割り当てられたハイレベルなプロジェクトです。

1）[プロジェクト]はどうですか？私たちはそれをより良くするために何ができますか？
2）あなたの仕事を邪魔することを妨げるものはありますか？
3）あなたがチャンスを与えられた場合、あなたが本当に働きたいプロジェクトがありますか？
4）あなたのスキルを深める、または追加のトレーニングを受けるために、あなたの仕事のどの部分をしたいですか？
5）プロジェクトのどの部分が不明瞭か混乱していますか？

これらはすべてあなたの日常生活を改善し、プロジェクトの不満を和らげるためのフィードバックを得ることです。立ち上がり、ステータスレポートなどの日常業務に多くの時間を費やしています。これは意図的に、他の分野と比較して短期間で質問しています。

長期目標についての質問
長期的な目標は、誰が彼らになりたいかということです。誰もがさまざまな方法で成長しており、人生の大きな目標を達成しているように感じると、人々は最も幸せです。これらの質問は、それらの目標が何であるかを学び、彼らが進歩していると感じるかどうかを知るのに役立ちます。

6）5年間で何をしたいですか？10年？3年？
7）あなたの長期目標は何ですか？あなたはそれらについて考えましたか？
8）ここで大きな目標を達成しているように感じていますか？なぜ、なぜそうではないのですか？
9）あなたの長期的な目標を支援するために今日できることは何ですか？
10）あなたが望むペースでキャリアを進歩させるのに役立っていると思いますか？
11）誰が本当に賞賛しますか？どうして？（人々はしばしば彼らが欲しい人に賞賛し
ます） 12）何百万ドルがあれば、毎日何をしますか？
13）あなたの超能力は何ですか？どんな力を育てたいですか？
14）人生の大きな夢は何ですか？あなたはそれらについて進歩していますか？
15）ここで目標をもっと進歩させることができますか？そうするためには何を変える必要がありますか？
16）ここで何をしていて、あなたの長期的な目標に最も近いと感じているのですか？
17）子供として、あなたは育ったときに何をしたいですか？

これらの質問は、あなたの人々が最も重要な分野で進んでいることを確認するのに役立ちます。時間の経過とともに変化することを理解し、人々が自分の夢について本当に開くために時間がかかるので、定期的に再訪することが役立ちます。
Angular + VSCode でデバッグ開始したときに ng serve する

Angular + VSCode でのWebアプリ開発、普通は

1. ``ng serve`` する
2. (launch.json で) Chrome 起動して ``http://localhost:4200/`` を開く

としますが、 ``ng serve`` を忘れたりシェルのウィンドウどこいった？ってなったりして面倒なので VSCode の「デバッグ開始(F5)」 一発で ``ng serve`` -> Chrome 起動する方法を考えてみました。

**.vscode/tasks.json**

```json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "ng-serve",
            "type": "shell",
            "isBackground": true,
            "command": "ng serve",
            "problemMatcher": {
                "owner": "custom",
                "pattern": {
                    "regexp": "^$"
                },
                "background": {
                    "activeOnStart": true,
                    "beginsPattern": "^.*Angular Live Development Server.*$",
                    "endsPattern": "^.*Compiled successfully.*$"
                }
            }
        },
        {
            "label": "ng-kill",
            "type": "shell",
            "command": "killall ng"
        }
    ]
}
```

``ng-serve`` と ``ng-kill`` という2つのタスクを定義します。

``ng-serve`` は ``ng serve`` を実行するものですが、フォアグラウンドで実行すると、listen状態で待ち続ける（＝次の処理であるChrome起動が行われない）になるので、``"isBackground": true`` にします。すると今度は「タスクの終了」を示すものがなくなってしまうので、``"problemMatcher": { }`` 内の ``"endsPattern": "^.*Compiled successfully.*$"`` として、 「``ng serve`` が正常に実施されてこのメッセージが出力されたらタスク終了とみなす」という定義をします。

``ng-kill`` は、 ``killall ng`` として ng という名前のプロセスを kill しているだけです。VSCode の機能で「任意のタスクを終了させるタスク」を作る方法がわからなかったのでこうなりました:sweat: (macOS では動いたけど Windows では動きそうにないな…)


**.vscode/launch.json**

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "chrome",
            "request": "launch",
            "name": "Debug with Chrome",
            "url": "http://localhost:4200",
            "webRoot": "${workspaceFolder}",
            "preLaunchTask": "ng-serve",
            "postDebugTask": "ng-kill"
        }
    ]
}
```

こちらは通常の「Chromeを起動させる」 launch.json に ``preLaunchTask`` と ``postDebugTask`` を追加しただけです。

これで デバッグ開始(F5) をすると、``ng serve`` が実行されて、待受開始になったら Chrome が起動します。
また、デバッグを停止させると ``killall ng`` が実行されて ``ng serve`` も停止します。

作ってはみたものの、実行の度に ``ng serve`` されるのはそれなりに時間がかかって嫌だし、これは常駐させておくものだからデバッグ終了で止めない方がいいかもなーと思います。

GitHub の VSCode プロジェクトでは「一度作ったタスクを使い回す」設定のPRが立っていて、これが加わると便利になりそうだなと思います。

* [Added a `singleInstanceOnly` option in tasks, Fixes #32264 by ishanjain28 · Pull Request #32384 · Microsoft/vscode](https://github.com/Microsoft/vscode/pull/32384)

## 参考

* [VSCode: Launch create-react-app and Chrome with launch.json](http://nealbuerger.com/2017/09/vscode-launch-create-react-app-and-chrome-with-launch-json/)
Troubleshooting in Vue2 Element UI with Webpack4

# Error 1.
```
ERROR in ./node_modules/element-ui/lib/theme-chalk/index.css 1:0
Module parse failed: Unexpected character '@' (1:0)
You may need an appropriate loader to handle this file type.
```

# Solution 1.
```
$ yarn add -D style-loader
```

```javascript
  module: {
    rules: [
      ...
      {
        test: /\.(sa|sc|c)ss$/,
        include: [
          path.resolve('src'),
          path.resolve('node_modules/element-ui/'), <-- If you use webpack include rule, add this.
        ],
        use: [
          'vue-style-loader',
          'style-loader',  <-- Add this.
          'css-loader',
        ],
      },
      ...
    ],
  },
```

# Error 2.
```
ERROR in ./node_modules/element-ui/lib/theme-chalk/fonts/element-icons.ttf 1:0
Module parse failed: Unexpected character ' ' (1:0)
You may need an appropriate loader to handle this file type.
...
...
...
ERROR in ./node_modules/element-ui/lib/theme-chalk/fonts/element-icons.woff 1:4
Module parse failed: Unexpected character ' ' (1:4)
You may need an appropriate loader to handle this file type.
```

# Solution 2.
```
$ yarn add -D file-loader
```

```javascript
  module: {
    rules: [
      ...
      {
        test: /\.(png|jpe?g|gif|svg|eot|ttf|woff|woff2)(\?.+)?$/, <-- Add this.
        include: [
          path.resolve('src'),
          path.resolve('node_modules/element-ui/'), <-- If you use webpack include rule, add this.
        ],
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 10000,
            },
          },
        ],
      },
      ...
    ],
  },
```
[Perl] ズンドコでコードゴルフ

# ズンドコ
## ズンドコって？
文字列を出力していき、「ズン」「ズン」「ズン」「ズン」「ドコ」という文字が出たら「キ・ヨ・シ！」と返すプログラム

## コードゴルフって？
どれだけ目的のプログラムを短い行数で書けるかを競う

## ズンドコしてみる
今回はPerlを使いコードゴルフをしていく
基本的には改行も削るが、今回は見やすくするために残す

### 最初のコード

```perl
do
{
	$text = "";
	$text .= int rand 2 for 1..5;
	$tmp = $text;
	$text =~s/0/ズン/g;
	$text =~s/1/ドコ/g;
	print $text."\n";
}
while($tmp ne"00001");
print "キ・ヨ・シ！";
```

とりあえず目的の動作を完璧に実行するために、文字数は気にせず作成

改善できそうな点

- 変数名が長い
- printが長い
- $textの呼び出しが多い
- 条件文の見直しができないか

とりあえずこのあたりを考えながら書き直してみる

### 二回目のコード

```perl
for(;$t ne"ズン"x4 ."ドコ";print"$t\n")
{
	$t="";$t.=rand 2<1?"ズン":"ドコ"for 1..5
}
print"キ・ヨ・シ！"
```
145->86(空白を含む)

31(0b11111)までを乱数で生成して、それを2進数0埋めにしてそれを元に配列から～とかも試したがこれが一番短そう

$t="";あたりを上手いことなんとかできないかを考えたが思い浮かばなかった
ubuntuで日本語入力ができないとき！

ubuntu16.04 
日本語キーボード
において日本語入力がうまくできないときのメモ

#参考様
[VM Ubuntuでキーボードを日本語配列に - 入力がおかしい場合にkeyboard layoutがUSになっているのを変更する](http://www.what-a-day.net/entry/vm-keyboard-layout)

#設定の確認

> setxkbmap -print -verbose 10


```text:実行結果
Setting verbose level to 10
locale is C
...(略)...
model:      pc105
layout:     us
options:    grp_led:scroll
...(略)...
};

```

以上のようになっていたとき、「layout:  us」を「layout: ja」に変更するとキーボードのレイアウトを日本語のものとして認識する。。。。。はず。。。。

#レイアウト設定の変更

> setxkbmap -layout jp
> setxkbmap -print -verbose 10

```text:実行結果
Setting verbose level to 10
locale is C
...(略)...
model:      pc105
layout:     jp,us
variant:    ,
options:    grp_led:scroll
...(略)...
};

```

このとき、Mozcの入力メソッドが日本語以外だと半角キーで英語と日本語の切り替えができないので、[こちら](https://qiita.com/AnchorBlues/items/beeb40593fd4c579dbe5)で紹介されているようなやり方で変更してください。




...
Raspberry Pi > I2C > clock stretching機能付きslave deviceへの対応 > link

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi2)
Raspbian Jessie
gcc (Raspbian 4.9.2-10) 4.9.2
とあるI2Cセンサー
```

I2Cのslave deviceにおいてclock stretching機能を持つ製品がある。

clock stretchingにおいてはSCLがlowにholdされる状態になる。
masterであるRPi2でSCLがlowを認識出ればいいが、RPi2のbcmチップセットではバグにより認識できないとのこと。
http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html

対応方法としては「baudrateをlowestにする」こと。

### 参考1

http://raspberrypi.znix.com/hipidocs/topic_i2c_clock_stretch.htm

> You can slow down the whole I2C bus so that perhaps your attached device may be able to complete tasks within longer clock times.

`/boot/config.txt`への設定例がある。

また、コマンドでのon the flyでの設定方法も紹介されている。

### 参考2

https://www.richud.com/wiki/Rasberry_Pi_I2C_EEPROM_Program
> Generally use the lowest you can to mitigate the clock stretching bug, if your device supports clock stretching. (these eeproms dont)

### 懸念

clock stretchingの期間が12msecから150msecというようなslave deviceの場合、baudrateは3Hzなどになる。

ソフトウェアI2C実装で対応するなどの工夫が必要かもしれない。

### 参考3

- [RASPBERRY PI I2C CLOCK-STRETCHING PROBLEM](http://gaje.jp/2015/01/03/3051/)

> In order to workaround this, I set data rate in I2C slave module higher.  The communication rate is 400 kbps, but I set the data rate 1000 kbps.  It worked for me.

baudrateを小さくするのでなく大きくすることで対処。

### 関連

- [Raspberry Pi | I2C > bug > clock stretching bug | sudo modprobe i2c-bcm2708 baudrate=400000で100000になる](https://qiita.com/7of9/items/5e3a37ab9d3ebb1e53a4)
yyyy(-mm(-dd)?)?形式の年月日文字列の正規表現

任意の文字列がハイフン区切りの年(yyyy)または年月(yyyy-mm)または(yyyy-mm-dd)であるかどうかを検証する正規表現を用意したので以下に残しておく。

まず、個別の正規表現はそれぞれ以下のとおり。

- 年(yyyy)： `^\d{4}$`
- 年月(yyyy-mm)： `^\d{4}-(0[1-9]|1[0-2])$`
- 年月日(yyyy-mm-dd)： `^(?!([02468][1-35-79]|[13579][013-57-9])00-02-29)((\d{4}-(01|03|05|07|08|10|12)-(0[1-9]|[12]\d|3[01]))|(\d{4}-(04|06|09|11)-(0[1-9]|[12]\d|30))|(\d{4}-02-(0[1-9]|1\d|2[0-8]))|(\d{2}([02468][048]|[13579][26])-02-29))$`

よって、求める正規表現は以下のとおり。

`^(\d{4}|\d{4}-(0[1-9]|1[0-2])|(?!([02468][1-35-79]|[13579][013-57-9])00-02-29)((\d{4}-(01|03|05|07|08|10|12)-(0[1-9]|[12]\d|3[01]))|(\d{4}-(04|06|09|11)-(0[1-9]|[12]\d|30))|(\d{4}-02-(0[1-9]|1\d|2[0-8]))|(\d{2}([02468][048]|[13579][26])-02-29)))$`

# テスト

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import pandas as pd

date_re = re.compile(r'^(\d{4}|\d{4}-(0[1-9]|1[0-2])|(?!([02468][1-35-79]|[13579][013-57-9])00-02-29)((\d{4}-(01|03|05|07|08|10|12)-(0[1-9]|[12]\d|3[01]))|(\d{4}-(04|06|09|11)-(0[1-9]|[12]\d|30))|(\d{4}-02-(0[1-9]|1\d|2[0-8]))|(\d{2}([02468][048]|[13579][26])-02-29)))$')

# 正当な日付に関して検証する。
for date in pd.date_range(start='1800-01-01', end='2200-12-31'):
    if date.is_month_start:
        if date.is_year_start:
            print(date.strftime('%Y'))
            assert date_re.search(date.strftime('%Y'))
        print(date.strftime('%Y-%m'))
        assert date_re.search(date.strftime('%Y-%m'))
    print(date.strftime('%Y-%m-%d'))
    assert date_re.search(date.strftime('%Y-%m-%d'))

# TODO: 不正な日付に関して検証する。
```

# 参考
- [yyyymmdd形式日付文字列の妥当性をチェックする正規表現を読み解く - Qiita](https://qiita.com/shojit/items/c633a329dbbcc56923d6)
- [【正規表現01】日付の表現 - 名もないテクノ手](http://d.hatena.ne.jp/seuzo/20091201/1259635998)
- [Python pandas で日時関連のデータ操作をカンタンに - StatsFragments](http://sinhrks.hatenablog.com/entry/2014/11/09/183603)
Google Play servicesとFirebaseの依存コンフリクト解決

Google Play servicesとFirebaseは今年の5月からSemVerに移行しました[^1]。それで早速困ったプロジェクトがあったので、「とりあえず全部最新版にアップグレードするだろう常考」以外の手段を提示したいと思います。

[^1]: [Release Notes  |  Google APIs for Android  |  Google Developers](https://developers.google.com/android/guides/releases)

### エラーの内容

今回問題になった設定は、Google Play servicesとFirebaseに対し下記のようなdependenciesとなっています：

```gradle
dependencies {
    ...
    implementation 'com.google.firebase:firebase-core:15.0.2'
    implementation 'com.google.firebase:firebase-messaging:15.0.2'
    implementation 'com.google.android.gms:play-services-analytics:16.0.1'
}
```

```gradle
buildscript {
    ...
    dependencies {
        ...
        classpath 'com.google.gms:google-services:4.0.1'    
    }
}
```

上記の設定でGradle Syncすると、下記のエラーが出ます：

> The library com.google.android.gms:play-services-measurement-base is being requested by various other libraries at [[15.0.2,15.0.2], [16.0.0,16.0.0]], but resolves to 16.0.0. Disable the plugin and check your dependencies tree using ./gradlew :app:dependencies.

### `./gradlew :app:dependencies` でコンフリクト箇所を確認

まず、エラー内容の指示通りに`apply plugin: 'com.google.gms.google-services'`をコメントアウトし、コマンドラインで`./gradlew :app:dependencies`の結果を確認します：

```
+--- com.google.firebase:firebase-core:15.0.2
|    +--- com.google.firebase:firebase-analytics:[15.0.2,16.0.0) -> 15.0.2
|    |    +--- com.google.android.gms:play-services-basement:[15.0.1,16.0.0) -> 15.0.1
|    |    |    \--- com.android.support:support-v4:26.1.0 (*)
|    |    +--- com.google.android.gms:play-services-measurement-base:[15.0.2] -> 16.0.0
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               コンフリクト
...
+--- com.google.android.gms:play-services-analytics:16.0.1
|    +--- com.google.android.gms:play-services-analytics-impl:[16.0.1] -> 16.0.1
|    |    +--- com.google.android.gms:play-services-ads-identifier:15.0.1 (*)
|    |    +--- com.google.android.gms:play-services-base:15.0.1 (*)
|    |    +--- com.google.android.gms:play-services-basement:15.0.1 (*)
|    |    +--- com.google.android.gms:play-services-measurement-base:[16.0.0] -> 16.0.0
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
               play-services-measurement-baseの16.0.0を要求する元凶
```

つまり、

- `com.google.firebase:firebase-core`を上げるか
- `com.google.android.gms:play-services-analytics`を下げるか

のどちらかを取れば解決するかもしれません。

実際、firebase-coreを上げると今度は`com.google.firebase:firebase-iid`のバージョン依存でコンフリクトが発生します。上記と同じ方法で見ると原因は`firebase-messaging`のバージョンだと分かります。

最終的に解決策は下記の2パターンになります：

- `com.google.firebase:firebase-core`を`16.0.1`、`com.google.firebase:firebase-messaging`を`17.0.0`に上げる
- `com.google.android.gms:play-services-analytics`を`15.0.2`に下げる
CentOS7インストール時受けた衝撃（かなり今更感）

# きっかけ
これまでは結構CentOS6系を使ってきたが、.NET coreのサポートはCentOS7だとのことで、CentOS7のインストールを実施。

その際、CentOS6系との違いで衝撃を受けた点をまとめる。

## ifconfigが無くなった

ipというコマンドになり、次のようなコマンドになる。

```
ip a
```

## インターネットに接続するときの設定ってこんなだっけ？

GUIでインストールしたなら、画面からちょちょいと設定していた項目だったが、CUIで設定するとこんなことをする。

```text:デバイスの状態確認
nmcli d
```

上記のコマンドでデバイス名を確認したら、次コマンドで自動接続設定。

```text:ネットワークの自動接続
nmcli c m [デバイス名] connection.autoconnect yes
```

もう一度状態確認のコマンドで接続を確認できる。
CentOS6ではetc下の設定ファイルを直接いじった記憶。
その他ネットワーク系の設定を参考にしたのは↓。
https://qiita.com/taro0219/items/8d3be39c5cb882d1ba5d

## ファイアウォールが全然違う。。
詳細は↓を参考。
https://qiita.com/haminiku/items/56fcb578d86abcd0b571

CentOS6では定番のiptablesではない。
これからはfirewalldなのだなと。。

# おわりに
気が付くと、ネットワーク系の設定に衝撃を受けている私。
要するにインストール後に必要な初期設定の操作がいろいろ変わったことに戸惑っているわけだな。

他はだいたい各アプリの説明を見てやっているので気にならないけど、OSインストール後の設定で戸惑うようになるのはツライ。