OmniAICreator/Qiita-1.07M huggingface dataset:
"E:Unable to correct problems, you have held broken packages. "というエラーメッセージが出たときの対処法

apt-getコマンドでTeamViewerをインストールしようと思ったときに、題記のエラーメッセージが出てきた。いろいろ調べたら解決できたので、備忘録として残しておく。

基本的には、下記コマンドでキャッシュクリーンすれば解決する模様。

```
# sudo apt-get autoclean
# sudo apt-get clean all
# sudo apt-get update
```

完全自分用のエントリですが、ここで躓いた方の助けに慣れれば幸いです。
ESP32-WROOM-32 メモリ関係まとめ

# 概要
ESP32-WROOM-32のメモリ関係が曖昧だったのでまとめてみました。

# 参考
公式資料
https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/partition-tables.html

https://www.mgo-tec.com/blog-entry-partition-table-spiffs-sizeup-esp-wroom-32.html

http://shimane.monstar-lab.com/hasumin/esp32-doesnt-fit-in-partition-length
http://shimane.monstar-lab.com/hasumin/esp32-mrubyc-not-fit-in-region

http://okiraku-camera.tokyo/blog/?p=6023

https://watako-lab.com/2018/06/19/esp32_memory/

SPIRAM
https://loboris.eu/forum/showthread.php?tid=117

#結論

DRAMが不足している場合はESP32-WROOM-32ではなく、PSRAM搭載のESP32-WROVERを使用しよう！
【rails】deviseを使ったuser管理機能の実装

# gemのdeviseを使って、サインアウトやサインインなどの機能を追加する。
- Gemfileに"devise"を記載
- bundle install
- rails g devise:install(deviseの設定ファイルをrailsアプリケーションにインストールするコマンド）
- rails g devise User（モデルの作成）
- rake db:migrate（migrationfileの読み込み)

http://localhost:3000/users/sign_in　
この時点で最低限のログインページの実装

- rails g devise:views user (deviseに対応してviewの作成）
- rails g devise:controllers user(deviseに対応してcontrollerの作成）

##deviseで使用できるメソッド(モデル名にuserを指定している場合）
|メソッド                |機能                    | 
|---------------------|-----------------------|
|before_action :authenticate_user!|コントローラーに設定して、ログイン済みユーザーのみにアクセス許可をする|
|user_singed_in?|ユーザーがサインしているかを判定する|
|current_user|サインインしているユーザーを取得する|
|user_session|ユーザーのセッション情報にアクセスする|

### before_action :authenticate_user!
コントローラーの先頭に記載することで、処理が行われる前にログインしているかを判別させ、ログインユーザー以外のアクセスができないように設定します。
GOのtimeライブラリ

# インポート

```go
import "time"
```


## 日付取得

```go
// 現在日時の取得
t = time.Now()
fmt.Println("'time.Now': ", t)

// TimeStampから日時の取得
t_by_unix := time.Unix(1561895883, 0)
fmt.Println("'time.Unix': ", t_by_unix)

// 指定日時の取得
t_by_date := time.Date(2019, time.Month(6), 23, 1, 30, 30, 0, l)
fmt.Println("'time.Date': ", t_by_date)
```

## 日付表示

```go
// UTCタイムゾーンで日付表示
t_by_utc := t.UTC()
fmt.Println("'t.UTC': ", t_by_utc)

// ローカルタイムゾーンで日付表示
t_by_local := t.Local()
fmt.Println("'t.Local': ", t_by_local)

// 指定タイムゾーンで日付表示
t_in := t.In(time.UTC)
fmt.Println("'t.In': ", t_in)

// 指定フォーマットで日付表示
fmt.Println("t.Format", t.Format(time.RFC3339))
```

## 日付計算
```go
// １年１ケ月１日後の日付を求める
t_new := t.AddDate(1, 1, 1)
fmt.Println("'t.AddDate': ", t_new)

// 日付比較
is_after := t.After(t_new)
fmt.Println("'t.After': ", is_after)
```
## JSONへエンコーディング
```go
// JSONへエンコーディング
t_byte, err := t.MarshalJSON()
fmt.Println("'t.MarshalJSON': ", t_byte, err)

// JSONからデコーディング
var t_un time.Time
err = t_un.UnmarshalJSON(t_byte)
fmt.Println("'t_un.UnmarshalJSON': ", t_un, err)
```
## その他
```go
// 処理を一時停止
d_second := time.Second
time.Sleep(d_second)
```
ボッチだからPCと喋ってあそぶ。　ParlAI Light。

雑談できるチャットボットを調べていたら [ParlAI Light](https://parl.ai/projects/light/) なるものを見つけた。

> Learning in Interactive Games with Humans and Text

とあるように、テキストゲームするらしい。テキストゲームなんてやったことないけど楽しそう。

上手くいった会話がこんな感じ。

```
Enter Your Message: Excuse me?
[BiEncoderRanker]: You don't address your cardinal that way
Enter Your Message: What is the cardinal?
[BiEncoderRanker]: The prince of the kingdom
Enter Your Message: I go to the cardinal.
[BiEncoderRanker]: You don't address your cardinal that way
Enter Your Message: Who are you>
[BiEncoderRanker]: I am the spokesperson of God and my commands are his will
Enter Your Message: Tell me What do I?
[BiEncoderRanker]: The Lord is our Holy Saviour and He is the one who created Life on this Planet
Enter Your Message: Planet?
[BiEncoderRanker]: Why he is the almighty creator. He gave you that very ability.
Enter Your Message: exit from here
[BiEncoderRanker]: I will watch over you, as I do the entire kingdom, as you move the rocks to enter the Temple.
```

----

## 環境

- Corabolatory
 - GPUで起動
 - 起動できてないときは、[tomo_makesさんの記事](https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131#gpu%E3%82%92%E3%82%A2%E3%82%B5%E3%82%A4%E3%83%B3)が参考になります
- 時間
  - １時間は待つ余裕がほしい

## コード

```
%pip install pytorch-pretrained-bert
!git clone https://github.com/facebookresearch/ParlAI.git
%cd ParlAI/
%run setup.py develop
%run ./examples/interactive.py -t light_dialog -mf models:light/biranker_dialogue/model
```

DLに時間がかかりますが、実行に成功するとユーザー入力を受け付けてくれます。
上手くいかないときは、個別に実行してみてください。


## 感想とか

上手くいかないと3回くらいで会話が進まなくなります。上記の例みたいに上手くいってると、ゲームしてる感じ出ます。(うまく会話できないのは、ゲーム下手なだけかもしれません。。。)
相手の会話内容について触れるようにするとそこそこに会話できます。逆に、それ以外は上手く会話できませんでした。なんかコマンドがあって、それに沿って行動するとか、お決まりがあるのかも。
相手の会話が変だったり理解できなかったりする。世界観を自前で想像しろってことかもしれない。

これを使ってゲームしようとか考えるならば、エンディングはどうするとか、会話相手は誰とか、ルールとかが必要そう。そういったものが学習できるのか？

公式のexampleは学習のみなので注意。ParlAIに関する日本語資料が少ない。公式のドキュメントも難解に感じる。

詳しい内容は (ParlAI Light](https://parl.ai/projects/light/) にある[論文 Urbanek et al., 2019.](https://arxiv.org/abs/1903.03094)を参照か？。少しずつ理解できればいいな。
時間のかかるプログラムをDockerイメージにまとめ、GCEにデプロイ・実行し、結果をSlackに通知する

機械学習の学習プロセスや、ビットコインのマイニングなど、処理に時間のかかるプログラムがあります。
そのようなプログラムをローカルのPCで実行してもよいのですが、今回はクラウドの計算資源である[Google Compute Engine(GCE)](https://cloud.google.com/compute/?hl=ja)を利用して実行します。

1からGCEの環境設定をするのではなく、所望のプログラムを実行するDockerイメージを作成し、それをGCEにデプロイしプログラムが実行され、処理した結果がSlackに通知される、そのようなシステムを作ります。

流れは以下のようになります。

1. 実行結果をSlackに通知するプログラムを作成する
1. プログラムを実行するDockerイメージを作成する
1. 作成したDockerイメージを[Google Container Registry](https://cloud.google.com/container-registry/?hl=ja)にpushする
1. DockerイメージをデプロイしたGCEインスタンスを作成する
1. (実行結果がSlackに通知される)

# 実行結果をSlackに通知するプログラムを作成する

任意の桁の整数をランダムに生成し、それが素数であればslackに通知するプログラム `prime.py` を作成します。

slackの通知には[slackclient](https://github.com/slackapi/python-slackclient)というライブラリを使います。
`SLACK_API_TOKEN` は[Slack API](https://api.slack.com/apps)からアプリを作成し、設定することで得られます。

```python:prime.py
import random
import slack

def is_prime(num):
    for i in range(2, num):
        if (num % i) == 0:
            return False
    return True

def post(message):
    client = slack.WebClient(token='SLACK_API_TOKEN')
    client.chat_postMessage(channel='#random', text=message)

if __name__ == '__main__':
    digit = 7 # 桁数
    while True:
        num = random.randrange(10 ** digit, 10 ** (digit + 1))
        if is_prime(num):
            post(num)
            break
```

`python prime.py` を実行するとSlackに素数が通知されると思います。

# プログラムを実行するDockerイメージを作成する

`prime.py` を実行するDockerイメージを作成します。

`slackclient` を使っているので、 `requirements.txt` にその旨を記述します。

```:requirements.txt
slackclient
```

Dockerfileには、 `requirements.txt` を使ってライブラリをインストールすること、 `prime.py` を実行することを記述します。
ベースイメージには、Python 3のイメージを使っています。

```Docker:Dockerfile
FROM python:3
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python prime.py
```

ディレクトリ構成は以下のようになります。

```
.
├── Dockerfile
├── prime.py
└── requirements.txt
```

`prime` というタグでDockerイメージを作ります。

```console
docker build -t prime .
```

`docker run prime` を実行するとSlackに通知が飛ぶと思います。

# 作成したDockerイメージをGoogle Container Registryにpushする

GCPでプロジェクト作成や、Cloud SDKをインストールしていない場合は行います([参考](https://cloud.google.com/container-registry/docs/quickstart?hl=ja))。

Dockerイメージにレジストリ名をタグ付けします。PROJECT-IDには作成したGCPのプロジェクトIDが入ります。

```console
docker tag prime gcr.io/[PROJECT-ID]/prime
```

タグ付けができたらDockerイメージをGoogle Container Registryにpushします。

```console
docker push gcr.io/[PROJECT-ID]/prime
```

Google Container Registryのコンソールにアクセスして、リポジトリにイメージがあればOKです。

![registry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42150/f2c90e7f-1491-c11f-f8c4-217b12860454.png)


# DockerイメージをデプロイしたGCEインスタンスを作成する

GCEのコンソールよりインスタンスを作成します。

レジストリにDockerイメージをpushするときタグを設定しなかったので、コンテナイメージは `gcr.io/[PROJECT-ID]/prime:latest` となります。
一度プログラムを実行したらそのまま終了してもらって構わないので、再起動ポリシーは `常にオフ` にします。

操作画面は以下のようになると思います。

![gce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42150/f1375be2-8e6c-b026-64b8-475015aa63e6.png)

インスタンスを作成すれば、pushしたDockerイメージがデプロイされ、素数を生成するプログラムが実行され、実行結果がSlackに通知されます。

# まとめ

時間のかかるプログラムを実行するDockerイメージを作成し、それをGCEにデプロイ・実行し、結果をSlackの通知で受け取る、というシステムを作りました。

これくらいの規模であれば旨味はないかもしれませんが、インスタンスを何台も立ち上げて、並列で計算する必要がある場合などは、一つひとつGCEの環境設定するよりも効率的に結果を得られるかもしれません。
本当にあった怖いコードから学ぶアンチパターンその1

# 序章
梅雨も本格化して暑いですね。
世の中には背筋がぞっとなるコードがたくさんあるものです（怪談風に）
本当にあった怖いコードの紹介とともにアンチパターンとして同じ過ちを繰り返さないように書き残していきたいと思います。

# 本当にあった怖いコードその1
### コードが消されずにコメントアウトされたままになっている

えっと思った方は、まともな（少なくともコメント化したまま放置するような輩とは違う）方だと思います。
こんな感じで

```
// // XXする機能
// 以下コードが延々と書かれている
```

現実にはいるんですよね。
本当にいらないならただのノイズですし、将来必要だからといってもコメントアウトしてるとやっぱノイズなので邪魔でしかないっていう（しかも使われない）。

しかもそこのプロジェクトではGit使っているのに・・・。構成管理ツールの意味とは一体・・・。

# 教訓
不要なコードなら消そう。git使っているなら消しても後から追える。残していてもコードのノイズでしかないし読み手を混乱させるだけ。
将来必要な機能だって？
YAGNIの法則を思い出そう。（知らなかったら調べよう。）
「You Ain’t Gonna Need It.」それはきっと必要ない。
ABEJA Platform × icrawlerで機械学習用のデータを用意する

## はじめに

本記事は、以下の手順をまとめた記事です。
- Webクローリングにより収集したデータをABEJA Platformに保存する

## 事前準備
### Jupyter Notebookの起動
ABEJA Platformにて、ジョブ定義を作成して、ノートブックを立ち上げます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376869/21f20b05-b498-5a9f-339a-ad82d211e96d.png" width=80%>

### icrawlerのインストール

Jupyter NotebookのTerminalで`pip install icrawler`して、icrawlerをインストールします。

## Webクローリングにより収集したデータをABEJA Platformに保存

準備が完了したら、ノートブックで以下のコードを実行します。

このコードでは、以下の2つのタスクを行っています。

- Webクローリングにより、5種類の花（マーガレット、タンポポ、バラ、ヒマワリ、チューリップ）の画像データを収集
- 収集したデータをABEJA Platformのデータレイクに保存

```python

from pathlib import Path
from icrawler.builtin import GoogleImageCrawler
from abeja.datalake import Client as DatalakeClient
from abeja.datalake.storage_type import StorageType

# set credential
organization_id = 'XXXXXXXXXXXXX'
credential = {
    'user_id': 'user-XXXXXXXXXXXXX',
    'personal_access_token': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
}
datalake_client = DatalakeClient(organization_id=organization_id, credential=credential)

# define channel name and description
name = 'flower-data-crawling'
description = 'created by my crawler'

# create DataLake channel
channel = datalake_client.channels.create(name, description, StorageType.DATALAKE.value)

# download images
keyword_list = [u'マーガレット', u'タンポポ', u'バラ', u'ヒマワリ, 'u'チューリップ']
max_num = 100
filters = {'type': 'photo'}
image_root_dir = Path('image')

for keyword in keyword_list:
    crawler = GoogleImageCrawler(storage={'root_dir': image_root_dir / keyword})
    crawler.crawl(keyword=keyword, max_num=max_num, filters=filters)
    # upload images
    channel.upload_dir(image_root_dir)
```

数分で、`Crawling task done!`が表示され、データ収集が完了しました。

データレイクに移動すると、先ほど指定した名前で、チャンネルが作成されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376869/4dbbb0e3-9102-3f59-ce7d-0f9eac567ec4.png" width=80%>

チャンネルの中身を確認すると、収集したデータが保存されています！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376869/a4db364c-7c48-95bf-3139-9104d8c73e58.jpeg" width=60%>

## まとめ
本記事では、Webクローリングにより収集したデータをABEJA Platformに保存する手順をまとめました。ABEJA Platformには、アノテーションの機能があるため、その機能を使って保存したデータにラベル付けを行うことができます。詳細は、[公式ドキュメント](https://developers.abeja.io/function/annotation/templates/)を参照ください :dog:

## 参考
Webクローリングで集めたデータを使い、このような機械学習モデルをつくることができます！

サンタクロースとサンタコスを見分けるDeep Learningモデルをサービス化してみた
https://tech-blog.abeja.asia/entry/santa-recognition-from-scratch

ABEJA Platformは、トライアルも提供しています。気になられた方は、是非、お気軽にお問い合わせください。また、フォーラムもありますので、是非、ご活用ください。

ABEJA Platformに関するお問い合わせ
https://abejainc.com/platform/ja/contact/

ABEJA Platform Forum
https://forums.abeja.io/
MMD自動トレースで OpenPose の代わりに tf-pose-estimation を使う

[GitHubのWiki](https://github.com/errno-mmd/tf-pose-estimation/wiki/MMD%E8%87%AA%E5%8B%95%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%81%A7-OpenPose-%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB-tf%E2%80%90pose%E2%80%90estimation-%E3%82%92%E4%BD%BF%E3%81%86)に移行しました。
AWSのドキュメントが読みづらいので読みやすくしてみた

AWSのドキュメントですが配色とか文字の幅とかスペースの開け方とか、
デザインがあれなんでかなり読みづらいです。

以下は [Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Introduction.html) のドキュメント。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/d4839b36-089c-b652-5ecd-7df4bc91af3e.png)


# ~~Stylish~~ Stylusを使ってCSSを上書きして見やすくする
~~[Stylish](https://chrome.google.com/webstore/detail/stylish-custom-themes-for/fjnbnpbmkenffdnngjfgmeleoegfcffe?utm_source=chrome-ntp-icon)~~ [Stylus](https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne/related)というChromeの拡張機能を使えばサイト別にユーザー定義のスタイルを反映させ事が出来るので、実際にCSSを書いてAWSのドキュメントを読みやすくしてみました。

コードはGithububにあげてあります。
[userstyles/aws-docs.user.css at master · nkmr-jp/userstyles · GitHub](https://github.com/nkmr-jp/userstyles/blob/master/aws-docs.user.css)


## 設定方法
[Stylish](https://chrome.google.com/webstore/detail/stylish-custom-themes-for/fjnbnpbmkenffdnngjfgmeleoegfcffe?utm_source=chrome-ntp-icon) を使っていましたが、[Stylus](https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne/related)のほうが簡単に設定できるので、乗り換えました。

1. Chromeの拡張機能[Stylus](https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne/related)をインストール
2. [https://raw.githubusercontent.com/nkmr-jp/userstyles/master/aws-docs.user.css](https://raw.githubusercontent.com/nkmr-jp/userstyles/master/aws-docs.user.css) からインストール。(.user.cssのファイルのrawリンクをクリックすると自動でインストール画面が表示されます）
3. インストールをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/6cbc0860-38cf-f4b5-14da-2f93afae60dd.png)



## スタイルの反映を確認
[Amazon DynamoDB とは - Amazon DynamoDB](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Introduction.html)

スタイル反映前
![9EF1DC43-A6A6-4F5D-8496-3867C3651793.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/fc880d1c-ce89-65c6-e74c-f66790303ce3.png)

スタイル反映後
![190630155118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/04db4ef0-bd44-17d7-7213-16b9f5ad89d8.png)

かなり読みやすくなった。


# まとめ
AWSのドキュメントは運用歴が長いからか、あまり今風のサービスのような読みやすいドキュメントではないです。「[ドキュメントの入り口](https://docs.aws.amazon.com/index.html)」のページや「[特徴](https://aws.amazon.com/jp/athena/features/?nc=sn&loc=2)」 のページ「[Amplifyのドキュメント](https://aws-amplify.github.io/docs/android/start)」 など最近作られたようなページはキレイなので、この辺を参考にデザインを寄せて作りました。

だいぶ読むのが楽になると思うので、よかったら試してみてください。
[Alibaba Cloud] TerraformでマルチゾーンRDSを作成

Alibaba CloudでTerraformを使って、マルチゾーンRDSを作成するサンプルを以下に記載します。
なお、ひとまず、パスワードとか雑に書いていますが、そこはスルーでお願いします。

# サンプル設定

```vpc.tf
provider "alicloud" {
  region     = "ap-northeast-1"
}

resource "alicloud_vpc" "vpc" {
  name        = "VPC"
  description = "Aliyun VPC"
  cidr_block  = "172.16.0.0/16"
}

resource "alicloud_vswitch" "vsw" {
  vpc_id            = "${alicloud_vpc.vpc.id}"
  name              = "VSw"
  description       = "Aliyun VSwitch"
  cidr_block        = "172.16.1.0/24"
  availability_zone = "ap-northeast-1a"
}
```

```rds.tf
# データベース用SLBが属するVSwitch
resource "alicloud_vswitch" "rds_slb" {
  vpc_id            = "${alicloud_vpc.vpc.id}"
  name              = "rds_slb"
  description       = "RDS VSwitch"
  cidr_block        = "172.16.11.0/24"
  availability_zone = "ap-northeast-1a"
}
# データベースインスタンス
resource "alicloud_db_instance" "instance" {
    engine = "MySQL"
    engine_version = "5.6"
    instance_type = "rds.mysql.s2.large"
    instance_storage = "30"
    instance_charge_type = "Postpaid"
    instance_name = "instance"
    vswitch_id = "${alicloud_vswitch.rds_slb.id}"
    zone_id = "ap-northeast-1MAZ1(a,b)"
    monitoring_period = "60"
    security_ips = ["172.16.1.0/24"]
}
# データベースのアカウント
resource "alicloud_db_account" "account" {
    instance_id = "${alicloud_db_instance.instance.id}"
    name = "tf_account"
    password = "Test12345"
}
# データベースアカウントの権限
resource "alicloud_db_account_privilege" "default" {
    instance_id = "${alicloud_db_instance.instance.id}"
    account_name = "tf_account"
    privilege = "ReadOnly"
    db_names = ["${alicloud_db_database.base.*.name}"]
}
# データベース
resource "alicloud_db_database" "base" {
    instance_id = "${alicloud_db_instance.instance.id}"
    name = "tf_database"
    character_set = "utf8"
}
```

# 設定ポイント

## マルチゾーンの指定
私はこの書き方がわからず、ハマりました。
zone_idに複数の値を入れることはできず、どう設定すればいいのやらと。。。
東京リージョンの場合は、`zone_id = "ap-northeast-1MAZ1(a,b)"` と書く必要がありました。

`aliyun rds DescribeRegions`とAlibaba Cloud CLIで確認すると、選択肢がわかります。
他にもcn-hangzhou-MAZ10(h,i)とかcn-shanghai-MAZ1(b,c)とかありますね。

[APIを用いてAlibaba Cloudリソースを自動構築する⑤ - RDS編](https://www.sbcloud.co.jp/entry/2019/06/19/api-orchestration-5)も参考になりました。

## SLBが自動的に作成される
alicloud_db_instanceの中で、vswitch_idを指定する必要があります。
ここで指定するvswitchにRDSインスタンスが作成されるのかと思っていたのですが、そうではありませんでした。
ここにはRDS用のSLBが作成されます。

RDSの構成に関しては、[Alibaba Cloud マルチゾーン設計 #3 RDS編](https://bigriver.jp/?p=2437)がとても参考になります。

# 感想

`ap-northeast-1MAZ1(a,b)` にたどり着くまでに３時間くらいかかりました。
最終的にコンソールでRDSをマルチゾーンで作成し、**terraform import** して、気がつきました。今後もハマりそうになったら使ってみたいと思います。

実際に手を動かしてやってみると、AWSとは違うところを多く発見しますね。
【Python】Tkinterによる60行で作るGUIアプリ「ストップウォッチ」

# はじめに

こんにちは。:blush:
今回は「ストップウォッチ」を作っていきたいと思います。
完成するとこんな感じに動きます！

![ストップウォッチ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/6231342e-24e8-5d4c-7e53-1c933072c1c4.gif)


# 環境
- Windows 10 home
- Python 3.7.1


# 「ストップウォッチ」の制作

## インポート

使うライブラリは以下の2つです。

```py
import tkinter as tk
import time
```


## ウィンドウの作成

```py
import tkinter as tk
import time

class Application(tk.Frame):
    def __init__(self,master):
        super().__init__(master)
        self.pack()

        master.geometry("300x150")
        master.title("ストップウォッチ")
        master.config(bg="black")

def main():
    win = tk.Tk()
    app = Application(master = win)
    app.mainloop()

if __name__ == "__main__":
    main()
```

このプログラムでウィンドウを作っていきます。
サイズは**300×150**です。タイトル名は**ストップウォッチ**です。背景色を**黒色**にしています。
詳しくは[【Python】Tkinterを使った雛形（クラス化手法）](https://qiita.com/MichihiroTsukano/items/4d8721aaa59e1c913d9a)の記事をご参照ください。


## 完成したプログラム

```ストップウォッチ.py
import tkinter as tk
import time

class Application(tk.Frame):
	def __init__(self,master):
		super().__init__(master)
		self.pack()

		master.geometry("300x150")
		master.title("ストップウォッチ")
		master.config(bg="black")

		self.startTime=time.time()
		self.stopTime=0.0
		self.elapsedTime=0.0
		self.playTime=False

		self.canvas = tk.Canvas(master,width=290,height=80,bg="skyblue")
		self.canvas.place(x=3,y=10)

		tk.Button(master,text="リセット",command=self.resetButtonClick,width=10).place(x=10, y=110)
		tk.Button(master,text="スタート",command=self.startButtonClick,width=10).place(x=110, y=110)
		tk.Button(master,text="ストップ",command=self.stopButtonClick,width=10).place(x=210, y=110)

		master.after(50,self.update)

	def startButtonClick(self):
		if not self.playTime:
			self.startTime=time.time()-self.elapsedTime
			self.playTime=True

	def stopButtonClick(self):
		if self.playTime:
			self.stopTime=time.time()-self.startTime
			self.playTime=False

	def resetButtonClick(self):
		self.startTime=time.time()
		self.stopTime=0.0
		self.elapsedTime=0.0
		self.playTime=False

	def update(self):
		self.canvas.delete("Time")
		if self.playTime:
			self.elapsedTime=time.time()-self.startTime
			self.canvas.create_text(280,40,text=round(self.elapsedTime,1),font=("Helvetica",40,"bold"),fill="black",tag="Time",anchor="e")
		else:
			self.canvas.create_text(280,40,text=round(self.stopTime,1),font=("Helvetica",40,"bold"),fill="black",tag="Time",anchor="e")

		self.master.after(50,self.update)

def main():
	win = tk.Tk()
	#win.resizable(width=False, height=False) #ウィンドウを固定サイズに
	app = Application(master=win)
	app.mainloop()

if __name__ == "__main__":
	main()
```
こちらが完成したプログラムになります。
作りながらの感想ですが、スタートする時間(このプログラムだとstartTime)が重要だと思いました。もしアルゴリズムがよく分からない場合は、startTimeの値は今何なのか？、その変化をよく見ていくと理解できるんじゃないかと思います！


# おわりに
以上で「ストップウォッチ」は完成になります。
ここまで読んでいただき、ありがとうございました。
Excel VBAからAWS Auroraに接続する

Excelは全能にして絶対。
事務作業からプログラムまで、どんな層にでも広く活用されているのが全能伸Excel様なのだ。

先日、個別に管理されたファイルを結合しているとかいう崇高な仕事をしている人がいたので、
データベースに連携させるように提案したのですが、実際にやったことなかったのでやってみました。
ということで、今回はExcelをつかってAWSのAurora(MySQL）接続をやってみます。

<img width="647" alt="a6.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/ecbe2a2e-0b51-9e9f-875a-6acfabb23701.png">

#Auroraを立てる

Auroraを立てていきましょう。
ポイントは2点。

①セキュリティグループでポートを開ける（3306）

<img width="293" alt="a9.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/613883af-8393-6d50-07b8-51618b942d04.png">


②パブリックアクセス可能にチェックを入れる。

<img width="390" alt="a2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/5c3fbf4e-cc1e-4593-3580-3742be5ee3f8.png">

Aurora構築時にデータベースも作成しておきましょう。
ここでは「mydb」という名前でデータベースを立てることにします。

<img width="384" alt="a1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/283ead8d-2d9c-f37c-5737-db341c642604.png">


これでAuroraの環境が整いました。

#MySQLドライバをインストール

以下のサイトからODBCドライバ（MySQL Connectors）をWindowsPCにインストールしましょう。

https://dev.mysql.com/downloads/


#VBAを書く

テーブルを作成して、サンプルデータをインサートして、結果をSELECTするサンプルコードです。

```
 Sub main()
 
 Dim adoCon As Object ' ADOコネクション
 Dim adoRs As Object  ' ADOレコードセット
 Dim CreateTableSQL As String    ' SQL
 Dim InsertSQL As String    ' SQL
 Dim SelectSQL As String    ' SQL
 CreateTableSQL = "create table tmp_tbl(id int,name nvarchar(255))"
 SelectSQL = "select * from tmp_tbl"
  
  ' ADOコネクションを作成
  Set adoCon = CreateObject("ADODB.Connection")
 
  ' ODBC接続
  adoCon.Open _
      "DRIVER={MySQL ODBC 8.0 Unicode Driver};" & _
      " SERVER=****aurora-instance-1.cfu9dcigfnzc.ap-northeast-1.rds.amazonaws.com;" & _
      " DATABASE=mydb;" & _
      " UID=admin;" & _
      " PWD=*****;"

  'CreateTable 既にテーブルあればエラーを無視
  On Error Resume Next
    adoCon.Execute (CreateTableSQL)
  On Error GoTo 0
  
  'サンプルデータをインサート
  For i = 1 To 10
    int_rnd = Round(Rnd * 10000, 0)
    InsertSQL = "insert into tmp_tbl(id,name) values(" & int_rnd & " ,'apple_" & int_rnd & "')"
    adoCon.Execute (InsertSQL)
  Next
  
  ' SELECTの実行
  Set adoRs = adoCon.Execute(SelectSQL)
    Do Until adoRs.EOF
      Debug.Print adoRs.Fields(0) & ":" & adoRs.Fields(1)
    adoRs.MoveNext
  Loop

End Sub

```

#注意事項

データベースをインターネットにさらすことになるので、
セキュリティグループなどで適切にアクセスは制御します。
もし商用で行う場合はVPN-Gatewayを使うなどが安全です。

それではご査収ください～(^－^)
BlockChainについて勉強し始めた #1

##はじめに
BlockChainの勉強を初めて２週間ほど・・・
ひたすらネットの記事をみていきました。
バックオフィスシステム（基幹システム。販売や会計、人事、給与など）で利用できるようになるのではと思い、調査開始しました。

##わかったこと
- BlockChainは1.0〜3.0とどんどん機能が進化していること
    - 1.0 仮想通貨として利用
    - 2.0 スマートコントラクトとして利用（publicのみ）
    - 3.0 必要な人や組織に限定してスマートコントラクトを利用できる（privateも可能）
- Baas（BlockChain As A Service)というものがあり提供しやすくなっていること
    - MicrosoftAzureやAmazon、Oracleが開始している。
        - https://zenism.jp/blockchain/baas/about-baas/2019/01/07/
- バックオフィスシステムの根本的な効率化につながる可能性があること
    - 分散台帳の特性を利用したプラットフォームCordaを利用した業務改善に関するブログ
        - https://medium.com/corda-japan/%E6%A5%AD%E5%8B%99%E6%94%B9%E5%96%84%E3%81%AE%E6%AD%B4%E5%8F%B2%E3%81%AE%E4%B8%AD%E3%81%A7%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%92%E7%B4%90%E8%A7%A3%E3%81%8F-df880d18f71


##メモ
- Cordaを日本語解説付きで紹介しているブログ
    - https://medium.com/corda-japan/corda%E7%90%86%E8%A7%A3%E3%81%AB%E3%82%80%E3%81%91%E3%81%A6-%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%AD%97%E5%B9%95%E5%8B%95%E7%94%BB%E3%81%AE%E7%B4%B9%E4%BB%8B-f3b586512609
テスト7

```vb

Public Sub HTMLsource()
'HTMLソースの全てを取得
'参照設定
'「Microsoft HTML Object Library」、「Microsoft Internet Controls」
Dim ie As InternetExplorer
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True

ie.Navigate "https://finance.yahoo.co.jp/"

Do While ie.Busy = True Or ie.readyState < READYSTATE_COMPLETE
    DoEvents
Loop

Dim HTMLString As String
HTMLString = HTMLStr(ie)

Dim FileName As String
FileName = ThisWorkbook.Path & "\HTML_" & Format(Now, "YYYYMMDDHHmmSS") & ".txt"

Dim FileNum As Integer
FileNum = FreeFile()

Open FileName For Output As #FileNum
    Print #FileNum, HTMLString
Close #FileNum

End Sub

Private Function HTMLStr(container As Object, Optional depth As Long = 0) As String

Dim ErrorInfo As String
Dim htdoc As HTMLDocument
On Error Resume Next

Set htdoc = container.document

If Err.Number <> 0 Then
    ErrorInfo = Trim(Str(Err.Number)) & ":" & Err.Description
End If

On Error GoTo 0

Dim ret As String
ret = "---------------------------------------------------------" & vbCrLf
ret = ret & "[" & Trim(Str(depth)) & "階層]" & vbCrLf

If Not htdoc Is Nothing Then
    ret = ret & htdoc.Title & "|" & htdoc.Location & "(" & container.Name & ")" & vbCrLf
    ret = ret & "---------------------------------------------------------" & vbCrLf
    ret = ret & htdoc.getElementsByTagName("HTML")(0).outerHTML & vbCrLf
    Dim i As Integer
    
    For i = 0 To htdoc.frames.Length - 1
        ret = ret & HTMLStr(htdoc.frames(i), depth + 1)
    Next

Else

    ret = ret & "---------------------------------------------------------" & vbCrLf
    ret = ret & ErrorInfo
    
End If

HTMLStr = ret

End Function

```
firestoreで更新するドキュメントがあればバリデーションをかける

単純にnullチェックをするだけでは微妙なことになる。
ハマったので議事録的に残す。

firestoreのrulesにはコメントも書き込める。
RDBみたいにちょっと繋げば制約とデータ構造を把握できるが、firestoreだとおそらくこれを見るしかないので該当のカラムに対してvalidationメソッドを明示的に用意するといいかも。

Realtime Databaseでは `.validate` が用意されており、明示的に書くことができた。
firestoreではまだこういった仕組みは用意されてないように見え、自信でvalidationを実装する必要がある。
https://firebase.google.com/docs/database/security?hl=ja#section-validation

うーん、可読性が低いのでなんとかしてほしいなー
いい方法があるんだろうか

```js

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userID} {
      allow read: if true;
      allow create, update: if request.auth != null 
                              && request.auth.uid == userID
                              && isValidUsers();
    }

    // utilitie functions

    function existingData() {
      return resource.data
    }

    function incomingData() {
      return request.resource.data
    }

    function currentUser() {
      return request.auth
    }

    // collection rules

    function isValidUsers() {
      return isValidNickName() 
              && isValidProfileText()
              && isValidIconURL()
              && isValidCreatedAt()
              && isValidUpdatedAt()
    }

    // document rules

    function isValidNickName(){
      return (incomingData().keys().hasAll(['nickname']) == false || 
      (incomingData().nickname != null 
        && incomingData().nickname is string
        && incomingData().nickname.size() > 0 
        && incomingData().nickname.size() <= 20))
    }

    function isValidProfileText(){
      return (incomingData().keys().hasAll(['profile_text']) == false || 
      (incomingData().profile_text != null 
        && incomingData().profile_text is string
        && incomingData().profile_text.size() >= 0 
        && incomingData().profile_text.size() <= 500))
    }

    function isValidIconURL(){
      return incomingData().keys().hasAll(['icon_url']) == false || 
      (incomingData().icon_url != null && incomingData().icon_url is string)
    }

    function isValidCreatedAt(){
      return incomingData().keys().hasAll(['created_at']) == false || 
      (incomingData().created_at != null && incomingData().created_at is timestamp)
    }

    function isValidUpdatedAt(){
      return incomingData().keys().hasAll(['updated_at']) == false || 
      (incomingData().updated_at != null && incomingData().updated_at is timestamp)
    }
  }
}
```
Twitterにあげる用の動画をffmpegで処理する備忘録

毎回忘れるのでメモ

# 動画の形式
> **ブラウザからアップロードできる動画の解像度と縦横比を教えてください。**
- 最小解像度: 32 x 32
- 最大解像度: 1920 x 1200（および1200 x 1900）
- 縦横比: 1:2.39～2.39:1の範囲（両方の値を含む）
- 最大フレームレート: 40fps
- 最大ビットレート:25Mbps

引用元: [Twitterで動画を共有および視聴する方法](https://help.twitter.com/ja/using-twitter/twitter-videos)

# コマンド
```terminal
ffmpeg -i ${input_name} -vf scale=${width}:${height} -r 40 ${output_name}.mp4
```
- `${input_name}`: 入力ファイルパス
- `${output_name}`: 出力ファイルパス
- `${width}: 出力動画横サイズ
- `${height}: 出力動画縦サイズ
pythonのコンストラクタとは

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている小栗です。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

はじめに
===
pythonのコンストラクタについて、まとめます。
理解が不十分な気もするので、参考になる超初心者向けの記事などあれば教えていただきたいです。


```py


class Foods(): #クラスを定義する
    def __init__(self,name): #コンストラクタを定義する、selfはオブジェクト自信を指す、selfは慣習
        self.name = name #引数を初期化
food = Foods("banana")
print(food.name)

```

インスタンスとコンストラクタの違いを、いまいちはっきり理解できていない、、、
Leetcode #461: Hamming Distance

```swift
func hammingDistance(_ x: Int, _ y: Int) -> Int {
    var answer = 0
    var x = x
    var y = y
    while x > 0 || y > 0 {
        answer += (x % 2) ^ (y % 2)
        x >>= 1
        y >>= 1
    }
    return answer
}
```
AWS Lambdaで形態素解析・ネガポジ判定

#はじめに

###概要
AWSLambdaを用いて、形態素解析・ネガポジ判定を行いました。
さらにそれを呼び出すChrome Extensionを作りました。

<img width="336" alt="スクリーンショット 2019-07-25 17.55.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163480/8e7b0a39-21b7-a27d-75c8-ffd4f3ff3182.png">

##動作
Extensionを実際に実行している動画です。
https://youtu.be/-WW9-FS14iU

### リポジトリ
https://github.com/jre233kei/ymn-proken-2019-spring

### 筆者について
AWSと機械学習は初心者です。この記事にも色々とツッコミどころはあると思いますが、もしあったらコメント欄で優しく教えてもらえれば幸いです。

###環境
MacOS HighSierraです。

#データを集める

### スクレイピング
BeautifulSoupを使ってAmazonレビューのデータを集めました。注意点として、相手のサーバーに負荷を掛けないように時間を開けて実行してください。今回は3秒に1回にしました。

# データ分析
参考にした記事
https://qiita.com/takumi_TKHS/items/d5131e08f0b4e36eed13
Fasttextを使って、5段階に文章をクラスタリングしました。（\_\_label\_\_1, ... , \_\_label\_\_5)

### データをいじる（精度の改善）
レビューの分布を見てみると、星5のレビューが多く、星2のレビューが少なかったので、全体を星2のレビューの数に合わせました。

精度ログ

日付 | データ名 | 二乗平均誤差 | 備考
------------ | -------------|-------------|-------------
20190520 | train-1.lst | 3.1810502601128867 | データを均していない
20190520 | train-5.lst | 3.5173455561196736 | 全ての品詞
20190520 | train-6.lst | 2.7260113494692706 | 動詞のみ
20190520 | train-7.lst | 2.2812438853609276 | 形容詞のみ
20190520 | train-8.lst | 2.196664765267606 | 形容動詞のみ
20190520 | train-9.lst | 2.028354813214697  | 名詞のみ
20190520 | train-10.lst | 2.2340274200386463 | 副詞のみ
20190520 | train-12.lst | 2.175985237169445 | 連体詞のみ
20190520 | train-13.lst | 2.2264072902013634 | 感動詞のみ
20190520 | train-14.lst | 2.3114062619249776 | 助動詞のみ
20190520 | train-15.lst | 3.0844580552161402 | 助詞のみ

データを均し、取り出す品詞を変えながら実験しました。

# AWS

###制限対策
最初はPythonで書かれたバージョンのFasttextを使ってEC2上で動かしてみたのですが、メモリ制限に当たってしまい、上手くは行きませんでした。そこで、fasttext-serverlessというあらかじめ整備された物を使ってみました。
https://github.com/CareerVillage/fasttext-serverless

###pipインストール
https://qiita.com/bukaz/items/c5d65109c20b32b7f5ca
dockerizepipを使いました。内部的にDocker（Lambci）を動かしています。pipを使うだけで十分であればこれで大丈夫です。

###インストールしたライブラリ
- janome :
pipでインストールできる日本語の形態素解析では軽いです。

###Docker上で学習させる
改行コードのなどの問題があったため、AWSの環境を再現したDockerの中で学習させて、モデル（.binファイル）を取り出しました。

###詰まったこと
Dockerの中からファイルを取り出せなかったので、https://blog.amedama.jp/entry/2018/01/30/221546 を参考に学習済みモデルを取り出しました。

#エクステンション制作
###Messaging
Chromeでバックグランドで動いているjsとポップアップ上で動くjsの間で通信をする必要があり、
Github上でMessagingを使っているエクステンションを検索して、参考にしながらMessagingを実装しました。
https://github.com/rmango/msgPassingExample

###CORS
ローカルのWebからアクセスするためにはCORSの問題を解決する必要があるので、バックエンド側でHeaderをつけてあげる必要があります。

###文字コード
POSTを送るときに、日本語を送ると文字化けしてしまったので、一旦```encodeURI()```を使って文字コードにしてあげて送ると良いです。

#おまけ
###Native messagingについて
Chrome ExtensionにはNative Messagingという機能があり、ローカルに存在するファイルを実行する機能がありますが、権限を与えてもChrome側の仕様によって、subprocessが実行できないのでダメでした。確かにこれをアリにしてしまうとChromeからローカルの任意のコマンドを実行できるのでとても危険ですね。。。（これで1ヶ月溶かしました）

#備考

後々記事はアップデートする予定です。
Scilab (NumPy) - plotの書き方

自分用のメモです。

### プロット
||式|SciLab(plot)|(NumPy)|(R)|
|:--:|:--:|:--:|:--:|:--:|
|プロット<br>(散布図)|x={0,0.1,...}<br>y=sin(x)|x=[0:0.1:6];<br>y=sin(x);<br>plot(x,y)| plt.plot(x,y,label="sin")|
|軸範囲|0<=x<=6<br>-1<=y<=1|a=gca();//軸ハンドル取得<br>a.data_bounds=[0,-1;6,1];//X,Y共に設定<br>a.data_bounds(:,1)=[0,6];//X軸を設定<br>a.data_bounds(:,2)=[-1,1];//Y軸を設定<br>a.tight_limits(1)="on";//X軸を厳密に設定<br>a.sub_tics(1)=8;//x軸の目盛|
|タイトル|"ABC"|title("ABC","X軸","Y軸");//軸も指定|plt.title="ABC"||
|x軸ラベル|"X"|xtitle="X"|plt.xlabel="X"||
|凡例||legends(["A","B","C"],1);//1右上、-1右上外|plt.legend()||
|表示|||plt.show()||
|スタイル<br>色<br>線種類<br>ドット||brgcmykw<br>-,--,-.,:<br>+x*o.^v&lt;&gt;sdp||
### 画像
||式|SciLab|NumPy|R|
|:--:|:--:|:--:|:--:|:--:|
|画像読み込み||#"IPCV"を使う場合<br>img=imread("filename")|from matplotlib.image import imread<br>img=imread()||
|画像表示||imshow(img)|plt.imshow(img)||
|ピクセル値の取得||pixel=img(10,12,:);
|２次元可視化||||image(A,col=gray(0:16/16))|

リンク
[Scilab超入門(齊藤 宣一)](http://www.infsup.jp/saito/materials/15scilab_intro.pdf)
[scilabつかいませんか(望月 孔二) 沼津高専](http://user.numazu-ct.ac.jp/~mochizuki-k/scilab/)
[SciLab 勉強会(藤田研究室,小方研究室) 岩手県立大学](http://yusuke-manabe.info/scilab/pdf/scilab04.pdf)

##SciLab関連ドキュメントリンク
*install*
[macOSでSciLabを動かすまで](https://qiita.com/0x20FE/items/2ba5e60685816485ea4c)
[SciNoteのオートコンプリートをとめたい](https://qiita.com/0x20FE/items/cb17fda3f7456a807d41)

*実践*
[SciLabでCSV読み込み](https://qiita.com/0x20FE/items/dd6cbf94be0f2c20d002)
[SciLabでGUIを使ってみる](https://qiita.com/0x20FE/items/cf9cdad0e4be88714118)
[Mac/Windows共用scilabスクリプト]()未公開
[SciLabでフィルタを適用する]()未公開
[プロットメモ]()未公開
[プロットあれこれ]()未公開

*他の言語と比較・書き換え*
[Scilab (NumPy) - plotの書き方](https://qiita.com/0x20FE/items/311ac0e61a129e6a01fa)
 [配列と文字列処理の比較](https://qiita.com/0x20FE/items/ b6ea768692297b721951)
   [関数とオブジェクトの書き方メモ](https://qiita.com/0x20FE/items/02e2a6d8380851272a2c)
  [Scilab,NumPy,R行列処理の比較](https://qiita.com/0x20FE/items/75622186ba8a0c6086ce)
【できるけどおすすめはしない】GASで2言語を相互に翻訳しながらGoogleスプレッドシートを同時に編集する方法

## 背景
英語話者と同時にスプレッドシートを編集する必要があった際に、それぞれの言語で表示・編集できるといいなーと考えて実装してみました。

## 実装 
スプレッドシートのツールというタブから、スクリプトエディタを開いて以下のコードを書き込みます。それだけです。

スクリプトエディタの使い方など、詳細については参考にしたリンクを貼っておきます。

- [スプレッドシートで文字を翻訳するGOOGLETRANSLATE 関数より便利なGoogle Apps Script【GASで自動翻訳】](https://bvb-arigato.com/languageapp-translate-gas/)
- [Google Apps Scriptでシート全体を自動で翻訳する](https://honawork.hatenablog.com/entry/2018/08/08/002818)
- [Google Apps Script 実践メモ - onEdit()で複数セルを編集された場合の処理](http://jjnurburg.com/onedit2/)

上記のページと異なるのは、1シート分を翻訳することを目的として、日本語と英語のシートをそれぞれ分けて準備したところです。書き込んだタイミングで翻訳されます。

### コード
```javascript

// onEdit()は編集されたことをトリガーとする関数
function onEdit(){
  // シートの取得
  var sheet_ja = SpreadsheetApp.getActive().getSheetByName('日本語のシート名');
  var sheet_en = SpreadsheetApp.getActive().getSheetByName('英語のシート名');
  
  // アクティブなセルを取得
  var cell = sheet.getActiveCell();
  var column = cell.getColumn();
  var row = cell.getRow();
  var val = cell.getValue();
  
  // 日→英
  var set = LanguageApp.translate(val, "ja", "en");
  sheet_en.getRange(row, column).setValue(set);
  
  // 英→日
  var set2 = LanguageApp.translate(val, "en", "ja");
  sheet_ja.getRange(row, column).setValue(set2);
}
```

## 注意点
- 編集をトリガーとして翻訳が実行されるため、日→英→日のような翻訳が行われることもあり、変な翻訳が表示されることがかなりの頻度であります。
- そのため、実用性という点では少し課題が残ります。
- その場合の対策として、日本語のシートであっても適切な英語で表記すると上手く翻訳されることがあります。
- また、複数行コピーやカットにも対応していないため、都度両方のシートを編集する必要があります。
Rails の ActiveRecord で has_one の association を持つレコードを検索する例

User has a book のとき

多分こんな感じ

```rb
User.joins(:book)
```

inner join すると、関連を持たない親は消えるはず








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WASMでhello world

# tl;dr
go言語で書いたコンソール出力をwasmにコンパイルし、動作を確認します。

# WASMとは
WebASseMbly。Webブラウザで実行できるバイナリ。javascriptよりも高速に動作する。
主要ブラウザにて対応済み。[各ブラウザの実装状況](https://developer.mozilla.org/ja/docs/WebAssembly#Browser_compatibility)

# go言語のインストール
linuxなら、パッケージマネージャからインストールします。
それ以外なら、[公式サイト](https://golang.org/dl/)よりダウンロードし、インストールします。
インストールが終わったら、コンソールで確認します。

```
$ go version
```

# goexec のインストール
別になくてもいいんですが、easyにローカルhttpサーバを建てたいのでインストールしておきます。
※goexecをインストールするには、事前にgitのインストールが必要です。

```
$ go get -u github.com/shurcooL/goexec
```

# プロジェクト用フォルダの作成
今回のプロジェクト用に適当なフォルダを準備します。私の場合、「play_wasm」にしました。

```
$ mkdir play_wasm
$ cd play_wasm
```
ここから先は全て、play_wasmフォルダ内での作業になります。

# goのコードを書く
play_wasmフォルダ内に、「main.go」ファイルを作成します。
ファイルの中身は以下の通りです。

```
package main

func main() {
    println("Hello, WebAssembly!")
}
```

# コンパイル
goからwasmにコンパイルします。

```
$ GOOS=js GOARCH=wasm go build -o test.wasm main.go
```
※wasm_exec.htmlでファイル名を指定してあるため、必ず「test.wasm」にしてください。もし変更したい場合は、wasm_exec.htmlの修正が必要です。

# 動作確認
ヘルパーファイルをダウンロードします。play_wasmフォルダ内で以下のコマンドを実行します。

```
$ curl -sO https://raw.githubusercontent.com/golang/go/master/misc/wasm/wasm_exec.html
$ curl -sO https://raw.githubusercontent.com/golang/go/master/misc/wasm/wasm_exec.js
```

ローカルhttpサーバの起動

```
goexec 'http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))'
```
ブラウザより以下のアドレスにアクセスし、「run」ボタンを押すとconsoleにhelloが出力されます。
http://localhost:8080/wasm_exec.html
zshで、Gitリポジトリ内のファイルをfuzzy searchして、Vimで開く

[peco](https://github.com/peco/peco) を使うと、標準入力から受け取ったテキストデータをあいまい検索して、選択した行を標準出力に返す事ができる。

```console
$ echo "apple\nbanana\nchocolate" | peco
```

![apple-banana-chocolate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35647/170bdb0f-b254-bf46-b430-817305a8777d.gif)

これを利用して、あるリポジトリ内にあるファイル一覧を出力し、pecoに渡すと、ファイル名のfuzzy search（あいまい検索）をすることが出来る。

```console
$ git ls-files | peco
```

![ls-file.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35647/b266c8ff-1652-28ac-ebdf-67908277cd57.gif)

さらに、fuzzy searchの出力結果をvimに渡してやるというような処理を `peco-vim` というfunctionとして定義し、 `Ctrl-[` にマッピングしてやる。

このソースは参考記事にある `peco-src` を改変したものだ。

```sh:.zshrc
bindkey '^[' peco-vim

function peco-vim() {
    local src=$(git ls-files | peco --query "$LBUFFER" --prompt "vim>")
    if [ -n "$src" ]; then
        BUFFER="vim $src"
        zle accept-line
    fi
    zle -R -c
}
zle -N peco-vim
```

![peco-vim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35647/d1c3201a-f12f-6782-a981-9fbb0fc43e42.gif)

結構便利だと思う。

### 参考

- [ghqでリポジトリ管理とpeco連携で快適git生活 - Qiita](https://qiita.com/strsk/items/9151cef7e68f0746820d)
Elevated のレイ生成処理

[Elevated](https://www.shadertoy.com/view/MdX3Rr) で用いられているレイ生成の処理を読んで行きましょう。レイの始点はカメラの位置ですが、レイの向きをどのように求めるか？が主題となります。

[Elevated](https://www.shadertoy.com/view/MdX3Rr) より抜粋

```glsl
mat3 setCamera( in vec3 ro, in vec3 ta, in float cr )
{
    vec3 cw = normalize(ta-ro);
    vec3 cp = vec3(sin(cr), cos(cr),0.0);
    vec3 cu = normalize( cross(cw,cp) );
    vec3 cv = normalize( cross(cu,cw) );
    return mat3( cu, cv, cw );
}

...
    // camera2world transform    
    mat3 cam = setCamera( ro, ta, cr );
    // pixel
    vec2 p = (-iResolution.xy + 2.0*fragCoord)/iResolution.y;
    // camera ray
    vec3 rd = cam * normalize(vec3(p,fl));
...
```

カメラ座標系でのレイの向き（ `normalize(vec3(p,fl))` ）をワールド座標系に変換しています。setCamera関数はカメラの回転行列を求めます。

### `vec3(p,fl)`

@kaneta1992 さんの
https://qiita.com/kaneta1992/items/21149c78159bd27e0860#%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%92%E5%AE%9A%E7%BE%A9 を読めばわかります。 :thinking: 

### `setCamera()`

`setCamera()` は、以下のように分解するとわかりやすくなります。

```glsl
mat3 lookAt(vec3 eye, vec3 center, vec3 up)
{
    vec3 zAxis = normalize(center - eye);
    vec3 xAxis = normalize(cross(up, zAxis));
    vec3 yAxis = normalize(cross(zAxis, xAxis));
    return mat3(xAxis, yAxis, zAxis);
}

mat3 setCamera( in vec3 ro, in vec3 ta, in float cr )
{
    return lookAt(ro, ta, vec3(sin(cr), cos(cr), 0.0));
}
```

lookAt 関数は glm::lookAt などとは異なり、ビュー行列ではなくカメラの姿勢の回転行列を求めているので注意です（ビュー行列はカメラの姿勢の逆行列）。カメラをロールする気がないなら、こちらの `lookAt` 関数で良いでしょう。
Vue.jsってなんなの？

Vue.jsってなんなの？使うと何が違うの？
というところを、これからフロントエンドを学習される方向けに記事にしてみました。

##SPAとは
Single Page Applicationを略したもので、特徴としては、単一のページで構成される、クロスプラットフォームであること、UXの向上、などがよく取り上げられています。
Vue.jsやReact.jsなどのJSフレームワークを取り入れることによってSPAが作りやすくなります。

##Webの表示の仕組みについて
どうしてSPAである必要があるのか、通常のWebサイトの表示の流れと比較して説明したいと思います。

###ページを表示するためのファイルを取得
Webページを開くときに私たちはサーバーに対してリクエストを送ります。
簡単に言うと、ブラウザからWebページのURLを叩いたり、ブラウザでWebサイトを検索してリンク開く、などの行為がそれに該当します。
この際、どのサーバーのどのディレクトリのどのファイルを表示してほしいのかを、リクエストしています。
サーバーは指定されたファイルがあればそのファイルを表示します。
ページを開いた際には、ページ表示に必要なファイルを取得するために、サーバーとの通信が発生していることになります。
CSS、JSファイルをHTMLのheadから読み込んでいる場合は、そちらも取得されます。


###描画処理(レンダリング)
ページ表示に必要なHTMLファイルを取得してからは、HTMLの構造やCSSでのスタイル、JSでの処理を反映させて、画面を描画しなければなりません。

HTMLの構造の部分はよくDOMと言われます。
正しい意味としては、HTMLをプログラムから操作するための仕組みのようですが、
「DOMの取得」、「DOMの操作」など、DOM自体が構造であるかのような意味合いでもよく使われます。
>DOMとは「Document Object Model」の略だ。
直訳すると、「ドキュメントを物として扱うモデル」になる。
プログラムからHTMLやXMLを自由に操作するための仕組みだ。
https://eng-entrance.com/what-is-dom

ファイル取得後は、DOMの構造が取得され、要素のサイズや位置、余白などの計算、背景色や文字色などのスタイルを反映という順で行われます。
このページ描画までの一連の処理はレンダリングと呼ばれます。
以下の例はかなり省略しているので、詳しく知りたい方はググって見てください。

例えば、DOMの構造を変化させたとします。
そうするとまたDOMの取得から、幅や余白などのレイアウトの計算、背景色や文字色などの描画の順で処理が行われます。
一部テキストの文字色が変更された場合は、DOMやレイアウトに関わるスタイルが変更されていないので、色の反映の処理まで戻ります。
DOMの構造を変化させた場合と色を変更した場合では色のみを変更した場合の方が負荷が少ないことになります。

ページ遷移があった場合は、ファイルの取得から描画までの処理が行われますが、SPAのように1つのページで構成されていれば、少なからず表示に関わるファイルを再度取得することはありません。
また、Vue.jsでは仮想DOMが使用されます。
仮想DOMによってさらに描画処理の負担が減り、処理の無駄を省くことができます。

###仮想DOMとは
仮想DOMを用いない、リアルなDOMについては、前の説明のような流れで処理されます。
仮想DOMの場合は、DOMに変更があった場合に、差分を検知し変更分のみを最適な形で処理します。
ただ、これは仮想DOMが構築されてからの話です。
初回表示については、仮想DOMを構築するためにリアルなDOMが描画されるよりも時間がかかってしまいます。

## SPAに適したページ
初回表示に時間がかかるので、処理が少ないページではあまり効果得られないかもしれません。
初回表示が遅ければユーザーの離脱率が上がります。
極端な例ですが、モバイル向けのWEBサイトでは、ページの読み込みにかかる時間が3秒以上だと53％が離脱するという結果もあるようです。
JSフレームワークを使うのに適したページは、ユーザーがUIを操作することの多いページ（検索などの機能があったり、UI/UXを重視したページなど）、直帰率の低いページになるかと思います。
メディアサイトの記事ページなどは直帰率が高い傾向にあるので、あまり取り入れるメリットはないかと思います。
ただし、ランディングページなどブランディングに関わるものについては、直帰率は比較的高めの傾向にはありますが、それ以上にUI/UX重視したいもあります。
あくまでこれらはJSフレームワークを取り入れる際の判断の一例となります。

直帰率については以下のページで業界別データがまとめられているのでよかったら見てみてください。
https://www.demandsphere.jp/blog/referrer-pattern-average


## 導入のメリット
JSフレームワークの導入にあたって、Vue.jsが選択された理由についての多くは学習コストが少ないこと、規模に合わせてカスタマイズしやすいことがよく挙げられています。
ちなみに、Vue.jsはLine(スタンプショップ等)やRetty、noteなどのサービスでも導入されています。

- 生のHTML・CSSに近い形で記述ができる
- 日本語のドキュメントや導入事例が多い
- ES6の知識がなくても取り入れられる
- 規模に合わせて使いやすい

##おわりに
ここまでお読みいただきありがとうございます。
今後は、VuexやVue Router、Nuxt.jsやSSRについても記事にできたらいいなと思っていますので、よろしくお願いします。
MacBookでDockerを用いてwebサーバを立てる練習をする(Mac + Docker + PHP + Apache)

# 目的
タイトルの通り、Dockerを用いてwebサーバを立てる練習の備忘録です。

# 準備
下記サイトの通り、Dockerをインストール、Hello用のDockerを取得します。

[Dockerの開発環境構築 (Mac + Docker + PHP + Apache)](https://qiita.com/Ryooota/items/65ff0c32a5d93f225d7a)

# テスト
"Hello Docker"と表示されればOK
<img width="160" alt="スクリーンショット 2019-06-16 13.36.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/8ba3f6f7-846c-f51e-a403-8902e2a0e2b4.png">


# FAQ

```
$ docker run -d -p 80:80 -v /Users/Sample/Docker/php_apache/html:/var/www/html --name php_apache_container php_apache_image:ver001
6c84ffb93b441a19b6748ad41b00a044c6e78681aee7e6b41a30511380d1af2a
docker: Error response from daemon: error while creating mount source path '/Users/Sample/Docker/php_apache/html': mkdir /Users/Sample: permission denied.
```
-v で指定するボリュームが使用中の環境と合っていない可能性があります。

-v /Users/Sample/Docker/php_apache/html:/var/www/html 
-v ホスト側のパス:ゲスト側のパス
　 ホスト側のパスはindex.phpを格納したパスを指定します。
　 ゲスト側のパスはDocker内部のパスを指定します。

→ホスト側のパスを修正したら直りました。

# 参考
[Dockerの開発環境構築 (Mac + Docker + PHP + Apache)](https://qiita.com/Ryooota/items/65ff0c32a5d93f225d7a)
Dialogflowを試してみました

先日参加した[kojin-dev](https://qiita.com/organizations/kojin-dev)でDialogflowを扱ったものを見せてもらったのでとりあえず自分でも試してみました。

## 作成したもの
https://yujihamada.github.io/Dialogflow/dialogflow.html
こちらのURLで動きます。弊社株式会社ipocaのサービスに関するよくあるお問い合わせで作ってみました（内容は正式なものではありません）。
![a3tf8-brssg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/7b927687-f892-d40f-e862-bceebea441a7.gif)
![uh1nq-d2bpd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/a7a63091-4b9b-4bfb-b658-a4428fe87a87.gif)



## Sign up
https://dialogflow.com/
にアクセスしてSign up for freeをクリックします。

## Entityの設定
今回は簡単な受け答えの実装します。多少間違ってるかもですが大枠は大丈夫かと…

まずはEntityの設定から言葉の定義をします。
<img width="615" alt="スクリーンショット 2019-06-30 18.56.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/353b6887-efcb-8e01-2513-be1bb69bcbce.png">
例えば上記画像では「できない」という言葉の定義を行います。
こんかいはできないというお問い合わせに対して返答するので、「できない」という言葉をいくつかの言葉を想定してしました。
「うまくいきません」、「できない」、「できません」という言葉を決めました。

## intentの設定
会話の流れを決めていきます。ユーザーが行ったことに対してどのキーワードがあればどのように返答するのか決めていきます。
<img width="968" alt="スクリーンショット 2019-06-30 19.02.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/2009b6aa-1758-23f4-305e-9b0df1691f32.png">
トレーニングフレーズを入れると、先程入力したintentが検出されます。
そこからどのentityが必須なのか`REQUIRED`にチェックを入れます。もしすべての`REQUIRED`が入力されず、特定のentityのみ入力された場合は`PROMPTS`にその場合の入力を入れます。`PROMPTS`ではすべての`REQUIRED`が入力されるように促すようなメッセージが適切かと思われます。

## Response
<img width="549" alt="スクリーンショット 2019-06-30 19.09.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/a2e6b33c-7434-8ef4-955c-7ead613212e6.png">
すべてのentityが確認されたときの返答を入力します。

## follow-up intent
これで一つの会話の流れが完成です。ただ一往復の会話で終わることは少ないかと思います。
そういうときは`follow-up intent`を加えます
<img width="985" alt="スクリーンショット 2019-06-30 19.11.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/a9ed92d0-be49-b6eb-b84b-97448e410fac.png">
follow-up intentでその後の会話を先ほどと同じように設定していくと、最終的な回答にたどり着きます。

## Integrations
<img width="999" alt="スクリーンショット 2019-06-30 19.15.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/8a38966f-98d9-3a64-6eaa-9491c6a5eef9.png">
冒頭に紹介したWebページはこちらのIntegrationsから作成しました。WebDemoを選択するとこの会話ができるiframeタグが提供されるのでhtmlに埋め込むだけであっという間に体験可能です。

実際はもっといろんなことができるでしょうが、とりあえずここまで試して見たので記録しておきます。
Amethystいじろうとしたら動かなかった問題

# 序文

https://qiitadon.com/@celluloce/102359220990915198
上リンクのまとめ。
RustのゲームエンジンであるAmethystをいじろうとしたら見たことないエラーに見舞われたのでその解決までの手順をまとめた。

# 環境

- rustc 1.35.0
- Ubuntu 18.04.2 LTS
- Radeon RX 570 Series
- amethyst 0.11.1

# Exampleが動かない

https://github.com/amethyst/amethyst
AmethystのGithubから`git clone`して`$cargo run --example pong`で走らせても動かなかった。

エラー文は以下の通り。[引用](https://github.com/amethyst/amethyst/wiki/GraphicalBackendError)

```
You must specify at least one graphical backend feature: `vulan`, `metal`, `empty`. See the wiki article https://github.com/amethyst/amethyst/wiki/GraphicalBackendError for more details.
```

## 解決法

https://github.com/amethyst/amethyst/wiki/GraphicalBackendError
上文献を参考にすればよし。

Exampleを走らせたいなら以下コマンドを打てばいい。

```
$ cargo run --example pong --features "vulkan"
```

また自作ゲームを作る場合、以下文を`Cargo.tom`に記述する必要がある。

```Cargo.toml
[features]
vulkan = ["amethyst/vulkan"]
metal = ["amethyst/metal"]
```
その後`$ cargo run --features "vulkan"`すればいい。

これで一部のExampleが動いた。（そう一部だけ）

# 一部のExampleが動かない

上記した方法で`window`等のExampleは動いたが、`pong`, `fly_camera`等で以下エラーが出た。

```
thread 'main' panicked at 'Unable to load Vulkan entry points: LibraryLoadError("libvulkan.so.1: cannot open shared object file: No such file or directory")', src/libcore/result.rs:997:5
```

## 足りないファイルを入れてみる
`libvulkan.so.1`ファイルが無いようなので、以下コマンドを打ってみた。

```
$ sudo apt install vulkan-utils libvulkan1 libvulkan-dev
```

違うエラーが出てきた。

```
[WARN][gfx_backend_vulkan] Unable to find extension: VK_KHR_surface
[WARN][gfx_backend_vulkan] Unable to find extension: VK_KHR_xlib_surface
[WARN][gfx_backend_vulkan] Unable to find extension: VK_KHR_xcb_surface
[WARN][gfx_backend_vulkan] Unable to find extension: VK_KHR_wayland_surface
thread 'main' panicked at 'Unable to create Vulkan instance: VkError(ERROR_INCOMPATIBLE_DRIVER)', src/libcore/result.rs:997:5
```
ちなみに`$ vulkaninfo`打ったら上記にもある`ERROR_INCOMPATIBLE_DRIVER`が出てきた。

## GPUドライバの問題では

Ubuntu + Radeon環境でVulkan動かすにはどうすればいいか調べた。

https://linuxconfig.org/install-and-test-vulkan-on-linux#h7-2-ubuntu

上文献に従って以下コマンドを打った。
（前にGPUドライバ入れた記憶があるのだが衝突とかしないだろうか...）

```
$ sudo add-apt-repository ppa:oibaf/graphics-drivers
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libvulkan1 mesa-vulkan-drivers vulkan-utils
```

して、再び`$ cargo run --example pong --features "vulkan"`を打った。

したら動いた。

# まとめ
Amethystを使うにはVulkan環境が必要になったようだ。
（設定次第で必要なくなるだろうが知らん）
ActionController::RoutingError (No route matches [GET] "/users/sign_out")

#deviseでログアウトのリンクつけたらエラー

```
Started GET "/users/sign_out" for ::1 at 2019-06-30 18:18:57 +0900
  
ActionController::RoutingError (No route matches [GET] "/users/sign_out"):
  
vendor/bundle/gems/actionpack-5.2.3/lib/action_dispatch/middleware/debug_exceptions.rb:65:in `call'
vendor/bundle/gems/web-console-3.7.0/lib/web_console/middleware.rb:135:in `call_app'
vendor/bundle/gems/web-console-3.7.0/lib/web_console/middleware.rb:30:in `block in call'
vendor/bundle/gems/web-console-3.7.0/lib/web_console/middleware.rb:20:in `catch'
```

#解決策

ログアウトのリンクは`method`を指定

```view.erb
<%= link_to 'Logout', destroy_user_session_path, :method => :get, remote: true %>
```

```config/initializers/devise.rb
config.sign_out_via = :delete

        ⬇️変更

config.sign_out_via = :get
```

ルーティングをしっかり確認

```routes.rb
devise_for :users
```

下記を追加（なかったら）

```application.js
//= jquery
//= jquery_ujs
```

下記を追加（なかったら）

```views/layouts/application.html.erb
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```

以上

参考
https://stackoverflow.com/questions/9590598/devise-rails-no-route-matches-get-users-sign-out