OmniAICreator/Qiita-1.07M huggingface dataset:
ML-Kit For Firebase でTensorFlow Lite使用サンプルを動かす


# 概要
ML-Kit For Firebase のTensorFlow Lite使用のサンプルを動かしたかったので
導入手順のメモを残しておきます

ML-Kit For Firebaseは以下のサンプルも試せますが
画像分類、文字認識、顔検出、バーコードスキャン、ランドマーク認識

今回は上記以外にも、TensorFlow Lite形式をMobile端末に置き、使えるとのことで
このサンプルを動かします

実行環境は以下のとおり
Windows10 Pro
Android Studio Version3.2.2
AndroidアプリVersion9.0

# サンプルアプリ動作手順

１．開発環境準備
Android Studio未導入の場合は以下URLからダウンロードしインストール
https://developer.android.com/studio/?hl=ja

２．サンプルアプリを取得
ML-Kitサンプルアプリを用意
以下URLから「Clone or Download」をクリックし「mlkit-android.zip」をダウンロード
https://github.com/googlecodelabs/mlkit-android

上記を解凍すると「mlkit-android」フォルダができるので、任意の場所に配置

Android Studioから「File>Open」で上記で配置した「mlkit-android」フォルダ配下の「final」フォルダをプロジェクトとして選択


**３．Firebaseプロジェクト登録**
ML-Kitを使用するには「google-services.json」ファイルをプロジェクトに設定する必要があるため
以下のURLからFirebaseプロジェクトの登録を実施し、Jsonファイルを生成
https://console.firebase.google.com/
※Googleアカウント登録の必要あり

以下でプロジェクトを生成

・プロジェクトの追加
以下情報を設定
プロジェクト名：任意の名称
アナリティクスの地域：日本
「次へ」ボタンを押下

・AndroidアプリにFirebaseを追加
Androidパッケージ名に「com.google.firebase.samples.apps.mlkit」を設定し「アプリを登録」ボタンを押下
「google-services.json」ボタンを押下しJSONファイルをダウンロード

上記で生成したJSON「google-services.json」をプロジェクトの「app」フォルダ配下に配置

**４．サンプルアプリを実行**
「Android Studio」から「Run」>「Run’app’」を押下しアプリを実行
※実機でも、バーチャルマシンでも実行可能（最小API levelが16との記載ありのため Android 4.4 KitKat以上であれば動作するはず？）

アプリが立ち上がったら、コンボボックスから認識対象画像を選択し「FIND OBJECTS」ボタンを押下すると
画像のオブジェクトの種類と認識確度が高いもの上位3つが表示

![sampleImg.png](https://qiita-image-store.s3.amazonaws.com/0/172093/1c00ace0-3a6c-d9df-21ac-74acdec67111.png)

**参考文献**
https://codelabs.developers.google.com/codelabs/mlkit-android-custom-model/#0
Android studio のbuild.gradleの位置の言い回し


Android studioの解説でよくあるbuild.gradleの位置の言いまわし
「プロジェクトレベル」「アプリレベル」について以下のとおり


プロジェクトレベル
[project]/build.gradle

アプリレベル
[project]/[app-module]/build.gradle
JavaScript の XMLHttpRequest オブジェクトの使い方

JavaScript の XMLHttpRequest オブジェクトの使い方については
こちらの記事が詳しく書いてあり、分かりやすかったです。

個人的には初歩的ですがopenとsendメソッドの違いが
よく分かってなかったので参考になりました！

http://webos-goodies.jp/archives/50548720.html
cloud functionsでfirestoreを使う

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)
結論から言うと、firebaseのcloud functionsでfirestoreを使うには、
firebase-admin
というサードパーティライブラリが必要。
cloud functions自身には、httpリクエストからfireStoreのデータを読む術はない。
（ただしcloud function単体でfireStoreトリガーで、fireStoreクエリを発行することは出来る。）

firebase initでcloud functionを作成した後

```
npm i firebase-admin --save
```

以下のように使う

```js
const functions = require('firebase-functions')
// cloud functionでfirestoreを使うのに必要な設定は以下の２行
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

// データベースの参照を作成
var fireStore = admin.firestore()

exports.helloWorld = functions.https.onRequest((request, response) => {
  // 動作確認のため適当なデータをデータベースに保存
  var citiesRef = fireStore.collection('cities');
  citiesRef.doc('SF').set({
    name: 'San Francisco', state: 'CA', country: 'USA',
    capital: false, population: 860000 })

  var cityRef = fireStore.collection('cities').doc('SF')
  cityRef.get()
  .then(doc => {
    if (!doc.exists) {
      response.send('No such document!')
    } else {
      response.send(doc.data())
      }
    })
    .catch(err => {
      response.send('not found')
    })
})
```

今回作成したAPIにgetすると、firestoreにcityが書き込まれ、書き込まれた結果が帰ってくる。
cloud function単体ではfirestoreと連携出来ず、firebase-adminと連携して使う必要がある。


firebase serveと打つと、ローカルでcloud functionsを動作確認できるが、ローカル環境でも、firestoreは問題なく使えた。
ubuntu18.04(18.10) インストールの準備

#まずは環境整備から、

##ubuntu18.04(18.10)のインストール
ubuntu linuxの詳しい紹介は本家にて、
https://www.ubuntulinux.jp/home

##インストールメディアの用意
メディアはDVDかUSBメモリが扱いやすいです。今回はUSBメモリを使用します。
先ずはubuntu日本のサイトからisoイメージを落としてきます。
https://www.ubuntulinux.jp/download/ja-remix

任意のディレクトリで以下のコマンドでダウンロードします。
wget -c http://cdimage.ubuntulinux.jp/releases/18.04.1/ubuntu-ja-18.04.1-desktop-amd64.iso

ファイルが正しくダウンロード出来ているか、確認します。
md5sum ubuntu-ja-18.04.1-desktop-amd64.iso | grep bd606d253091edca54e56e4ffc2dce74

次にスーパユーザになり、以下のコマンドでisoイメージをUSBメモリに書き込みます。
dd if=ubuntu-ja-18.04.1-desktop-amd64.iso of=/dev/sdb
ここでは機動ディスクが/dev/sda、USBメモリを差し込んだら/dev/sdbとして認識されたとしています。

割と時間がかかります。カーソルが表示されたらおしまい。次はインストールしましょう。
※以上の作業はdebian linux で行っています。
投稿頻度が高すぎます Qiita(7)

Qiita初投稿時のエラー
https://qiita.com/kamata1729/items/d631bb29bd4c5bfb404d

>記事を投稿しようとすると「投稿頻度が高過ぎます」と言われる
　直前の記事を投稿してから30分ほどは、記事を投稿＆編集ができなくなるようです。

登録しようとするとエラーメッセージが出る。

この投稿でエラーメッセージを出そうとしたら、エラーが出ずに投稿できてしまった。

そこでもう一つ記事を改定登録しようとしたら出た。

<img width="426" alt="qiitaerro.png" src="https://qiita-image-store.s3.amazonaws.com/0/51423/7acc3369-7061-18da-6287-6d05270a5bbf.png">

このエラーが出ているのに、実際には登録できている。

仕様は厳密に決めない方がいいのかもしれない。

自動生成で、たくさん登録するのではよい記事ができないということかもしれない。

３０分で１本ということは、１日４８記事しか投稿できないということらしい。

http://researchmap.jp/kaizen/
には、１日100記事を書くことがある。

記事の転載はうまくできないかもしれない。


# 対応策　

下書きが当時は１０個しか保存できなかった。　
１日１０記事以上書くことはできない感じでった。　

その後、新規の下書きは３０記事くらい保存できるようになったような気がする。

限定共有記事にするという手もある。　

限定共有記事は、何記事まで蓄えられるかまだ確認していない。

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
ネットで接続しないサイトが時々

https://www.searchdesk.com
を利用している。

時々、繋がらない。

類似の現象が、あちこちで。

いつも表示しないわけではない。

接続している場所が違うからでもない。

Wiresharkでデータは取ってみて検討中。

何がやばいデータか未確認。

普段使う経路は、仕事場、自宅、Wimax、そのほか、

無料無線網(wifi)利用で便利なこと、不便なこと
https://qiita.com/kaizen_nagoya/items/9244aa0906cbedec83aa

に記載した場所からも接続。
ファイル検索でファイル名がでなくなった　on mac

フォルダでファイル名で検索してもファイルがでなくなることがある。

いつも必ずなら、理由の差が使用があるかもしれない。

出てくるときもあるし、出てこないときもある。

ファイルがいっぱいだから起きる現象かと思い。

icloudの容量を増やし、デスクトップと書類をicloudに移行した。

あいかわらず、ファイル名で検索しても出てくるときと出てこないときがある。

出てくるときと、出てこないときの状態の違いが今、一歩確認できない。

p.s.

icloud上のファイルが、一覧にでないことがある。
どこか別のフォルダに入って戻ってくるか、３分経つか。

Macintosh 16GB, 
macOS High sierra version 10.13.6

容量250.79GB
空き容量 62.51GB(5.94G purge可能）
Windows向けpythonインストール（ネカフェ作業用）


# 各種インストール

* python
  * https://www.python.org/
* Migu 2M (font)
  * http://mix-mplus-ipa.osdn.jp/migu/
* Mery(Editor)
  * https://www.haijin-boys.com/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8

# コマンドプロンプトのフォントを変える

* コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
* 文字列値 932.1
* 値 \*Migu 2M

# コマンドプロンプトのショートカットを作成
C:\Windows\System32\cmd.exe
- フォントを変える
- 色を変える
- 実行時フォルダを変える

# コマンドプロンプトで以下を実行
```Console
pip install virtualenv
pip install --upgrade pip
pip install Flask
pip install pysqlite3 
pip install sqlalchemy
pip install flask-sqlalchemy
```

# flask実行用bat（pi.bat）

使い方 ```pi hoge.py``` 


```console
@if not exist %1 @goto :EOF
@set FLASK_APP=%1
@flask run
```

# テスト
* sqlalchemy
  ファイルから実行

```python
import sqlalchemy
print(sqlalchemy.__version__)
```

# 参考
* android flask  
  http://neilkarwasra.blogspot.com/2017/08/how-to-install-and-run-python-flask-web_15.html
* windows flask  
  https://qiita.com/akiraabe/items/48045d00cc4ea28ca4e9
Pinterest風にジェスチャで画面遷移するサンプル

![preview.gif](https://qiita-image-store.s3.amazonaws.com/0/8920/e222feda-e969-05d7-6016-e63371bb150a.gif)

iOS版Pinterestのような画面を引き下げて前の画面に遷移するジェスチャーとアニメーションを再現してみました。

サンプルコードはこちらにあります。
[GitHub - PinterestLikePullToPop](https://github.com/ShingoFukuyama/PinterestLikePullToPop)

## 概略

`UINavigationController`スタック上のview controllerの遷移になります。まずは対象の`UIScrollView`に`UIPanGestureRecognizer`をあらたに付加してスクロールと連動。そしてキャプチャした複数のviewをwindow上に重ねてアニメーションを再現。前の画面に戻るときに`UIViewControllerAnimatedTransitioning`を使って後始末をしています。

ここで使われているアニメーションの一部はこちらの記事に抜き出しています。
[Panジェスチャ後のvelocityを利用した放物線アニメーション](https://qiita.com/ShingoFukuyama/items/0619a2928dbaa160f84a)
Excelファイルがどこに行ったかわからない

Macintoshで Microsoft Excelを使っています。

Macintosh 16GB, 
macOS High sierra version 10.13.6
Microsoft Excel for Mac 2011 version 14.7.3(170325)

icloudの契約を結んで、ディスクの拡張をしています。

Microsoft Excelで作成し保存したファイルを

ファイル検索しても出てこない。

困って、再起動かけたら、
Excelのファイル復元で出てきた。

保存して、再起動したら見当たらなくなった。

どこに保存したのか、覚えがない。

目の前、真っ暗。

Office for Mac でファイルを復元する
https://support.office.com/ja-jp/article/office-for-mac-でファイルを復元する-6c6425b1-6559-4bbf-8f80-4f038402ff02

```
$ cd
$ cd Library
$ cd Containers
$ ls com.microsoft.*
Container.plist	Data
```

あれ、、、。
(メモ)ランダムフォレストの定性的理解

deep forest( https://arxiv.org/abs/1702.08835 )の理解のためにランダムフォレストに関して勉強している。

とりあえずSSII2013のtutrialが分かりやすかった
https://www.habe-lab.org/habe/RFtutorial/SSII2013_RFtutorial_Slides.pdf

次はscikit-learnのtutrial( https://scikit-learn.org/stable/modules/ensemble.html#forest )を読みながらいじってみてdeep forestにとっかかる予定。
TypeError: Cannot assign to read only property 'Symbol(Symbol.toStringTag)' of object '#<process>'

```
TypeError: Cannot assign to read only property 'Symbol(Symbol.toStringTag)' of object '#<process>'
```

Node v11.11.0を使うとjestで上記エラーが発生する。

いくつか解決策があり、1つはjestのバージョンを上げること。
該当PRは以下。
https://github.com/facebook/jest/issues/8069
https://github.com/facebook/jest/pull/8050

jestのバージョンがあげられない場合は、nodeのバージョンを下げること。
node v11.10.0を使えばエラーは発生しない。
node側の該当PRは以下
https://github.com/nodejs/node/pull/26488


PRを見ると、`Symbol`の`toStringTag`が`writable: false`に設定されたために発生したエラーの模様。
jest側の対処はわりと暫定的なので、node側の修正を期待したい。

```diff
-  newProcess[Symbol.toStringTag] = 'process';
+  try {
+    // This fails on Node 12, but it's already set to 'process'
+    newProcess[Symbol.toStringTag] = 'process';
+  } catch (e) {
+    // Make sure it's actually set instead of potentially ignoring errors
+    if (newProcess[Symbol.toStringTag] !== 'process') {
+      e.message =
+        'Unable to set toStringTag on process. Please open up an issue at https://github.com/facebook/jest\n\n' +
+        e.message;
+
+      throw e;
+    }
+  }
```

https://github.com/facebook/jest/pull/8050/files?utf8=%E2%9C%93&diff=unified
プログラミング学習記録22〜ToDoアプリ完成（写経）〜

##今日やったこと
- Udemyの「Web開発入門完全攻略コース - プログラミングをはじめて学び創れる人へ！未経験から現場で使える開発スキルを習得！」のセクション15の215~248

なんとかコースを１周しました。

以下、パートごとの学習メモです。

###セクション15Ruby on Rails 5入門
####215.イントロダクション -Ruby on Rails 5入門-
このセクションの概要。

####216.開発環境構築
AWS Cloud9
Ruby on Rails 5.1.4
Ruby 2.5.0
sqlite3

なぜか5.1.4をインストールしても,5.1.6.1になってしまうのですが、大きな違いはないと思うので、このまま進みます。

ターミナルでrailsをインストールしました。

####217.railsプロジェクトの作成
helloプロジェクトを作成しました。


####218.ディレクトリ構成について
MVC（モデル・ビュー・コントローラー）
Model→データ
View→画面
Controller→ModelとViewをつなぐ処理


どのファイルをいじっていくのかについての説明を受けました。

####219.はじめてのRuby on Railsプログラミング
erbはテンプレートエンジンと呼ばれ、HTMLの中にrubyを組み込むことができます。

controllers、index.html.erb、routes.rbをいじり、無事Hello World!を表示させることができました。

####220.TODOアプリの完成形の確認
この講座で作るTODOアプリの完成形を確認しました。

####221.プロジェクトの作成
これから作るTODOアプリのプロジェクトを作りました。

動画の通りやっていたはずなのにうまくいかないハプニングが起こり、セクションの初めに戻るも解決せず…

※後日追記
todoのgemfileの方もgem 'sqlite3','~> 1.3.6’にして、ターミナルでbundle updateをしたらうまくいきました。

####222.コントローラーの作成
tasks_controllerを作りました。

####223.モデルの作成

####224.マイグレーションファイルの編集

####225.DBスキーマをDBに反映する
 
####226.初期データ作成

####227.ルーティングの設定

####228.一覧画面のcontrollerを開発
  
####229.一覧画面のviewを開発

####230.一覧画面の動作確認

####231.一覧画面へ新規追加画面へのリンクを追加

####232.新規追加画面のviewを開発

####233.新規追加画面のcontrollerを開発

####234.新規追加画面の動作確認

####235.バリデートの追加
テキストボックスに何も入力されていないときは、データベースに保存しないようにする設定をしました。

####236.一覧画面から編集画面へのリンクを追加

####237.編集機能のviewを開発

####238.編集画面のcontrollerを開発

####239.編集画面の動作確認

####240.削除機能のviewを開発

####241.削除機能のcontrollerを開発

####242.削除機能 動作確認

####243.チェックボックスのトグル動作について

####244.jQueryのインストール

#####245.ルーティング設定

####246.チェックボックスのトグル動作のcontrollerを開発

####247.チェックボックスのトグル動作のクライアント側を開発

####248.トグル動作の動作確認

###セクション15Ruby on Rails 5入門
途中トラブルがありつつも、なんとか終えることができました。

よくわからずただ写経している部分がほとんどなのですが、それでも一通り体験できてよかったと思います。

今後はこの講座の復習を進めながら、中村先生のrailsのコースを受けてみます。

<br>
まだまだわからないことだらけですが、とりあえずコースを１周して達成感をしています。

raisはProgateすらやっていない状態で講座を受けたこともあり、理解が苦しかったです。

なので、これからProgateのrailsをやってみたいと思います。

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
selenium動作用の基底クラスの例を作ってみました

# selenium動作用の基底クラス 利用例
## 概要
[以前の記事](https://qiita.com/snowp/items/fcda8c5d590017858bdb)のクラスを使った例を作ってみました。
[seleniumのテスト用のサイト](http://www.selenium.jp/test-site)を使用しています。今回は[旧サイト](http://example.selenium.jp/reserveApp/)を対象にしています。

## 必要なもの

* python 3.7.2

ライブラリとして

* selenium
* numpy
* pandas
* openpyxl
* xlrd

ブラウザは

* Chrome

を使用しています。
## 公開場所
[github](https://github.com/snowpff14/seleniumSample)で公開しいます。


## 使い方

1. `data/予約データ.xlsx`に各入力内容に応じて値を入れてください。
    * 日付についてはランダムで入るように指定しているので固定したい場合は修正してください。
2. `seleniumTestSite1`を実行します。
3. 終了するのを待ちます。`screenShot/reserve`に結果は出力されます。

## 内容の説明
* `data/予約データ.xlsx`の一行ずつ登録を行っていきます。一つのクラスにまとめているが、必要に応じてクラスを分けるなど対応を行います。
* `data/予約データ.xlsx`にデータを登録すればまとめて入力できます。CSVなどによる一括登録ができず画面からの入力のみという場合に業務効率化のきっかけにできれば
* アラートダイアログに関しては基底クラスに定義していませんが今後定義するかも・・・
* 実際にはこの機能を応用して勤務表の入力やとあるシステムの業務支援として使っています。
* logの設定など見よう見まねでやっているのでベストプラクティスではないかもしれません・・・
CodeDeployでDeployに失敗した時に確認すること

# 概要

普段CodePipelineを用いてCodeCommitの更新を受け取り、CodeBuild->CodeDeployと起動させている。
時々、CodeDeployが失敗してPipeline上に「失敗」という赤い画面を見ることがあるわけだがそんな時の対処法。(忘れないためにメモがてら)

## 対処法
0. とりあえず落ち着く
1. 再試行ボタン
2. CodeDeployエージェントが動いているか確かめる

基本的には、
下記のURLのまま
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-verify.html

```
$ sudo service codedeploy-agent status
```
「error: No AWS CodeDeploy agent running」こんなエラーが出ているようなら、CodeDeployエージェントはお休みになられているということなので、
すぐに起こして馬車馬のように働いてもらう。

```
$ sudo service codedeploy-agent start
```
再度、statusを確認して「The AWS CodeDeploy agent is running」と出れば、ちゃんと働いてくれます。
改めてCodeDeployを再試行してDeployが通ればOK!
Raspberry pi3B+でjuliusを動かせるようになるまでの覚書き(2019.3.10現在)

職場でRaspberry piを使うニーズとして可搬型の音声認識デバイスがありそうなので、プライベート機にセットアップした際の覚書き。
※ネットには解説つきの事例がたくさんあるけれど、記事やバージョンが古かったりして最新版ではちょこちょこ手直ししなければならない箇所があったので注意。

ちなみに音声認識の速度や精度ではGoogle AIYを使った方がいいことは分かり切ってるんだけど、googleのクラウドサーバで処理する都合上「機密管理」にキビシイ日本企業の常で完全スタンドアロンのjuliusを選択した次第。


##セットアップの前準備

###Raspberry piに音声認識用のマイク付きwebカメラ（USB）を認識させる

USBにwebカメラを刺して

```
$ lsusb
```
すると、現在接続されているデバイスが分かる。認識していればOK。

###USBマイクの優先順位を設定

```
$ cat /proc/asound/modules
```
でオーディオデバイスの優先順位が分かる。

```:結果
0 snd_bcm2835
1 snd_usb_audio
```
であればUSBオーディオの優先順位を上げてあげなければならない。

```
sudo nano /etc/modprobe.d/alsa-base.conf
```

で`/etc/modprobe.d/alsa-base.conf`を書き換えて

```:/etc/modprobe.d/alsa-base.conf
:
# Keep snd-usb-audio from beeing loaded as first soundcard
#options snd-usb-audio index=-2
options snd-usb-audio index=0
:
```

にしておく。終わったら、

```
$ sudo shotdown -r now
```
でリブート。優先順位を再確認して

```
$ cat /proc/asound/modules
 0 snd_usb_audio
 1 snd_bcm2835
```
だったらOK。

###ALSAのサウンドドライバをインストール
RaspberryPi3b+の最新カーネルでは`snd-pcm-oss`モジュールが含まれていないので、あらかじめ`ALSA`のサウンドドライバをインストールしておく。

```
sudo apt-get install osspd-alsa
sudo aptitude install libasound2-dev
```

###ALSADEV設定でデバイスを固定
Juliusを実行する際にカードNo.、デバイスNo.の情報が必要だが、常に同じ設定を使用できるように環境変数として設定しておく。

```
sudo nano ~/.profile
```

で`~/.profile`に下記の一文を追加。

```:.profile
export ALSADEV=hw:0,0
```

追加後はリブート


##juliusのインストール

###ソースコードの取得
```
$ mkdir julius
$ cd julius
$ wget https://github.com/julius-speech/julius/archive/v4.5.tar.gz
```

###ソースコードのコンパイル・インストール
【重要】
`./configure --with-mictype=alsa`にて上で書いた`snd-pcm-oss`モジュールの代わりに`ALSA`を使用するためのオプションを指定するのがミソ。
昔の記事には書いてないけど、raspberry pi3 modelB+ではこれをやっておかないとハマる。

```
$ tar xvzf v4.5.tar.gz
$ cd julius-4.5
$ ./configure --with-mictype=alsa
$ make
$ sudo make install
```

###julius音声認識パッケージの取得

```
$ mkdir ~/julius/julius-kit
$ cd ~/julius/julius-kit
$ wget https://github.com/julius-speech/dictation-kit/archive/v4.4.zip
$ unzip dictation-kit-v4.4.zip
```

##juliusの起動・音声認識

```
$ julius -C ~/julius/julius-kits/dictation-kit-v4.4-linux/main.jconf -C ~/julius/julius-kits/dictation-kit-v4.4-linux/am-gmm.jconf -nostrip
```

で無事起動して`<<< please speak >>>`の文字列が表示されれば成功！
終了時は`Ctrl + C`で終了させること。



##参考記事
[Raspberry Pi＋Juliusで音声を認識する](https://qiita.com/mininobu/items/609aed76f5767f0aa99b)
[Raspberry Piで音声認識](https://qiita.com/t_oginogin/items/f0ba9d2eb622c05558f4)
[raspi最新カーネルでjuliusを動かす](https://qiita.com/mooriii/items/e6bd0c8c07ef4c94fa0d)
WindowsのC++からRDKitを使ってみる

# はじめに
前回、Windows上でRDKitのビルドに成功した。そもそもC++から使うことも目的だったため、早速 Visual Studioで RDKit のソースを書いてビルド&実行をしてみた。

# 環境
以下の環境で実施した。
- Windows 10
- VisualStudio 2017
- RDKit 2018_09_2

# ソースコード
まず適当にソースを書く。今回はVisual Studio 17で新規のプロジェクトを作成し、以下のようにSDFから10件読み込んでSMILESに変換した結果を出力するプログラムを書いた。

```
#include <iostream>
#include <GraphMol/FileParsers/MolSupplier.h>
#include <GraphMol/SmilesParse/SmilesWrite.h>

int main(void) {

	RDKit::SDMolSupplier supplier("nr-ahr.sdf");
	RDKit::ROMol *mol;

	int i = 0;
	while ((mol = supplier.next()) && i < 10) {
		std::cout << RDKit::MolToSmiles(*mol) << std::endl;
		delete mol;  
		i++;
	}
}
```

# ビルド手順
ビルドはすんなりとはいかず、いくつかビルドの設定の対処が必要だったため以下に手順をメモっておく。

## 1. プロジェクトの構成とプラットフォームを、RDKitビルド時と合わせる。
今回構成は「Release」、プラットフォームは「x64」にした。

## 2.「プリコンパイル済みヘッダーを使用しない」に設定する。
構成プロパティの「C/C++」->「プリコンパイル済みヘッダー」を上記のように設定する。

## 3. 追加のインクルードディレクトリにRDKit、Boost等のディレクトリを追加する。
RDKitのビルド環境を参考にし、構成プロパティの「C/C++」->「全般」->「追加のインクルードディレクトリ」に以下を追加した。(Python関連は不要かもしれないが)

- C:\rdkit-Release_2018_09_2\Code\
- C:\rdkit-Release_2018_09_2\External\catch\catch\single_include
- C:\rdkitRelease_2018_09_2\External
- C:\Python36\include
- C:\Python36\Lib\site-packages\numpy\core\include
- C:\Boost\include\boost-1_65_1

※フォルダは各自のインストール先に読み替えていただきたい。

## 4. リンカの設定
構成プロパティの「C/C++」->「全般」->「追加のライブラリディレクトリ」に以下を追加した。

- C:\rdkit-Release_2018_09_2\build\lib\Release

また、構成プロパティの「C/C++」->「入力」->「追加の依存ファイル」に以下を追加した。
これらは前回のRDKitのビルドにより得られた生成物である。

- Alignment.lib
- AvalonLib.lib
- avalon_clib.lib
- Catalogs.lib
- ChemicalFeatures.lib
- ChemReactions.lib
- ChemTransforms.lib
- coordgenlib.lib
- DataStructs.lib
- Depictor.lib
- Descriptors.lib
- DistGeometry.lib
- DistGeomHelpers.lib
- EigenSolvers.lib
- FileParsers.lib
- FilterCatalog.lib
- Fingerprints.lib
- FMCS.lib
- ForceField.lib
- ForceFieldHelpers.lib
- FragCatalog.lib
- GraphMol.lib
- hc.lib
- Inchi.lib
- InfoTheory.lib
- maeparser.lib
- MMPA.lib
- MolAlign.lib
- MolCatalog.lib
- MolChemicalFeatures.lib
- MolDraw2D.lib
- MolHash.lib
- MolInterchange.lib
- MolStandardize.lib
- MolTransforms.lib
- Optimizer.lib
- PartialCharges.lib
- RDBoost.lib
- RDGeneral.lib
- RDGeometryLib.lib
- RDInchiLib.lib
- ReducedGraphs.lib
- RGroupDecomposition.lib
- ShapeHelpers.lib
- SimDivPickers.lib
- SLNParse.lib
- SmilesParse.lib
- StructChecker.lib
- Subgraphs.lib
- SubstructLibrary.lib


これで「ビルド」を実行すると、エラーなくコンパイルできるはずである。
実行したところ、Anaconda版と同じ結果を得ることができた。

```
>ConsoleApplication1.exe
CC(=O)O.CC(C)c1ccc2c(c1)CC[C@@H]1[C@]2(C)CCC[C@@]1(C)CN
C[C@@H](NCCCc1cccc(C(F)(F)F)c1)c1cccc2ccccc12.Cl
CC1=C(C(=O)OC(C)C)C(c2cccc([N+](=O)[O-])c2)C(C(=O)OC2CN(C(c3ccccc3)c3ccccc3)C2)=C(N)N1
CN(C)C(=O)C1(N2CCCCC2)CCN(CCC2(c3ccc(Cl)c(Cl)c3)CN(C(=O)c3ccccc3)CCO2)CC1.Cl
CCOC(=O)O[C@H](C)OC(=O)c1ccc2c(c1)cc(C(=O)NC1CCN(C(C)C)CC1)n2Cc1cc(-c2ccc(Cl)s2)on1.Cl
CCCCCCCCCCCCCCCC[N+](C)(C)CC.[Br-]
CCCCCCCCCCCCCCCCCC[N+](C)(C)C.[Cl-]
Cc1cc(OCCOCC[N+](C)(C)Cc2ccccc2)ccc1C(C)(C)CC(C)(C)C.[Cl-]
N=C(NCCCCCCNC(=N)NC(=N)Nc1ccc(Cl)cc1)NC(=N)Nc1ccc(Cl)cc1
CC/C(=C(\c1ccccc1)c1ccc(OCCN(C)C)cc1)c1ccccc1.O=C(O)CC(O)(CC(=O)O)C(=O)O
```

C++からガンガンRDkit使うぞ！
【BAT】Windowsのパフォーマンスログ(モニタ)の取得

# はじめに
仕事では運用チームに属しています。30近いWindows ServerのPCを監視している中で、たまによくわからない現象が発生します。
某N社に連絡すると現象が発生したときのログを取得して送ってくださいというメールが届きます。

そんなわけで自分のところに再度現象が発生するまでパフォーマンスログを仕掛けるようにとの依頼がきました。

# パフォーマンスログ
Windowsではパフォーマンスモニターを使用することでパフォーマンスログを取得できます。

下記サイトを参考にパフォーマンスモニターをGUIで設定することができます。
[[SQL Troubleshooting] 第2回 : Tips -パフォーマンス ログの採取方法 (Windows Server 2003 ～ Windows Server 2012 R2)](https://web.archive.org/web/20190108071515/https://blogs.msdn.microsoft.com/jpsql/2012/04/19/sql-troubleshooting-2-tips-windows-server-2003-windows/)

[パフォーマンスログ採取手順](https://techcommunity.microsoft.com/t5/sql-server-support-blog/%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%AD%E3%82%B0%E6%8E%A1%E5%8F%96%E6%89%8B%E9%A0%86/ba-p/1683329)

複数台を運用している際、どのサーバーにも共通のモニターを設定したい場合にはインポートとエクスポート機能がある。
[Windowsのパフォーマンスモニターの設定エクスポート、インポート](http://the-takeo.com/?p=734)

# コマンドライン
パフォーマンスモニターにはコマンドラインを使用することができます。
typeperfコマンドとlogmanコマンドの2種類あります。
logmanコマンドは、GUIで設定したデータコレクターセットを使用する場合に便利です。

* [Windowsのtypeperfコマンドでシステムのパフォーマンスカウンタのデータを収集する](https://www.atmarkit.co.jp/ait/articles/0911/13/news105.html)
* [パフォーマンス・カウンタのデータ収集をlogmanコマンドで制御する](https://www.atmarkit.co.jp/fwin2k/win2ktips/1246logman/logman.html)

# プログラム
今回はtypeperfコマンドを使用した例とします。

下記の3ファイルを同じフォルダ内に配置します。

* CounterItems.txt
* PerLog.bat
* PerLogTask.bat

## CounterItems.txt
取得するパフォーマンスログをテキストファイルに設定します。

```bat:CounterItems.txt
\LogicalDisk(*)\*
\Memory\*
\Network Interface(*)\*
\Process(*)\*
\Processor(*)\*
\PhysicalDisk(*)\*
\Server\*
\System\*
```

## PerLog.bat
パフォーマンスログを取得します。
今回は30秒間隔で1日中取得する設定を行います。

cfオプションには取得するパフォーマンスログ(CounterItems.txt)を指定します。
siオプションは間隔(秒)の`30`を指定します。
scオプションは回数で`2880`を指定します。
(1日は60分 x 24時間=1440分、間隔が30秒なので60/30=2、最終結果は 1440 x 2 = 2880)
fオプションはファイル種類でバイナリーの`bin`を指定します。
oオプションは出力ファイル名で、`counter_yyyyMMddHHmm.blg` 形式となります。

1日中だと130MByteくらいの容量となりますので、3世代管理として実行する度に一番古いファイルを削除するようにしています。
最初はforfilesコマンドを使用して経過日数で世代管理としていたのですが、長期休暇でサーバーを再起動した際に経過日数だとバックアップファイルが無くなると指摘があったため、ファイル数による世代管理に修正しました。
[【bat】経過日数およびファイル数で古いファイルを削除する方法](https://mitosuya.net/delete-old-file)

```bat:PerLog.bat
cd /d %~dp0
set time_tmp=%time: =0%
set dt=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%

REM 3世代管理として一番古いファイルを削除します。
for /f "skip=2" %%a in ('dir /b /o-d *.blg') do del %%a

REM 30秒間隔で1日中取得する。
typeperf -cf CounterItems.txt -si 30 -sc 2880 -f bin -o counter_%dt%.blg

exit 0
```

## PerLogTask.bat
タスクスケジューラで指定するバッチとなります。
運用でタスクスケジューラの状態の監視もしており、0以外だと監視通知が届いてしまうのを回避するためです。そのため監視不要の場合は、タスクスケジューラでPerLog.batを指定すればいいです。

今回はタスクスケジューラから指定する場合、PerLogTask.batを指定します。
こうしないと1日中動作するため「0x41301:現在タスクを実行中です」状態となります。

```bat:PerLogTask.bat
@echo off
cd /d %~dp0
 
rem PerLog.batを呼び出す
start PerLog.bat
 
exit 0
```

# 最後に
パフォーマンスモニターのGUIって初見だと何がなんだか分かりにくいんですよね、使いこなせばいいんでしょうけど。ということでコマンド実行した方が直感的に分かりやすい。
Koa.jsのエラーハンドリングで404の場合の対応方法

expressよりいい感じらしいので、[Koa.js](https://github.com/koajs/koa)を使っています。

「さて、エラーハンドリングはどうするんだ～」と思い、[公式のwiki](https://github.com/koajs/koa/wiki/Error-Handling)があるじゃないかと喜び、そして、404が一向にキャッチされなくて困りました。キャッチされないくせに、404とだけ文字列で表示されるという。

## 404の場合は、catchには入ってこない

[koa-router](https://github.com/ZijianHe/koa-router)も併用していたので、そっちでハンドリングしなきゃいけないのかなと考えて、解決策を探していたところ、[見つけました](https://github.com/ZijianHe/koa-router/issues/371#h5o-9)。普通に、デフォルトのエラーハンドラーが[404をハンドリングしない](https://github.com/koajs/koa/blob/master/docs/api/index.md#error-handling)ため、try内で自分で｀emit｀する必要があるようです。

```javascript
// error handling

app.use(async (ctx, next) => {
  try {
    await next();
    if (ctx.status === 404) {
      ctx.app.emit("error", ctx, {status: 404, message: "u f**ked up"})
    }
  } catch (err) {
    console.log('error', err)
    ctx.status = err.status || 500;
    ctx.body = err.message;
    ctx.app.emit("error", ctx, err);
  }
});

app.on("error", (ctx, err) => {
  console.log("🚧　Error!🚨Error!🚨Error!🚨　🚧");
  ctx.redirect("/error");
});
```

🚧　Error!🚨Error!🚨Error!🚨　🚧
プログラミング初心者がUdemyを使って勉強してみた。（前編）

<h1>・初学者がUdemyで２日間フロントを勉強してみた(前編)</h1>
<p>まず自己紹介</p>

<ul>
 <li>６ヶ月前にプロゲートをやってみるも２日も続かず挫折</li>
<p></p>

 <li>某プログラミングスクールに１ヶ月通う事にするも、通学がきつく挫折×２</li>
<p></p>

 <li>人口知能に興味を持ち、自分も人工知能のWebサービスを作りたい！と奮起してドットインストールのプレミアム会員になるも１週間で挫折、、×３</li>
</ul>

<h3>.しかしまたあることがきっかけでまたプログラミングに挑戦。。。</h3>
<p>プログラミングに何度も<a href ="https://eigobu.jp/magazine/uchihishigareru">打ち拉がれた</a>筆者がなぜまたプログラミングに挑戦したか。</p>

<ol>
  <li>気づいたら最新の言語や、テクノロジーについて調べていたから。</li>
  <li>正社員になってみたが向いていない為、転職する、or フリーランスとして稼ぐ為。</li>
   <li><a href ="https://manablog.org/">まなブログさんのブログ</a>に影響された。</li>
  <li>やっぱエンジニアかっこいいって思った。</li>
</ol>

<h4>そんな理由で再びチャレンジ！！だが、、、</h4>
<p>フリーランスとして稼げるようになるには大体200時間くらい必要らしい、スクールに通うお金もない、、、</p>
<p>Web記事を漁っていると<a href ="https://www.udemy.com/jp/">Udemy</a>というサービスがあるということを発見。『んーYouTubeの広告で出てくる、pythonエンジニアが長々と話しているあれか、、』と思ったが、まあとりあえず調べてみるか、とサービスを見てみると、、、　</p>
<p>『なんやこれ、、めっちゃ面白いやん、、某pythonエンジニアのSさんの動画めちゃ面白いやん！』ということで、再びプログラミングに挑戦。</p>

<p>pythonいいけど、やっぱり稼げるようになるにはやっぱフロントからという記事を見つけたのでとりあえずUdemyのフロント（HTML、CSS、Javascript,jQuery,ruby）の動画を購入。</p>

<h3>学習内容</h3>
<p>・とりあえず２００時間の学習を最短でクリアできるための学習計画</p>
<ul>
 <li>毎日通算4.4時間フロントエンドについて学習する</li>
 <li>HTML、CSS、Javascript、jQueryに絞って学習</li>
<li>毎日Qitaに記事をあげる</li>
 
</ul>

とりあえず土日で学習してみた結果、感想。

・１日目マックで通算６時間13分学習。（HTML基礎）
・２日目ココスの朝食バイキングでバカ食いしながら５時間24分学習。（HTML応用）

あれ？意外と楽しくないか？なんか前より楽しく、学習できている、、果たしてこれが気のせいなのか、、

次回へ続く。
z-indexってなんだろう

<h1>はじめに</h1>
<p>画像の重なり方が思い通りにいかず困った時にz-indexを設定すると教わりましたが、<br/>
設定するときにまだ戸惑うのでz-indexについてまとめてみました。</p>

<h2>z-indexってなんだろう</h2>

<p>要素の重なり順を設定できるCSSプロパティ<br/>
数値が大きいほうの要素が画面の上に重なって表示されます。</p>

<p>  z-index: 数値 ; <br/>
上記のように設定します。</p>


<p>z-indexなしの場合、下の画像のように要素が重なります。</p>
![z-index0.png](https://qiita-image-store.s3.amazonaws.com/0/361055/75586a33-aab7-d85d-81d7-8d59a98ac850.png)


<p>例えば、Boxを手前からBox→Box2→Box1と背景の後ろにBox3を配置したいのに<br/>
上の画像のように、要素が重なって上手くいかない時にz-indexを設定します。</p>


<p>z-indexの設定ありの場合</p>
![z-index1.png](https://qiita-image-store.s3.amazonaws.com/0/361055/ab4591fe-7a66-1256-d89f-0af888054acd.png)


```:.css
.section {
  position: relative;
  background-color: antiquewhite;
  width: 100px;
  height: 120px;
}
.Box {
  z-index: 3;
  position: absolute;
  background-color: darkolivegreen;
  width: 50px;
  margin-left: 10px;
  margin-top: 35px;
}
.Box1 {
  z-index: 1;
　position: absolute;
/* 省略 */
  }
.Box2 {
  z-index: 2;
　position: absolute;
/* 省略 */
  }
.Box3 {
  z-index: -1;
  position: absolute;
/* 省略 */
 ```


<p>上のように大きい数値だと手前にマイナスだとposition:relativeの後ろに配置されます。</p>

<h3>z-indexを設定したのに反映されない時<h3>

<p>z-indexはpositionプロパティとセットで設定することがほとんどのようですが、
設定したい要素にpositionの設定がされていないとz-indexが反映されないので確認してみてください。
原因が分かるまでかなり戸惑いました。</p>



<h1>参考</h1>

[z-indexの使い方：CSSで重なり順を指定する](https://saruwakakun.com/html-css/basic/z-index)
<p>参考にさせていただきました。</p>
gnuplot の初歩 #3 茨城の花粉飛散情報をプロットしてみる。


[#1](https://qiita.com/bunzaemon/items/1266c012c09e22e5690c)/[#2](https://qiita.com/bunzaemon/items/24d5b36879758c38ff71)/[#3](https://qiita.com/bunzaemon/items/d7bd76c1cdad196e566b)

花粉の飛散状況を材料に、時系列データの練習を。

## 前提

- 5.2系での確認(-cとか使用)
- –persist(-p) オプションを使用。

-p は OS X だとそれなり設定しないと使えません。
-pが設定されてない環境では、~/.gnuplotファイルを設定して、置き換えてから読むと良いかも([#1](https://qiita.com/bunzaemon/items/1266c012c09e22e5690c)の最後で触れてます)。


# .gnuplot

~/.gnuplot に以下の内容を記載。

```
set xdata time
set timefmt "%Y%m%d%H"
set format x "%Y/%m/%d"
set xtics rotate by 90  right
```

## load ファイルに時間軸の設定を記載する場合の注意

```
$ cat ./.gnuplot
set xdata time
set timefmt "%Y%m%d%H"
set format x "%Y/%m/%d"
set xtics rotate by 90  right
$ gnuplot -c <( echo 'load ".gnuplot" ; ...') ...
```

などとして、呼び出す方法は、CentOS上では上手く行ったが、私の OS X(brew上)では上手く行かなかった[^1]。

[^1]: ARG1 は問題ないのに、ARGV[1] に "ariel" が入ってしまう。別制御の変数らしいw

但し、~/.gnuplot に同様の記載をし、load コマンドを実行しない場合には上手く行く。


# データの準備

[はなこさん](http://kafun.taiki.go.jp/index.aspx)から花粉の飛散数のデータを適当にダウンロード。2019/02/01 から 03/10 までのデータだった。

私は、茨城県民なので、茨城3観測点のデータを。

format.csv読めばフォーマットについては説明されている。

利用しやすいように、測定局を1ファイルずつに分割。

```
% perl -F, -lane 'open my $out, ">>", $F[0] . q{.txt} ; print $out join " ", $F[2] . $F[3], $F[10]' Data.csv 
```

測定局コードは、

>50810200 つくば
>50810100 水戸
>50820100 日立

だそうで。

# とりあえず、プロット

```
$ gnuplot -p -c <( echo 'plot for [ i = 1:ARGC ] ARGV[i] u 1:2 w l' ) 50810200.txt 50810100.txt 50820100.txt
```


![kafun1.png](https://qiita-image-store.s3.amazonaws.com/0/64084/22b77fff-3843-d7cd-5602-27fb41fe07ec.png "kafun1.png")

ふむ。重なって見辛いぞ。


縮尺一緒のまま、ずらして、ちょこっと体裁を整える[^2]。

[^2]: '\' 改行を入れて視認しやすくしてある。

```
$ gnuplot -p -c <( echo 'array Stat[3]=["tsukuba","mito","hitachi"]; \
set yrange [-0.5:3] ; \
set ytics ( Stat[1] 0, Stat[2] 1, Stat[3] 2 ); \
plot for [ i = 1:ARGC ] ARGV[i] \
    u 1:($2/9000 + 1 * ( i - 1 ) ) w l title Stat[i]\
' ) 50810200.txt 50810100.txt 50820100.txt
```

[#1](https://qiita.com/bunzaemon/items/1266c012c09e22e5690c)/[#2](https://qiita.com/bunzaemon/items/24d5b36879758c38ff71)から新しい事と言えば、

- 配列(Stat[3])
	- インデクスが1から始まる。
- ytics(Y軸の目盛)は、名前 Y値のカンマ区切りのセットで上書き出来る。もちろんxticsも。
	- ただしmyticsなどが効かなくなってしまうらしい。
- using 引数内での四則演算は基本
	- この場合は、9000で割って、描画をずらすために、index分足してる。

程度?


![kafun3.png](https://qiita-image-store.s3.amazonaws.com/0/64084/e337b0cd-47ee-89e9-ae24-0af03b4bfa8d.png "kafun3.png")
gnuplot の初歩（ワンライナーを中心に）#2


[#1](https://qiita.com/bunzaemon/items/1266c012c09e22e5690c)/[#2](https://qiita.com/bunzaemon/items/24d5b36879758c38ff71)/[#3](https://qiita.com/bunzaemon/items/d7bd76c1cdad196e566b)

## 前提

- 5.2系での確認(-cとか使用)
- –persist(-p) オプションを使用。

-p は OS X だとそれなり設定しないと使えません。
-pが設定されてない環境では、~/.gnuplotファイルを設定して、置き換えてから読むと良いかも([#1](https://qiita.com/bunzaemon/items/1266c012c09e22e5690c)の最後で触れてます)。

# 描画関係

## 複数ファイルのプロット

```
$ gnuplot -p -c <( echo 'plot for [ i = 1:ARGC ] ARGV[i] w l ; ' ) rand.txt rand2.txt
```

rand.txt/rand2.txt は、[前の奴](https://qiita.com/bunzaemon/items/1266c012c09e22e5690c)と同じ

![randmf.png](https://qiita-image-store.s3.amazonaws.com/0/64084/2b81ddcc-6d10-2f1b-c80c-06c315fa2f08.png "randmf.png")


## 複数カラムのプロット


行を動的に変更させて、プロットさせることも出来るよ。

```
$ perl -le 'print join " ", $_,  rand (10), rand(10) for 0 .. 99' > randml.txt 
$ gnuplot -p -c <( echo 'plot for [ i = 1:2 ] ARG1 u 1:(column(i+1)) w l ; ' ) randml.txt
```


素直に、column 関数を使う、 perl のソフトリファレンス的なやり方で、u 1:($$i)みたいな事が出来ないか探してハマった。

![randml.png](https://qiita-image-store.s3.amazonaws.com/0/64084/1ce29b79-eedb-0f11-68c5-dcf9caf6b2ed.png "randml.png")



# 時間軸を使う

## ISO 8601

軸を ISO 8601形式にもできますよ。

>Backslash-octals(\nnn) are converted to char

Tは、\124と指定しないといけない。

```
set xdata time                     
set timefmt "%Y-%m-%d\124%H:%M:%S"  
```

ここさえ気をつければ、range指定時とかは、普通に T を埋め込めばいい(format x の時も)。


で、ミリセカンドの指定の仕方は

>Gnuplot tracks time to millisecond precision. Time formats have been modified to match this. 

だそうで、`%.3S` とかで指定する。

```
$ cat .gnuplot
set xdata time                     
set timefmt "%Y-%m-%d\124%H:%M:%S" 
set format x "%H:%M:%.3S"         
set xtics rotate by 90  right      

$ perl -le 'printf "2019-03-08T00:00:00.%02d %s\n",  $_ ,rand (10) for 0 .. 99' > randwt.txt
$ gnuplot -p -c <( echo 'load ".gnuplot"; plot ARG1 u 1:2 w l' ) randwt.txt
```

![randwt.png](https://qiita-image-store.s3.amazonaws.com/0/64084/b6ac6a9c-aa2a-e76f-f70f-ca6061f751ed.png "randwt.png")


結構な間知らなかった。


## 時間軸での STATS

時間軸の stats は、無茶苦茶な結果が出るので無視する。時間軸でない軸の stats は信用できる[^1]。

[^1]: 先に時間軸のフォーマット指定などをすると、statsコマンド自体実行出来ない。


```
$ gnuplot -p -c <( echo 'stats ARG1 nooutput; print STATS_index_min_y, STATS_min_y' ) randwt.txt
6 0.00668365412220595
```
Y軸の値からX軸の値を逆引きするのは、STATS_index_* でインデクスが得られるのでそれを使う。

```
$ perl -lne 'print if $. == 7' randwt.txt
2019-03-08T00:00:00.06 0.00668365412220595
```

まあ、ラッパの中での作業となるだろうけど。
LaravelのCommandを使う

ちょっと更新が滞ってしまったけど、過去ブログのQiitaへの移転シリーズ第5弾、今回は[この記事](https://yk0807.com/larablog/posts/7)なのですが、当時使っていたのがLaravel5.2で、今は5.7（もう5.8リリースしたんだっけ）と大分時が経ってしまったのでちょくちょく修正していこうかと。

Webシステムと言っても、ブラウザから操作するだけでなく毎日（or毎週or毎月）、自動的に何かやってほしいことがあると思います。 例えば、毎年4月1日になったら学年を更新するとか。
そんな時に役に立つLaravelのコマンド（とcrontab）を紹介します。
やり方は、以下の流れになります。
#1. artisanでコマンドを作成する
例えば、コマンドのクラス名をUpdateGradeという名前で作ることを考えます。

```
php artisan make:command UpdateGrade
```

注：5.2までは下記のコマンドになります。

```
php artisan make:console UpdateGrade
```

これによってapp/Console/Commands/UpdateGrade.phpが出来上がります。さらにオプションで"--command=コマンド名"とやると、実際に打つコマンド名を変えることができます。
例えば、実行するコマンド名をupdate_gradeとすると、

```
php artisan update_grade
```

でコマンドが実行できるようになります。

#2. コマンドのプログラムを実装する
1.で出来たapp/Console/Commands/UpdateGrade.phpのファイルにソースコードを実装します。実際の処理の他にコマンドラインオプションもこちらで実装できます。詳細は[こちら](https://readouble.com/laravel/5.7/ja/artisan.html#command-structure)を参考にしてください。

#３． カーネルに先ほどのコマンドのクラスを追加する
app/ConsoleにKernel.phpというファイルがあると思います。それのprotect $commands =の中に

```php
Commands\UpdateGrade::class,
```
という記述を加えてください。以外と忘れがちです。

ここまで来たら、php artisan update_gradeと打つと作ったコマンドを動かすことができます。また、php artisan listと打つとatrisanで使えるコマンド一覧が表示されるのですが、その中にupdate_gradeも入っていることがわかると思います。

#４． crontabに自動実行の設定を書き込む
　３.までで作ったコマンドを自動で実行できるようにするのがcrontabの役割です。まず、

 ```
crontab -e
```

と打ちます。
　　そうするとエディタが出てくるので、それに設定の記述を追加します。詳細な書き方は[こちら](https://www.server-memo.net/tips/crontab.html)を見ていただくとして、１つ気をつけなければいけないのは、手動での実行時はphp artisan update_gradeだけでよかったのですが、crontabにはphpとartisanの絶対パスを書かなければいけないことです。
　例えば

```
　　15 1 1 * * /usr/local/lib/php-7.1.23/bin/php /home/username/www/system/artisan update_grade
```

　　という設定を書き込むと、毎月1日午前1時15分に今回作ったupdate_gradeコマンドが実行されるようになります。

　なお、crontabに設定されているコマンドの一覧はcrontab -lで見ることができます。

　これを使って、結構いろいろなことができそうですね。例えば毎月1回いらないファイルを削除するとか。ぜひ使い方をマスターしたいものです。
Perlを使って新元号を予想する

# Perlを使って新元号を予想する

新元号発表まで残りわずか、新元号は何になるのか漠然と考えたりしていました。
明治（１６）、大正（８）、昭和（１７）、平成（１１）と最近の元号は画数が少ない傾向がありそうと着目。
また、平成の「成」以外の漢字は過去に使われた元号の漢字に含まれている。
ということで、画数２０未満で、過去に使われた漢字を洗い出すプログラムを書くことにしました。

## 過去に使われた元号のデータ

PerlはCPANという、モジュールリポジトリがあります。[metacpan](https://metacpan.org)から、「Japanese Era」で検索し[DateTime::Calendar::Japanese::Era](https://metacpan.org/pod/DateTime::Calendar::Japanese::Era)というモジュールを見つけました。このモジュールには日本の過去の元号が含まれ、registeredをいう関数で取得することができます。

## 漢字の画数を求める方法

[MJ文字情報API](http://mojikiban.ipa.go.jp/mji/)がIPAから公開されていました。漢字コードを指定してRESTAPIを投げると、JSON形式で漢字情報を取得することができます。その中に画数の情報が含まれます。

## 順列を求める

過去に使われた元号の漢字を重複を除いたのち、２文字の漢字の順列組み合わせを求める必要があります。[Algorithm::Permute](https://metacpan.org/pod/Algorithm::Permute)というモジュールを使用しました。

## Perlの醍醐味

CPANモジュールを組み合わせるだけで、簡単に予想することができました。元号のデータも自分で用意することなくコーディング出来るとは、思いませんでした。

## 予想結果
拙いコードと抽出結果もコミットしてあります。[dokechin/gengo](https://github.com/dokechin/gengo)

## 先頭文字の読みも考慮
明治、大正、昭和、平成の頭文字であるマミムメモ、タチツテト、サシスセソ、ハヒフヘホを候補から外してみました。1445パターンまで減らせました。

## 一般名詞等を除去
形態素解析のText::MeCabを用いて、一般名詞などとして使われている物を除くように変更しました。1406パターンまで減らせました。
TouchDesigner⇄AbletonLive連携リファレンスまとめ

自分用のメモなので説明は省きますmm

## touchDesigner無料版ダウンロードリンク
[https://www.derivative.ca/099/Downloads/](https://www.derivative.ca/099/Downloads/)

##オーディオヴィジュアルチュートリアル
[CHOPとTOPで作るオーディオビジュアライズ]
(https://note.com/toyoshimorioka/n/nd4281011b800)

[TouchDesigner中級編(2) – オーディオリアクティブ表現 (1)]
(https://yoppa.org/mit-ma20/11686.html)


## TDabletonダウンロードリンク
[http://www.derivative.ca/Forum/viewtopic.php?f=22&t=10573&p=40385#p40385](http://www.derivative.ca/Forum/viewtopic.php?f=22&t=10573&p=40385#p40385)


## 連携チュートリアル動画
[http://station.backspace.tokyo/satoruhiga/TDWS_2018/tips/tdableton/](http://station.backspace.tokyo/satoruhiga/TDWS_2018/tips/tdableton/)
↑もう削除されていた

↓おそらくこれが一番コンパクトにまとまっている
[https://youtu.be/8fBo5oFZPck]
(https://youtu.be/8fBo5oFZPck)

　
## touchDesigner HELPPage
[https://docs.derivative.ca/index.php?title=TDAbleton#Getting_Started](https://docs.derivative.ca/index.php?title=TDAbleton#Getting_Started)
　
## TDAbletonを使ったOCS連携の記事
[http://satoruhiga.com/TDWS2019/day14/]
(http://satoruhiga.com/TDWS2019/day14/)

[http://satoruhiga.com/TDWS2019/day13/]
(http://satoruhiga.com/TDWS2019/day13/)

[https://qiita.com/ToyoshiMorioka/items/9d26115c56872c9658c6](https://qiita.com/ToyoshiMorioka/items/9d26115c56872c9658c6)

##初心者向けのチュートリアル
[TDSW]
(https://www.youtube.com/channel/UCKwb_ZPHs-DEzK9TdVl3_Ew)

##初心者向けの記事
[TouchDesigner基礎基礎メモ1]
(https://www.nogson.blog/entry/2017/08/20/235936)
[TouchDesignerを勉強する時に参考になるサイトまとめ]
(https://qiita.com/ToyoshiMorioka/items/763f425bc3381209a29f)
[TouchDesigner ショートカット一覧]
(https://qiita.com/joe0hara/items/fab81562f30a13fc67ae)
https://scottallen.ws/tau/pe2020_5_dat#Select_DAT

[TouchDesigner Study Basic]
(https://note.com/toyoshimorioka/m/m29f2bdbc8dbb)

##日本語の解説
[http://ted-kanakubo.com/touchdesigner-jp/]
(http://ted-kanakubo.com/touchdesigner-jp/)

##書籍
https://www.amazon.co.jp/dp/B075L6DRBW

##サンプルファイル
[http://www.indaehwang.com/]
(http://www.indaehwang.com/)

#チュートリアルまとめ
[Matthew Ragan]
(https://www.youtube.com/channel/UCKAAKTI2xLNNBJRkdf8E58A)

[bileam tschepe]
(https://www.youtube.com/channel/UCONptu0J1PCrW9YfBtSdqjA)

[Noto The Talking Ball]
(https://www.youtube.com/channel/UCSEsok1iU9ewEebdMAJmMVw)

[paketa12]
(https://www.youtube.com/channel/UCNSWFiANNycsIiMekHbpphQ)

[Stanislav Glazov]
(https://www.youtube.com/channel/UCo2GO066zFf7Sr90wQlYBDw)

[David Braun]
(https://www.youtube.com/channel/UCkDwJxKzQocvGhQOCTQi70w)

[Bruno Imbrizi]
(https://www.youtube.com/channel/UC8IhlQhenlJDjWAj7QJqy_Q)

[Simon Alexander-Adams]
(https://www.youtube.com/channel/UCrDw12uy7xq1-b-aL1UZ2qg)
AWS CodePipelineを使って、Githubで管理しているソースコードをCodeBuildでビルドしElasticBeanstalkのEC2上にデプロイする 

#はじめに
AWSのCodePipelineを使って、Githubで管理しているPHPのソースコードをCodeBuildでビルドし、ElasticBeanstalkで管理しているEC2上にデプロイする一連の作業の流れと注意するポイントを紹介します。

#前提
 - ソースコードをGithubで管理している
 - ElasticBeanstalkでEC2インスタンスを管理している

#流れ
 - CodePipelineでパイプラインを作成
  - ソースステージ（Github）を追加
  - AWS CodeBuildでビルドプロジェクトを作成し追加
  - デプロイステージ（ElasticBeanstalk）を追加

#事前準備

###buildspec.yml

プロジェクトのルートディレクトリ（Githubで管理しているリポジトリのルート）に`buildspec.yml`ファイルを作成します。
`buildspec.yml`ファイルはCodeBuildでビルド時に自動で読み込まれ、さまざまなコマンドを実行することができます。

今回下記のような内容で`buildspec.yml`を用意しました。  

 - ビルド時のコマンドの概要
  - composer.lockファイルを削除
  - vendorディレクトリを削除
  - composerを実行し各ライブラリを取得
 - ビルドで生成されたファイル（build artifact）の設定

``` buildspec.yml
version: 0.2
phases:
  build:
    commands:
      - |
        if [ -e composer.lock ]; then
          rm -r composer.lock
        fi
      - |
        if [ -e vendor ]; then
          rm -rf vendor
        fi
      - php -dmemory_limit=-1 composer.phar update --no-scripts --prefer-dist --no-interaction
      - |
        
artifacts:
  files:
    - ./**/*
```

###buildspec.ymlの注意点

下記のartifactsのfilesに関する記述がないとビルド生成物を任意の場所に配置できず、正しく生成されないのでご注意ください。  

```
artifacts:
  files:
    - ./**/*
``` 


#詳細

##パイプラインを作成
下記の内容でパイプラインを作成します。Service roleは新規作成していますが、既存のものを使う場合はExisting Service roleを選択してください。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/32979/e060dfc3-e24c-fb06-42de-f732b2100628.png)


##ソースステージを追加
ソースステージを追加します。ソースプロバイダにGithubを選択します。この他AWS CodeCommit等も選択することもできます。  
Githubに接続完了すると自分が管理しているリポジトリリストが表示され、リポジトリを選択するとブランチリストが表示されます。
変更検出オプションは、Github等で指定したブランチに変更が発生した際に自動でパイプラインを起動してくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/32979/f4a27ff4-ace9-d34f-7ecc-1c32960f36a4.png)

##CodeBuildのプロジェクトを作成
次にCodeBuildでビルドするためのビルドプロジェクトを作成します。Project nameはパイプラインの名前と合わせておくと管理しやすいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/32979/904d3730-c1af-4c59-c0ee-1fb677339433.png)

###ビルド環境を設定
ビルド環境の設定ですが、GithubのソースコードがPHP7なので、
CodeBuildがデフォルトで用意している下記の環境を選択しています。  

 - Operating system: Ubuntu
 - Runtime: PHP
 - Runtime Version: aws/codebuid/php7.1
  
CodeBuildで用意されていない環境が必要な場合は、Custom Imageを選択し自前でDockerImageを用意する必要があります。  

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32979/627b1fec-1eee-5efc-8a30-9aa65210b486.png)

###ビルドスペックを設定
ビルドスペックファイルは、ビルド時に様々なカスタムコマンドを実行することができます。  
今回は"Use a buildspec file"を選択することで、ルートディレクトリに置いたbuildspec.ymlが使用されるように設定しています。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/32979/4ad46eed-7dcf-6f81-06bb-1c2dd461fa8b.png)

##デプロイステージを追加
最後にデプロイステージを選択します。  
デプロイプロバイダにElasticBeanstalkを選択すると、自分が管理しているアプリケーションリストと環境が表示されるのでデプロイ先を指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/32979/effdf353-0627-0fa4-a624-c85fbe06a933.png)

##内容を確認

以上で完了です。  

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32979/c89e0409-8b53-455e-812f-4c68efd70b59.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/32979/5d889db0-8e4e-2fe1-0fed-13fe3d2e775d.png)

これで正常にデプロイまで終了すればOKです。
postfixをマルチインスタンスにした時のsystemdのサービスファイルを作成した

#postfixをマルチインスタンスで使う時の、systemdのサービスファイルをサービスファイルを作成してみた。元々用意されているのはシングルインスタンスで起動するものなので、ザクっと置き換えよう。

プライマリのインスタンスは、デフォルトの/etc/postfixを使うものとして、セカンダリは/etc/postfix-2へ作成されているものとする。マルチインスタンス化については、ググって欲しい。

元々インストールされている/usr/lib/systemd/system/postfix.serviceはシングルインスタンス用なので、以下に入れ替える。また、セカンダリ用のは別途新規に作成する。

```/usr/lib/systemd/system/posftix.service
[Unit]
Description=Postfix Mail Transport Agent(Primary)
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/sbin/postmulti -i /etc/postfix -p start
ExecReload=/sbin/postmulti -i /etc/postfix -p reload
ExecStop=/sbin/postmulti -i /etc/postfix -p stop
Restart=always

[Install]
WantedBy=multi-user.target
```

```/usr/lib/systemd/system/postfix-2.service
[Unit]
Description=Postfix Mail Transport Agent(Secondary)
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
PIDFile=/var/spool/postfix-2/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/sbin/postmulti -i /etc/postfix-2 -p start
ExecReload=/sbin/postmulti -i /etc/postfix-2 -p reload
ExecStop=/sbin/postmulti -i /etc/postfix-2 -p stop
Restart=always

[Install]
WantedBy=multi-user.target
```

後は、以下のコマンドで有効にして起動・停止ができる。

```
# systemctl enable postfix
# systemctl enable postfix-2

# systemctl start postfix
# systemctl start postfix-2

# systemctl status postfix
# systemctl status postfix-2

# systemctl stop postfix
# systemctl stop postfix-2
```

てな感じですかね。
javascript初心者の学んだことまとめ

筆者はjavascript歴半年(初めて触れたのが2018年10月)の初心者です。
自分の覚書用に学んだことを整理してみました。

###プロトタイプという概念
プロトタイプ＝日本語に訳すと「原型」＝ほかの言語でいうクラスに当たる＝親
インスタンス＝子

どのインスタンスでも同じになるもの(メソッドとか)はプロトタイプに定義する。
(そうしないとインスタンス生成の度にプロトタイプが生成され、メモリを圧迫してしまう)

### グローバルとローカルの違い
トップ(functionの外)に書くとグローバル変数・関数として扱われてしまう。
バグの温床となり好ましくないので、できるだけfunction内に書くこと。
また、varをつけ忘れると、グローバルとして扱われてしまうので必ずつけること。

### this
var self = this; でselfにオブジェクトを格納することで、ビルドエラーを防ぐ。
(書く場所によってthisが指すものが異なるため)

### A = B || C という書き方
Bがfalseとみなされる値の場合、Cで置き換える。
・C#でいう A = B ?? C
・SQL文でいうCOALESCE
にあたる

※Bがfalseとみなされる値・・・null,undefined,空文字など

### withは使うべからず
推奨される代替案は、参照したいプロパティを持つオブジェクトを一時変数に代入することです。
参照)https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/with
dokku上でPuppeteerを動かすと"Error: Failed to launch chrome!"というエラーになる時の対処法

# 概要
* dokkuでpuppeteerを動かしたい。
* ローカルでは動くが、本番サーバーではエラーが出て動作しない。
* 詰んで数日2~3日も無駄にしてしまった。後続者のためにメモ。

#エラー内容
```
2019-03-08T17:17:35.658980463Z app[web.1]: Error: Failed to launch chrome!
2019-03-08T17:17:35.658991689Z app[web.1]: /app/node_modules/puppeteer/.local-chromium/linux-624492/chrome-linux/chrome: error while loading shared libraries: libX11-xcb.so.1: cannot open shared object file: No such file or directory
2019-03-08T17:17:35.658994915Z app[web.1]: 
2019-03-08T17:17:35.658997085Z app[web.1]: 
2019-03-08T17:17:35.658999215Z app[web.1]: TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md
2019-03-08T17:17:35.659001950Z app[web.1]: 
2019-03-08T17:17:35.659004031Z app[web.1]:     at onClose (/app/node_modules/puppeteer/lib/Launcher.js:360:14)
2019-03-08T17:17:35.659006156Z app[web.1]:     at Interface.helper.addEventListener (/app/node_modules/puppeteer/lib/Launcher.js:349:50)
2019-03-08T17:17:35.659014821Z app[web.1]:     at Interface.emit (events.js:194:15)
2019-03-08T17:17:35.659017113Z app[web.1]:     at Interface.close (readline.js:397:8)
2019-03-08T17:17:35.659019221Z app[web.1]:     at Socket.onend (readline.js:173:10)
2019-03-08T17:17:35.659021409Z app[web.1]:     at Socket.emit (events.js:194:15)
2019-03-08T17:17:35.659023631Z app[web.1]:     at endReadableNT (_stream_readable.js:1107:12)
2019-03-08T17:17:35.659026145Z app[web.1]:     at process.internalTickCallback (internal/process/next_tick.js:72:19)
```

#動作環境
* Ubuntu 16.04
* Dokku 0.14.5
* Puppeteer 1.13.0

#原因
* puppeteerに必要なChromeヘッドレスは、デフォルトの状態のDokkuでは機能しない。
    * インストールする必要があるが、その方法がわからなくて2~3日詰んでいた


# 解決策
### dokku-aptプラグインで必要なパッケージをインストールする

* 【前提】dokkuインストール、gitのリモートリポジトリの追加は済ませた状態
*  dokku-aptのインストール(SSH接続した状態)を実行

```
//dokku version0.4.0以上の場合（たいていはこっち）
sudo dokku plugin:install https://github.com/F4-Group/dokku-apt

//dokku version0.4.0未満の場合
git clone https://github.com/F4-Group/dokku-apt -b 0.3.0 /var/lib/dokku/plugins/dokku-apt
dokku plugins-install
```
* 開発中のプロジェクトのルートフォルダに`apt-packages`(拡張子なし)を作成
    * ↑勘違いして、サーバー上の`home/dokku/<app_name>`に配置してしまっていて詰んでた👊💢
* ファイルの内容は以下の通り
    * 改行区切りでインストールしたいパッケージを記述
    * 公式サイトからUbuntuで動かすためのパッケージ一覧をコピペしただけなので不要なのもあるかも

```
gconf-service
libasound2
libatk1.0-0
libatk-bridge2.0-0
libc6
libcairo2
libcups2
libdbus-1-3
libexpat1
libfontconfig1
libgcc1
libgconf-2-4
libgdk-pixbuf2.0-0
libglib2.0-0
libgtk-3-0
libnspr4
libpango-1.0-0
libpangocairo-1.0-0
libstdc++6
libx11-6
libx11-xcb1
libxcb1
libxcomposite1
libxcursor1
libxdamage1
libxext6
libxfixes3
libxi6
libxrandr2
libxrender1
libxss1
libxtst6
ca-certificates
fonts-liberation
libappindicator1
libnss3
lsb-release
xdg-utils
wget
```
* `git add .`→`git commit -m"add apt-packages`→`git push dokku master`などでpush
* dokkuがデプロイするときに自動的に`apt-packages`の内容をインストールしてくれる

# 参考
* An example app with Node.js, Express.js, Puppeteer and Chrome Headless
    * https://github.com/mskog/dokku-puppeteer-example
* Inject deb packages into dokku based on files in project
    * https://github.com/F4-Group/dokku-apt
【C#】GPS信号を使用して現在の時刻を取得する

# なんでそんなことするの？
端末がインターネットに接続できない場合、サーバから現在時刻を取得できません。
GPS信号(NMEAフォーマットデータ)には、UTC時刻が含まれているため、
インターネットには繋がらないけどGPSは拾えるという特殊な環境である場合、選択肢となるかもしれません。

# Microsoft.WindowsAPICodePack.Sensors を使う

.Net標準であるGeoCoordinateWatcherで取得できる情報は、緯度・経度に限られているので、
Microsoft.WindowsAPICodePack.Sensors名前空間のSensorクラスを使用します。

## GPSセンサを用意
Sensorクラスを使うためには、GPSセンサが必要です。
イマドキのWindows端末には基本的にGPSセンサが搭載されていないので、用意する必要があります。

とりあえず動作を試すだけであれば、amazon格安センサ( https://www.amazon.co.jp/gp/product/B01MA21TSX/ )で十分です。
ソースを動かすには、デバイスマネージャーのセンサーにGPSセンサーが追加されていれば問題ありません。
<img src="https://qiita-image-store.s3.amazonaws.com/0/374840/bc0de005-e366-c4d4-8ab3-50c31aff080f.png" width=50%>




# ソースコード
```
using Microsoft.WindowsAPICodePack.Sensors;

// 位置情報GUID
// 参考：https://docs.microsoft.com/en-us/windows/desktop/sensorsapi/sensor-category-location
private static Guid SENSOR_DATA_TYPE_LOCATION_GUID = new Guid("055C74D8-CA6F-47D6-95C6-1ED3637A0FF4");

// GPSセンサの取得
Sensor GeolocationSensor = SensorManager.GetSensorsByTypeId(SensorTypes.LocationGps)[0];

// GPS信号を取得する度に、イベント実行
GeolocationSensor.DataReportChanged += DataReportChanged;

```
```
        // GPS信号受信時の処理
        private void DataReportChanged(Sensor sender, EventArgs e)
        {
            // NMEAフォーマットデータ
            string[] gpsData = sender.DataReport.Values[SENSOR_DATA_TYPE_LOCATION_GUID][25].ToString().Split(',');

            // gpsData[1]：HHmmss.00 gpsData[9]：yyMMdd
            // NMEAフォーマットデータに含まれる時刻は、UTC時刻となる
            DateTimeOffset dto = new DateTimeOffset(
                DateTime.ParseExact(string.Format("{0}{1}", gpsData[9], gpsData[1].Substring(0, 6)), "yyMMddHHmmss", null), TimeSpan.Zero);
        }

```
https://github.com/TakadaTentaro/GetGPSTime


GPS信号データは、DataReportChangedイベントのsenderを通じて取得します。

上記のGPSセンサを使用した環境では、
sender.DataReport.Values[SENSOR_DATA_TYPE_LOCATION_GUID]は、[0]：経度、[1]：緯度と続いていき、[25]にNMEAフォーマットの生データ(\$GPRMC,\$GPVTG,\$GPGNS...)が格納されています。
Elastic Beanstalkで外部のRDSといい感じに接続する

## 背景
- Beanstalkで作成したEC2インスタンスとRDSのDBインスタンスを接続したい
- RDSまで全部Beanstalkで作ると環境を終了（削除と同じです）したときに一緒に全部消えてしまう
- RDSは消したくない
- Beanstalkの裏で動いているのはCloudFormationなので**頑張れば**何でもできる
- できるだけ**簡易的な**方法で実現したい

## 下準備
- Beanstalkで作成したものは環境終了時に一緒に消えてしまうので、消えてほしくないものをこちらで先に作っておきます。

### RDS
- DBインスタンスをいい感じに作って起動しておきます。
- ここではMySQLとしておきます。

### SecurityGroup
- あらかじめEC2とRDSをつなぐためのセキュリティグループを作成しておきます。
- 名前はたとえば `web-db-connect` としておきます。
- このセキュリティグループにはインバウンドもアウトバウンドも何も定義しなくて大丈夫です。
- これを先ほど作成したDBインスタンスのセキュリティグループのインバウンドに、3306ポートで通信を許可するソースとして追加しておきます。
    - ※ ソースに指定する場合はセキュリティグループの名前ではなくIDを指定する必要があります。

### 設定ファイル
- Elastic Beanstalkは `.ebextentions`ディレクトリを作成し、そこにconfigファイルを置くことで、詳細な設定ができるようになります。
    - 参考1： [設定ファイル (.ebextensions) による高度な環境のカスタマイズ](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebextensions.html)
    - 参考2： [すべての環境に対する汎用オプション](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options-general.html)
- ここでDBインスタンスへの接続の設定ファイルなども作成しますが、使用する言語によっていろいろあるのでここでは省略します。
- 拡張子が `.config` であればファイル名自体は何でもよく、一つにまとめる必要もないので、いい感じにファイルを分けると保守がしやすいです。
- セキュリティグループについての設定ファイルを作成します。例えば `securitygroup.config` とでもしておいて、そこに以下の内容を記述します。

```yml
option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: SecurityGroups
    value: web-db-connect
```
- ここで指定した `web-db-connect` はもちろん先ほど作成したセキュリティグループの名前です。

## 環境の作成
- あとは[EB CLI](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3.html)にしたがって環境を作成します。
- 自動作成されるセキュリティグループとこちらで作成したセキュリティグループの両方がEC2インスタンスにアタッチされ、いい感じにRDSに接続できるようになっています。
- 裏で動いているのがCloudFormationであることからもわかるように、環境作成後に後から手で設定をいじると環境を終了するときに失敗してしまうのですが、あらかじめ外で作った置いたものを参照して環境を作成した場合だと問題なく終了できますし、外で作ったものが削除されてしまうこともありません。
自分用競プロc++

```
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define pf push_front

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

#define mp make_pair
#define fi first
#define se second
typedef pair<int,int> pint;
#define All(s) s.begin(),s.end()
#define rAll(s) s.rbegin(),s.rend()
#define REP(i,a,b) for(int i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

int main()
{
    return 0;
}
```