OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry PiへのMariaDB セットアップ 2022年版

# 1.はじめに
Raspberry Pi + MariaDBの組み合わせはよく使っているのですが、最新の環境でRaspberry Pi OSにインストールすると外部端末からアクセスできなくなってしまいました。原因ははっきりしていませんがOSがbullseye版に変わったことによる影響かな？
いろいろと試行錯誤したので覚書がてら共有しておきます。
素人がトライ＆エラーで実行しているので間違っている場所があるかもしれません。とりあえず動くことを確認しています。
ちなみに古い方法は[こちら](https://qiita.com/airpocket/items/5e73444459b7ad5b0666)でした。

# 2.インストール方法

まずはアップデートしてからMariaDBをインストールします。

```shell
$ sudo apt update
$ sudo apt install -y mariadb-server
```

以前はインストールが完了したらMariaDBにログインしてユーザー権限等を書き換えていましたが、認証用のSocketが変更されたため書き換えができなくなりました。代わりにmysql_secure_installationというツールを使って書き換えを行いました。

```shell
$sudo mysql_secure_installation
```

いろいろ尋ねられますので次の通り入力します。

```shell
Enter current password for root (enter for none):  <--何も押さずにEnter
Switch to unix_socket authentication [Y/n]:        <--n
Change the root password? [Y/n]:                   <--y
New password:                                      <--MariaDBのrootユーザー用パスワードを新規作成
Re-enter new password:                             <--同じパスワードを入力
Remove anonymous users? [Y/n]:                     <--y
Disallow root login remotely? [Y/n]:               <--n
Remove test database and access to it? [Y/n]:      <--y
Reload privilege tables now? [Y/n]:                <--y
```
次に設定ファイル上でローカルからのアクセスに限定する行をコメントアウトします。

```shell
$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
```
開いたファイル中のbinde-addressの行を次の通りコメントアウトします。

```shell
#binde-address     =127.0.0.1
```
続いてMariaDBにログインして外部端末からのアクセスを許可します。

```shell
$ mysql -u root -p
Enter password:
```
パスワードを聞かれたら、先ほど作成したパスワードを入力し、権限変更のコマンドを入力。

```shell
MariaDB[(none)]> grant all privileges on *.* to root@"%" identified by 'your password' with grant option;
MariaDB[(none)]> exit
```

設定が終わったら、MariaDBを再起動して完了。

```shell
$ suod systemctl restart mysql
```

以上で完了です。
pyenvでPython2系と3系を切り替える【macOS】

# やりたいこと
BigQueryをローカルから操作する必要がありました。
BigQueryを操作するbqコマンド、CloudStorageを操作するgsutilコマンド、GCEやGKE等を操作するgcloudコマンドをローカルで使うにはGoogle Cloud SDKが必要です。
CloudSDKを使用するにはPythonが必要で、サポート・推奨されているバージョンは以下の通りです。

[公式ドキュメント](https://cloud.google.com/sdk/docs/install?hl=ja#installation_instructions)より

```
サポートされているバージョンは Python 3（3.5～3.8、3.7 を推奨）と Python 2（2.7.9 以降）です。
```

私が使用するMacにはデフォルトで入っているPython2系しかありませんので、推奨されている　Python3.7を使えるようにしようと思います。
今回はPythonの環境構築のみで、別の記事にて、そのあとのCloudSDKの環境構築についてもまとめていきます。

## 環境
- MacOS 10.15 Catalina
- Homebrew 3.3.7

# Python3系環境構築
今回はpyenvを使用し、Python2系と３系（今回は3.7）を共存させることにします。複数のpythonバージョンの共存については、[こちらの記事](https://qiita.com/ganyariya/items/1bf870275bad7b5ab506)がわかりやすかったです。
### 現在のPythonのバージョン確認

```bash
$ python -V
Python 2.7.16
```

現在はデフォルトの２系が入っています。

### pyenvのインストール
homebrewでpyenvをインストールすることができます。homebrewのインストールは[こちらの記事](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)などを参考にしてください。

```bash
$ brew install pyenv
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/c76b4ed9-b35d-fc96-0f7f-c8780065579d.png)

インストールが完了したら、pyenvのバージョンを確認してみます。

```bash
$ pyenv -v
pyenv 2.2.3
```

pyenvのパスを通します。

```bash
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
$ source ~/.zshrc
```

### pyenvでPython3.7をインストール

現在pyenvで切り替え可能なPythonのバージョンを確認します。

```bash
$ pyenv versions
 * system (set by /Users/user/.pyenv/version)
```
現在はまだデフォルトのバージョンのみですね。

pyenvでインストールできるバージョンの一覧は以下のコマンドで確認できます。

```bash
$ pyenv install --list
```

今回はPython3.7.8をインストールしてみましょう。

```bash
$ pyenv install 3.7.8
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320845/861d7456-dcf7-a233-ab59-a107079af9cd.png)

私の環境ではインストールに４分ほどかかりました。

pyenvで切り替え可能なPythonのバージョンを確認してみましょう。

```bash
$ pyenv versions
* system (set by /Users/user/.pyenv/version)
  3.7.8
```

3.7.8が使えるようになりました。
ですが、現在適用されているのはPython 2.7.16のままですね。

```bash
$ python -V
Python 2.7.16
```

インストールしたPython3.7.8に切り替えてみましょう。

```bash
$ pyenv global 3.7.8
```

```bash
$ pyenv versions
system
* 3.7.8 (set by /Users/user/.pyenv/version)
```

pyenv上では3.7.8に切り替わっていますね。

ローカルのPythonバージョンを確認してみます。

```bash
$ python -V 
Python 2.7.16
```

切り替わっていない。。。
調べていると、どうやら.zshrcの記述が不足していることが原因のようでした。
次の記述を.zshrcに追加します。　

```bash
$ echo 'eval "$(pyenv init --path)"' >> ~/.zshrc
$ source ~/.zshrc
```

再度ローカルのPythonバージョンを調べると…

```bash
$ python -V
$ Python 3.7.8
```

無事切り替わりました！


# コマンドまとめ
```bash
# pyenvで特定のバージョンのPythonをインストールする
$ pyenv install 3.7.8

# 使用するPythonのバージョンを切り替える（インストールしたものの中から選択可能）
$ pyenv global 3.7.8
 
# pyenvでインストール済みのバージョン、現在適用中のバージョンを確認する
$ pyenv versions
  system
* 3.7.8 (set by /Users/user/.pyenv/version)
```


# 参考にさせていただいた記事 
- [pythonの環境構築戦争にイラストで終止符をどうやら打てない
](https://qiita.com/ganyariya/items/1bf870275bad7b5ab506)
- [pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法
](https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)
- [MacのPythonを2系から3系にアップデートする
](https://qiita.com/Ajyarimochi/items/ff40e57d082dd171e761)
- [pyenvでpythonのバージョンが反映されない時
](https://qiita.com/minarai/items/297aec329f2f029bee10)
プロダクトづくりに関わるすべての人に刺さるラーメンハゲ名言集

## ラーメンハゲという名言製造機

みなさんは、「ラーメンハゲ」のことをご存知でしょうか？

「ラーメンハゲ」は、『ビッグコミックスペリオール』で現在連載中の『らーめん再遊記』という料理漫画の主人公です。

本名は芹沢達也で、もともと、前シリーズの『ラーメン発見伝』では主人公の敵役だったのですが、そのあまりに濃いキャラクター性が「ラーメンハゲ」としてネット民に愛され、ついに最新作では主役まで上り詰めています。

このラーメンハゲが登場する一連のシリーズは、グルメ漫画というよりはラーメンという飲食ビジネス自体を描いています。さらに言えば、この漫画ではラーメンというものを、「自らの魂をこめたモノづくりと、顧客に価値を届けるビジネスという両面の性格を持ったもの」として捉えており、そこに登場人物たちがどう折り合いをつけていくかが物語のテーマとなっています。

その困難にもっとも真摯に立ち向かった男が芹沢達也ことラーメンハゲで、その戦いから培った哲学から、彼は物語のなかで数々の名言を放ちます。とくに、ITのサービスをつくっている私のような人間にとって、このラーメンハゲの本質をついたは発言はいずれもめちゃくちゃ心に刺さり、自分がビジネスやプロダクトづくりをしていくうえでも肝に銘じておきたいと感じたものが数多くあります。

したがって、今回はエンジニア/デザイナー/PdMなどプロダクトづくりに関わるすべての人に刺さる芹沢達也ことラーメンハゲの金言の数々を紹介していきたいと思います。

## いいものなら売れるというナイーブな考え方は捨てろ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164449/bc5d5772-856f-fa4a-a59d-9a7121a7b5db.png)
『ラーメン才遊記』9巻、第88話「濃口ラーメン・解!!」より

ラーメンハゲの経営するラーメン店が、他店にメニューをパクられたうえに安い価格で提供されたことで、顧客が奪われはじめ窮地に立たされます。そのときに、「味はうちのほうが上だから勝てる」と言う社員に対して、その危機感のなさを指摘する発言です。

この発言の前に「あらゆる商品の価値は、品質、サービス、コストパフォマンス、ブランド・・・といった多様な要素の総和で決まる。」という補足があり、まさしくソフトウェアの顧客の購買理由と同様です。単に自分たちが便利と思う機能をつくるのではなく、自分たちのライバルと比較したうえでの強みを正確に捉え、顧客にとってその強みをより享受できるような機能を開発していく必要があります。

## お客様は神様などではありません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164449/01d19443-e81e-f225-9eb7-c3a3f000c09a.png)
『ラーメン才遊記』10巻、第82話「ダメ店主更生プラン」より

クレーマー気質の客ばかりが常連になって困っているラーメン店の店主に対して、ラーメンハゲが一発で解決方法を示した発言です。

また、このあと彼がアドバイスしたことは「店の価値観を貫かない限り、顧客を選ぶことはできない」というものです。プロダクトづくりにおいても、プロダクトで提供する価値観を明確にしておくことがもっとも大事で、それがぶれてしまうとプロダクトとユーザーの関係性が対等にならず、ただただ顧客のクレームに応え続ける開発をつづけることになります。

## 情報を食ってるんだ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164449/1d294230-2d3c-6489-03d7-78f9a214a098.png)
『ラーメン発見伝』1巻、第7話「繁盛店のしくみ」より

「ラーメンハゲといったこれ」というくらい有名な発言です。

純粋な味のみのクオリティアップを追求するラーメンマニアの主人公に対し、ラーメンビジネスのプロとしてこうフィードバックしました。ラーメン店に行くとメニューの案内に「○○産の最高級な素材を使用した〜」的なうんちくが書いてありますが、ほとんどの客は味についてわからなくても、そのうんちくを見ることで「おいしいラーメンだ」と錯覚して満足するという話です。

プロダクトづくりにおいても、便利な機能をつくること以上に、「便利だ」とユーザーに錯覚させることが非常に大事です。便利さを感じやすくするUIUXの提供はもちろん、例えば「こう便利になりました」といったリリースノートも、実はユーザーの満足度を高めるうえで大事だったりします。

ラーメン（プロダクト）を提供する際には、ラーメン（機能）をつくって食べてもらう（使ってもらう）だけでなく、ユーザーとラーメン（プロダクト）を通じてコミュニケーションするという視点で設計することがとても大事です。


## おわりに
他にもラーメンハゲから学べることは数多くあるので、ぜひ『ラーメン発見伝』全26巻、『ラーメン才遊記』全11巻、『らーめん再遊記』4巻（2021年末時点）を読んでください！

とくに『ラーメン才遊記』の最終話では、ラーメンハゲが「自らの魂をこめたモノづくりと、顧客に価値を届けるビジネスという両面の性格を持ったもの」であるラーメンとは何かに1つの解を示していて、その内容はプロダクトづくりに関わってる人は涙を禁じえないものになっています。
toioでチロルチョコを配送する方法

#背景

　CoderDojoつくば・守谷の子どもたちが、2021全国選抜小学生プログラミング大会 茨城県大会にチャレンジする事になりました。「どんな物を作りたいか？」と聞いたところ、「無人で荷物を運んでくれるシステムを作りたい！」との事。
配送にtoioを使うのは決まったのですが、荷物の積み下ろしをどうするかが課題となりました。

#toioベルトコンベアー技

　子どもたちと話しているうちに、toioを逆さまにしてタイヤをベルトコンベアー代わりにして、荷物積み下ろしに使うアイディアが生まれました。その時に作ったサンプルがこちら。

https://youtu.be/7zXlF6G5XdY

　実はこの仕組み、初めはうまく動きませんでした。やってみると判るのですが、toioのタイヤが空転してしまうんです。対策として、チロルチョコの裏に厚紙を貼る事により、タイヤがグリップするようになりました。

#完成した作品

　約2ヶ月、３人の子どもたちが協力して作った作品がこちら。speach2scratchと組み合わせて音声で配送指示が出来るようにしました。

https://youtu.be/WzQlt-THGXc


茨城県大会の結果はというと、160作品以上の応募があり、ファイナルステージの7作品に残ったのですが、結果は準優勝（茨城県教育長賞）。残念ながら、全国大会には進むことができませんでした。
夏休みを使って頑張って作った子どもたち、本当にお疲れ様でした。
【Ruby on Rails】コントローラーでヘルパーメソッドを使用する方法

そもそもコントローラーからヘルパーを呼び出せないかな？と疑問に思ったので調べてみた。

# メソッド先頭にview_contextをつけるだけ
結論、コントローラーで「view_context」をつけるだけ。

```app/helpers/sample_helper.rb 
module SampleHelper
  def helper_method
    # 処理の内容
  end
end
```

```app/controllers/sample_controller.rb 
class SampleController < ActionController::Base
  def index
    # 呼びたい箇所で、先頭にview_contextをつけるだけ
    view_context.helper_method
  end
end
```

意外とあっという間にできて安心した。

ただ、本来はビューのヘルパーを無理矢理呼び出すよりは、
アプリケーション共通処理として切り出すやり方の方が良いよう。

詳細はこちら、[【Ruby on Rails】コントローラーで独自のヘルパーメソッドを使用する2つの方法](https://takeda-no-nao.net/programming/ruby/using-your-own-helper-methods-in-controllers/)を参考にしてください。

# 参考
[【Ruby on Rails】コントローラーで独自のヘルパーメソッドを使用する方法](https://takeda-no-nao.net/programming/ruby/using-your-own-helper-methods-in-controllers/)
UNVT 安定化のために Raspberry Pi の swap を拡大する

Raspberry Pi を用いて UNVT でベクトルタイル生産をしている場合に、タスクが kill される理由の多くはメモリ不足です。swap を拡大しておくと、速度は遅くあれ、kill されなくなります。

swap　を拡大する方法について、メモしておきます。以下、swap　を 2GB に変更する方法です。なお、私がみた時のデフォルトは 100MB でした。

- `/etc/dphys-swapfile` で `CONF_SWAPFILE=2048` と書き直す。
- `sudo /etc/init.d/dphys-swapfile restart` で反映する。
- `swapon -s` で、反映を確認する。
ubuntu 20.04 での Canon MG6130 のセットアップ

# 背景
windowsでできることをlinux(ubuntu)に移行している。
プリンタのセットアップを行ったが、何分古いプリンタなので周辺のライブラリがないとか問題が発生して上手くいかなかった。それでもなんとかセットアップを完了することができたので、その経緯を記載する。
# プリンタドライバの入手
Canon社の公式サイトからドライバを入手する。
https://cweb.canon.jp/cgi-bin/download/select-software.cgi
次のdebian用ドライバをダウンロードする。
(1) IJ Printer Driver Ver.3.40 for Linux
(2) ScanGear MP Ver.1.60 for Linux
ダウンロードしたファイルは、~/Downloadに置かれる。
# IJ Printer Driver のインストール
次のコマンドでインストールを実行する。
`$ tar zxvf cnijfilter-mg6100series-3.40-1-deb.tar.gz`
`$ cd cnijfilter-mg6100series-3.40-1-deb/`
`$ sudo ./install.sh`
libpng12-0およびlibtiff4がないという理由でインストールは失敗する。
## 対策(libpng12-0)
次のPPAサイトで`libpng12-0_1.2.54-1ubuntu1.1+1_ppa0_focal_amd64.deb`を選択して入手する。
http://ppa.launchpad.net/linuxuprising/libpng12/ubuntu/pool/main/libp/libpng/
次のコマンドでインストールする。
`$ sudo dpkg -i libpng12-0_1.2.54-1ubuntu1.1+1_ppa0_focal_amd64.deb`
## 対策(libtiff4)
libtiff4のインストールにはmultiarch-support必要である。次のサイトから入手する。
http://archive.ubuntu.com/ubuntu/pool/main/g/glibc/multiarch-support_2.27-3ubuntu1.2_amd64.deb
次のコマンドでインストールする。
`$ sudo dpkg -i multiarch-support_2.27-3ubuntu1.2_amd64.deb`
続いてlibtiff4をダウンロードする。次のサイトで`libtiff4_3.9.7-2ubuntu1_amd64.deb`を選択して入手する。
http://ftp.ksu.edu.tw/FTP/Linux/ubuntu/pool/universe/t/tiff3/
次のコマンドでインストールする。
`sudo dpkg -i libtiff4_3.9.7-2ubuntu1_amd64.deb`
# IJ Printer Driver の再インストール
再度、インストールコマンドを実行する。
`$ sudo ./install.sh`
エラーが発生しなければ、次の順序で処理が進む。
- プリンターの登録
- 接続方法の選択
- プリンターの選択
- プリンターの登録(プリンターの名前入力)
- 通常使うプリンターに設定
- インストール完了
インストールが完了したら、[設定]-[プリンター]でテストページの印刷ができる。

# ScanGear MP のインストール
次のコマンドでインストールを実行する。
`$ tar zxvf scangearmp-mg6100series-1.60-1-deb.tar.gz`
`$ cd scangearmp-mg6100series-1.60-1-deb/`
`$ sudo ./install.sh`
こちらはlibusb-0.1-4がないという理由でインストールが失敗する。
# 対策(libusb-0.1-4)
通常の手順でlibusb-0.1-4のインストールは可能である。
`$ sudo apt update`
`$ sudo apt install libusb-0.1-4`
# ScanGear MP の再インストール
次のコマンドでインストールを実行する。
`$ sudo ./install.sh`
# 使い方
それぞれドライバを入手したページに、操作説明書(HTML)がある。
使い方はこの操作説明書を参照されたい。
phigasui という文字列を作りたかっただけ Julia 編


私のアカウント名は @phigasui です。

成果物は下記の通りです。

```jl
julia> ((@doc(+).content |> join)[Int(c)] for c="\x1f;\x18S\"8@\x18") |> join
"phigasui"
```

## docstring に頼る

まずは何らかの文字列があればそこから `p`, `h`, `i`, `g`, `a`, `s`, `u` を取り出せれば良いなと思いました。

Julia で文字列ってどこにあったかなーと思って思い出したのが docstring

```jl
julia> @doc +
  +(x, y...)

  Addition operator. x+y+z+... calls this function with all arguments, i.e. +(x, y, z, ...).

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> 1 + 20 + 4
  25

  julia> +(1, 20, 4)
  25

  dt::Date + t::Time -> DateTime

  The addition of a Date with a Time produces a DateTime. The hour, minute, second, and millisecond parts of the Time are used along with the year, month, and day of the Date to create the new DateTime. Non-zero microseconds or nanoseconds in the Time type will
  result in an InexactError being thrown.

```

`@doc` マクロを使うと docstring が得られます。

```jl
julia> @doc(+) |> typeof
Markdown.MD
```

Markdown.MD という Type です。

```jl
mutable struct MD
    content::Vector{Any}
    meta::Dict{Symbol, Any}

    MD(content::AbstractVector, meta::Dict = Dict()) =
        new(content, meta)
end
```

https://github.com/JuliaLang/julia/blob/bb5b98e72a151c41471d8cc14cacb495d647fb7f/stdlib/Markdown/src/parse/parse.jl


content は docstring の文字列の Vector なのでこれを使います。

これを使って `phigasui` の各文字の index をとってきて文字列にすれば良さそうです。

```jl
julia> (findfirst(x->x==c, @doc(+).content |> join) for c="phigasui") .|> Char |>join
"\x1f;\x18S\"8@\x18"
```
無事、`str` docstring から `phigasui` を得るための文字列を得ました。
完成 :tada:

```jl
julia> ((@doc(+).content |> join)[Int(c)] for c="\x1f;\x18S\"8@\x18") |> join
"phigasui"
```

ちなみに Julia では `Char` の Range も使えるのでこんな感じでも

```jl
julia> (findfirst(x->x==c, ['a':'z'...] |> join) for c="phigasui") .|> Char |>join
"\x10\b\t\a\x01\x13\x15\t"
julia> (join(['a':'z'...])[Int(c)] for c="\x10\b\t\a\x01\x13\x15\t") |> join
"phigasui"
```

もっとおもしろいのあったらぜひ教えてください :pray:
【Docker＋Nuxt】Cannot find module 'nuxt_plugin_plugin_*'エラーが発生して画面が立ち上がらない

###発生したエラー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/1396f66e-c094-ea1c-913a-3c86ad7151fe.png)

.nuxt/index.jsでインポートしているモジュールが見つからないっていうエラーのようですね。

###解決
####.nuxtフォルダとnode_modulesフォルダを削除してyarn installを実行

そもそもnode_modulesからdockerビルドの際に.nuxtフォルダにコピーしているっぽいが、どうもそこでモジュールの名前が変わるらしい。

####node_modulesは消していいの？
はい。
package.jsonを消さなければ、yarn installで再度作られます。

####.nuxtは消していいの？
はい。

`docker compose up --build`
をすると`nuxt`コマンドも実行され、そのときに.nuxtがnode_modulesからビルドされるようです。

```console:
// docker coompose up --buildを実行したときのログ
...
nuxt_1  | yarn run v1.22.15
nuxt_1  | $ nuxt
nuxt_1  | ℹ Listening on: http://172.20.0.2:3000/
nuxt_1  | ℹ Preparing project for development
nuxt_1  | ℹ Initial build may take a while
nuxt_1  | ℹ Discovered Components: .nuxt/components/readme.md
nuxt_1  | ✔ Builder initialized
nuxt_1  | ✔ Nuxt files generated //ここで作られているみたいです。
...
```

###まとめ

.nuxtとnode_modulesの整合性の問題で発生するのかな？とりあえずいずれも削除してyarn installで復元というか、生成されるし、そのもとになっているのはpackage.jsonなので依存関係には問題はなさそうというのがわかりました。

ただ、一回目に上記の手順を行ったときにはtsconfig.jsでエラーが発生していましたが、再度同じ手順を行うことでエラーがでなくなりました。なんかビルドがうまく行かなかっただけなのかはわかりませんが、同様のエラーでお困りの方は２，３回実行してもらうと解決するかもしれません。

その他間違いなどありましたらご指摘いただけると助かりますm(__)m
ターミナルやプロンプトで、ワンラインでパスワードを適当に作りたい時のこじれ過ぎたTips

2022年になろうとしているのに、
「登録するWebサービスやソフトウェア・あるいはミドルウェアの都合で、パイプラインで標準出力に加工コンボをキメてパスワードを作る」
機会は地味に多い。例えば；

```shell-session
$ # 例1：時刻を元ネタに、sha256sumを生成した後にbase64でさらにゴマかし、そこから先頭14文字を抽出して小文字化を行って改行記号を加える。
$ date +%s | sha256sum | base64 | head -c 14 | tr '[:upper:]' '[:lower:]' | tr -d '\n' # 改行を最後に加えないと、プロンプトが大変な事になるんよ。
$
$ # 例2：opensslのrandサブコマンドを元ネタに18文字のbase64文字列を作成して小文字変換して改行を加える。
$ openssl rand -base64 18 | tr '[:upper:]' '[:lower:]' | cat # 同じく改行を加える為にcatで代用してみたり。
```
という具合に。

なお『[Friendly Interactive Shell](https://fishshell.com/)』だと；

```shell-session
$ date +%s | sha256sum | base64 | head -c 8 | string lower
$ openssl rand -base64 32 | head -c 10 | string upper
```
という横着ができたりする：
* [string-lowerコマンド](https://fishshell.com/docs/current/cmds/string-lower.html)
* [string-upperコマンド](https://fishshell.com/docs/current/cmds/string-upper.html)

Windowsの皆さんも安心して頂きたい。PowerShellでもキメれる：
[PowerShellでパスワード生成](https://qiita.com/Takeru/items/da17c8ae9122bca6f2d4)

「Webブラウザ内蔵のパスワード生成と保存機能」
だと要求されているパスワードの条件が成り立たせれない時の隠し玉として備えておいて損は無いかもしれない。

# ネタ元
* [Bashで変数を大文字小文字変換(uppercase/lowercase)する](https://qiita.com/kawaz/items/211266021515b3f033a3)
  * [bashで大文字/小文字の変換](https://qiita.com/myy/items/782deb8347ac58f0d6a1)：上項で用いられているBashよりも古いBashしか手元に無い時に
* [How-To-Geekの「ワンライナーでパスワード生成10本」](https://www.howtogeek.com/howto/30184/10-ways-to-generate-a-random-password-from-the-command-line/)
* [シェルスクリプトの中でjoin()とsplit()相当の事をやる](https://qiita.com/piroor/items/55ff672cb9f8e375e659)：`tr` コマンドのもう少し込み入った使い方

# おまけ
コピペで横着したいが *スクリプトキディから脱却したい* という方は、`tr` コマンドを更に組み合わせて『[Leet](https://ja.wikipedia.org/wiki/Leet)』記法を混入させたら面白いかもしれん。例：

```shell-session
$ date +%s | sha256sum | base64 | head -c 14 | tr 'A' '4' | tr 'B' '8' | tr '[:upper:]' '[:lower:]' | 
```

本音を言うなら、パスワードには一片の詩でも綴って置きたいものだが。そんな心情を求められる機会もそうそう無い。
情報処理学会から2021年に出版されたBitVisor関連論文

この記事は[BitVisor Advent Calendar 2021](https://qiita.com/advent-calendar/2021/bitvisor)の23日目の記事です．

BitVisorに関する研究成果のうち一定以上のレベルにあるものは基本的には英語の論文で発表されると思います．よって，英語の論文だけ読んでおけば十分で，日本語の論文は読まない，という人も多いと思います．

でも私は，日本語文献には怪しげでトンガったものが多くあるので，それらを読むのは，少なくともfunではあると思っています．

BitVisorに関する日本語の論文の多くは情報処理学会から出版されています．もちろん電子情報通信学会や日本ソフトウェア科学会などの他の学会からも出版されています．

今回は情報処理学会から2021年に出版されたBitVisor関連論文を調べてみました．ここでは「関連論文」は，「情報処理学会の電子図書館でBitVisorという単語で検索して出てくる論文」という意味です．こんな感じで検索できます．

![bitvisor-search-result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/f1cd2ec5-7e8a-2c7f-b4fc-fd361e91a28e.jpeg)

同じ論文の重複出現を削ると，計10本かな．BitVisor関連論文はまだまだ出続けています．

1. [Windowsにおけるスレッド挿入の起点ファイル情報伝播による長期証拠保全](http://doi.org/10.20729/00214232)
田中 大樹，川古谷 裕平，岩村 誠，鄭 俊俊，毛利 公一．
情報処理学会論文誌 62(12)．

1. [マルウェア解析のための高速かつ安全なVMI機構](http://id.nii.ac.jp/1001/00214033/)
森 瑞穂，味曽野 雅史，八巻 隼人，三輪 忍，本多 弘樹，品川 高廣．
コンピュータシステム・シンポジウム論文集．

1. [深層学習によるディスクアクセスパターンを用いたランサムウェア検知システム](http://id.nii.ac.jp/1001/00214445/)
程田 凌羽，平野 学，小林 良太郎．
コンピュータセキュリティシンポジウム2021論文集．

1. [SleepHop: 動的バイナリ計装によるマルウェアのタイミング攻撃の無効化](http://id.nii.ac.jp/1001/00214430/)
鈴木 克弥，大山 恵弘．
コンピュータセキュリティシンポジウム2021論文集．

1. [AMD SEVを用いてメモリが暗号化されたVMに対するIDSオフロード](http://id.nii.ac.jp/1001/00211754/)
能野 智玄，光来 健一．
研究報告システムソフトウェアとオペレーティング・システム（OS）2021-OS-153．

1. [動的解析システムのネットワーク接続の有無によるマルウェア検知精度の比較](http://id.nii.ac.jp/1001/00210048/)
梶原 友希，鄭 俊俊，毛利 公一．
研究報告コンピュータセキュリティ（CSEC）2021-CSEC-92．

1. [ストレージアクセスパターンを用いた機械学習によるランサムウェア判別システムの精度向上に関する考察](http://id.nii.ac.jp/1001/00210047/)
程田 凌羽，平野 学，小林 良太郎．
研究報告コンピュータセキュリティ（CSEC）2021-CSEC-92．

1. [準パススルー型ハイパーバイザによるメモリデータ収集機能の性能改善と評価](http://id.nii.ac.jp/1001/00210041/)
大森 貴通，水野 広基，牧原 京佑，平野 学，小林 良太郎．
研究報告コンピュータセキュリティ（CSEC）2021-CSEC-92．

1. [Unikernelを用いたコンテナのためのハイパーバイザによる軽量高セキュアな実行基盤の検討](http://id.nii.ac.jp/1001/00209630/)
肥沼 健，並木 美太郎．
研究報告システムソフトウェアとオペレーティング・システム（OS）2021-OS-151．

1. [Lua言語処理系を組み込んだハイパーバイザによる柔軟で高セキュアなSDN基盤](http://id.nii.ac.jp/1001/00209629/)
尾内 智哉，並木 美太郎．
研究報告システムソフトウェアとオペレーティング・システム（OS）2021-OS-151．

BitVisorについてはさらっと触れているだけでほとんど関連していない論文もヒットしていますが，大半はBitVisorにかなり関連した論文のように思えます．どれもおもしろそうなタイトルなので，いずれヒマをみて読みたいなと思っています．「論文読む時間なんて，まったく取れないよ！」という人は，アブストラクトだけでもざっと眺めてみると，もし運や相性がよければ，「世の中にはおもしろいことやっている人がいるな，ぶっ飛んだやつがいるな」と心が和むかもしれません．
AWS Organizations OUとは何だ

AWSの勉強をしているため、わからなかった言葉をまとめておく。

## AWS Organizations　OUとは
OUとは、``Organizational Unit``の略らしい。

Organizationsとは　＝　組織の意味で、要するにOUはその組織の中の部署のことなどをいうらしい。
OU1とかOU2とかでおそらく、OU1 = 営業部、OU2 ＝　システム部みたいな分け方をするんだと思う。


まぁ多分要するに、``組織の中でさらに組織を分けて権限を分割したい時``にこのOUを作成するみたいですね。
2022年のベクトルタイルについて考える

これは[ベクトルタイル Advent Calendar 2021](https://qiita.com/advent-calendar/2021/vt)の25日目の記事です。

# 2022年のベクトルタイルは自律分散協調
[ベクトルタイル Advent Calendar 2021](https://qiita.com/advent-calendar/2021/vt)に貢献された皆様、素晴らしい貢献を尊敬します。それぞれ素晴らしい内容だと思います。当初、私は本日のエントリーで、皆様のエントリをレビューしようかと思っていました。今は、それは大それたことであると理解しています。読者の皆様、ぜひ一つ一つのエントリをチェックいただければと思います。

2022年のベクトルタイルは、誰か一人の個人が予測できるものではありません。自律分散協調の原則に従って、発展していくものと思います。

# 私は何をするのか
それはそれとして、私は何をするのでしょうか。私は当座、時間が見つかれば、次のことをしようと思っています。なお、私のアイディアを用いて先回りいただくのは歓迎します！

## 1. かわいい地図を Charites で実装する
[ウェブ地図の多様性と、ベクトルタイルで人を助けること](https://qiita.com/hfu/items/c0c496edc07beabdd22c)で記載した通りの特性を持つ、かわいい地図を Charites で実装してみたいと思っています。

## 2. 英国オードナンスサーベイのベクトルタイルを Raspberry Pi でホストする
英国オードナンスサーベイは、グレートブリテン島をカバーするベクトルタイル　[OS Open Zoomstack](https://osdatahub.os.uk/downloads/open/OpenZoomstack) を mbtiles 形式のオープンデータとして配布しています。これを Raspberry Pi でさっくりホストしてみたいと思っています。

これまではサーバを Node.js で書いてみていました。今回、勘を取り戻す目的で、Ruby の sinatra と sqlite3 でサーバを書いてみたいなと思っています。このアドベントカレンダーにも、[地理院ベクトルタイルを mbtiles にダウンロード・差分更新できるツール](https://blog.geolonia.com/2021/12/16/gsi-japan-vector-tiles-to-mbtiles.html)という素晴らしいエントリがありました。 mbtiles という形式は、2022年にも、「枯れたフォーマット」として生き延びていくのではないかと私は考えています。

## 3. スウェーデンの CC0 ポイントクラウドデータをボクセルタイルにする
日本政府内の建設的な動きや、FOSS4G 2021 Japan Online での素晴らしいワークショップ、そして地理院地図ファンクラブのおかげで、2021年はボクセルタイルの仕事が進捗しました。

地図アートの文脈の干渉色カラースキームと合流してからの動きは非常に劇的だったと思っています。

https://optgeo.github.io/cudi/#17/35.153547/138.779079/34.7/60

https://github.com/optgeo/cudi はパブリック・テンプレート・リポジトリになっており、ここから新しい可視化が進めば嬉しいと思っています。

加えて、青山学院大学における　UNVT Hackathon 及び UNVT Meetup でもボクセルタイルの素晴らしい仕事がありました。

https://furuhashilab.github.io/UNVT_Hackathon_Drone/#17.01/35.567289/139.403212/16.8/49

この技術は、日本という領域特有のものではなく、グローバルな普遍性がある技術です。

スウェーデンの地理空間情報当局は、ポイントクラウドデータを CC0 のオープンデータとして提供しておられます。このデータをボクセルタイルにして、Raspberry Pi でホストしてみたいと思っています。

## 4. デンマーク住所データのベクトルタイルを作る
これは初歩的な作業になりますが、デンマークの住所データについてベクトルタイルを作ると、色々と解るべきことがわかる気がします。

https://github.com/openaddresses/openaddresses/blob/master/sources/dk/countrywide.json
によれば、
http://dawa.aws.dk/adresser?format=csv
にそのデータがあります。なお、上記の URL を踏むと、いきなりダウンロードが開始されるようなので注意が必要かもしれません。

# 2021-01-19 SDGs「行動の10年」のためのワークショップ
2021-01-19 には、[Workshop on Geospatial DRR for Decade of Action (Day 2) - UN-GGIM WG-Disasters TG-B meeting](https://ggim-exercise.github.io/decade2/)を開催予定です。これは、[Geospatial Capacity Development Conference on GNSS applications and DRR](https://gcdc.gsi.go.jp/)の一部となっています。

このワークショップのコンセプトノートの要所を整理してみましたので、最後に共有させていただきます。

![ 2021-12-25 20.13.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/912ca5ed-6828-c41a-fff7-d1082fa96ff9.jpeg)

このコンセプトノートの第一、第二段落の翻訳は[ウェブ地図の多様性と、ベクトルタイルで人を助けること](https://qiita.com/hfu/items/c0c496edc07beabdd22c)に記載しています。

2022年には、ベクトルタイルがこれまで以上に当たり前の技術になり、ウェブの一部としてさまざまな価値を生み出しているようになると思っており、私もその歴史の流れに参加していきたいと思っています。引き続きよろしくお願いします。
Autify for Web の GitHub Actions を作って Marketplace にリリースしました

＊[Autify アドベントカレンダー2021](https://qiita.com/advent-calendar/2021/autify) の25日目の記事です。

今回は Autify for Web 上のテストプランを簡単に実行することができる GitHub Actions を作り Marketplace に公開したので利用方法、利用例についてご紹介します。

https://github.com/marketplace/actions/autify-for-web-run-test-plan

## 使用方法

### 前提条件

1. Autify for Web アカウント
1. パーソナルアクセストークン ([発行方法](https://autify.zendesk.com/hc/ja/articles/4406464965913))
1. テストプラン ID

### Autify for Web Run Test Plan を使う

まず Autify for Web のテストプランを実行したい GitHub Actions のワークフローを持つレポジトリを選択してください。レポジトリの `Settings > Secrets` に `AUTIFY_FOR_WEB_API_TOKEN` という名前でパーソナルアクセストークンを保存してください。

そしたらテストプランを実行したいワークフローに以下のステップを追加してください：

```yaml
- name: Funtional test
  id: functional-test
  uses: autifyhq/web-run-test-plan-action@v1.0.0
  with:
    autify_for_web_api_token: ${{ secrets.AUTIFY_FOR_WEB_API_TOKEN }}
    test_plan_id: 123 # 実行したいテストプランの ID を指定
```

これでこのステップが実行される際に、Autify for Web 上でテストプラン(ID : 123)が実行されます。

## 利用例

現在 Autify では CircleCI を利用しているのでそこで行っていることを GitHub Actions 版にして紹介します。Cicle CIでの利用方法を説明した別記事（[Advent Calendar駆動開発でAutifyのCircleCI Orbを作りました](https://qiita.com/doublemarket/items/fba6bd3aac0f114bacd2))があるのでまずそれを引用します。

> 1. 開発者が、フィーチャーブランチあるいはdevelopブランチをビルドしステージングにデプロイするジョブを開始(CircleCIのtype: approvalジョブを使い、手動で承認した場合にのみこの処理を行う一連のジョブが走る仕組み)
> 2. ビルド
> 3. デプロイ
> 4. Autify for WebのAPIをcurlで叩きリグレッションテストのテストプランを起動(この部分をOrbに置き換え)
> 5. その際のレスポンスにテスト結果のURLが含まれるので、これをパースした上でSlackに投稿

```yml
jobs:
  build-and-test:
    runs-on: ubuntu-latest
      - uses: actions/checkout@v2

      # Autify for Webでテストプランを実行
      # ここで steps.functional-test.outputs.response に API レスポンスが保存される
      - name: Run funtional test
        id: functional-test
        uses: autifyhq/web-run-test-plan-action@v1.0.0
        with:
          autify_for_web_api_token: ${{ secrets.AUTIFY_FOR_WEB_API_TOKEN }}
          test_plan_id: 123
      
      # 前のステップで保存されたファイルからテスト結果のIDを取得し、URLを組み立て
      - name: Get the test plan result URL
        id: get-test-plan-result-url
        run: >
          AUTIFY_TEST_PLAN_BASE_URL=https://app.autify.com/projects/xyz/results/
          
          test_plan_result_id=$(echo ${{ steps.functional-test.outputs.response }} | jq -r .data.id)
          test_plan_result_url="${AUTIFY_TEST_PLAN_BASE_URL}${test_plan_result_id}"
          echo '::set-output name=value::${test_plan_result_url}'

      - name: Post to a Slack channel
        id: slack
        uses: slackapi/slack-github-action@v1.16.0
        with:
          channel-id: 'CHANNEL_ID'  # Slack channel id or user id to post message. 
          slack-message: "Regression tests: ${{ steps.get-test-plan-result-url.outputs.value }}" 
        env:
          SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
```


## 最後に

今回の Action でより簡単にCI/CDのパイプラインに Autify を導入できそれぞれのポイントで自動でテストを実行し、自信をもってアプリケーションを開発・運用することをお手伝いができればと思います。引き続きこの Action の改善と Autify for Mobile の方でも Action を公開します。

リポジトリは公開していますのでいつでも Pull Request お待ちしております。
- https://github.com/autifyhq/web-run-test-plan-action
ES2022を使ってCustom Elementを書く

ES2022でクラス周りの構文が強化されたため、Custom Elementが書きやすくなっています。

## class private field

クラスにprivateフィールドを作成できる機能です。

この機能は、Custom Element内でShadow DOMを使う時に効果を発揮します。
Shadow DOMは`element.attachShadow`という関数を使用して作成するのですが、生成したshadow DOMへの参照を隠蔽するのは従来は困難でした。

```ts:従来
class FooElement extends HTMLElement {
  connectedCallback() {
    // shadow DOMを隠蔽するには `mode: "closed"` にする
    this._shadow = this.attachShadow({ mode: "closed" });
    this._shadow.appendChild(document.createElement("div"));
  }
}

// `mode: "closed"`にしたにもかかわらず、shadow domにアクセスできてしまう
new FooElement()._shadow
```

アンダースコア始まりの疑似privateを使っている場合、クラスの外部からもアクセスできてしまうため、shadow DOMへの参照は隠蔽できません。
もし完全にshadow DOMへの参照を隠蔽したい場合は、全体を即時関数で囲ったうえでWeakMapに参照を保存する等の努力が必要でした。そのため、closed modeでshadow DOMを作成する価値はないという意見もありました（参考：[こちらのブログ記事(英語)](https://blog.revillweb.com/open-vs-closed-shadow-dom-9f3d7427d1af)）。

しかし、ES2022で導入されたprivateフィールドを使うと、shadow DOMへの参照を外部から隠蔽することができます。

```ts:ES2022
class FooElement extends HTMLElement {
  #shadow // private fieldを使ってshadow DOMへの参照を保持
  connectedCallback() {
    this.#shadow = this.attachShadow({ mode: "closed" });
    this.#shadow.appendChild(document.createElement("div"));
  }
}

new FooElement().#shadow // エラー（shadow domにアクセスできない）
```

このように、**privateフィールドとshadow DOMを組み合わせることで、custom elementのより強いカプセル化が可能**になりました。

## class static block

custom elementを作成するには、作成したcustom element用クラスを`customElement.define`関数で登録する必要があります。

```ts:customElement.defineの使い方（従来）
// custom element用クラスの定義
class FooElement extends HTMLElement {
  // 省略
}

// custom element用クラスを登録
customElements.define("foo-element", FooElement);
```

これまでは上のように、`customElements.define`はクラスの外側に書くしかありませんでしたが、ES2022で導入された**class static blockを使うとクラスの内側に書くことができます**。


```ts:customElement.define+class-static-block
// custom element用クラスの定義
class FooElement extends HTMLElement {
  static {
    customElements.define("foo-element", this);
  }
  // 省略
}
```

`static {}`という部分の中身が、クラスの初期化時に実行されるため、`customElements.define`の実行に使えるというわけです。

## まとめ

- Custom Elementには普通のプロパティやメソッドだけでなく、privateなプロパティやメソッドも設定できる
  - privateプロパティにshadow DOMへの参照を保存すると、外部からshadow DOMへのアクセスを遮断できる（※）
- class static block内で`customElements.define`を実行できる

（※）ちなみに、private propertyにすれば完全にshadow DOMへのアクセスを防げるというわけではなく、以下のようなコードを挿入されると外部からshadow DOMへアクセスすることが可能になってしまいます。

```ts
const originalAttachShadow = Element.prototype.attachShadow;
Element.prototype.attachShadow = function() {
  return originalAttachShadow.call(this, { mode: "open" });
};
```

なので、完全なprivate化ができるわけではないという事に注意してください。
自社の「ワンデー仕事体験」プログラムを作成した話

今年度、社内チームメンバーと協力して自社の「ワンデー仕事体験」のプログラムを作成しました！
この記事では、活動してきたことや完成したプログラムの概要について説明します。

# 1. 作成の経緯
きっかけとして、お偉方より「サーバ構築とかネットワーク構築のようなインフラ寄りのインターンシップって面白そうじゃない？」というお言葉をいただいたことから、企画の検討が始まりました。

どういった学生に来て欲しいかを考えた結果、
ターゲット層は、理工学系でITインフラに興味を持っている学生と定めました。

プログラムの内容については、
サーバ構築などをやってもらうだけだと、単純すぎてあまり面白みがないため、
どうせなら楽しく学べるものにしよう！という考えのもと検討を進めていきました。

# 2. 企画段階(2020年度)で設計した内容
「ハッキング」をテーマとしたプログラムを作ることに決定し、昨年度のエニプラアワードにて企画案として発表しました。
書籍「ハッキング・ラボのつくりかた」で解説されている内容をもとにして、
ハッキングするための環境やハッキング手順をまとめていきました。

* 企画のコンセプト
    * ITインフラの面白さを学生に伝える
    * セキュリティの大切さを学生に伝える
    * 自社の魅力を学生に伝える
* 実施内容として設計したもの
    * キーロガー取得し、パスワードを読み取って不正にログインを行う
    * コマンドプロンプト操作し、動画を再生させる
    * レジストリ変更し、壁紙を変更する
    * 各ハッキング手順に対してのセキュリティ対策の解説
  
# 3. 打ち合わせを進める中で出た課題
今年の1月から、2020年度に設計した内容をもとに準備を行い、7月ごろに社内でのリハーサル・社外の方への説明を進めました。
進めていく中で、色々と課題が見えてきました。

* 見えてきた課題
    * ハッキングすることに特化し過ぎてしまい、仕事体験としてみると微妙...
    * ハッキングとインフラエンジニアの仕事との結びつきが伝わりにくい...
    * 学生同士でコミュニケーションを取れる時間が少ない...

「実施して楽しいもの」「独創的なもの」にこだわった結果、
仕事体験として実施するのは微妙な内容となってしまっていました。
これを何とかするため、再度検討を行いました。

# 4. 最終的に決定した内容
最終的に
**サイバーセキュリティを通してインフラエンジニアを知る！**をテーマとして、実施する内容を決定しました。
今年11月から採用活動として始動しています。

* 実施内容の概要
    * ハッキング体験
    * セキュリティ対策の方法について学ぶ　(グループワーク)
    * インフラエンジニアのお仕事について学ぶ　(グループワーク)

# 5. まとめ
チームメンバーの協力もあり、無事に「ワンデー仕事体験」として始動することができました。
今年度は11月～2月にかけて実施予定で、予約受付中です。
現在は学生アンケートでいただいた意見をもとに、来年度の実施に向けた準備中です。
dockerを使ってno space left on deviceとなったときの対処法

## no space left on device の原因
ディスク容量が足りていない。Dockerを使っているときはDockerのDisk image sizeが決まっていてそれを超えている。

## 解決策
### 1. いらないコンテナやイメージを削除する
Docker用のディスクが足りなくなっているのでいらないものを削除する。

※イメージやコンテナを削除するときは十分注意する。

- 使っていないイメージを削除する: `docker image prune -a`
- 使っていないコンテナを削除する: `docker container prune`

### 2. ディスク容量を増やす
Docker --> Preferences --> Resources から Disk image sizeを変更できる。

こっちの方が簡単。
OpenProcessing をお手軽ミニゲーム作成プラットフォームとして使う

# はじめに
バーチャルツール開発者の小栗さえと申します。
Vtuberや配信者、VRユーザー向けのツールを開発したりしています。

# OpenProcessing とは
OpenProcessing は、誰でも簡単にprocessing.jsやp5.jsなどの画像処理ライブラリを使ったグラフィカルなアプリケーションを作成、公開できるプラットフォームです。作品にはライセンスを設定でき、他人の作品をフォークしてアレンジしたアプリケーションを作ることも簡単にできます。

本記事は上記の**『他人の作品をフォークしてアレンジしたアプリケーションを作れる』**機能を活用し、Vtuberの方に**自分の画像素材を適用したミニゲーム**を作ってもらうことを目標にします。

https://twitter.com/OkuriSae/status/1464550427228131329?s=20

# サンプルゲームの作成
まずはサンプルアプリケーションをつくります。
三角関数とか幾何学的な衝突判定とか全くわからないですが、**似たようなミニゲーム作品などはOpenProcessing内の検索でたくさん見つかる**しコードも見れるので、見よう見まねで作っていきます。（そのまま使えそうならフォークしてもいいのかも）

https://openprocessing.org/sketch/1369738

少しわかりにくいですが右側のメニューからファイルをアップロードできます。
ここをテンプレっぽくしておき、フォークしてここの画像を入れ替えてもらうような想定にしておきます。解像度や画角が多様だと思いますので、考慮しておくとよさそうです。

サンプル画像としては、ニコニコモンズでボカロ/ボ色系の立ち絵などで探すとフリーで使えそうなイラストがお借りできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525963/5f5425b3-5657-53e9-2b07-cda7b566a383.png)

サンプル作品ができたらSaveして自分の作品として登録します。
サムネイルの設定や、ライセンスの設定などをしておきます。（デフォルトは CC BY-NC-SA 3.0 っぽいので注意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525963/fd33d94f-3aa4-7304-b078-af70c2f9670b.png)

# マニュアル作成と宣伝
あとは宣伝するだけです。
作品のフォークの仕方や画像差し替えの仕方などをマニュアル化し、完成イメージ（動画にしておくとGood）と共に告知します。

[note: 5分でできるブロック崩しの作り方](https://note.com/okurisae/n/n4fd097ae700b)
[告知ツイート](https://twitter.com/OkuriSae/status/1464550427228131329?s=20)

# 実際に使われたのか
フォーク一覧から見ることができるので便利！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525963/13a38989-4147-9d2b-39bc-147b43de5d8d.png)

#さいごに
フォークしてSaveするだけで個別のURLが発行されサムネのOGPなども設定されるので、かなりポテンシャルがある開発方法なのかなと思いました。ミニゲーム以外にも動画素材や配信サポートツールなどでも使えそうでした。
Vtuber にミニゲームを作ってもらうようなアプローチの仕方はまだまだ新鮮かと思いますので、是非チャレンジしていただければ幸いです！

参考：Vtuberロゴを表示させるアニメーション作品
https://openprocessing.org/sketch/739574
async/awaitなしでジェネレータをコルーチン的に動作させる

Pythonでコーディングしていると、簡単な状態機械の実装など、たまに関数にコルーチン的な動作をしてほしくなるときがある。ただasync/awaitとかイベント駆動の仕組みをいちいち書きたくない場合も多い。

そんな時に、ジェネレータの`yield`文を使って値をやり取りすることで、イベント駆動の仕組みを作らなくても逐次的に関数（というかジェネレータ）と値をやり取りすることができるようになる。

## ポイント

1. ジェネレータとして問題のルーチンを定義する
   - 内部的には`yield`文で値を返し、その返り値として値を受け取る。
1. ジェネレータに対して`iter()`でイテレータを生成する。
   - イテレータの`send()`メソッドで値を渡しつつ、その返り値としてジェネレータからの値を受け取る。
   - `send()`メソッドを使い始める前に、**一度だけ**`next()`を呼んでジェネレータを「起動」しないといけない。

## サンプル

```python
>>> def shifter():
...   # 一度next()を呼び出すことで、以下のルーチンが始まる。
...
...   # 呼び出し側からの最初のsend()メソッドで、状態の値を初期化
...   state = yield
...   while state is not None:
...      # 現在のstateの値を呼び出し側に返す。
...      # 呼び出し側はsend()で次のstateの値を入力できる
...      state = yield state
...   # send()でNoneを入力するかnext()を用いることで
...   # yield文の返り値はNoneになる
...
...   # 終了時の処理
...   yield "done"
...
>>> gshift = iter(shifter()) # ジェネレータからイテレータを生成。この状態ではまだ「起動」されていない
>>> next(gshift) # これで初めてジェネレータが起動する
#（ジェネレータ側の処理は、関数定義の5行目の`state = yield`のところで停止した状態）

# 次の呼び出しでsend()を用いることで5行目の`state = yield`に処理が戻る
# whileループの中の`state = yield state`のところで、現在のstateの値とともに処理が呼び出し側に返る
>>> gshift.send(0)
0 # 入力した`0`が返ってきた

>>> gshift.send(1)
1

>>> gshift.send('Hello')
'Hello'

>>> gshift.send(None) # next(gshift) でも同じことができる
'done' # 最後のyieldの値が返ってきた

# この段階で、ジェネレータの処理はすでに終了している
# この後にnext()やsend()を呼んでも、StopIterationが送出されるだけ
```
GPUを使うdocker-compose.ymlの例

version: 2.3を最初につけて、みたいに使っていたdocker-compose.ymlがいつの間にか使えなくなっていたので、動くものを書きました。

以下の中で、 `NAME`, `CONTAINER_NAME`, `WORKSPACE`, `DATA`あたりが変数です。適宜書き換えてください。


```docker-compose.yml
services:
  NAME:
    image: CONTAINER_NAME
    command: /bin/bash
    shm_size: 16gb
    tty: true
    volumes:
      - .:/root/WORKSPACE
      - ~/DATA:/root/DATA
    working_dir: /root/WORKSPACE
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            device_ids: ['0']
            capabilities: [gpu]
```

```cli
$ docker-compose up -d
$ docker-compose exec NAME /bin/bash
```
コメントすべきこととコメントすべきで「ない」こと

本記事は、コーディングする時に、「コメントする？しない？」という議論について投稿者の考えを綴った記事になります。

[以前の記事(可読性について)](https://qiita.com/tak001/items/0342098a182f8cc6559e#%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%881)で、リーダブルコードの内容をまとめた時に、コメントを「残すべきこと」とコメントを「すべきでない」ことについて記述しておりましたが、今回はその深堀をしていきたいと思います。

# はじめに
まず投稿者の考えの大前提として、「絶対にこれが正しい」はないと思っています。

その現場によって **それぞれベストが違う** からです。

ただ、コメントを「残す」か「残さないか」で議論になった時に、
1つの考え方の基準になればなと思います。

# コメントを残すことのメリットについて
投稿者自身、コメントを残すことは自体は肯定的です。

コメントを残すことで、以下のメリットがあると感じているからです。

- 書き手の意図を読み手に知らせる
- コードを書いている本人の頭の中の大切な情報を、読み手に伝えることができる
- コードからは読み取れない「背景」や「経緯」を読み手に伝えることができる

大きなプロジェクトになればなるほどこれらの恩恵は大きく、
新規メンバーもキャッチアップしやすくなります。

ただし、なんでもかんでも全てコメントを残すべきか？と問われると、
**わかりきっていることに対してのコメントは逆に可読性を下げるだけ** です。

なので、「その前にやるべきことがちゃんとできているか」という観点が必要だと思います。

# コメントを残す前にやるべきこととは？
では、コメントを残す前にやるべきこととは何か？ですが、
投稿者が思う「やるべきこと」は以下の通りです。

- 適切な命名がなされているか
- 命名以上の責務を行なっていないか
    - 命名で悩んでしまう場合、正しい責務でないケースが多々あります
- ループとロジックが単純化されているか

つまり、 大前提として **コード自体が読みやすいこと** であり、
*ひどいコードを補うためのコメント* は **コード自体をみなおそう** ということです。

# 不吉なにおいのするコードはプロジェクト全体をゆっくりと腐らせていく
いわゆる **不吉なにおい** のするコードを残したまま、
コメントで補うことは本末転倒でありプロジェクト全体をゆっくりと腐らせてしまいます。

- ロジックが複雑すぎてバグの温床となる
- 機能拡張しようとすると至る箇所でバグが発生してしまう
- 新規メンバーが安易に触れないコードになってしまう

上記のような地獄の連鎖が始まってしまいます。

テストコードがあればまだましですが、
なければストレスフルな日々があなたの目の前にやってくることでしょう。

そうならないためにも、
日頃からより良いコードを書いて積み上げる必要があります。

# リーダブルコードのススメ
では、良いコードとは？ですが細かくあげるとキリがないので、
まずは[「リーダブルコード」](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?adgrpid=104281542946&gclid=CjwKCAiAn5uOBhADEiwA_pZwcJvZGk1i-vD2veCQ5ylD4RJkEoZXU77yC8pN6RqgM1xrt2chp2tNuhoCnWwQAvD_BwE&hvadid=553864827969&hvdev=c&hvlocphy=1009565&hvnetw=g&hvqmt=e&hvrand=11555879316100580815&hvtargid=kwd-334758528225&hydadcr=27298_14478913&jp-ad-ap=0&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB+%E3%82%B3%E3%83%BC%E3%83%89&qid=1640425130&sr=8-1)をオススメいたします。

投稿者の思いとして、
プログラミングをされるのであれば全員に熟読して頂きたい書籍です。

内容としては初歩的な内容なのですが、
プログラミングする上で大切なエッセンスが詰まっています。

# 最後に
以上、投稿者のコメントに対する所感を述べさせて頂きました。

冒頭にて申しましたがそれぞれのベストがあると思いますので、
あくまで1つの観点として受け止めていただければと思います。

ご拝読ありがとうございました。
Ubuntu + Steam + Proton でStreet Fighter V

# 起動しない
以下のメッセージのポップアップが表示される。

```
dx11 feature level 10.0 is required to run the engine
```

# driverを入れる
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_network

## nvidia-smi
```
$ nvidia-smi
Sat Dec 25 12:31:12 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 495.29.05    Driver Version: 495.29.05    CUDA Version: 11.5     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:0B:00.0 Off |                  N/A |
| 25%   46C    P0     1W / 215W |      0MiB /  7979MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+


```


# Driverを更新
```
sudo add-apt-repository ppa:oibaf/graphics-drivers
sudo apt update
sudo apt upgrade
```

# Steam -> Settings
## Steam Play
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/8dc86ac4-b2b6-3bee-6cae-00271a6de29f.png)

# SFV 起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/7b873123-1dd2-9137-59a7-32c1b50f942a.png)

# 無事起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/422fb23c-5b32-4f6c-7181-cdb529f1ce3b.png)

# 使用感
とりあえず、１時間ほどプレイして、LP2000に。
(2022/2/19追記)LP16000に。垂直同期は切り方があるので、Ubuntuでも同様に可能。

# 垂直動機
```
nvidia-settings
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/86329b3b-48d7-545b-1a31-a201e1764d47.png)

Sync to VBlankをオフにすればいける？


## 環境
|-|-|
|:---|:----|
|CPU|AMD Ryzen 9 3950X 16-Core Processor|
|GPU|GeForce RTX 2070 SUPER|
|Monitor|144Hzリフレッシュレート|
|LAN| 有線（NURO）|

ラグないです。

# トラブルシューティング
## 画面が小さくなる
HDMIケーブル変換器経由だとおかしくなったことがあり、直接接続だと改善する

## nvidia-smiが効かない
消して入れ直す。
```console
sudo apt-get --purge remove nvidia-*
sudo apt-get --purge remove cuda-*
```
【react-hook-form】TypeError: path.split is not a function in reactのエラー対応

#react-hoook-form

react-hook-form ライブラリを使用時に下記のようなエラーがでたので、その解決方法を記述する

TypeError: path split is not a function


##原因
react-hook-form 6と7のバージョン違いによる書き方の違いらしい?↓

参考 [stackoverflow](https://stackoverflow.com/questions/66927051/getting-uncaught-typeerror-path-split-is-not-a-function-in-react "Qiita Home")



react-hook-form updated to 7.0.0 from 6.X.X and has breaking changes:

You have to replace all ref={register} with {...register('value_name')}


##具体例

バージョン

```
"react-hook-form": "^7.22.5",
```


エラーバージョン

```
<div className={styles.root}>
      <form onSubmit={handleSubmit(handleCreate)} className={styles.form}>
        <TextField
          id="outlined-basic"
          label="New Task"
          variant="outlined"
          inputRef={register} //←エラー
          name="taskTitle"
          className={styles.text_field}
        />
      </form>
    </div>
```


変更後

```
<div className={styles.root}>
      <form onSubmit={handleSubmit(handleCreate)} className={styles.form}>
        <TextField
          id="outlined-basic"
          label="New Task"
          variant="outlined"
           {...register('taskTitle')}  //変更後
          name="taskTitle"
          className={styles.text_field}
        />
      </form>
    </div>
```
viコマンドでよく使う操作

viコマンドでファイルを編集するときによく使う操作をまとめます。

# ファイルを開く
```
vi ファイル名
```
# モード変更
困ったらとりあえず[esc]キーを押しましょう。

| キー操作 | 動作 | 補足 |
|:------------:|:------------:|:------------:|
| a   | 入力モードに切り替えます。      | カーソルの1つ右から入力開始します。         |
| esc | コマンドモードに切り替えます。      |       |

# ファイルを保存する・閉じる
コマンドモードの状態([esc]キーを押した後)で、以下の操作を行えます。

| キー操作 | 動作 | 補足 |
|:------------:|:------------:|:------------:|
| ZZ  | 上書き保存して終了する。 | [Shift]を押しながら[z]を2回押す     |
| :w  | 上書き保存する。終了しないので、そのまま編集を続けられます。      | [:]→[w]→[enter]を押す       |
| :q! | 保存せずに終了する。     | [:]→[q]→[!]→[enter]を押す         |

# 行ごとの操作
コマンドモードの状態([esc]キーを押した後)で、以下の操作を行えます。

| キー操作 | 動作 | 補足 |
|:----------:|:-----------:|:------------:|
| yy      | 1行コピー        |          |
| 行数yy  | 指定行数コピー      |        |
| dd      | 1行削除        |          |
| 行数dd  | 指定行数削除          |           |
| p       | カーソルの一行下にペースト       | yyだけでなくddしたものもペーストできます。       |

:::note info
異なるファイル間でコピー&ペーストしたいときは、
ファイル1を開いてyyでコピーしてファイルを閉じる→そのあとにファイル2を開いてpでペーストする
:::

# 文字ごとの動作
コマンドモードの状態([esc]キーを押した後)で、以下の操作を行えます。

| キー操作 | 動作 |
|:----------:|:-----------:|
| x       | 一文字削除     |


# 元に戻す
コマンドモードの状態([esc]キーを押した後)で、
[u]を押せば1つ元の状態に戻せます。

# 文字列検索
コマンドモードの状態([esc]キーを押した後)で、

```
/検索したい文字列
```

で[enter]を押せば、文字列を検索できます。
そのあとに[n]をポンポン押せば、どんどん次の該当位置に移動できます。

# 行番号
コマンドモードの状態([esc]キーを押した後)で、

```
:set number
```
で[enter]を押せば、左側に行番号を表示できます。

# カーソル移動(その１)
コマンドモードの状態([esc]キーを押した後)で、以下の操作を行えます。

| キー操作 | 動作 | 補足 |
|:----------:|:-----------:|:------------:|
| G       | ファイルのいちばん下に移動する。        | [Shift]を押しながら[g]を押す         |
| :行番号     | 該当の行番号の行に移動する。      | [:]→行番号→[enter]を押す       |

# カーソル移動(その２)
ちゃんと覚えていなくても、基本的にはキーボードの矢印キーでカーソル移動できます。
矢印キーでは移動できないときもあるので、そのときにはh, j, k, lキーを使って移動しましょう。
コマンドモードの状態([esc]キーを押した後)で、以下の操作を行えます。

| キー操作 | 動作 |
|:------------:|:------------:|
| h     | カーソルを1文字左へ    |
| j     | カーソルを1行下へ      |
| k     | カーソルを1行上へ      |
| l     | カーソルを1文字右へ    |

# その他補足
クリップボードとのコピー・ペーストがうまくできないときは、VISUALモードになってしまうのが原因かもしれません。

```
vi ~/.vimrc
```
で~/.vimrcファイルに

```
set mouse-=a
```

の一行を追加すると、VISUALモードにならずに操作がシンプルになると思います。
導電糸の電気抵抗を比較する

こんにちは
どたです

普段はデザイナーをしつつ、Eテキスタイルの作品などを作っています
最近はスイッチサイエンスさんで導電布のモジュールも販売しています。


https://www.switch-science.com/catalog/7038/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/e447558c-b013-5e64-4d14-4c316e220d6b.png)



# やりたいこと
導電糸、というのはその名の通り電気を通す糸です。
ネットで検索すればたくさんの種類が販売されていますが、どんな違いがあるのかよくわかりません。
今回は私の手元にある導電糸に対して、抵抗値を調べてみることにしたいと思います。


# 導電糸の種類
手元にあった下記の導電糸について、計測します。

- フジックス SmartX
- Aliexpressで手に入れた糸
- Wearicの導電糸
- Sparkfunの導電糸
- フジックス せいでん



# 計測方法
- __３回計測してその平均値を抵抗値とする__
- __糸の長さは３０cm　両端をテスターに３回巻きつけて計測する__
- __糸の張り具合は、引っ張らず、糸がたるまない程度__


## 注意点
所持している導電糸は入手時期もバラバラなので、古い導電糸は酸化して抵抗値が変化している可能性があります。
また導電糸の抵抗値は張り方や、計測方法によっても変化するので、
ここでの比較は参考程度に見てください。

# フジックス SmartX
楽天で購入できるフジックスの導電糸
1000mで購入できるので、入手性は一番高いかもしれません

![IMG_4043.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/f0f297be-a4e1-51d1-7ecf-1e3649e5a48b.jpeg)

| 1回目 | 2回目 | 3回目 |
|:-:|:-:|:-:|
| 193Ω  | 228Ω  | 202Ω  |

###　計測結果： 207.6Ω

うーん、まぁこんなもんですかね

# Aliexpressで手に入れた糸
[Aliexpress](https://ja.aliexpress.com/item/32887419892.html) で売っていた導電糸
見た目はSmartXそっくり

![IMG_4044.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/51ba69c6-dcfe-ea4f-886f-483b128e89ef.jpeg)
 
| 1回目 | 2回目 | 3回目 |
|:-:|:-:|:-:|
| 90Ω  | 95Ω  | 93Ω  |

### 計測結果: 92.6Ω

見た目はSmartXにそっくりですが、抵抗値は半分くらいに減りました。


# Wearicの導電糸
[このスライド](https://www.slideshare.net/tendots/wearic) でも紹介した、
[Wearic](https://www.wearic.com/) の導電糸です
![IMG_4051.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/f6cbaf31-96e3-5585-d335-2a173f051749.jpeg)


| 1回目 | 2回目 | 3回目 |
|:-:|:-:|:-:|
| 15Ω  | 15.8Ω  | 15.7Ω  |

### 計測結果: 15.5Ω

独特な触り心地の糸ですが、かなり抵抗値が低い。
正直、購入してから放置していたのですが、結果にびっくりしました。


# Sparkfunの導電糸
[スイッチサイエンス](https://www.switch-science.com/catalog/911/) で売っている導電糸
スイッチサイエンスで販売している導電糸はいくつか持っていますが、
今回はこちらをチョイス

![IMG_4052.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/e72e5f09-d48f-7cae-b1c3-a4b88c0981dc.jpeg)


| 1回目 | 2回目 | 3回目 |
|:-:|:-:|:-:|
| 6.3Ω  | 6.4Ω  | 6.2Ω  |

### 計測結果: 6.3Ω

見た目的にはSmartXに似ていて、SmartXより少し太いかな？という導電糸でしたが、
意外にもここまでで一番低い抵抗値！


# フジックス　せいでん
ちょっと番外編ということで、フジックスが販売している静電気防止用の糸です
![IMG_4048.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/9ae46965-2cec-cf53-b86d-af4baa9776ef.jpeg)


| 1回目 | 2回目 | 3回目 |
|:-:|:-:|:-:|
| -  | - | - |

### 計測結果: 計測不能

抵抗値が高すぎて計測できませんでした。
これは電気を通す用途じゃないようですね。



# 結論
驚いたのがWearicとSparkfunの抵抗値の低さです。
購入してずっと放置していたのですが、こんなに抵抗値が低いと思いませんでした。

同じ導電糸でもこんなに電気抵抗値が違うんですね〜
もちろん、用途や価格によってもどれが最適かは変わると思いますので、
自分にあった導電糸を使用しましょう。

ではでは
テストメールを多数のアドレスに送ってしまった話


# はじめに
アドベントカレンダー初参加です。（しかも後日追加です。）

このところ、アプリでの誤通知・メール誤送信の報道があり、思い出したので、10年くらい前のやらかしを記事にします。
-「デジタル庁のメール誤配信　CC・BCC設定ミス」(2021-11-24)
-「d払いアプリ通知の誤配信」(2021-12-03)
-「モバイルPASMOで誤通知」(2021-12-17)
-「Yahoo!アプリで誤通知」(2021-12-22)

# 何をしてしまったのか
一斉メールの新規宛先一覧のための設定を行い、テストメールを送ったところ、別の既に利用していた一斉メールの一覧のアドレス（5000アドレスほど）に送ってしまった。
（他の人のメールアドレスが見える状態ではなかったので、情報漏洩につながる失敗でなかったのが幸いでした）

## 経緯
一斉メールの送信に メーリングリストソフト majordomo を利用しており、/etc/aliases に、以下のような設定をしていました。

```:/etc/aliases
list1: "|/usr/local/majordomo/wrapper resend -h example.jp -l list1 list1-outgoing"
list1-outgoing:     :include:/usr/local/majordomo/lists/list1
```

一斉メールの新規宛先一覧を追加するために、list1の設定をコピーし、コピー後の list1 を list2 に変更

```
list1: "|/usr/local/majordomo/wrapper resend -h example.jp -l list1 list1-outgoing"
list1-outgoing:     :include:/usr/local/majordomo/lists/list1

list2: "|/usr/local/majordomo/wrapper resend -h example.jp -l list2 list1-outgoing"
list2-outgoing:     :include:/usr/local/majordomo/lists/list2
```

/usr/local/majordomo/lists/list2 に、自分のメールアドレスだけを設定
newaliases
テストメールを送信 (echo "test" | mailx -s test list2（だったかと）

・・・
自分のメールアドレスにメールがこない。

（おかしいな・・・）

/var/log/maillog を確認中・・・

list1のアドレスの人からテストメールが来たと連絡。

**やらかしました。**

その後も続々とご指摘の連絡が・・・
（実際のアドレスを使ってテストするのか！などのお叱りもいただきました。）


# 惨劇はなぜおこってしまったのか
テストメールの送信先（宛先）間違い・・・ではないです。
上記設定を見てお気づきになられた方もいらっしゃると思いますが、以下のように**一カ所変更が漏れていました**。

```
list2: "|/usr/local/majordomo/wrapper resend -h example.jp -l list2 list1-outgoing"
// list1-outgoing を list2-outgoing に変更漏れ                       ^^^^^
```

そのため、list2 に送ったのですが、majordomo で処理後、 list1-outgoing に送られ、list1 のアドレス一覧に送られました。

# 二度と惨劇を起こさないためにどうしたのか
頻繁に行う作業でもなく、当時は今ほどテスト用サーバやVMを簡単に立てる環境もなく、本番環境で直接作業するしかなかったため、思いついた再現防止策は、

**コピー元の設定を、実利用の設定ではなく、テスト用の設定にする**になりました。
（変更を忘れても、テスト用のアドレスにしか届かない）
ということで、以下を追加し、今後はこれをコピーする手順にしました。

```
listtest: "|/usr/local/majordomo/wrapper resend -h example.jp -l listtest listtest-outgoing"
listtest-outgoing:     :include:/usr/local/majordomo/lists/listtest
```

より良い再発防止策・方法がありましたら、ご教示頂けますと幸いです。

# おわりに
私のやらかしによりテストメールを受け取ったアドレスの方にはご迷惑をおかけしました。
私自身はやらかし以降、誤通知やテストメールを受け取った場合、裏側を想像してしまうようになりました。

誤通知やテストメールを受け取った方は、情報漏洩とかになっていないのであれば、寛容な心で受け止めてもらえるといいなーと思っています。
【最終回】点字メーカープログラムの動画レビュー Part 5 - Rubyプログラミング問題にチャレンジ！ －改訂版・チェリー本発売記念－

## この記事は何？
Qiita Advent Calendar 2021「Rubyプログラミング問題にチャレンジ！ －改訂版・チェリー本発売記念－」で投稿してもらったコードを出題者である僕、伊藤淳一が動画でコードレビューしてみました。この記事はその第5回（最終回）です。

https://qiita.com/advent-calendar/2021/ruby-challenge

第1回〜第4回のレビュー動画はこちらです。

https://qiita.com/jnchito/items/26e8bd7c635e3d32e620

https://qiita.com/jnchito/items/d5f71c9ad90f2890647e

https://qiita.com/jnchito/items/60c0342971d93b174b6b

https://qiita.com/jnchito/items/5fe4d6d64799d22acf1b

### レビュー対象の記事はこちら！

今回レビューさせてもらったのは以下の20日目と、22日目から25日目の記事です。投稿してくれたみなさん、どうもありがとうございました！

@nakazawaken1 さん

https://qiita.com/nakazawaken1/items/d51b81f0d720169258b7

@stonesaw さん

https://qiita.com/stonesaw/items/33a53b702660cce34e6d

@n0dam1 さん

https://qiita.com/n0dam1/items/d09c0268c4df4f829e58

@ek-h1-hy さん

https://qiita.com/ek-h1-hy/items/4aa2da6bcbbcd2444d13

@kyuki3rain さん

https://qiita.com/kyuki3rain/items/30414d9e589af561cd26

## 動画でコードレビューしています

今回のコードレビューは動画で実施してみました。だいたい1投稿あたり5分〜10分ぐらいでさーっとコメントしています。
（あまりしっかりレビューできなくてすいません🙇🏻‍♂️）

動画はこちらです 👇

https://youtu.be/ZCkOeyTfTP4

「それは好みの問題や！」みたいなコメントもあるかもしれませんが、何か参考になれば幸いです。

## まとめ

これで全25回すべてのコードレビューが終わりました。

この中から1つ、僕が「これが一番イケてる！」と思った投稿（コード）を一つ選定し、Top Contributor賞として表彰させてもらいます。
発表は2022年1月中旬の予定です。果たしてTop Contributor賞をゲットできるのはどの投稿なのか！？
みなさん、楽しみにお待ちください。

あらためて、このアドベントカレンダーに参加してくださったみなさんに感謝します。
25日分全部埋まって、なおかつどの日もちゃんと投稿があったというのはすごいことだと思います。
みなさん、本当にありがとうございました。それではメリークリスマス！！🎄🎅🎁

### 告知：銀座Rails#41で僕の解答例を公開します！

2022年1月25日（火）に開催される銀座Rails#41にて、僕の解答例を公開します。アドベントカレンダーに参加してくださった方はもちろん、そうじゃない方もぜひこのイベントに参加してもらえると嬉しいです😄

https://ginza-rails.connpass.com/event/234304/

### PR：改訂版・チェリー本が発売されました！🍒

「プロを目指す人のためのRuby入門 改訂2版（通称チェリー本）」が2021年12月2日に発売されました。この点字メーカープログラムを作る際にも役立つ知識が満載です。第1版を持っている方も持っていない方も、一度書店で手に取ってもらえると嬉しいです〜🍒

https://gihyo.jp/book/2021/978-4-297-12437-3

改訂版の見どころについては以下のブログにまとめていますので、こちらもあわせてどうぞ 💁‍♂️

https://blog.jnito.com/entry/2021/12/02/072804