OmniAICreator/Qiita-1.07M huggingface dataset:
Javaで初期値を設定したListの作り方

## 概要
JavaでListを作成する際に、1行で書く方法のまとめ。
いつも忘れちゃうので。

## 基本的な初期化
キホンのキです。new してaddする。

``` java
import java.util.ArrayList;
import java.util.List;

public class Sample {

    public static void main(String args[]) {

        List<String> list0 = new ArrayList<String>();
        list0.add("a");
        list0.add("b");
        for(String x : list0) System.out.println(x);
}
```

## 初期値込みで1行で書く方法

以下3つ例示します。
(1) `List.of`
(2) `Arrays.asList`
(3) arrayListと`Arrays.asList` の併用

``` java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Sample {

    public static void main(String args[]) {

        List<String> list1 = List.of("a", "b", "c");
        for(String x : list1) System.out.println(x);

        List<String> list2 = Arrays.asList("a", "b", "c");
        for(String x : list2) System.out.println(x);

        List<String> list3 = new ArrayList<String>(Arrays.asList("a", "b", "c"));
        for(String x : list3) System.out.println(x);
    }
}
```

要素が一つだけなら、こんな書き方も。

``` java
import java.util.Collections;
import java.util.List;

public class Sample {

    public static void main(String args[]) {

        List<String> list4 = Collections.singletonList("a");
        for(String x : list4) System.out.println(x);

    }
}
```
Apresia NPシリーズ　端末(MAC)認証について

**はじめに**
---
前回に続きまして、Apresia製品のNPシリーズの認証機能について書いていきます.
自分のメモ代わりに記事にしましたので、参考にしていただけたら幸いです。

***目次***
---
・端末認証とは
・MAC認証の手順

***端末認証とは***
---
端末認証は、未認証状態の端末が内部ネットワークに接続する際に、端末のMACアドレスなどを利用して、正規の端末だけに内部ネットワークへのアクセスを許可する仕組みです。
装置は、未認証状態の端末からアクセスされると、MACアドレスなどを利用して、端末に内部ネットワークへのアクセスを許可してよいかどうかを決定します。


***MAC認証機能有効化の手順***
---
MAC認証は、端末認証を利用する認証方法です。未認証状態の端末のMACアドレスを利用して、正規の端末だけに内部ネットワークへのアクセスを許可します。

ApresiaNPシリーズではMAC認証機能を装置全体で有効にした後、インターフェースごとに有効にしていく必要があります。

はじめに装置の認証機能を有効にします。

<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# aaa new-model
</code></pre></div></div>

RADIUSサーバを指定し、共有鍵(今回は仮で【apresia】)も設定します。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# radius-server host 192.168.1.100 key apresia
</code></pre></div></div>

次にRADIUSサーバの所属するグループを指定します。

<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# aaa group server radius radius-group
ApresiaNP(config)#  server 192.168.1.100
</code></pre></div></div>

MAC認証で使用する認証方式リストを、RADIUSサーバーグループ「radius-group」に指定します。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# aaa authentication mac-auth default radius-group
</code></pre></div></div>


AccessDefender設定モードに遷移し、認証クライアントの数を設定します。最大は256となってます。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# access-defender
Apresia(config-a-def)# total-client 256
</code></pre></div></div>

そのまま、AccessDefender設定モードにてMAC認証を設定したいポートのMAC認証機能を有効にし、MAC認証用のパスワードを設定します。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config-a-def)# authentication interface port 1/0/1-5 mac
ApresiaNP(config-a-def)# mac-authentication password apresia-mac mac
</code></pre></div></div>

最後に装置でのMAC認証の有効化をします。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# mac-authentication enable
</code></pre></div></div>

以上が、MAC認証時の認証機能関連の設定手順になります。

MAC認証のユーザー名には端末のMACアドレスが使用され、
デフォルト設定では「小文字、区切り文字を使用しない形式（例：aabbccddeeff）」がユーザー名になっています。
RADIUSサーバ側の設定により、変更する必要がある場合は【mac-authentication username mac-format】コマンドを使用してください。


***参考URL***
---
https://www.apresia.jp/products/ent/np/usersguide/accessdefender/top.html

***最後に***
---
今回はApresiaNPシリーズ製品のMAC認証について記事にしました。
次回は、WEB認証について記事にしたいと思います。
DockerのJupyterNotebookでjupyter_notebook_config.pyを読み込まない

# はじめに

この記事は2021年10月にまとめていた「細かいつまずいたことをメモしておく(10月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

jupyter_notebook_config.pyをJupyterが読み込んでくれず設定が反映されなかった

# 解決方法

設定ファイルをコピーするディレクトリが間違っていた

```
COPY ./config/jupyter_notebook_config.py /root/.jupyter/jupyter_notebook_config.py
↓
COPY ./settings/jupyter_notebook_config.py .jupyter/
```
Railsでredirect先を変数の値によって変更したい

# はじめに

この記事は2021年10月にまとめていた「細かいつまずいたことをメモしておく(10月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 実現したいこと

A(a_path)、B(b_path)、C(c_path)という画面があり、そこには会員一覧があるとします。
どのページかを開いて、会員を１人削除すると、destroyのアクションが実行されて、会員が削除されたあとに、削除したときに開いていたページにリダイレクトしたかったとします

# 行ったこと

destoryにパラメータでどのページかの情報を与え、params[:page](Aならparams[:page]=a_path)で取得できるようにして、

```
redirect_to params[:page]
```

のようにしましたが、うまくいきませんでした

# 解決方法

このように変数を利用したい場合は、`redirect_to action: "アクション名"Pをすることでできます

```
redirect_to action: params[:page], ....
```

`action:`に指定することでパラメータの文字列がそもまま利用できた
PytorchでGTX1080Ti(GPU)を使えるようにしたかった

# はじめに

この記事は2021年10月にまとめていた「細かいつまずいたことをメモしておく(10月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

自分で持っているGPUがGTX 1650と1080Tiで、書籍を読んでいるとRTXの2000系と3000系の設定の仕方はあるが、GTXは載っていなかった

どうすればGPUを使えるのかわからなかった

# 解決方法

調べたところGTXの1000番台はそもそも対応していないっぽい
ただし、GTX 1650なんかは2000番台だったので使えた
Railsでモデルで名前付きルーティングを使う

# はじめに

この記事は2021年10月にまとめていた「細かいつまずいたことをメモしておく(10月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# やりたいこと

Railsでは`_path`というのをつかうことでURLを利用できるメソッドがあるがこれは`view`や`controller`でしか利用できない
モデルで利用する方法がないか調べた

# 解決方法

Rails.application.routes.url_helpersを利用すると実現できることがわかった

https://qiita.com/jerrywdlee/items/f91c9ea01055cb74083c
Visual StudioとGithubを連携させる

# Visual StudioのプロジェクトをGithubのリポジトリにする
ここを読めば基本的にできる。
https://docs.microsoft.com/ja-jp/visualstudio/version-control/git-create-repository?view=vs-2022

ローカルリポジトリとプッシュ
https://www.ipentec.com/document/visual-studio-2019-github-commit-and-push-using-team-explorer

クローンや他の操作は基本的に以下のリンクからそれぞれ飛べる。
https://docs.microsoft.com/ja-jp/visualstudio/version-control/git-create-repository?view=vs-2022

適当な名前のプロジェクトをリポジトリにしたいとき、名前を変えたくなると思う。（私はよくやる）
以下を参考にプロジェクトのフォルダ名を変更することができる。
https://lipoyang.hatenablog.com/entry/20151112/p1
Pytorch(torchtext)でAttributeError: module 'torchtext.data' has no attribute 'Field'

# はじめに

この記事は2021年10月にまとめていた「細かいつまずいたことをメモしておく(10月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

torchtextを利用したところ

```
AttributeError: module 'torchtext.data' has no attribute 'Field'
```

というエラーが発生した

# 解決方法

このエラーはPytorchのバージョンに起因しているらしい

https://github.com/YutaroOgawa/pytorch_advanced/issues/148

```
from torchtext import data
↓
from torchtext.legacy import data
```

に変更するのだが今のバージョンではエラーが発生する
バージョンを下げてインストールするとうまくいく

```
$ pip install torchtext==0.8.1
```
GoogleColabratoryでMeCab+Neologdを使いたい

# はじめに

この記事は2021年10月にまとめていた「細かいつまずいたことをメモしておく(10月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 手順

```
!apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl python-mecab > /dev/null
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git > /dev/null 
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n > /dev/null 2>&1
!pip install mecab-python3 > /dev/null
!ln -s /etc/mecabrc /usr/local/etc/mecabrc
```

ライブラリをインストールしたら以下で利用できることが確かめられる

```
import MeCab

m_t = MeCab.Tagger('-Ochasen -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')

text = '機械学習が好きです。'

print(m_t.parse(text))
```

また、`Mecab.Tagger`に渡している辞書のパスは以下のコマンドでみつけます

```
!echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
```

# 参考

https://qiita.com/jun40vn/items/78e33e29dce3d50c2df1
【MySQL】記事の並び順をランダムにしたいけど、１度表示した記事は後のページに表示させたくない


## MySQLで並び順をランダムにする方法
以前、何かの案件で記事の並び順をランダムにしたい、という要望がありました。並び順をランダムにするのは、下記のようなクエリーで実現できます。

```SQL:SQL
SELECT * FROM posts ORDER BY RAND();
```

ページネーションをする場合は、LIMIT句を付けて部分的に取得すれば良いわけです。

しかし、これだと１ページめに取得した記事を、２ページめ以降にも取得してしまう可能性があります。毎回ランダムな並び順になるので、当然といえば当然ですね・・・。

## 改善策

RAND()には引数を与えることができ、同じ引数を与えれば同じ乱数が発生します。つまり、例えば

```SQL:SQL
SELECT * FROM posts ORDER BY RAND(1);
```

とすれば、並び自体はランダムですが、常に並び順自体は変わらずに取得できます。

したがって、実装としては１ページめを取得する際、適当な乱数nを生成し、クエリー中のRAND()のパラメータにｎを指定する、となります（ｎはセッションやクッキーに保存しても良いでしょう）。２ページめ以降を取得する時も同じｎを指定してください。

ただ、インデックスが効かないので、大きなテーブルでのRAND() の使用は注意が必要です。
Railsで複雑なeager_loadを行いたいときの図解メモ

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# テーブルの結合パターン

以下の関係のテーブルを結合する

## パターン1

```
A ⇔ B ⇔ C
```

```
B.eager_load(:A, :C)
```

## パターン2

```
A ⇔ B ⇔ C
     ↕
　　 D
```

```
A.eager_load([{ B: [:C, :D] }
```

## パターン3

```
A ⇔ B ⇔ D
↕    ↕
C　　E
```

```
A.eager_load([{B: [:D, :E]}, :C])
```
Railsのhashを要素に持つリストに別のhashがmergeできない

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

リストの中に入れ子でハッシュがあり、そこに別のハッシュをマージしようとしたがなぜかできなかった
リストの中のハッシュの内容を別の変数に定義をして、その変数に対してマージするとうまくいく

# 解決方法

`merge!`を使うとうまくいった
form_tagの中に埋め込んでいるリンクがform_tagのsubmitに飛んでしまう

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

form_tagの中で、link_toでリンクを書いてその中に%buttonを書いてボタンを作成したが、そのリンクに飛ばず、form_tagで設定したリンクに飛んでしまう
javascriptでリンクを置き換えてもjavascriptの処理が終わるとやはり飛んでいってほしくないリンクへ行ってしまった

# 解決方法

これは`%button`が悪さをしており、`%buttonはtype:buttonを指定しないとtype:submitとして扱われてしまう`

```
%button
↓
.button
```

に変更することで解決した
Rspecで突然動いていたテストが動かなくなった

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

突如コードを変更していないのにエラーが出るようになった

```
$ rails db:reset RAILS_ENV=test
```

これを行ってもエラーが消えない。エラーはモデルのバリデーションに関するものが出ているが、モデルに一切変更を加えていないはずなのになぜ、、

# 解決方法

原因はテストDBに流したseedだった

seedの中で作成したレコードとテストで作成したデータのカラムが重複してUniqueのバリデーションエラーになっていた。
migrateのときにseedも自動で流すことを再認識した
親要素と子要素を同時にbuildして親をsaveしたタイミングで子要素も作成する

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

```
@parent = Parent.build(parent_params)
@parent.build(child_params)
```

これでうまくいくかと思ったがうまくいかない
`@parent`は`belongs_to child`、`@child`は`has_one parent`となっている

# 解決方法

has_oneの関係のときは`build_parent`で行う

```
@parent.buid_child(child_paras)
```

https://qiita.com/tsuchinoko_run/items/c56739c48deb91ac1e3f
【個人開発】効率的な背景＜エンジニア夏休み企画＞ 【読書感想文】

エンジニア夏休み企画  個人開発
https://qiita.com/official-events/6d31965c499a69377c0b

個人開発に焦点を当てたのは良い企画だと思った。

 <この項は書きかけです。順次追記します。>

# 個人開発　
https://qiita.com/tags/個人開発

１００記事拝見した。　

## 個人開発の分類
||自分が使用|自分は不使用|
|:--|:--|:--|
|無償|1|3|
|有償|2|4|

### 自分が使用し、無償配布。　
オープンソース活動のかなりの部分を占めているかもしれない。　

### 自分が使用し、有償配布。
当初は、自分のために作っていたが、有償で使いたいという取引先が現れた場合と、　
もともとは、依頼で作り始めたが、よく考えたら自分も使いたくなった場合とがある。　


### 自分が不使用、無償配布。　

自分の力試し、仲のいい知り合いに頼まれたなどで、有償配布を前提にせずに作り始めた場合。　

無償配布で、自分が使いたいものではなく、自分では使っていない場合。　

### 自分が不使用、有償配布。　

依頼があって作り始めたが、自分では使いたいとは思わないもの。　
お金のために作っている。　


# なぜ、個人開発が効率的か　
## 検証と妥当性確認
検証する必要がなく、妥当性確認だけでよい。　

大勢で設計するときは、誰が、どこまで、何をやるかを決めて分業する場合に、　
境界を決めて、境界の決め通りにできているかを確かめる検証という作業が必要になる。　

個人設計では、分業せず、妥当性だけ確認すればよく、決めたとおりに作ったかどうかはどうでもいい。分業のための文書はすべて要らない。ほぼ９割が不要な気がする。　
## 品質保証と品質管理　

自分が使うものであったり、無償で配布するものは、品質保証は必要ない。　
自分が使うものであれば、自分が使いたい水準に達するかどうかを管理すればよい。　
品質保証が必要なく、品質管理すればよい。　

品質保証のための無駄な文書が要らない。品質関連のほぼ半分が不要かもしれない。

# 事例　箱庭プロジェクト

この項目は、箱庭プロジェクトを市場分析の対象として、原則的には、箱庭プロジェクトの外部から分析し、外部から箱庭の広告宣伝のための戦略会議を仮想した結果、仮想「箱庭もくもく会」を開催してみることを企画するものである。　
一切の内容は、箱庭プロジェクト、Athrill, TOPPERSとは無関係である。　
一(いち)参加データアナリストの、個人的なつぶやきです。
　

箱庭もくもく会 #10 日時：2022/09/14(水) 17:30-19:30

https://hakoniwa.connpass.com/event/258129/



## Athrill
上記４分類のどれに該当するかは、当初から参加していたわけではなく、存じ上げない。　

現状では、個人開発で無償配布している。
配布を非営利法人を経由しているのは、個人の無駄な作業が発生しないようにするのによい。　

いろいろな個人開発の行き詰まりのいくつかを示す。　
取り巻きができて裸の王様になる。
自分で何もしない人が意見をいろいろ行ってくるのに対応するのにうんざりする。
自分で何かをしようとする人が、元の作者と方向性が違う。

最後の場合は、直接ではなく関節で協調するのが効率的である。

## 箱庭　

Athrillから箱庭に重点を移行していくときに、遠くからしか眺めておらず、上記４分類のどれに該当するかは、断言できない。　

作業委員会として活動されており、個人開発の連合体と捉えるといいかもしれない。　
それぞれに、役にたつ箱を作ったり、作った箱をつなげるひとがいたり。　
それぞれを、連携しているという点ではなく、個人開発と捉えると見通しがいい気がする。　

# 事例　オープンソース　

オープンソース事業では、オープンソースでなかったコードを、営利での開発から身を引くにあたって公開する場合は、元は組織開発であった可能性がある。　

ソースコードを公開する前も、組織内で個人開発していたコードは、オープンソースにしても、保守しやすい場合がある。　

コードの一貫系が感じられないと、保守でつまずくかもしれない。　

## 設計としてのソースコード
オープンソースでは設計はソースコードに反映するのがよい。　
別に設計書を作るのは、無駄の極みかもしれない。　

状態遷移図・表、時系列図などの図表はあった方がいい。　
これらの図表も、仕様記述言語のソースコードとして記録することが可能な場合がある。　

## 読書感想文


https://qiita.com/tags/読書感想文

CコンパイラによるC言語規格の読書感想文を掲載しています。

29.10 12/24 hours functions [time.12] C++N4910:2022 (677) p1423.cpp

https://qiita.com/kaizen_nagoya/items/d0bca5eadcd135f5198b


# 背景

学会、研究会、勉強会などに参加するときに、
過去の発表を１００個読むことを習慣にしている。
自分が意見を言えそうなこと、自分の過去の活動が役立ちそうなこと、　
これから自分が取り組もうとしていることと同じようなことをしている人がいるかなどを確認しながら。
１００個記事がない場合には、過去の書き込み１００件を読んで、　
自分が知っていること、知らないこと、よいなと思うこと、改めるといいかもしれないこと（自分、相手、社会の３つの立場で）を探してみる。　


勉強会(IT系)をすべて当たりにする方法。仮説（124）

https://qiita.com/kaizen_nagoya/items/9f001a79ab4162220406



 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20220820
【プログラミング】アイビーリーメソッドとポモドーロ・テクニックを組み合わせることで生産性が爆増する。【資格試験など】

# アイビーリーメソッドのやり方。
１、翌日にやるべきことを６つ書き出す（寝る前）
２、優先順位をつける。
３、優先順位１番から順にタスクをこなす（シングルタスクで行う）。

# ポモドーロ・テクニックのやり方。
１、その日に達成したいタスクを書く。
２、分割した１つのタスクを２５分集中して行う（<b>タイマーをセットする</b>）
３、５分休憩する。
４、１に戻る。（<b>４ポモドーロごとに長めの休憩＜２０分など＞をとる</b>）

# 感想
ポモドーロのみをやるよりも、<b>２つを組み合わせる</b>ことで生産性がかなり上がりました。
勉強などに、取り入れることをお勧めします。

# 参考文献
作業効率が上がるポモドーロ・テクニックとは？その効果や実践方法を紹介！
https://mynavi-job20s.jp/howto/pomodoro_technique.html
ポモドーロ・テクニックとは？うまく活用して集中力と生産性をアップ！
https://hataractive.jp/useful/2377/
100年受け継がれている超効率化メソッド「アイビー・リー・メソッド」を試してみた。
https://studyhacker.net/ivy-lee-method
本番/開発/テスト環境の違いがわからなかったのでとてもざっくり整理した。

はじめに
--
RSpecが403エラー（存在はしてるけど、アクセスできないよ！）を返して、テストが実行できない事態に襲われたことがありました。

原因はDockerfileで"RAILS_ENV"に開発環境を設定していたことにより、RSpecが開発環境で実行されるように記述されていたことでした。
~~~./Dockerfile
RAILS_ENV: development
~~~

~~~.spec/rails_helper.rb
ENV['RAILS_ENV'] ||= 'test'

#修正後
ENV['RAILS_ENV'] = 'test'
~~~

エラーを解消することができてよかったのですが、よく目にする３つ環境（本番/開発/テスト環境)の違いがいまいちわかっておらず、解決後もピンときてなかったので、調べてみました。

備忘録として残そうと思います。


開発環境 (config/environments/development.rb)
--
appディレクトリ以降のファイルに変更があった時に、自動で読み込んでくれる。
例えば、controllerの記述を変更したり、viewの記述を変更するとすぐ読み込んで反映してくれたりする。

実装後すぐに確認ができて、開発をスムーズに進められるように設定がされた環境。

本番環境 (config/environments/production.rb)
--
開発環境と違い、ファイルを変更すれば自動反映などを行わない。
その代わり開発環境に比べて軽量に動いてくれる。

デプロイの際に変更が反映される。

テスト環境　(config/environments/test.rb)
--
テストを実施するために設定がされている環境。
開発環境とテスト環境を分けることで、テストのたびに開発環境の設定をテストが実施できるように変更を加える必要がなくなる。

終わりに
--
すごくざっくりしたまとめ方ですが、概要はなんとなく理解できました。
どんな設定がされてるかconfig/environments/~のファイルを今度覗いてみようかなと思います。
また、書いている内容が間違っていたら優しくご指摘くださると嬉しいです。

調べる前は、全部開発環境でやっちゃえばいいじゃん！と思っていたのですが、当たり前ですがちゃんと理由があって環境は分けられているんですね。
OpenCVによる写真から、アニメ/漫画のような画像に転換する技術

下記は放送大学の写真です。
![pano_right.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926786/70f51d7b-3020-fe47-cb9a-6800578dfd78.jpeg)

上の写真をOpenCVの技術のみによって、アニメ/漫画のような画像に転換してみました。放送大学の課題をやっている時に発見した技術です。
コードは非公開です。

アニメ/漫画のような画像（青い空）
![manga_like_pic_blue_sky.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926786/4a55181a-1077-2858-43a0-48d15878c677.png)


アニメ/漫画のような画像（照りつける太陽）
![manga_like_pic_sunshine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926786/fb7f04b1-1ce2-9227-d26f-19d73fef2158.png)
業務のモデル化

現状の業務プロセスを抽象化して視覚的に表すこと。
システムの実現すべき機能の洗い出しを行う。
それには現状の分析が欠かせません。
代表的なものあDFDとE-R図の２つを紹介していく。

# DFD(Data Flow Diagram)
データの流れを図として表したもの。
p４６９の図を見る。

### プロセス（処理）
データを```加工したり変換したり```する処理を表す。

### データの源泉と吸収
データの```発生元や最終的な行き先```を表す。

### データフロー
```データの流れ```を表します。

### データストア
ファイルやデータベースなど、```データを保存する場所```を表す。

#### データストアとは？
* 情報システムの構成で、データを決められた形式で記憶装置に```永続的に保存・蓄積する機能や主体を抽象的・総称的```に表す用語。
出典 https://e-words.jp/w/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%88%E3%82%A2.html#:~:text=%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%88%E3%82%A2%E3%81%A8%E3%81%AF%E3%80%81%E6%83%85%E5%A0%B1,%E3%81%AE%E4%B8%80%E5%BD%A2%E6%85%8B%E3%81%A8%E3%81%BF%E3%81%AA%E3%81%9B%E3%82%8B%E3%80%82
* データを溜めておく場所
    出典 https://wa3.i-3-i.info/word16851.html

処理を行うときはデータストアを使って確認をしたり、注文を受けたりする。

### 気づき
DFDを見ていると正規化で分解された表を想像する。

https://qiita.com/masatom86650860/items/49a13c30ab8afbfac66a

# E-R図
データの構造を図で表したもの。
実態（Entity：　エンティティ）と実態間の関連（Relationship：　リレーションシップ）という概念を使っている。
実態は四角形、関連は矢印
これで１対多、１対１、多対多の関係を表せる。

会社と社員の関係をE-R図で表すと社員の方が多いので矢印が刺される。

## E-R図の表記ルール
```現実の世界を実態（エンティティ）と実態との関連（リレーションシップ）、さらに実態や関連が持つ属性（アトリビュート）```という概念を用いて表した図解表現

### エンティティ
```人、場所、商品のような具体的な物```や、```技能、納品のような抽象的概念```を表す。

### 関連
```２つのエンティティ間にある関係```を表す。

### 属性
```実体や関連が持つ特徴や性質```などを表す。
　
## 関連を省略した表現
### 1:1
実体１と実体２が１対１で対応する。

### 1:多
実体２と実体２が１対多で対応する。

### 多:多
実体１と実体２が多対多で対応する。

# 問題を解いた時の気づき
複数に所属できる従業員を指しているのか。

## 多重度
### ＊
０以上

### １
１

### 1..*
１以上

### 0,1
０または１

### 0..2
0~2

### 0..1
０か１か

### 1..1
1のみ

### 0..*
０を含む多

### 1..*
０を含まない多

## UMLとは？
UMLとはUnified Modeling Languageの略語です。日本語では「統一モデリング言語」と呼ばれています。

```システムの振る舞いや構造をオブジェクト指向で分析したり設計したりする```際、図を用いることで視覚的に把握できるようになり、効果的に表現できます。

UMLは2021年現在、バージョン2.0が公開されており、```有名な「クラス図」「シーケンス図」等```を含む14種類の図（ダイアグラム）が定義されています。
### UMLを使用するメリット
システムを記述するための図法はUML以外にも存在しますが、もっとも広い範囲をカバーしていて、```もっとも普及しているのがUML```です。

システムの構造や振る舞いがUMLで記述してあれば、数年先になって担当者が変わり、```誰も仕様がわからないといった事態は防げる```でしょう。

出典 https://cacoo.com/ja/blog/what-is-uml/#:~:text=UML%E3%81%A8%E3%81%AFUnified%20Modeling,%E7%9A%84%E3%81%AB%E8%A1%A8%E7%8F%BE%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

# 出典　
https://gihyo.jp/book/2020/978-4-297-11781-8

https://gihyo.jp/book/2022/978-4-297-12375-8
Google speech-to-textとCalendar APIにより音声でカレンダーに予定を登録するアプリ

初めて投稿します。よろしくお願いします。

# はじめに
スマホから音声入力によりカレンダーに予定を自動登録するアプリを作っており、第一段階としての動作確認ができたため投稿してみます。

# 作ろうと思った理由
googleのカレンダーにちょっとした予定を登録する際に手入力だと手間がかかるため、音声で自動的に登録できれば便利と考えました。
# 作ってみた
Googleのspeech-to-textにより音声をテキストに変換後、pythonのja-timexモジュールで日付データを抽出してGoogleのCalendarAPIによりカレンダーに登録します。
テキストデータから日付データを抽出する手段としてpythonの[ja-timex](https://github.com/yagays/ja-timex)というモジュールをそのまま使わせていただきました（日付データを抽出する他の手段を見つけることができなかったため、pythonによりAndroidアプリを開発することとしました）。

pythonによるAndroidアプリの開発手法として[chaquopy](https://chaquo.com/chaquopy/)と[kivy](https://kivy.org/#home)/[buildozer](https://self-development.info/python%E3%81%A7%E3%82%B9%E3%83%9E%E3%83%9B%E3%82%A2%E3%83%97%E3%83%AA%EF%BC%88apk%EF%BC%89%E3%82%92%E9%96%8B%E7%99%BA%E3%81%99%E3%82%8B%E3%80%90buildozer%E3%80%91/) による方法を見つけましたが、chaquopyでは一部のモジュールをインストールできず断念し、kivy/buildozerによる方法としました。

# 動作確認メモ
1.アプリ起動
2.スマホに予定を話す　例：8月20日　甲子園準決勝
3.2022年8月20日の終日の予定として「甲子園準決勝」と登録された

## kivyでSpeech-to-text
[こちらのサイト](https://github.com/Abhishek-op/SR)が大変参考になりました。また、日本語対応には[こちらのサイト](https://blog.amedama.jp/entry/japanize-kivy)を参考にさせていただきました。

## Calendar APIについて
[公式サイトのサンプルコード](https://developers.google.com/calendar/api/quickstart/python)を参考にさせていただきました。


## Buildozerの設定
ほぼ先人の皆様のサンプルを参考にさせていただいていますが、Buildozerの設定には非常に手間がかかりました。整理して改めて投稿します。
VS Code×Pico-GoでRaspberry Pi Picoにプログラムを焼いていたけど、Pico-GoがメンテされなくなったのでPico-W-Goを使うことにした話

# 結論

- Pico-Goはメンテされなくなった
- VisualStudio Marketplaceも非公開になった
- Pico-GoからfolkされたPico-W-Goが良さそう

# 前提条件
- Visual Studio Code（以下、VS Code）がインストールされている
- Python 3.9、あるいはそれ以降のバージョンがインストールされている

# 筆者環境
|製品名|バージョン|
|--|--|
|Windows 10|21H2 19044.1889|
|VS Code|1.70.2|
|Python|3.10.6|
|Pico-W-Go|1.5.5|

# 環境構築
1. 次のリポジトリを参照し、Releaseから最新の `pico-w-go-[version].vsix` をダウンロードする
    - https://github.com/paulober/Pico-W-Go/releases
1. VS Codeの `拡張機能` から `VSIXからインストール` を選択し、ダウンロードした `pico-w-go-[version].vsix` をインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160980/f72fea48-1fb8-2682-7568-7ade2cb6ea2e.png)
1. おしまい

# 機能

folk元のPico-Goと概ね同じ模様。もう少し触ってみて、違いがあったら追記する。
Raspberry Pi Pico W向けっぽいけど、無印Picoも行けそう。


Pico-Goと同じ機能を持っていることを確認した。
なお、Raspberry Pi Picoのファームウェアを最新のものにしないと、正しくコマンドを実行できなかったので注意が必要。
PicoでもPico Wでも問題なく使用できた。
【Rails】bundler: failed to load command: puma 解消法

## 状況
`bundle exec puma -C config/puma.rb`を実行したところ以下のとおりエラーとなりました。

```:ターミナル
$ bundle exec puma -C config/puma.rb
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
bundler: failed to load command: puma (/PRJ_ROOT/vendor/bundle/ruby/2.5.0/bin/puma)
Errno::ENOENT: No such file or directory @ rb_sysopen - tmp/pids/server.pid
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `initialize'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `open'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:133:in `write_pid'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:106:in `write_state'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/single.rb:103:in `run'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/launcher.rb:186:in `run'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/lib/puma/cli.rb:80:in `run'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/gems/puma-3.12.1/bin/puma:10:in `<top (required)>'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/bin/puma:23:in `load'
  /PRJ_ROOT/vendor/bundle/ruby/2.5.0/bin/puma:23:in `<top (required)>'
```

## 解消法
以下のコマンドを実行してディレクトリを作成することで解消しました。

```:ターミナル
$ mkdir -p ./tmp/sockets
```

起動した。

```console
$ bundle exec puma -C config/puma.rb
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```
九九を表示するプログラム

# 九九を表示するプログラム
```python:99_1.py
for j in range(1,10):

    str_answer = ''
    
    for i in range(1,10):
        answer=j*i
        str_answer += "\t" + str(answer)
    
    print(str_answer)
```
![_Python 3.7.9 Shell_ 2022_08_20 11_33_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739883/3e17fded-51e6-528c-ae98-8c7115552762.png)


## 感想
``str_answer = str(answer)``だと一番右の数字のみ表示されるけれど、
``str_answer += str(answer)``にすると*1から*9の全部の結果が表示できることに気づいた。
又、``str(answer)``の前に``\t``を入れることで空間を開けられることを知った。
create-react-app でTypeScript を使う

## 環境
- OS: Window 10
- Node.js: v16.16.0

## 手順
作業用ディレクトリで、以下のコマンドを実行すればOK
```
npx create-react-app my-app --template typescript
```

## 参考文献
https://create-react-app.dev/docs/adding-typescript/
仮想通貨の過去データ取得

# あるある

ビットコインのような仮想通貨のデータ分析をしようと思っても***過去データ見つからない問題***ってあるあるじゃないですか？
あったとしても自分が欲しい時間単位で用意されてないこと多くてモヤモヤしてませんか？

そんな ~~あなた~~ 自分のために作りました。

# スクレイピング

[前回のBOT記事](https://qiita.com/Mimo/items/1ae834f589fb42877381 "Bybitで仮想通貨の自動売買")と同様にPybitを使います。まずはpipでインストールを。


```shell
pip install pybit
```

こちらが本題のコード。例として4時間足でのスクレイピングにしています。

```python
import time
import datetime
import math
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from pybit import usdt_perpetual
from pandas import json_normalize

count = 5 #過去データ200件を何回分取得するか

session_unauth = usdt_perpetual.HTTP(
    endpoint="https://api-testnet.bybit.com"
)

period = 4 * 200 * 60 * 60 # 4H * 200item * 60(m) * 60(s)

ts0 = time.time()
print(ts0)

df_list = [] #取得データの一時保存リスト

for i in range(1, count):
  ts = ts0 - period*i
  ts = math.floor(ts)

  #時間確認
  print(ts)
  dt = datetime.datetime.fromtimestamp(ts)
  print(dt.strftime("%Y-%m-%d %H:%M:%S"))

  #ローソク足取得
  result = session_unauth.query_kline(
    symbol="BTCUSDT",
    limit=200, #上限200
    interval=240, #4h
    from_time=ts
  )

  df = json_normalize(result['result'])
  df_list.insert(0, df) #先頭に追加


df = pd.concat(df_list, ignore_index=True)

# ファイル保存
df.to_csv("4h.csv", index=False)

# -------------------以下テスト---------------------

# ファイル読み込み
data = pd.read_csv('4h.csv')

#グラフ
fig, axes = plt.subplots(1, 1, figsize=(18, 4), tight_layout=True)
plt.plot(data[['close', 'open', 'high', 'low']])
plt.legend(['close', 'open', 'high', 'low'])
plt.show()

fig, axes = plt.subplots(1, 1, figsize=(18, 2), tight_layout=True)
plt.plot(data[['volume']], label='volume')
plt.legend()
plt.show()

```
保存したcsvはこんなデータになってます。
![Dataframe](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73133/a32a39be-23b5-a6ab-243f-8c6a34a0afc5.png)

グラフ化しておくとこんな感じです。
![Graph](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73133/47f99399-fa6f-be1d-2b65-85ea4d7db170.png)

# 仮想通貨ハッピーライフ

時系列データ解析の下準備が整いましたね。
現場からは以上です。
AWSアカウントを閉鎖してから再作成した時、rootユーザーログインできないという現象が起きた。

## ★経緯
2年前にプログラミング学習をはじめ、一度挫折して去年の5月ごろ？にアカウントを閉鎖しました。
2022年8月に改めてAWSを使いたいと思い、新規でアカウントを作成しました。

## ★起きている問題
rootユーザーログインを試みたところ、IAMユーザーログインにジャンプしてしまい
ログインしないとわからない？はずのアカウントIDを求められる現象が起きました。

## ★解決した方法

https://aws.amazon.com/jp/premiumsupport/knowledge-center/reopen-aws-account/#:~:text=%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E9%96%89%E9%8E%96%E3%81%97%E3%81%9F%E3%81%AE,%E3%81%9F%E3%82%8A%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

>閉鎖したアカウントを再開したり、閉鎖した AWS アカウントに関連付けられた E メールアドレスで新しい AWS アカウントを開設したりすることはできません。

上記の通り、**過去使っていたEメールアドレス**でログインしているChromeからもログインもできない可能性があると考え、
**別のEメールアドレスでログインしたChrome**から**前使っていたEメールアドレスではないEメールアドレス**でログインを試したところ、rootユーザーログインをすることができました。
【AWS】チュートリアル CodeCommit リポジトリ作成・サンプルコードのアップロード

# はじめに
AWS ドキュメント上の
[CodeCommit チュートリアル Step1, Step2](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-simple-codecommit.html#codecommit-create-deployment)
を進めました。
日本語訳に対応していないため、本記事では日本語で手順を紹介します。

本記事では、Git の操作を使わない方法で紹介します。

# 作業を進める前に
AWS アカウントが必要です。
持っていない方は作成してください。
[アカウントの作成](https://aws.amazon.com/jp/register-flow/)

# Step1: Code Commit リポジトリの作成
- [Code Commit ページ](https://console.aws.amazon.com/codecommit/.)にアクセスします。
- リージョンを選択 ※今回は Asia Pacific(Tokyo) を選択しました。
- 「Repositories」をクリックします。
- 「Create repository」 をクリックします。
- 「Repository name」に作成するリポジトリの名前を入力 ※今回は Code-practice で作成しました。
- 「Create」をクリックします。


# Step2: CodeCommit リポジトリにサンプルコードを追加
- [リンク先](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-simple-codecommit.html#codecommit-create-deployment)の **Step 2: Add sample code to your CodeCommit repository** からSampleApp_Linux.zip をダウンロードします。
- ローカル PC に SampleApp_Linux.zip の解凍するフォルダを作成 ※今回は code-pracitce で作成しました。
- code-practic(作成したフォルダ) に SampleApp_Linux.zip を解凍します。
解凍するとフォルダ内に下記のフォルダ・ファイルが生成されます。
    - appspec.yml
    - index.html
    - LICENSE.txt
    - scripts
         - install_dependenies
         - start_server
         - stop_server
- CodeCommit のコンソール画面に戻ります。
- 「Repositories」を選択します。
-  code-practice(作成したリポジトリ)を選択します。
    1. 「Add file」をクリックします。
    2. 「Upload file」 をクリックしてファイルをアップロードします。
        ※ scrpts フォルダを作成するときは「Create file」をクリックします。
    3. 「Choose file」をクリック。アップロードするファイルを選択します
    4. ユーザ名・メールアドレスを入力・「Commit changes」をクリックします。
- 1 ~ 4 の手順を各ファイルで行います。

ここまでで、Step1,Step2 の作業は完了です。

# 最後に
次回は Part3 以降を解説します。

# 参考
[Tutorial: Create a simple pipeline (CodeCommit repository)](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-simple-codecommit.html#codecommit-create-deployment)
cscの作法 その264

# 概要
cscの作法、調べてみた。
練習問題やってみた。
構想編。

# 練習問題
shellcodeを実装せよ。

# 方針

- win32apiを使う。
- VirtualAllocでメモリー確保。
- Marshal.Copyでshellcodeを転送。
- CreateThreadで実行。
- 問題あり
ソースを書いた時点で、defenderに検知されて隔離、バンされる。
なんとかコンパイルしてもexeが、defenderに検知されて隔離、バンされる。


以上。
商談レポートのcontact's emailフィールドに値が無い

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fd840314-03d8-9bf8-8562-c34426d3b607.png)

この項目はプライマリー取引先責任者が指定されていると表示される特殊なカラムのようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/03b4d49d-ce4c-38d4-a35d-87f400e911b8.png)


[The email contact is not seen in the report](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HF17eSAD)
データクレンジングを行ってみよう！価格変更偏

# 1.価格データを一括で変更したい

今回は、https://www.shuwasystem.co.jp/support/7980html/5875.htmlでダウンロードできるデータを扱っていきます。

これは、『実践データ分析１００本ノック』という本のサンプルコードになっております。本を見ながらみるととても分かりやすいと思うので、是非手に取ってみてください。
（ステマではありません！（笑））

## 2.データの読み込みや問題点の抽出
では、この中の第二章に入っている
uriage.csvを取り出していきます。

```Python
import pandas as pd
uriage_data = pd.read_csv("uriage.csv")
uriage_data.head()
```
```
purchase_date	item_name	item_price	customer_name
0	2019-06-13 18:02:34	商品A	100.0	深井菜々美
1	2019-07-13 13:05:29	商 品 S	NaN	浅田賢二
2	2019-05-11 19:42:07	商 品 a	NaN	南部慶二
3	2019-02-12 23:40:45	商品Z	2600.0	麻生莉緒
4	2019-04-22 03:09:35	商品a	NaN	平田鉄二
```

ここには、誰がいつなにを買ったのかという架空のデータが存在します。
商品名が小文字と大文字が入れ混じっていたりと他にも直さなければならない場所が存在しますが、今回は`item_price`について絞ってデータクレンジングを行っていきたいと思います。

### 3.本題！データクレンジング

`item_name`のクレンジングは説明を省略します。良かったら参考にしてください。
```Python
uriage_data["item_name"] = uriage_data["item_name"].str.upper()
##小文字を大文字に変える

uriage_data["item_name"] = uriage_data["item_name"].str.replace(" " , "")
##半角スペースを無くす

uriage_data["item_name"] = uriage_data["item_name"].str.replace("　" , "")
##全角スペースを無くす

uriage_data["item_name"].sort_values()
```
```
0       商品A
1748    商品A
223     商品A
1742    商品A
1738    商品A
       ... 
2880    商品Y
2881    商品Y
1525    商品Y
1361    商品Y
3       商品Z
Name: item_name, Length: 2999, dtype: object
```
それでは、`item_name`と`item_price`をデータフレーム型にしましょう。

```Python
uriage_data[["item_price" , "item_name"]]
```
```
	item_price	item_name
0	100.0	商品A
1	NaN	商品S
2	NaN	商品A
3	2600.0	商品Z
4	NaN	商品A
...	...	...
2994	2500.0	商品Y
2995	1300.0	商品M
2996	NaN	商品Q
2997	NaN	商品H
2998	400.0	商品D
```
おや、同じ商品名なのに欠損値がありますね。
基本的には、商品名の価格は変わらないという前提の上、この欠損値をまとめて変えましょう。

```Python
# 欠損値データをTrueで返す (また、~を用いることによって、欠損値ではないデータも抽出できる)
flg_is_null = uriage_data["item_price"].isnull()

# 欠損値があるデータのアイテムネームをリスト形式で抽出する
for trg in list (uriage_data.loc[flg_is_null , "item_name"].unique()):
    # 欠損値のないアイテムネームの行　かつ　欠損値のあるアイテムネームのitem_priceを　price変数にする
    price = uriage_data.loc[(~flg_is_null) & (uriage_data["item_name"] == trg) , "item_price" ].max()
    # アイテムプライスを呼び出して、その中の欠損値の起こしているアイテムデータを抽出し、それをpriceする
    uriage_data["item_price"].loc[(flg_is_null) & (uriage_data["item_name"]==trg)] = price  
```
一行目では、欠損値のアイテムネーム名をリストで返しています。繰り返し処理を行うにはリストにしておく必要があります。
また、３行目で`item_name`ごと一括で`item_price`の変更を行っているので、ここでは無駄な繰り返しを省くため`unique()`を使って、ユニークな値のみを繰り返しにさせています。

二行目では、簡潔に伝えると『しっかり値が入っているアイテム名の価格を`price`にする』ということです。
`~fig_is_null`(欠損値ではないもののbool値)かつ欠損値が存在する`item_name`の`item_price`の最大値を`price`にしています。

三行目では、欠損値が入っている`item_name` の`item_price`を`price`にまとめて置き換える

### 4.確認
そうすることによって、以下のようになります。
```Python
uriage_data[["item_price" , "item_name"]]

item_price	item_name
0	100.0	商品A
1	1900.0	商品S
2	100.0	商品A
3	2600.0	商品Z
4	100.0	商品A
...	...	...
2994	2500.0	商品Y
2995	1300.0	商品M
2996	1700.0	商品Q
2997	800.0	商品H
2998	400.0	商品D
2999 rows × 2 columns

uriage_data["item_price"].isnull().sum()
0
```
欠損値がなく、正常に値が入っていそうです。
以上で価格変更のクレンジング作業でした。

for文を上手く活用して、処理能力を高めていきたいです！
パブリックプレビューになった Microsoft Dev Box を触ってみた

## 背景と目的

開発環境を整えるのはプログラマーだけじゃなく、インフラエンジニアにも DevOps、IaC、CI/CD、Terraform、CLI、VSCode などの開発環境を案件ごとに整える事が珍しくありません。せっかくインフラをコード化してあっても、そのコードを実行する条件が同じでないと実行エラーが発生し、チームでインフラ基盤を構築したり改良したりすることが難しくなります。ということで、パブリックプレビューになった Microsoft Dev Box がプログラマー向けなのかどうかとか、作って触ってみてわかることもあるので、やってみました。なお、Dev Box 自体の作り方は他のブログ記事などをご参照ください。

## Dev Box 定義を作成するとエラーが発生

https://docs.microsoft.com/ja-jp/azure/dev-box/quickstart-configure-dev-box-service?tabs=AzureADJoin#create-a-dev-box-definition

上記ドキュメントの通りに実行すると下記エラーが発生しました。

![microsoft-devbox01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/069a3e04-0958-5d9d-924a-e674562cbf46.png)

たまたま下記のように表示言語を English にしたら、正常に Dev Box 定義を作成することができました。

![microsoft-devbox02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/54b899d6-74f9-90d7-6980-13565e95c242.png)

![microsoft-devbox03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/e631d7e6-29f6-27d2-6926-3ea1cff8cd32.png)

## Azure Virtual Desktop の Web クライアントにも表示

<https://client.wvd.microsoft.com/arm/webclient/index.html>

私の場合は AVD が既にあって、もう一つ Dev Box リソースが表示されました。

![microsoft-devbox04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/e468b31e-9238-c14e-2b19-7c6750acdf0c.png)

## Dev Box の実際の利用料金

Dev Box を作成した初日は、初回作成に 30 分から 90 分かかるというので、ほったらかしにしておきました。何時間起動しっぱなしだったかは定かではありませんが、8/16 は $11.34 の利用料金でした。翌日には Dev Box を停止したので、初日ほど課金されていません。ちゃんと時間課金のようです。

![microsoft-devbox05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/34d16637-5498-c6bc-d3a2-67421c9c53ea.png)

## Dev Box を使わない時は「停止」を忘れずに

<https://devbox.microsoft.com>

ここの「停止」を忘れていると、使っていなくても Dev Box Compute が課金され続けるのでご注意を！なお、「停止」しても Dev Box Storage は課金され続けます。

![microsoft-devbox06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/6b442bdf-5dcb-d471-af63-bf6c17eee571.png)

## 作って触って感じたこと

- Dev Box の仕組みを用意するのは AVD と比べると超絶簡単
- AVD には無い「停止」の仕組みが用意されていた
- Windows 365 とほぼ同じ仕組みらしいが、Windows 365 と違って Azure のクレジットが使えて時間課金なのが良い
- Azure Compute Gallery に開発用途別のカスタムイメージを用意しておく必要がある（今回はやっていない）
- Microsoft が用意している Windows イメージ内には Visual Studio 2022 とかツール類があらかじめ入っているかと思いきや何もなかった
- インフラエンジニアには、4 vCPU、16 GiB Memory は少々贅沢なスペックに思えた
- AVD を構築して運用できるなら Dev Box と比較して VM の種類が豊富で利用料金も抑えられそうなので AVD が優位

## 参考

https://docs.microsoft.com/ja-jp/azure/dev-box/

https://azure.microsoft.com/ja-jp/pricing/details/dev-box/
gmailに溜まった大量のメールを消す

gmailにあまりに大量のメールが溜まると、全選択してアーカイブや消去を行っても、さっぱり消えてくれません。
数十万通レベルにもなると、手で消していくのは現実的に無理です。
Google Apps Script (GAS)で気長に消しましょう。
以下の方法で、60万通を3日半で消すことができました。

## GASを書く

[Google Apps Script](https://script.google.com) に行き、適当にプロジェクトを作成

以下のコードを書く

```JavaScript
function main(){
  GmailApp.getInboxThreads(0, 480).forEach(
    thread => thread.moveToTrash()
  )
}
```

試しに手で「実行」してみる
実行に必要な権限付与を求められるので許可する
とりあえず480スレッド削除されることを確認する

## トリガー作成

- 実行する関数: main
- イベントのソース: 時間主導型
- 時間ベースのトリガーのタイプ: 分ベースのタイマー
- 時間の間隔: 15分おき

## メモ

- GASの実行時間や、GASからのAPI呼び出しの回数は、一定レベルに制限されています。
上で設定しているトリガーの時間間隔は、法人契約しているGoogle Workspace向けです。これ以上間隔をせばめると、制限にひっかかるリスクが高くなります。
- 個人のGoogleアカウントで試す場合は、30分おき、またはそれ以上がよいかもしれません。
- `GmailApp.getInboxThreads()` は一度には500スレッドまでしか取ってこれない制限があります。ここでは少し安全マージンをとって480スレッドずつ取ってくるようにしています。
Railsで外部参照しているはずなのにできない

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

ここを参考にテーブルの主キー以外をキーにして外部テーブルを参照できるように設定したのですがうまくいっていなかった

https://qiita.com/tanutanu/items/6c53b5290eaa9bf905d3

# 解決方法

原因はRubocopのエラー修正のためにつけたinverse_ofでミスをしていました

```
belongs to :model, foreign_key: 'key_name', inverse_of: :self_model
↓
belongs to :model, foreign_key: 'key_name`, inverse_of: :self_models
```

`s`をつけることで参照ができるようになりました
【React初心者】APIや配列に格納された、何がしかを一つずつ取り出し表示できるmapという便利関数

## この記事の対象者

・map関数「何それ?地図?」というくらいに、map関数と初対面の方
・なんか先輩に、「とりあえずmap回しとばいけるから回しといて〜」と言われるも、何のことかわからず目が回って困っている方
・for文やwhile文など使わずに、すっきりかつ少ないコードで繰り返し処理を実装したい方

Reactの開発やPJで、
「何がしかの配列や、APIで取得した配列情報を、展開してね」
というよくある課題。（逆に使わないことの方が多いくらい？）

JavaScriptやReactのPJ経験のある方には当たり前のうちの当たり前です。

しかし、
「JavaScript何にもわからんけど、React始めたよ。」
系の人にとっては、未知との遭遇案件ですよね。

なので、めちゃくちゃシンプルバージョンでここに残しておきますね。

僕自身、jQueryやVue、Reactから触り始めたたちなので、初めてJavaScriptのmap関数を扱った時に、ただひたすらに鼻水なのか涙なのかを垂らしながら、取り組んでいた記憶がありますので。

なんか、展開とかいう感じ二文字で表現されると、なんだか初心者には難しく、夢にまで出てくるほど恐ろしいものかと思いますよね。

けれども、ヒジョーにシンプルなので、今一度型の力を「ふぅ〜」と抜いて、読んでもらえたらと思います。
あ、ちょっと半笑いくらいでやるのがちょうどいいと思います。（一人の時に限る）

☆合わせて読みたい

https://qiita.com/sugachan/items/794e2563995d6a061117

## 結論 （map関数のかんたんな使い方 〜かるーく展開とやらをお披露目〜）

React。
というかJavaScriptのmap関数というものがあり、配列を一つずつ取り出して表示などができる便利な関数を使います。（より詳細は公式へ）
map関数の仕組みが理解しやすいようになるったけ、シンプル配列を展開すると以下のような感じになりますね。
※keyの箇所については、1個1個展開されるものがユニーク（唯一）である必要があります

```javascript:App.js
const testArrayNumbers = [1, 2, 3, 4, 5];
const testNumber = testArrayNumbers.map((number, index) => (
  <p key={index}>{number}</p>
));

export default function App() {
  return <div className="App">{testNumber}</div>;
}


```
ブラウザで見た感じは、以下で確認できます。

https://codesandbox.io/embed/green-rgb-wjzog6?fontsize=14&hidenavigation=1&theme=dark

上記のような感じで、配列のtestArrayNumbersにmap((number, index))をして、returnで返してあげるだけ。
すると、、なんということでしょう、配列の中身を一つ一つ取り出すことが、かんたんに実現できました。
（ここでbeforeafterのイメージソングが流れる）

map((number, index))の中身についても、一つずつ見ていきますね。

__numberは何者？__
const testArrayNumbers = [1, 2, 3, 4, 5]; の中身1つ1つ。

__indexは何者？__
配列のindex番号（0から始まる配列の番号 今回のケースだと0,1,2,3,4）
あれですね、配列の中身を見たり、取り出したりする時に、testArrayNumbers[0]みたいにする時のアレ、ですね。
これをreturnしている
```javascript:App.js
<p key={index}>{number}</p>
//実務では、indexではなく、mapで回す要素のidを使うことが多いですね
```
のkeyの中身に当てることで、重複しない要素ですよー、っていうのを認識してもらいます。

keyを設定しないと、TypeScriptだと確実に、ガン詰めされてしまいますし、JavaScriptでもコンソールに警告が出る気がします。
こちらについても、ご自身の画面で、あえて間違いのパターンも試してみて、どんな感じになるのかをみて見るものも勉強になるかと思います。

:::note info
今回は一例としてやっていますが、実際の所はindexじゃない方が良いと思います。
なぜなら、indexは配列の中身が削除されたり、変更されたりすると、対応する値が変化する可能性があるから。この記事では深堀はしませんが、需要があれば、かんたんに、別記事でまとめようと思います。
:::

以上、めちゃくちゃカンタンに、map関数を説明させていただきました。

おそらく頭の中では、なんとなく理解していただけましたかね？
最後にお伝えしておきたいのは、とにもかくにも手を動かしてみて、ご自身でもmapを体感されてみてください。

頭でわかっていても、いきなり実務でやれ！と言われた際に対応が難しいと思うので、自分のペースでゆっくりとあーだこーだ考えたり、感動したりしておくと、自分の身になり、いざとなった時に、比較的に楽に対応できるかと思いますので。

ここまで読んでいただき、ありがとうございました！
あなたと私のJSライフに幸あれ。

https://qiita.com/sugachan/items/794e2563995d6a061117
Railsでdb:migrateやdb:rollbackができなくなったときの対処方法

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Migrateをする際にテーブルが外部のテーブルに依存する(外部キーなど)ときに、うまくmigrateやrollbackができないことがあります。一部レコードが外部キーを持っている状態のままレコードに入っていたりするので起きていることがあります

# 対処方法

まずは参照元、参照先のテーブルを削除していきます

```
$ rails c
$ Model1.destroy_all
$ Model2.destroy_all
```

ここではmigrateしたいテーブルにModel1とModel2が紐づいていると仮定しています

またmigrateは途中まで成功しているとロールバックしないので(migrateファイル単位で判断するので失敗したときにはそのファイルの内容のみをロールバックしているので成功したファイルはロールバックされない)、`duplicated`というエラーが出た場合は`down`を利用して削除していきます(upはすべてコメントアウトさせて辻褄を合わせます)

またMySQLに直でログインしてDBをデバックして原因となっている箇所を特定するのもよくやります

```
$ mysql -u root -p
$ use Database名
$ desc テーブル名 # テーブル構造を表示
$ show index from テーブル名 # インデックスが張られているか表示
```
Docker(WSL2)でGPUが使えるようになったのでメモ

# はじめに
この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 環境構築方法

基本的にはこの記事を確認した

https://qiita.com/ksasaki/items/ee864abd74f95fea1efa

若干わかりづらかったことだけをメモ

環境
- Ubuntu 18.04LTS
- GeForce GTX 1650

まず、IntelInsider devチャンネルを選択
![bandicam 2021-09-08 00-49-22-572.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/cff67379-579c-05fa-d0b8-abd47326944f.jpeg)

Ubuntu18.04のインストール
CMDからインストールしないと失敗した

```
$ wsl --install -d Ubuntu-18.04
```

NVIDIA Drivers for CUDA on WSLは説明通りで、GeForceをインストール

Toolkitは2つ目で紹介されているものをいれる

```
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-wsl-ubuntu-11-4-local_11.4.1-1_amd64.deb
sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-4-local/7fa2af80.pub # ここの順序を変える
sudo dpkg -i cuda-repo-wsl-ubuntu-11-4-local_11.4.1-1_amd64.deb # ここの順序を変える
sudo apt-get update
sudo apt-get -y install cuda
```

順序を入れ替えているところがあります。

そのあとで、nvidea-smiのためのコマンドを記事通りに実行
すると立ち上がりました。

かなり前に苦戦して挫折したのでとてもうれしかったです。

![bandicam 2021-09-08 00-42-54-065.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/810091b3-2a8a-fd4a-0174-9b238acf926a.jpeg)

ちなみにdockerでコンテナ上の認識も確認しました。

```
$ curl https://get.docker.com | sh
```

このあと、dockerインストールのためのNvidea Toolkitのシェルを作成

```start.sh
#!/bin/sh

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnvidia-container-experimental.list | sudo tee /etc/apt/sources.list.d/libnvidia-container-experimental.list

sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo usermod -aG docker $USER
```

そのあと、`sudo docker`とコマンドが打つのが嫌なのでグループ追加をする

```
$ sudo gpasswd -a $USER docker
$ sudo service docker restart
# 一度Ubuntuのタブを消す
$ docker ps (表示されればOK)

# Tensorflowのイメージを起動
$  docker run --gpus all -it --rm --name tensorflow-gpu -p 8888:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter

# ログにでているlocalhost:8000/token=****にアクセス
# Jupyterで適当なファイルを作る
```

ファイルは以下のように書いて実行する

```test.ipynb
IN[1] from tensorflow.python.client import device_lib
IN[2] device_lib.list_local_devices()
```

![bandicam 2021-09-08 01-15-55-838.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/45dddda3-32b8-00a4-4fe0-4bff71c391de.jpeg)


無事コンテナでもGPUを使うことができました。
minicondaでjupyterを使おうとしたらカーネルが起動しない

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

minnicondaでjupyterを起動すると以下のエラーが発生

```
nel died with exit code 1. Traceback (most recent call last): File 　　
"C:\Users\username\Anaconda3\lib\runpy.py", line 
193, in run_module_as_main "main", mod_spec) File
 "C:\Users\username\Anaconda3\lib\runpy.py", line
 85, in run_code exec(code, run_globals) File 
"C:\Users\username\Anaconda3\lib\site-packages\ipykernel_launcher.py", line 15, in from ipykernel import kernelapp as app File 
"C:\Users\username\Anaconda3\lib\site-
packages\ipykernel_init.py", line 2, in from 
.connect import * File 
"C:\Users\username\Anaconda3\lib\site-
packages\ipykernel\connect.py", line 18, in 
import jupyter_client File 
"C:\Users\username\Anaconda3\lib\site-
packages\jupyter_client_init.py", line 4, in from 
.connect import * File 
"C:\Users\username\Anaconda3\lib\site-
packages\jupyter_client\connect.py", line 24, in 
import zmq File 
"C:\Users\username\Anaconda3\lib\site-
packages\zmq_init_.py", line 4...
```

エラーは[こちら](https://github.com/microsoft/vscode-jupyter/issues/5689)から引用
VSCodeでipynbを実行していたが、コードを実行すると右下にエラーがでてました

# 解決方法

以下のコードをminicondaで実行したところ治った

```
$ conda install ipykernel --update-deps
```
WSLでdocker-compose buildでPermission denied

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

タイトル通り、WSLで`docker-compose build`をしたら`Permission denied`で権限エラーが発生した

# 解決方法

以下のコマンドで権限を付与した

```
$ export DOCKER_BUILDKIT=0
$ export COMPOSE_DOCKER_CLI_BUILD=0
```

追記: 2022年8月20日
おそらくだが以下のコマンドでファイルの権限を変更することで解決するかと思う(未検証)

```
$ sudo chown -R ユーザー名:グループ名 ./*
```
WSLでDockerを動かしたが、Railsコンテナがupしたときにmkdirでpermision deniedになる

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Gitのリポジトリに管理していたRailsのDocker環境をローカルにクローンしたところ`permission denied`が発生した

# 解決方法

Gitにあげたときの権限のあるユーザーといまクローンしてきた環境のユーザーの権限が異なっていたので問題になっていた
権限を変えてあげれば解決する

```
$ sudo chown -R ユーザー名:グループ所有権 ./*
```

この例ではローカルのユーザが扱えるようにクローンしてきたファイルに権限を与えている
AWS IAMとは？

## IAMでできること
・IDと認証情報の管理
・アクセス権限の管理
・権限の委任
・IDとライフサイクル管理

など、AWSリソースにアクセスする仕組み。
AWSリソースにアクションをする場合、ユーザーだけではなくアプリケーションだったりします。
AWSではユーザーやアプリケーション、ロールなどアクションの指示を出す役割をまとめてプリシンパルと言います。

プリシンパルがリクエストを出す場合、IAMユーザ、ロールが認証されている必要があります。

プリシンパルはマネジメントコンソールであったり、AWSAPIを使用してリクエストを送信します。

リクエストには誰が？どの環境に？どんなことをしたいのか？の情報が入っています。
これらの情報をもとにリクエストを許可するのかしないのかをアクセス許可のポリシーによって決められており、これらが認可されて初めてリソースが使用できます。

## AWSアカウントのルートユーザー
全てのAWSサービスとリソースを全てに完全なアクセス権を持つユーザーのことを指します。支払いオプションの変更、サポートプランの変更、IAMユーザーへのアクセス許可のリストアや無効な制約を設定したS3バケットポリシーの修正などができます。
（他にもあるが割愛）

## IAMユーザーの作成
AWSで作成するエンティティ（ユーザーまたはアプリケーション）名前と認証情報で構成されています。

IAMユーザーを識別する方法として、、
・「フレンドリ名」：ユーザー作成時に指定。
“Alice”と“Alice”は同一のユーザーと見なされて、作成しようとするとエラーが出ます。
・ユーザーのARN：リソースポリシーのプリシンパル要素で指定します。

認証情報として使用しているのは、、

・マネジメントコンソールで使用しているパスワード
・プログラムからアクセスするときに使用するアクセスキー

これらから必要な認証情報を作ることができる。（選べる）

## ユーザーとグループの作成について
I新しいグループの作成しポリシーを紐付ける。その次にユーザーを作成しアクセスの種類を選択する。
コンソールのパスワードを自動生成パスワードにするかカスタムパスワードに設定するかを選択することができる。ユーザーを作成し終えたらグループに追加をすることができる。

## IAMロール
AWSサービスやアプリケーションなどのエンティティに対してAWSリソースの操作権限を付与する仕組みのことを指します。

IAMロールによる認証情報はAWSが自動的にローテーションすることができます。SDKによって認証情報取得と有効期限切れ前の再取得を自動的に実施可能です。

別のAWSアカウントのユーザーが認証状を共有せずに自分のAWSアカウントのリソースにアクセスを制御可能にします。

ユーザーやグループには紐付いていません。
ユーザーまたはアプリケーションがロールを一時的に引き受けることで別のAWSアカウントのユーザーで引き受けることが可能です。

例えば、EC2からS3にアクセスしたい場合には、EC2にIAMロールを使ってS3にアクセスできる設定の場合、
裏でSTSが働いていて一時的にアクセスキーとシークレットキーを発行してます。S3へのアクセスが終わったら自動的に削除されるのでアクセスキーとシークレットキーは管理する必要がありません。

## IAMロールとポリシーの作成
例として、EC2からS3のバケット一覧を取得するようにする設定の場合、ロールを作成してEC2にアタッチをする設定をする必要があります。

まずはロールの作成から。このロールを使用するサービスを選択の画面からEC2を選択します。
次の画面でアクセス権限はS3フルアクセスをチェックして次の画面へ（これは操作する権限、ポリシーをアタッチしたという意味になる。）

信頼関係とポリシーを紐づけて操作をできるようにするイメージ。
ロールの基本。どのAWSリソースこのロールを使えるのか？＝信頼されたエンティティ
どのサービスに対してどんなアクションを実行できるのか？＝ポリシー

その次にインスタンスにアタッチする必要があるので操作したいインスタンスにチェックを入れます。
アクションのボタンをクリックしインスタンスの設定のボタンをクリック→「IAMロールの割り当て/置換」のボタンをクリック→先ほど作成したロールをアタッチします。

●IAMポリシー
アクセス許可を定義するルールみたいなもの。
・どのリソースに対して？
・どのような操作を？
・許可する、しない

以上を定義します。

●IAMグループ
一人一人のユーザーのポリシーを変更するのは面倒なので
グループにポリシーをつけて、グループにユーザを所属させておけば
ポリシーの変更は一回で済みます。

## STSとは？
一時的なセキュリティ認証情報のことを指す。

有効期限つきのアクセスキーID /シークレットアクセスキー/セキュリティトークンで構成されている
認証情報を取得する際に期限を設定できる。

トークンのタイプにより有効期限は様々、発行した認証情報の期限は変更不可である。

STSエンドポイントは全リージョンで使用可能であり、デフォルトではグローバルサービスとして利用している。

## AssumeRoleとは？
既存のIAMユーザーの認証情報を用いて、IAMロールのtemporary security credentialsを取得するためのアクション。
CUDAによる画像処理が何十倍も高速化

・カーネル内のループは時間が掛かる
　　フィルタ処理を行う場合、CUDAカーネル内で、フィルタ係数を二重ループで走査する。
　　このとき、フィルタサイズが大きいと、許容できないほどの処理時間を要してしまう。
　　例えば、1920x1080の画像に65x65の線形フィルタ（もしくはerodeフィルタ）を適用
　　したときの処理時間は、約150ミリ秒であった。

・**高速フーリエ変換を積極的に活用すべき**
　　そこで、線形フィルタを、周波数空間で適用するようにしたら、処理時間が約150ミリ秒から
　　約4ミリ秒に改善した。なお、高速フーリエ変換は、**1920x1080の画像で約1.5ミリ秒**だった。
　　また、周波数空間における画素ごとの乗算は約1ミリ秒だった。
　　すなわち、**フィルタサイズがいくら大きくても、計算時間は一定**である。
　　知っている人には当たり前かもしれないが、高速フーリエ変換を使わない手はない。

・関係無い画素はスキップすべき
　　また、erodeフィルタなど、フィルタ係数が1になっている領域の最大値（や最小値）を
　　求める処理では、フィルタ係数が0になっている領域を走査しないようにした。具体的には、
　　フィルタ係数が1になっている場所の座標を配列に格納し、CUDAカーネル内では、
　　配列に格納されている座標の画素だけを走査するようにした。その結果、処理時間が
　　約1ミリ秒に改善した。(※ただし、フィルタ係数は非常にスパースで、99%以上が0)

なお、上記方法で実装したコードについては以下の記事で紹介
https://qiita.com/rueiwoqpqpwoeiru/items/69a931e4042a4f9d4434

（追記）
**二値画像に対するモルフォロジー処理は、高速フーリエ変換を用いることで高速化できる**。
dilateの場合、fftによる畳み込みを行い、閾値処理で二値化する。
erodeの場合、0-1を反転してから、fftによる畳み込みを行い、
閾値処理で二値化した後、0-1を反転する。
Railsで途中からDBをsqlite3からmysql2に変更するだけなのに死んだ【9日目】

# 前提
- develop環境でsqliteを使うと、production環境（AWS）への移行が面倒そうなので、mysqlに変更しようと思った（本番はmysqlを使いたいから）
- まだ1度も`db:migrate`していない状態から作業した
- そもそも`rails new アプリ名 -d mysql`でデフォルトのDBをmysqlにできる
- ruby "3.1.2"
- rails "7.0.3.1"
- M1MacBookPro

# 最初の躓きポイント
- Gemfileからsqlite3を消し、mysql2を追加して`bundle install`でエラー
- `ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)`
- 原因はmysqlをPCにインストールしてなかったこと
- homebrewでmysqlをインストールしたらパス

# 次の躓きポイント
- config/database.ymlをmysql用に書き直す
- 具体的には、`rails new アプリ名 -d mysql`で別のアプリを作って、そのdatabase.ymlをコピーした
- `mysql -u root`でエラー
- `ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)`
- 原因はmysqlを起動していなかったこと
- mysql.server start（終了時はstart→stop）
- `mysql -u root`でsqlに接続

# 3つ目の躓きポイント
- `create user ユーザー名@localhost identified by 'パスワード';`で[ユーザーを作成](https://www.javadrive.jp/mysql/user/index1.html#section1)
- ちなみにSQLで文末に`;`をつけ忘れると`=>`が出てくるので`;`を打つと通る
- `quit`でmysqlを抜けて、database.ymlにユーザー名とパスワードを入れ、`rails db:create`でエラー
- 原因は作ったユーザーに権限がないこと
- 作ったユーザーでmysqlに接続
- 作ったユーザーに[権限を与えようとする](https://www.javadrive.jp/mysql/user/index6.html#section1)とエラー
- 原因は新しいユーザーには、権限を付与する権限もないこと
- rootで接続して、作ったユーザーに権限を与えることができる
- `rails db:create`と`rails db:migrate`がパス
- `rails s`でlocalhostで確認して問題なし

# 結論
これだけのことに2時間以上費やした。最悪すぎる。以下がポイント。
- そもそもPCにmysqlを入れたか
- `mysql.server start`で起動したか
- rootでユーザー権限を付与したか
github actionsのros-tooling/setup-rosでエラー

github actionsのros-tooling/setup-rosでエラー

```bash:github_actionsのsetup-rosでエラーが出た部分のログ
Run ros-tooling/setup-ros@v0.1
Invoking "sudo bash -c echo 'Etc/UTC' > /etc/timezone"
Invoking "sudo apt-get update"
Invoking "sudo DEBIAN_FRONTEND=noninteractive RTI_NC_LICENSE_ACCEPTED=yes apt-get install --no-install-recommends --quiet --yes curl gnupg2 locales lsb-release"
Invoking "sudo locale-gen en_US en_US.UTF-8"
Invoking "sudo bash -c echo 'Etc/UTC' > /etc/timezone"
Invoking "sudo ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime"
Invoking "sudo DEBIAN_FRONTEND=noninteractive RTI_NC_LICENSE_ACCEPTED=yes apt-get install --no-install-recommends --quiet --yes tzdata"
Invoking "sudo apt-key add /home/runner/work/burger_war_dev/burger_war_dev/ros.key"
Invoking "sudo bash -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list"
Invoking "sudo bash -c echo "deb http://packages.ros.org/ros2/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros2-latest.list"
Invoking "sudo apt-get update"
Error: The process '/usr/bin/sudo' failed with exit code 100
```

github actions用のyamlファイルは以下の通り

```yaml:main.yaml
jobs:
  ros-build:
    runs-on: ubuntu-18.04
    steps:
      - name: checkout
        uses: actions/checkout@v2
      - name: ros setup
        uses: ros-tooling/setup-ros@v0.1
        with:
          required-ros-distributions: melodic
      - name: burger_navigation
```

バージョンが古かったのか、`uses: ros-tooling/setup-ros@v0.2`にして解決

```yaml
      - name: ros setup
        uses: ros-tooling/setup-ros@v0.2
```

# 参考
[Github ActionsでROSのrostestを実行する](https://qiita.com/honeytrap15/items/0d417773bafa1d373b3d)
[ros-tooling/action-ros-ci](https://github.com/ros-tooling/action-ros-ci/releases)
[ros-tooling/setup-ros](https://github.com/ros-tooling/setup-ros)