OmniAICreator/Qiita-1.07M huggingface dataset:
R言語でもディープラーニングがしたい！


#nnetを使う

```r
library(nnet)
#irisをtestとtrainに分ける

samples <- sample(1:150,75)
iris.train <- iris[samples,]
iris.test  <- iris[-samples,1:4]
actual_species <- iris[-samples,5]

iris.nnet <- nnet(Species~., size=3, decay=0.1,maxit=100,data=iris.train)
iris.nnet
```

結果は

```
a 4-3-3 network with 27 weights
inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width 
output(s): Species 
options were - softmax modelling  decay=0.1
```

モデルのオプションは、
sizeが中間層
decayが過学習抑制のための値
maxitが繰り返し回数

作ったモデルを図で確認する


```r
library(NeuralNetTools)
plotnet(iris.nnet)
```
![4444433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/c292b752-5f02-a629-0875-37995c805140.png)


#予測

予測値は本当にあっているのか比較して確かめる


```r
pred_species <- round(predict(iris.nnet,iris.test))
colSums(pred_species)
table(actual_species)
```

maxitを10回で実行したとき

```
nnet(Species~., size=3, decay=0.1,maxit=10,data=iris.train)
# weights:  27
initial  value 74.140168 
iter  10 value 36.933697
final  value 36.933697 
stopped after 10 iterations

colSums(pred_species)
    setosa versicolor  virginica 
        28         37          6 
table(actual_species)
actual_species
    setosa versicolor  virginica 
        27         16         32 
```






100回のモデル

```
nnet(Species~., size=3, decay=0.1,maxit=100,data=iris.train)
# weights:  27
initial  value 125.135244 
iter  10 value 68.201740
iter  20 value 41.303200
iter  30 value 19.560457
iter  40 value 18.588992
iter  50 value 16.462453
iter  60 value 16.399883
final  value 16.399882 
converged

colSums(pred_species)
    setosa versicolor  virginica 
        27         14         33 
table(actual_species)
actual_species
    setosa versicolor  virginica 
        27         16         32 
```


60回くらいで収束してしまう。
一問missなので、なかなか良いモデルなのでは?




#以上



ついでにneuralnetのパッケージも使ってみます
モデルの作成と図にする

```r
library("neuralnet")

network = neuralnet(Species~., hidden=5, err.fct = "ce", linear.output = FALSE,data=iris.train)
plot(network)
```

![66665.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/a7ddfb20-d963-8e30-8a6f-01aa0b0a3cca.png)


```r
pred_neuralnet <- round(predict(network, iris.test))
pred_neuralnet <- data.frame(setosa=pred_neuralnet[,1],versicolor=pred_neuralnet[,2],virginica=pred_neuralnet[,3])

colSums(pred_neuralnet)
table(actual_species)
```

結果の確認

```
colSums(pred_neuralnet)
    setosa versicolor  virginica 
        27         14         34 
table(actual_species)
actual_species
    setosa versicolor  virginica 
        27         16         32 
```

こちらもそこそこ予測できていそう。



#今回の参照サイト


```
https://logics-of-blue.com/time-series-analysis-by-nnet/

https://www1.doshisha.ac.jp/~mjin/R/Chap_23/23.html
```
webarenaでubuntu その21

#概要

webarenaでubuntu18.04やってみた。
mysql5.7やってみた。

#コマンドラインに入る。

```
sudo mysql -u root -p
```

#データーベースを作成。

```
create database mydb character set utf8;
```

#ユーザーを作る。

```
create user 'arena'@'localhost' identified by 'pass';
```

#権限をつける。

```
grant all privileges on mydb.* to 'arena'@'localhost';
```

#phpでテーブル作る。

```
<?php
    $db = new PDO("mysql:host=localhost;dbname=mydb;", 'arena', 'pass');
    $sql = 'create table test(id INT(10) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), age INT(4), r_time DATETIME)';
    $res = $db->query($sql);
    print "ok\n";
?>
```

#結果を見る。

```
use mydb;
show columns from test;
```

以上。
TypeScript: UnionToIntersection<T> ─ 共用体型を交差型にするユーティリティ型

本稿ではTypeScriptで、共用体型(union type)を交差型(intersection type)に変形するmapped typesを紹介します。

## 共用体型を交差型に変換するmapped types

```ts
type UnionToIntersection<U> =
  (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
```

出典は[Typescript Convert Union to intersection - Stack Overflow](https://stackoverflow.com/questions/54938141/typescript-convert-union-to-intersection)です。一応上のスニペットは、Stack Overflowの回答からの原文ママの引用なので、ライセンスは[回答にあるソースコードを別の場所で使っても構いませんか？ - スタック・オーバーフローMeta](https://ja.meta.stackoverflow.com/questions/2529/%E5%9B%9E%E7%AD%94%E3%81%AB%E3%81%82%E3%82%8B%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%88%A5%E3%81%AE%E5%A0%B4%E6%89%80%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%82%E6%A7%8B%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B)を参照してください。

## 使い方

まず交差型にしたい共用体型を準備します。ここでは`Either`(どっちかという意味)という型を用意しました。`{a: number}`か`{b: number}`のどちらかを満たせばOKなやつです。

```ts
type Either = {a: number} | {b: number}
```

念の為、共用体型の性質を確認しておきます。

```ts
const a: Either = {} // Compile error: Property 'a' is missing 
const b: Either = {a: 1}
const c: Either = {b: 1}
const d: Either = {a:1, b: 1}
```

上のコードでは`a`だけが型を満たせないのでコンパイルエラーになります。

次に、先程の`UnionToIntersection`を使って上の`Either`から、`{a: number} & {b: number}`を錬成したいと思います。ここでは`Both`(どちらもの意)という型名にします。

```ts
type Both = UnionToIntersection<Either>
```

ちゃんと交差型になっているか確認します。

```ts
const p: Both = {} // Compile error: Property 'a' is missing 
const q: Both = {a: 1} // Compile error: Property 'b' is missing
const r: Both = {b: 1} // Compile error: Property 'a' is missing
const s: Both = {a:1, b: 1}
```

上のコードの`s`以外がコンパイルエラーになりました。ちゃんと交差型になっているようです。

この検証をやってみたい方は[TypeScript playground](http://www.typescriptlang.org/play/#code/PTAEDMCcHsFtQBYBckAcDOAuE6kEMBjAa2gDcBTScAG2gHcA6AuYARwFdzcBLaAO3TAArABYAnAGYAHAEYRM4EgCeqLgUjdUSALTM+FSDvZ9efbUmjbufJJXTkCSUwChlq0AFUT-ACrQAkjZ2Dk78ADweAHygALzOoKAAFB6g5AAetnwAJuigeHxKoAD8SUSYngCUsdGk0NxZoOV85AZV6Zk5SYlloNbglKD+VTE1dVlVJf6NoM0GANzOi64q5KAAotxICAMxoADeeE3ssABGlAC+oAA++ydHpxeLerh55RtbO-uXIKAAwnCobjUVaUGCQcoABRgqkMhQA5Hg4b1crBuOh0NYAOagZzPJCgO7rTbbSCxfaHUAyc64-gvAhvYmfPaEqk0gT4rIMj6k3YHTAyAA0BPKrOW7gAQtAtmSvKY-IFbJB7I5TGF3iTIk9afjUOVJdLed8wP9YIDgalIGDIdDKMpQAikWjQKj0VicXjQKw9VKEGS+ZSjX8AUCQZboODQFDoDC7XCTo6UWiMXxMWyXhH9b7eSzAyazaGrZGbbD7Yjkc6k1i0-isKBM37DoLhQGgA)で試せます。

## 解説

いろいろ試行錯誤はしてみましたが、ついになぜ動くのか理解できませんでした。説明できる方、いましたら教えてください :pray:

→ [uhyoさんからコメントで解説いただきました。](https://qiita.com/suin/items/93eb9c328ee404fdfabc#comment-5218b3e9d13d93dfc98f)

## 実用例

このテクニックの実用例を @kahirokunn に教えてもらいました。[VuexにmapComputedのようなヘルパー関数を定義するときに応用する](https://github.com/kahirokunn/book-management/blob/4a1ffb49f90fa55e6b05ef892758a62161466cf6/src/submodules/store/index.ts)と、型安全なコードが書けるようです。
テスト12


```vb
'--------------------------------------------------------------------

'標準モジュール

Sub フォームコントロール()

Dim c

For Each c In Sheets("Sheet1").Shapes

   Sheets("Sheet1").Shapes(c.Name).DrawingObject.Enabled = False

Next c

End Sub


Sub テスト1()
Dim c

For Each c In Sheets("Sheet1").Shapes

   If Sheets("Sheet1").Shapes(c.Name).DrawingObject.Enabled = False Then

      MsgBox "aaa"
      Exit Sub

   End If

   MsgBox "bbb"

Next c

End Sub


Sub テスト2()
Dim c
For Each c In Sheets("Sheet1").Shapes
   If Sheets("Sheet1").Shapes(c.Name).DrawingObject.Enabled = False Then
      '灰色
      Sheets("Sheet1").Shapes(c.Name).DrawingObject.Font.ColorIndex = 15
   Else
      '黒色
      Sheets("Sheet1").Shapes(c.Name).DrawingObject.Font.ColorIndex = 1
   End If
Next c
End Sub


'--------------------------------------------------------------------

Sub ActiveXコントロール()
Dim c
For Each c In Sheets("Sheet1").OLEObjects
   If c.Name Like "CommandButton*" Then
      Sheets("Sheet1").OLEObjects(c.Name).Object.Enabled = False
   End If
Next c
End Sub

'--------------------------------------------------------------------

```
Windows2003(with Atom)にPythonを導入する

#Windows2003(with Atom)にPythonを導入する

やめましょう．

###環境
OS : Windows server 2003 Standerd Endition
CPU : Atom(TM) CPU 330 @ 1.60 GHz
日付 : 2019/8/10

###目的
デュアルブートとか仮想化とかを禁止されているけど，Python3環境が欲しい

##やること

#### Python3.4のダウンロード
<a href = https://www.python.org/downloads/release/python-340/>Pythonの公式サイト</a>から32bit版WindowsのPythonをダウンロード
Python3.4以下じゃないと動かない（らしい）．
なお，IE8からではアクセスできなかったのでchromeを入れた．

#### Pathを通す
コマンドプロンプトで，以下のコマンド打つ．
C:\User\Pythonの部分はさっきダウンロードして解凍したディレクトリを指定．
```set path = %path%;C:\User\Python```
これで，コマンドプロンプト上でpythonと打てば動くようになっているはず．

#### pip を使えるようにする
まずはpipを使えるようにする．
これはやらなくても動くかもしれない．
```python -m  ensurepip```

setuptoolsは必ずアップグレードしときましょう．
```python -m pip install --upgrade pip setuptools```

pipが使える状態になれば，以下のようにpipでパッケージインストールができる．
```python -m pip install numpy==1.15.0
python -m pip install pandas==0.16.0```


##ダメだったこと
Anacondaが入れば早いのだが以下のエラーで動かなかった．
```プロシージャエントリポイントGetFinalPathNameByHandleWがダイナミックリンクライブラリKERNEL32.dllから見つかりませんでした．```
そもそもこのWindowsにはpython3.4以前しか動かない（らしい）のでそっちが原因かもしれない．

ちなみにLightGBMは32bitに対応していない．

##最後に
買い換えた方が良いと思います．
heroku上で動いてるプロジェクトのソースコードを取得する方法

# herokuとは
Qiitaを見てる方には説明不要かと思いますがHerokuとはPaasです。いまはsalesforceに買収されて安泰？になったのかなってないのかという会社です。githubなどと連携してコードを上げることでサーバー環境を用意せずに開発を行うことができます。

# herokuボタン
herokuには便利なhrokuボタンと言うものがあります。
例えば下記のレポジトリに行きherokuボタンを押して一定の設定をするだけでwordpressが出来上がったりします。

[wordpress](https://elements.heroku.com/buttons/philippheuer/wordpress-heroku "wordpress")

# herokuボタンで作成したプロジェクトはコードがcloneできない問題

上記で作成したアプリを下記のようなコマンドでcloneしようとします。

```
heroku git:clone --app 作成したアプリ名
```
クローンしたアプリのディレクトリに行くと空のレポジトリになります。
そうです。
herokuボタンで作成したアプリはコードの取得がcloneできません。

# herokuボタンで作成したアプリのコードをどうやって取得するか？

答えは簡単で下記のサイトにいき自身のアプリプロジェクトを選択しコードをダウンロードすればいいのです。

[https://download-heroku-source.herokuapp.com/](https://download-heroku-source.herokuapp.com/ "https://download-heroku-source.herokuapp.com/")
Androidアプリの審査が長くなった件

### 8/26 追記

改めて気になることがあったので、サポートチームへ問い合わせをしてみました。
一度目に問い合わせた方と別の方に対応していただいたのですが、「**審査は土日祝も含めグローバルチームが対応する**」という回答を頂きました。
リリース前の審査はすべてのアプリの公開、更新に対して行うのは確定なようですが、審査にかかる時間については、本記事の情報は参考程度に留めておいてください。

---

先日Androidアプリをリリースしようといつもどおりの作業を行ったのですが、5時間たっても公開されない状況が続いていたため、なにかあったのかと思いコンソールを見てみると、初めて見るメッセージが表示されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275913/736ceb77-ea55-3aa7-7cee-0d68bbcab1d9.png)


「Androidアプリに審査…？公開後に機械的にやってるんじゃないの…？」
と思ったのですが、Twitterなどで調べてみると、Androidアプリの審査があってアプリが公開できていないという話をされてる方がちらほらいました。

とりあえずこちらでは制御できないので、一旦審査が終わるのを待ちました。
翌朝確認してみるとストアにアプリが公開されており、「アップデート公開したよ！」というメールが深夜3時頃に来ていました。
リリース作業を行ったのが14時頃だったので、リリースまでに13時間ほどかかったことになります。

とりあえずリリースは無事終わったのですが、改めて審査についてGoogleに問い合わせしてみました。

**Q. 審査って何時間ぐらいかかりますか？**
**A. 目安としては、最大48時間です。**

**Q. 審査って土日もやっているのですか？**
**A. 審査は営業日に行うので、土日を挟むと審査が遅れる可能性があります。**

**Q. 審査を先に通過させておくなど、デベロッパー側でリリースタイミングを制御する方法はありますか？**
**A. 時間指定公開を使えばデベロッパー側で制御できます。** ~~しかし、時間指定公開は、すでに公開されているアプリのアップデートをリリースする場合のみ有効で、新規に公開するアプリは使用できません。~~

8/22 追記
新規アプリの時間指定公開についてですが、@kafumi さんからコメントで、新規に公開するアプリを時間指定公開する方法があるとのご指摘をいただいたので訂正します。
> クローズドトラックに一度公開し、そちらから製品版にプロモートする形であれば時間指定公開を利用できるとのことで、新規アプリでもこの方法を使えばリリースタイミングが制御できるようです。

**Q. 審査でリジェクトされる可能性ありますか？ある場合、リジェクトの基準などありますか？**
**A. 社内ポリシーのためお答えできません。参考に[こちら](https://play.google.com/intl/ja/about/developer-content-policy/index.html#!?modal_active=none)をご確認ください。**

とのことでした。

# 今後のリリースについて

審査が入ること自体はGoogle Play Storeが無法地帯にならないので良いことだと思うのですが、審査を土日にやってくれないのはなかなかタイミングが難しいですね…

~~深夜3時にアップデートが公開されたことから、審査はカリフォルニアで行っているようです。~~
~~なので、日本時間の金曜日に提出した場合、その日のうちに審査が通る可能性もあると思われます。~~
~~同時に、アメリカの祝日についても考慮しなければいけないですが…~~

8/26 追記
@sinkunvv さんから追加で指摘いただいたので、訂正します。今回私がリリースした際に審査を行ったのが、アメリカのチームということっぽいです。
> 審査用のチームは各拠点に存在するらしいです
> なのでその拠点の営業日に左右されるそうです

今後は、Androidアプリのリリースも審査があることを考慮してリリーススケジュールを組む必要がありそうです。
リリースのタイミングをデベロッパー側でなるべく制御したい場合は、時間指定公開を有効にし、先に審査を通過させておく必要があります。

時間指定公開のやり方は、以下のページに記載があります。
https://support.google.com/googleplay/android-developer/answer/6334282?hl=ja
JAWS-UG IoT専門支部 「AWS IoTシリーズのシンカ(進化/深化/真価)」に参加してきたことのメモ

# はじめに
[こちらのイベント](https://jawsug-iot.connpass.com/event/138727/)に参加してきたのでそれについてまとめます。(久しぶりに自分の仕事と関係ありそうな内容を聞きに行ったなあ。。。)

[JAWS-UG（AWS Users Group – Japan）](https://jaws-ug.jp/about-us/)とはその名前の通り[AWS](https://aws.amazon.com/jp/?nc2=h_lg)の日本ユーザーグループのようです。AWSは様々なクラウドサービスを展開していますが、今回は「[AWS IoT](https://aws.amazon.com/jp/iot/)」についての勉強会でした。

イベント詳細・タイムテーブルなどはイベントページを参照してもらうことにして、以下から各セッションについてのメモ書きを残します。内容が多かったので、箇条書きメモっぽくなって記事らしい内容にはなりませんでした。。。

# AWS IoT サービスこの1年の進化 (AWSJ 亀田さん)
以下に紹介されたサービスについて書きます。といっても詳細についてはメモしきれてません。

## [AWS IoT core](https://aws.amazon.com/jp/iot-core/)
AWS IoTを使う用途は主に2つ

- データ収集
- リモート制御

AWS IoT以外にもAmazonにはAmazon Kinesisというサービスもサポートしている

- AWS IoT
    - HTTP, MQTT, WebSocketをサポート
    - 双方向制御ができる
    - クライアント証明書をサポート
    - 値段高め
- Amazon Kinesis
    - HTTPのみをサポート
    - 専用ライブラリが必要
    - データストリーム

## [AWS IoT Device Management](https://aws.amazon.com/jp/iot-device-management/)
AWS IoT coreでできることは各デバイスに証明書を与えることであるが、このサービスでは複数のデバイスをまとめて制御可能。AWS IoT Testerでテスト可能。

## [AWS IoT Analytics](https://aws.amazon.com/jp/iot-analytics/)
IoTデータの収集・前処理・拡張・保存・分析・可視化を可能にするサービス。ストレージに保存したデータに対して分析が可能であり、リアルタイムでの分析は不可。

## [AWS IoT SiteWise](https://aws.amazon.com/jp/iot-sitewise/)
工場。農場からの大量のデータをストレージに貯めるためのサービス。収集したデータをアセット単位・プロセス単位で処理が可能。

## [Amazon Free RTOS](https://aws.amazon.com/jp/freertos/)
マイクロコントローラ向きのIoT operating systemを提供するサービス。

## [AWS IoT Greengrass](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/what-is-gg.html)
Edgeデバイスのためのサービス。Greengrass Coreをインストールしたデバイスをゲートウェイのソフトウェアから操作することでクラウドベースでの管理が可能になる。

## まとめ
それぞれにリンクを貼ったので詳細はそれぞれのドキュメントを参照してください。一口にAWS IoTといっても様々なサービスがあったことを今回初めて知りました。個人的に気になったのはFreeRTOSですね。

# AWS IoTサービスの理解の深化と真価 (AWSJ 市川さん)
ここで紹介されたサービスは2つです。

- AWS Things Qraph
- AWS IoT Events

## [AWS Things Graph](https://aws.amazon.com/jp/iot-things-graph/)
NodeREDのようなGUI操作で複数デバイスとサービスの接続を記述することで、視覚的にワークフローを制御することができる。デバイスとサービスは、モデルと呼ばれる再利用可能な構築済みコンポーネントとして表され、プロトコルやインターフェイス等の低レベルの詳細は表示されず、モデルを統合して複雑なワークフローを作成することも簡単に行える（サイトの説明抜粋）。モデルの定義は[GraphQL](https://qiita.com/syu_chan_1005/items/3350f1d12c17a77e98c7)による記述が必要。

## [AWS IoT Events](https://aws.amazon.com/jp/iot-events/)
AWS IoT core・AWS IoT Analyticsからのデータを継続的に監視するステートフルなイベントの管理が可能。ユースケースとして、複数のデータを監視して複雑なイベントの管理をしたい場面に使える。また、大量なデータに含まれるノイズに対する処理（何回通知したら警告みたいな処理）が可能になり、サーバに通知する無駄な通信を減らすことができる。注意点は以下の2点

- オートセーブの機能がないので定期的にPublishすることが必須
- 一定期間データが来ないと保存されていたデータとモデルが削除される

## まとめ
両者とも新しく提供されたサービス(2019年時点)なので、ぜひリンク先でチェックしておくと良いかもしれません。AWS IoT Events・AWS Things GraphともにGUIベースになっているので直感的な記述ができそうだなと感じました。

# IoTのつくり方～おさえておくと捗るモロモロ (JAWS UG IoT専門支部運営 青木さん)
IoTシステムの基本構成から各要素についての解説をメモ。

## IoTデバイス
ここで重要になるのは電源。

## データの特性

1. 定期的に収集されるデータ
    - 連続して投げられるもの
2. 離散的に発生するデータ
    - あるイベントにのみ発生する
      

## エリアネットワークのプロトコル問題
例えばWifiとXBeeはチャンネルがかぶっているので同時に通信することが難しい。

## ゲートウェイ
データのどこでタイムスタンプを付与するか。

- センサ
    - 実際にデータを取得した時間が取得できる
    - 時計同期の実装が必要
- ゲートウェイ
    - 一括管理が可能
    - 誤差あり

ゲートウェイにどこまでのスペックをもたせるかを考える。あえてゲートウェイを採用しないケースもある

## 広域通信網
LPWA・3Gなど様々な方式がある

## IoTサーバ
コストと安定した運用のために使えるマネジメントサービスは積極的に取り入れる。やれるところからマイクロシステムの疎結合にする。

# さいごに
完全にメモ書きな内容になりました。なにか補足・指摘ありましたら編集リクエストください。
超絶便利なTabNine を入れて、Deep TabNine のローカル版、 TabNine Local をアクティベートするまで

# TabNine との出会い
社内のSlack で突如こんな記事が流れてきました。
https://tabnine.com/blog/local

ディープラーニングを用いてクラウド上でエディタの補完を行う Deep TabNine に Localで推論して補完する機能をつけたよ。という内容でした。
そもそも TabNine という物がある事自体知らなかったので、使ってみることにしました。
https://tabnine.com のページ下部に、インストール方法が書いてあります。
この方法で、 `Visual Studio Code` と `PhpStorm` にTabNine を入れました。  

PhpStorm へのインストールはページに書いてあるとおりではうまくいきませんでした。
大した内容ではないですが、方法を書いておきます。

## Shift を連打して、plugins と打つ
プロジェクト全体をplugins という文字列で検索し、下の画像の Plugins を開きます。  
![全画面_2019_08_20_19_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/228d0105-6b53-6514-acd7-efdea2730fd0.png)

## 開いた画面でMarketPlace を選択し、MarketPlace で TabNine を検索 & インストール
![Plugins_と_sigfy____dockerWorld_sigfy__-_____config_Migrations_20161006142746_change_column_type_emails_table_php__sigfy_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/6fcf89b3-8eb7-b231-4467-72596f3a30b9.png)

## PhpStorm を再起動
![This_should_not_be_shown_と_Plugins.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/2dff34c3-7717-e438-3e75-75c3684574d8.png)



という感じです。
設定によっても異なってくるかもしれませんが。  


# 課金について
https://tabnine.com/subscribe/ に詳細が書いてあります。
上記の手順でインストールしたプラグインを使う分には無料らしいです。
あと、以降で説明する deep learning を使った推測も、ベータ期間中は無料らしいです。

# ベータ登録してみた

ということで、ベータ版に登録して、 deep learning を使った推測を試してみようと思います。
サインアップはこちらから。
https://tabnine.com/beta_signup/

メールアドレスを登録すると、すぐAPI Key を含むメールが飛んできます。
![TabNine_Beta_Invite_-_gorogoro_yasu_gmail_com_-_Gmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/d9ee88d4-84ca-723c-55f2-1bb132433e0a.png)

アクティベーション方法はメールに書いてありますが、一応書いておきます。
エディタを開き、任意の箇所に `TabNine::config` とタイプします。
タイプした瞬間、 ブラウザで `http://127.0.0.1:5555/xxxxxxxxxxxxxxxxxxxx` が開き、
![TabNine_configuration_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/57a97bed-3da8-5a74-7da7-b7bbe7ee25d6.png)
という画面が出現します。

この画面の Activation key のところに、メールで送られてきた API Key を入れます。
これでアクティベーションは完了です。

アクティベーションが完了すると、このような画面になります。
![全画面_2019_08_20_20_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/f5fe199d-d1d9-2dac-9721-b71986f3f5ed.png)

TabNine Local は初めからアクティベートされていて、 TabNine Cloud は、初めはDisableされています。
コメントに有るように、TabNine Cloud を使ってもアップロードされたコードはすぐに削除されるようです。
一旦Cloud は Disabled にしたまま使ってみました。なんとなく。

# 見た目
![hello_py_—_tabnine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115634/18ff0562-4685-6e65-266b-6b7835eb4402.png)

おそらく、L.9 で apple と打ったから L.10 で microsoft と出てきたわけではないとは思いますが、
まるでgoogle 検索の補完機能のような感じで一般の言葉も教えてくれます。

Deep Learning を使っているとのことなので、まだまだいろいろな機能は有るのでしょうが、
正直、まだ普通のTabNine との違いはよくわかっていません。
だいぶ便利になってるのかな?

ひとまずベータの間は使い続けてみようと思います。
ということで、TabNine の紹介・インストールと TabNine Local のアクティベート でした。
bash でシェル変数を文字列内で展開したい場合にはダブルクオートで囲む

# どういう事か

```bash
# シェル変数を定義
$ MY_PARAMETER=hoge

# シングルクオートだと、展開されない
$ echo '$MY_PARAMETER'
$MY_PARAMETER

# ダブルクオートだと、展開される
$ echo "$MY_PARAMETER"
hoge

# こんな感じで使える
MY_INSTANCE_ID=i-xxxxxxxx
aws ec2 describe-instances --instance-ids $MY_INSTANCE_ID
```

# 一次情報調べてみたメモ

Quoting (Bash Reference Manual)
https://www.gnu.org/software/bash/manual/html_node/Quoting.html

> • Single Quotes: How to inhibit all interpretation of a sequence of characters.
> • Double Quotes: How to suppress most of the interpretation of a sequence of characters. 

[拙訳]

• シングルクオート: 文字シーケンスのすべての解釈を禁止する
• ダブルクオート: 文字シーケンスのほとんどの解釈を抑制する

「ほとんど」とは？

Double Quotes (Bash Reference Manual)
https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html#Double-Quotes

> Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘\’, and, when history expansion is enabled, ‘!’. 

[拙訳]

文字をダブルクオート(`"`)で囲むと引用符内の全文字のリテラル値が保持されるが、例外は '$'、 '`'、 '\'、そして history expansion が有効な場合は '！' となる。

> The characters ‘$’ and ‘`’ retain their special meaning within double quotes (see Shell Expansions). 

[拙訳]
"$" および "`" は、ダブルクオート内で特別な意味を持つ。(Shell Expansions を参照)

Shell Expansions とは・・・

Shell Expansions (Bash Reference Manual)
https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html

> Expansion is performed on the command line after it has been split into tokens. There are seven kinds of expansion performed: 
> 
>    brace expansion
>    tilde expansion
>    parameter and variable expansion
>    command substitution
>    arithmetic expansion
>    word splitting
>    filename expansion 

[拙訳]

(入力された文字列たちが)トークンに分割された後、コマンドラインで展開が実行される。
実行される7種類の拡張がある

1. brace expansion
2. tilde expansion
3. parameter and variable expansion
4. command substitution
5. arithmetic expansion
6. word splitting
7. filename expansion



`3.` の `parameter and variable expansion` がそれっぽい。

> Shell Parameter Expansion: How Bash expands variables to their values.

とリンクがあるので見てみる。


Shell Parameter Expansion (Bash Reference Manual)
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion

> The ‘$’ character introduces parameter expansion, command substitution, or arithmetic expansion.

[拙訳]

`$` 文字は、パラメーター展開、コマンド置換、または算術展開を導入する。


...という感じらしい。 bash の機能、多すぎる。
Leetcode #739: Daily Temperatures

```swift
func dailyTemperatures(_ temperatures: [Int]) -> [Int] {
    var stack = [Int]()
    var answer = Array(repeating: 0, count: temperatures.count)
    for (i, temperature) in temperatures.enumerated() {
        if let top = stack.last {
            if temperature <= temperatures[top] {
                stack.append(i)
            } else {
                while !stack.isEmpty && temperatures[stack.last!] < temperature {
                    let index = stack.removeLast()
                    answer[index] = i - index
                }
                stack.append(i)
            }
        } else {
            stack.append(i)
        }
    }
    return answer
}
```
Leetcode #406: Queue Reconstruction by Height

```swift
func reconstructQueue(_ people: [[Int]]) -> [[Int]] {
    var people = people.sorted {
        if $0[0] == $1[0] {
            return $0[1] < $1[1]
        } else {
            return $0[0] > $1[0]
        }
    }
    var answer = [[Int]]()
    for i in stride(from: 0, to: people.count, by: 1) {
        if people[i][1] <= answer.count {
            answer.insert(people[i],at: people[i][1])
        } else {
            answer.append(people[i])
        }
    }
    return answer
}
```
AtCoder Grand Contest 037 参戦記

# AtCoder Grand Contest 037 参戦記

# [AGC037A - Dividing a String](https://atcoder.jp/contests/agc037/tasks/agc037_a)

52分で突破. そもそも山でバスに間に合わず、蒲田駅についたのが21時5分って感じで、15分以上遅れてスタート. 問題文をちゃんと見ていなく、最初はすべての分割文字がユニークだと勘違いして、なんて難しい問題だって唸ってた. 正しく題意を理解してサラッと書いたのが以下. ダメでも良いやで流して AC. ~~正直なところ、最後と最後の一個手前が違うことを確認してないので、意地悪なテストケースを用意されると転けそうな気がする.~~ 後から、分割文字は1文字→1文字、1文字→2文字、2文字→1文字の3パターンしか無いのかーって思った.

```python
s = input()
t = ''
k = 0
prev = ''
for i in range(len(s)):
  t += s[i]
  if prev != t:
    k += 1
    prev = t
    t = ''
print(k)
```

追記: 最後と最後の1個手前が同じ場合だが、

* 最後が 2個 1個 1個(例: aa a a) のパターンは 3個 1個(aaa a) にすれば大丈夫
* 最後が 1個 1個 1個(例: b a a) のパターンは 1個 2個(b aa) にすれば大丈夫

ということで大丈夫だった. 文字列の分割結果を取得できるように書き直したのが以下.

```python
def divide_string(s):
    result = []
    prev, t = '', ''
    for i in range(len(s)):
        t += s[i]
        if prev != t:
            result.append(t)
            prev, t = t, ''
    if t != '':
        if len(result) == 1 or len(result[-2]) == 1:
            result[-1] = result[-1] + t
        else:
            result[-2] = result[-2] + t
    return result


S = input()

print(len(divide_string(S)))
```

# [AGC037C - Numbers on a Circle](https://atcoder.jp/contests/agc037/tasks/agc037_c)

敗退. B はもう問題文を見ただけで無理って思ったので飛ばしてこっちをやってた. 問題を見た感想は、「えー、どの順でやればいいの. 総当りしたら組合せ爆発しない?」って気分だった. とりあえず順方向だと最小どころかそもそもAからBにたどり着ける気がしないので、逆向きにやっていくことにし、回数最小ってことはできる限り小さくしない(小さいと引ける数が減って最小にならない)のがいいのかなと、一番大きいのを順に置き換えていくことを計画. 一番大きいのをどんどん取り出すために順序付きキューを使って実装してみた. TLE にはなるものの WA はでず、方針はこれで合ってるかと思ったものの、処理量を減らす方法が全く思いつかずタイムアップ.

```python
def main():
  import sys
  from heapq import heappush, heappop, heapify
  _int = int
  n = _int(input())
  a = [_int(e) for e in input().split()]
  b = [_int(e) for e in input().split()]
  result = 0
  finished = 0
  hq = [(-b[i], i) for i in range(n)]
  heapify(hq)
  while True:
    _, i = heappop(hq)
    if a[i] == b[i]:
      finished += 1
      continue
    if i == 0:
      b[i] -= b[n - 1] + b[1]
    elif i == n - 1:
      b[i] -= b[n - 2] + b[0]
    else:
      b[i] -= b[i - 1] + b[i + 1]
    if a[i] > b[i]:
      print(-1)
      sys.exit()
    result += 1
    if a[i] == b[i]:
      finished += 1
      if finished == n:
        print(result)
        sys.exit()
    else:
      heappush(hq, (-b[i], i))
main()
```

解説 PDF を読んで、一気に減らして大丈夫なのか、本当にこれで最小になるのかと思いつつ、実装したら AC. 未だに本当に最小回数なんだろうかって思っている自分がいる.

```python
def main():
  import sys
  _int = int
  n = _int(input())
  a = [_int(e) for e in input().split()]
  b = [_int(e) for e in input().split()]
  result = 0
  q = [i for i in range(n) if b[i] != a[i]]
  while len(q) != 0:
    nq = []
    c = 0
    for i in q:
      if i == 0 or i == n - 1:
        j = b[(n + i - 1) % n] + b[(n + i + 1) % n]
      else:
        j = b[i - 1] + b[i + 1]
      if j > b[i] - a[i]:
        nq.append(i)
        continue
      c += 1
      k = (b[i] - a[i]) // j
      result += k
      b[i] -= j * k
      if a[i] != b[i]:
        nq.append(i)
    if c == 0 and len(nq) != 0:
      print(-1)
      sys.exit()
    q = nq
  print(result)
main()
```
MYSQLメモ

###MYSQL(SQL)を書く上でよく使うコード類のメモです
※随時追加予定
コマンドプロンプトからの立ち上げ
`mysql -u root -p`

データベース一覧を見る
`SHOW DATABASES;`

現在のデータベースのテーブル一覧を見る
`SHOW TABLES;`

データベース選択
`USE データベース名;`

現在のデータベース確認
`SELECT DATABASE();`

データベース削除
`DROP DATABASE 削除したいデータベース名;`

ターブルの中身確認
`SELECT *　 FROM テーブル名;`

データベースとテーブルを選択して中身確認
`SELECT * FROM データベース名.テーブル名;`

ユーザー作成
`CREATE USER ユーザー名`

ユーザー削除
`DROP USER ユーザー名`

mysqlのユーザー確認
`SELECT USER, HOST FROM mysql.user;`

↓実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251595/0821e957-ef04-6152-d400-1f1118b71ded.png)

mysqlのユーザー削除(user名、host名は上記の画像と一致)
`DROP USER user名@host名;`
Google Cloud Storage Sql gcp sql インポート、エクスポート

とにかく不安。
手動でも良いのでインポートとバックアップの方法を書いておく。

・第２世代を使う
・phpmyadminはインストール難しそうなので、 heidi sql を使う。
・外部から接続しての mysqldump は重すぎて途中で停止してしまうので諦める


# vps からバックアップを取得

```

mysqldump --default-character-set=utf8mb4 -uroot -pyourpass --all-databases | gzip > /var/backup/love-db.sql.gz

```

ファイルができたらダウンロードして保存しておく。

# MYSQLを作成

GCP 左上サンドウィッチメニューからSQLを選択

インスタンスを作成

東京
asia-northeast1

大阪
asia-northeast2


データベースのフラグ

character_set_server utf8mb4
default_time_zone +09:00
max_allowed_packet 1073741824
wait_timeout 86400


ついでにmysql5.7だと色々バグるのでSQLモードも。
sql_mode	
STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

をそれぞれ選択。

# インポート

storage を選択して
そこに先程の `love-db.sql.gz` をアップ。
んで、インポート。

これで完了。

# エクスポート

SQLを選択し、画面上部のエクスポートをクリック。
で、保存する storage を選択。

するとエクスポートされる。
このエクスポートされたファイルを先程選択した storage からダウンロード。

名前を bup.sql に変更し、vpsにアップロード。

phpmyadmin で先に

love_letter の テーブル を作っておく

```

mysql -uroot -p love_letter < bup.sql

```

こんな感じでテーブル単位でエクスポートしてく。

ちなみに、ロリポップからだと
IPアドレスの問題か知らんがsqlに繋げない。
さくらサーバーならレンタルサーバーでもつなげる。

cakephpや、laravelのDB設定のキャッシュを削除、
インポートしたら一旦サーバーをリブート
ロードバランサーを使っている場合は

・各サーバーのIP、ロードバランサーのIPをそれぞれ入れること。

途中でDBサーバーのインスタンスのスペックを更新した場合は5分ほどで再起動される。
Kindle Cloud ReaderをGoogle Chromeで読んだ際、やたらとストレージを取る場合の対処法

## 問題

MacでKindle Cloud ReaderをGoogle Chromeで読んだ際、やたらとストレージを食う。

## 対処法

macOS Mojave バージョン 10.14.6の場合

**`~/Library/Application Support/Google/Chrome/Default/databases`**

以下に、**`https_read.amazon.co.jp_0`**というものができているはず。
どうもここにSQLite3のファイルがあるそうで、それを削除すればよい。

また読みたい場合は再ダウンロードすればいい。
第２回 ArduinoによるI2C パラレスインターフェース(GPIO)の操作


第１回でArduino UnoにLucky Shieldをつなぎ、ライブラリ経由でアクセスできました。とはいえ、ライブラリ頼りでは、手を入れるときになにかと不便ですので、ちゃんとインターフェースを調べました。

第１回 [Arduinoはじめました](https://qiita.com/0x20FE/items/59f1a55117dd030f3033)
第２回 [ArduinoによるI2C パラレスインターフェース(GPIO)の操作](https://qiita.com/0x20FE/items/b40d8a69f2903bc51cfd)

## 拡張GPIO
Arduinoにはもともとデジタルインターフェースが付いていますが、LEDやJoy stickなど繋ぎたいスイッチを増やすためにI2C GPIOが使われてますね。

#### CAT9555 I2C バスコントローラ
Lucky sheildのI2C GPIOにはCAT9555がつかわれてます。

device address は "0 1 0 0 A2 A1 A0"で、lucky ではA2 A1 A0='0'なので0x20となります。

|コマンド |dir|レジスタ|default
|--:|--:|:--|:--|
|0|read|input port 0|0x00|
|1|read|input port 1|0x00|
|2|write|output port 0|0xFF|
|3|write|output port 1|0xFF|
|4|write|Polality Inversion port 0|0x00|
|5|write|Polality Inversion port 1|0x00|
|6|write|Configuration port 0|0xFF 入力|
|7|write|Configuration port 1|0xFF 入力|

まず、setup()ではレジスタの6,7に入出力方向をセットする。

```C++:setup
#define ADDRESS      (uint8_t)0x20
#define INPUT_PORT0  (uint8_t)0x00
#define OUTPUT_PORT0 (uint8_t)0x02
#define CONFIG_PORT0 (uint8_t)0x06
#define CONFIG_PORT1 (uint8_t)0x07

#define LED1 (uint16_t)0x1000
#define LED2 (uint16_t)0x2000

Wire.beginTransmission(ADDRESS)
// REL2,REL1,LED2,LED1, PIR INT#,ALT INT,MAG INT,ACC_EN
//   O    O    O    O       I        I       I     O
Wire.write(CONFIG_PORT0,0x0E);

// OLED RES#,PB2,PB1, JOYC,R,L,D,U
//   O       I   I     I I I I I
Wire.write(CONFIG_PORT1,0x7F);
Wire.write(OUTPUT_PORT0,0x00);
Wire.endTrasnmission();
```

I2Cでの書き込み手順はデバイス番号、レジスタ、データと順番に書き込む。

```C++:RawWrite_8
// I2Cシーケンス : start,dev(ADDRESS),w,a,reg(INPUT_PORT0),a,stop
Wire.beginTransmission(ADDRESS);
Wire.write(OUTPUT_PORT0);
Wire.write(data);
Wire.endTrasnmission();
```
ただし、１バイトすべて書き込んでしまう。１ビットだけ変更する場合は、以下の手順を踏む必要がある。

1.レジスタの値を一旦読み出す
2.該当ビットを書き換えた値を作成
3.その値をレジスタに書き出す

I2Cの読み出し手順は、

```C++:RawRead_16
//step 1) 読み出しレジスタを０にセット
// I2Cシーケンス : start,dev(ADDRESS),w,a,reg(INPUT_PORT0),a,stop
Wire.beginTransmission(ADDRESS);
Wire.write(INPUT_PORT0);
Wire.endTrasnmission();
// step 2) ２バイトを連続読み出しする
// I2Cシーケンス : start,dev,r,a,1st_byte,a,2nd_byte,nak,stop
Wire.requestFrom(address,(byte)2);
if (Wire.available()) {
    data =Wire.read()<<8;//dataはuint16_t
}    
if (Wire.available()) {
    data |=Wire.read();//2byte目
}    
```
##まとめ
- setupにて入力、出力をセットする
- 標準的なI2Cの手順でレジスタにアクセスする
- ビット書き込みの場合は、先に１バイトreadし、該当ビットを操作した値を書き込む
子要素のイベントを親要素へ伝搬させないようにする

#バブリングというもの
イベントは伝搬される。
そのため、子要素で発生したイベント（例えばクリックイベントなど）は、
最終的にルート要素まで伝搬し、Clickイベントがあると実行される。
このイベントの伝搬のことをバブリングという。

#イベント発生から伝搬されるまで
以下記事でわかりやすく説明されています。
 [DOMイベントのキャプチャ/バブリングを整理する 〜 JSおくのほそ道 #017](https://qiita.com/hosomichi/items/49500fea5fdf43f59c58#%E5%86%85%E5%81%B4%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%A4%96%E5%81%B4%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%92%E7%99%BA%E7%94%9F%E3%81%95%E3%81%9B%E3%81%AA%E3%81%84)

>イベントが発生すると下記の流れでイベント伝播が発生します。
>
- **(キャプチャフェーズ)** DOMツリーをたどってルート要素から発生要素を探しに行く
- **(ターゲットフェーズ)**発生要素を検出する
- **(バブリングフェーズ)** 今度はルート要素まで遡る
>![バブリング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474743/855ff2b1-22c8-ed47-56a6-fcbfadf46589.png)

> [W3C](https://www.w3.org/TR/DOM-Level-3-Events/)


# 子要素のイベントを親要素へ伝搬させないようにする
本題ですが、
子要素のイベント関数内で、
stopPropagation()メソッドを実行してあげることで止めることが可能。
構文としては、
```
event.stopPropagation();
```
Clickイベントを追加した場合は、
親要素へのイベントの伝搬がないかを確認するようにする。
Web広告指標用語・意味・計算式（個人のお勉強用）

## imp
**インプレッション**
広告がユーザーに表示されること
広告がユーザーに表示された回数は「**インプレッション数**」と呼ばれる
## CL
**クリック数**
広告がクリックされた数
## CTR
**Click Through Rate**
**クリック率**
広告がユーザーに表示された回数（インプレッション数）のうちクリックにつながった割合

|計算式|
|:-----------------|
|**CL ÷ imp = CTR（%）**|
## CV
**Conversion**
**コンバージョン**
**成果**
目標到達となる行動のこと
（サイトなどによってなにをCVとするかは異なる）

##CVs
**コンバージョン数**
広告から発生した成果の数のこと

## CVR
**Conversion Rate**
**コンバージョン率**
広告がユーザーにクリックされた回数のうちそれがサイトのCVに結びついた割合

|計算式|
|:-----------------|
|**CV ÷ CL = CVR（%）**|
## CPC
**Cost Per Click**
**クリック単価**
クリック課金型のネット広告（※）においてクリック1回あたりにかかるコスト
（※）リスティング広告や一部のバナー広告などユーザーのクリックごとに広告費が発生するネット広告のこと
## CPA
**Cost Per Action**
**顧客獲得単価**
**獲得単価**
クリック課金型（成果報酬型）の広告で顧客1人を獲得するのにかかったコスト

|計算式|
|:-----------------|
|**CPC ÷ CVR = CPA**|

|計算式|
|:-----------------|
|**CPC ÷ CV = CPA**|
## CPI
**Cost Per Install**
**1インストールあたりの広告コスト**
APP Store ・Google Play Storeなどからアプリケーションをダウンロードし、インストール・起動するまでの単価
## CPM
**Cost Per Mille**
**1,000回表示あたりの広告コスト**

|計算式|
|:-----------------|
|**広告費 ÷ インプレッション数 ×1000 = CPM**|

## ROAS
**Return On Ad Spend**
**広告費の回収率**
**広告費の何%売上が上がったか**
**広告費に対して発生した売上の割合（%）**

|計算式|
|:-----------------|
|**売上 ÷ 広告費×100 = ROAS**|
|**広告費から発生した売上 ÷ 広告費 × 100(%) = ROAS**|

★例えば★
売上　　120万
広告費　40万
の場合
120 ÷ 40 × 100 = 300%
40万の広告費に対して300%の売上獲得
jqコマンドで改行の入ったjsonファイルをCSVに変換する

# 状況
jsonファイルをCSVに変換して、logstash経由でelasticsearchに取り込んでいる（そして、それをGrafanaで表示している環境）。
※CSV変換しないでjsonそのままで取り込めばいいとか、logstashなんで使うの？とかは自分の技術力の問題。
　jsonでparceエラー出るし、bulkの形式に合わせるの手間だし、何も考えずにCSVぶっこみをしています。

CSV変換して取り込んでだいたいうまくいったんだけど、
改行を含んだデータがあって、はまったのでその対処のメモ。

# jqコマンドでの一般的なCSV変換
```
cat sample1.json | jq -r '.[] | [.key1, .key2, .key3] | @csv'
```
参考：https://medium.com/veltra-engineering/jq-supports-json-to-csv-fb5c951a9575

ところがこの場合、jsonの中に改行のあるデータがあると、
-rオプションでダブルコーテーションが外れて、改行コードのとこで改行されてしまう。
結果、CSVデータの改行がぐちゃぐちゃになって、elasticsearchのデータがおかしかったり、取り込めなかったりした。

# 改行と-r(--raw-output)オプション
改行を含んだjsonを改行させずにCSV化するにはどうしたよいか？
jqの@csvは、ググるとどのサイトも-rオプションが付いている。
でも、-rオプションをつけると、その時点でjsonのダブルコーテーションが外れて、改行されてしまう。

ということでsedコマンドで-rなしでCSVにできる形にし、@csvでCSV化することにした。

# sed処理
こんな感じ。
実際は、-rつけてCSVにできたデータと、
-rなしを見比べながら、微調整した。
※なので、自分の環境特有の対処だと思うけど、方法論としては汎用的かなと。

```
cat sample1.json | jq '.[] | [.key1, .key2, .key3] | @csv'　\
|sed　's/\\\\/\\/g' \ #各keyの値の中の\が\\になっていたので、元の\に戻す
|sed　's/\\\"/\"/g' \ #各keyの値が"ではなく\"で囲われていたので"に戻す
|sed　's/^"//g' \ #文頭についていたダブルコーテーションの削除
|sed　's/"$//g' \ #末尾についていたダブルコーテーションの削除
>> hoge.csv
```
Could not get GOOGLE_APP_ID in Google Services file from build environmentが出るときの解決法

もしかして: **Xcodegenをお使いではありませんか？** もしくは、Crashlyticsのスクリプトをかなり序盤で使っていませんか？

# 原因
Fabric/runは、cocoapodのスクリプトの後に走らせないといけないところを、xcodegenでは必ず最後にcocoapodsのスクリプトを最後に走らせる暗黙の仕様があるので、問題が発生している。

# 解決方法
https://qiita.com/gin0606/items/3935027fef9597ddf6e7

以上の記事にも書いてあるが、こんな感じでPodfile内にbuild phaseスクリプトを書けるドンピシャの機能があるので、これで実行順序を保証しつつ解決できる。もちろんXcodegenの機能で解決できるのが一番良いので、本体のGitHubにPR出すのが良さそう。

```ruby:Podfile
target 'Project' do
    pod 'Fabric', '~> 1.10.2'
    pod 'Crashlytics', '~> 3.13.3'

    script_phase :name=> 'Fabric',
                 :script=> '"${PODS_ROOT}/Fabric/run"',
                 :input_files=> ['$SRCROOT/$PRODUCT_NAME/$(INFOPLIST_PATH)']
end
```
Angularでの同一ページ内アンカー設定方法

#Angularでの同一ページ内アンカー設定方法

とても簡単な話だが、普通の方法だと（以下）動かない。

```html
<a href="#abc">ジャンプ元</a>

<span id="abc">ジャンプ先</span>
```

というかhttps://ドメイン名/#abc へジャンプしてしまう。

ActivateRouterを使う方法があるようだがメンドクサイ～～～～

で、一番簡単な方法。<strong>ngx-page-scrollモジュールをインストールしてしまう。</strong>
<strong>※ただしその前にcoreのインストールが必要</strong>

```bash
npm install ngx-page-scroll-core --save
npm install ngx-page-scroll --save
```
<br>
そしたらいつものようにapp.module.tsに追記。

```ts
import { NgxPageScrollCoreModule } from 'ngx-page-scroll-core';
import { NgxPageScrollModule } from 'ngx-page-scroll';
 
@NgModule({
    imports: [
        /* Other imports here */
        NgxPageScrollCoreModule
        NgxPageScrollModule
        ]
})
```

<br>

これだけ。
実際に使用するページのコンポネントの方、***-component.tsのほうはまったく触る必要なし。

そしてHTMLのほうを・・・

```html
<a pageScroll href="#abc">ジャンプ元</a>

<span id="abc">ジャンプ先</span>
```

このようにジャンプ元のほうに`pageScroll`の単語一つ入れるだけ。

ああ…簡単で良かった:relaxed:

※ スクロールスピードなど細かい調整をしたい場合は<strong>ngx-page-scroll-core</strong>をインストールする必要があります。

<br>

当方環境Angular7
#####package.json

```json
//package.json
{
  "name": "benzoinfojapan",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~7.1.0",
    "@angular/cdk": "^7.3.4",
    "@angular/common": "~7.1.0",
    "@angular/compiler": "~7.1.0",
    "@angular/core": "~7.1.0",
    "@angular/fire": "^5.1.3",
    "@angular/flex-layout": "^7.0.0-beta.24",
    "@angular/forms": "~7.1.0",
    "@angular/material": "^7.3.4",
    "@angular/platform-browser": "~7.1.0",
    "@angular/platform-browser-dynamic": "~7.1.0",
    "@angular/pwa": "^0.13.5",
    "@angular/router": "~7.1.0",
    "@angular/service-worker": "~7.1.0",
    "core-js": "^2.5.4",
    "firebase": "^5.11.1",
    "firebase-admin": "^7.3.0",
    "firebase-functions": "^2.3.1",
    "firebaseui": "^3.6.1",
    "firebaseui-angular": "^3.4.1",
    "hammerjs": "^2.0.8",
    "igniteui-angular": "^7.3.0",
    "ngx-page-scroll": "^7.0.0",
    "ngx-page-scroll-core": "^7.0.0",
    "rxjs": "~6.3.3",
    "tslib": "^1.9.0",
    "web-animations-js": "^2.3.1",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "^0.13.9",
    "@angular/cli": "~7.1.4",
    "@angular/compiler-cli": "^7.2.15",
    "@angular/language-service": "~7.1.0",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "~8.9.4",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.1.1",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.1.6"
  }
}
```
<br>

参考：[ngx-page-scroll](https://www.npmjs.com/package/ngx-page-scroll)

<br>
Vuetifyのv-btnをHTMLのbuttonタグに置き換えた時にハマったこと

## 何がおきたか

とあるプロジェクトで、Vue.jsのVuetifyを使っていたのだが
諸般の事情により、Vuetifyを使わなくなったので、途中までVuetifyで組んでいたものを
通常のHTMLタグに戻す、という作業をしていた時にちょっとハマったこと。

```vuejs
<v-form method="get" action="">

（いろいろなForm入力要素がここに入っている）

<v-btn @click="doSend">
送信する
</v-btn>
</v-form>
```
(`doSend` はこのボタンを押した後に処理されるメソッド)

これを、以下のように書き換えた。

```vuejs
<form method="get" action="">

（いろいろなForm入力要素がここに入っている）

<button @click="doSend">
送信する
</button>
</form>
```

すると、 `doSend` の処理が走らなくなってしまった。

## 原因と修正方法

Vuetifyの `v-btn` 要素は、実際には以下のようにレンダリングされる。

```html
<button data-v-******* type="button">
送信する
</button>
```

`type="button"` が付与されるのがポイント。

一方、HTML要素の `<button>` タグは、`type`属性を指定しなかった場合、デフォルトは `submit` になる。

そのため、先程 `<button>` タグに置き換えた後、`doSend`メソッドが動作しなかったのは
`click`イベントよりも`submit`イベントが優先されたため、
`form`の`action`要素に指定したURL（上の例では空文字だが、自分自身）へ遷移してしまったためだった。

修正としては、`<button>` タグに `type="button"` を指定すればよい。
あるいは、そもそもこの場合、JavaScriptで処理させてしまう（画面遷移させない）作りだったので
formのactionが作動しないよう、`javascript:void(0)`を指定する方法でもよいはず（こちらの方法は採用しなかった）。
A*アルゴリズム

エイアスター アルゴリズム


http://kussharo.complex.eng.hokudai.ac.jp/~kurihara/classes/AI/heuristic.pdf

https://qiita.com/2dgames_jp/items/f29e915357c1decbc4b7

http://www.net.c.dendai.ac.jp/~matsuda/
LaravelのEloquentで最初のn件とn件目以降のデータを取得する

# Eloquentで最初の5件を取得
最初の5件を取得するには take メソッドが便利。

```php5
$datas = Model::where('hoge', 0)->get();

// 最初の5件
$datas->take(5)
```

# Eloquentで最後の5件を取得
最後の5件を取得するなら splice が便利だ

```php
$datas = Model::where('hoge', 0)->get();

// 最初の5件を削除した残り
$datas->splice(5)
```
第１回 Arduinoはじめました


こんどはArduinoをさわってみました
第１回 [Arduinoはじめました](https://qiita.com/0x20FE/items/59f1a55117dd030f3033)
第２回 ArduinoによるI2C パラレスインターフェース(GPIO)の操作
 

## 用意したもの
###本体
1. Arduino UNO
2. USB A<-->Bケーブル
3. windowsマシーン(macでもlinuxでも)
4. lucky shield

###開発環境
1. Windows ZIP版のIDEをダウンロードして解凍
2. ardionoをクリックしてIDEを起動

## Hello Lチカ
### 手順
1. IDEを起動
2. USBでUNOと接続
3. シリアルポートをセット(ツール/シリアルポート/COMx(Arduino/Genuino Uno)を選ぶ
4. ボードを選ぶ(ツール/ボード/Arduino/Gunuino Uno)
5. スケッチ例を開く(ファイル/スケッチ例/01.Basics/Blink)
6. スケッチを検証(ツールバーのチェックマークアイコン)
5. 書き込み(ツールバーの矢印アイコン)

###スケッチを読む
- コメントは//や/* */
- void setup()に設定を書く。リセット後最初に一度だけ呼ばれる
- void loop()ここを繰り返し実行する。

###デジタルピンの使い方
pinMode(pin, mode) setup()にてデジタルピンを入力で使うか出力で使うかを設定
digitalWrite(pin,HIGH|LOW) デジタルピンへの出力
digitalRead(pin) デジタルピンの読み込み
###アナログピンの使い方
そのうち調べて追記します。

###定石
```C++:loop()
//最も単純なイベント処理の記述
void loop{
   if (イベント) {
        処理
        必要に応じてdelay(継続時間);
   } else if (イベント) {
        処理
        必要に応じてdelay(継続時間);
   } else {
        処理
        必要に応じてdelay(継続時間);
   }
}
```

## Lucky shieldを試してみる
いろいろついているのが良さそうなので
[回路図](https://s3-ap-northeast-1.amazonaws.com/switch-science.public/datasheets/shield_lucky_v032_20150224.pdf)をみると、いろいろなセンサーやスイッチ類がI2Cで接続されている。I2C接続なので、digitalRead(),digitakWrite()のように単純にはアクセスできない。これらを隠蔽するライブラリが用意されているので、とりあえず、これを使う。

###ライブラリのインストール
1. ライブラリがあるので、githubの[arduino-libray-lucky-shield](https://github.com/arduino-org/arduino-library-lucky-shield) からダウンロード
2. スケッチ/ライブライをインクルード/.zip形式のライブラリをインストール

###サンプルを動かす
5. スケッチ例を開く(ファイル/スケッチ例/Lucky Shield/Lucky Test)
6. スケッチを検証(ツールバーのチェックマークアイコン)
5. 書き込み(ツールバーの矢印アイコン)
6. シリアルコンソールをオープン

|サンプル||
|--:|:--|
|Lucky Test|LED、リレーカチカチ、LED,JoyStick,加速度センサー,磁気センサー,気温・気圧・湿度表示|
|PreseceAlarm|PIRセンスでブザーをならす|
|SimpleGIO|JoyStickの動きに応じてLED点滅、リレーON/OFF|
|WeatherStation|温度、湿度、気圧表示|

一通りためしてみましたが、PIRがちゃんと反応しない。調整が必要なのか、壊れているのか。

###ライブラリの使い方
```
#include<Lucky.h>
void setup(){
	lucky.begin();
}
void loop(){
    //digital
	luckygpio().digitalRead(pin);//JOY{L|R|U|D|C},LED{1|2},REL{1|2},PB{1|2}
	luckygpio().digitalWrite(pin,{HIGH|LOW});
    //analogue
    lucky.accelerometer().read();
    lucky.accelerometer().x();
    lucky.accelerometer().y();
    lucky.accelerometer().z();
    //
    lucky.magnetometer().read();
    lucky.magnetometer().x();
    lucky.magnetometer().y();
    lucky.magnetometer().z();
    //
    lucky.environment().temperature();
    lucky.environment().pressure();
    lucky.environment().humidity();
}
```

##まとめ

- 本体とUSBケーブルとPCがあればとりあえず始められる。
- スイッチやLEDなどデジタルパラレルインターフェース(GPIO)の操作は極めて簡単。アナログも同様と思う。
- センサー類やGPIOの拡張はI2Cで接続されているので、ライブラリを使おう。
Capybaraのnot_toが遅すぎる件について

# 前置き


Capybaraでテストコードを書いていると
expect文が異常に遅いことがあります。
否定系、つまり「not_to」や「to_not」を使っている箇所がおっっっっそいのです。

```ruby
expect(page).not_to have_checked_field('ラベル')
```

### 使用ツール
* Rspec
* Capybara

# 改善
「not_to」はタイムアウトまで待ってから要素が存在しないことを確認しているそうです。
なので、マッチャを否定系に変えてあげれば劇的に速度が改善されます。

```ruby
expect(page).to have_unchecked_field('ラベル')
```

どちらのコードも動作は同じですが、速度が全然違います。
なんかテストが遅いなー、重いなーって困ってた人は試してみてください。
UTF-8 BOM付き・BOM無しでハマった

# はじめに
エンコード「UTF-8」のiniファイルを読み込むプログラムを作成し、開発環境ではいい感じだったのに、本番環境でプログラムを実行したら想定結果が違う...
という現象が発生した。


# なにをしたのか
環境移行する際、ファイル転送速度を早くするため、開発環境でiniファイルを圧縮(zip)してから、本番環境にコピーした。プログラム実行時にzipを解凍した。
iniファイルの内容を確認して、保存…。
<details><summary>~~どうやらこの時に**「UTF-8」→「UTF-8 BOM付」**になってしまったらしい。~~</summary>
<2019.11.15更新>
Windowsの「メモ帳」は文字コードをUTF-8にして保存すると必ずBOM付きになってしまうらしい。
iniファイルを確認した時に不覚にもメモ帳で開き、保存してしまったのだろう…</details>

ズバリ　UTF-8 BOM付き・BOM無しの違いは**先頭の３バイト**があるか無いか
それ以外のファイルの内容や文字コード（符号化方式）については全く同じものです。

つまり、「UTF-8 BOM無し」で作成したiniファイルはBOMなんて考慮していないですから
ファイルの先頭には最初のセクションタイトルを記載していました。

それがファイルを保存したタイミングで「BOM付き」になってしまったので、先頭の３バイトがBOMとして扱われて、プログラムでiniファイルを読み込む時に飛ばされてしまったんですね。

それ故に最初のセクションが読み込めず、気づかぬうちに設定がめちゃくちゃになってしまっていたので、本番環境で動かしたときに想定結果が異なってしまったのです。

# 「BOM付き」→「BOM無し」に戻す
様々なテキストエディタで設定変更が可能なそうですが、私はサクラエディタを使って設定を直しました。

 1. サクラエディタでiniファイルを開いて、右下の「UTF-8 BOM付」をダブルクリック
 1. 「BOM」の[✓]を外す
 2. 保存する
 
以上。この手順を行なってからプログラムを実行したら、正常に終了できました!

## メモ帳使用時の注意
Windowsの「メモ帳」は文字コードをUTF-8にして保存すると必ずBOM付きになってしまうらしいです。うっかりBOM無しのファイルを「メモ帳」で編集して上書き保存してしまうとBOM情報が書き換えられてしまうので注意が必要です!

普段Windowsのメモ帳をつかう癖が無かったので今まで気にしていなかったが
何気なくメモ帳で開いてしまったんですね…。これが原因だったのか…。


## 参考サイト
[UTF-8のBOM付き・BOM無しの違いと確認方法](https://uxmilk.jp/48923)
他サービスからFirebase Hostingにサイト移設した時にちょっとハマったこと

とあるサイト（ほぼ静的な要素しかない、単一ページのサイト）を、少し機能を足して、Firebase Hostingに移設した時にちょっとハマったこと。

Firebase Hostingでは、「ドメインを接続」という機能で、カスタムドメインを利用することができる。
この時、SSL証明書もデフォルトでLet's Encryptのものを発行してくれるので、楽ちん、かつコストかからず。

なので、新規サイトを立ち上げる時はいいのだが
今回は既存のサイトがあって、ドメインはそのまま使いまわし、DNSだけFirebaseに向け直せばいいだろう、と安易に考えていた。

ところが、Firebase Hostingで自動的に発行されるSSL証明書は
**DNSをFirebaseのIPアドレスに向けた後に、発行処理される** ため、
IPアドレスをFirebaseに向けてから、SSL証明書が発行され有効になるまでの間に **タイムラグが発生する。**
自分が試したときには、およそ20分ほどかかった。
この20分間の間にサイトにアクセスすると、ブラウザの証明書が正しくない旨の警告が表示されてしまう。

自分が担当した案件では、作業時間を調整して、
この20分間ブラウザ警告がでてしまうことを許容してもらうことで解決した。

このブラウザ警告が出てしまう時間がサービス的に許せない場合は。。。どう解決したらいいのだろうか？
自分は良い方法が思い浮かばなかった。
[Bookmarklet] ページ上のすべての入力フォームに好きな値を一気に入力する

テスト中に、1ページ内の入力フォームの数が多いとバリデーションエラーの確認が大変。。。
ということで、ページ内のすべてのフォームに好きな値を入力できるBookmarkletを作りました。  

※ バリデーションエラー: 入力チェックのことです。
https://wa3.i-3-i.info/word11610.html

## 対応している要素・タイプ
```
- input
    - text
    - number
    - tel
    - email
    - url
    - datetime
    - password
    - search
- textarea
```

## 使い方

1. ブラウザを起動する(Chromeのみ動作確認済み)
2. ブックマークマネージャーを起動する
3. 新しいブックマークを作成で以下を入力し保存する  
・ ブックマーク名: 任意のもの  
・ URL: 下記のコード
4. 使いたいWebページを開き、Step.3のブックマークをクリックする

## ソースコード
```js
javascript:
(function(){
    var text = window.prompt("フォームに何を入力しますか？", "");
    var elements = document.querySelectorAll('input');
    for(var i = 0; i < elements.length; i++){
        switch(elements[i].type){
            case "text":
            case "number":
            case "tel":
            case "email":
            case "url":
            case "datetime":
            case "password":
            case "search":
                elements[i].value = text;
                break;
            default:
                break;
        }
    }
    elements = document.querySelectorAll('textarea');
    for(var i = 0; i < elements.length; i++){
        elements[i].value = text;
    }
}())
```



## 参考にしたサイト
- [\<input\>-HTML5タグリファレンス](http://www.htmq.com/html5/input.shtml)  
- [\<TEXTAREA\>－HTMLタグリファレンス](http://www.htmq.com/html/textarea.shtml)  
- [JavaScriptでフォームに仮入力できるブックマークレット \| 大石制作ブログ](https://blog.s0014.com/posts/2016-08-17-js-dummy-input-form/)
- [全inputに文字列を入力するテスト用のブックマークレット · GitHub](https://gist.github.com/miukoba/3864399)
- [\<input\>の使い方とtype属性の一覧をサンプル付きで紹介 \| webliker](https://webliker.info/39533/)
Webpack でビルドが稀に落ちる現象の回避

# [2019/08/26] 追記

また Webpack が落ちてしまいました。
`--max_old_space_size=2048` だけではダメなようです。

今はこの設定で試してみてます。

```
--max_old_space_size=2048 --gc_interval=100
```

あと、Node.js の V8 関連オプションの一覧を作ってくださってる方をみつけた。
[Node V8 GC\-related options](https://gist.github.com/listochkin/10973974)

---

こういうやつ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10092/c947f7b2-600d-7183-4efe-c6ae11032328.png)

V8 がメモリ不足か何かで落ちる現象みたいです。

```
Ineffective mark-compacts near heap limit Allocation failed - Javascript heap out of memory
```


これを回避するには `--max_old_space_size={MB}` を Node.js の引数として設定してあげればいいらしい。

npm scripts で Webpcak を使ってる場合はこんな感じ。

```json:例
{
  "dev": "cross-env NODE_OPTIONS=--max_old_space_size=2048 webpack"
  "dev2": "node --max_old_space_size=2048 node_modules/webpack/bin/webpack.js"
}
```

参考:

- [webpack\-dev\-server and JavaScript heap out of memory · Issue \#1433 · webpack/webpack\-dev\-server](https://github.com/webpack/webpack-dev-server/issues/1433)
- [yarn serve \- JavaScript heap out of memory crash · Issue \#1453 · vuejs/vue\-cli](https://github.com/vuejs/vue-cli/issues/1453)
- [Angular 7/8 FATAL ERROR: Ineffective mark\-compacts near heap limit Allocation failed \- JavaScript heap out of memory · Issue \#13734 · angular/angular\-cli](https://github.com/angular/angular-cli/issues/13734#issuecomment-477455693)
- [Best way to set \-\-max\-old\-space\-size when running npm? · Issue \#12238 · npm/npm](https://github.com/npm/npm/issues/12238#issuecomment-367147962)

ただ記載されているのが `--max-old-space-size` だったり `--max_old_space_size` だったりして、どっちが正しいのか分からないしV8も意図的に落とせないので効果が確認しづらい。Node.js の `--help` を見ても両方とも載ってないので、効いてるのかどうか分からない…。

ちょっと古いけど、詳細な設定はこちらの記事を参考にするとよさそう。
[2016年版 Node\.jsで幸せになれる10の習慣 \- Qiita](https://qiita.com/ksato9700/items/b21383e613b6dc308dca#7-%E3%82%B4%E3%83%9F%E3%82%92%E9%81%BF%E3%81%91%E3%82%8D)
1日のまとめ　8/20(火)

①MySQL

ググった単語
・データベース...端的に言うと、沢山の情報を纏めて管理できるソフトウェア。且つその情報を使用できる。用途は主に検索、抽出。



1..データベースの一覧記述

````
mysql>show databases; //Enter
````

2..データベースの作成記述

````
create database データベース名　//Enter
```

3..データベースの削除記述

```
mysql>drop database データベース名 //Enter
````

②HTML
ググった単語
・styleタグ..HTMLのhead要素の中にスタイルシートを直接記述するためのタグ。
・toransitionプロパディ...セレクタを変化させるまでの時間を設定するプロパディ。

```

<DOCTYPE html>
  <html>
    <head>
      <title>ナビゲーションバー勉強</title>
      <style>
        body{
          margin:0;
          padding:0;
          background:#ccc;
        }
        .nav ul{
          list-style:none;
          background:#663366;
          text-align:center;
          padding:10px;
          margin:0;
        }
        .nav li{
          display:inline-block;

        }
        .nav a {
          text-decoration:none;
          color:#fff;
          display:block;
          padding:15px;
          margin:15px;
          font-size:20px;
          font-family:Helvetica;
        }
        .nav a:hover {
          background: #000;
          transition:0.4s;
        }
        </style>
    </head>
    <body>
      <div class ="nav">
        <ul>
          <li><a href ="#">ホーム</a></li>
          <li><a href ="#">練習</a></li>
          <li><a href ="#">ブログ</a></li>
          <li><a href ="#">ニュース</a></li>
          <li><a href ="#">お問い合わせ</a></li>
        </ul>
      </div>
      </body>
      </html>
```
Androidで色の透過率を指定する

# Color.argbで指定する方法

```kotlin:example.kt
import android.graphics.Color

Color.argb(128, 51, 51, 51)
```

引数として以下の4つの値を10進数（0〜255）のintで渡す。

- alpha 透過率
- red 赤
- green 緑
- blue 青

↑の例の場合、以下のような値を渡している。

- alpha = 128
- red = 51
- green = 51
- blue = 51

# colors.xmlで定義する方法

```xml:app_name/app/src/main/res/values/colors.xml
<color name="example">#80333333</color>
```

2桁ごとに以下の4つの値を16進数（0〜FF）で指定する。

- alpha 透過率
- red 赤
- green 緑
- blue 青

↑の例の場合、以下のような値を定義している。

- alpha = 80
- red = 33
- green = 33
- blue = 33

# 実装の際に参考になったサイト

- [ARGBのカラーコード透明度まとめ - Qiita](https://qiita.com/konifar/items/106731d8a35303606597)
- [2進数、8進数、10進数、16進数相互変換ツール](https://hogehoge.tk/tool/number.html)