OmniAICreator/Qiita-1.07M huggingface dataset:
令和を祝うWebサイトテンプレートを創りました

# 令和を祝うWebサイトテンプレートとは
新元号の発表を祝いたいけれど、何をしたらいいかわからない……
そんな悩みを抱えている方も多いのでは？
そんな方のために、このテンプレートを作成しました

![reiwa.gif](https://qiita-image-store.s3.amazonaws.com/0/333454/acc3eab7-b6ce-6aec-fba9-5b2c374c2279.gif)

いらすとやの[「元号を発表する人のイラスト（令和）」](https://www.irasutoya.com/2019/04/blog-post_34.html)が高速に流れるテンプレートです。
これだけの速度で元号を発表され続ければ、否応なしに祝福ムードが漂いますね！
Webサイトをお持ちの方は、自分のサイトに組み込んで頂いて、令和を祝いましょう！！

サイトはこちら↓です。
https://nkj11.github.io/Reiwa/

# 技術的な部分
画像を動かしている部分はjQueryで実現しています。
「slick」というプラグインを作っています。

```javascript:main.js
jQuery(function($){
    $('.slider').each(function(){
		$(this).slick({
			autoplay:true,
			autoplaySpeed:1,
			dots:true,
		});
	});
});
```
最高速で動かしています。
それだけ令和を祝いたい気持ちが現れている、と思ってください。
自分のサイトに使う際は、このスピードでやって頂きたいですが、
autoplaySpeedを変更すれば、もうちょっと遅くすることもできます。

# 参考にしたサイト
下記を参考（というかほぼそのまま）にして作らせていただきました。

[【jQuery】スライダープラグイン「slick」の使い方を詳しく解説](https://webdesignday.jp/inspiration/technique/jquery-js/3847/)
CloudWatch Logsを日次でS3にExportするStep Functions

# はじめに
皆さん、AWS上のログってどうしてますか？
EC2/RDS/Lambda/API Gateway 等いろんなサービスがログを吐きますよね。

しかし、CloudWatch Logsに保存し続けると結構なコストがかかるので、
S3に移して安く済ませたい方は多いはず！

[サブスクリプションフィルタ](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SubscriptionFilters.html)でKinesisとかに送っても良いのですが、
Kinesisにもお金がかかる･･･

[S3へのエクスポート](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/S3Export.html)を使って、お安くアーカイブしたい！
と思って考え始めました。


# 仕様調査
### CloudWatch Logsのエクスポートの仕様
一つのロググループがS3にエクスポート中だと、
それが完了するまで、次のエクスポートタスクは作成出来ません。

### Lambda Functionの制約
CloudWatch Logsの仕様を見て、Lambda Function一つでloopしながら待つ事も考えたのですが、
Lambda FunctionのTimeoutの制限もあり、ロググループが増えたら、しんどくなる･･･

# 解決策
**リアルタイムでデータが欲しいわけじゃないから、
Step FunctionでLambda Functionを数珠つなぎにして、のんびり動かせばいい！**

# 実装
## CloudFormationのテンプレート
CloudFormationの一枚のTemplateにまとめてます。(メンテナンス性悪いですが･･･)

Templateはせっかくなので、Githubに上げてみました
※初めてReadmeを英語で書いたので、拙い英語はお許しください･･･
https://github.com/Jump-Kishimoto/CloudWatchLogs-Export

Usageをもっとこう書いた方が良い！とか
どうやったらいいか分からねぇ！とかあれば、本記事へのコメント/Issue/PullRequestでいただければ喜びます！
一緒にブラッシュアップさせて下さい！

## Step Functionのフロー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153178/8a2418f8-e736-ad93-b6e1-d6022632b834.png)

### GetLogGroup
同一リージョンのCloudWatch Logsのロググループ名を取得します。
ロググループ名を取得する時、まだ次のロググループが有る場合は、NextTokenの値が返ってきますので、
それをState Machineに返却し覚えさせます。

2回目以降、NextTokenがLambdaに渡されれば、そのTokenを使い次のロググループ名を取得します。

### CheckLogGroup
GetLogGroupの結果、ロググループを取得出来たかを判断し、ExportTaskの作成に移ります。

### CreateExportTask
GetLogGroupで取得したロググループに対して、前日分のログをS3にExportするTaskを作成する。
Exportする対象の時間はLambda Function実行タイミングの前日の0:00(JST)~当日の0:00(JST)です。

例）
**Lambda Functionが、2019/4/2 3:00(JST)に動いた場合**
Export範囲：2019/4/1 0:00(JST) ~ 2019/4/2 0:00(JST)　←前日分をまるっと。
**Lambda Functionが、2019/4/2 22:00(JST)に動いた場合**
Export範囲：2019/4/1 0:00(JST) ~ 2019/4/2 0:00(JST)　←22:00に動こうが、範囲は変わらず。

### WaitExportTask
ロググループのExportの完了を待つため、30秒待つ

### GetExportTaskState		
ロググループのExportのステータスを取得する。

### CheckExportTaskState
**Exportが完了している場合**
→　GetLogGroupの処理へ。

**Exportがまだ完了していない場合**
→　WaitExportTaskの処理へ。

## 簡単な流れの説明
同一リージョンにあるロググループを昇順で一つずつ取得し、一つずつExport Taskを作成します。
しばらく待ってからチェックし、終わってなければまた待つ。終わっていれば次のロググループの取得へ。

というのをひたすら繰り返すだけです。
Step FunctionsのTimeOutが1年なので、State MachineがTimeoutする事はないでしょう。

## S3にどう吐かれるの？
```
s3://{Bucket名}/CWLogs/{Region名}/{YYYY}/{MM}/{DD}/{ロググループ名}/{ExportTaksID}/{ログストリーム名}/00000.gz
```
というPathで吐かれます。

Lambda Functionのロググループなんかは"/"で区切られていますが、そのままExport先のPathとして使います。
S3マネジメントコンソール上では、サービス毎にフォルダが切られているように見えるので、見やすい気がしてます。

## どう使う？
CloudWatch Eventで日次で動かしてもらうのがいいかと。
↓は3:00(JST)に日次でState Machineを動かしている時のExport状況です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153178/d18d3c05-b82c-d7e8-aec5-ea968084e02a.png)

## オプション
Usageにも少し書いてありますが、State Machine手動実行時に、以下の様にExportしたい日付を指定する事も出来ます。
※エラー時の手動リトライなんかで使って下さい。

```json
{
  "TargetDate": "2018-08-20"
}
```
↑の例だと、2019/8/20 0:00(JST) ~ 2018/8/21 0:00(JST)の範囲で、全てのロググループをエクスポートします。

## 最後に
Github、初めて使ったので色々ご指摘下さい！
使いこなしたい！
IssueやPullRequestもお待ちしてます！
Linuxのネットワーク設定備忘録

# Red Hat Enterprise Linux や CentOS のネットワークの設定
/etc/sysconfig/network-scripts/ifcfg-xxxxxxファイルを直接書き換えず、nmcliコマンドで設定する方法を備忘録として投稿します。
Tera termを初めて使う方など、ご参考にしてください。

# nmcli（Network Manager Comand Line Interface）

- ネットワークインタフェース（NIC）の確認

```
# nmcli d
```

以下より記載する"インタフェース"の部分は、nmcli d コマンドで出力されたインタフェースをお使いください。

```
例：# nmcli c m enp0s3 ipv4.method manual
```


- IPアドレスを静的（固定）に設定する。

```
# nmcli c m "インタフェース" ipv4.method manual
```

- IPアドレスを動的（DHCP）に設定する。

```
# nmcli c m "インタフェース" ipv4.method auto
```

- IPアドレスを設定する。

```
# nmcli c m "インタフェース" ipv4.address "IPアドレス"
（例：# nmcli c m "インタフェース" ipv4.address 10.1.1.3）
```

- IPアドレスにサブネットマスクを設定する。

```
# nmcli c m "インタフェース" ipv4.address "IPアドレス/サブネットマスク"
（例：# nmcli c m "インタフェース" ipv4.address "10.1.1.3/24）
```

- デフォルトゲートウェイを設定する。

```
# nmcli c m "インタフェース" ipv4.gateway "デフォルトゲートウェイ"
（例：# nmcli c m "インタフェース" ipv4.address 10.1.1.255）
```

- まとめて設定する。
 
IP：固定　IPアドレス：10.1.1.3　サブネットマスク：255.255.255.0　デフォルトゲートウェイ 10.1.1.255

```
# nmcli c m enp0s3 ipv4.method manual ipv4.address 10.1.1.3/24 ipv4.gateway 10.1.1.255
```

- ネットワーク再起動（設定が終わったら必ず行ってください。）

```
# systemctl restart network
```

以上です。不備がありましたらコメントよろしくお願いいたします。
[GitHub]コマンドでPRを出す

### はじめに
この記事ではmac&bash向けに説明します。

# Hubコマンドを導入
hubコマンドをインストール

```
$ brew install hub
```

確認のため以下のコマンドを入力してみましょう。
正しくgitとhubのバージョンが表示されていればインストールは完了です。

```
$ hub version
git version 2.10.0
hub version 2.2.9
```

hubコマンドを `$ git ooo` で使えるようにするため `~/.bash_profile` に以下の1行を追記

```
eval "$(hub alias -s)"
```

設定を反映

```
$ source ~/.bashrc
```

これで導入は終わりです。

# PRを出してみる
hubコマンドの導入ができたので、実際にPRを出してみましょう。
普段通り、変更をadd, commit, pushまで行ったあとに以下のコマンドを叩きます。

```
$ hub pull-request
# $ git pull-requestでも可
```

このままだとGitHubの設定によっては、PRのbaseがmasterブランチになってしまう場合があるので、baseブランチを指定してあげます。

```
$ hub pull-request -b dev
# baseブランチ名がdevの場合
```

コマンドを実行するとviエディタが開きます。

```  
1　 コマンドでPRを作成する
2 
3　 # Requesting a pull to Hoge:dev from Hoge:introduction_hub_command
4 　#
5 　# Write a message for this pull request. The first block
6 　# of text is the title and the rest is the description.
```
このうち1行目がPRのタイトルとなる箇所です。空だとエラーになります。
1行目にはデフォルトで最終commitメッセージが入力されています。

PRの説明や、issueとの紐付けをする際は2行目以降に追記します。なくてもいいです。
※コメントアウト部分はメッセージとして認識されません。

ここまで終わったら `:wq`でエディタを抜けます。

対象のリポジトリに行くとPRが出ています∩(´∀｀)∩ﾜｧｲ♪

# でもまだ面倒くさい

PRをコマンドで出せても、そのあとGitHubで対象のPRまで行くのに画面遷移2回くらいしなきゃいけない。
面倒くさい。
時間は有限。

```
$ hub pull-request -b dev --browse
```
これで、PRが正常に出せたら対象のページが開きます。

# さらに
`~/.git_config`に

```
[alias]
    pr = pull-request -b dev --browse
```
と追記する事で `$ git pr`でPRを送信する事ができます。

# 終わり
毎日数回、多い時には十数回する作業を効率化できました。
手間を減らせるのは時間的にもストレス的にも良いですねヽ(*⌒∇⌒*)ﾉ

hubコマンドは他にも便利な機能があるので気になった方はぜひggって見てください。

良かったら[いいね]、悪かったらコメントにて指摘お願いします:bow:

## 参考
https://github.com/github/hub#installation
bashでgitのブランチ名を表示させる。

Homebrewでinstallしていることが前提の記事が多かったので、
自分用メモに自分がやった手順を記しておきます。

> $ git branch

でbranch名を確認することが多い人はやっておくと作業スピードがグングン上がります。

まず、
・git-prompt.sh
・git-completion.bash
この2つのファイルを探します。
Homebrewでinstallした人は
> /usr/local/etc/bash_completion.d/

にあるそうですが、自分はなかった。
どうやらHomebrewは使っていないらしい。

探し方は、

```

sudo find / -name git-prompt.sh
sudo find / -name git-completion.bash
```


で検索する。どちらも複数ヒットしたけど、
ヤマカンで、
> /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash
> /Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

でいくことにした（うまくいった）


次に、vi ~/.bashrcに下記を追記した。

```
$ vi ~/.bashrc

source /Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
source /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\n\$ '
```

最後に.bashrcから読めるようにするために、

```

$ vi ~/.bash_profile

source ~/.bashrc
```

を追記、
.bash_profileと.bashrcにやったことは

https://bottoms-programming.com/archives/terminal-branch-name.html
このサイトを参考にコピペしただけ。

試してみたらあっさりできた。

これで能率アップ間違いなし。
[自分メモ]ホスト名にアンダースコアは使えない

## 状況

めちゃくちゃ詰まった。

fuelPHPを動かそうと思い、「fuel_practice」という名前でプロジェクト作成。ホスト名も同じように設定したら、アプリケーションが作動しなくて困った。

この時、ローカル開発環境でバーチャルホストを使って色々アクセス振り分けてるのだけど、400が返ってくるも、原因不明。

```
# hostsファイル
192.168.33.20   fuel_practice
```

```
# 仮想環境として立ち上げたCentOSのvhosts.conf
<VirtualHost *:80>
  ServerName fuel_practice
  DocumentRoot "/var/www/html/fuel_practice/public"
  AllowEncodedSlashes On
  DirectoryIndex index.php
</VirtualHost>
```




### 原因

ホスト名にアンダースコアを使えない。


### 参考

ホスト名は、RFC952で定義されRFC1123で修正されたホスト名の標準命名規則に従い、以下の文字で構成するのが基本ルールのよう。

```


・英字(a～z,A～Z)

・数字(0～9)

・ハイフン(-)

・ピリオド(.)

　(*) ただしドメイン名の区切りでのみ使用可

その他、以下の制約がある。

・24文字以内

・大文字/小文字は区別されない

・最初の文字は英字または(RFC1123での修正に従い)数字のみ使用可

・最後の文字はハイフン(-)/ピリオド(.)以外の必要がある

・数字のみで構成されたホスト名は使用不可
```


[ホスト名とかドメイン名とかFQDNでアンダースコア - S_a_k_Uの日記みたいなDB　～サクゥーと呼ばないで～]
(http://d.hatena.ne.jp/S_a_k_U/touch/20130612)
Splunk Alert を Slack に飛ばしてみる


# 概要

運用とかでアラートを slack に飛ばすケースが多いので、Splunkでも同じようにアラートをSlackに飛ばしてみました。

## おおまかな手順
[Slack 側の設定] 
・Incoming Webhook App を作成し、webhook URLを取得する

[Splunk側の設定] 
・ Splunk Appsより、 slack alert のアプリをインストールする
・ アプリ設定画面で、取得したwebhook URLを登録する
・ アラート設定で Slackを選択する

## Slack 側の設定

1. Incoming Webhook Appを作成する
   https://api.slack.com/incoming-webhooks <br> 

   1. Create a Slack App を押す
   2. アプリケーション名と、対象のSlackワークスペースを選択する
   3. 作成するアプリの種類として Incoming Webhooksを選択する (図１）
   5. Incoming WebhookをEnable(On)する　（図２）
   6. 「Add new webhook to workspace」を押す（図２）
   7. 投稿先のチャネルを選択し、許可ボタンを押す（図３）
   8. webhook URLが作成されました。（図４）
   

図１： アプリの種類としてImcoming Webhookを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/4f3dcbc2-02f7-3b77-179c-6090c9933ae6.png)


図２：Incoming Webhookを Enable(On) し、 new webhookを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/a925da49-de67-756c-10c2-46cf34b0bfc5.png)

図３：投稿先チャネルを選択し許可する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/822e6e7d-85be-ae03-12d2-9f379b521bf2.png)
注意： Slack workspaceのオーナーでないと、webhook作成時に承認プロセスが入ります。

図４：Webhook URLが作成される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/ed04cbb4-0e7d-cb59-fff8-1792381b0a5b.png)




## Splunk 側の設定

1. Splunk Appsより、 slack alert のアプリをインストールする

　　今回は、Slack Notification Alertを利用しました。
　　https://splunkbase.splunk.com/app/2878/

　　(*) AppのInstall 方法については、ここでは割愛します。

2. Appの設定

　　このアプリはWeb画面がありませんので、「設定」 - 「アラートアクション」にて設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/069da4e7-574e-52db-be47-2adf7ee7f556.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/d783e8e3-30b4-3da5-b40f-e49e27eb576e.png)



### ここからは、通常のアラート設定

(*) ここでは、通常のアラート設定方法については割愛します。

3. アラート設定画面の アラートアクションに、 Slackを指定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/771eb13e-b7f4-4593-76a1-5860234a3d1a.png)

ちなみに、Attachment には、こちらが選択できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/c7fef31a-70f8-95da-991e-22ae2dc69911.png)

無事に Slackにアラートが飛んできました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/392303/bdaca4c7-f166-154c-9de7-fa0b8d200147.png)


## 最後に

設定自体は非常に簡単で、特に大きな問題はなく設定できましたが、Slack のアプリ作成(incoming webhook)には権限が必要なため、会社の Slack などを利用する場合は承認が必要になります。今回は検証のため、自分でSlack ワークスペースを作成して試しました。

Splunkでは、Slack連携として、逆に Slackの内容を Splunkに取り込んで分析することもできるようです。
https://splunkbase.splunk.com/app/3542/
Google Cloud Platform上でNode.jsとMySQLを繋げてみた

# はじめに
Google Cloud Platform (GCP) には魅力的な無料枠があり、操作も比較的簡単そうだったのでGCP上に構築したNode.js＋MySQLのスタックを接続してみました。

今回はGCPのApp EngineにNode.jsのアプリを構築し、Cloud SQL第二世代にMySQLを構築させました。

https://cloud.google.com/sql/docs/mysql/connect-app-engine?hl=ja
接続についてはこのリファレンスを読みましたがNode.jsが載っていなかったので書き残します。

#### 料金について
App Engineは規模が小さい場合基本的に無料ですが、Cloud SQLの運用は課金されました。
無料枠について：https://cloud.google.com/free/?hl=ja　
Cloud SQL料金について：https://cloud.google.com/sql/pricing?hl=ja

# Instanceの接続名の確認
Instanceの接続名はCloud SQLの接続に必要な項目です。`project_id:region:instance_id`の形式の文字列です。
GCPの「インスタンスの詳細」画面の中の「このインスタンスに接続」というボックスの中に表示されています。
これをコピーして、環境変数として保存しておきます。

```shell:.env
# プロジェクト名:hoge、インスタンス名：hoge-db、地域：東京 の場合
INSTANCE_CONNECTION_NAME="hoge:asia-northeast1:hoge-db"
```

# MySQL関係の項目の確認
Node.jsからMySQLにアクセスするにはもちろんデータベース情報が必要なので、これも一緒に環境変数として保存しておきます。

```shell:.env
# ...
DB_USER="hogehoge"
DB_PASSWORD="fugafuga"
DB_DATABASE="piyopiyo"
```

# Node.js側の設定
Node.jsからMySQLに接続するモジュールは色々ありますが、`mysql`というクライエントを使いました。

App Engineのスタンダード環境からCloud SQLのDatabaseに接続するときには、普通にTCPでは接続できないため、Unix Domain Socketという方法で接続します。

環境変数は`dotenv`というパッケージを使って取り込みました。

```javascript
require('dotenv').config();

const mysql = require('mysql');

const connection = mysql.createConnection({
  socketPath: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE 
});
```

App Engineスタンダード環境の場合、`/cloudsql/<インスタンス接続名>`のソケットが自動的に提供されるようなのでこのほかに何も設定する必要はありません。

## 接続プール
パフォーマンスを上げるためにプールを使う場合も、同じように接続できます。

```javascript 
const pool = mysql.createPool({
  user: process.env.DB_USER, 
  password: process.env.DB_PASS, 
  database: process.env.DB_NAME, 
  socketPath: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`
});
```

## 接続数上限
プールを使用する場合、接続数の上限も設定できます。

```javascript
const pool = mysql.createPool({
  // ...
  connectionLimit: 5
});
```

## TCPとの併用
開発環境ではローカルのMySQLにTCPで接続してほしかったので、`NODE_ENV`の環境変数に合わせて接続方法を変えるようにしました。

```javascript
const pool = process.env.NODE_ENV === 'production'
  ? mysql.createPool({
    user: process.env.DB_USER, 
    password: process.env.DB_PASS, 
    database: process.env.DB_NAME, 
    socketPath: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`
  }) : mysql.createPool({
    user: process.env.DB_USER, 
    password: process.env.DB_PASS, 
    database: process.env.DB_NAME, 
    host: 'localhost'
  });
```

# 完成
`gcloud app deploy`を実行してアクセスすると、データベースに接続できているはずです。

App EngineとCloud SQLのインスタンスが別々のプロジェクトの下に作られている場合、IAMを変更する必要があります。
App Engineのサービスアカウントに`Cloud SQL Admin` `Cloud SQL Editor` `Cloud SQL Client`の役割のいずれかを与えると動くそうです。

# 感想
GCPは比較的安価でNode.js、MySQLの環境構築をすることができるので魅力的です。リファレンスにNode.jsがなかったので少し手こずりましたが、無事接続できました。

最初の記事なので、少し間違えていたらすみませんv_v。
[PG::UndefinedTable: ERROR:  relation "XXXXXX" does not exist] への対応

# 問題
`heroku run rails db:migrate`を行うと、こんなエラーがでた

```ruby:
PG::UndefinedTable: ERROR:  relation "param_types" does not exist
: CREATE TABLE "param_values" ("id" bigserial primary key, "name" character varying, "presentation" character varying, "param_type_id" bigint, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, CONSTRAINT "fk_rails_e74ade1df5"
FOREIGN KEY ("param_type_id")
  REFERENCES "param_types" ("id")
)
```

`ParamValue`というテーブルを作ろうとしたら、
その中で`ParamType`というテーブルの`id`（＝param_types.id）が参照されている。

しかし`ParamType`というテーブルは存在しない（＝UndefinedTable）ので、
`ParamValue`より先に作ってください、ということ。

ローカルでmigrationできても、どうやらherokuでは
<b>migration fileは日付順にmigrateされる</b>らしい。

# 対処

`ParamValue`よりも先に`ParamType`が作られるよう、
<b>手動でmigration fileの日付を変更し</b>、
ローカルで正常にmigrateされるのを確認したあと、
herokuにpushした。


# 手順
1. `rails db:drop`<br>
→この時点でmigration fileの日付を変更してよい
2. `rails db:create`
3. `rails db:migrate`
4. 問題なければherokuにpush
5. `heroku pg:reset DATABASE`
6. `heroku run rails db:migrate`


<br>
おわり
ESP32でスケールを作って、お買い物忘れ防止！(1)

# つくりたいもの
スーパーでの買い忘れがないように、スケールに乗っているものの重さをスマホで確認(通知？)できるようにしたい。
本当はネットスーパーのお買い物かごに入っていてくれたら最高。
<img width="70%" alt="スクリーンショット 2019-04-05 17.14.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/333838/70c94939-bae9-c759-e38f-ad215296694e.png">

# 使うもの
- [ESP32](http://akizukidenshi.com/catalog/g/gM-11819/)
- [ロードセル　シングルポイント（ビーム型）　２ｋｇ](http://akizukidenshi.com/catalog/g/gP-13041/)
- [ＨＸ７１１使用　ロードセル用ＡＤコンバータ　モジュール基板](http://akizukidenshi.com/catalog/g/gK-12370/)

# 下準備
- 開発環境を準備する (https://qiita.com/qiiiiiiita/items/45306214a081bd1c9f81)
- LEDを点けてみる (参考: https://qiita.com/naohiro2g/items/79c99eac5254be1d051d)

# 設計図
<img width="602" alt="スクリーンショット 2019-04-05 17.38.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/333838/6a79cccf-5602-dca8-1945-b1ace7b46d62.png">

# 作る
### ライブラリをゲット
```
cd ~/esp
git clone https://github.com/akshayvernekar/HX711_IDF
```

`~/esp/HX711_IDF/main/main.c`に書いている番号のピンに合わせてつなぐ

```
#define GPIO_DATA   GPIO_NUM_2
#define GPIO_SCLK   GPIO_NUM_16
```

### ポートの設定
```
cd ~/esp/HX711_IDF
make menuconfig
```
<img width=70% alt="スクリーンショット 2019-03-15 17.25.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/333838/2185f671-b4c2-2269-5033-79bcc56225d3.png" >
`Serial flasher config`→`Default serial port`→`/dev/tty.SLAB_USBtoUART`を入力

### 書き込み！
```
cd ~/esp/HX711_IDF
make flash
```
### いろいろ聞かれる
教えてもらいながら適当に答えたので、後で必要に応じて変更する

```
*
* Restart config...
*
*
* Application manager
*
Use time/date stamp for app (APP_COMPILE_TIME_DATE) [Y/n/?] (NEW) y
Exclude PROJECT_VER from firmware image (APP_EXCLUDE_PROJECT_VER_VAR) [N/y/?] (NEW) y
Exclude PROJECT_NAME from firmware image (APP_EXCLUDE_PROJECT_NAME_VAR) [N/y/?] (NEW) y

...

Include ESP-IDF test registration/running helpers (UNITY_ENABLE_IDF_TEST_RUNNER) [Y/n/?] (NEW) n
Include Unity test fixture (UNITY_ENABLE_FIXTURE) [N/y/?] (NEW) n
*
* Virtual file system
*
Suppress select() related debug outputs (SUPPRESS_SELECT_DEBUG_OUTPUT) [Y/n/?] y
Add support for termios.h (SUPPORT_TERMIOS) [Y/n/?] (NEW) n
```

### 確認してみる
`make monitor`で確認してみる

```
make monitor
```
矢印の方向に押すと`weight=xxx`が大きくなるので、重さがとれてそう！
<img width="50%" alt="スクリーンショット 2019-04-05 17.14.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/333838/d38b9d02-987b-b5be-b107-898800404076.jpeg">
<img width="70%" alt="スクリーンショット 2019-04-05 17.59.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/333838/6baf7c1b-24aa-1c72-1254-15f94706f193.png">

ひとまず(1)はここまで 💁
SQLite3::ReadOnlyException: attempt to write a readonly databaseへの対応

`rails db:drop`を実行したときにエラーがでたため（なんのエラーか忘れた）、
`sudo rails db:drop`をしてDB削除成功。

その後`sudo rails db:create`でDBを作成し、
`rails db:migrate`を行ったところ、下記エラーが発生。


```ruby:
WARNING: Nokogiri was built against LibXML version 2.9.8, but has dynamically loaded 2.9.4
rails aborted!
ActiveRecord::StatementInvalid: SQLite3::ReadOnlyException: attempt to write a readonly database: CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY)
```

`ReadOnlyException`だって。

権限の問題かと思い調べたら、`chown`で権限を変更すればよいとの情報が。

<br>

けど`sudo rails db:create`したのがいけなかったのでは？と思い、
再度DBを削除し<b>`sudo`抜きの</b>`rails db:create`および
`rails db:migrate`を実行したところ、うまくmigrateされました。

<br>

おわり
Kotlinの文字列連結はStringBuilderが使われるという話（タイトル変更済み）

少し気になったので文字列連結（`"${this} is a pen."` みたいなこと）のパフォーマンスについて調査してみました。
~~結果、Javaと同様StringBuilderやStringBufferを使った方がよいという結果でした。~~

~~たぶん `"${this} is a pen."` みたいなことをしたときには、
Java的には `"this" + " is a pen."` になってんだろうなぁ。~~
文字列連結においてもKotlinではStringBuilderに変換されていたので、
無理にStringBuilderを使っても問題ないというのがわかりました。

```kotlin
fun main(args: Array<String>) {
    var before = System.currentTimeMillis()
    
    for (i in 0..10000) {
        val test = "a b $i a b $i fdsafda $i"
    }
    
    println("case A =${System.currentTimeMillis() - before}ms")
    
    before = System.currentTimeMillis()
    
    for (i in 0..10000) {
        val buf = StringBuilder().also {
            it.append("a b ")
            it.append(i)
            it.append(" a b ")
            it.append(i)
            it.append(" fdsafda ")
            it.append(i)
        }
        val test = buf.toString()
    }
    
    println("case B =${System.currentTimeMillis() - before}ms")
}
```

```
case A =46ms
case B =23ms
```

~~些細な差ではあるが、パフォーマンス重要視してるプロジェクトではこういうのが大切だったりするんだろう。~~
差分があるように見えるのはJVM起動後などが遅かったりGCが走ったりといろいろな要因があるようです。

（@sdkei さん、ありがとうございました！！)

---

StringBuilderって使うと結構可読性下がっちゃってめんどくせぇなぁって思ってたので、
結局同じことになるのであれば`"${this} is a pen."` みたいなように書くようにしよ。
lombokをGradleでインストールできない。

# 事象
Gradleに下記の2行追加して、Gradle実行したがエラーが出る。

```
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('com.jayway.jsonpath:json-path')
    compileOnly 'org.projectlombok:lombok:1.18.6' <--追加
    annotationProcessor 'org.projectlombok:lombok:1.18.6' <--追加
}
```



# エラー 1

```
Warning:<i><b>root project 'complete': Unable to resolve additional project configuration.</b>
Details: org.gradle.api.artifacts.ResolveException: Could not resolve all dependencies for configuration ':runtimeClasspath'.
Caused by: org.gradle.internal.resolve.ArtifactResolveException: Could not download spring-boot-starter-web.jar (org.springframework.boot:spring-boot-starter-web:2.1.3.RELEASE): No cached version available for offline mode</i>
```

# 対策 1
どの対策が聞いたかわかりませんが、上から順にやって最後に成功しました。

1. Enable annotation processingにチェックを入れる。
Intellij IDEA -> Preferences -> Compiler -> Annotation Processors
![スクリーンショット 2019-04-05 17.46.29.png](https://qiita-image-store.s3.amazonaws.com/0/170662/4dc9535c-8183-80dd-c173-509aa6733c4a.png)

2. Enable annotation processingにチェックを入れる。
File -> Other Settings -> Default Settings -> Compiler -> Annotation Processors
![スクリーンショット 2019-04-08 11.02.20.png](https://qiita-image-store.s3.amazonaws.com/0/170662/18180c20-a249-c6d7-2cad-6f0b50f8c05d.png)
![スクリーンショット 2019-04-08 11.02.56.png](https://qiita-image-store.s3.amazonaws.com/0/170662/70f3667b-c62f-df88-d580-b3d2867006d3.png)

3. Lombokプラグインをインストール
Intellij IDEA -> Preferences -> Plugins ->Browse Repositories-> Search for "Lombok"-> install plugin -> Apply and restart IDEA
![スクリーンショット 2019-04-08 11.04.35.png](https://qiita-image-store.s3.amazonaws.com/0/170662/87221404-ddb2-178a-7a6b-7ef5ae66b685.png)

4. Work offlineにチェックを入れる。
Intellij IDEA -> Preferences -> Build, Execution, Deployment -> Build Tools -> Gradle
![スクリーンショット 2019-04-05 17.44.53.png](https://qiita-image-store.s3.amazonaws.com/0/170662/6f5e48ba-209a-1f2a-4067-6bfc2cee8d02.png)


# エラー 2
上記の対策後、ビルド実行すると下記のエラーが出ました。

![スクリーンショット 2019-04-08 10.55.32.png](https://qiita-image-store.s3.amazonaws.com/0/170662/428291a2-d898-7343-1069-1d76c7af62f6.png)

# 対策 2
pom.xmlに下記を追加しました。
参考： https://tyoshikawa1106.hatenablog.com/entry/2015/11/15/220056

```

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- ここから -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>
        <!-- ここまで追加 -->
    </dependencies>
```

無事ビルドが通りました。
Google Spread Sheetの翻訳機能がとっても便利！

1.Google Spread Sheetの翻訳機能

みなさん、自分の書いた日本語を同時に英語、中国語、フランス語に一度に変換できたらいいなと思ったことはありませんか？（私はありません）

しかし、今後英語や中国語などのテキストを読む機会も増えそうなので便利な翻訳ツールを探してみたところ、見つかりました！

2.Google Spread Sheetの便利な関数

Googletranslate(テキスト,「ソース言語」,「ターゲット言語」)
という関数を使うと良いです。

![googletranslate.png](https://qiita-image-store.s3.amazonaws.com/0/387778/e6876ffa-ad53-9c57-d2a0-39462404ebbf.png)
図１：関数の中身


![Google 翻訳 日→英・中・仏    Google スプレッドシート.png](https://qiita-image-store.s3.amazonaws.com/0/387778/07c8db90-0d73-e7bd-d72d-36a9ad073f30.png)
図2:関数の使用例

![翻訳①.png](https://qiita-image-store.s3.amazonaws.com/0/387778/eca768be-e2c7-7086-9720-89f689d4abb2.png)
図3:A2に翻訳したい日本語を入れる

![翻訳②.png](https://qiita-image-store.s3.amazonaws.com/0/387778/9ea37f11-39ac-b180-bbd3-e09808fcd9aa.png)
図4:1秒くらい機械翻訳が考える(ValueからLoadingになる)

![翻訳③.png](https://qiita-image-store.s3.amazonaws.com/0/387778/764df9bf-061a-891b-53d7-c4ee9cd20cd5.png)
図5:翻訳結果が出る。

3.どういう時に使うか？

私の場合はkaggleで知らない単語が出てきたときの単語帳作りのために活用しています。
![kaggle オリジナル単語集   Google スプレッドシート.png](https://qiita-image-store.s3.amazonaws.com/0/387778/246d2f69-cd6a-12d0-47a8-000be28940bc.png)
図6:kaggleのオリジナル単語帳

![便利関数②.png](https://qiita-image-store.s3.amazonaws.com/0/387778/82a5317e-72f0-b278-95e3-8209345195af.png)

図7:翻訳する言語の変更方法

参考URL:（国別コード一覧）
http://lifeparsley.com/googletranslate%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%9B%BD%E5%90%8D%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7/
Upload image to S3 using Javascript AWS SDK

## Getting started
Install <b>aws-sdk</b> using `npm`

```
$ npm install aws-sdk
```
Create a json file name `config.json` in the project root directory

```json
{
    "accessKeyId": "<aws-access-key>", 
    "secretAccessKey": "<aws-secret-key>", 
    "region": "ap-northeast-1"
}
```
## Usage
Import the <b>aws-sdk</b>

```javascript
const AWS = require('aws-sdk')
```
Initialize S3 object for doing the operations

```javascript
// load aws s3 configuration from json file
AWS.config.loadFromPath(path.join(__dirname, '<relative-path-to-config.json>'))

// initialize S3 object for doing operations
var S3 = new AWS.S3({
   apiVersion: '2006-03-01'
})
```
* Get image from S3

```javascript
// setup the params for get object operation
var params = {
  Bucket: <path-to-where-the-target-object-is-stored>
  Key: <object-name-in-s3>
}

// Async function to get object from S3 using aws-sdk
S3.getObject(params, function (err, data) {
  if (err) throw err
  console.log(data)
})
.catch(err => console.log(err))
```
* Upload Image to S3

```javascript
// setup the params for get object operation
var params = {
  Bucket: "bucket name with path",
  Key: "<filename>",
  Body: "<image stream>"
}

// Async function to get object from S3 using aws-sdk
S3.getObject(params, function (err, data) {
  if (err) throw err
  console.log(data)
})
.catch(err => console.log(err))
```
WSLのホームディレクトリの場所@2019

WSLのホームディレクトリがアップデートで変わったようだ

18.04ならここ

```
C:\Users\[ユーザー名]\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home
```

16.04ならここ

```
C:\Users\[ユーザー名]\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home\
```

重要な場所なのであまり変えてほしくないのですが・・・

ブログ始めました、よかったら遊びに来てください
https://red-full-moon.com/
電動自転車市場は2026年に25.64億ドルに達すると予想

![Electric Bicycles Market Size.jpg](https://qiita-image-store.s3.amazonaws.com/0/392756/aa2e686d-accc-2127-1459-edaee34581dc.jpeg)

Credence Researchが発表した新しい市場調査レポートによると、「電動自転車市場（コンポーネント - コントローラー、モーター＆ドライブトレインおよびバッテリー（リチウムイオンバッテリー、SLAバッテリーなど）;制御システム - スロットルコントロールおよびペダルアシスト;年齢層 - 下15年以上15年以上、販売チャネル - オンラインおよびオフライン） - 成長、将来展望、競合分析、2018年 -  2026年、2018年から6.5％の年平均成長率（CAGR）で成長すると予想される電動自転車市場2026年までに、そして2026年にUS $ 25.64 Bnに達する。

全レポートを閲覧する@ https://www.credenceresearch.com/report/electric-bicycles-market

マーケットインサイト

電動自転車市場は、2018年から2026年までの年平均成長率（CAGR）が6.5％で、2026年には25,644億米ドルに達すると予測されています。彼らがほぼ10年前から出回っていることを知っているのは驚くかもしれませんが、人々の間の懐疑論はその販売を制限しました。その衰退の一因となっている顕著な要因のいくつかは、高値、重い鉛蓄電池、そして知識の欠如を含みました。興味深いことに、過去3年間でこのセグメントは劇的に変化しました。
人気のある自転車ブランドによる電動自転車の導入と人々の間の「エコ意識」の高まりは、電動自転車市場の成長に貢献する重要な要素となっています。都会のサイクリストの間で電動自転車の人気が高まっているもう一つの要因は、人気の高まりとサイクリングに関する知識にあると考えられます。電動自転車のバッテリーの強化は、市場の繁栄をさらに後押ししています。この点に関する主な貢献は、リチウムイオン電池の導入であり、これは、軽量でありながらより高い容量を有し、それによって単一の充電でより長い距離を可能にする。

無料のPDFサンプルリクエストをダウンロードする：https://www.credenceresearch.com/sample-request/59463

最近の傾向によると、軽量で範囲が広いリチウムイオン電池のおかげで、電動自転車は軽量化しています。さらに、メーカーはまた、見た目の良い電動自転車の発売に注力しています。そうするために、彼らはフレームにバッテリーを統合しています。さらに、今後数年の間に、ますます多くの人々がより環境に優しい交通手段を模索することが期待されており、この状況では電動自転車が重要な役割を果たすであろう。今後数年間の研究開発活動は、バッテリーの改善を中心に展開されます。これらの改良点は、主にバッテリーをより小さく、より軽くそしてより強力にすることに集中するでしょう。

アジア太平洋地域は、2017年に電動自転車市場全体で最大の市場シェアを獲得しました。この地域には、多数の製造業者の存在が点在しています。近年、国は電動自転車の高い採用を目撃しています。さらに、国内での電動自転車の安価な入手可能性は、国内で市場が繁栄するのをさらに助けている。インドは、今後数年間で電動自転車市場に大きな成長の可能性をもたらすと期待されているこの地域のもう一つの国です。

電動自転車市場で事業を展開している主要企業の中には、Accell Group、NYCeWheels、Easy Motion USA、Derby Cycle、Jiangsu Xinri E-Vehicle Co.、Mustache Bikes、Karbon Kinetics Limited、myStromer AG、A2B Electric Bikes、Pedegoがあります。とりわけ電動自転車。
Amazon SageMakerで物体検出（うまい棒検出の記事を補足）

物体検出モデルを自前に作るには、Amazon SageMakerというサービスを使うのがとても便利。
ハイパーパラメータの説明も以下の通り分かりやすい。
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/object-detection-api-config.html

さて、動かし方ですが、基本的には以下記事の通りに実装すればOK。多謝。
https://dev.classmethod.jp/cloud/aws/sagemaker-umaibo-object-detection/

ただし、VoTTのoutputとSageMaker投入用inputのフォーマットを合わせるところのスクリプトが若干異なっていたので、以下のように修正。

```python
import json

file_name = '{your_file_path}'
class_list = {'your_class':0}
 
with open(file_name) as f:
    js = json.load(f)
 
    for k, v in js['assets'].items():
        
        fileno = v["asset"]["name"].split(".")[0]
 
        line = {}
        line['file'] = fileno + '.jpg'
        line['image_size'] = [{
            'width':v["asset"]["size"]["width"],
            'height':v["asset"]["size"]["height"],
            'depth':3
        }]
 
        line['annotations'] = []
 
        for annotation in v["regions"]:
 
            line['annotations'].append(
                {
                    'class_id':class_list[annotation['tags'][0]],
                    'top':annotation['boundingBox']["top"],
                    'left':annotation['boundingBox']["left"],
                    'width':annotation['boundingBox']["width"],
                    'height':annotation['boundingBox']["height"]
                }
            )
 
        line['categories'] = []
         
        for name, class_id in class_list.items():
 
            line['categories'].append(
                {
                    'class_id':class_id,
                    'name':name
                }
            )

        f = open('./json/' + fileno + '.json', 'w')
        json.dump(line, f)
        f.close()
```

さらにさらに、当然ながらトレーニングにはGPUインスタンスが必要なので、アカウント作りたての方はリソースの上限緩和が必要。私の場合は以下の通り申請し変更。
トレーニング：ml.p3.2xlarge
ホスティング：ml.m4.xlarge
常識かもしれませんが、念の為。

ちなみに認識結果は公開できないのですが、400枚弱のアノテーション、ハイパーパラメータのチューニングはほぼなしでモデル構築したところ、F値は9割超え。素晴らしい。
vimスニペット: JSONのフォーマットコマンド

<script id="asciicast-smOrY9pGE3AD9Nmzh1z6vMY6C" src="https://asciinema.org/a/smOrY9pGE3AD9Nmzh1z6vMY6C.js" async></script>
Require
-------
- jq

.vimrc
------

```
"範囲指定でjqコマンドを使えるようにする
command! -range Jq :<line1>,<line2>!jq .
"つくったコマンドをバインド
xnoremap <Space>fj :Jq<CR>
```
環境変数とシェル変数　備忘録

環境変数について

環境変数とは動作環境を整えるために使われる変数であり、envコマンドで一覧を見ることができる。

```command
$ env
```

シェル変数について

シェル変数とはシェルの動作を設定したり制御したりするもの。
setコマンドで見ることができる。

```command
$ set
```
これにより表示されたものには*関数も含まれている。

*関数
目的の処理を行う一連のコードをひとまとまりにしたもの。
関数を定義することによって、コードを入力する手間を省く。
プログラミング学習記録48〜あとは条件分岐だけ〜

##今日やったこと
- ユーザー退会機能を実装するために奮闘する

今日も昨日の続きで、ユーザー退会機能を実装するためにいろいろやってみました。

いろいろやった結果、退会ボタンを押した時に退会できるアクションを作ることができました。

ただ、そのユーザーの投稿状況やいいね！してる投稿によってはうまく退会できないことが判明したので、条件分岐をうまく使って退会機能を作れないかなと思ってます。

具体的に説明すると、、、

- Postテーブルに退会したいユーザーの投稿が残っているかどうか
- 他の人がいいね！した自分の投稿があるかどうか

という感じです。

ユーザー全員がユーザーの投稿が残っていて、他の人がいいね！した自分の投稿がある場合は条件分岐せずに退会機能をつけることができます。

ただ、必ずしもみんなが

- 何かしらを投稿して、
- 他の人に自分の投稿がいいね！されている

状態で退会するわけではないので、今のままだとかなり限定された人しか退会できなくなってしまいます。

今のままだと自分の投稿がなくて、他の人からのいいね！もない時に「メソッドが定義されてないですよ〜」というRailsおなじみの煽りを受けることになります。

正直、解決方法がわからないので[teratail](https://teratail.com/)で聞いてみました。

回答が返ってこないようであれば、MentaなどでRailsの得意な方に聞いてみたいと思います。

あとちょっとで完成！というところで足止めを食らっていますが、なんとか完成させたいです。

明日からも引き続きプログラミング学習頑張ります。

おわり
Goの使い方2

#ループを一定期間休む
[Goで一定周期で何かを行う方法](https://qiita.com/ruiu/items/1ea0c72088ad8f2b841e)

```
import(“time”)
time.Sleep(3 * time.Second)
```

#乱数を生成する
[Goでrandを使うときは忘れずにSeedを設定しないといけない](https://qiita.com/makiuchi-d/items/9c4af327bc8502cdcdce)
Goにはcrypto/randというセキュアな乱数生成器

```
seed, _ := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
rand.Seed(seed.Int64())
fmt.Println(rand.Int63())
```

#標準入力から変数の値を受け取る
[goでfmt.Scanする際の注意点](https://qiita.com/koyo-miyamura/items/8766350641287d0a1f2c)

#Scan関数

```
func Scan(a ...interface{}) (n int, err os.Error)
fmt.Scan(&a, &b)
fmt.Println(a, b)
```

#文字列の検索
[Go言語_文字列操作](http://capm-network.com/?tag=Go%E8%A8%80%E8%AA%9E_%E6%96%87%E5%AD%97%E5%88%97%E6%93%8D%E4%BD%9C)
[fmtパッケージ](http://golang.jp/pkg/fmt)

```
	str := "The Go Programming Language"

	// 文字列が含まれるか判定する。
	if strings.Contains(str, "Go") {
		fmt.Println("Contains return true!")
	}

	// 開始文字列を判定する。
	if strings.HasPrefix(str, "Th") {
		fmt.Println("HasPrefix return true!")
	}

	// 終端文字列を判定する。
	if strings.HasSuffix(str, "age") {
		fmt.Println("HasSuffix return true!")
	}

	// 文字列から特定の部分文字列を検索する。
	// 先頭から検索して見つかった文字列位置を返す。
	// 見つからない場合は -1 を返す。
	if idx := strings.Index(str, "Program"); idx != -1 {
		fmt.Printf("Found. (index = %d)\n", idx)
	}

	// 末尾から検索して見つかった文字列位置を返す。
	// 見つからない場合は -1 を返す。
	if idx := strings.LastIndex(str, "a"); idx != -1 {
		fmt.Printf("Found. (index = %d)\n", idx)
	}
```

request.goでUUID=1234567890(乱数)を標準出力
scan.goでUUID=1234567890(乱数)を検出して数値の抽出して標準出力する

request.go

```
package main

import(
        "fmt"
        "time"
        crand "crypto/rand"
        "math"
        "math/rand"
        "math/big"
)
```
$ vi request.go
$ go build request.go
$ vi scan.go
$ go build scan.go
$ ./request | ./scan
2550519028152033468
1331746663370969294

```

func main() {
        for {

            seed, _ := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
            rand.Seed(seed.Int64())
            s :=rand.Int63()
            fmt.Printf("UUID=%v\n",s)
            time.Sleep(1 * time.Second)
        }
}
```
scan.go

```
package main

import (
    "fmt"
    "strings"
)

func main() {
    var a string
    dst := ""

    for {
    fmt.Scan(&a)
    if strings.Contains(a,"UUID"){
        dst = strings.Replace(a, "UUID=", "", 1)
        fmt.Println(dst)
    } else {
        fmt.Printf("none\n")
    }

    }
}
```
React Native 動的にUIを更新

# React Native 動的にUIを更新

## OverView
変数や状態によってUIを表示にしたり、非表示にしたり、したい場合があるかと思います。
その場合下記のように実装することにより実現できます。

```
<View style={layout(val)} />

function layout(val) {
    if (val === "no") {
        return {
        backgroundColor: #fff,
    　　};
    }
    return {
        backgroundColor: #000,
    };
}
```

動作確認を行なっていないので動作するかわかりませんが、概念的にはこんな感じです。
ターミナルと Slack を Mojave ダークテーマに合わせよう

# ターミナルが Mojave ダークテーマにしっくりこないのでテーマを作った

[Dracula Theme](https://github.com/dracula/dracula-theme) を気に入って使っていたのですが、Mojave のダークテーマにしてから、周りの色合いとしっくりこなくなりました。
Mojave で使われているカラースキームでテーマを作った結果、数ヶ月間、テコ入れしながらも違和感なく気に入って使っているので公開します。
以下、Terminal.app + tmux + vim を走らせている例です。
![DtAK27iVYAEENSB.jpg](https://qiita-image-store.s3.amazonaws.com/0/54003/9625d212-552f-e1c2-5297-80eb1ed8484b.jpeg)
ついでに Slack のテーマも作ったので、ここで公開しています。

## Terminal.app 用

https://github.com/onose004/mojave-terminal
から mojave-dark.terminal をダウンロードして開いてインストール。

## Vim 用

https://github.com/onose004/mojave-vim
README の内容に沿ってインストール。
[Lightline](https://github.com/itchyny/lightline.vim) プラグインにもテーマが適用されます。
なお、記事執筆時点で GUI 版 Vim のカラースキームには対応していません。

## Tmux 用

記事執筆時点で対応していません。

## Slack 用

以下を Slack のカスタムテーマ欄にコピペして適用。
手前味噌ですが、これ以外使う気になれません。

```
#232427,#363739,#515254,#ffffff,#363739,#FFFFFF,#65B84D,#E95459
```
【Blue Prism】「プロセス・オブジェクトを削除しようとするとエラーが出て削除できない」の対策手順

# 現象
Blue Prismでプロセス、もしくはオブジェクトを削除しようとすると、以下のエラーが表示され削除ができない。

> An error occurred while deleting the process: Could not delete the process. This process has been run before and is required for audit

![image.png](https://qiita-image-store.s3.amazonaws.com/0/293799/502fa5ef-9103-25a5-831c-0516e6bca7f5.png)


# 原因
データベースにプロセス実行ログ（？）が残っているため。
（ヘルプから推察）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/293799/065320e1-6828-9653-8aba-9c748fd4eed4.png)


# 対策手順
（以下のQAサイトより引用）
[Not able to delete process in BP](https://www.rpaforum.net/threads/not-able-to-delete-process-in-bp.691/)

1. システム＞アーカイブを開く
2. 「データベースのデータ」から該当プロセスのログを選択
3. 削除ボタンを押下

※「削除してもいいプロセスの削除方法」ということで手順を記載しています。事前にバックアップが必要かとかそういう前提は無視しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/293799/7362327b-e212-3c60-d560-f111ec9423d1.png)

上記の手順を行うと、プロセスが削除できるようになる。


# 感想
ヘルプだけで「なるほど！　システムタブのアーカイブから削除すればいいんだね！」ってわかるか……！？
RPA（海外製品）は英語でググるの必須だなぁ。
【Rails/JavaScript】Googleマップ上にある同じ座標の複数マーカーをずらす

個人開発のWebアプリ**「[まちかどルート](https://machiroute.herokuapp.com/)」**v5.62への実装メモです。

# Googleマップのマーカーが重なる

まちかどルートでは位置情報付きの投稿をすべて「ルートマップ」と名付けたGoogleマップ上にマーカー表示させています。

ちなみに**gmaps4rails**や**geocoder**というgemを使っています。

使い方については[こちらの記事](https://qiita.com/yuki_chrono/items/a2638c33eedc3c036d01)などを参考にしました。

しかしながら**まったく同じ座標の投稿があると複数のマーカーが重なってしまい、とても不便です。**

# maxRandomDistanceを使う

```ruby
handler = Gmaps.build('Google', { markers: { maxRandomDistance: 5 } });
```
viewに使う`handler = Gmaps.build('Google');`の部分を上記のようなコードに変更すると、同じ座標にある複数のマーカーを下の写真のようにずらして表示できるようになります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/335872/ef247954-aced-f964-58c5-12b84db3cd53.png" width="300" />

ランダムにずれるので細かな調整には不向きですが、簡単な対応策として良いのではないでしょうか。
ローカルでGitHub Desktopを使ってRepositryを作るまで

#はじめに
最近、ローカル環境でプログラムを作ることが多く、管理したいなーと思い始めて、
GitHub Desktopを使って、管理することにしました。

#git hub
今回、確認する方法ではGitHubのアカウントを持っていることが前提条件となるのでお持ちでない方は
<a href=https://github.com/"target="_brank">https://github.com/</a>にアクセスしてgithubアカウントを用意してください


ウインドウ右上に以下のリンクがあるので
![スクリーンショット 2019-04-05 11.35.23.png](https://qiita-image-store.s3.amazonaws.com/0/343721/f5a611aa-cef8-dbe0-50b9-bd4b5d643e77.png)

###新規登録
Sign upを押下して、登録しているユーザー名もしくはメールアドレス、パスワードを入力してログインしてください。


###すでにアカウントを持っている方
Sign inを押下してメールアドレス、パスワードの登録を行ってください

#GitHub Desktopの準備
GitHub Desktopは以下のリンクから入手可能なので、適宜DLしておいてください。
https://desktop.github.com/

GitHub Desktopを開くとこんな感じ
<img width="1072" alt="スクリーンショット 2019-04-05 16.43.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/7350c3f9-44d4-c03e-ef5a-a535c0cc962a.png">


ここで下準備が終わりました。いよいよローカルで作ったファイルをgitにあげてRepositryを作成する

GitHub DesktopのFileを押下すると以下のような項目が並んでいる
<img width="266" alt="スクリーンショット 2019-04-05 16.45.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/1511ba4e-a156-2b99-c3c1-fe93ca46fc34.png">

ここで、Add Local Repositoryを選択すると、
<img width="1072" alt="スクリーンショット 2019-04-05 16.47.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/9893b0ee-f6fd-ef55-9eab-11a867165d14.png">


このような選択ウィンドウが表示されるので、Chooseを選択して、ファイルを選択するか、直接パスを入力してAdd Repositoryを押下する。
するとこのようなウインドウが表示されるので、
<img width="1072" alt="スクリーンショット 2019-04-05 16.49.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/1b273b3a-d6b9-bb98-8f55-54527f222d27.png">

<img width="713" alt="スクリーンショット 2019-04-05 16.50.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/30328598-9234-0ef2-8dd1-72f4dff8906d.png">
Publish repositryを押下する。

すると以下のような画像が表示されるので必要事項を記入して、Publish Repositoryを押下する

<img width="1072" alt="スクリーンショット 2019-04-05 16.51.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/9a3baf4f-81af-848e-1736-b5f4347be4c8.png">

#作成されたRepositoryを確認する
<a href=https://github.com/"target="_brank">https://github.com/</a>にアクセスしてログインを済ませる。
アカウントの下にあるYour Repositoryを選択する

![スクリーンショット 2019-04-05 16.54.11.png](https://qiita-image-store.s3.amazonaws.com/0/343721/5fced3fe-ddd2-611b-834e-b41ec8044a1f.png)

![スクリーンショット 2019-04-05 16.55.31.png](https://qiita-image-store.s3.amazonaws.com/0/343721/b4c3667d-ba83-25fd-9cc3-3504b2a0c9eb.png)

さっきあげたフォルダが確認できた。
ファイル編集に伴うコミットのやり方はまた別の記事で紹介します。


ではでは
AWS CloudWatchでログ検索する時によく使うコマンド

デバッグの時などに何かエラー起きてないかな？とCloudWatchのログを検索したい時ないですか？
ロググループ名は分かってるけど、ログストリームが大量に生成されるし、複数リージョンにまたがっていて
一つ一つ見ていくのはキツイ...
という時に私は以下のようなコマンドで調べています。

```
$ log_group_name=<your log group name>
$ pattern=<keyword you want to find>
$ aws ec2 describe-regions | jq '.Regions[].RegionName' | xargs -n 1 -J % aws logs filter-log-events --log-group-name $log_group_name --start-time `date -v-1d +%s` --filter-pattern $pattern --region % | jq '.events'
```

例えば`pattern=START`にした場合の出力はこんな感じです。
何もなかったリージョンは[]だけがでます。

```
[]
[
  {
    "logStreamName": "2019/04/05/[$LATEST]4167bbbbbbbbbbbbbbbbbbbbbbbbbbbb",
    "timestamp": 1554444422379,
    "message": "START RequestId: 2340bbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb Version: $LATEST\n",
    "ingestionTime": 1554444422398,
    "eventId": "3466526898875119217066662794167bbbbbbbbbbbbbbbbbbbbbbbbbbbb"
  },
  {
    "logStreamName": "2019/04/05/[$LATEST]4167e179faaaaaaaaaaaaaaaaaaaaaa",
    "timestamp": 1554444427564,
 
```

> --start-time `date -v-1d +%s`

これは現在時刻の1日前からのログを対象にするという意味です。
私はMacを使っているので、こんな感じのdateコマンドのオプションになります。
他については以下のqiita記事で触れられていました。
https://qiita.com/hid_tgc/items/a82e00112a3683ede528

以上、ちょいネタでした。
Unityで関節PositionのみでAnimatorを動かす

#Unityで関節PositionのみでAnimatorを動かす


[SAFullBodyIK](https://github.com/Stereoarts/SAFullBodyIK)

をダウンロード、Unityへ入れる

SAFullBodyIK-master/Scripts/FullBodyIKBehaviourを使いたいHumanoidに張り付け

以下のBoneに使いたいHumanoidの関節を設定
![Bone.PNG](https://qiita-image-store.s3.amazonaws.com/0/392712/d9b69aab-5a68-8f0d-154d-0521fda4cccd.png)

これでHumanoidについているFullBody以下を動かせばHumanoidが動く。
EffectorのElbowやKneeについているPosをチェックするとKneeやElbowも動かせる。
![ss.PNG](https://qiita-image-store.s3.amazonaws.com/0/392712/b156e389-902d-c654-9f19-8489d6531614.png)

以下、Targetヒューマノイドの動きをPositionベースでまねるスクリプト。

```
using UnityEngine;
public class AnimationFromPositionWithFbik : MonoBehaviour {
    public Animator target;
    Animator animator;

	// Use this for initialization
	void Start () {
        animator = GetComponent<Animator>();
	}
	
	// Update is called once per frame
	void Update () {
        this.transform.position = ChangeP(target.transform.position);

        GameObject fullBIK = this.transform.Find("FullBodyIK").gameObject;
        foreach(IKset ik in IKsets)
        {
            fullBIK.transform.Find(ik.getI()).position = ChangeP(target.GetBoneTransform(ik.getB()).position);
        }
    }
    Vector3 ChangeP(Vector3 v)
    {
        return new Vector3(v.x -0.5f, v.y, v.z);
    }
    struct IKset
    {
        HumanBodyBones bone;
        string IKbone;
        public string getI(){ return IKbone; }
        public HumanBodyBones getB() { return bone; }
        public IKset(HumanBodyBones b, string ik) { bone = b; IKbone = ik; }
    }

    IKset[] IKsets = new IKset[]
    {
        new IKset(HumanBodyBones.Hips,"Hips"),
        new IKset(HumanBodyBones.RightLowerLeg,"RightKnee"),
        new IKset(HumanBodyBones.RightFoot,"RightFoot"),
        new IKset(HumanBodyBones.LeftLowerLeg,"LeftKnee"),
        new IKset(HumanBodyBones.LeftFoot,"LeftFoot"),
        new IKset(HumanBodyBones.Neck,"Hips/Neck"),
        new IKset(HumanBodyBones.Head,"Hips/Neck/Head"),
        new IKset(HumanBodyBones.LeftShoulder,"Hips/LeftArm"),
        new IKset(HumanBodyBones.LeftLowerArm,"Hips/LeftElbow"),
        new IKset(HumanBodyBones.LeftHand,"Hips/LeftWrist"),
        new IKset(HumanBodyBones.RightShoulder,"Hips/RightArm"),
        new IKset(HumanBodyBones.RightLowerArm,"Hips/RightElbow"),
        new IKset(HumanBodyBones.RightHand,"Hips/RightWrist"),

    };
  
}
```
似た動きはするが精度はまちまち
##参考
http://onoty3d.hatenablog.com/entry/2015/06/05/194010
https://qiita.com/keel/items/0d64167850566586d22a
UIFeedbackGeneratorを簡単に使えるようにする

## 開発環境

* Xcode10.2
* Swift 5.0

## UIFeedbackGeneratorとは

[Apple公式](https://developer.apple.com/documentation/uikit/uifeedbackgenerator)から引用


>概要
>このクラスのインスタンスを自分でサブクラス化したり作成したりしないでください。代わりに、提供されている具象サブクラスの1つをインスタンス化してください。

>UIImpactFeedbackGenerator。影響が発生したことを示すには、影響フィードバックジェネレータを使用します。たとえば、ユーザーインターフェイスオブジェクトが何かにぶつかったり、所定の位置に固定されたときに、インパクトフィードバックを引き起こすことがあります。

>UISelectionFeedbackGenerator。選択の変化を示すために選択フィードバックジェネレータを使用します。

>UINotificationFeedbackGenerator。成功、失敗、および警告を示すために通知フィードバックジェネレータを使用します。



何かのアクションのフィードバックとしてユーザさんの端末をブルッてさせてフィードバックするやつです。

## 通常の実装方法

[UIFeedbackGeneratorの使い方と便利に使えるライブラリ](https://qiita.com/WorldDownTown/items/2b5a72e41a95763727bb)から引用させていただきました。

```swift
class ViewController: UIViewController {

    private let feedbackGenerator: Any? = {
        if #available(iOS 10.0, *) {
            let generator: UIImpactFeedbackGenerator = UIImpactFeedbackGenerator(style: .light)
            generator.prepare()
            return generator
        } else {
            return nil
        }
    }()

    @IBAction private func light() {
        if #available(iOS 10.0, *), let generator = feedbackGenerator as? UIImpactFeedbackGenerator {
            generator.impactOccurred()
        }
    }
```

各VCに記述するにはしんどいなという印象でした。

## 簡単に使う方法

以下の構造体でラップして利用します。

```swift

/// UIFeedbackGeneratorを簡単に利用するためのラッパー
struct Feedbacker {
  
  static func notice(type: UINotificationFeedbackGenerator.FeedbackType) {
    if #available(iOS 10.0, *) {
      let generator = UINotificationFeedbackGenerator()
      generator.prepare()
      generator.notificationOccurred(type)
    }
  }
  
  static func impact(style: UIImpactFeedbackGenerator.FeedbackStyle) {
    if #available(iOS 10.0, *) {
      let generator = UIImpactFeedbackGenerator(style: style)
      generator.prepare()
      generator.impactOccurred()
    }
  }
  
  static func selection() {
    if #available(iOS 10.0, *) {
      let generator = UISelectionFeedbackGenerator()
      generator.prepare()
      generator.selectionChanged()
    }
  }

}

```

## 使い方

フィードバックをさせたいところでstaticメソッドをコールします。

```swift
/// 例
override func viewDidLoad() {
  // ViewControllerの読み込みが終わったらフィードバック
  Feedbacker.notice(type: .success)
}
```

コールの仕方は以下になりますので用途によって使い分けてください。

```swift
// notice
Feedbacker.notice(type: .success)
Feedbacker.notice(type: .warning)
Feedbacker.notice(type: .error)

// impact
Feedbacker.impact(style: .heavy)
Feedbacker.impact(style: .light)
Feedbacker.impact(style: .medium)

// selection
Feedbacker.selection()
```

## おわり

間違えてる部分や編集リクエストありましたらよろしくお願いいたします
GAE+GO+Echoでgo1.11対応した

GAE+GO+Echoでgo1.11に対応した。

実はほとんど変更する箇所がないけれど最初のサーバー起動のところだけハマったのでメモ的に。
echoのバージョンは v3.3.10 で対応しています。

Echo公式のGAEへの対応方法はApp Engine Standard Go 1.9までのもので特に更新されてないっぽかった。
https://echo.labstack.com/cookbook/google-app-engine

ただ、上記のやり方でも動くしApp Engine APIを使い続ける場合もそのままで良い。

しかし、今回やりたかったのはApp Engine APIからの脱却。
簡単に言うと最後の

```
appengine.Main()
```

を外したい。

で、大したことじゃないので結論。
Go1.11からはgo標準のhttp.ListenAndServeで起動できるようになったので、こいつを使うだけで良い。

具体的には公式のコードのappengine.Main() の部分をhttp.ListenAndServe()にするだけ。

```go
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"

	"github.com/labstack/echo"
)

func createMux() *echo.Echo {
	e := echo.New()
	return e
}

func main() {
    //この辺は相変わらず必要
	e := echo.New()
	http.Handle("/", e)

    //ここから追加
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("Defaulting to port %s", port)
	}
	log.Printf("Listening on port %s", port)
    //この部分で起動
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}
```

仕組みを理解してる人にとっては当然やんって感じかもしれないですね。


余談ですがFirestoreもGAEから使っていたのをFirebaseのものに変更しました。と言っても、FiresotreってGCPからアクセスしてもFirebaseからアクセスしても同じものを使ってるようでFirebaseの画面から連携処理をしたらそのまま同じデータが見れました。コードも少し書き換えるだけでできたので以前書いた記事に加筆するか新しい記事書くかも。

https://qiita.com/nyappa/items/edc9d8765e164254bf1a
Browsersyncのオプションを雑に理解する

使うかどうかは別として調べてみると意外とオプションが充実していたので、何ができるかまとめ。

確認バージョン : v2.26.3
オプションのURL : http://localhost:3001/


## ヘッダー右上

### RELOAD ALL
開いている全てのブラウザシンクのページを更新する。

### NEW TAB
新規タブでブラウザシンクのページを開く

### SCROLL TOP
開いている全てのブラウザシンクのページのスクロール位置をページ最上部に移動させる。

### RELOAD ALL
開いている全てのブラウザシンクのページをルートURLに遷移させる

## Overview

### Local
自分だけ見れるURL

### External
同じネットワーク内なら誰でも見れるURL
※社内のwifiで繋げているスマホ端末や、他の人に共有すればサーバーに上げずに確認が出来る。

### Serving files from
ルートになっているローカルフォルダ

### Current Connections
接続されているブラウザ一覧

## SyncOption

### CodeSync
ローカルのファイルが変更されたら自動的に反映させるか

### Clicks
クリックの挙動を開いている全ブラウザシンクのページに同期させるか。

### Scroll
スクロールの挙動を全ブラウザシンクのページに同期させるか。

### Forms: submit
フォーム送信を全ブラウザシンクのページに同期させるか。

### Forms: inputs
テキスト入力を全ブラウザシンクのページに同期させるか。

### Forms: toggles
ラジオ、チェックボックスの変更を全ブラウザシンクのページに同期させるか。

## History

クリックで遷移したページの記録
※ディレクトリを直接入力した場合は残らない

## Remote Debug

### Remote Debugger (weinre)
ブラウザシンクのオプションページで見れるデバッガーを表示させる。
色々と使いにくい。

### CSS Outlining
ブラウザシンクページ上の要素にアウトラインを表示させる

### CSS Outlining
ブラウザシンクページ上の要素の重なりを可視化させる。

### Overlay CSS Grid
ブラウザシンクページ上にグリッド線を表示させる。

## Plugins
ブラウザシンクに含まれているプラグインを表示させる。
デフォルトでは入っていないため、必要に応じて別途インストールが必要。

## Network Throttle
ネットワークの速度を指定したURLを作成する。

## Help / About
ヘルプ


## オプションを利用しての使い方例 ※同ネットワーク内限定

・ディレクターまたはデザイナーさんにcssアニメーションの調整等を依頼された際にExternalのリンクを共有し、リアルタイムで速度やタイミングを調整して確認してもらう。

・テストサーバーが用意されてない、または何らかの理由でテストサーバーを触れない状態でチェックをお願いしたい時にSyncOptionを全てoffにして、Externalのリンクを共有する。