OmniAICreator/Qiita-1.07M huggingface dataset:
raspberry pi 1でtensrorflow lite その19

#概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
ラズパイで、リアルタイム処理してみた。
ヴォイスチェンジャーのデータセットと学習結果。

#データセット

```
import numpy as np
import math
import matplotlib.pyplot as plt
import scipy.signal 

sample_rate = 44100.
nsamples = 320
F_1 = 440.
A_1 = 1.0
F_15 = 5000.
A_15 = 0.6
t = np.arange(nsamples) / sample_rate
vin = -A_1 * np.sin(2 * np.pi * F_1 * t) 
vno = (A_1 * np.sin(2 * np.pi * F_1 * t) + 1.0) * A_15 * np.sin(2 * np.pi * F_15 * t)
vsa = np.zeros((nsamples, 2))
a = 0
for i in range(nsamples):
  vsa[i, 0] = vno[i]
  vsa[i, 1] = vno[i]
fig = plt.figure(1)
ax = fig.add_subplot(311)
ax.plot(vno[1 : 300])
ax = fig.add_subplot(312)
ax.plot(vin[1 : 300])
plt.show()
data = np.c_[vsa[ : , 0], vsa[ : , 1], vin]
np.savetxt('chg0.csv', data, delimiter = ',', header = "x0,x1,y")
print ("ok")

```

#学習結果

![v3.png](https://qiita-image-store.s3.amazonaws.com/0/18104/03085ba7-1ecf-6c77-85f2-26303bfa645e.png)


以上。
VSCode 用 SystemVerilogの拡張を作る（#3）

# シンタックスカラーリング
カラーリングはやり方が2つあるようです。

1. package.json の grammars で指定したシンタックスファイル（TextMate文法など）で定義
2. LanguageServerでカラーリング情報を与える（？）

方法2. はパーサーを書くとかなり自由度が高い正確なカラーを与えられますが、私の場合はパーサーを書く前にカラーリングを作ったので1.しかやっていません。

方法1. は使えるシンタックス形式がいくつかあるようです。
今回は[TextMate形式の文法](https://macromates.com/manual/ja/language_grammars)定義ファイルを使います。この定義は正規表現を使って単語のマッチをし、結果にscope（タグのようなもの）付けするものでjsonベースです。

# 文法定義ファイル（*.tm）

```json:文法定義ファイル
		"keywords": {
			"patterns": [
				{
					"match": "`(include|define|undef|ifdef|ifndef|else|endif|timescale|default_nettype)",
					"name": "keyword.preprocessor.sv"
				},
				{
					"match": "\\b(package|endpackage)\\b",
					"name": "keyword.decl.sv"
				},
```

こんな感じ。
`include にマッチすると、keyword.preprocessor.sv というscopeが付くイメージです。
これをpackage.jsonで指定すると有効になります。

```json:package.json
    "grammars": [
      {
        "language": "sv",
        "scopeName": "source.sv",
        "path": "./syntaxes/sv.tmLanguage.json"
      }
    ],
```

ところで今更ですが、個人的にjson系は読み書きしにくいと思います。
VSCodeは文法定義にplistを受け付けるようなので、[ここに書かれている](https://qiita.com/kitsuyui/items/d254d3f0ba84c6a5d04d)ように、[YAML](https://yaml.org/)を使って文法を書いてからplistに変換したほうがスッキリしたと思います。
YAMLはSublimeの文法定義に使われており、とても読み書きしやすいです。

# テーマファイル（*.theme）

このscopeに対して実際に色を与えるのがテーマファイルとなっておりまして、標準テーマを使いたい場合は標準テーマが定義しているscopeを文法定義ファイルで与えると、標準テーマのカラーが紐付きます。

例えば、標準の dark_vs.json だと

```json:標準テーマから抜粋
		{
			"scope": "keyword.operator",
			"settings": {
				"foreground": "#d4d4d4"
			}
		},
```

みたいにして、keyword.operator などが定義されています。
なお、この定義はそれ以下のscope、すなわちkeyword.operator.svやkeyword.operator.hoge.hogeなどを包含していることに注意。

私の場合は標準テーマとは別のカラーリングを実現したかったので、独自のテーマを作っています。
この際、別のテーマをincludeでき、

```json:独自テーマファイルが別のテーマファイルをinclude
{
	"name": "SystemVerilog",
	"include": "./dark_plus.json",
	"tokenColors": [
		{
```

差分だけを定義できてとても便利です。
また、差分を定義する時は、より具体的なscopeを定義してやることで元のカラーリングを保持したまま拡張テーマを定義できます。

例えば、

keyword.operator が標準テーマで定義されており、keyword.operator.sv が拡張テーマで定義された場合、文法ファイルで keyword.operator.sv を定義すると拡張テーマ側のカラーが適用されます。また、*.sv 以外のスコープを使う別の文法では標準テーマのkeyword.operatorが適用されます。

VSCodeに限らないのですが、このテーマ、という概念は言語文法とは独立しているため、こういった仕組みが必要なのだと思われます（言語ごとにカラーテーマを勝手に切り替えられない）。良いようにも、悪いようにも感じる仕様だと思います。

作成したテーマはpackage.jsonに

```json:package.json
    "themes": [
      {
        "label": "SystemVerilog",
        "uiTheme": "vs-dark",
        "path": "./themes/SystemVerilog-color-theme.json"
      }
    ],
```

とすることで有効になります。
ただし、テーマなので拡張機能をインストール後に自身で適用してやらなければいけません。
SlackにURLを貼った時にリンクを展開させない方法

- (なんでも良いのでURLなしの)テキストをいったん投稿する
- 編集してURLを付ける

以上。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
homebrewを使って、yarnをインストールする



yarnをインストール

```
$ brew update
$ brew install yarn
```

.bashrcなどにpathを通す

```
export PATH=$HOME/.yarn/bin:$PATH
```

参考記事
詳しく記載してあるので、こちらを確認する
[yarnを使ってみた](https://qiita.com/drafts/a066286a9035d80b18aa/edit)
Google Developers ML Summit

Google Developers ML Summitへ行ってきたのでメモ

詳細内容は公式サイトを見てください。
[Google Developers ML Summit](https://events.withgoogle.com/google-developers-ml-summit-tokyo-2018/)

#資料
スピーカー：足立昌彦/ Masahiko Adachi(株式会社カブクCEO兼CTO/GDE) 
[モバイル開発者の為のTensorFlow](https://t.co/xElKRxRmML)

スピーカー：田中 洋一郎 / Yoichiro Tanaka(Google Developers Expert (Google Assistant))
[Actions on Google 概要](/speakerdeck.com/yoichiro/actions-on-google-overview)

#ざっくりメモ
## TensorFlowとCloud MLの概要
Googleの考えるAI(人工知能)とは賢いITを作る技術

現在のAIは機械学習(ニューラルネットワーク)

りんごとオレンジの写真の判断方法
色、形等のルールを人間が決めて判断
ITを使用した機械学習では計算機がルールを見つける

###デープニューラルラーニング
GPUを使用して階層化により認識を得る
2012年辺りから出来るようになった

###Cloud ML API and AutoML
Google側で学習済みのAPI、Google側で自動的にやってくれるAPIなど
画像認識、OCRなどのAPIがある

Cloud AutoML
[Cloud Vision](https://cloud.google.com/vision/)
Cloud に画像をアップして学習させれば1日程度で学習する
例：ラーメン次郎のラーメン分類で95％の制度で判別できる

###BigQueryML
SQLの機械学習
数百台のサーバーをネットワークにより超並列処理できる
テラバイトを数十秒で処理
クラウドなので経済性が良い
自前のSQLでも使用可能(他に迷惑をかけない)

###TensorFlow
機会学習の専門家の為のツール(Googleの社内で使われている)
学習終わったモデルは数Mまで小さく出来、それをモバイルへ入れることも可能
例：船の動き(GPS位置情報)から漁船なのかの判断が出来る
例：DOCOMOのタクシー需要予測

#Mobile MLの概要
モバイルデバイスのAPIやラーニングの概要
デバイス上でのマシンラーニング方法

これまではサーバーやGUPで学習していたがスマホなどのデバイス上でのマシンラーニングを行う方が良い事もある
・プライバシー保護：データをサーバーに送らずに出来る
・速度：サーバー上で行うと数秒かかるがデバイス上で行えば瞬時に出来る
・ネット環境へ依存しない：インターネットへの通信を行わない為、通信できない環境でも出来る
・コストが安い：サーバー代、通信代が必要ない

###出来る事
・画像処理
・音声処理
・自然言語
・モーション(デバイスの位置動きなど)
Smart Text Selection：自動的にテキストを選択してくれるもの(Android Oから)
音楽が流れているものを調べて検索
Adaptive battery：ユーザーの使用状況でアプリの優先度を分ける
Google keyboard：ユーザーの入力を自動的に補助
Google Translate：カメラでとったものを翻訳

マシーンラーニングを使用したほうが制度も高く、コストもかからない

アメリカでは2/3のアプリがマシーンラーニングを使用している

##ML Kit
###トレーニング済みのモデルをデバイスに入れて使用する(Base API)
画像の認識
OCR

###Custom Model
TensorFlow Liteの機能をML Kitで動かす

##TensorFlow Lite
TensorFlowはデスクトップ向けのもので、TensorFlow Liteはデバイス向けのもの
推論系に特化して小さくしいる(400KBくらいのサイズ)
どのプラットフォームでも使用可能

マシンラーニングのモデルがどんどん大きくなっているその為モデルの軽量化をしている
・プルーリング：無くてもよいノードをおとして軽量化しモデル圧縮を実現
・量子化：32ビットを8ビットへ落としても問題なければ落としてモデル圧縮を実現
・Distillation(蒸留)：親モデルの結果を真似してモデル圧縮を実現

##Neural Network API（NN API）
フレームワークから使用するとうれしいAPI

##Edge TPU
AIの“推論専用”プロセッサ

#モバイル開発者の為のTensorFlow
発表内容は下記資料
[モバイル開発者の為のTensorFlow](https://t.co/xElKRxRmML)

#ML Kitの概要とBaseAPI
ML KitはIOSとAndroidで使用できるモバイルSDK
[Firebase 向け ML Kit](https://firebase.google.com/products/ml-kit/?hl=ja)

##Base APIs
・テキスト認識（OCR）
・画像のラベル付け
・バーコード スキャン
・顔検出
・ランドマーク認識

端末上とクライド上で動作するAPIがある
端末上で動作するAPIは無料でクラウド上で動作するAPIは有料

###OCR
端末上で出来るのは英数字(ラテン文字)を認識可能
クラウドAPIでは日本語などの言語も対応している
アプリに組み込む場合はある程度読み込むものをフィルタリングしておく必要がある
日本語や中国語などは大きく写っていないと認識できない

###顔検出
同じ顔の人には同じIDがつく
顔の外の輪郭i以外にも目、眉毛、口、鼻などの輪郭もがとれる

###バーコードスキャン
１次元、２次元バーコードの読み込みや同時に複数のバーコードが読み込みも可能

###画像のラベル付け
端末上のAPIは早いがラベルの種類は少ない
クラウド上のAPIはラベルの種類が豊富

###ランドマーク認識
画像から有名なものを認識できるAPI
ランドマーク名や地理座標等を取得可能

##ML Kitの使い方
端末上で使用する場合はアプリインストール時にモデルをダンロードするように設定しておく必要がある
設定しないと初回はエラーが出る

クラウドのAPIを使用する場合は課金設定をする必要がある
raspberry pi 1でtensrorflow lite その18

#概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
ラズパイで、リアルタイム処理してみた。
ヴォイスチェンジャーのつもり。

#結果

https://www.youtube.com/watch?v=bRZ0XFZcDcE

以上。
sqlplusの自動コミット設定

この記事は[mohikanz Advent Calendar 2018 #2](https://adventar.org/calendars/3057)の19日目です。

仕事ですこしやらかしかけたので、メモ代わりに。

## sqlplusのデフォルト設定の罠

sqlplusをデフォルトのまま使用していると、sqlplusからexitした場合、自動でコミットが行われる。

この自動コミット動作の設定として システム変数`exitcommit`が存在する。

## exitcommitとは

sqlplusでexitした場合に自動でcommitするかの設定値。  
oracle11gR2から機能追加。

この設定値のexitは正常終了であり、ターミナル画面を直接閉じて接続を切った場合は異常終了扱いとなる。

## 結局どうしとくのがいいの？
これまでコマンドラインでSQLを使用している場合は、意識して途中で抜けないこと。  
できればデフォルト値を先に修正し、commitされないようにすべき。
Benchmark.jsの実装例


[Benchmark.js](https://benchmarkjs.com/)の実装例

備忘録代わりに

## 実行環境

* Node.js 11.5.0
* benchmark 2.1.4

## コード

callback関数に関するベンチマークはdeferを利用すれば良い

```javascript
const fs = require('fs');
const Benchmark = require('benchmark');

const suite = new Benchmark.Suite;
suite
    .add('readFileSync', {
        fn: () => {
            fs.readFileSync('./testfile.txt', { encoding: 'utf8' });
        }
    })
    .add('readFile', {
        defer: true,
        fn: (deferred) => {
            fs.readFile('./testfile.txt', { encoding: 'utf8' }, (error, data) => {
                deferred.resolve();
            });
        }
    })
    .on('cycle', (event) => {
        console.log(String(event.target));
    })
    .on('complete', () => {
        console.log('Fastest is ' + suite.filter('fastest').map('name'));
    })
    .run({ async: true });

```

## 実行結果

```bash
readFileSync x 38,949 ops/sec ±3.99% (80 runs sampled)
readFile x 9,808 ops/sec ±3.82% (74 runs sampled)
Fastest is readFileSync
```
PowerAppsのバーコードスキャナーについて調べてみた

#PowerAppsのバーコードスキャナーって？
2018年12月にGAされたPowerAppsの新機能で、通常のバーコードのほかに、QRコードも読み取れるアプリを手軽に作成できるというものです。
紹介されているブログは**[こちら](https://memo.tyoshida.me/powerapps/new-barcode-scanner-with-qr-code-capabilities/)**が非常にわかりやすいです。

やったのは、PowerAppsで使っているバーコードスキャナー機能がどのjsにあるのかと、それが何を使っているのか、またついでに埋め込まれているメッセージもちょっと記載します。

#バーコードスキャナーのありか
PowerAppsのjs関連リソースはわりと量がありますが、"Barcode"でリソースを検索するとでてきます。
https://pa-static.azureedge.net/resource/app/2nav9nkc8n8ib/ctrllib/barcodeScanner/js/BarcodeScanner.js
これがバーコードスキャン機能の本体になります。圧縮されているので、ダウンロードして中身を見てみました。（詳細割愛）

```BarcodeScanner.js
               o.prototype.getBarcodePlugin = function () {
                    return this.isPluginSupported()
                        ? cordova.plugins.barcodeScanner
                        : null
                },
                o.prototype.isPluginSupported = function () {
                    return window.cordova && cordova.plugins && cordova.plugins.barcodeScanner
                },
```
なるほど、cordovaのプラグインで動かしているんですね。
https://docs.monaca.io/ja/reference/third_party_phonegap/phonegap_plugin_barcodescanner/
こういう情報を見ると、アプリや機能の隠れた特性がわかったりします。

#おまけ：メッセージ関連
Windows IE11でアプリを開いたら、「サポートされていないよ」というメッセージが表示されたので、ついでに関連メッセージも調べてみました。

 - "BarcodeScannerCompatibilityMessage":"The barcode scanner is not supported in web browser. Try scanning on an Android or iOS device.",
 - "BarcodeSystemWebViewVersionWarning":"バーコードのスキャンを有効にするには、このデバイスの Android System WebView アプリをバージョン 51 以降に更新してください。",
 - "BarcodeChromeVersionWarning":"バーコードのスキャンを有効にするには、Chrome をバージョン 51 以降に更新してください。",
 - "BarcodeDefaultLabel":"バーコード スキャナー",
 - "BarcodeStatusActive":"バーコード スキャナーがアクティブです。カメラはバーコードを継続的にスキャンしています。このページが終了するまでスキャナーは常にアクティブです。",
 - "BarcodeStatusDisabled":"バーコード スキャナーがアクティブではありません。",
 - "BarcodeAlertExisting":"識別済みのバーコードです",
 - "BarcodeAlertNew":"新しいバーコードが識別されました",

この中で参考になりそうなのは、「Chromeをバージョン51以降に更新してください」と「カメラはバーコードを継続的にスキャンしています。」でしょうか。
~~WebのプレイヤーでもChromeの特定バージョン以降なら使えるようです。~~
**[追記]**
Android Chromeでテストアプリを作成しましたが、バーコードスキャナーは利用できませんでした。残念。
git bashでショートカットのパスを取得する

git for windows についてくる git bash で、Windowsのショートカットファイル `*.lnk` のリンク先に移動したい、実行したいといった理由でターゲットパスを取得する方法を探したのでメモ。

## ワンライナー

```sh
lnkpath() { powershell -Command "(new-object -comobject wscript.shell).createShortcut(\"$1\").TargetPath"; }
```

### 使い方

```sh
cd `lnkpath target.lnk`
```
phpwkhtmltopdfで画像が表示できない

以前qiitaの記事を見て導入した際には何の問題もなかったのですが、最近(2019/12)別のシステムに導入したところ、画像が表示できない問題があり、対象方法が分かったので覚え書きします。

https://qiita.com/morisuke/items/88010efca9fc03466c7f

# バージョン

wkhtmltopdf:0.12.5
mikehaertl/phpwkhtmltopdf:2.3.1

# 対処方法

- 画像のパスをフルパス（httpから）で記載
- ip制限をかけていたので画像フォルダのみ解除
 - 理由は不明…
朝来たらPostgreSQLが動かない問題を解決した 

## 問題発生
Rails動かそう。

```
$ bundle exec rails s

PG::ConnectionBad: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

うごかない！

## トラブルシューティング

### PostgreSQLの初期化
ログをみましょう。
<small>※場所は環境によって違うと思います</small>

```
$ tail /usr/local/var/postgres.log

2018-12-19 08:53:41.889 JST [15860] FATAL:  database files are incompatible with server
2018-12-19 08:53:41.889 JST [15860] DETAIL:  The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 11.1.
```

brew upgradeによってpostgresqlのバージョン上がってそれが問題になってそう。
初期化。

```
$ rm -rf /usr/local/var/postgres/
$ initdb /usr/local/var/postgres/ -E utf8
```
### Rails動かします

再度Rails動かします。

```
$ bundle exec rake db:create

FATAL: role "username" does not exist
```

うごかない！

ユーザーを作成します。
```
$ createuser USERNAME
```

権限付与

```
$ psql -d postgres

postgres=# ALTER ROLE USERNAME WITH Superuser;
postgres=# \q
```

db作ってからうごかします

```
$ bundle exec rake db:create
$ bundle exec rails s
```

うごいた！
amazon linuxでdockerとdocker-composeをインストール

何故か

```
# yum install docker
```
で入らなくなっていたのでメモ。

# dockerのインストール
↑のyumを打ったらメッセージが出てくるのでそのとおりに実行。

```
# amazon-linux-extras install docker
```


# docker-composeのインストール
githubからソース落として設置する感じです。
gitをインストールしといたほうがいいですね。

```
# yum -y install git
# curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
```
# docker runが動かない。

```
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
```
こんなエラーが出るので、ec2-userに権限追加。

```
# su - ec2-user
$ sudo groupadd docker
$ sudo gpasswd -a $USER docker
$ sudo systemctl restart docker
```

めでたしめでたし。
2018/12/18  Slack アップデート ステータス消去のスケジュール、アプリ開いていてもモバイル通知、おやすみモード改善など

[The Official Slack Blog](https://slackhq.com/in-case-you-missed-it-improvements-to-status-notifications-and-more)

# ステータスを消去するスケジュール機能

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1796c27c-b8da-b4ee-c022-4d1d46519adb.png)

# モバイル通知をもう見逃さない

Slackアプリを開いていても通知が届くようになったぽい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/487ef045-4c42-db2a-455e-ce50a1230540.png)

# おやすみモード改善

時にはきめこまやかに、よく使いそうなものは簡単に設定できるようになった？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/91ce9896-e811-2e04-fe65-47f4be58f143.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/758de608-7628-1e51-494f-20ebbe777984.png)

# 複数のワークスペースを簡単に移動

エンタープライズプラン限定らしい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/3c5adaea-f4f1-ff1c-d6a8-0a334653506c.png)

# カスタム絵文字の登録が簡単に、リサイズしなくても良くなったらしい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/deea28c5-2278-1811-3246-c15bfd2e6c55.png)

# Microsoft One Drive と連携できるようになったらしい

簡単なステップで。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
動いた、FirebaseのCloud Messaging(FCM) for ウェブ(Javascript)

## 概要
FCMなんとか動いた。忘備録。
#### 環境
* Apache (Amazon Linux)
* Chrome (ver 70)

## とにかく試す
#### 手順
* Firebaseプロジェクトの作成
* サンプルコードの設置
* 送信処理の実行

### Firebaseプロジェクトの作成
Firebase Console (https://console.firebase.google.com) にアクセスして、Googleアカウントでログイン。
プロジェクトの追加。Sparkプランにしておくと月額無料。
プロジェクトのクラウドメッセージングにある、サーバーキーのトークンと、送信者IDを次で使う。
![firebase-messaging.png](https://qiita-image-store.s3.amazonaws.com/0/72911/05477884-d01e-0936-d02d-b42c0b339b99.png)

### サンプルコードの設置
ServiceWorkerとしてWebブラウザのバックグラウンドで動くJavascriptを利用するので、httpsなWebサーバに設置する。
SENDER_ID(2箇所)とSERVER_KEYを上記で取得したものに置き換える。
firebase-messaging-sw.js だけはWebルートに設置する、ファイル名も固定。

### 送信処理の実行
FCMのAPIにポストする。下記phpでポストした。

#### サンプルコード
* test.html
* firebase-messaging-sw.js
* send.php

```html:test.html
<script src="https://www.gstatic.com/firebasejs/5.7.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/5.7.0/firebase-messaging.js"></script>
<script>
  // Initialize Firebase
  var config = {
    messagingSenderId: SENDER_ID
  };
  firebase.initializeApp(config);

  // Retrieve Firebase Messaging object.
  const messaging = firebase.messaging();

  function initFirebaseMessagingRegistration() {
      return messaging
          .requestPermission()
          .then(function () {
              console.log("Got notification permission");
              return messaging.getToken(); // これがServiceWorkerを登録(firebase-messaging-sw.js)
          })
          .catch(function (err) {
              console.log("Didn't get notification permission", err);
          });
  }
</script>
```

```javascript:firebase-messaging-sw.js
importScripts('https://www.gstatic.com/firebasejs/5.7.0/firebase-app.js')
importScripts('https://www.gstatic.com/firebasejs/5.7.0/firebase-messaging.js')

var config = {
  messagingSenderId: SENDER_ID
};
firebase.initializeApp(config);

self.addEventListener('push', event => {
  if (event.data) {
    console.log('This push event has data: ', event.data.text());
  } else {
    console.log('This push event has no data.');
  }

  const dataJson = event.data.json();
  const notification = dataJson.notification; 
  event.waitUntil(
    self.registration.showNotification(
      notification.title,
      {
        body: notification.body,
        icon: notification.icon
      }));
});
```

```php:send.php
$httpHeader = [];
$httpHeader[] = 'Authorization: key='.SERVER_KEY;
$httpHeader[] = 'Content-Type: application/json';

$notification = [
    'title' => "メッセージサンプル",
    'body' => "サンプルメッセージです。",
    'icon' => '/logo.png',
];

$to = $toToken;
$url = 'https://fcm.googleapis.com/fcm/send';

$options = [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => $httpHeader,
    CURLOPT_POSTFIELDS => json_encode(compact('notification', 'to')),
];
$curl = curl_init($url);
curl_setopt_array($curl, $options);
$exec = curl_exec($curl);
if (empty($exec)) {
    $info = curl_getinfo($curl);
    curl_close($curl);
    echo "Error !!".PHP_EOL;
    var_dump($info);
}
else {
    curl_close($curl);
    var_dump($notification);
    echo "Success !!".PHP_EOL;
}
```
小ネタ：JSFiddleのスニペットを簡単にダウンロードする方法

※超小ネタな上にググれば出てくる情報なのですがいつも忘れてしまうので自分の記事で書いておく事にしました。

## ０．初めに

私はエンジニアではないただのドシロウトです。

* ドシロウトなのでJavaScriptは良く利用します。
* ドシロウトなのでプログラミングの能力は低いです。
* ドシロウトなので[Codepen](https://codepen.io)、[JSFiddle](https://jsfiddle.net/)などスニペット共有サイトのJSをよくパクリます…(^_^;)

Codepenのダウンロードは画面上にExportボタンがあるので簡単です。

![codepen](https://i.imgur.com/snuxYBq.jpg)

JSFiddleにはExportボタンがないのでダウンロードしたい時にいつもググってました。

## １．元記事

ググればでてくる情報なので英語が苦にならない方は以下の記事をご覧ください。

Is there a download function in jsFiddle?
https://stackoverflow.com/questions/9851878/is-there-a-download-function-in-jsfiddle

この記事を読めばここ以下の内容は不要です。

## ２．一応説明

たまたまJSFiddleのスニペットが貼ってあった以下の記事を使って説明します。
（Windows７、Chromeでのやり方の説明です。）

任意の背景色に対して読みやすい文字色を選択する方法
https://katashin.info/2018/12/18/247

この記事に貼ってあるスニペットを「Edit in JSFiddle」で開くと以下の画像のようになると思います。

![JSFiddle1](https://i.imgur.com/sJao00U.jpg)

この画面のURLの後ろに/showを付けます。

https://jsfiddle.net/ktsn/s0pdmb6c/
　　　↓↓↓↓↓↓
https://jsfiddle.net/ktsn/s0pdmb6c/show

以下の画像の通り右下のフレームが表示されます。

![JSFiddle2](https://i.imgur.com/u5NITtJ.jpg)

この画面で右クリックで以下の画像の通り「フレームのソースを表示」を選択します。

![JSFiddle3](https://i.imgur.com/KxQUwd2.jpg)

ソースが表示されるのであとはコピペするだけです。

![JSFiddle4](https://i.imgur.com/nlR8rnB.jpg)

## ３．おわりに

当たり前で誰でも知ってるのかも知れませんがドシロウトの私には長年の謎でした…(^_^;)

私みたいな初心者の方に役立てばいいなと思い書きました。

以　上
1年間で触れたものたち

はじめまして。入社して２年目の田村です。
最近は、ゴブリンの活躍がすごいですね。（貴族も含みます）

この記事では、自分が一年間で新しく何を学んだのかという簡単に振り返りします！


## データ分析系
### Elasticsearch
データの検索と分析をRESTfulにできるやつ。
例えば、頻度の多いエラーメッセージTOP5とかとかが簡単に集計できます。
とりあえず、分析したいデータを貯める場所として活用しています。

一分間で異常にエラー件数が多かった場合にSlack通知という自作プログラムも作ったりしました。（[Elastalert](https://github.com/Yelp/elastalert)使えば問題ないですが、自分でミニマム柔軟に作りたいって時あるじゃないですか。それです）


### Logstash
データ収集し加工出力する。

```
データ源泉 -> データ加工 -> 出力先
```

1. データ（DB、fileなどから取得）
2. データ加工（数値に変換、IPからGeoIP情報、UserAgentを分析しやすく加工）
3. データ出力（ElasticSearch、stdout、fileなど）

DBにSQL発行して、結果をElasticSearchに！っというのも簡単にできちゃうので楽です。
いろいろな情報をPipeline利用して収集しています。


### Kibana
ElasticSearchのデータをいい感じに可視化してくれるWEBアプリケーション。
エラーメッセージ別割合の円グラフ、線グラフを簡単に作成できます。

[公式サイト](https://www.elastic.co/jp/products/kibana)を確認すれば、どんな感じかわかるかと思います。

### Metricbeat
システムやサービスの情報をとにかく収集してElasticsearchとかに出力。
CPUとかメモリ使用量を簡単に収集できます。


## フロントエンド系
### Nuxt.js
Vue.jsアプリケーションを簡単に構築できるフレームワーク。
よくNuxtという単語が目についていたので、使ってみました。

PythonスクリプトをWebサイトから起動するために利用しました。


### Pug
HTMLを効率的に書くためのテンプレートエンジン。
インデントで階層を表すため、わかりやすい。

```html
main
  div
    a.hoge(href="/hoge") ただのhogeボタン
```


### Stylus
AltCSS。
Pugと同じくインデント大事なため、楽。

```css
.hoge
  color black

  &:hover
    color red
```

### Bulma
CSSフレームワークの一つ。
名前気に入ったので使ってみました。


## バックエンド系
### Tornado
ノンブロッキングなPythonのWebフレームワーク。
WebSocket標準で入っており、オブジェクト指向ベースで記述します。

Nuxt.jsから叩くAPI作るために利用しました。


### Selenium
WebアプリケーションのUIテストツール。（たぶんバックエンド系よりだと思います。）
ブラウザで操作できることなら何でも自動的に操作させることができます。

テスト自動化とか、コンソールエラー警察したりしてました。


## これから
- 今まで感覚でコーディングしていたので、より良いコーディングができるような知識を学んでいく。リーダブルコードとか読んでみる。
- もっとNeovimを快適に使えるように設定する！
- 最近Linuxをいじいじしていないので、いじいじしたい。なんとなくconky-i3statusbarとかdmenuとか使っていたので、PolybarとかRofiに変更してみたりしようと思います。conkyもいい感じに表示させるように変更してみようかと思ってます。

現在のデスクトップ画面（昔のスクショですが。。。）
![desktop.png](https://qiita-image-store.s3.amazonaws.com/0/218282/3c27e736-7361-6e47-3baa-0c4f559de86f.png)


## さいごに
直近で興味あるのは、スマートスピーカーとVRですね。
なんか面白いことできないかなーってたまに考えてます。
GithubのPRを直接編集したりするあのブラウザ検索をハックしてくる奴はなんていうの？ヘルプは？ショートカットは？


# 追記、もしかして

これ‥？

[Using keyboard shortcuts - User Documentation](https://help.github.com/articles/using-keyboard-shortcuts/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ec94865c-233c-6dc9-6f6a-d9f60499887d.png)


```
Source code editing
Keyboard Shortcut	Description
control f or command f	Start searching in file editor
control g or command g	Find next
shift control g or shift command g	Find previous
shift control f or command option f	Replace
shift control r or shift command option f	Replace all
alt g	Jump to line
control z or command z	Undo
control y or command y	Redo
For more keyboard shortcuts, see the CodeMirror documentation.
```

#ヘルプ

ぐぐっても
なんのヘルプも
でてこない

こいつ？ だがほとんど何も書かれていないレベル

[Editing files in your repository - User Documentation](https://help.github.com/articles/editing-files-in-your-repository/)

#名前

オンラインエディタ

とかいうらしい

#こいつのこと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8ef3cc02-eab3-1961-af9f-af09711ca8c2.png)

#ブラウザ検索をハックして上書きしてきやがる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e572a1ec-8bec-0aac-a59a-a5591a652e70.png)

#「次を検索」ってどうやるの？

VimキーとかCommand+Enterとかいろいろ打ってみたけどうまくいかない。

#教訓

ユーザーの大事なブラウザ基本機能、OSやソフトウェアの基本バインドをハックしないで！上書きしないで！








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PDF に白塗りをする (python3)

既存のPDF ファイルに 矩形の白塗りをする方法です。

```py:blank_pdf.py
#! /usr/bin/python
#
#	blank_pdf.py
#
#						Mar/26/2023
#
# ------------------------------------------------------------------
import sys
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
from reportlab.pdfgen import canvas
import reportlab.lib.colors as color

# ------------------------------------------------------------------
def blank_square_proc(pdf_canvas,xx,yy,width,height):
	pdf_canvas.setFillColor(color.white)
	pdf_canvas.rect(xx, yy, width, height,stroke=False, fill=True)
# ------------------------------------------------------------------
def blank_proc(pdf_canvas):
#
	blank_square_proc(pdf_canvas,10,10,600,180)
#
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
file_in = sys.argv[1]
file_out = sys.argv[2]
sys.stderr.write(file_in + "\n")
sys.stderr.write(file_out + "\n")
#
pdf_canvas = canvas.Canvas(file_out)

pdf_obj = PdfReader(file_in,decompress=False)

page = pdf_obj.pages
pp = pagexobj(page[0])
pdf_canvas.doForm(makerl(pdf_canvas, pp))

blank_proc(pdf_canvas)

pdf_canvas.showPage()
pdf_canvas.save()
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./blank_pdf.py in01.pdf out01.pdf
```

## 確認したバージョン

```text
$ python --version
Python 3.10.10
```
PMOとかQAって知ってますか？

『PMO』とか『QA」って聞き慣れないキーワードだと思います。
知ってる人は知ってるし、知らない人は全く知らないマイナーな職種で、それぞれが企業の抱えるリスクの管理や回避を目的とした職種の名前です。
​
聞き慣れないのは勿論マイナーな職種だからなのですが、そのマイナーでニッチな職種を、「もう少し身近になって欲しい」という想いからご紹介します。
​

---
■PMOやQAって？

PMOやQAは企業の規模や文化によって千差万別なので、先ずはIT業界でのPMOQAの一例を紹介します。 ​
 
先ずPMOは、Project Management Office（プロジェクトマネージメントオフィス）の略で、プロジェクト管理を役割とする部署やチームのこと。
プロジェクト毎に配置されるプロジェクトリーダー（PL）に比べ、複数プロジェクト（or 全プロジェクト）にひとつ配置され、複数プロジェクトを対象にした管理や改善作業を役割とします。
（実際やること）
　　◇社内の全プロジェクト状況を可視化したりします（モニタリング）
　　◇危険なプロジェクトの事前検知したりします
　　◇危険・炎上プロジェクトのサポートしたりします
　　◇経営層向けにプロジェクト報告をしたりします
　　◇業務プロセス改善のPDCAを運営したりします
　　◇業務プロセスの標準化（基準つくり）なんかもしたりします
​
次にQAは、Quality assurance（品質保証）の略で、「モノ」や「サービス」などの品質を保証する部署やチームのこと。
製品やサービスの品質を担保するための開発サポートから、検証、リリース品質の見極めを役割とします。
（実際やること）
　　◇テスト計画から実施、テスト結果のレポートまでしたりします
　　◇リリース基準の策定と評価とかもします
　　◇テストの外注化やオフサイト化とかもしたりします
　　◇テストマネージメント全般もしたりします
　　◇テスト研修の講師とかもできます
　　◇テスト工程の改善（PDCA）なんかもしたりします
　　◇開発工程の改善（PDCA）なんかもしたりします




---
■PMOやQAのアプローチ

PMOやQAは企業の規模や文化によって千差万別・・・なのは、導入方法やアプローチも一緒です。

千差万別といっても、やり方として大きく二つに分けることができ、多くは「リスク管理」か「品質管理」に分けられているのかな？と感じています。

簡単に言うと、「リスク管理」は悪いところを把握するアプローチで、それに対して「品質管理」は良いところを守るアプローチです。
ちなみに、どちらも管理する必要があるのは勿論なのですが、どちらに「軸」を置いているか・・・ということでご理解いただきたいです。

IT業界で言うと、一定基準に達したゲームやサービスをリリースして、後から不具合を対処していくのは「品質管理」に傾いたアプローチ。
それに対して、現時点でどんな不具合が「あるか？」「潜んでいるか？」を重要視して、それが無くならないとリリースが難しい、例えば医療系や金融系などのトラブル発生が許されないサービスなどが「リスク管理」に傾いたアプローチかと認識できます。

以上を踏まえて、今回は「リスク管理」寄りのお話をしてみます。

そもそも、PMOやQAと「リスク管理」ってなんか関係あるの？と思いますよね。

PMOはプロジェクト品質を担保する業務ですが、品質を担保するということは品質を担保できない部分を知ること・・品質を担保できないリスクの所在を管理しているということに繋がります。
そしてQAもまた製品やサービス品質を担保する業務・・・なので、PMO同様に品質リスクを管理している・・・といえます。
​

ここまできて、ようやく本題のアプローチについて書いてみます。

PMOやQAでのリスク管理のアプローチは、最近お馴染みの「可視化」「見える化」で、リスクを数値化してモニタリングして、ボーダーラインを超えたらアラートを出すのが一般的と認識しています。
PMOでは、プロジェクトの作業プロセスに対して、QCD（品質/費用/コスト）をモニタリングして、警告したりヘルプしたりします。
QAでは、プロダクトの開発プロセスにどんなリスク要素が存在するかをモニタリングしますが、これが意外に多くて・・・・一例では、開発特性、開発メンバースキル、開発の難易度、お馴染みのバグ数などなど・・・挙げるとかなりありますので、割愛しますが、その状況に応じて警告したりヘルプしたりリリースストップしたりします。

ということで、前置きの方が長くなってしまいましたが、最後はIT業界以外でもお馴染みの「見える化」と「モニタリング」になってしまい、「知ってるよ」って思った方がいたらゴメンナサイm(__)m
ただ、PMOとQAのお仕事の存在や、リスク管理との関係性が少しでもわかっていただけると嬉しいです。

以上、書き込みが遅れてしまいゴメンなさいm(__)m
BashでプロンプトにカレントディレクトリとGitで管理していればGitのブランチ名を表示する

branch名を取ってくる際に空文字だったら表示しないようにしておく

``` bash:~/.bash_profile
git_branch() {
  BRANCH=$(git branch 2>/dev/null | sed -ne "s/^\* \(.*\)$/\1/p")
  if [ -n "$BRANCH" ]; then
    echo "($BRANCH)"
  fi
}

export PS1='\[\e[1;32m\][\w]\[\e[m\]\[\e[1;31m\]$(git_branch)\[\e[m\] '
```

こんな感じに表示される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/16612/ed492255-7b08-79c6-20aa-fe83c1c8fed8.png)
【React Native】Expoでタブfocus時のテキストカラーを変える方法

Expoを使ってReact Nativeの勉強を始めましたが、しょっぱなからつまづいたので覚書です。

##タブ選択時初期状態
まずはデフォルトの状態がこちら。
<img width="375" alt="タブ選択時の色変更前デフォルト状態" src="https://qiita-image-store.s3.amazonaws.com/0/105959/96953812-0910-5b26-5ac3-be9a53a98586.png">

↑選択しているタブ「Home」の**アイコン、テキストカラーが青**です。

これを別の色に変えていきます。

### タブ選択時(focus)のテキストカラーを変える
/navigation/MainTabNavigator.jsを編集します。

```ruby:MainTabNavigator.js編集前
export default createBottomTabNavigator({
  HomeStack,
  LinksStack,
  SettingsStack,
});
```
↑の部分を↓

```ruby:MainTabNavigator.js編集後
export default createBottomTabNavigator({
  HomeStack,
  LinksStack,
  SettingsStack,
},{
  tabBarOptions: { activeTintColor:'red'}, // 追加箇所
});
};
```
に変更します。
**tabBarOptions: { activeTintColor:'red'},**
を追加しました。redのところに好きな色を入れてください。

すると…

<img width="375" alt="タブ選択時の色変更後" src="https://qiita-image-store.s3.amazonaws.com/0/105959/b9798787-2b6b-94da-54f8-9abfb83dc6ab.png">

↑選択時（focus）時の色が変わりました！

#### おまけ：　アイコンの色も変える
```ruby:constants/Colors.js
const tintColor = '#2f95dc';
```
↑「#2f95dc」を変えると

```ruby:constants/Colors.js
tabIconSelected: tintColor,
```
に色が入るので
<img width="375" alt="タブ選択時のテキストとアイコンの色を変える" src="https://qiita-image-store.s3.amazonaws.com/0/105959/74b5f714-5117-56e3-9cc9-dcdeb02ed55b.png">
青いアイコンがピンクになりました！！

---
参考：https://github.com/react-navigation/react-navigation/issues/1781
jsdoでvega-lite

#概要

jsdoでvega-liteやってみた。

#サンプル0

http://jsdo.it/ohisama1/WK53

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/W/K/5/WK53.jpg?t=1545184693)

#サンプル1

http://jsdo.it/ohisama1/uDlv

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/u/D/l/uDlv.jpg?t=1545184779)

#サンプル2

http://jsdo.it/ohisama1/YSJV

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/Y/S/J/YSJV.jpg?t=1545184975)

#サンプル3

http://jsdo.it/ohisama1/uX0Y

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/u/X/0/uX0Y.jpg?t=1545185063)

以上。
来るVRM黄金時代に備えてVRMキャラの身長差をどうにかしよう(withUnity)

#はじめに
VRM、来てますね。VRoidから始まりVカツ、カスタムキャストまでVRMに対応するらしく、アバターを簡単に自作出来る時代が目の前に迫っているって感じです。12月にはVroidHubもβ版が出るとか出ないとかなので(なんとVroid以外もVRM全般いけるらしい、太っ腹〜〜〜〜)マジで黄金時代来そうです。（執筆時12月中頃）
というわけで今回はVRMを使って自作したアバターを使えるようなアプリをUnityで自作する際に問題となる、「キャラごとの身長差」について考えてみようと思います。
#VRMの身長差って？
VRMではヒューマノイドであること以外特にモデルの形状に制約はありません。つまり猫耳を生やしたり尻尾を付けたり小さい妖精さんを作ったり巨大娘を作ったりすることが出来るんですね。
ここで気になってくるのがキャラクタの身長です。例えば1.5mのキャラをターゲットに組んだゲームを5mのキャラや0.3mのキャラが遊ぶときにIKだったりワールドの大きさだったりカメラアングルだったりとかで様々な問題が出てきます。
#じゃあどうするの
本当はそのキャラの身長を考慮してゲームシステムを分岐させた方がいいんですけど、今回はサイズを一定の範囲に保つ方法を考えてみようと思います。
#どうやって実装しよう
##Renderer.boundがあるじゃん
UnityのRendererコンポネントにはboundというモデルをすっぽり覆う最小の立方体に関する変数があります。
これを使えばキャラの身長を取ることができるんじゃないか？
確かにいいアイデアではありますが、ケモ耳の先っぽや天使の輪やアホ毛の一番上などまで図って計測すると骨格的には同じサイズでも頭の装飾品によって差が生まれ、頭に装飾品が付いていキャラは身長が小さめになってしまいます。結局不自然になってしまいそうですね。残念ながら没でしょう。
##Humanoidの設定を使おう
VRMにはMecanimのモデル設定がHumanoidになっているのでAnimatorコンポネントから身体の各部位のボーンが取れます。
http://rinor.hatenablog.com/entry/2015/05/21/193216
ということは頭のボーンの位置と足のボーンの位置を取得してやって、補正をかけてやれば正確な身長が取得できそう…　実際にコードを書いてみましょう
###コード

``` VRMSizeFixer.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class VRMSizeFixer : MonoBehaviour {
    public float minSize;//調整後の最小サイズ
    public float maxSize;//調整後の最大サイズ
    public GameObject VRMModel;//対象のモデル
    private Transform transSelf;
    private Animator anime;
    private Transform transHead;
    private Transform transFoot;
    private float defaultHeight;
	// Use this for initialization
	void Start () {
        anime = VRMModel.GetComponent<Animator>();
        transSelf = VRMModel.GetComponent<Transform>();
        transHead = anime.GetBoneTransform(HumanBodyBones.Head);
        transFoot = anime.GetBoneTransform(HumanBodyBones.RightFoot);
        defaultHeight = transHead.position.y - transFoot.position.y;
        Debug.Log(defaultHeight);
        if(defaultHeight < minSize)
        {
            float multiply = minSize / defaultHeight;
            transSelf.localScale = new Vector3(multiply, multiply, multiply);
        }else if(defaultHeight > maxSize)
        {
            float multiply = maxSize / defaultHeight;
            transSelf.localScale = new Vector3(multiply, multiply, multiply);

        }

    }
	
	// Update is called once per frame
	void Update () {
		
	}
}
```
VRMModelに身長調整の対象としたいVRMのモデルを設定してください。そこからHumanoidボーンの座標を得て一定の範囲の身長に押し込めています。これでうまく身長を設定することができそうです。

#最後に
これでモデルを一定の身長に制限して意図したスケール感でコンテンツを作ることができそうです。あ、妖精さんフェチと巨大娘フェチの人ごめんなさい。この辺の調整はうまいことできるといいのですが…。VRMで推しの出てくるゲームをつくっていきましょう。以上。
【rails5】コンソールで特定のカラムの値を編集する

#【コンソールで特定のカラムの値を編集する】

現在取り組んでいる課題があり、その中で学んだことをメモにしていきます。

コンソール内で特定のカラムを一括編集したいと思い、そのやり方を学びました。

```
カラムのあるテーブル名.update.all ['編集したいカラム名 = ?', 変更後の値]
```

例
shopsテーブルのnameカラムをnilにする

```
Shops.update_all ['name = ?', nil]
```


テーブルの全てのデータを削除する場合（関連付けも削除する場合はdestroy)

```
テーブル名.delete_all
```

例
shopsテーブルの全てのデータを削除する

```
Shops.delete.all
```

で出来ました。
Go開発で主観的に便利なツールたち(もしくはvim-goの紹介)

Go開発における便利なツール、パッケージたちをまとめてみました。
主観コメント付きで、抜け漏れは色々あるかと思います。
ちなみにほとんど全て「それvim-goに入ってるよ」状態です。
Goのツールを紹介してるんだかvim-goの紹介してるんだかわかりません。

## エディタ、IDE

使ったことがあるやつだけ。Visual Studio Codeが人気と聞くけど使ったことないので詳細は不明。atomやその他でGoを書く気にはなれない。

### vim-go(vimプラグイン)

どこぞの調査ではvimがGopher一番人気らしい。(ソースは忘れたけどVim寄りのサイトなので控えめに聞いてほしい)
控えめに言って素晴らしすぎるのでGopherはみんなVimmerになれば良いと思う。
バラバラだったgo関係のvimプラグインを１つにまとめたものらしい。
これから紹介するツールもだいたいvim-goで使える。

### Goland

GoglandとGolandをよく間違える。
私が使っていたのは有料化前のベータ版までだが、JetBrainsはやはりいい。
JVM系言語のようなvimだと辛い言語を書くときに利用する。
なかなか高めだがそれだけの価値はある。
vimプラグインのインストール時に黄色いビックリマークの危険サインついてて笑った。

## Linter, Formatter、静的解析ツール系

### go fmt

宗教戦争を起こさずにすむツールが言語自体にくっついてるのが素晴らしい！
昔、fmtの気にくわないところを手動で直していた先輩がいたが、やめてほしかった。
fmtってフムトゥって読むらしいね。
vim-goでもgolandでも、保存時の実行機能は付いてる。
ロクでもないプロジェクトに入ると「go fmtを実行した」ってコミットがある。

### gometalinter

これから紹介する静的解析ツール類をひとまとめに実行するもの。
もちろんvim-goに入ってるよ。

### goimports

go fmtの(だいたい)上位互換。
fmtしながら、インポート管理もしてくれる。

### golint, go vetなど

静的解析ツールの代表的なもの。
詳しくはgometalintのREADMEを読むと幸せになれる。

## ドキュメントツール(go doc)

ソースコードのコメントとソースコード自体からドキュメントを生成する。
ものすごく便利。

## 依存関係管理(dep)

色々あったけど、今はdep。
公式ツール。
Goが初期の理想を諦めた結果かもしれない。
依存パッケージを特定のコミットで固定するやつ。
詳細はググってほしい。

## デバッグ(delve)

これしか使ったことないのでdelveだけ紹介。
1行ずつ実行したり変数の中身見たりするあれ。
もちろんvim-goが対応している。

## テスト

個人的にGoに組み込まれているやつだけでいいと思っているのでassert系の紹介はなし

### go test

ツールじゃなくて言語機能だけどgoのテスト思想は個人的に好き。

## go tool cover

上記go testのオプションで出力したC0を綺麗に表示してくれる。
個人的に見た目が好きなツールなので紹介。
vim-goが対応しており、コマンド１つでソースが赤と緑に変わる。

## まとめ

多分紹介忘れありますが、仕事の時間なので一旦ここで。
リファクタリングツールはのちに追記します。
編集リクエストかコメントを投げていただければ増やしていきます。
Elasticsearch API を VisualStudio Code から呼ぶ

この記事は、Elastic stack AdventCalendar 2018の以下の記事を見て脊髄反射で書いております。

元ネタがこちら　「[Elasticsearch API を emacs buffer から呼ぶ](https://qiita.com/fibo/items/7a7618df9cbd877eee8c)」

# はじめに

ElasticsearchのAPIを叩く環境としては、KibanaのDev Toolsが起源にして頂点だと思うところです。
が、上述のemacsの記事を見て、VSCodeでも誰かやってるんじゃないの？　と思い調べてみた。


# Let's try!!!

好きな言葉は「try again, again, again until you succeed.」（うまくいくまで試せ）です。

## 拡張を入れる

今回は、ググって最初に見つかった「Elasticsearch for VSCode」を入れてみます。

拡張はここからインストールしました。
https://marketplace.visualstudio.com/items?itemName=ria.elastic

![1.png](https://qiita-image-store.s3.amazonaws.com/0/111676/11fa3f49-8c79-8f25-6916-1819ed6c50b1.png)


## 新規ファイルの作成

初回に拡張子をesとするファイルを作成すると、どこのElasticsearchにつなぐかを聞くダイアログが表示されます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/111676/edc09721-8a74-d4f6-144c-9472e432585a.png)

localhostがデフォルトでは指定されています。
必要であればここを変更しときましょう。

余談ですが、VSCode右下に表示されるファイルの種別みたいなところ。
「ElasticSearch」になってますね。

## クエリを実際に流してみよう

ctrl+Enterかalt+Enterでクエリを発行することができます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/111676/9d7635ec-450c-d382-43dc-6532086a9c4d.png)

赤枠で括ったところを見てください。
「▼Run Query」と書かれているところをクリックすることでも、クエリを発行することができます。

「Auto Indent」をクリックすると、jsonを整形してくれます。

クエリ作成途中など、jsonとして不正の場合は、「Invalid json」と教えてくれます。

# まとめ

この拡張のRoadmapでは、以下の内容が書かれています。

- Work with multi host
- User Authentication
- IntelliSense like kibana autocomplete

KibnaのDev Toolsでは、index名の補完をはじめ、入力補完が強力です。
↓　こういう感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111676/5e6cba55-1211-3502-b9a4-5ec8b718cb7f.png)


こちらの拡張は、まだそれが提供されていないです。

クエリをある程度知っていて、ササッと書ける人、
あるいは、既にクエリが用意されていて、curlコマンド叩くのが面倒、VSCodeで流したい人であれば使えそうです。

では、最後に定番のコピペを。
「諸君、私はviが好きだ」
Webサイトの退会について考えてみた

# 生存時間分析してみた
非実在性Webサイトの入会データを基に、生存時間分析っぽいことをしてみました。
https://ja.wikipedia.org/wiki/%E7%94%9F%E5%AD%98%E7%8E%87%E6%9B%B2%E7%B7%9A

# データ
ある時点でサイトに入会した人が対象
退会までにかかった日数を生存時間とした。退会してない人は打ち切りとして扱った。
年齢・性別とか影響を与えていそうなセグメントの情報を一緒に採って使ったよ。
非実在性Webサイトなので、無問題だね。

# 方法
~~なんかもうよく覚えてないのでデフォルトの~~カプラン・マイヤー推定量を使った。
ノンパラメトリックな推定量だから、まあ前提とか考えなくていいからいっかな。

# 結果
なんかいくつか見てみたけど、パッと見わかりやすくておもしろげなのを挙げるね。
縦軸が生存割合で横軸が経過日数。30日後生存確率みたいに思ってもらえればいいかな。
### 年代ごとにみた生存時間
10代から80代までにデータを分けて生存曲線を描いてみたよ。80代？とか思うけど、入力フォーム上1930年まで選択できるから仕方がないネ。
![a2abc94d-7773-08b4-19a4-9772e3b16515[1].png](https://qiita-image-store.s3.amazonaws.com/0/56916/fb484f4c-fd3a-7be2-eb9b-26a4ba0efd9d.png)

ざっくり見た感じ登録から5日間くらいは退会者が出ていないね。逆に言うと5日過ぎたら退会していくねー。**とりあえず5日で飽きるっぽい。**

5日を過ぎたあたりから退会者がボロボロ出ていくねー。特に10代の生存曲線は一番下にきてるねー。特に10日過ぎたあたりからぐわっとやめてくね。10日もしたら興味を失っちゃうのかな？**10代は飽きやすい。**

全体的な傾きを見ると大きく傾きが変わったりはしていないね。大体一定の割合でやめて行っているね。いつ辞めるかって点において時間に依存したりはしていないみたい。

### ほかの切り口
男女別とか親がいるかどうかとかでもみてみたよ。違いはあったけど、「だから？」みたいな感じなので割愛。
もうちょっと踏み込んでcox回帰とかもしてみたけど、やっぱ年齢性別とかが退会率に利いてくるねー。まあ、当然といえば当然。

# 感想
データ多いっていいなあ。医療系のデータ弄ってた頃はデータ数が50とかだったけど、今回50000以上あったよ。大抵の検定は大体有意になるから逆に悩むね。
Windows10への移行時にやっておくといい事

この記事は[エイチームブライズ/エイチームコネクト/エイチーム引越し侍 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/hikkoshi) 20日目の記事です。

2019/01/07 追記

# Windows10への移行時にやっておくといい事

デスクトップPCのシェアの多くを占めているWindows7ですが、サポートが2020年1月14日に終了されてしまう事が発表されています。
そのため、2019年内にWIndows10に乗り換える方も多いのではないでしょうか。
今回はWindows10を新規で設定するときに、最初にしておくべきだと思う事を書きたいと思います。
※あくまで個人的に必要だと思っている事なので、必ずやらなければいけないものではありません。

- Cortanaの無効化
- OneDriveの無効化(利用停止)
- SuperFetchの無効化
- 拡張子の表示
- 隠しファイル(フォルダ)の表示
- Thumbs.dbの無効化
- 画面端へのドラッグ時の最大化の無効化

## Cortanaの無効化
Cortanaは音声認識機能付きのアシスタント機能でSiriのような機能なのですが、デフォルトで有効になっています。
有効利用している人もいるかもしれませんが、少なくとも私は使った事がないですし、今後も使うつもりがありません。
さらにCortanaは有効化しているだけでPCが重くなってしまい、特に低スペックのノートPCやタブレットPCで顕著になります。
そのため、使わないのであれば無効化してしまうのが望ましいです。

1. 検索ボックスから「gpedit.msc」を起動
2. コンピューターの構成 > 管理用テンプレート > Windowsコンポーネント > 検索
3. 「Cortanaを許可する」を「無効」にし、OK（適応）
4. 再起動

## OneDriveの無効化(利用停止)
OneDriveは便利なオンラインストレージなのですが、環境によっては平気でディスクトラフィック100％になってしまいます。
特にPCが低スペックかつ無線LAN接続であるのこと多いノートPCやタブレットPCでは顕著になります。
使用する場合は仕方が無いですが、使わないのであれば無効化してしまうのが望ましいです。

1. 検索ボックスから「gpedit.msc」を起動
2. コンピューターの構成 > 管理用テンプレート > Windowsコンポーネント > OneDrive
3. 「OneDrive を記憶域として利用できない様にする」を「有効」にし、OK（適応）

## SuperFetchの無効化
SuperFetchはキャッシュメモリ管理によりアプリケーションの起動を早くしてくれる機能ですが、環境によっては遅くなってしまう場合があります。
もしPCが重く感じたら、試しに停止してみましょう。
※本来は高速化するための機能なので、環境によっては停止により遅くなります

1. Windowsキー+X > コンピューターの管理 > サービスとアプリケーション > サービス > Superfetch
2. 「スタートアップの種類」を「無効」にし、OK（適応）

## 拡張子の表示
Windowsではデフォルトで拡張子は省略されて表示さらますが、エンジニアの業務上表示しておいてくれた方がうれしい場面が多々あります。
この拡張子表示ですがWIndows10ではデフォルト非表示のため、表示するように設定変更をします。

1. エクスプローラーのツールバー > 表示
2. 「ファイル名拡張子」にチェック

または、

1. エクスプローラーのツールバー > 表示 > オプション > 表示
2. 「登録されている拡張子は表示しない」のチェックを外す

## 隠しファイル(フォルダ)の表示
Windowsではデフォルトで隠しファイルは非表示となっていますが、作成した隠しファイルが見えないのでは開発に支障がでてしまいます。
また、後述するThumbs.dbも隠しファイルの一種で見えない事には消すのも手間です。
そのため、隠しファイルの可視化をしておいて方が良いです。

1. エクスプローラーのツールバー > 表示
2. 「隠しファイル」にチェック

または、

1. エクスプローラーのツールバー > 表示 > オプション > 表示 > ファイルとフォルダーの表示
2. 「隠しファイル、隠しフォルダー、および隠しドライブを表示する」にチェック

## Thumbs.dbの無効化
Thumbs.dbはフォルダ内の画像の縮小表示を高速に行うためのキャッシュファイルです。
有用ではあるのですが、フォルダ内の画像をまとめてサーバーにアップするときに意図せず巻き込んでしまう事が多々あります。
私としても画像の縮小表示は求めていないので、無効化をしてしまいます。
またThumbs.dbは削除してしまても問題ありませんので、無効化するのであれば目についたものは削除してしまいましょう。

1. エクスプローラーのツールバー > 表示 > オプション > 表示
2. 「登録されている拡張子は表示ひない」のチェックを外す
※拡張子の表示はここから「登録されている拡張子は表示しない」のチェックを外すことでも可能です。

## 画面端へのドラッグ時の最大化の無効化
最近のWIndows(かなり前から)では、画面端にウィンドウをドラッグすると勝手に最大化表示がされてしまいます。
この機能を求めている人にとっては有用なのだと思いますが、少なくとも私にとっては煩わしく感じてしまいます。
私と同じように煩わしさを感じる方は無効化をしておきましょう。

1. スタートボタン > 設定(歯車) > システム > マルチタスク
2. 「ウィンドウを画面の横ままたは隅にドラッグしたときに自動的に整列する」をオフにする

# まとめ
以上が私が考える、Windows10への移行時にやっておくといい事です。
移行直後に襲われるイラっと感を、少しでも抑制できたら幸いです。

# お知らせ
エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひとも[エイチームグループ採用ページ](http://www.a-tm.co.jp/recruit/)（[Webエンジニア詳細ページ](http://www.a-tm.co.jp/recruit/requirements/career/lifestylesupport-webengineer/)）よりお問い合わせ下さい。
既存のSpring Bootアプリ(Git管理済)をHerokuにデプロイ

[Spring-Boot/Herokuの始め方](https://qiita.com/pilot/items/9761edf9e394faabddd3)の続き

Petclinicサンプルを題材に

```
git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic
heroku create
git remote add heroku ＜heroku createで表示された「.git」で終わるURL＞
git push heroku master
```

以上
apache2.2 CORS設定

## クロスドメインからの特定URLへのアクセスのみ許可する設定
### 条件
- 確認ブラウザ chrome
- オリジンドメイン `http://origin.com` 
- クロスドメイン `https://cross.com` 
- 上記の条件の場合、クロスドメインからの `https://origin.com/sub/` へのアクセスのみCORS設定
- cookieも使用

## apache2/conf/httpd.conf

```apache2/conf/httpd.conf
<Location /sub/>
        <IfModule mod_headers.c>
                # リクエストのOriginヘッダが指定ドメイン場合はAccessControlAllowOrigin変数へOriginドメインをセット
                SetEnvIf Origin "^https://cross.com$" AccessControlAllowOrigin=$0
                SetEnvIf Origin "^http://cross.com$" AccessControlAllowOrigin=$0
                # AccessControlAllowOrigin変数が空ではない場合、Access-Control-Allow-OriginレスポンスヘッダへAccessControlAllowOrigin変数の値をセット
                Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
                # AccessControlAllowOrigin変数が空ではない場合、Access-Control-Allow-Credentialsレスポンスヘッダへtrueをセット
                Header set Access-Control-Allow-Credentials true env=AccessControlAllowOrigin
        </IfModule>
</Location>
```


## テスト（設定反映前）
- オリジン `https://origin.com` からのアクセス
-> https://origin.com/sub/
**もちろんアクセス可能**

- クロスオリジン `https://cross.com` からのアクセス
-> https://cross.com -> https://origin.com/sub/
**CORB**が効いてリソースを表示してくれない

```
Access to XMLHttpRequest at 'https://origin.com/sub' from origin 'https://cross.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```

## テスト（設定反映後）
- クロスオリジン `https://cross.com` からのアクセス
-> https://cross.com -> https://origin.com/sub/
**リソースを表示してくれる**

 - Response Headers

```
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://cross.com
```
agora.ioサンプルコードのおすすめリポジトリ

agora.ioでは実装のサンプルが豊富にあります。
[Agora公式のGitHub](https://github.com/AgoraIO)
[AgoraコミュニティのGitHub](https://github.com/AgoraIO-Community)

その中から特にニーズの多いサンプルをまとめました。
(随時追加していきます)

##RTMP連携等のサンプル
https://github.com/AgoraIO/Advanced-Interactive-Broadcasting

##録画サーバーアプリケーションのサンプル
https://github.com/AgoraIO/Basic-Recording

##ボイスチャットのサンプル
https://github.com/AgoraIO/Basic-Audio-Call

##環境チェックアプリケーションのサンプル
https://github.com/AgoraIO/Tools/tree/master/TroubleShooting/Agora-WebRTC-Troubleshooting

##OBSプラグインのサンプル
https://github.com/AgoraIO/OBS

##モバイル画面共有のサンプル
[Android]
https://github.com/AgoraIO/Advanced-Video/tree/master/Android
->sample-switch-external-video
[iOS]
https://github.com/AgoraIO/Advanced-Video/tree/master/iOS%26macOS/Agora-Screen-Sharing

##CallKitのサンプル
https://github.com/AgoraIO-Usecase/Video-Calling



#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=76a552be76803948bc65)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=76a552be76803948bc65)
VirtualBOX上のCentOS7で仮想スクリーンの解像度切替ができなくなったけど解決した

#いつ起きたか
再起動しようとしたとき、"インストールしてないやつインストールする？”ってようなメッセージに”はい”と回答したら1024x768に固定された。
Guest Additionを再インストールしても変化なし。

#エラーメッセージ
/var/log/vboxadd-setup.logのエラーメッセージ抜粋

```
/tmp/vbox.0/vbox_mode.c: 関数 ‘vbox_best_single_encoder’ 内:
/tmp/vbox.0/vbox_mode.c:358:3: 警告: 2 番目の ‘drm_encoder_find’ の引数へ渡すときに整数からキャスト無しにポインタを作成しています [デフォルトで有効]
   return drm_encoder_find(connector->dev, enc_id);
   ^
In file included from /tmp/vbox.0/vbox_drv.h:89:0,
                 from /tmp/vbox.0/vbox_mode.c:35:
include/drm/drm_encoder.h:221:35: 備考: expected ‘struct drm_file *’ but argument is of type ‘int’
 static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
                                   ^
/tmp/vbox.0/vbox_mode.c:358:3: エラー: 関数 ‘drm_encoder_find’ へ渡す引数が少なすぎます
   return drm_encoder_find(connector->dev, enc_id);
（以下略）
```
#対処策

Testbuildのインストール。
https://www.virtualbox.org/wiki/Testbuilds
VueJsコンポーネント化


# はじめに
表題とおりに、`VueJs`はとてもすごいライブラリーですけど、VueJsだけで開発すると、まだ足りないと思います。特殊な機能を入れたい時に、別のライブラリを使わないといけないです。
その時に`VueJs`コンポーネント化の変換が必要になると思います。以下のサンプリングは`Datepicker`と`Select2`ライブラリを`VueJs`コンポーネント化することです。

# Vue Component Datepicker 
- `Datepicker`ライブラリー: https://jqueryui.com/datepicker/
- Html Template

```html

  <script type="text/x-template" id="date-picker">
      <input placeholder="YYYY-MM-DD" style="width: 100%" type="text">
  </script>
```

- Javascriptで定義

```javascript

    Vue.component('datepicker', {
        props: ['value'],
        template: '#date-picker',
        mounted: function () {
            var vm = this;
            // Init datepicker
            $(this.$el).datepicker({
                dateFormat: 'yy-mm-dd',
                onSelect: function(dateText) {
                    vm.$emit('input', dateText);
                }
            });
        },
        watch: {
            value: function (value) {
                // update value
                $(this.$el).val(value)
            }
        },
        destroyed: function () {
            //$(this.$el).off().select2('destroy')
        }
    });
```

- htmlで実行

```html
<datepicker v-bind:value="value" v-model="value"></datepicker>
```

# Vue Component Select2
- `Select2`ライブラリ: https://select2.org/
- Html Template

```
    <script type="text/x-template" id="select2-template">
        <select style="width: 100%">
            <slot></slot>
        </select>
    </script>
```

- Javascriptで定義

```javascript

    Vue.component('select2', {
        props: ['options', 'value'],
        template: '#select2-template',
        mounted: function () {
            var vm = this;
            $(this.$el)
            // init select2
                .select2({ data: this.options })
                .val(this.value)
                .trigger('change')
                // emit event on change.
                .on('change', function () {
                    vm.$emit('input');
                });
        },
        watch: {
            value: function (value) {
                // update value
                $(this.$el).val(value)
            },
            options: function (options) {
                // update options
                $(this.$el).empty().select2({ data: options })
            }
        },
        destroyed: function () {
            $(this.$el).off().select2('destroy')
        }
    });
```

- Htmlで実行

```html
 options = [
    {
        id: 0,
        text: 'enhancement'
    },
    {
        id: 1,
        text: 'bug'
    },
    {
        id: 2,
        text: 'duplicate'
    },
    {
        id: 3,
        text: 'invalid'
    },
    {
        id: 4,
        text: 'wontfix'
    }
  ];

    <select2 :options="options" v-model="idValue">
    </select2>
```

# 最後に
`Datepicker`と`Select2`だけ`VueJs`コンポーネント化をしましたが、他のライブラリもう同じやり方でコンポーネント化出来ますので、自由で試してくださいませ。


あと、実際にあるライブラリが`VueJs`コンポーネント化にされたので、すぐ使えます。

例えば:
- `Vue Select` https://sagalbot.github.io/vue-select/
- `Vuejs-datepicker` https://www.npmjs.com/package/vuejs-datepicker
VueアプリケーションにBulmaを組み込む

Vue用のBulmaコンポーネントとしてVuetifyがありますが、ちょっと盛りすぎ&後から組み込むのが大変そう。。
なので、ザクっと作ったVueアプリケーションに後からクラスを付け足してBulmaを適用することを想定しています。

```bash
$ yarn add sass-loader node-sass
```

sass用のディレクトリとscssファイル作成。

```bash
$ mkdir src/assets/sass
$ touch src/assets/sass/main.scss
```

**src/assets/sass/main.scss**

Bulmaをインポート。

```bash
@import '~bulma/bulma'
```

**src/main.js**

```js
import Vue from 'vue'
import App from './App.vue'
import router from './router'

require('./assets/sass/main.scss'); //追加
```

こんな感じになります。

<img width="1031" alt="vue-bulma.png" src="https://qiita-image-store.s3.amazonaws.com/0/8607/ed8b1ce0-04a1-3ef3-f71e-1b19c4e3289a.png">


---

## 参考

[Vue.js + bulma + Vue-cliでシンプルにおしゃれな静的サイトを作る](https://sugimotonote.com/2018/05/23/post-1058/)
[Setup New Vue Webpack Project With Bulma](https://dev-notes.eu/2017/07/setup-new-vue-webpack-project-with-bulma/)
超光速用アルゴリズム

結論から言えば絶対か確率のどちらかに成るだろう量子もつれ２対アルベロス、ペアでない量子同士を接触させる実際に出来るかは意味がないサイズに違いが有ればアルベロスが出来てトーラス体が作れるここで旧来のEPR相関とは意味が違う大雑把に言えば四色問題と七色定理四色では向きに意味がないが七色なら7*7倍で14*14次からウェイソン選択課題で足し算式が常識的だったので掛け算ににしてみた２対の内どちらかを観測してももう一つの量子もつれは維持されるんだから144*144 1444*1444　14^2:144^2の比率以降は16対1整数比一度比率を出してから出た数字をもう一度整数比にかけると16対1で昇順していって4対1≒七色に為れば超光速ではないか？四つ穴が空いてると十色十個穴が空いてると十四色python3.6で出来るか教えてください