OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsクラウドGPUサーバーを使って、お手軽にvket4に遊びに行くための方法

<img width="1215" alt="スクリーンショット 2020-05-05 17.24.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175024/5d0f074b-b843-3cee-3480-382ada39dc8b.png">


HMDもWindowsPCもつよつよグラボも何も持っていない人が、WindowsクラウドGPUサーバーを使って[vket4](https://www.v-market.work/v4/)に遊びに行くためのやり方をまとめます。
所要時間は30分~1時間ほどです。

# 対象読者
WindowsPCやグラボを持っていない
VRChat気になるけど、いきなり環境を整えるにはハードルが高い
vket4の雰囲気を味わいたい

# 必要なもの
PC(macでもOK)
クレカ

クラウドを使うため、毎月5ドル、サーバー起動1時間あたり0.78ドルかかります。

# 手順
**1. PaperspaceでWindowsサーバーを立ち上げる**
vket4に遊びに行くにはVRChatが必要ですが、VRChatを使うには高性能なグラボが積まれたWindowsPCが必要です。
そこで、https://suna.hateblo.jp/entry/2019/06/30/015730 を参考に、Paperspaceに登録し、WindowsのクラウドGPUサーバーを作ります。
この[プロモコード](https://paperspace.io/&R=O6XWHST)から登録すると10ドル貰えます。私も10ドル貰えます。
GPUはP5000を選びました、特に問題なく使えました。
P5000を使用するには申請が必要ですが、私の場合"I`d like to use it for cloud gaming"と使用理由を入力して、10分弱で承認が降りました。

**2. Windowsサーバーにアクセスする**
https://www.paperspace.com/console/machines から作成したサーバーを選び、起動します。

**3. steamとVRChatをインストール**
起動したサーバにsteamとVRChatをインストールします。
VRChatのアカウントは、steamのアカウントを連携させるのではなく、新しくアカウントを作った方がいいそうです。
https://bluebirdofoz.hatenablog.com/entry/2018/10/20/221852
> steam のアカウントを利用する場合、自作のアバターやワールドのアップロードを行えません。

**4. 仮想USBマウスをオンにする**
VRChatの視点操作にマウスを使うのですが、VRchatを起動するとマウスが効かなくなる場合があります。
Windowsの画面の右上に灰色の丸いアイコンをクリックしてPaperspaceのセッティングを開き、Advanced Settings > Emulate USB Mouse をオンにします。

↓灰色のアイコンをクリックするとメニューが出てくる
<img width="197" alt="スクリーンショット 2020-05-05 15.15.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175024/9babd0d8-98a5-90a7-cdc7-f5ce36e3e0ec.png">


↓Advanced Settingsをクリックして、Emulate USB Mouseをオンにする
<img width="443" alt="スクリーンショット 2020-05-05 15.16.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175024/667f0a39-26da-2e65-01f5-1a2e6fc7a490.png">


**5. VRChatを起動**

**6. VRChat内でvket4を検索して遊びに行く**
https://www.v-market.work/v4/access を参考にvket4のワールドに遊びに行きましょう

申請がうまく通れば、大体30分ほどでvket4に遊びに行けます。


# 感想など
とりあえずVRChat触ってみたい、vket4遊びに行きたいという目的は達成されました。ラグを感じることはありませんでした。

自宅で環境を整える場合最低10万は必要なので、初期投資を大幅に抑えられました。

ただし、マウスの感度は悪いし、キャラの操作しづらいし、何より他のユーザーとわちゃわちゃするのにDesktop版は圧倒的に不利です。
ちゃんとVRChatやりたければHMDを買った方がよさそうです。
Flutter（Dart）で複数の非同期処理を並行して待ちたい（Future.wait()の挙動）

# はじめに

Dartでは，`dart:async`の`Future.wait()`を使う事で複数の非同期処理を並行して待つことができます．
Flutterなどで，複数のAPIを同時に取得したい時に使えます．

# 動作確認

[DartPad](https://dartpad.dev/)にコピー＆ペーストで動作確認できます．

# コード

~~~dart
void main() async {
  List<Future<bool>> futureList = [];
  for (int i = 0; i < 5; i++) {
    futureList.add(somethingAPI(i));
  }
  
  print('Future.wait() start');
  var futureWait = Future.wait(futureList);
  
  print('start await');
  var result = await futureWait;
  print(result);
  print('print end');
}

Future<bool> somethingAPI(int t) async {
  print(t.toString() + ' start');
  Future<bool> future =
      Future.delayed(Duration(seconds: t), () => t%2 == 0 ? true : false);

  bool value = await future;
  print(t.toString() + ' end');
  return value;
}
~~~

## 実行結果

~~~
0 start
1 start
2 start
3 start
4 start
Future.wait() start
start await
0 end
1 end
2 end
3 end
4 end
[true, false, true, false, true]
print end
~~~

# 説明

非同期処理の`somethingAPI(int t)`は数秒後に値を返すAPIを想定した関数です．
`Future.wait()`にFutureインスタンスをListで渡す事で，そのすべてが完了するまで`await`で待つことができます．
非同期処理の実行結果は`Future.wait()`の戻り値としてListで受け取ることができます．

上記のコードでは`Future.wait()`に対する`await`の挙動を確かめたかったので，`futureWait`という変数を経由させました．しかし通常は直接`await`で受けても良いでしょう．

また，下記の様に`.then()`や`.catchError()`でチェインさせたりエラーハンドリングを行うことができます．

~~~dart
  var futureWait = Future.wait(futureList)
    .then(
      (content) {
        print('.then is called');
        return content;
      },
    ).catchError(
      (e) {
        // do something
        throw e;
      },
    );
~~~

# Reference

[Dart API reference documentation](https://api.dart.dev/stable/2.8.1/index.html) / [wait<T> method](https://api.dart.dev/stable/2.8.1/dart-async/Future/wait.html)
[解説 Dart 2 プログラミング言語](https://www.cresc.co.jp/tech/java/Google_Dart2/introduction/main_page.html) / [非同期処理-Future (Asynchronous Programming: Futures)](https://www.cresc.co.jp/tech/java/Google_Dart2/language/asynchrony_futures/asynchrony_futures.html)
[DartのFutureを使って非同期処理を書く](https://sbfl.net/blog/2015/01/05/writing-asynchronous-operation-with-future-in-dart/)
github + Netlify + ムームードメイン（独自ドメイン）でホスティングする

##この記事を読んだら分かること
・ムームードメインで取得したドメインでNetlifyの設定が出来る


##起こった問題
・ムームードメインで取得したドメインを使ってもNetlifyで独自ドメインの設定・https化に成功しない

##原因
・ムームードメインでネームサーバーを抑えられているため、Netliy側ではホスティングが出来ないから

##対処方法

・Netlifyの設定
Settings→Domain managementから、Add custom domain
自分のドメインを入力する

ドメインは入力できますが、エラーになって接続できないはずです。

・ムームードメインの設定をする
ムームードメインでログインし、ネームサーバ設定変更をクリックする

次にドメイン管理→ムームーDNS→設定したいドメインの「変更」を押して、設定の欄に以下のように入力し、セットアップ情報変更をクリックする

```
www CNAME ＊＊＊＊.netlify.com
(空欄) ALIAS ＊＊＊＊.netlify.com
```
＊＊＊＊のところはNetfly側で発行されたものを記入する
Overviewのメインカラム上部に記載されています

<img width="1234" alt="スクリーンショット 2020-05-05 17.14.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154859/45420d2a-7bec-9a8f-be4c-1cf27f9ff225.png">


・Netflyで確認する
設定が成功したら、「https://独自ドメイン/」で接続に成功するはずです

##備考

ネームサーバーの書き換えはあまり推奨されないようですが（詳しくないので分からない）、この方法で使えます
Gsuiteを使用しているドメインで、メール機能とのバッティングが不安でしたが、問題は発生しませんでした
【Laravel】Laravel Model作成

#①Modelのみ作成する場合

ディレクトリ移動

```
公文）
$ cd /Applications/MAMP/htdocs/プロジェクト名
例）
$ cd /Applications/MAMP/htdocs/laravel_test
```

Model作成

```
公文）
$ php artisan make:model Models/ファイル名
＊Modelのファイル名は単数系
例）
$ php artisan make:model Models/Test
```

#①'Model・Controllerまとめて作成する場合

ディレクトリ移動

```
公文）
$ cd /Applications/MAMP/htdocs/プロジェクト名
例）
$ cd /Applications/MAMP/htdocs/laravel_test
```

Model・Controller作成のartisanコマンド実行

```
公文）
$ php artisan make:model Models/ファイル名 -mc
例）
$ php artisan make:model Models/Test -mc
```

#②マイグレーション

ディレクトリ移動

```
公文）
$ cd /Applications/MAMP/htdocs/プロジェクト名
例）
$ cd /Applications/MAMP/htdocs/laravel_test
```

テーブルファイル作成

```
公文）
$ php artisan make:migration create_テーブル名_table
＊テーブル名は複数系
例）
$ php artisan make:migration create_tests_table
```

ファイル編集
作成したファイル編集

マイグレート

```
$ php artisan migrate
```
【Unity】Addressables1.8.3で読み込んだオブジェクトをSetParentすると初回だけlocalPosition, localRotationの値が意図した物にならない

# 概要

Addressablesで読み込んだオブジェクトを `SetParent` すると初回だけ `localPosition`, `localRotation` の値が意図した物にならない。(二回目以降の同じ処理では意図したとおりの値になる)

元々 `Resources.Load` で書いていた箇所を `Addressables.LoadAssetAsync` に変更して発生、実装は下記の通り。

```cs
// var prefab = Resources.Load<GameObject>(path);
var prefab = await Addressables.LoadAssetAsync<GameObject>(path).Task;   
var childGameObject = Instantiate(prefab, position, rotation);
childGameObject.transform.SetParent(parentGameObject.transform, true);
```

# 環境

- Unity 2018.4.22f1
- Addressables 1.8.3

# 暫定対策

`SetParent` 後に `localPosition` と `localRotation` を直接変更する。

```cs
var prefab = await Addressables.LoadAssetAsync<GameObject>(path).Task;   
var childGameObject = Instantiate(prefab, position, rotation);
childGameObject.transform.SetParent(parentGameObject, true);
// これを追加した
childGameObject.transform.localPosition = new Vector3(0f, 0f, 0f);
childGameObject.transform.localRotation = Quaternion.Euler(0f,180f, 270f);
```

# やったけど駄目だったこと

- async/await を使わずに `Completed` でコールバックを設定
- `SetParent` ではなく `childGameObject.transform.parent = parentGameObject` を使用
- `SetParent` の第二引数を `false` に変更
- `Addressables.LoadAssetAsync` を2回実行して、2回目の結果を使用
- await 以降の処理を別メソッドに切り出し
- `SetParent(parent) → SetParent(null) → SetParent(parent)` 

# 最後に

`Resources.Load` の時はうまく出来ていたので、Addressables のバグに思えるが、もしかしたら物凄く初歩的なミスをしているのかもしれない気もする。

何の処理が影響してどういう理屈でうまく動作しないのか全く検討がつかなかったので、何か分かる方がいらっしゃいましたらご教示頂けますと幸いです。
c#でxmlファイルの読み込み

# やりたいこと
Visual c#でxml形式のapp.xml内にある値を取得したい。

## サンプル
OOXML形式のファイルをZIP解凍した中にあるXMLファイルを抜粋したものです。

![scrnshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459873/b81c3207-fc18-1858-d992-bbcfdcb16673.jpeg)

## 試したもの
app.xml内にあるSlidesを取得できるのではないかと思い、下記のとおり試してみました。

using System;
using System.Xml;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var xmldoc = new XmlDocument();
            xmldoc.Load(@"c:\test\app.xml");

            Console.WriteLine("スライド枚数は");

            foreach (XmlElement slides in xmldoc.SelectNodes("/Properties/Slides"))
            {
                Console.WriteLine("Slides => {0}\n", slides.InnerText);
            }
            Console.ReadKey();
        }
    }
}

コンソール内では"スライド枚数は"は表示されましたが、肝心の値を表示できない状態です。
c#でxmlを扱うのがはじめてですので、見当違いなことをしていると思うのですが、どこを修正したらよろしいでしょうか。
よろしくお願いいたします。
AWS で docker から pytorch 1.5.0 (GPU) を設定する方法

### Overview

* check host machine 
* installation on nvidia-driver / docker with nvidia docker

# check host machine
```bash
 ubuntu@:~$ lspci | grep -i nvidia
 00:1e.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)
 ubuntu@:~$ lsb_release -a
 No LSB modules are available.
 Distributor ID:	Ubuntu
 Description:	Ubuntu 16.04.4 LTS
 Release:	16.04
 Codename:	xenial
```
In my case, I need to change locale back to English
``` sudo update-locale LANG=C.UTF-8 ```

# installation on nvidia-driver / docker with nvidia docker
* nvidia-driver should be compatible with gpu impelented + latest version for pytorch + tensorflow version 
* this case we'd like to install the driver for tesla k80 / pytorch 1.5.0
* docker was upgraded to include gpu connection natively. don't have to use nvidia-docke

1. please follow this and install nvidia-driver. in my case, the version is 440 
(https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html).
you can check whether it's installed by nvidia-smi.

```bash
 ubuntu@:~/MyDockerMLenv$ nvidia-smi
 Tue May  5 16:37:09 2020
 +-----------------------------------------------------------------------------+
 | NVIDIA-SMI 440.64.00    Driver Version: 440.64.00    CUDA Version: 10.2     |
 |-------------------------------+----------------------+----------------------+
 | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
 | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
 |===============================+======================+======================|
 |   0  Tesla K80           Off  | 00000000:00:1E.0 Off |                    0 |
 | N/A   47C    P0    54W / 149W |    262MiB / 11441MiB |      0%      Default |
 +-------------------------------+----------------------+----------------------+
```

2. please install docker via apt-get (https://docs.docker.com/engine/install/ubuntu)
```bash
 ubuntu@:~/MyDockerMLenv$ docker --version
 Docker version 19.03.8, build afacb8b7f0
```

3. then you can create some docker image and container for pytorch + tensorflow
we don't have the security access (8888 is opened by default)
i recommend you to open port 8888 and 6006 for jupyterlab and tensorboard
you can use --gpus option when you run docker container.
See the background here. (https://qiita.com/ksasaki/items/b20a785e1a0f610efa08)
Rails 6でBootstrapをカスタマイズする

[Theming Bootstrap](https://getbootstrap.com/docs/4.4/getting-started/theming/#sass-options)に書かれているように、Bootstrap 4をカスタマイズ（テーミング）することができる。

# 環境
- Rails 6.0.0
- WebpackでBootstrap 4を管理
- SCSSを使用

# 手順
1. `app/assets/stylesheets` に `bootstrap-custum.scss`を作る
2. `app/assets/stylesheets/applications.scss` に下のように書く。

```applications.scss
@import "bootstrap-custom";
```

3. 設定したい事項を書く。

```bootstrap-custum.scss
$body-bg: red;

@import 'bootstrap/scss/bootstrap';
```
**Import文はテーミング行の下に書く。**

# まとめ
これでカスタマイズをすることができる。
[Bootstrap Document](https://getbootstrap.com/docs/4.4/getting-started/theming/#sass-options) を見るといろいろあるので、試してみてください。
micro:bitとMLX90614で非接触体温計

![IMG_1942.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44523/6c8963e2-4bcc-38c5-c9fa-add80ce54eeb.jpeg)

# はじめに

　先日の[Maker Faire Kyoto 2020 online](https://makezine.jp/event/mfk2020/)のパネルディスカッション「COVID-19以降の世界にメイカーが貢献できること」の中で[紹介](https://youtu.be/bp3XgelJaaU?t=2096)されていたMLX90614による非接触体温計がどの程度使えるのか、試しに作ってみました。

- 参考資料：https://github.com/clab-cetm/DIY-Thermometer-Using-Microbit
- MLX90614 Datasheet : https://www.sparkfun.com/datasheets/Sensors/Temperature/SEN-09570-datasheet-3901090614M005.pdf

# 用意する物

- micro:bit 本体　1つ
- MLX90614 1つ　([aitendo](https://www.aitendo.com/product/11520)で1,950円) 
- micro:bit ブレイクアウトボード 1つ
- ジャンパーピン（メス・メス） 4本

# 配線

![Untitled_New_Diagram_Cacoo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44523/8ea0a143-76ab-1803-9167-5fde45aa2c5e.png)

これだけで済むとは素敵過ぎです。

# ボディ

持ちやすいようLEGOで適当にボディを作りました。
![IMG_1948.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44523/c8d7fe25-5661-f62f-9d70-ec705400853a.jpeg)

# プログラムの前準備

MakeCodeでMLX90614を使うためには、事前に機能拡張を読み込む必要があります。

- MakeCodeで新しいプロジェクトを開きます。
- MLX90614用機能拡張読み込みます。
    - 右上の歯車をクリックし機能拡張を選択します。
    - 検索窓にMLX90614用拡張ブロックのURL https://github.com/DoraLC/pxt-MLX90614 を入力し検索します。
    - 現れる MLX90614の機能拡張をクリックします。
    - MakeCodeのツールボックスに「MLX90614」というツールボックスが追加されればOKです。
![Microsoft_MakeCode_for_micro_bit (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44523/6ecce276-ae7e-4f2d-bb47-963d79b29b58.png)

# センサーの値の確認

まずは、どんな反応をするセンサーなのか見てみます。(以下Chromeブラウザ前提)

- MakeCodeのWebUSB接続を行います。
    - 右上の歯車をクリックし「デバイスに接続する」を選択します。
    - ダイアログの説明に従い接続を行います。（詳しくは[こちら](https://sanuki-tech.net/micro-bit/appendix/flash-programming-using-webusb/) )
- 以下のプログラムを作成し、micro:bitにダウンロードします![microbit-画面コピー (64).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44523/d8c651bd-a3cf-4cdc-267c-227c5362d8bf.png)

- しばらくすると「コンソール表示　デバイス」というボタンが表示されるので、クリックするとリアルタイムにグラフが描画されます。
![Microsoft_MakeCode_for_micro_bit (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44523/5f75a2bb-e826-33cc-f852-e897bebb200a.png)
- 体の様々な部位に触らないようにあてて、センサーのレスポンスをみてみます

個人的な感想としては、仮に通常の体温計と正確にオフセットをとったとしても、あて方一つで大きく温度が変わってしまうため、測定者の熟練（？）が必要な感じがしました。

そこで、ちゃんとした体温計を作るというより、熱がありそうかチェックする道具を作ってみる事にしました。

# 熱がありそうかチェッカー

## 仕様

- 平熱の人を基準として、+1度未満か以上かを簡易チェックするための道具です
- Aボタン：基準体温セット
    - 平熱の人のおでこにあててボタンを押します
    - 基準体温がセットされると◇が表示されます。
- Bボタン：熱がありそうかチェック
    - 測定したい人のおでこにあてて、ボタンを押します
    - 基準体温+1より低い場合：□が表示
    - 基準対応+1より高い場合：×が表示

## プログラム

![microbit-画面コピー (65).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44523/ef72f2cb-a4b0-097e-6ca9-7550f2c16629.png)
https://makecode.microbit.org/_4baCXrExRDc3

## 結果

発熱中の人がいなかったので、たまたま居合わせた低体温の人を基準にしたら、見事、他の人はみんな×になりました（それじゃダメか:sweat_smile:）
#Vue props と computed の違いと method の作用が分かる簡単なコードの例

# NOTE

- computed は計算機能付き props である


>算出プロパティ ※計算機能付きのプロパティ
>データそのものに何らかの処理を与えたものをプロパティにしたい(インスタンスに持たせて参照できるようにしたい)ときに用いる

https://dev83.com/vue-computed-methods/

# Code

props の値を二倍するだけの computed の例
count を二倍した countDouble を作っている


```vue
<template>
  <div>
    <h2>
      count: {{ count }}
    </h2>
    <h2>
      countDouble: {{ countDouble }}
    </h2>
    <input type="button" @click="incrementCounter" value="Increment!">
  </div>
</template>

<script>
export default {
  data () {
    return {
      count: 1
    }
  },
  computed: {
    countDouble () {
      return this.count * 2
    }
  },
  methods: {
    incrementCounter (e) {
      this.count = this.count + 1
    }
  }
}
</script>

// https://dev83.com/vue-computed-methods/

```

# View

count の値を増やすと doubleCount も増える

![image](https://user-images.githubusercontent.com/13635059/80942456-c183eb80-8e1f-11ea-8dad-b4ea3f19e16a.png)
![image](https://user-images.githubusercontent.com/13635059/80942457-c21c8200-8e1f-11ea-921c-71be1b97572d.png)

# computed vs method

method でも同じことが実現できるけど
computed にはキャッシュの利点があるようです

https://jp.vuejs.org/v2/guide/computed.html#%E7%AE%97%E5%87%BA%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3-vs-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89

![image](https://user-images.githubusercontent.com/13635059/80943440-2b04f980-8e22-11ea-989c-61c10c577942.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3138











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Vue – ReferenceError Integer is not defined ( did you mean "Number" ? ) 

Integerという型はないのだ

# Fix

```diff
<template>
  <h1>
    {{ count }}
  </h1>
</template>

<script>
export default {
  props: {
    count: {
-     type: Integer,
+     type: Number,
      default: 1
    }
  }
}
</script>

```


# Guilde

![image](https://user-images.githubusercontent.com/13635059/80941770-466e0580-8e1e-11ea-8800-bc0faf09e028.png)
https://vuejs.org/v2/guide/components-props.html#Prop-Types



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3137











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Carrierwaveの導入


インストール

```terminal:terminal
brew install imagemagick
```

```terminal:Gemfile
gem 'carrierwave'
gem 'mini_magick'
```

```terminal:terminal
$ bundle install
$ rails g uploader image
```

Messageモデルに、image_uploaderをマウントする

```terminal:app/models/message.rb
class Message < ApplicationRecord
  mount_uploader :image, ImageUploader
end
```

```terminal:app/uploaders/image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick
  # storage :fog
  process resize_to_fit: [800, 800]
end

```
HerokuはSQLiteは使えない？

herokuではSQLiteは使えないらしい
-

[SQLite on Heroku](https://devcenter.heroku.com/articles/sqlite3)
上の記事の抜粋
>・SQLiteは簡単に使用できるが、本番環境用のデータベースとしては意図されていない。
・SQLiteはメモリ内で実行され、ディスク上のファイルにバックアップする。この戦略は開発に適しているが、HerokuのCedarスタックには一時的なファイルシステムがあり、書き込みも読み取りもできますが、内容は定期的にクリアされる。HerokuでSQLiteを使用すると、少なくとも24時間に1回はデータベース全体が失われる。
・Herokuのディスクが永続的であったとしても、SQLiteを実行することはできない。SQLiteはサービスとして実行されないため、各dynoは個別に実行中のコピーを実行する。アプリに電力を供給するdynoごとに異なるデータセットが存在することになる。


[HerokuではSQLite3が使えない？！](https://qiita.com/MosamosaPoodle/items/7149aa66f1c087472777)
[Webアプリ開発未経験者がFlaskとSQLiteとHerokuを使って1週間でサービス公開までする](https://qiita.com/kiyokiyo_kzsby/items/f8aa0bf68007e18d6882)


じゃあ今作っているアプリはどうすれば良いの？？を考えた
-
1. SQLiteをpostgreSQLに移行する
2. デプロイ先をherokuから別の場所に変更する（AWSとかGCPとか）


1. SQLiteからPostgreSQLへの移行についてのリサーチ
-

####疑問:
もともとsqlalchemyを使っていたが、ただ接続先をSQLiteからpostgreSQLに変更するだけで大丈夫なのか？
→[Django + SQLAlchemy + SQLite3 / PostgreSQLでWebアプリを作成する](https://qiita.com/nsuhara/items/4ab5366273082ee0aa73)
この記事を読む感じ、接続方法は微妙に違うもののその他は行けそう？というかそれこそが、ORMというものなのか？
[Python3 の 定番ORM 「 SQLAlchemy 」で MySQL ・ SQLite 等を操作 – 導入からサンプルコード](https://it-engineer-lab.com/archives/1183)


とりあえずやってみた
[sqlalchemyを使用してpythonでDBアクセスをする](https://qiita.com/mink0212/items/d7f31f6e2903c5f0b837)

```
pip install psycopg2
```
→エラーが出た

```
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```
[pip install時の「“python setup.py egg_info” failed ...」エラー](https://www.ted027.com/post/python-psycopg2/)
上を参考にエラーを解消していく

```
$ pip install --upgrade pip setuptools
```
→変わらずエラー
→必要なライブラリが無いことが原因と判明。記事にしたがって、postgresqlをインストールする。（Mac OS）

```
brew install postgresql
```

入ったかどうか確認

```
psql --version
（出力）psql (PostgreSQL) 12.2
```
入ってた。

もう一回やってみる

```
pip install psycopg2
```
→できた。

[Flask-SQLAlchemy + PostgreSQLでWebサービスを作成する](https://qiita.com/nsuhara/items/fa5998c0b2f4fcefbed4)

もともとSQLiteでやっていたDB設定のところで名前のところを.sqliteから.postgresqlに変えてみた。

```
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```
こんなエラーが出て、PostgreSQLを起動できなかった。

```
postgres -D /usr/local/var/postgres
```
をやっておかないと無理っぽい？？

app.config['SQLALCHEMY_DATABASE_URI'] = "postgresql://localhost/DB名"
で動作を確認する。
[PostgreSQLの基本的なコマンド](https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb)
コマンドでちゃんと中身が反映されているかも確認




###ローカルで動作確認できたので、herokuの設定を進めていく。
[Heroku Postgres を利用してみよう](https://qiita.com/shosho/items/5ebabf11efb1f3b604f7)

1. Add-ons（Heroku Postgres）を追加する。
2. setting→Config VariablesでDB URLを確認する。
MySQLの操作

# 起動
```bash:bash
$ mysql.server start
```

# ログイン
```bash:bash
$ mysql -u root
```

# データベース作成
```sql:DDL
create database データベース名;
```

# データベース選択
```sql:statement
use データベース名;
```

# データベース一覧
```sql:statement
show databases;
```

# テーブル一覧
```sql:statement
show tables;
```
ubuntu18.04 LTS(desktop)インストール後の最低開発環境を用意

ubuntu18.04 LTS インストール後の最低開発環境を用意します。
vmware、hyper-v、virtualbox等はご自身でご用意下さい。

要不要、追加等はお好みで。

## isoの用意
https://www.ubuntulinux.jp/News/ubuntu1804-ja-remix

## アップデート
```
sudo apt update
sudo apt upgrade
sudo apt autoremove
```

## タイムゾーンを直す
https://qiita.com/zaki-lknr/items/cd9844fa6a1efa58cab1

## chromeのインストール
https://qiita.com/pyon_kiti_jp/items/e6032eb6061a4774aece

## ホームディレクトリのフォルダの英語化
https://qiita.com/taiko19xx/items/d1a001bfc25245b91354

## 隠しフォルダ確認方法
https://linux.just4fun.biz/?Ubuntu/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%A7%E9%9A%A0%E3%81%97%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%BB%E9%9A%A0%E3%81%97%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

## sudoのパスワードをなしにする
https://www.hiroom2.com/2018/10/23/ubuntu-1810-sudo-ja/

## デフォルトのテキストエディタをvimにする
https://blog.amedama.jp/entry/2017/03/08/205711

## 画面ロックをやめる
https://sicklylife.jp/ubuntu/1804/help/session-screenlocks.html

## 最新のgitをぶちこむ
https://loumo.jp/archives/23149

## brew を使えるようにする
```
sudo apt install linuxbrew-wrapper
```

## linuxbrewのpathを通す
https://mo3789530.hatenablog.com/entry/2019/02/11/231033

## anyenv + nodenv 周り（好み）
```
$ cd
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(anyenv init -)"' >> ~/.bashrc
$ echo 'export PATH="$HOME/.anyenv/envs/nodenv/bin:$PATH"' >> ~/.bashrc
$ exec $SHELL -l
$ source ~/.bashrc
$ anyenv install nodenv
$ exec $SHELL -l
$ brew install node-build
$ echo yarn >> $NODENV_ROOT/default-packages
$ nodenv install 11.4.0 #状況に応じて
$ nodenv rehash
```
あとは好きにする。
参考
https://blog.officekoma.co.jp/2020/02/nodenvnodejs.html
https://qiita.com/yoko_u/items/6c8ee617d5ea0ac13d13

## git初期設定
https://qiita.com/wnoguchi/items/f7358a227dfe2640cce3
PyODE チュートリアル 3

#PyODE本家チュートリアル3を実施しました

[本家 PyODE 様サイト](http://pyode.sourceforge.net/)

「Tutorial 3」は接触判定のサンプルです。可視化はPyOpenGLです。
　　・PyOpenGLのセットアップが必要です。
　　・OpenGL ということで、3Dということもあり可視化のコード記述が多いです。
※筆者はC/C++でOpenGL使用したことあるため、（なにやってるか見当はついたので、）このコードはほとんど読んでません。あしからず。


##PyOpenGLセットアップ
少々てこずりました。
　・https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyopengl
　　　から「PyOpenGL-3.1.5-cp38-cp38-win_amd64.whl」を取得して pip でインストールした。
　　　　→　チュートリアル3 が正常動作。
※　pip自動取得からでは正常動作しなかった。 詳細こちら　→　[Python3でPyOpenGLセットアップ](https://qiita.com/emuai/items/1dd61ffa1b69643a9ca3)
ちなみにpyopenglと一緒に「PyOpenGL_accelerate」も入れるものらしいですが、筆者はまだインストールしていません。

##結果
「Tutorial 3」が動きました。
画像の保存ルーチンを追加してGIF動画つくってみました。（Pillow使用）
![tutorial3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469875/51d0f94f-a8c9-31e6-887e-8f62d3ef49d0.gif)

・視点は本家様コードから値を変えてあります。



##画像保存ルーチン
PNG 画像群と GIF 動画1個をファイル出力します。
追記部分だけ ↓ に載せときます。
※元のコードには画像出力がないと思ったのでこのように追加しましたが、見落としてるのかもしれない。

使いかた：
　　・「Pillow」をインストールしとく。
　　・実行前にあらかじめカレントにフォルダ2個「img」と「gif」を作る。
　　・オリジナル231行め「glutSwapBuffers ()」の後で　追加ルーチン「capture()」を呼ぶ。
　　・同じく220行め　「sys.exit (0)」の前とかで　「export_movie()」を呼ぶ
    　　　　　

```python3:PyOpenGLからスナップショット生成/保存
from PIL import Image
from PIL import ImageOps

step=-1
intvl = 10
imgs = []
def capture():
  global step
  step += 1

  if step % intvl != 0:
      return

  pad_step = '{0:04d}'.format(step)
  print( pad_step )
  savepath = "img/tutorial3_"+pad_step+".png"
 
  width = glutGet(GLUT_WINDOW_WIDTH)
  height = glutGet(GLUT_WINDOW_HEIGHT)
 
  glReadBuffer(GL_FRONT)
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
  data = glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE)
 
  #image = Image.fromstring("RGBA", (width, height), data)
  image = Image.frombytes("RGBA", (width, height), data)
  image = ImageOps.flip(image)
  image.save( savepath )
  imgs.append( image )
```

```python:GIF動画保存ルーチン

def export_movie():
    if not imgs:
        return
    imgs[0].save('gif/tutorial3.gif'
               , save_all=True
               , append_images=imgs[1:]
               , optimize=False
               , duration=100 #40
               , loop=0)
```
Laravel+MySQLを使う時に気を付けたいこと

LaravelとMySQLを使ってマイグレーションファイルを実行しようとすると

```
 General error: 1215 Cannot add foreign key constraint")
```
こんなエラーがでた、
外部キー制約だけ追加できないみたい

Railsを使った時に同じような経験をしたけど
今回改めて調べてみた。

## 主キーと外部キーの型の不一致
マイグレーションファイルを生成する時に自動でついてくるこれ

```
   $table->bigIncrements('id');⬅️これ
   $table->timestamps();
```

このid（主キー）がどうやらunsignedって言う属性が元々ついてるみたいで
外部キー制約もこの型に合わせなきゃいけないみたいです。

なので

```
$table->bigInteger('user_id')
$table->foreign('user_id')->references('id')->on('users');
```

これを

```
$table->bigInteger('user_id')->unsigned(); 
$table->foreign('user_id')->references('id')->on('users');
```

こうや！！


```
$ php artisan migrate:fresh

Dropped all tables successfully.
Migration table created successfully.

```

無事完了。

属性を隠し持ってるなんてなんかずるいな。。

## 参考記事
２年くらい前のだけど現時点では有効でした
https://qiita.com/0w0/items/4a9cb7d27794bfb93d46
【rails6】controller_nameを使って、共通レイアウトの固定部分（header,footer）を、特定のページだけ色を変える。

##背景
rails6で学習アプリのクローンを作っていて、様々なコンテンツのページに共通のfooter,headerの色を特定のコンテンツのページだけ色を変えたい。

##環境
* Ruby 2.6.5
* Rails 6.0.2.1 

##解決法

**コントローラ名で条件分岐して、付与するクラスを変更して対応する。**

わかりやすく言えば、`class`の部分に`<%= controller_name == 'users' ? デフォルトのクラス : 変更したいコンテンツ（ページ）のクラス %>`
のようにして，付けるクラスがコントーラ名次第で変わるようにするのがポイント。

できれば、**メソッドにしてヘルパーに処理は移動**する。


###①`application.html.erb`の`header,footer`部分で`style`を入れて、`controller_name`で分岐する。


```ruby:application.html.erb(header)
<nav class="navbar navbar-expand-lg navbar-dark fixed-top" style="background-color: <%= controller_name == 'users（色変更したいページのcontroller名）' ?  '#28a745（変更したいページの色）' : '#5C99FF（デフォルトの色）' %>">
  <%= link_to "Gyakuten", root_path, class: "navbar-brand" %>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#nav1" aria-controls="nav1" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse justify-content-around" id="nav1">
    <ul class="navbar-nav">
```

      
 
```ruby:application.html.erb(footer)
<nav class="navbar navbar-expand navbar-dark fixed-bottom justify-content-center" style="background-color: <%= controller_name == 'users' ?  '#28a745' : '#5C99FF' %>">
	<ul class="navbar-nav">
		<li nav-item><a href="#" class="nav-link active">ブログ</a></li>
		<li nav-item><a href="#" class="nav-link active">youtube</a></li>
	</ul>
</nav>
</footer>
```
（**※※`application_helper.rb`でのcontroller名の書き方〜**
例として、「Users.controller.rb」の場合は、「`users`」）


これだけでも実装はされます。

ここから、`controller_name`をメソッドにして処理を`helper`に移動します。



###②`application_helper.rb`で、`nav_color`メソッドを定義する。

```ruby:application_helper.rb
module ApplicationHelper
  require "redcarpet"
  require "coderay"

end

def nav_color
    controller_name =='users（色変更したいページのcontroller名）' ?  '#28a745（変更したいページの色）' : '#5C99FF（デフォルトの色）'
  end
```



###`application.html.erb`のbackground-colorに、`nav_color`メソッドを呼び出す。

```ruby:application.html.erb(header)
<nav class="navbar navbar-expand-lg navbar-dark fixed-top" style="background-color: <%= nav_color %>">
  <%= link_to "Gyakuten", root_path, class: "navbar-brand" %>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#nav1" aria-controls="nav1" aria-expanded="false" aria-label="Toggle navigation">
    <span class="navbar-toggler-icon"></span>
  </button>
  <div class="collapse navbar-collapse justify-content-around" id="nav1">
    <ul class="navbar-nav">
```

```ruby:application.html.erb(footer)
<nav class="navbar navbar-expand navbar-dark fixed-bottom justify-content-center" style="background-color: <%= nav_color %>">
	<ul class="navbar-nav">
		<li nav-item><a href="#" class="nav-link active">ブログ</a></li>
		<li nav-item><a href="#" class="nav-link active">youtube</a></li>
	</ul>
</nav>
```

このように、色変更のために定義したメソッドは、ヘルパーに移動しておくと、もし色を変更したい場合に1箇所変えるだけで済みます。


#あとがき
`controller_name`を使って、特定のページの固定部分の色を変える。

検索してもありそうでなかったので、ここで解決方法をまとめておきます。「`controller_name`」の入ったあらゆる検索切り口で、あらゆる日本語の検索先を探しましたが、「共通レイアウトの特定のページの【固定部分の色】を変える」方法は、この記事だけです。笑
AtCoder Beginner Contest 166の復習, E問まで(Python)

競プロ初心者の復習用記事です。

ここで書く解は解説や他の人の提出を見ながら書いたものです。自分が実際に提出したものとは限りません。

#### 今回の敗因

あっ、**日曜もやってたんだ？**

コンテストの存在を知らなかった。日程を見てなかった。
というわけで、コンテスト終了後に問題を解いてます。

# [A - A?C](https://atcoder.jp/contests/abc166/tasks/abc166_a)

atcoder社は毎週土曜日にコンテストを開催しているそうです。次回はABCとARCのどちらが開催されるか答える問題です。

入力が'ABC'なら'ARC'を出力。違ったら'ABC'を出力しましょう。

```python
S = input()
if S == 'ABC':
  print('ARC')
else:
  print('ABC')
```

# [B - Trick or Treat](https://atcoder.jp/contests/abc166/tasks/abc166_b)

K種類のお菓子がそれぞれ番号$\boldsymbol{A_k}$の子供に配られます。お菓子を受け取っていない子供は何人いるか答える問題です。

それぞれの配列の要素を合わせて重複を取り除き、「お菓子が配られた人数」を調べて全体の人数から引けばいいと思います。

```python
N, K = map(int, input().split())
A = []
for _ in range(K):
  d = input()
  A += list(map(int, input().split()))
print(N - len(set(A)))
```

↓は毎回set型に突っ込んでみたパターン。こっちの方が早かった。

```python
N, K = map(int, input().split())
A = set()
for _ in range(K):
  d = input()
  A = A.union(set(map(int, input().split())))
print(N - len(A))
```

# [C - Peaks](https://atcoder.jp/contests/abc166/tasks/abc166_c)

「自身と隣接している全ての展望台より高い」という条件を満たしている展望台が何個あるか答える問題です。

グラフ問題...のように見えますが、そんなに難しいことを考える必要はないでしょう。隣接した展望台が自分以上の高さを持つならFalse。持たないならTrue。最後にTrueの数を調べて出力しました。

「同じ高さ」を持つ展望台は共にFalseなことに注意。

```python
N, M = map(int, input().split())
H = list(map(int, input().split()))

good = [True] * N

for _ in range(M):
  A, B = map(int, input().split())
  A -= 1
  B -= 1
  if H[A] >= H[B]:
    good[B] = False
  if H[A] <= H[B]:
    good[A] = False
print(sum(good))
```

# [D - I hate Factorization](https://atcoder.jp/contests/abc166/tasks/abc166_d)

$$ A^5 - B^5 = X $$
を満たす整数の組(A, B)を一つ出力する問題です。

$X \leq 10^9$という制限を満たすための$A, B$はどのくらい範囲を取ればいいのでしょうか。5乗して$10^9$を超える数は？

```python
n = 1
while n**5 < 10**9:
  n += 1
print(n)
# 64
```
適当にこの倍ほど範囲を取って全探索してみます。

```python
import itertools

X = int(input())

for a, b in itertools.product(range(128), range(-128, 128)):
  if(a ** 5 - b ** 5 == X):
    print(a, b)
    break
```

通っちゃいました。

解説を見たところ、

$$ n^5 - (n-1)^5 \geq 10^9 $$
を満たす$n$,つまり$n=120$までを探索する...と考えるのが正しいようです。結果オーライですがちゃんと考えるようにしましょう。あとはこの計算が通る限り、できるだけ広い範囲を探索しちゃうのも手ですね。
 
# [E - This Message Will Self-Destruct in 5s](https://atcoder.jp/contests/abc166/tasks/abc166_e)

「このメッセージは5秒後に自動的に消滅する」。

$A_i + A_j = j-i$を満たす数を答える問題です。

`itertools.combinations_with_replacement()`で全網羅しました。TLEになりました。

```python
import itertools

N = int(input())
A = list(map(int, input().split()))

count = sum([j-i == A[i-1]+A[j-1] for i, j in itertools.combinations_with_replacement(range(1, N+1), 2)])

print(count)
```

わからなくてギブアップ。解説を見ます。$O(n^2)$から逃れることはできるんでしょうか？

$$ A_i + A_j = j-i $$
$$ ↓ $$
$$A_i + i = j-A_j $$

できました。それぞれの値について独立なステータスを計算すればいいと。

値$A_i$に対して、$L_i = i + A_i$, $R_i = i - A_i$という値を計算します。$R$と$L$にそれぞれどの値が何個入っているのか数えれば$L_i = R_j$となる組み合わせの数を計算できます。

というわけで以下のコードで実装しました。

```python
import collections

N = int(input())
A = list(map(int, input().split()))

L = [i + A[i] for i in range(N)]
R = [i - A[i] for i in range(N)]

countL = collections.Counter(L)
countR = collections.Counter(R)

print(sum([countL[n] * countR[n] for n in countL.keys()]))
```

この記事はここまでとします。
windowsのCPUでYOLOv3(TensorFlow 2.0)で物体検出をやってみた！

## 環境
windows7 64bit
Gefore GTX 680MX GPU
anaconda

## 環境準備
condaでkeras_work作成

```
conda create -n keras_work
activate keras_work
```

tensorflow,keras,pillow,matplotlib,opencv-pythonインストール

```
conda install tensorflow
conda install keras
pip install pillow
conda install -c anaconda matplotlib
pip install opencv-python
```

windows git インストール

```
conda install git
```

windows wget インストール

```
conda install -c menpo wget
```

## 資材準備

Githubからソース取得

```
cd c:\temp
git clone https://github.com/zzh8829/yolov3-tf2.git
cd yolov3-tf2
```

pjreddie.comからyolo3.weightをダウンロード
※2時間かかる

```
wget https://pjreddie.com/media/files/yolov3.weights --no-check-certificate
```

上記pjreddie.comからyolov3.weights取得のは遅いのため、下記ＵＲＬもダウンロードできる
https://pan.baidu.com/s/1G2Qh-V8kyLOq4oDbTwK6HQ
提取码（パスワード）:vogw
ファイルは「yolo_tf2.1\data\yolov3.weights」

yolo3.weightファイルをyolov3-tf2パスに移動
ファイル移動したことを確認

```
(keras_work) C:\temp\yolov3-tf2>dir /B *.weights
yolov3.weights
```

## 変換（事前トレーニング済みのdarknet weightを変換する）

```
python convert.py --weights ./yolov3.weights --output ./checkpoints/yolov3.tf
```

## 確認（detection）
```
python detect.py --image ./data/girl.png
```
![output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632066/9b89de89-df1c-155f-1bee-e39bb8f9df9f.jpeg)
Ubuntu18でqmk_firmwareのセットアップ


## <font color="red"><b>ProMicroに付属のピンヘッダーをはんだ付けしない</b></font>
## <font color="red"><b>コンスルーの向きを確認する</b></font>

## 使用機器
#### Pro Micro
Pro Microは、sparkfun社のArduino Leonardo互換の赤色のボードで、こういうもの。
https://www.sparkfun.com/products/12640

本物は高いので、格安で手に入る下のようなクローンを使用している。
https://ja.aliexpress.com/item/32775200720.html?spm=a2g0o.productlist.0.0.2b3e5552qtr8HQ&algo_pvid=d3d54e93-d970-4bce-b74a-86b235103680&algo_expid=d3d54e93-d970-4bce-b74a-86b235103680-9&btsid=0ab6f83115884739823885590e52ed&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

#### キーボード
7sKBを使っている前提。キーマップの指定部分を変更すれば、他のキーボードでも同じように設定できるはず。

## 環境構築
### 手順
以下を順番に実行。

#### qmk firmareをクローンして、レポジトリルートに移動

```bash
$ git clone https://github.com/qmk/qmk_firmware
$ cd qmk_firmware
```

#### インストールスクリプトを実行
必要なものを一気に入れてくれるスクリプトがあるので実行

```bash
$ ./util/qmk_install.sh
```

#### サブモジュールをビルド
インストールスクリプトで入れてくれないサブモジュールをビルドする。これをやらないと、`tmk_core/protocol/lufa.mk:14: lib/lufa/LUFA/makefile: No such file or directory`のようなエラーが出てくる。

```bash
$ make git-submodule
```

#### モデムマネージャーをアンインストール
これが動いていると、シリアルポートが塞がってしまい、Pro Microに書き込みができない。

```bash
$ sudo apt remove modemmanager
```

## キーボード配列の書き込み
### 手順
以下を順番に実行。

#### キーボード配列の変更
https://docs.qmk.fm/#/keycodes にキーコードの表がある。

```bash
$ vi keyboards/7skb/keymaps/default/keymap.c
```

#### 書き込みたいキーボード配列のmakeターゲットを実行

```bash
$ make 7skb:default:avrdude
```

#### Pro Microをリセット
コントローラーをリセットしろと以下のように出てくるので、Pro Microをリセットする。
##### 注意点
- 充電しかできないケーブルではダメ
- <font color="red"><b>KVMが間に入ると書き込みができない場合がある</b></font>
- １番と２番をショートすることでリセットされる個体もある


```
Detecting USB port, reset your controller now...........
```

USBの口を上にした状態で、右側の上から２番と３番目が、GNDとRESETになる。その２つをショートするとPro Microがリセットされる。

初回は素早く２回ショートする必要あり。ピンセットでショート可能。

#### キーボードデバイスを書き込み可能に
コントローラーをリセットすると、デバイスとしてマウントされて、以下のようなメッセージが出てくる。

```
Device /dev/ttyACM0 has appeared; assuming it is the controller.
Waiting for /dev/ttyACM0 to become writable.
```

そこで、別のターミナルからそのデバイスを書き込み可能にすると、書き込みが実行される。

**デバイスは数秒でアンマウントされてしまうので、上のメッセージが出たらすぐに書き込み権限を与える必要がある。**


```bash
$ sudo chmod 777 /dev/ttyACM0 
```


### スクリプト
キーボード配列を変えるたびに、上の手順を実行するのは大変なので、スクリプト化した。

`update-kbd.sh`
```bash
#!/bin/bash

keyboard=/dev/ttyACM
keymap=7skb:default

make $keymap:avrdude &
pid=$!

while :
do
  ls -1 ${keyboard}* 2>/dev/null
  if [ $? == 0 ]; then
    break
  fi
  sleep 1
done
sudo chmod 777 `ls -1 ${keyboard}*`

wait $pid
```
AIで画像から似ている○○女優を解析するシステムを作ってみた

#はじめに
本記事では独自に作ったサービスとその裏側についてご説明します。
また、類似のサービスが既に存在しています(検索すると出てくると思います。)。
それらとは関係はございませんのでご了承ください。

#作ったもの
タイトルの通り**AIで画像から似ているAV女優を解析するシステム**を作りました。
良かったら試してみてください。
https://likeface.cfbx.jp/
![プレゼンテーション1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632004/751d014a-16ed-2215-c0e4-d91d2c023dd3.jpeg)


#裏側
###利用しているサービス一覧
- Azure
    - Cognitive Services(Face API)
    - Azure Functions(Node.js)
    - ストレージアカウント
- DMMアフィリエイト
- カラフルボックス

###概要
1. AV女優の顔をFaceAPIで学習
2. 画像データから似ている顔を返却するインターフェースを作成
3. フロント(webページの設置)

###1. AV女優の顔をFaceAPIで学習
まずは元となるAV女優の顔を学習する必要があります。
学習させる画像のデータソースとしてDMMが提供している「女優検索API」を利用しました。
参考: https://affiliate.dmm.com/api/v3/actresssearch.html
Azure Functions(キュートリガー)にて以下の手順で再帰的に処理を実行
1. 女優検索APIで受け取ったキューの数値(初回は1)をオフセットにセットして1件女優情報を取得
2. Face APIで取得した女優の画像を学習(この時、任意に定義できるユーザデータに女優のIDを登録する)
3. オフセットにセットした数値に+1してトリガとなるキューにセット(1に戻る)
15時間ほどで数万件の画像データの学習が完了しました。

###2. 画像データから似ている顔を返却するインターフェースを作成
続いて、画像データをもとに学習済みの顔から最も似ているものを返却するインターフェースを作成します。
Azure Functions(httpトリガ)で画像データを受け取り、以下の処理で解析結果を返却します
1. Face APIで学習済みの画像から送信された画像データと最も類似する1件を取得
2. 女優検索API(DMM)でユーザデータのIDをもとに女優情報を取得
3. 商品情報API(DMM)で該当の女優の商品一覧を取得
4. 取得した女優情報・商品情報を返却

###3. フロント(webページの設置)
インターフェースをサービスとして公開するためwebページを作成しました。
実際の画面はこちらをご覧ください
→https://likeface.cfbx.jp/

###さいごに
最後まで読んでいただきありがとうございました。
webページの作成とQiitaの投稿が今回で初めてになります。
拙い内容でたいへん恐縮ですが、質問等ございましたらできるだけお答えしますのでお気軽にコメントいただけたらと思います。
【Rails】Dockerで環境構築する際DB作成時にエラーが出たのでメモ。

##はじめに
Docker ComposeでRailsの環境構築を行う際にDB作成時点でエラーが出た件に関するメモ。

##環境
Docker for Mac
Docker Eingine : 19.03.8
docker-compose : v3

##エラー箇所
１：Rails開発環境用の作業ディレクトリを作成。
２：ディレクトリ内にRails実行環境用のイメージ作成用のDockerfileの作成と内容の記述。
３：Gemfileの作成と内容の記述。
４：中身が空のGemfile.lockファイルを作成。
５：docker-compose.ymlファイルを作成と内容の記述。
６：ymlファイルで定義した内容のビルドコマンド実行。
７：GemfileとGemfile.lockの更新を反映させるために、docker-compose buildコマンド実行。
８：Railsで使用するデータベース設定をdatabase.ymlに追加。
９：ymlに定義したサービスを起動。
__１０：Railsで使用するデータベースを作成。　⬅︎ココ__

##内容
　　
__DB作成コマンド実行__

```
$ docker-compose run web rails db:create
```
<br>

__エラー内容__

```
could not translate host name "db" to address: Name or service not known
Couldn't create 'myapp_development' database. Please check your configuration.
rails aborted!
PG::ConnectionBad: could not translate host name "db" to address: Name or service not known
```
<br>

__解決策__

```
$ docker-compose up
```

　　➡︎一旦、9の手順に戻って、デタッチトモードでなく普通にサービス起動してみた。
<br>

```
Starting ror_db_1 ... done
ror_web_1 is up-to-date
Attaching to ror_db_1, ror_web_1
web_1  | => Booting Puma
web_1  | => Rails 5.2.4.2 application starting in development 
web_1  | => Run `rails server -h` for more startup options
web_1  | Puma starting in single mode...
web_1  | * Version 3.12.4 (ruby 2.4.0-p0), codename: Llamas in Pajamas
web_1  | * Min threads: 5, max threads: 5
web_1  | * Environment: development
web_1  | * Listening on tcp://0.0.0.0:3000
web_1  | Use Ctrl-C to stop
db_1   | Error: Database is uninitialized and superuser password is not specified.
db_1   |        You must specify POSTGRES_PASSWORD to a non-empty value for the
db_1   |        superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
db_1   | 
db_1   |        You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
db_1   |        connections without a password. This is *not* recommended.
db_1   | 
db_1   |        See PostgreSQL documentation about "trust":
db_1   |        https://www.postgresql.org/docs/current/auth-trust.html
ror_db_1 exited with code 1
```

　　➡︎すると、上記のようにパスワードが特定できないやらパスワードを指定しろやら怒られているようだったので、これに関して調べ見てみると[全く同じエラーに直面している記事](https://qiita.com/tomopict/items/23cc4332781bb28d2973)に辿り着いたのでありがたく参考にさせて頂いて、docker-compose.ymlファイルを書き換えました。
<br>

```:docker-compose.yml
services:
  db:
    image: postgres
    environment: //追加部分
      POSTGRES_HOST_AUTH_METHOD: 'trust'  //追加部分
```
　　➡︎次に、再度ymlを起動するコマンドを実行してみる。
<br>

```
$ docker-compose up
Recreating ror_db_1 ... done
Recreating ror_web_1 ... done
Attaching to ror_db_1, ror_web_1
```
　　➡︎これでDBがしっかり起動するのが確認できたので、-dオプションを追加してymlを再起動する。
<br>

```
$ docker-compose up -d
```
　　➡︎これでymlの起動が完了したので、最後にデータベースを作成する。
<br>

```
$ docker-compose run web rails db:create
```
　　➡︎完了です。

##参考
　[PostgresのDockerImageに変更があって起動ができなくなった話](https://qiita.com/tomopict/items/23cc4332781bb28d2973)
Amazon Transcribeでインタビューの文字起こしをしてみる

# 目的
あるインタビュー音源の文字起こしを自動化出来ないかという検討の過程でAmazon Transcribeが候補に上がり、試してみることにしました。

# 参考にしたサイト
https://dev.classmethod.jp/cloud/aws/amazontranscribe-japanese/

# 手順
1. S3を作成し、翻訳させるための生データを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/ebd118f4-67f9-ce70-8eec-4113753873e2.png)

ファイルの拡張子はWAV、MP3、MP4、FLACに対応していますので録音時にフォーマットに会うアプリで録音するか、録音後にffmpegなどの変換ソフトを使って変換します。

2. Amazon Transcribeのコンソール画面で「Create Job」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/f08a50bd-166b-0112-9447-c23ecaa4255d.png)


3. 言語は日本語を選択し、インプットファイルとして先ほど1.で登録したデータを設定し「Next」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/98a7f6b4-0071-5518-0ea6-d8aafedf3837.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/e9ed7cef-4e3c-21ff-a41a-95468fe57c87.png)
必要があればオプションを指定し、「Create」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/5b46cf49-482f-10b1-cba3-0fcc4dc646ca.png)

4. ステータスが「in progress」になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/9b6f634f-02db-b4c4-516f-516b3b8481e8.png)

5. 元ファイルが数MBくらいのサイズの場合は数分で「Complete」となり完成です。実際の翻訳結果をファイルとしてダウンロードし、内容を確認してください。固有名詞の翻訳はどうしても不自然な日本語になっていますが、まずまずの精度で翻訳出来ていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/0285adc8-69b7-ea93-187c-4e4aaf024646.png)

面白かったのは以下の点です。

- 文末にマルがついたり、疑問形で終わる会話に？がついていたこと。
- 英語は全部カタカナ表記となること。
- 数字は漢数字表記となること。

# 結果
非常に簡単な手順でかつ数分で実行できるのでなかなか良かったです。
文字起こししてそのまま記事することは出来ませんが、音源を聞いて手動で文字起こしするよりは楽だと感じました。
Pythonでプライオリティキューで独自のオブジェクトのソートをやってみる

##実行環境
python 3.7.3

##やりたいこと
pythonを使ってプライオリティキューを使う。
独自のオブジェクトをソートしたいなど、ちょっと応用したい。

##プライオリティキューとは
優先度付キューとも言う。
使う場面は、要素数が変化しつつ、ソートしたいとき。
もしくは、ソートの状態を保ちつつ、要素をリストに追加したいとき。

他のいろんな人が参考記事とか書いてるので、詳しくは割愛。
(https://qiita.com/ell/items/fe52a9eb9499b7060ed6)

##独自のオブジェクトをソートしたい。
first_name,last_nameの二つの属性を持つNameクラスのオブジェクトをいろんな条件でソートしてみる。

まず、ベースとして以下のクラスを生成する。

```

class Name(object):
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name
    
    def __lt__(self,other):
        return other.first_name > self.first_name
    
    def __repr__(self):
        return self.first_name + " " + self.last_name
```

今回の肝となるのは__lt__という特殊メソッド。
自分より相手が小さいとはどういう状況かを設定することができる。
(ほかにもいろんな特殊メソッドがあります。各自調べてみてください
https://blog.codecamp.jp/python-class-code)

実際にheapqを用いてソートしてみる。

```
from heapq import heapify,heappush,heappop
name1 = Name("james","smith")
name2 = Name("john","johnson")
name3 = Name("robert","williams")
name4 = Name("michael","brown")
name5 = Name("william","jones")
name6 = Name("david","brown")
name7 = Name("james","miller")
name8 = Name("david","davis")

name_list = [name1,name2,name3,name4,name5,name6,name7,name8]
heapify(name_list)
for i in range(len(name_list)):
    print(heappop(name_list))

```
heapqの使い方は公式ドキュメントに詳しく載っているのでこちらを参照してください。→https://docs.python.org/ja/3/library/heapq.html

実行結果はこちら
david brown
david davis
james miller
james smith
john johnson
michael brown
robert williams
william jones

__lt__メソッドには、ファーストネームだけを基準にして、大小判定するように設定しているので、ちゃんと、ファーストネームが小さい順に並んでいることがわかります。

## 応用してみる
次に、練習として、ファーストネームでまずソートして、その次にラストネームで逆向きにソートしてみましょう。期待される出力は以下の通りです。

david davis
david brown
james smith
james miller
john johnson
michael brown
robert williams
william jones

ファーストネームは小さい順に並んでいますが、ラストネームは大きい順に並んでいます。これの実装例は下のコードをご覧ください。

```
class Name(object):
    def __init__(self,first_Name,last_Name):
        self.first_Name = first_Name
        self.last_Name = last_Name
    
    def __lt__(self,other):
        if other.first_Name == self.first_Name:
            return other.last_Name < self.last_Name
        else:
            return other.first_Name > self.first_Name
    
    def __repr__(self):
        return self.first_Name +" "+ self.last_Name


from heapq import heapify,heappush,heappop
name1 = Name("james","smith")
name2 = Name("john","johnson")
name3 = Name("robert","williams")
name4 = Name("michael","brown")
name5 = Name("william","jones")
name6 = Name("david","brown")
name7 = Name("james","miller")
name8 = Name("david","davis")

name_list = [name1,name2,name3,name4,name5,name6,name7,name8]
heapify(name_list)
for i in range(len(name_list)):
    print(heappop(name_list))
```

最後までご覧いただきありがとうございました
よかったらLGTM(Looks Good To Me)くださ～い
間違いあったら、ご指摘くださ～い
~/.ssh/config を分けよう

# はじめに

SSH通信していると、鍵の管理がわからなくなってきますよね。特にまだ使う鍵なのか、どれを使っているのかとかですね。なのでフォルダで管理できるようにしていきましょう。

### 参考リンク

・[Mac で .ssh/config ファイルを include で分割して管理](https://h2ham.net/ssh-include/)
・[`Include`キーワードで`ssh_config`を分割できるようになった件](https://qiita.com/masa0x80/items/ecb692ad93f7d06a07b0)
・[[Sierra] macos Sierra に更新してから、毎回パスフレーズを聞かれてくることに対する対策 [ssh]](https://qiita.com/sho7650/items/6ba6a47dc68fb4d1a5b4)
・[ターミナルからssh接続を試みるとエラーが発生](https://teratail.com/questions/186572)

# 結果

フォルダは以下のようになりました。

```
.ssh
├── conf.d
│   ├── env1
│   │   ├── config
│   │   ├── id_rsa
│   │   └── id_rsa.pub
│   └── env2
│       ├── config
│       ├── id_rsa
│       └── id_rsa.pub
├── config
└── known_hosts
```

各ファイルに記述しているものを載せていきます。

```~/.ssh/config
Include ~/.ssh/conf.d/**/config

Host *
  ServerAliveInterval 300
  AddKeysToAgent yes
  UseKeychain yes
```

また面倒ですが、各configの権限も設定してあげないとエラーが出るので注意してください。

```
$ chmod 700 config
```

各フォルダのconfig例

```~/.ssh/conf.d/env1/config
Host env1
  User centos # 入る先のユーザー名
  Port 22
  HostName ホストのIP
  identityFile /Users/username/.ssh/conf.d/env1/id_rsa 
  TCPKeepAlive yes
  Identitiesonly yes
```
GitBash初期設定（Windowsクライアント）

#この記事について
この記事はGitHubを利用するにあたって、windowsクライアントで利用可能なgitbashの初期設定を示すものです。

#GitBashをダウンロードする
- git(windows用)を下記からローカルPCにダウンロードする。
- https://gitforwindows.org/
- gitbashをインストールし、起動する。（すべて次へ：デフォルト設定でOK）

#GitBashの初期設定
下記コマンドを実行

```bash:bash
git config --global user.name "Firstname Lastname"
git config --global user.email "name@example.com"
```

このコマンドは「~/.gitconfig」に下記のような形で設定ファイルを出力する。

```bash:bash
[user]
name = Firstname LastName
email = name@example.com
```
ここで設定した名前とメールアドレスはgithubでリポジトリを公開する場合も、この名前とメールアドレスがコミットログして公開されるので、公開しても問題ないものを利用すること。
#コマンドの出力を読みやすくする
```bash:bash
git config --global color.ui auto
```
「~/.gitconfig」に下記の行が追加されている。

```bash:bash
[color]
 ui = color
```
こうするとコマンドからの出力が読みやすくなる。

#SSH Keyの設定
```
ssh-keygen -t rsa -C "name@example.com"
```
公開鍵（id_raa.pub）をgithubに登録する。
https://github.com/

##疎通確認
```
ssh -T git@github.com
```

#クライアントPCにプロジェクトをcloneする
githubからURLを取得する
![2020-05-05_18-50-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632065/836bd209-1e4b-5589-4cb3-e18908641129.png)

gitbashを起動して、ターミナルから下記のコマンド打つ。

```
git clone git@github.com:darcy-it/test.git
```
List を任意の数に分割する（Listを任意の要素数ごとに分割する）


#結論

org.apache.commons.collections4.ListUtils#partition() を利用する。

##Javadoc
https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/ListUtils.html#partition-java.util.List-int-

##Maven
https://mvnrepository.com/artifact/org.apache.commons/commons-collections4/4.4

```xml
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>
```

##利用例(1)
一つあたりの最大の要素の数を指定する

```java
List<String> list0 = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg");
List<List<String>> lists = ListUtils.partition(list0, 3);
for (List<String> list : lists) {
	System.err.println(list);
}
```

```
[aaa, bbb, ccc]
[ddd, eee, fff]
[ggg]
```

##利用例(2)
いくつに分割したいかを指定する

```java

List<String> list0 = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg");
List<List<String>> lists = ListUtils.partition(list0, list0.size() / 2 + 1);
for (List<String> ll : lists) {
	System.err.println(ll);
}
```

```
[aaa, bbb, ccc, ddd]
[eee, fff, ggg]
```

# 経緯

同様のメソッドを自作して完成したのですが「これはCommonsにあるのでは！？」と気づいて発見に至りましたorz。





以上。