OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Functions作成

# 関数アプリ作成

下記サイトを参考に関数アプリを作成する　

https://maku.blog/p/vgt5g7f/#functions-アプリを新規作成する

https://zenn.dev/nikaera/books/nestjs-azure-dev/viewer/create-env-azure-functions

※ここでAzure Filesも作成する


# Azure FunctionsとVScodeの連携　

ここではVScodeからAzure Functionsへデプロイできる環境をセットアップする　
①ローカル端末からAzureへのアクセスにおけるDNSの名前解決を行う（閉域網でAzureFunctionsを利用している場合のみ実施）
まずはhostファイルに下記内容を追記する

```
<プライベートIPアドレス> <関数アプリ名>.azurewebsites.net
<プライベートIPアドレス> <関数アプリ名>.scm.azurewebsites.net
```

※Windowsはこちらを参照：https://www.netassist.ne.jp/techblog/13744/
　Macはこちらを参照（sudoで実行）：http://onocom.net/blog/mac-hosts-file/

②下記サイトを参考にセットアップを進める　

https://rainbow-engine.com/azure-functions-python-vscode/

※1.別のAzureアカウントでサインインする場合は一度サインアウトする必要あり　
下記サイトを参考にサインアウトを実施する　

https://www.simpletraveler.jp/2022/04/10/vscode-switch-azure-account/

※2.既存のサブスクリプションを追加する場合、下記写真の手順を実施する　
![RP-IT0540_151_5_CreateNewProject.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2362827/e1cfd183-dfc1-13dd-83cb-d6a033c3d029.jpeg)

※3.Azure FunctionsのPythonはバージョン3.6.x〜3.9.xのみ対応
Pythonのダウングレード方法（Mac）：https://www.haneca.net/python-downgrade-on-mac/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2362827/0e46412a-f965-7ddd-4785-c54b25417f24.png)


# 付録　
Azure Functionsで環境変数を別ファイルから取得する場合は下記サイトを参考に実施する

https://playfab-master.com/azure-environment-variable

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-reference-python?tabs=asgi%2Capplication-level&pivots=python-mode-decorators
AUTOSAR R22-11 is released and  about AUTOSAR Partnership history

# Updating now

In articles in the AUTOSAR Advent Calendar 2022, i will update the URL.

If there is a URL like this.

https://www.autosar.org/fileadmin/user_upload/standards/foundation/22-11/AUTOSAR_RS_Diagnostics.pdf

Please delete the phrase "/user_upload" from the URL.

https://www.autosar.org/fileadmin/standards/foundation/22-11/AUTOSAR_RS_Diagnostics.pdf

It will work and see the document. 

Best Regards.

#  AUTOSAR Partnership history.

At new AUTOSAR web, there is a AUTOSAR Partnership history.

https://www.autosar.org/about/history

![partnarship.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/3014dd89-df17-315d-ef12-c625124f1d4e.png)

In 2010 and 2013, members of pertnership is declease.
What happen in those days.

If you know something, please comment to this article.
開発部インターンシップと新卒採用へ向けてのチャレンジ

開発部QAチームのkotsutaと申します。
こちらは、[トラストバンク Advent Calendar 2022](https://qiita.com/advent-calendar/2022/trustbank) の10日目の記事です。
非エンジニアですが去年に引き続き今年も参加させていただいてます。

今年、開発部ではこれまでに無い新たな取り組みとして、インターンシップが行われました。
9月～11月末までの3ヶ月間のインターン期間、メンターとして関わらせてもらいましたので
今年はそのことについて公開可能な範囲で記事にまとめさせていただきます。


### ■インターンってなんぞ？
別の部署ではわりと頻繁にインターンシップの取り組みは行われているようでしたが、具体的に関わらせてもらうのって初めてなんですよね。

事前情報無しで、アルバイトレベルのお仕事を振ってもらいつつ、職場体験するくらいの認識だったんですが、今回インターンのメンターでやらせてもらうにあたり、人事担当者にお話を伺いました。
インターンの狙いとしては以下のような理由。

* 新卒採用の一環として実施
* 自社のサービス、経営理念を知ってもらいたい
* 志望者には働く環境のリアルを知ってもらいたい

トラストバンクの採用はこれまでほぼ全ての方が中途採用だったので、開発部だけでなく社全体で新卒採用を行うというチャレンジの最初の一歩。
採用面接だけの切り口ではなく、長期的に志望者（会社側）に関わることで、双方で納得のいく採用が行われるための取り組みということなんだそうです。

ご応募いただいた方は、当初は開発志望の学生さんでしたが、今回は開発担当としてのインターンではなく、私のいるQAチームへの参画となりました。
インターン参加時に学びたいことの１つに<b>「どういった流れで開発がされるのかを知りたい」</b>とのことだったので、普段から開発案件がリリースされるまでの一連の会議に参加している私に白羽の矢が立ったそう。

日々の会議に同席してもらうことで、ある程度の流れを知ってもらおうというのが今回の狙いでした。


### ■インターン中に行ってもらったこと
<b>①会議参加</b>
リリースまでの一連の流れを以下のような会議に同席いただくことで体験してもらいました。
* 新規プロジェクト案件の仕様検討や案件インプットのミーティングが週に何本か
* 開発部内の進捗確認ミーティング、対PMとの状況把握ミーティング、プロジェクト全体での進行管理のミーティングが週に各1回ずつ
* リリース前の最終承認がされるミーティングが月に何本か

会議多すぎ問題はありますが、案件が立案されてからどういったフローを経て、最終的にリリースまでいきつくのかを、ミーティングの同席と口頭補完を含めて体験してもらいました。
（※参加してもらうだけでなく、本人用の議事録を取ってもらうという課題付き！）

<b>②おためしQA試験</b>
QAチームへ参画されたので、実装済の案件をおためしでQA業務にはいっていただき、実際にどのような方法でQAが行われているのかも学んでいただきました。
* テスト項目書がどういう観点でつくられているのかを先輩QAメンバーの項目書から読み解いてもらう
* 読み解けるようになったら、実際にテストを行ってもらう
* 自身でもテスト観点を作成したり、観点を元にテスト項目を作成
とても熱心に取り組んでいただいて、参考資料としてJSTQBの資料を取り寄せて勉強されていたそうです

<b>③その他、社内交流・先輩社員へのインタビューなど</b>
社内にいる開発者や人事担当者、他の部署に所属するインターン生との交流を行っていただき、ご自身のキャリア設計ｗ

開発担当者や、QAメンバー、人事担当者、社内の他の部署に所属するインターン生と交流する機会を設け、各方面に自身のキャリア設計のための相談や、インタビューを行ってもらうことができました。



### ■迎え入れるに当たり気をつけたこと</b>

<b>①補足説明の1on1の時間を取る</b>
リモート環境で行ったため、不安にさせないようには気にかけてました。
すべてのミーティングに同席してもらっているわけでもなく、つねに一緒ではないため可能な限り毎日どこかの時間で対面でお話できる時間を設けました。

この時間では、参加したプロジェクトに関しての不明点や、仕様や制度の説明、開発部やQAの業務についての説明等も行うことができました。

インターン参加理由のひとつであった、「リリースまでの一連の流れを把握すること」に関しては、１つのプロジェクトに最初から関わってもらっていたわけではないので、複数のプロジェクトをあわせて、「さっきのミーティングは全体の流れでいうとここらへんに当たるもの」といったツギハギな説明していました。
スターウォーズ初期3部作後のep1開始するみたいな順序の解説になってしまったんですが、ちゃんとご理解いただけてたようで安心しました。

<b>②日報の提出</b>
上記の会議の議事録作成もこのシートでセットで管理して、一日分の参加した会議議事録のまとめと、業務終了後に思ったことを記載いただくための日報を記載いただいてました。

QA試験に入ったあとは、制度やサービスに関しての不明点を記載いただき、翌日の1on1で解消したり、感想として、普段業務中に思ってることも含めて知ることができました。

また、日報へのコメント返しで、メンター以外の社員からも日報の内容に対してアドバイスを行ってうことがあり社内コミュニケーションをとることにも繋がりました。


### ■インターン最終日。やってみて最終的にどうだった？
最終日の面談では3ヶ月の振り返りを行いました。
もともと開発として目指していたところでしたが、今回のインターンを経験して複数の道があること、QA業務に関してもただのテスターではなく、仕様検討段階から入ることで最終的に不具合を発生させないという重要な役割を持っているということがわかったともおっしゃっていました。

報告書でまとめていただいたのですが、総評として「やってて楽しかった。」と回答があり。
これにつきますよね。

自分自身もメンターとしての関わらせていただけたのは良い経験となりました。
インターン生のKさんにはこの場を借りてお礼をしたいと思います。

次回は開発チームへのインターン参加を予定されているそうです。
今回のインターン導入の実績をもとに、今後インターンからの新卒採用などにつながっていくと良いですね。
トラストバンクでは、地域創生に関心のあるエンジニアさんを募集しています！



さて、明日のアドベントカレンダーは、
QA業務に関していつも相談に乗っていただいているCTO室所属のQAメンバー@hiroshi_iwashita02さんが以前の現場のゲーム開発のQAの内容について投稿されるみたいです。おたのしみに！
amplify push と戦う３　waitingForDeployment

# 症状1



```
amplify push -y 
~~~
~~~
~~~
["Index: 1 State: {\"deploy\":\"waitingForDeployment\"} Message: Resource is not in the state stackUpdateComplete"]

```

イベントを確認する（amplify pushでエラーの時はCloudFormationイベントを必ず見るようしている）
amplify＞アプリ＞Backend environments>環境のアクション＞詳細を表示＞最新のデプロイアクティビティ＞CloudFormation
イベントタグを選択する

特にイベントが記録されてない場合



# 対処

schema.graphqlを修正した時に出た。
具体的には・・・
type xxxx　などのテーブルに変更を加えた場合に出る。
一つの属性に複数の`@index` `queryField`のある属性を削除していると出る。
なんだかよくわからないがインデックスがらみ

突然消すのではなく、queryFieldを消したり、indexの数を減らしてpushを何度かしたら良い。

```
  status: attxxxxxx!
    @index(
      name: "xxxxxx"
      sortKeyFields: ["id"]
      queryField: "xxxqqqq"
    )
    @index(
      name: "yyyyyy"
      sortKeyFields: ["dd"]
      queryField: "yyyqqqq"
    )
```
を
```
  status: attxxxxxx!
    @index(
      name: "xxxxxx"
      sortKeyFields: ["id"]
    )
    @index(
      name: "yyyyyy"
      sortKeyFields: ["dd"]
    )
```
に変更してpush後にattxxxxxxを全部消してpushしたら上手く消せた






# 対処２


xxxxx-cloudformation-template.jsonで現れないEnvironment variablesがteam-provider-info.jsonに残っている場合もこのエラーが出てきた。
team-provider-info.jsonのenv名から削除すれば出なくなった。
Introduction to SystemVerilog - 1

# 序章

## 対象者
- 論理回路を知っている方
- 同期回路を知っている方
  
## 内容
ハードウェア記述言語(HDL)の一つ、SystemVerilog(SV)をマニュアルを使用して紹介します。仕様を詳細に説明しても読んでいる時点で挫折することが想定できるので、このシリーズではできるだけ専門的な用語の使用は避けて平易にそして簡潔に説明するように努めています。そして、基本的な文法やユーザー定義型やalways_combといったSV特有のものも取り上げます。

## 参考文献
IEEE 1800-2017: SystemVerilog (SV) 
https://www.accellera.org/downloads/ieee


### モジュール

論理回路は例えば加算回路や制御回路といった目的に沿ったなんらかの機能単位で構成されています。この構成単位を**モジュール**と呼びます。

加算回路では全加算回路を複数接続して一つの整数加算回路を構成するように全加算回路を一つのモジュールとして構成する時、そのモジュールを複数接続して整数加算回路というモジュールを構成することが想像できると思います。このようにモジュールがモジュールを包含する記述を行うことで複数の回路で構成された一つの回路を記述します。これはソフトウェア開発言語での関数と同じ”コンセプト”です。

回路はソフトウェアと違い実際に物理的に構成されるものなので関数呼び出しではなく、モジュールをオブジェクト言語でいうインスタンスとして利用します。インスタンスを記述しそのオブジェクトに名前をを与え、ポートを結線して使用しそのように記述します。

インスタンス名がinstance_nameのモジュールの記述は

```verilog
module instance_name ( ... );
...
endmodule
```

という形式で**module**と**endmodule**内に回路を記述します。このモジュールをインスタンスとしてobject_nameという名前で使用する際は例えば次のように記述します。

```verilog
instance_name object_name (
...
);
```

モジュール（インスタンス）を記述したとしてそれを利用する際は結線を必要とします。そのインターフェイスとなる**ポート**を定義することで可能にします。先の例のインスタンス名がinstance_nameの記述にポート記述を追加すると例えばポート宣言は

```verilog
module instance_name (
    input   a,
    input   b,
    input   ci,
    output  d,
    output  co
);
...
endmodule
```

のように記述します。**input**はこのモジュールへの入力、**output**はこのモジュールからの出力を示す宣言子です。この例では入力として**a**、**b**、**ci**という入力ポート、**d**と**co**という出力ポートを宣言しています。他に双方向ポートは**inout**で宣言します。ポートを列挙する際は","で区切ります。

このモジュールを使用する際は例えば、


```verilog
instance_name object_name (
    .a(     w_a     ),
    .b(     w_b     ),
    .ci(    w_ci    ),
    .d(     w_d     ),
    .co(    w_co    )
);
...
endmodule
```

と記述します。``.a(     w_a     )``ではポート**a**について他のところで宣言されたオブジェクト**w_a**を使用して結線しています。コンマ+ポート名+(+結線用オブジェクト+)で記述します。また列挙する際は","で区切ります。

ポート宣言は他の方法もありますがこの宣言の仕方を使用すればインスタンスとして使用する際にポートの順番をモジュール記述の際のポート宣言順番を守らなくても良くなります。例えば、

```verilog
instance_name object_name (
    .d(     w_d     ),
    .a(     w_a     ),
    .ci(    w_ci    ),
    .b(     w_b     ),
    .co(    w_co    )
);
...
endmodule
```

と記述しても問題ないです。

ここまでの内容で全加算回路をモジュールとして例えば

```verilog

module full_adder (
    input   a,  // source a
    input   b,  // source b
    input   ci, // carry-in
    output  d,  // output c
    output  co  // carry-out
);
    /* Sum                      */
    assign d    = a ^ b ^ ci;

    /* Carry-Out                */
    assign co   = ( a & b & ~ci ) | ( ~a & b & ci ) | ( a & ~b & ci );

endmodule
```

と記述できます。コメントは他の言語同様に``/*``と``*/``で挟んだり``//``で記述できます。

このシリーズでは、*こう記述すべき*といったマナー講師のような説明はしませんので、チームメンバー内でコーディングルールを決めてそれに従ってください。
そもそも AWS って何？

こちらは、[デジタルキューブ ＆ ヘプタゴン Advent Calendar 2022](https://qiita.com/advent-calendar/2022/digitalcube-heptagon) 9日目の記事です。

Advent Calendar で「初心者に優しい記事を書く」と宣言したので、初心者向けに振り切ろうと思います。
業界に入って間もない僕の初心者目線で、そもそも AWS をよく知らない方向けにおおまかなイメージが掴めるような記事を書きます。

初心者の初心者による初心者のための AWS 解説です。

# クラウドコンピューティングサービス
AWS (Amazon Web Services) は2006年よりサービスを開始した「クラウドコンピューティングサービス」です。
クラウドコンピューティングについては Wiki に以下のような説明がありました。
>クラウドコンピューティング（英: cloud computing）は、インターネットなどのコンピュータネットワークを経由して、コンピュータ資源をサービスの形で提供する利用形態である。

インターネット経由で↓のようなコンピュータが使える、というイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1488939/aaa4c326-1390-f6d0-1d3f-6c9ebea42d56.png)

クラウドコンピューティングサービスには、 amazon が展開している AWS の他に Microsoft の Azure と Google の GCP があります。
どれもコンピュータ資源が、用途ごとに様々なサービスとして提供されています。

# AWS の主なサービス
現在AWSでは、２００以上のサービスが展開されています。

https://aws.amazon.com/jp/products/?aws-products-all

特に有名なサービスを紹介します。
### S3 (Simple Storage Service)
あらゆるケースで使用できる、データの保存を行うためのオブジェクトストレージサービスです。
オブジェクトストレージはフォルダを作って階層で管理するファイルストレージに比べ、保持しているデータの増加に柔軟に対応できます。
また非常に堅牢で障害にも強いです。
解析用データの保存、webサイト、スマホアプリ、バックアップなど非常に様々な用途に使えます。

### EC2 (Elastic Compute Cloud)
様々な用途に使えるコンピューティングサービスです。
IaaS（Infrastructure as a Service）とも呼ばれる、コンピュータが使えるサービスです。
コンピュータのスペックがかなり幅広くあり、web　サーバや機械学習など柔軟に様々な用途に対応できます。

### AWS Lambda
サーバーの管理をすることなく、コードの実行を行えるサービスです。
使う側のサーバの設定、管理などが全く必要ないサーバレスサービスです。
他の AWS サービスをトリガーにして実行することもできます。
S3 に追加されたファイルに処理を行う、IoT デバイスのバックエンドなど様々な用途が考えられます。

### Cloudfront
CDN (Contents Delivery Network) と呼ばれるサービスです。
ウェブサイト、動画などコンテンツを、AWS が保有する世界中のデータセンターを使い安定して届けることができます。

# AWS の何がすごいのか
クラウドサービス全般の特徴ですが、必要な時にオンラインで必要なだけ使えるという利点があります。
これは実際にサーバを購入して運用するのとは段違いにスピーディーです。
実際にサーバを買ってセッティングするには数週間を要しますが、クラウドを使用することで大幅に短縮することができます。
また、初期投資も小さく始めることができます。
運用中も料金は使った分だけです。
さらに、ハードウェアの運用負荷もありません。

ただ、サービスの数がとても多い上にアップデートの頻度も高いため設計・運用にはある程度の知識が求められます。

# もっと知りたい方へ
AWS には認定資格というものがあり、その対策用の資料を AWS が公開しています。
中でも以下は初心者向けで非常にわかりやすく、AWS の全体像を掴むのにぴったりだと思います。

https://explore.skillbuilder.aws/learn/course/external/view/elearning/1875/aws-cloud-practitioner-essentials-japanese-ri-ben-yu-zi-mu-ban

実際に動かしてみたいという方には以下のハンズオン資料がおすすめです。
AWS には「無料枠」というのが存在し、ある程度まではタダで使わせてもらえるサービスもあるため気軽に試せます。

https://aws.amazon.com/jp/events/aws-event-resource/hands-on/

また AWS 認定資格の取得を目指すのもありだと思います。

https://aws.amazon.com/jp/certification/

https://qiita.com/gorooe/items/3b1b448eed7709e51702

また、2023/1/18 に AWS が行う初心者向けのオンラインイベントがあるようです。
こういった AWS が行うオンラインイベントは頻繁にあるので、参加して見るのもオススメです。

https://aws.amazon.com/jp/events/builders-online-series/

# 参考資料
https://ja.wikipedia.org/wiki/Amazon_Web_Services

https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/Welcome.html

https://aws.amazon.com/jp/s3/

https://aws.amazon.com/jp/ec2/?did=ap_card&trk=ap_card

https://biz.nuro.jp/column/aws-mama-028/#column-2

https://www.stylez.co.jp/columns/what_is_aws/

https://aws.amazon.com/jp/lambda/

https://aws.amazon.com/jp/cloudfront/
AviUtlのプラグインを作る際にやったこと、やらなかったこと

# AviUtlのプラグインを作る際にやったこと、やらなかったこと
　アドカレ九日目です。

カレンダー→[AviUtl Advent Calendar 2022](https://adventar.org/calendars/8135)
前の記事→[AviUtl1.10で追加された共有メモリキャッシュ関数の扱い方](https://scrapbox.io/nazosauna/AviUtl1.10で追加された共有メモリキャッシュ関数の扱い方)

## 概要
　みなさん、AviUtlつかってますか？
　最近の情勢に詳しい方ならわかると思うんですが、AviUlは数年前と比べて凄まじい進化を遂げてます。それもこれも有志の方々の素晴らしいプラグインのおかげです。そんなプラグイン、僕も作りたい！！！→つくりました。パチパチパチ。
ということで、プラグインを作った際にやったこと、やらなかったことを箇条書きにしようと思います。


## そもそもどうやってプラグイン作るの？
　プラグインの作り方は簡単です。
　ざっと書くと、

##### 1.　コードを書く。
##### 2.　[AviUtlのお部屋](http://spring-fragrance.mints.ne.jp/aviutl/)からsdkをダウンロード。
##### 3.　コンパイラとsdkのパスを繋ぐ。
##### 4.　コンパイルする。


これで終わり。ですが、僕は最初コードを書く段階で躓きます。残念。
…という訳で、一般人がプラグインを作るのはなかなか大変なのが現状です。


# プラグインを作る際にやったこと
　はい、本題です。ポインタのポの字も知らなかった僕がやったことを箇条書きで書いていきます。

### ・c++の習得
　AviUtlのプラグインはc++というもので作られています。goとかrustでも作れるらしいですが、あまり情報が出回っていないのでおすすめしません。やるならc++一択です。
　そんな訳で、僕はc++の簡単ver.であるc言語を勉強した後に、c++を勉強しました。これだけでトータル一年と半年ぐらい。
　cとc++を勉強したいなら、以下のサイトがおすすめです。他のサイトよりも分かり易すぎて昇天します。
・[一週間で身につくC言語の基本](http://c-lang.sevendays-study.com/index.html)
・[一週間で身につくC++言語の基本](http://cpp-lang.sevendays-study.com/)


### ・win apiを知る
　僕はウィンドウの出てくるプラグインを作りたかったので嫌々ながらもwin apiについて調べたりしました。win apiというのは、Windowsで使用できるいろいろ便利な関数のことです。
・[一週間で身につくWIN32プログラミングの基本](http://c-lang.sevendays-study.com/win32/index_win32.html)

### ・Visual Studio 2022の使いかたを学ぶ
　AviUtlのプラグインはVisual Studioというソフトで開発されることが多いと思います。僕も例にもれず、Visual Studioを使ってプラグインを作りました。ところがどっこい、このソフト、ゴミ難しい。まるで分からない。googleが手元にないと爆死確定演出です。困ったらとにかくググりましょう。

### ・画像処理について調べまくる
　僕はウィンドウを出すプラグインを作りたかったのですが、同時に画像処理もやりたかったのでいろいろ調べました。そこで出てきたのが数学。微分、積分、行列、二次関数、なんちゃら展開。お勉強って大事なんやね。
・[ブレゼンハムの線描画アルゴリズム](https://ichi.pro/burezenhamu-no-senbyoga-arugorizumu-50640167961011)
・[ベジェ曲線](https://ja.javascript.info/bezier-curve)
・[ベジェ曲線を等間隔で分割したある点を取得する](https://hacchi-man.hatenablog.com/entry/2020/10/20/220000)

### ・スクリプトを作りながらプログラミングに慣れる
　今振り返ると、僕はスクリプトを作っていたときにプログラミングの基礎を学んだんじゃないかぁ～と。とにかく、プログラミングに慣れる。これ、大事だと思います。


# プラグインを作る際にやらなかったこと
　はい、今度はやらなかったことをまとめていきます。
　やらなかった理由はめんどくさい&ハードル高い、が殆どです。

### ・アンチエイリアス
　ウィンドウを表示する際に、アンチエイリアスをかけていないのでクソださウィンドウになってしまいました。配色センスが無いのもあり、かなり残念なものに…。アンチエイリアスかければ少しはましになったんかな。

### ・メモリ安全性の高いプログラミング言語への移行
　AviUtlのプラグインはc++で作られることが多いです。ですが、c++にはやばめの問題がいくつか存在します。なので、rustなどの安全な言語を使うのが理想なんでしょうけど…rust、難しすぎます。

### ・高速化
　c++にはマルチスレッドやsimdなどの高速化手段がたくさんあります。ですが、僕はそれらの手段を一切つかいませんでした。僕が作ったプラグインは重い処理がなかったので、高速化しても旨味がなかったんですよね。

### ・バグがあってもほっといた
　これは僕が悪い。バグがあるのに、そこで妥協してしまいました。よくないね。


# 最後に
　こんなつまらん記事を最後まで読んでくれてあざます。
　次はもう少し有益な記事かきまする。
　ばいび～


[twitter](https://twitter.com/metaphysicalba1)
Firebase Analytics の自動イベントのデータ例

# はじめに
以前、[Firebase Analytics の自動イベント取得](https://qiita.com/KenNagami/items/067eb161e78f842edb69)
の記事を書きました。複数のプラットフォーム(ios/androidなど)に提供するアプリのデータを分析する場合は、プラットフォームの情報、機器情報、アプリ情報などが必要になってきます。実際の機器からのデータ例があると分析がしやすいと思うので、ios, android, FireOSの3種類の機器の自動イベントのデータ例を記載します。

# 自動イベント
Firebase Analyticsでは、SDKをアプリに組み込むことによって、自動的にイベントが収集されます。具体的な収集されるイベントは、[自動的に収集されるイベント](https://support.google.com/firebase/answer/6317485)や[事前定義されたユーザーディメンション](https://support.google.com/firebase/answer/9268042)に記載されています。
ここでは、機器に関する情報とアプリに関する情報のデータ例を記載します。


### device
|イベント名| iOS | Android | FireTV | 意味 |
|:-----:|:-----:|:-----:|:-----:|:-----:|
|category| mobile | mobile |smart tv | 機器種類 |
|mobile_brand_name | Apple| Sony |Amazon | ブランド名|
|mobile_model_name | iPhone 12| SO-41B | AFTSSS |モデル名|
|mobile_marketing_name | (null)| XPERIA ACE II | Fire TV Stick - 3rd Gen (2020)|
|mobile_os_hardware_model | iPhone13,2 | SO-41B |AFTSSS　||
|operating_system | iOS  |Android |Android
|operating_system_version | iOS 15.7 |Android 12 |Android 9||

### app_info
|イベント名| iOS | Android | FireTV | 備考 |
|:-----:|:-----:|:-----:|:-----:|:-----:|
|id|com.example.app|com.example.app|com.example.app|アプリ識別子 |
|version| 1.1.1 | 1.1.1 | 1.1.1| アプリのバージョン |
|install_source| iTunes <br> manual_install | com.android.vending <BR> manual_install ||インストールの方法<br>　ストア経由<br>　直接(manual_install)|

### その他
|イベント名| iOS | Android | FireTV | 備考 |
|:-----:|:-----:|:-----:|:-----:|:-----:|
|platform|IOS |ANDROID |ANDROID| プラットフォーム |


# 参考文献
- [自動的に収集されるイベント](https://support.google.com/firebase/answer/6317485)
- [事前定義されたユーザーディメンション](https://support.google.com/firebase/answer/9268042)
切れたけどキレなかった話

謎のアドベントカレンダー、第 10 話です。

一旦ネットワークを離れましたが、またネットワークの話に戻ります。

## データセンターに引き込んでいた回線が

突然切れました。

当時、そのデータセンター（ハウジング契約でラックを借りていた）には、

- 社外向けサービス用の機器とデータセンターが提供する回線
- 社内向けの機器と（懐かしの）B フレッツ

がラックに設置 or 引き込んであり、このうち社内向けの B フレッツのほうが切れました。

郊外のデータセンターだったので先に NTT に修理手配をして、その後時間を合わせて現地に向かいました。

（移動は車オンリーで、オフィスから小一時間掛かる場所です。夕方からの立ち会いを終えて帰宅したら夜中でした）

現地で調べてもらったところ、ONU の故障やラック付近の断線ではなく、データセンターの MDF（配線盤）から室内に向かう床の部分で断線していることがわかりました。

## 真犯人は誰だ？

さて、次は断線した原因の調査です。

データセンターの責任者に話を聞いていくと、断線の直前に 2 件配線工事が行われていたことが分かりました。

後日、そのうちの 1 件の工事会社の方が菓子折りを持って謝罪に来られた…のですが、帰られた後に「濡れ衣」だったことが判明。

そこからさらに数日後、今度は大手通信会社の「ちょっと偉い人」と工事担当チーム（といっても実際の作業は下請け）の責任者がやってきました。

そして、謝罪と事故が起きたときの状況の説明を受けました。

## 原因：作業員が工具を既設配線の束の上に落とした

その作業員、データセンターの担当者にも元請けにも事故を告げずに退出していったというのが驚きです。

（もっとも、説明を受ける前にデータセンターの責任者からそれらしい話は聞いていたので、このタイミングでは驚きませんでしたが）

しかしそこでもっと驚きの光景が。

## 「ちょっと偉い人」がずっと居眠りをしていた

のです。

謝罪のためにやって来た人が。

工事担当チームの責任者の方が説明をしている間ずっと。

トレンディドラマ（古い）に出てきそうなおしゃれでちょいワル（死語）みのあるオジサマ。

なんならちょっとイビキをかきながら寝てました。

（「仕事、忙しかったんだろうな」ではなくて「夜、遊びすぎたんだろうな」と反射的に思ってしまったので、やっぱり見た目は大事）

その様子が面白すぎて、怒りが湧いて

**きませんでした。**

おかげで説明が頭に入って

**きませんでした。**

（説明してくれた方、ごめんなさい）。

## その後

データセンターの引き込み口付近の配線を整理してもらうとともに、ラベル付けもしっかり行い、仮に事故が起きた場合にどの利用者の回線なのかすぐに判別・連絡できるように対策してもらいました。

すっきり。

---

11 日目の記事に続きます。

- **[切れたらキレられた話](https://qiita.com/hmatsu47/items/59448a556230d3d84fd4)**

https://qiita.com/hmatsu47/items/59448a556230d3d84fd4
【Ansible + Semaphore】SSH 接続で "Failed to connect to the host via ssh: Host key verification failed." の Fatal エラー

> [Ansible](https://ja.wikipedia.org/wiki/Ansible_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)) + [Semaphore](https://www.ansible-semaphore.com/)（Ansible の GUI）の [Docker コンテナ](https://docs.ansible-semaphore.com/administration-guide/installation#docker)を起動して `playbook` を走らせると、以下のメッセージで SSH 接続に失敗する。
>
> ```shell-session
> fatal ******** UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Host key verification failed.", "unreachable": true}
> ```

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. 過去の SSH 接続情報（`~/.ssh/authorized_keys`）と、現在の SSH 接続情報が異なるために起きたエラーです。トライ & エラーする際に、接続情報が書き込まれた可能性があります。
1. Ansible が動いているマシン、もしくは動いているコンテナ内の `authorized_keys` から「接続先のホスト情報」を削除するか、チェックを無視させます。
1. 環境変数 `ANSIBLE_HOST_KEY_CHECKING` を `False` に設定すると、ローカル（Ansible が動いているマシン）の `authorized_keys` をチェックしなくなります。

## TS; DR <sub><sup>（マスター、動く `docker-compose.yml` をくれ）</sup></sub>

以下は、AMD64 と ARM64 マシンで動く [Semaphore の Ansible 入り Docker イメージ](https://hub.docker.com/r/semaphoreui/semaphore/tags)を起動させる `compose` ファイルです（`<your 〜>` を置き換えてお使いください）。

DB は ビルトイン DB の "[bolt](https://github.com/etcd-io/bbolt)" に設定され、`docker compose up -d` 実行時のディレクトリに `./docker_ansible/` ディレクトリが作成され、DB と設定ファイルが保存されます。

```yaml:docker-compose.yml
services:
  semaphore:
    restart: unless-stopped
    ports:
      - 3000:3000
    image: semaphoreui/semaphore:latest
    environment:
      SEMAPHORE_DB_DIALECT: bolt
      SEMAPHORE_ADMIN_PASSWORD: <your admin password>
      SEMAPHORE_ADMIN_NAME: <your admin display name>
      SEMAPHORE_ADMIN_EMAIL: <your admin email address>
      SEMAPHORE_ADMIN: <your admin login name>
      ANSIBLE_HOST_KEY_CHECKING: False
    volumes:
      # config.json location
      - ./docker_ansible:/etc/semaphore
      # database.boltdb location (Not required if using mysql or postgres)
      - ./docker_ansible:/var/lib/semaphore
```

## 参考文献

- [HOST_KEY_CHECKING](https://docs.ansible.com/ansible/latest/reference_appendices/config.html#host-key-checking) @ docs.ansible.com
- [Failed to connect to the host via ssh: Host key verification failed.\r\n](https://stackoverflow.com/a/52842406/18152508) @ StackOverflow.com
- #675 [Failed to connect to the host via ssh](https://github.com/ansible-semaphore/semaphore/issues/675) | Issues | ansible-semaphore @ GitHub
Laravel-adminで管理するテーブルを追加する

ユーザーに対してPOPUPを表示させる機能を実装しています。
ユーザーグループIDを追加することで通知するユーザを分けることを可能にしています。
現状はダイレクトにSQLを入力するスタイルですが、Laravel-adminを使用してIDの登録、編集、削除を容易にできるようにします。
やること
- Laravel-admin用のコントローラーを追加
- ルーティングの追加
- フォーム画面の編集
以前、Laravel-adminの導入はすでに行なっているため、作業自体は簡単です。
### Laravel-admin用のコントローラーを追加
[公式サイト](https://laravel-admin.org/docs/en/quick-start)を参考に作業を行いましたが、QuickStartに書かれている内容が古いディレクトリ構造になっているため、以下のコマンドで実行。
```php
php artisan admin:make CollectionController --model=App\\Models\\Collection
```
※Laravel-adminをインストールしていない場合は、先にインストールが必要です。
### ルーティングの追加
Adminディレクトリ内の`routes.php` にデータを追加する。
```php
$router->resource('/collections', CollectionController::class);
```
### コントローラーの内容
```
<?php

namespace App\Admin\Controllers;

use App\Models\Collection;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;

class CollectionController extends AdminController
{
    protected function grid()
    {
        $grid = new Grid(new Collection());

        $grid->column('id', __('Id'));
        $grid->column('name', __('Name'));
        $grid->column('created_at', __('Created at'));
        $grid->column('updated_at', __('Updated at'));
	
        return $grid;
    }

    protected function detail($id)
    {
        $show = new Show(Collection::findOrFail($id));

        $show->field('id', __('Id'));
        $show->field('name', __('Name'));
        $show->field('created_at', __('Created at'));
        $show->field('updated_at', __('Updated at'));

        return $show;
    }

    protected function form()
    {
        $form = new Form(new Collection());
        $form->text('name', __('Name'));
        return $form;
    }
}
```
コントローラーはLaravel-admin公式に色々なカスタマイズ方法が記載されているので、柔軟に変更可能です。
今回は、特にカスタマイズする必要性がないと判断したため、デフォルトのまま行きます！

![スクリーンショット 2022-12-08 16.33.23.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ddd64e81-692f-4103-ab50-eb23b81aee6e/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-12-08_16.33.23.png)
期待通りの画面が表示されました。
![スクリーンショット 2022-12-08 16.40.25.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f2a9c586-9bf6-47bf-89f1-62e2b12fc547/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-12-08_16.40.25.png)
新規登録画面も期待通りです。

「お知らせ機能を管理したい」といった場合に、Laravel-adminは導入コストが少ないのでかなりおすすめです。
【Ruby on Rails】indexページにitem一覧、それぞれのshowページでコメントできるようにする手順

# 概要
・2022年6月にRuby on Railsでオリジナルアプリケーションを制作した。
・トップページ（index）に品目（item）がずらりと一覧で並び、それぞれに対してコメント（review）することができるボタンを設置。ボタンをクリックすると詳細ページとして別リンクに飛ぶ。ただ、indexに大量のitemを並べ、さらにそのitemにそれぞれreviewを紐付ける方法がよくわからず苦戦したのでここにまとめる。

コメント投稿や編集機能について、githubのissueに記載したのでそのリンクを一旦貼っておくが、別途改めてここで手順をまとめたい。
同じような構造のアプリケーションを制作しようとしている方のお役に立てれば！

# 初期データの登録方法
* 初期データの一括登録方法については、以下でまとめました。
[【Ruby on Rails】seedとseed_fuの違い・CSVファイルで読み込ませる方法](https://qiita.com/Ryo-0131/items/a5662c8701aad4af9f65)

# コメント投稿機能
* 以下issueにメモ。
[コメント投稿機能](https://github.com/Ryo-0131/Republic_of_Citrus/issues/5)

# コメント詳細表示機能
* 以下issueにメモ。
[コメント詳細表示機能](https://github.com/Ryo-0131/Republic_of_Citrus/issues/6)

# コメント編集機能
* 以下issueにメモ。
[コメント編集機能](https://github.com/Ryo-0131/Republic_of_Citrus/issues/7)

# コメント削除機能
* 以下issueにメモ。
[コメント削除機能](https://github.com/Ryo-0131/Republic_of_Citrus/issues/8)
Python で grep 機能を作ってみる

ディレクトリを再帰的に検索してテキストファイルを参照して文字列をサーチします。
### jupyterでやってみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/f6e32c31-930b-7dd6-3a06-1b2d46006179.png)

### ソース
```search_txt.py
# -*- cording: cp932 -*-
from pathlib import Path
import re

def main():
    search_pattern = r'[aA][bB][cC]'
    target_path = "D:\\__work\\test\\"
    out_file = "D:\\__work\\search_result.tsv"
    ignore_suffix_list = ["gif", "jpeg"]
    search_txt(search_pattern, target_path, out_file, ignore_suffix_list)

def search_txt(search_pattern, target_path, out_file, ignore_suffix_list):
    str_header = "主ファイル名" + "\t" + "拡張子" + "\t" + "フォルダ"
    str_header = str_header + "\t" + "Line No" + "\t" + "Line"
    fwrite = open(out_file, "w")
    fwrite.write(str_header + "\n")
    p = Path(target_path)
    glob_list = list(p.glob("**/*"))
    for each_path in glob_list:
        if each_path.is_file():
            file = each_path
            stem = file.stem
            suffix = file.suffix.replace(".", "")
            file_name = str(file.name)
            folder = str(file).replace(target_path, "").replace("\\" + file_name, "")
            target = True
            for ignore_suffix in ignore_suffix_list:
                if suffix.find(ignore_suffix) != -1:
                    target = False
            if target:
                all_content = file.read_text()
                split_list = all_content.split("\n")
                line_no = 0
                for content in split_list:
                    line_no = line_no + 1
                    result = re.search(search_pattern, content)
                    if result:
                        edited_line = content.replace("\t", "    ")
                        str_detail = stem + "\t" + suffix + "\t" + folder
                        str_detail = str_detail + "\t" + str(line_no) + "\t" + edited_line
                        fwrite.write(str_detail + "\n")
    fwrite.close()
if __name__ == "__main__":
    main()
```

### 結果例
```search_result.tsv
主ファイル名	拡張子	フォルダ	Line No	Line
test1	txt	test1.txt	2	abc
test2	txt	test2.txt	3	 ABc
test3	txt	sub	4	fffAbCppp
```
AutoptimizeでWordpressの表示が壊れる問題の対処法

Apache+PHPの環境でWordpressを運用している（下記）。

https://cress-fp.jp/

パフォーマンス改善のためにAutoptimizeというプラグインをインストールし、JavaScriptとCSSの最適化を行ったところ、Wordpressの表示が崩れるようになった。

原因は`/wp-content/cache/autoptimize/.htaccess`に許可されていないディレクティブの記述があることによる500エラー。

httpd.confに`AuthConfig`を追加したところエラーが解消された。

```apache:wordpress-httpd.conf
AllowOverride FileInfo Indexes AuthConfig
```

もっとも、Google Compute Engineで運用しているので

```apache:wordpress-httpd.conf
AllowOverride All
```

としてしまってもいいのかもしれない。
良い感じにwindowsでfigが使いたかっただけ

みなさん、こんにちは。
[fig](https://fig.io/)使ってますか？

私はつい先日figに出会ってから、その便利さに感動をいたしまして、もうfigじゃないと満足できないようになりました。
ターミナルで保管が効くだけでなく、環境が共有出来たりととにかく、めちゃくちゃ便利ですよね。

ですが、残念なことにfigはwindowsに対応してないんです😣

仕事中などは全然問題ないのですが、趣味開発はwindowsで行うことが多いので、大事なものを失ったような寂しさを感じていた矢先、見つけてしまいました。

[fig for windows](https://fig.io/user-manual/windows)

現状、ベータ中という事でfigのバージョンを合わせないと、すんなりとは動いてくれなかったのですが、最終的に良い感じに動くようになったので私のセットアップを紹介しておきます。


## セットアップ
[gitbash ver2.37.3](https://github.com/git-for-windows/git/releases/tag/v2.37.3.windows.1)のインストール

::: note info
gitbashはversionが2.37.3でないと、figが私の環境では動きませんでした。
:::

[windows terminal](https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=ja-jp&gl=jp)
windowsだと定番ですね。

[fig for windows](https://fig.io/user-manual/windows)

![windvim1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126631/93d47d45-5c7d-a509-5ba8-ec6ea8177c9d.png)



## まとめ
今のところ特に問題なく動いています。
Atom Editorが復活してた

## Atomは2022年に開発終了！


Atom Editorを開発していたGitHub社が、競合のVSCodeを開発していたMicrosoft社に買収されて以来、Atom Editorの開発は著しく停滞していました。

[ユーザーはまだそれなりにいる](https://survey.stackoverflow.co/2022/#section-most-popular-technologies-integrated-development-environment)のにあまりメンテされないという事で、バグレポートは溜まる一方。

そしてそのまま開発終了が発表されました。

https://github.blog/2022-06-08-sunsetting-atom/

11月23日に最終リリースされると、私の環境ではgitやターミナルなどの主要パッケージが動作しなくなったり、パッケージ配布サイトがスパムだらけになっていたり、コミュニティサイトが消えて数年分の質問と回答が消えたりと、世界の終わりみたいな状況です。

# Atom Editorが復活していた

このような感じで一時は終わっていたAtom Editorですが、なんと**名前を変えて復活**しています。
その名も、**Pulsar editor**です。

https://pulsar-edit.dev/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/8dd7cd64-8912-437e-8063-0d1d9f5500aa.png)

GitHub上には、以下のようなことが書いてあります。

> (Google翻訳)
> **コミュニティ主導のHyper-Hackable Text EditorであるPulsar**
>Pulsar、または Pulsar-Edit と呼ばれることもあるは、最愛の「ハック可能なテキスト エディター」Atomの新しいイメージです。
> https://github.com/pulsar-edit

どうやら、Atom Editorの管理を放棄した**GitHubのかわりに、コミュニティ主導で開発を継続してくれている**ようです。ありがたい話です。

かつてAtom向けにリリースされていた拡張機能たちも新しいサイトからダウンロードできるみたいです。

https://web.pulsar-edit.dev/

これからも安心して、 Atom Editor 改め **Pulsar editor** を使用していくことができますね！

（なお、名前が変わっているのは、小耳に挟んだ所によると商標関連の問題だそう）

#### 参考1：コミュニティが1回分裂した？

Atomの有名なフォークとしては、https://github.com/atom-community がありました。ただPulsar editorは方向性の違いなどから、atom-communityとは別の新しいフォークを維持管理していくことにしたようです。

#### 参考2：Atomの作者が新しいエディタを作っている

Atomの作者がZed Editorという新しいエディタを作っています。

https://qiita.com/access3151fq/items/4b031d856550d749ffe4

Rust製で高速みたいです。まだベータ版ですが、こちらに乗り換えるのもアリか？
自動テストで品質を確保するために

## 自動テストと品質の確保と

自動テストをマメに書くようにしていますが、自動テストを全てpassしてもエラーが起こる時は起こりますよね
出典は忘れましたが、自動テストツールで行うテストは、テストではなくチェックリストの自動実行だと

この意見は一理あって、チェックリストに抜け漏れがあると、その分の品質は確保出来ない訳でして:sweat_drops:
ですが、有償でサービスを提供している側からすると気持ちよくそのサービスを使って欲しい訳でして、
どうすれば自動テストでより良い品質の確保が出きるのか考えてみました

## 自動テストでカバーできない点

これまで自動テストでは問題なかったけど、stagingやproduction環境に上げるとダメだったケースを考えてみると、
* 自動テストに抜け漏れがある
* 環境に依存する
この2つのケースが多かったように思われます

自動テストの抜け漏れがあるケースについては、何故抜け漏れが生じたかを考えてみると
* 時間がかかってテストサイクルに支障が出たのでコメントアウト等を行いそのままだった
* 自動テスト単体で完結しないため出来ない
* 純粋に忘れていたり漏れたりした
* mainルーチンに含まれる不具合で、開発時にはテストしていなかった
ぐらいが思い当ります

## どう対応したら良いか
条件網羅的なメソッドや関数単位での自動チェックは従来通りの自動テストツールで行います
そしてstagingやproductionでのpteテストやQA観点での検証に、mainルーチンの条件を網羅した自動テストを行えば良いのではと考えました
勿論、そのテストは開発者ではなく、QA担当やサービスの仕様を熟知する人に書いてもらうと

テストは[BDD開発](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%98%E3%82%A4%E3%83%93%E3%82%A2%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)ツールで行います
pythonで使えそうなツールを探してみたところ、2つ見つかりました
* [behave](https://behave.readthedocs.io/en/stable/)
* [pytest-bdd](https://pytest-bdd.readthedocs.io/en/stable/)

書きっぷりはほぼ一緒のようですね
なお、[Python BDD Framework Comparison – The Pros and Cons](https://blog.testproject.io/2019/05/16/python-testing-framework-pros-cons/) が大変参考になりましたので、気になる方はチェックしてみてください

単体テストをpytestで書いているので、pytest_bddを使うことにします


```report.feature
Feature: MakeReport
  make report without no error(s)

  Scenario: Make Report
    Given Year: 2022, Month: 11
    Then Return True
```


```test_report.py
from datetime import date

import pytest
from pytest_bdd import scenarios, given, then, parsers

import app


scenarios('report.feature')


@pytest.fixture
def target_year_month():
    return {"YearMonth": date.today().strftime("%Y%m")}


@given(parsers.parse("Year: {year}, Month: {month}"), target_fixture="target_year_month")
def set_param(year, month):
    return {"YearMonth": f"{year}{month}"}


@then(parsers.parse("Return {return_value}"), target_fixture="target_year_month")
def return_true(return_value, target_year_month):
    assert app.main(target_year_month) == return_value

```

ちょうど担当していた年月をパラメータに受けて、そのレポートファイルを出力するテストを書いてみました
(本来であれば、レポートファイルのコンテンツもチェックすべきですが、今回は割愛します)
シンプル過ぎますね...

着目したいのが、featureファイルの書きようです
業務が分かっていて、少しシステムが分かっていれば、その人にfeatureファイルを書いてもらえば、
上述の「純粋に忘れていたり漏れたりした」のは防げるのではということです
そして上にあげた2点もクリア出来ますね
* 自動テスト単体で完結しないため出来ない
* mainルーチンに含まれる不具合で、開発時にはテストしていなかった


「時間がかかってテストサイクルに支障が出たのでコメントアウト等を行いそのままだった」
こちらもこのBDD開発ツールでのテストを行うと必然的にクリアできます


## 今後の取り組み
現在私が関わっているシステムでは、ブラックボックスでテスト設計してくれるメンバーと
そのテストを実施してくれるメンバーがいます
ですが、システムの内部仕様まで意識したテストをする体制にはなっていません
QA的な体制を組むのはこれからですね

チームメンバー全員でワイワイとfeatureファイルを書きながら、何故このテストが必要なのかを皆で相談してチーム全員でテストを楽しめれば良いなと妄想しています
サンタクロースはおばけでした

サンタクロースってこの世に存在するんだっけ？おばけなんだっけ？
気になったので調べます。

# はじめに
今回はサンタクロースが「おばけ」に似ているのか「おじさん」に似ているのかをAIを用いて調べます。

おばけとおじさんのデータベースを用意します。

おばけのデータベース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952830/d03cdf4c-6432-7deb-94c6-073bfed25e56.png)
おじさんのデータベース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952830/21b79aa0-03b3-9845-5648-bdf3c38c71ad.png)

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952830/f64606fc-6407-5cf8-ac42-bf138f620428.png)

類似度は画像同士の距離を表します。（サンタクロースとおばけの距離）
画像間の距離が短い(数字が小さい) = 似ている

ということで、
サンタクロースは、おばけでした。

# 実装
- imgsim（たった数行のコードで画像の類似度判定をしてくれるライブラリー）


```python
import cv2
import imgsim

# {画像パス: 画像の距離}の辞書を作成（あとで類似度が高い順にSortするため）
im_dist_dic = {}

# input画像を読み込みます。
input_im = cv2.imread(santa.jpg)
# 類似度判定のためのベクトル化（サンタクロースの画像）
input_vec = vtr.vectorize(input_im)

# データベースの画像を読み込む
db = glob.glob("db/*.jpg", recursive=True)

# データベースは複数枚あるのでfor文で回します。
for db_img_path in data:
  db_im = cv2.imread(db)

  # 類似度判定のためのベクトル化（DB）
  db_vec = vtr.vectorize(db_im)
  # 画像間の類似度計算（値が低いほうが似ている画像ということになります。）
  dist = imgsim.distance(db_vec, input_vec)
  # 結果の格納
  im_dist_dic[db_img_path] = dist
```
```python
# 類似度が高い順にSortする
im_dist_sort = sorted(im_dist_dic.items(), key=lambda x:x[1])

# 結果の出力
from IPython.display import Image

print("入力画像")
display(Image(santa_im_path, width=128))
for im_dist in im_dist_sort:
  print("")
  display(Image(im_dist[0], width=128))
  print("類似度", im_dist[1])

```

# 最後に
サンタクロースはおばけということがわかりました。と言いたいのですが、真面目に考察すると、背景の色なども関係していそうですね。
最近のDatabricksワークフローの機能(Slack投稿など)を試してみる

ジョブ実行結果を知らせる通知周りの機能が強化されています。

# 通知先の追加

:::note
**プレビュー**
本機能はパブリックプレビューです。
:::

これまでは通知先はメールのみでしたが、Slack/Teams/Webhook/PagerDutyが追加されました。

**Enhanced notifications for your Databricks jobs (Public Preview)**

https://docs.databricks.com/release-notes/product/2022/november.html#enhanced-notifications-for-your-databricks-jobs-public-preview

ここでは、Slackに通知する様にしてみます。

1. SlackのWebhookのURLを取得しておきます。[こちら](https://zenn.dev/hotaka_noda/articles/4a6f0ccee73a18)が参考になります。
1. ジョブを開き、**システム通知を編集**をクリックします。
![Screen Shot 2022-12-08 at 17.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f1973528-1d1d-2da1-8ab8-836a81552955.png)
1. **新しい送信先を作成**を選択します。
![Screen Shot 2022-12-08 at 17.58.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b9289e6f-d591-e6f6-fb7d-f833dca1c41b.png)
1. 管理コンソールに移動しますので、**+新しい送信先**をクリックします。
![Screen Shot 2022-12-08 at 17.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fcb77f79-ff05-5b52-4740-1fa7ae05ebff.png)
1. タイプから**Slack**を選択し、Slack WebhookのURLを入力します。
![Screen Shot 2022-12-08 at 18.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b039cbd4-98e7-d5d2-ba88-98cafc8c9d8a.png)
1. **作成**をクリックします。送信先が追加されます。
![Screen Shot 2022-12-08 at 18.10.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce1ff774-d254-853d-2080-456910cdf59e.png)
1. ジョブに戻って作成した送信先を選択します。
![Screen Shot 2022-12-08 at 18.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fdc01dc4-7cb0-e93b-d8cb-e9e4da78e68a.png)
1. 送信先にSlackが設定されました。
![Screen Shot 2022-12-08 at 18.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a4831790-1643-7e3a-e4ae-87b88fddf3fb.png)
1. ジョブを実行します。結果がSlackにポストされます。便利。
![Screen Shot 2022-12-08 at 18.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/95e87e09-50b1-b875-72a8-015c05cd8111.png)

# 通知メールフォーマットの改善

地味な機能改善ではありますが、これも嬉しいです。

1. 管理コンソールに移動します。
1. **New Format for Jobs Emails**を有効化します。
![Screen Shot 2022-12-08 at 17.45.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c1766d9f-00a9-8fd3-d928-348344cda5d4.png)

**無効化**

素朴です。

![Screen Shot 2022-12-08 at 17.53.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ba725acc-4f3a-235d-18a6-13cfe2175432.png)

**有効化**

よりinformativeになりました。

![Screen Shot 2022-12-08 at 17.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/18aaedc4-a838-fb7b-0b44-538ca31239e0.png)

ぜひ試してみてください！

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
ChatGPTの拡張機能が地味に最高に便利だった

## はじめに
- 概要
    - つい最近、OpenAIが`ChatGPT`というAIのベータ版を公開して、実際に使ってみた結果かなり便利だな感じていて、さらに面白い使い方ができるGoogle・Firefox拡張機能見つけたので、その拡張機能を紹介します。
- 想定読者
    - ChatGPTを既に使っている人(これから使ってみたい人)

## 今回やること
- 今回はGoogleの拡張機能を実際に使ってみる。

## 前提(準備)
- ChatGPTをまだ使っていない方は、下記参照して使用できるようにしておいてください。

https://qiita.com/sakasegawa/items/82069c97a1ee011c2d1e 

- 拡張機能ダウンロード

    - [Googleで使う方はこちら](https://chrome.google.com/webstore/detail/chatgpt-for-google/jgjaeacdkonaoafenlfkkkmbaopkbilf)

    - [Firefoxで使う方はこちら](https://addons.mozilla.org/ja/firefox/addon/chatgpt-for-google/)

## 実際に使ってみる
今回は適当にクライアントから入力された値があって、その値にカンマが入っていたらPHP側でそのカンマを消したいという仮定で進めてみます。

1. まずはGoogleから拡張機能をダウンロードして、ChatGPTの開発元であるOpenAIのアカウント作成する。
2. OpenAIにログインした状態にしておく。
3. Googleで`PHP カンマを取り除く`のように、やりたいことを検索してみる。
4. 下記のように右側あたりに、ChatGPTが使用方法とそのコードの説明をしてくれます。

![スクリーンショット 2022-12-08 13.52.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/55580942-5d7e-29a3-e60b-2e88caa4c21c.png)

### ※注意点
- 先にOpenAIにログインできていないと、下記のように先にログインしてくださいと言われますので忘れずに。
![スクリーンショット 2022-12-08 14.03.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/9bf12639-e487-e981-9c9e-cf9d53249319.png)

## 使ってみて感じたメリット
- わからないことが出てきた場合に今まで通り、Google検索をしつつも先にChatGPTにもヒントを伺うことが可能で、そのヒントで解決したら検索結果は無視できますし、回答が微妙な場合はそのまま検索結果を見ていけるという合わせ技ができるのがよいですね。

## 終わりに
ChatGPTを使ってみた感覚だと、今まではわからないことが出てきた際にはググっていたが、それがChatGPTに置き換わりそうな気がしてきました、、、
なぜかというと**コードの説明やなんでこうなっているか？などもきちんと説明してくれるかつ、「〜でもできるのでは？」みたいに聞きなおすと、「確かにそれでもできますが、1点問題があります。それには...」のように続けて返事までしてくれます。**
もうわからないことは、まずAIに聞く時代に突入したのかもしれませんねｗ

しかし、かといって知りたい内容によってはググりたい場合も出てくるので、いっそのことなら**ChatGPTに訪ねつつ、回答が微妙な場合は検索結果を見ていくといったやり方を叶えてくれる**この拡張機能は最高ですね。

## 参考
https://openai.com/blog/chatgpt/
PG16:show walsender's connected db for ps command entry

# はじめに

にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 14日目の記事です。

今回はLinuxの``ps``コマンドで表示される、PostgreSQLプロセスの表示の改善について書いてみます。

# 概要

|項目|内容|
|:--|:--|
|タイトル|[show walsender's connected db for ps command entry](https://commitfest.postgresql.org/40/3937/)|
|Topic|Miscellaneous|
|ステータス|commited|
|Last Modified|2022-11-15|
|概要|``walsender process``の ``ps`` 表示時に、データベース名が表示されるようになった|



# 変更内容
まあ、概要に書いたそのままなのですが、PostgreSQL 16からは``ps``コマンドでロジカルレプリケーション接続中の``walsender process``にデータベース名が表示されるようになりました。
また、比較のために、ストリーミングレプリケーションプロトコルを使っている``pg_basebackup``での接続時の例も示します。

## 例：論理レプリケーション

2つのインスタンス（publisher:port=10001, subscriber:port=10002, どちらのインスタンスにも``testdb``というデータベースを作成し、そのデータベース内にテーブルを作成してロジカルレプリケーションする簡単なモデルを動かします。

ロジカルレプリケーション接続されている状態で、``ps``コマンドの結果を、``walsender``でgrepった結果を見てみます。

### PostgreSQL 15

PostgreSQL 15では、``ps``結果のwalsenderプロセスの行にはデータベース``testdb``の情報は表示されません。
```bash
$ ps -ef | grep walsender
ec2-user 32590 32467  0 18:02 ?        00:00:00 postgres: walsender postgres 127.0.0.1(39594) START_REPLICATION
ec2-user 32605 27924  0 18:03 pts/4    00:00:00 grep --color=auto walsender
$
```

### PostgreSQL 16

PostgreSQL 16からは、``ps``結果の``walsender``プロセスの行にロジカルレプリケーションの接続先データベース``testdb``が表示されるようになりました。

```bash
$ ps -ef | grep walsender
ec2-user   337 32758  0 18:06 ?        00:00:00 postgres: walsender postgres testdb 127.0.0.1(39602) START_REPLICATION
ec2-user   341 27924  0 18:06 pts/4    00:00:00 grep --color=auto walsender
$
```
## 【参考】例：pg_basebackupユーティリティ

``pg_basebackup``ユーティリティでは、ストリーミングレプリケーションのプロトコルを使っています。
なので、``pg_basebackup``ユーティリティの実行中に、別ターミナルから``ps``コマンドの結果を確認してみました。

### PostgreSQL 15

```bash
$ ps -ef | grep "walsender"
ec2-user 27876  5653  0 13:14 ?        00:00:00 postgres: walsender postgres [local] sending backup "pg_basebackup base backup"
ec2-user 27877  5653  0 13:14 ?        00:00:00 postgres: walsender postgres [local] streaming 0/2000110
ec2-user 27901 27680  0 13:15 pts/1    00:00:00 grep --color=auto walsender
$
```
pg_basebackup実行時中のwalsederプロセスには``[local]``が接続先データベースとして表示されています。


### PostgreSQL 16

```bash
 ps -ef | grep "walsender"
ec2-user 28000 32064  0 13:19 ?        00:00:00 postgres: walsender postgres [local] sending backup "pg_basebackup base backup"
ec2-user 28001 32064  0 13:19 ?        00:00:00 postgres: walsender postgres [local] streaming 0/A000110
ec2-user 28004 27680  0 13:19 pts/1    00:00:00 grep --color=auto walsender
$
```

PostgreSQL 16でもpg_basebackup実行時中のwalsederプロセスには``[local]``が接続先データベースとして表示されています。



# おわりに
今回は論理レプリケーション中に``ps``コマンドを実行したときの表示の改善について書きました。

でも、なんでこれの``Topic``が``Monitoring & Control``じゃなくて``Miscellaneous``なんだろう・・・？
VSCodeでsvgファイルをdraw.ioに関連付ける

VSCodeでSVGファイルを普通に開くと、テキストとして開かれてしまうので困る。
そこでSVGもdraw.ioで開くように設定する。

以下、draw.ioの拡張をインストール済みとして、
・なんでもいいので拡張の設定を開く
・上部の検索欄に「workbench.editorassociation」と入力
・出てきた設定欄で「項目の追加」を押して、項目に「*.svg」、値に「hediet.vscode-drawio-text」を入力してOKする。
↓のようになればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/6e99ea80-6f92-f00c-0fde-6c14cefb377d.png)

これで拡張子.svgもdraw.ioで開くようになります。

参考サイト（draw.io integrationの公式ヘルプに書いてあるんですけど、なかなか探せない）
https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio
以下引用＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
Associate .svg Files With The Draw.io Editor
By default, this extension only handles *.drawio.svg files. Add this to your VS Code settings.json file if you want to associate it with .svg files:

"workbench.editorAssociations": {
    "*.svg": "hediet.vscode-drawio-text",
}
You won't be able to edit arbitrary SVG files though - only those that have been created with Draw.io or this extension!
RubyのWebAssemblyを試す

## これはなに？
3.2.0からブラウザ上でrubyが動くということなので試してみよう、という話です。

今現在RC1が出ています。
https://www.ruby-lang.org/ja/news/2022/12/06/ruby-3-2-0-rc1-released/

この中でも特に気になっていることが、

* WASIベースのWebAssemblyサポート
* YJIT

この２つあります。
YJITはそのうち試してみるつもりです。

## 準備
といっても単に動かすだけならローカル上にruby3.2.0をインストールする必要もないので、webrickだけ入れておきます。

```
$ mkdir _rbrc1
$ cd _rbrc1
$ gem install webrick
$ ruby -run -e httpd .
```

## 試す
test.htmlを作成して中身を記述します。

```
$ vim test.html
```

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width" />
    <title>Test</title>
    <script src="https://cdn.jsdelivr.net/npm/ruby-head-wasm-wasi@0.5.0/dist/browser.script.iife.js"></script>
    <script type="text/ruby" src="src/foo.rb"></script>
  </head>
  <body>
    <h1>body</h1>
    <button id="btn">Button</button>
    <div id="result">result</div>
    <script type="text/ruby">
      require 'js'
      @document = JS.global[:document]
      elm = @document.getElementById 'result'
      elm[:innerText] = 'hogehoge'

      puts 'Hello World!'
      puts Time.now.to_s
      puts Foo.new.box

      def handler
        elm = @document.getElementById 'result'
        elm[:innerText] = Foo.new.pick
        puts "onclick handler #{elm[:innerText]}"
      end

      button = @document.getElementById 'btn'
      button.addEventListener "click" do
        handler
      end
    </script>
  </body>
</html>

```

`<script type="text/ruby">`の中身はほぼrubyですね。

src/foo.rbという外部ファイルを作成してrubyのコードを書いておきます。

```ruby
class Foo
  def box
    %w(foo bar baz hoge)
  end

  def pick
    box.shuffle.first
  end
end

```

localhost:8080/test.htmlを開いて動作を見てみます。

![スクリーンショット 2022-12-08 17.32.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6404/5df3ef69-4669-4a94-1f86-52982cd613e6.png)

ボタンを押すたびに文字が入れ替わるだけ。
おお・・・動いている・・・！

最後に書いたコードとvercelで動いているURLを載せておきます。

https://github.com/runeleaf/ruby-wasm-dev
https://ruby-wasm-dev.vercel.app/

すべてがjavascriptと置き換わることはないと思いますが、今後の展開はけっこう期待できそうです。
【Dart + Mockito】verifyでモック呼び出し回数が合わない

# 問題の状況

## テストのコード

- ユニットテスト
- テスト対象の依存をモック
- 複数のテストケースがある
- モックはテストケースで使い回す  
  - いずれもモックを呼び出している
  - verifyでモックの呼び出しを確認する場合としない場合が混在

```dart
@GenerateMocks([Dependency])
void main() {
  final mockDependency = MockDependency();
  SomeUseCase init() => SomeUseCase(mockDependency);

  group("SomeUseCaseのテスト", () {
    setUp(() {
      when(mockDependency.fetch()).thenReturn(0);
    });
    test("テストケース１", () {
      // prepare
      final target = init();
      
      // test 
      target.call(); // invoke mockDependency.fetch()
      
      // no verify of mockDependency
    });
    test("テストケース2", () {
      // prepare
      final target = init();
      
      // test 
      target.call(); // invoke mockDependency.fetch()
      
      // verify
      verify(mockDependency.fetch()).called(1);
    });
  });
}
```

## テスト結果
テストの実行順序によっては、verifyで確認するモックの呼び出し回数が想定より多い

```bash
Expected: <1>
  Actual: <2>
Unexpected number of calls
```

# 解決

前に実行したテストケースでのモック呼び出しの記録が残ったままになっている！

## 1. 各テストケースでverifyする

```diff
    test("テストケース１", () {
      // prepare
      final target = init();
      
      // test 
      target.call(); // invoke mockDependency.fetch()
      
-     // no verify of mockDependency
+     // verify
+     verify(mockDependency.fetch()).called(1);
    });
```

## 2. モックをresetする

https://pub.dev/documentation/mockito/latest/mockito/reset.html

```diff
  group("SomeUseCaseのテスト", () {
    setUp(() {
+     reset(mockDependency);
      when(mockDependency.fetch()).thenReturn(0);
    });
```
データ辞書を使ってみる

はじめ
---
データ辞書とは大規模な情報システムでデータの一貫性や整合性を保つために、扱うデータの種類やそれぞれの名称、意味、所在、データ型などを列挙したデータベースや文書類のことです。
### 今回のシナリオ
あるテーブルの住所のデータに対して、データ辞書を参照して、クレンジングすることで都道府県の表示を一致するようにします。

先ずInformaticaのプロファイリング機能を活用して、事前にデータ品質を分析することで、どんなクレンジングが必要なのかを予めに把握することができます。（プロファイリング機能の紹介は：[What is Data Profiling and Why Profile Your Data?](https://www.informatica.com/blogs/what-is-data-profiling-and-why-profile-your-data.html)）

ソースのデータに対してプロファイリングしたら、住所の値が下図の結果となります。後尾に「都/道/府/県」いずれかの文字を付いてるレコードと付いてないレコードがあって、平仮名で入ってるデータもあります。多分、複数のシステムから統合してきたデータかもしれませんが、値の表示ルールが統一されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/b986afad-24e8-0127-f782-cdd414538397.png)


Informaticaでデータ辞書を使う方法
---
#### データ辞書を準備する
色んなパターンを纏めたExcelファイルを用意します。このファイルを辞書として登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/e2188987-3f17-4dd9-8693-facac8f68c91.png)
#### IICSにインポートする
データ品質の画面に入って、新規ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/99bddb5a-0c1c-5ea5-b700-0fcff79cd41a.png)

ディクショナリをクリックして新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/3c486bc7-92d0-1514-1429-fe8172689ee4.png)

設定画面にインポートボタンをクリックすることで、データ辞書ファイルを選択して、インポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/1c22e5fc-f956-c213-2bbb-e0670805abd6.png)

最初の行からインポートをチェックすれば、タイトルをスキップして第一行のレコードから読み取ります。
設定完了後、「インポート」をクリックして、右上の保存ボタンを押して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/36fa4f3c-30bd-3435-7941-7b2c2a19d79e.png)

左のナビゲーション欄に新規ボタンをクリックして、クレンジングを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/3b0f7b05-65e5-fdbc-86e7-b6de8119b1d9.png)

クレンジングの設定画面に、「＋」ボタンを押して、クレンジングルール（値の置換）を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/2cb0aeb1-7307-4c23-0c36-1a1ebc484dc0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/5106f51b-0d10-39ab-3531-477aa08d6ea4.png)

右半分の設定は以下をご参照ください。
モード：入力値をディクショナリ値で置換
ディクショナリ：先作成したディクショナリを選びます。
有効なカラム：辞書のどのカラムに統一しますかという意味です。
区切り文字：なしにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/80d276ca-7dee-286c-41cd-910c18e352bd.png)

設定したルールは正常に動作するのか、結果をテストすることもできます。画面の下側に入力値を入れて、Secure Agentを選んでテストを行います。このルールでクレンジングしたら、データが予想通りになるかどうか確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986164/d217ea66-515c-9e3e-2711-b1faae6e59df.png)

こんな簡単な設定をすることでデータ辞書を使えます。データ辞書を使ってるクレンジングはマッピングにも使えますし、プロファイリングのルールとしても使えます。

#### まとめ
InformaticaのUI(ユーザーインターフェース)にマウスでクリックするだけで簡単にデータ辞書とクレンジングを設定することができます。その便利さをぜひお試しください。
【画像加工】remove.bg【自動画像切り抜き】

## remove.bg

https://www.remove.bg/ja

ドラッグ＆ドロップで画像の背景を自動で削除してくれるサイトです。

## 使い方

1. 「[remove.bg](https://www.remove.bg/ja)」にアクセスします。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748682/feb9c24f-3da6-3e24-238a-ac4268d472ea.jpeg)

2. 加工したい画像をドラッグ＆ドロップします。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748682/13487921-7888-f66d-6bab-6da3dfaef7b4.jpeg)

3. ダウンロードボタンで画像を保存します。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748682/40fe1a19-e771-b5e7-9f8a-ebdfc39e7506.jpeg)

## サンプル

### Before
![PAK13_moshimoshiOL20131019_TP_V.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748682/26136817-e9f1-8688-2ace-d89dbbd0e53c.jpeg)

### After
![PAK13_moshimoshiOL20131019_TP_V-removebg-preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748682/817f8434-5842-ff66-b695-cb4e1088f20d.png)