OmniAICreator/Qiita-1.07M huggingface dataset:
CloudWAN②CloudWANの初期設定

前回はCloudWANの概要やメリット・デメリットについて確認しました。
今回は、NetworkManager・CloudWANの初期設定をやっていこうと思います。
初期設定は下記①～③流れで行います。

①GlobalNetworkの作成
②CoreNetworkの作成
③コアネットワークポリシーの設定（利用リージョンやセグメントの設定）

それでは、早速設定をしていきましょう。

CloudWANの設定画面は、VPCのメニューから移動できます。
左メニューから「ネットワークマネージャー」を選択し、「今すぐ始める」を押下します。
# NetworkManager・CloudWANの初期設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/664e9cd6-add1-c180-4ad5-4886e178ceee.png)

まずはグローバルネットワークの設定を行います。
グローバルネットワークの名前・説明・タグを入力し、「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/db928f44-c627-5748-78d2-d7990ff46323.png)

コアネットワークの設定を行います。
コアネットワークの名前・説明・タグを入力し、「次へ」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/cbf3df39-edcd-ebba-0ff8-5a82d367c4c5.png)

コアネットワークポリシーの設定を行います。
ここで重要な注意点があります。既存のTransitGatewayをCloudWANに接続したい場合は、CloudWANのASNにTransitGatewayのASNと重複しない範囲を指定してください。

CloudWANとTransitGatewayのASNが重複してしまうと、TransitGatewayピアリングの際にエラーとなってしまいます。CloudWANに接続するTransitGatewayが複数ある場合は、TransitGateway同士のASNが重複していても同様のエラーが発生します。補足ですが、TransitGatewayのデフォルトのASNは64512となっています。現状はTransitGatewayのASNは作成後の変更ができないため、TransitGatewayを複数CloudWANで接続する場合は注意してください。

エッジロケーションにCloudWANを利用するリージョンを指定します。
セグメント名を入力し、「次へ」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/53fe1fbf-e4bf-fca9-2c60-b500e7dd6088.png)


確認画面が表示されます。
「グローバルネットワークを作成」を押下すると、グローバルネットワーク・コアネットワーク・セグメントの作成が開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/cba27ba9-6d99-f47b-5905-86226617c92f.png)

初期設定直後の画面です。コンソール上部に「グローバルネットワークが正常に作成されました」と表示されていることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/4b864f63-45d3-81c6-23cb-480cc9e78d7c.png)

# 画面の確認
これでNetworkとCloudWANが有効化できました。
まずはコンソールから確認していきましょう。
コアネットワークのタブを選択すると、先ほど「エッジロケーション」で設定したリージョンにコアネットワークが存在するのが分かります。

今回は東京とパリをエッジロケーションに指定したため、「エッジロケーション」には2と表示されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/007fd974-d69a-d767-579a-8439df3d8406.png)

コアネットワークの詳細画面です。コアネットワークの名前やアカウント、タグなどが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/227e7548-4b58-6e2b-d1fc-2d47ef2f88b2.png)

まだアタッチメントやTransitGatewayなどが登録されていない為、トポロジグラフにはエッジロケーションだけが表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/b7cacf04-2d84-69ef-bfff-fbb516bc6f2b.png)

今後TransitGatewayやVPCアタッチメントなどを登録していくと、CloudWAN側で画像のようなトポロジツリーが自動で作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/573f3e8a-950c-22ef-16e7-efbbb08fdf7f.png)

左メニューから「ポリシーのバージョン」を選択し、表示しています。
「Policy-version-1」と表示されているのが、先ほど設定したコアネットワークポリシーです。
Policy-version-1の状態が「Execution succeeded」と表示されるまで10～30分ほど待機します。ポリシーの適用が完了したら、アタッチメントの設定やコアネットワークポリシーの変更などが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/453f025b-cefa-3161-ca49-a6d6b32e06f1.png)

今回はCloudWANとNetworkの初期設定について確認しました。
次回からは、本格的なCloudWANの検証に入っていこうと思います。
ここまでお読みいただきありがとうございました。
CloudWAN①（CloudWANの概要）


案件でCloudWANを触る機会があったため、CloudWAN構築方法やメリット・デメリットなどについて書いていこうと思います。

# AWS CloudWANとTransitGatewayの違い
まずは、TransitGatewayとCloudWANの違いについて考えてみようと思います。

これまでは、TransitGatewayによりリージョン内のVPC、VPN、DirectConnectの一元管理を行っていました。TransitGatewayはリージョナルサービスとなるため、複数リージョンを接続する場合は、TransitGateway同士をピアリングさせる必要がありました（画像内の赤く囲ってある部分です）。
リージョン同士を相互に通信させたい場合はTransitGatewayピアリングをメッシュ構成で設定する必要があります。運用の際はリージョンを切り替え、各リージョンのTransitGatewayの画面からルートテーブルなどの管理を行うことになります。
リージョン内の通信については一元管理できるとは言え、リージョンが増えるごとに運用の手間は増大し、やや不便な状態でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/1f741364-c6b0-d54d-3726-f2ee67c2a7d8.png)


ここにCloudWANが登場しました。CloudWANを使用することで、リージョンまたぎの通信も一元管理することが可能となりました。VPCやVPNをCloudWANに直接接続し、ルーティングの制御をすることが可能です。ただし、DirectConnectを使用する場合はTransitGatewayを併用する必要がある点に注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/ce5b79e6-f760-da8f-4194-7c480c47d89b.png)


# AWS CloudWANの詳細
検証の前に、CloudWANの構成要素について確認します。
CloudWANの部分を詳細化した構成図がこちらになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/6893eddb-4ad3-6f4b-fe25-0b0f7e0703b8.png)

リージョンごとにCoreNetworkEdgeが存在します。CoreNetworkEdge同士はBGPでルートを共有しています。「検証環境」「本番環境」などでルーティングを変えたい場合はセグメントを定義することで、各環境のルートテーブルを分けることができます。CoreNetworkEdgeを作成するリージョンやセグメント、セグメント内のルーティングなどはCoreNetworkPolicyで定義します。VPC・TransitGateway・VPNを各セグメントに接続させたい場合は、アタッチメントの作成後にCoreNetworkPolicyにてアタッチメントポリシーの設定を行います。


## ClowdWANのメリット・デメリット
### CloudWANのメリット
・マネージドサービスの為リージョン間のDRについて考慮しなくて良い
・NetworkManagerで各リージョンのTransitGateway・DirectConnect・VPNやVPCなどを一覧化し一元管理が可能
・ダイナミックルーティングによりルートテーブルのメンテナンス作業を省略可能

### CloudWANのデメリット
・TransitGatewayよりも高コスト
・ダイナミックルーティングの為細かいルーティングの制御が行いづらい

CloudWANの内部ではTransitGatewayが動いているそうです。なので、CloudWANは大まかにはTransitGatewayのマネージド版と考えることができそうです。
VPCをCloudWANに接続した場合は、ダイナミックルーティングでCloudWAN側のルートテーブルに情報が伝播します。そのため、ルーティングの管理などの手間を減らすことができます。特にマルチリージョン構成の場合は、TransitGatewayのピアリングの手間を省けるのは大きなメリットだと思います。

その反面、ルーティングの細かい制御がやりづらい仕様となっています。IDS/IPSなどを導入し、VPC間やリージョン間の通信経路を細かく制御する場合は、TransitGatewayの方が有効なケースもありうるかと思います。また、CloudWANはコアネットワークの数・アタッチメントの数・CloudWANに接続したTransitGatewayの数に応じて時間課金が行われます（参考：https://aws.amazon.com/jp/cloud-wan/pricing/?nc=sn&loc=3) 。
TransitGatewayの料金と比べると高額になるため、実際の利用時は考慮が必要です（TransitGatewayの利用料:https://aws.amazon.com/jp/transit-gateway/pricing/) 。
検証環境でCloudWANを利用する場合は、検証完了後こまめにGlobalNetworkやCoreNetworkを削除するよう注意してください。

今回はCloudWANの概要やメリット・デメリットなどを確認してきました。
次回はCloudWANの初期設定について書こうと思います。ここまでお読みいただきありがとうございました。
Turbo 5: iOSとAndroidでネイティブへ

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://turbo.hotwired.dev/handbook/native

Turbo Native for iOS はTurbo対応のWebアプリをネイティブiOSシェルでラップするためのツールを提供します。複数のビュー コントローラーにまたがる単一のWKWebViewインスタンスを管理し、Turboのクライアント側のパフォーマンス上の利点をすべて備えたネイティブナビゲーションUIを提供します。詳細については[Turbo Native: iOS](https://github.com/hotwired/turbo-ios)を参照してください。

Turbo Native for Androidは同じ種類のツールを提供し、複数のFragmentの宛先にわたって単一のWebViewインスタンスを管理します。詳細については[Turbo Native: Android](https://github.com/hotwired/turbo-android)を参照してください。

ネイティブアダプターで何ができるかを確認する最善の方法はネイティブアプリケーションのデモをセットアップすることです。iOS用とAndroid用があります。ネイティブ環境でコードを開き、手順に従ってすべての機能を調べることができます。
ゲームクリエイターに学ぶエンジニアの仕事の姿勢

## はじめに
こんにちは。 [OPENLOGI Advent Calendar 2022](https://qiita.com/advent-calendar/2022/openlogi) 5日目を担当します山田です。

2018年からWEBエンジニアとして活動をしており、今月新たに[オープンロジ](https://corp.openlogi.com)にジョインしました。
先日は弊社の尾藤さんより開発組織の改善についての[記事](https://note.com/bto/n/n7bb28ad27d2e)を書いていただきました。

本日は別の業界で活躍されているリーダーの仕事の姿勢について共有させていただければと思います。

## 概要
本記事ではゲームクリエイターの[桜井政博](https://ja.wikipedia.org/wiki/%E6%A1%9C%E4%BA%95%E6%94%BF%E5%8D%9A "桜井政博")さんが最近公開したyoutubeのチャンネルから、今後のエンジニアとして参考になりそうな教訓や心構えをいくつかピックアップしつつ、今までの経験と照らし合わせてご紹介させていただきます。

#### ※注意※
- オープンロジには今月入社したため、本記事で解説する体験談は全て前職のものになります。
- 本記事は筆者の解釈が含まれます。気になる内容があればぜひ本動画もご覧ください。


## 簡単な解説
https://www.youtube.com/@sora_sakurai_jp/videos

2022年から現在まで不定期で投稿されている桜井政博さんの個人youtubeチャンネルです。
19歳からおよそ30年間ゲーム業界の最前線で活動を続けてきたノウハウや心構えなどを**無料**で解説していただける太っ腹なチャンネル。

ターゲット層は新人ゲーム製作者はもちろん、全く別の業界の方もターゲットとしているため、ゲーム専門用語などは控えめに非常にわかりやすい内容となっています。
動画には「ゲーム設計」、「グラフィック」など様々なカテゴリに分かれていますが、今回は、よりエンジニアに参考になる「仕事の姿勢」カテゴリを解説します。

## なぜ記事にしようと思ったのか？

動画を拝見するとゲーム業界もWEB業界も**ユーザーに価値を提供するという目的は同じ**であり、学べる点は多いと感じました。一見するとゲームの仕様の解説ですが、「これがWEBサービスなら」と脳内で変換することで新たな気づきが得られることもあると思い、今回ご紹介させていただきました。

## 本題

### 仕事の姿勢について

> (好きなことを仕事をするということについて)
>
> **少なくとも私は自分の好みで企画をしません。**
> **どんなジャンルを提示されても課題とみなし考えた上で目的に合ったものを作ろうとします。**
> **（中略）好みに関係なくゲームの面白さがなぜ生まれるのかを理解することで幅広い作品が作れるのではないか。**
>
> -[遊びの仕事は遊びじゃ無い【仕事の姿勢】](https://www.youtube.com/watch?v=5DS_aGjo9zY "遊びの仕事は遊びじゃ無い【仕事の姿勢】")より

世界的なゲームクリエイターなのに自分が好きなものを優先していない、というのは想像と違い驚いた点です。（それでもなるべく楽しむのが一番良いとも言っています）

この言葉をエンジニアリングに言い換えると、プロダクトやチームの配属先など自分の要望が通ることはほとんど無いが、
プロとして仕事をする以上は会社として目的達成のために課題を解決すべし、という感じでしょうか。

### 成果物について
> (制作側の都合によりやむなくユーザーに不親切な結果となってしまった時)
>
> **こんな時によく口に出す言葉があります。**
> **「それ、プレイヤーに事情を説明して回るつもりなの？」**
>
> -[お客さんに説明できるの？【仕事の姿勢】](https://www.youtube.com/watch?v=5DS_aGjo9zY "お客さんに説明できるの？【仕事の姿勢】")より

前職が受託開発だったため、この動画が一番個人的に刺さるものがありました。
スケジュールが圧迫されていくにつれクライアントの最初の要望が削り取られた結果、機能が想定より使いづらいものになってしまった経験が大いにあります。
品質を担保することは前提として、ユーザー視点を軸として理想と技術とスケジュールの間で良いバランスを保てるよう日々PMやクライアントと対話していくことが大切かと感じました。

### プレゼンについて

> **プレゼンはスピードに他ならない。贅肉を削ぎ落とし、必要なことだけ伝えるようにしましょう。**
>
> -[プレゼンはスピード【仕事の姿勢】](https://www.youtube.com/watch?v=otyLLbYDF1g "プレゼンはスピード【仕事の姿勢】")より

エンジニアの仕事の一つに、クライアントにプロダクトの機能、もしくはプロダクトそのものの説明をする機会はあると思います。
過去に自分がやってしまった経験として、ある機能の実装内容の説明をクライアントにする際に、半日かけて機能に関連する情報を全て書き起こし、ページ全体に画像と説明文でいっぱいにしてリテイクとなったことがありました。
原因としては「本当に伝えたいことが定まっていない」「読み手の意識が抜けている」などがあると思います。
解決方法としては伝えたいことを簡潔にまとめたミニマムな状態から始めて、必要な分だけ説明を付与するやり方などがスピードと品質が両立できるのではと思います。

### 情報共有について

> **目的や全体像がわからない仕事はストレスだと思います。**
> **(中略)チームが自らプレゼン(情報共有)することで、単なる製造的な仕事からより俯瞰した視点を持ってもらいます。**
>
> -[チームの情報共有【チーム運営】](https://www.youtube.com/watch?v=WIoczFVOxHI "チームの情報共有【チーム運営】")より

「目的や全体像がわからない仕事はストレス」という点について、非常に共感ができます。
新人の頃は今作っている書類が開発にどう影響するのか(=自分が役に立っているのか)がわかりづらく、モチベーションが保てないことがあると思います。
解決策として、個人としては「プロダクトやその開発工程の全体像を知る」、チーム単位では「全体MTGで課題や目標などを共有する」「社員同士の積極的なコミュニケーション」などがあると思います。

## 最後に

桜井さんの仕事の姿勢はロジカルかつ簡潔で非常に参考になります。全ての動画が2~3分で構成されている点も、スピーディーかつ印象に残るプレゼン能力が活かされていると感じました。

また、ゲーム画面の背景から足音などの効果音まで、自分のプロダクトの全ての要素に「なぜこういう実装になったのか」という回答を持っている点も脱帽しました。

それぞれの項目では自分の言葉で解説できるよう努めましたが、実際にはまだまだ自分でもできていない点も多いため、自分自身のマイルストーンとして本記事を書かせていただきました。
日本 自動運転レベル４解禁

## はじめに
　皆さん<font color="orange">**自動運転レベル**</font>ってご存じですか？自動運転レベルというのはアメリカの自動車技術会(SAE) によって0～5の6段階に分けられる自動運転の基準です。簡単に自動運転レベルについて話していきます。

>レベル0　　運転自動化なし
レベル1　　運転支援
レベル2　　部分運転自動化
レベル3　　条件付き運転自動化
レベル4　　高度運転自動化
レベル5　　完全運転自動化

**自動運転レベル0**は人(運転者)が自動車の制御をおこなう従来の自動車がこのレベルです。また警告音等の予防安全システムも自動車の制御は人が行うのでここに含みます。

**運転レベル1**はアクセル・ブレーキ操作(加速・減速)もしくはハンドル操作(左右)のどちらかを監視・対応をシステムが行う状況で、自動ブレーキ、車線維持等があります。

**運転レベル2**はレベル1のアクセル・ブレーキ操作とハンドル操作の両方の監視・対応をシステムが行う状態のことで、高速道路での自動で追い越す・分合流を自動で行います。

**運転レベル3**は一定状況下においてすべての運転操作をシステム側が行うもので、緊急時には運転手が運tン操作を担う問い状態のことで、レベル3からは自動運転を担う主体は一定状況下で“システム”側に移ります。

**運転レベル4**はレベル3とは違い限定領域において緊急時にも運転手の対応を想定せず全てシステム主体とした責任を持つ状態のことで、この場合限定領域内の実を走行するタイプと領域外での走行に備えハンドルやアクセルを搭載したタイプの2種類が想定されます。

**運転レベル5**は運転手を必要とせず、エリアも限定されずに自動運転で走行が可能な状態のことを言います。

## 日本での自動運転レベル

　2020年よりレベル3の走行が可能になったが、実用化されているレベル３の車はホンダのみとなっています。

　2022年の国会でレベル4の走行が2023年から可能となる法律が施行される見通しとなりました。人口減少が進む地域などで、地域住民の移動手段となる循環バスの活用が想定し、25年をめどに全国普及を目指すとのことです。

## 日本メーカーの取り組み
### ホンダ
 2021年にはレベル3を搭載した**レジェンド**を世界では初めて実用化しています。現在は周囲の環境に合わせて、クルマ側が自ら考えたプランをユーザー側に提案するコミュニケーション技術(意図理解・コミュニケーション技術)の開発やAI技術に関する共同開発を中国の企業と締結するなど、より高度な自動運転技術の開発に着手しています。

### トヨタ
　2021年に開催された東京オリンピック2020の選手村では、自動運転技術を搭載した**e-Palette**が循環し、選手の送迎を行いドライバー不要のレベル4の自動運転車を実用化しています。

### 日産
　DeNA、NTTドコモと共同で、**Easy Ride**という無人タクシーサービスの実証実験を横浜みなとみらい地区にて実施。実験段階の現在は、安全のため運転席に乗務員が乗り込んでいるものの、運転はすべてシステムが行います。モバイルアプリで配車から支払いまでできる上、自動運転の強みを活かした24時間サービスの提供を目指しています。

## まとめ
　日本でついにレベル4の自動運転が可能となりました。今回紹介した日本車メーカー3社はそれぞれ異なる使用目的の自動運転の技術の開発が進められ、広い分野で自動運転技術が使われていくことや、地方の移動手段への活用、それによって高齢者の事故減少などの問題が改善されることに期待したいですね。今後の日本メーカーに期待し動向に注目していきたいです。
kubernetesで動いているNextCloudのoccコマンドを実行する

kubernetes上に構築したNextCloudで`occ`コマンドを実行する際に手間取ることが多かったのでメモ。
イメージは [https://hub.docker.com/_/nextcloud](https://hub.docker.com/_/nextcloud) を利用。
`kubectl exec -it nextcloud-XXXX -- /bin/bash`でログインしてから`su -s /bin/bash ～`を実行しても良いですが、`kubectl`から直接実行するパターンで。
ポイントは`su -s /bin/bash www-data -c`の部分。これをよく忘れます。

# `occ files:scan`の例
```bash
$ kubectl exec -it nextcloud-d8dxxcc9f-md5pc -- su -s /bin/bash www-data -c "php occ files:scan --all"
```

あとは`files:scan --all`の部分をやりたいものに置き換えればOK
現在の天候状況をKeyestudio_HT16K33に表示してみた


<h1>はじめに</h1>
この記事は、obniz性能を検証するために、Openweather APIを用いて、現在の天候状況をKeyestudio_HT16K33に表示してみた。

備考：Keyestudio_HT16K33の表示範囲の限界があるため、天候状況を表す英単語の先頭文字を抽出して表示した。例えば、曇りの場合は、Cloud⇒C；晴れの場合は、Sun⇒S


<h1>必要なもの</h1>
（１）obniz board

（２）Keyestudio_HT16K33
（３）Openweather API
（４）Wi-Fi


<h1>Openweather APIの発行</h1>
Openweatherの公式サイト：<a href="https://openweathermap.org/">ここから</a>

<h1>実装</h1>
APIから取得したJsonを日本語化しないので、そのままで使う。
以下はコードです。

```weather_API.js
const location = "Tokyo";
const APIKEY = 'Your APIKEY';

obniz.onconnect = async function() {
    matrix = obniz.wired("Keyestudio_HT16K33", { 
      gnd:0, 
      vcc:1, 
      sda:2, 
      scl:3
    });
};

obniz.onloop = async function() {
   const data = await (await fetch(`https://api.openweathermap.org/data/2.5/weather?q=${location}&units=metric&appid=${APIKEY}`
    )).json();
    
    const currentWeather = data.weather[0].main;
    
    matrix.brightness(7);    
    const ctx = obniz.util.createCanvasContext(matrix.width, matrix.height);
    ctx.fillStyle = "black";
    ctx.fillRect(0, 0, matrix.width, matrix.height);
    ctx.fillStyle = "white";
    ctx.font = "7px sans-serif";
    const text = currentWeather.slice( 0, 1 ) //現在の天候状況を表す英単語の先頭文字を抽出
    ctx.fillText(text, 1, 7);
    matrix.draw(ctx);
}
```

![プレゼンテーション1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/40167cd7-fcba-2156-1227-fdb2010c6c14.jpeg)


ちなみに、天候状況を表す英単語は：
    "Rain",
    "Snow",
    "Thunderstorm",
    "Drizzle",
    "Fog",
    "Squall",
    "Clouds",
    "Mist",
    "Smoke",
    "Dust",
    "Haze",
    "Sand",
    "Ash",
    "Tornado",
    "Sun",

<h1>さいごに</h1>
Obnizで実装するのは意外と簡単でした。次回MatrixLED_MAX7219をやってみる。
【Python】顔認識システムについて

# はじめに
今回はPythonでPCのカメラからリアルタイムで人の顔を認識して顔認識していないとカメラのシャッターを切れないようなプログラムを作成しました。

# 全体のプログラム

```Python:face_detect.py
import cv2 as cv
from datetime import datetime

HAAR_FILE = "haarcascade_frontalface_default.xml"
cascade = cv.CascadeClassifier(HAAR_FILE)

cap = cv.VideoCapture(0)

while(True):
    ret, frame = cap.read()

    face = cascade.detectMultiScale(frame)
    k = cv.waitKey(1)&0xff # キー入力を待つ

    for x, y, w, h in face:
        cv.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),1) #顔を認識したら長方形を描画

        #顔認識している間のみ写真を撮影可能
        if k == ord('p'):
          # 「p」キーで画像を保存
          date = datetime.now().strftime("%Y%m%d_%H%M%S")
          path = "./img/" + date + ".png"
          cv.imwrite(path, frame) # ファイル保存
          cv.imshow(path, frame) # キャプチャした画像を表示

    cv.imshow('frame',frame)

    if k == ord('q'):
      # 「q」キーが押されたら終了する
       break

cap.release()
cv.destroyAllWindows()
```

上記のコードで顔認識を可能にしております。

# プログラムの詳細


## 1.カスケード分類機の読み込み

```Python
import cv2 as cv
from datetime import datetime

HAAR_FILE = "haarcascade_frontalface_default.xml"
cascade = cv.CascadeClassifier(HAAR_FILE)
```

>カスケード分類機とは・・・画像からある物体を検出するためには、大量の画像からある物体の特徴を学習し、この特徴をまとめたデータが必要となります。この特徴をまとめたデータのことを「カスケード分類器」と呼びます。

つまり、大量の画像の学習素材が必要になりますが今回使用しているOpenCVというライブラリはの顔を集めた大量画像から人の顔の特徴量をまとめたHaar-Cascadeが用意されています。
これは[Github](https://github.com/opencv/opencv/tree/master/data/haarcascades)からダウンロード可能ですので、pyファイルと同じディレクトリに保存してください。

## 2.映像の読み込みと顔認識

```Python
cap = cv.VideoCapture(0)

while(True):
    ret, frame = cap.read()

    face = cascade.detectMultiScale(frame)
```

VideoCaptureクラスを利用することでWebカメラの映像をよみこみ処理することができる。
また、detectMultiScaleメゾットで映像内の顔を検出。顔の位置のx座標、y座標、横幅、縦幅の四つの戻り値が渡されます。

## 3.顔部を枠線で囲む

```Python
for x, y, w, h in face:
        cv.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),1)
```

前述したとおり、変数faceには4つの戻り値が格納されているため、ループでx,y,w,hに代入し、rectangle関数で枠線を描画する。
rectangle関数は第1引数は対象の画像（映像）データ、第2引数は矩形の左上頂点座標、第3引数は矩形の右下頂点座標、第4引数は描画する線の色である。

## 4.顔認識しているとき

```Python
if k == ord('p'):
          # 「p」キーで画像を保存
          date = datetime.now().strftime("%Y%m%d_%H%M%S")
          path = "./img/" + date + ".png"
          cv.imwrite(path, frame) # ファイル保存
          cv.imshow(path, frame) # キャプチャした画像を表示
```

「p」のキーを押したら画像を保存し、ファイル名を指定してあります。また、imshowでキャプチャした画像を表示します。
このプラグラム部分を枠線描画のfor文の中に組み込むことによって、顔認識している間のみシャッターを切れるように制御しています。

## 5.顔認識していないとき

```Python
if k == ord('q'):
      # 「q」キーが押されたら終了する
       break

cap.release()
cv.destroyAllWindows()
```

「q」のキーが押されたらwhile分を抜けてプログラムを終了します。release()メソッドで読み込んでいる映像データやカメラデバイスを閉じる。

>明示的にrelease()を実行しなくてもVideoCaptureオブジェクトのデストラクタが正常に実行されれば自動的にrelease()が実行される。

# おわりに
今回は顔認識プログラムをPython + OpenCVを利用して作成しました。機械学習は全くの素人ですので様々なサイトを参考にして作成したので無駄な作業が含まれていたりしますが参考になれば幸いです。
今後は学習素材を複数与えて女性と男性の識別のプログラムを作成してみたいと思います。
サニタイジング時の正規表現の利用についてのメモ

やること：
入力された文字列から
aタグのhref属性の文字列のみとってきてそれ以外は無効化する

※基本（というか絶対）やらないほうがいい。
vueだと、v-textでテキスト化推奨。v-htmlはXSS的に危険なので…。

体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践
https://amzn.to/3Y4aD75

---

正規表現チェッカー

http://okumocchi.jp/php/re.php

https://www-creators.com/tool/regex-checker

String.prototype.replace()

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace

MDN 正規表現

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions

XXS

https://amaraimusi.sakura.ne.jp/sample/php/serialize/url_serialize.php

正規表現サンプル集 - メガソフト

https://www.megasoft.co.jp/mifes/seiki/s310.html

最短一致

https://www.megasoft.co.jp/mifes/seiki/about.html#:~:text=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A7%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E3%81%AE,%E3%81%8C%E3%80%8C%E6%9C%80%E7%9F%AD%E4%B8%80%E8%87%B4%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82

https://www-creators.com/archives/1804

https://help.maruo.co.jp/hidemaru/html/190_CmdSearch_Regular_ShortMatch.html

---
preg match
regex checker
コスト削減のためにこの1年でやってきたこと

NE株式会社開発統括部所属の大嶋([@atsusics](https://twitter.com/atsusics)) です。 
この記事は[NE Advent Calendar 2022 ](https://qiita.com/advent-calendar/2022/ne)７日目の記事になります。

# 概要
弊社でサービス提供している[ネクストエンジン](https://next-engine.net/)のコスト周りを担当した私が、この1年間で行ったことを紹介させていただきます。
プロダクトのサーバー費用管理で悩んでいる方や、AWS費用を削減したいけどどこから手をつけたら良いかわからない方の少しでも手助けになればと思います。

実施したこと
- コストを眺める会を主催
- AWSリソースの適正化

順番に紹介していきます。

# コストを眺める会を主催
## コストを眺める会とは？
月末に当月のコストの確認と、来月以降のコスト予想を確認するMTGを行っています。
参加者は当初SRE（インフラエンジニア）＋CTOのみで行っていましたが、現在はすべてのエンジニア＋αが任意で参加できるように広げています。
基本的には主催者からコスト関連について一気に説明しつつ、都度質問を受け付けながら進行していきます。

## 事前準備
事前に主催者が以下のことを準備し、スムーズに進行・説明できるようにしています

- コスト共有情報準備（今月実績予想＋来月以降の予想）
- 翌月のコストを眺める会の仮予定確保
- AWS RI&SP購入案作成
- その他。クラウド化によるコスト影響等

## お品書き

[第1部]
1. zoomに集合
2. 来月の実施日を決める
3. 当月コスト、翌月のコスト予想を共有
3-1. AWS費用
3-3. さくらインターネット費用
3-4. その他、、、、（多数）
4. RI/SPSs購入案の話

[第2部]
1. 改善できるところを話したり、雑談したり

第1部では、主催者が一気に説明していきます。第2部では雑談しつつ新たなコスト削減策がないかコミュニケーションを取るように設計しています。
実際に使用しているコスト共有用のスプレッドシートは流石に紹介することはできませんでした。すいません。。

## 効果
毎月メンバー内でコストを確認することで、予算消化割合や、過度にコストが掛かっている箇所について、共通認識を持つことができます。そうすることでインフラチーム全体で毎月少しづつでもコスト削減策の実施を行うことができました。

また、参加者枠をインフラエンジニア以外に広げた影響で、アプリケーションエンジニアからアプリケーションコード変更時のコスト影響について相談してもらえるといった、コスト意識の醸成につながっていきました。
例えば、[在庫連携間隔短縮](https://hamee.co.jp/news/2022/08/09/130000)の際には、パフォーマンスだけではなく、コスト影響がどれほどあるのかを相談いただき判断材料の一つして提供することができました。

コスト意識の醸成は簡単なものではありませんが、今後この会を継続していけば意思決定の際にユーザー目線だけでなく、コスト意識がいい判断材料になるのではないかと考えております。


# AWSリソースの適正化
上記で紹介したコストを眺める会では、毎月のコスト推移から、変化があった物にをキャッチし、コスト削減策を実施することができますが、次は現在稼働しているAWSリソースについて攻めのコスト削減をしていく一つの方法を紹介させていただきます。

## 前提
攻めのコスト削減と言っても、とりあえずリソースを小さくしたり、台数を少なくすればよいというわけではないのは周知の事実かと思います。

私もリソース適正化前に最低でも以下の準備はしておきました。
- パフォーマンスを想定可能な状態にしておく
    - Webアクセスであれば、レイテンシ等
    - バッチ処理であれば、処理時間、処理待機時間等
    - DBであれば、クエリレイテンシ、キャッシュヒット率、CPU使用率等
    - コンテナのリソース消費状況
- エラー、異常状態をすぐに検知できる状態にしておく
    - 5XXエラー
    - バッチ処理状況
    - DB異常

また、アラート設計については[New Relic Advent Calendar 2022の17日目](https://qiita.com/advent-calendar/2022/newrelic)で紹介させて頂ければと思っております。


## 実施方法
各リソースごとの詳細な方法はいつか記事にしようと思います。今回は概要だけです。

1. パフォーマンスを確認し余剰リソースを見つける
2. 少しだけリソース適正化をする（ex. ECSタスク数を３少なくする）
3. 数日様子見
4. パフォーマンスを確認し、問題ないことを確認
5. 少しだけリソース適正化をする
6. 数日様子見
7. パフォーマンスを確認し、問題ないことを確認

これを繰り返していきます。
とても泥臭い方法になりますが、何よりもユーザー影響を出さないようにNewRelic・Datadog等の画面と睨めっこしながら少しずつ進めていきました。

## 効果
実際のコスト削減額は、、、、（すいません。今回は非公開にさせてください）
項目としては
- ECSのタスク数削減、スケジュール調整
- RDSサイズ変更
- 不要なサーバー停止等

を行いました。

無駄なコストを削ることで、セキュリティを高めることにお金を掛けられたりと良いことばかりでした。

# まとめ
プロダクトのサーバー費用周りの担当1年目の私が、この1年間で行ったことを紹介させていただきました。
プロダクトの成長のためには必要な場所にお金を掛けていくことは大切だと思っています。
しかし、無駄遣いはもったいないので削れるところは削ってコスパ良いプロダクトにしていきたいと思います。
ポリモーフィズムとは？



【記事を書くことになったきっかけ】
プログラミングを学ぶ上でアウトプットが大事だと痛感することが最近多くありました。そこでよくお世話になっているQiitaで初アウトプットをするに至りました。
## 記事の内容

学校でオブジェクト指向についての授業を受けている中で、継承やオーバーライド、アブストラクトクラスについて調べる機会があったのでまとめてみました。
プログラミング初心者が自分で咀嚼したものをまとめたものなので、正確さは保証できないです。アウトプットの記録として残しているモノなので間違っている点がありましたらご指摘よろしくお願いいたします。
授業で使用していた言語はJavaです。

# 継承、オーバーライドとは？
・元々あるクラスの機能を使って、さらに自分で機能を追加したいときに用いる
・オーバーライド = 継承したスーパークラスのメソッドを継承先で再定義すること
・なんであるの？
→同じ内容のプログラムを違うクラスでいちいち書いていると変更が生じたときに修正するのに手間がかかる。そこで「継承」「オーバーライド」を使うと解決
・もととなる機能を持つクラスのことを **スーパークラス、親クラス** と表現
・ **スーパークラス、親クラス** を「継承」したクラスのことを **サブクラス、子クラス** と表現

##### (以後登場するスライドは私が授業の課題で作成した継承のイメージをイラスト化したものです)
黒字で書いてあるものが元々ある機能、青文字で書いてあるのが追加したい機能です

![スクリーンショット 2022-12-06 11.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024706/74109fce-6d3e-d1ae-1f74-c4730f39de93.png)

### 注意点
<dl>
    <dt>機能の制限</dt>
    <dd>・継承元のクラスにおいて、<font color="Green">「private」</font>で宣言されたフィールドにはアクセスできない</dd>
    <dd>・継承元のクラスにおいて、<font color="Green">「proteted」</font>で宣言されているフィールドには<strong>継承先のクラスからのみ</strong>アクセスできる</dd>
</dl>
<dl>
    <dt>Objectクラスの継承</dt>
    <dd>・javaでは何も継承していないクラスでもコンパイルするときに自動的に<font color="Green">Objectクラス</font>を継承させている</dd>
    <dd>→すべてのクラスでObjectクラスの機能を使うことができる</dd>
</dl>
<dl>
    <dt>コンストラクタの呼び出し</dt>
    <dd>・インスタンスを生成するとスーパークラスの引数なしのコンストラクタも呼び出される</dd>
    <dd>引数有りのコンストラクタを呼び出したい時は<font color="Orange">「super」</font>を用いる</dd>
</dl>
<dl>
    <dt>複数のクラスの継承</dt>
    <dd>・継承<font color="Red">先</font>が複数あるのはOK</dd>
    <dd>・継承<font color="Red">元</font>が複数あるのはNG</dd>
    <dd>→別々の継承元に同じ名前のメソッドがあると困るため</dd>
</dl>

![スクリーンショット 2022-12-06 12.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024706/ff0a6a83-dccb-15d6-70a9-06146e6faec3.png)





# アブストラクトクラス(抽象クラス)とは？
・アブストラクトメソッド（抽象メソッド）を持つクラスのこと
→newすることができない
・抽象メソッドとは、定義だけで処理を書かないメソッド
→継承先のクラスに実装が委ねられている(必ずオーバーライドする)
**例**
![スクリーンショット 2022-12-06 13.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024706/35045cd2-e8c4-99b8-3e5e-eb7bb5561e1a.png)

# ポリモーフィズムとは
・大きなルールの中で要素を組み合わせたりしてプログラムを組んでいく

 **継承、オーバーライド、アブストラクトクラスを組み合わせることでコードをより単純にみやすくすることができる。さらにメソッドなどの変更にも、より容易に対応できる柔軟性の高いものに仕上げることができる。** 

例
<dl>
    <dt>レゴブロックで作るお城の設計書を作成する</dt>
    <dd>・1階、2階の部分の組み立てはほとんど同じで、外燈の位置、色だけが違う</dd>
    <dd>→1、2階で共通の組み立ての項目を作り、異なる部分のみプラスアルファで記述<font color="Purple">(継承)</font></dd>
    <dd>前述の異なる部分である色、外燈の位置(数)を1階と2階で最初から指定しておき、(パーツの袋に書いておくなど)設計書においていちいち記述する必要がないようにしておく<font color="Purple">(オーバーライド、アブストラクトクラス)</font></dd>
</dl>
FileMaker ExecuteSQLの結果をJSONで取得

動作検証:FileMaker Pro 19.6

こんなカンジのテーブルのデータをExecuteSQLで取得し、
### サンプルデータ
![Image_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703491/5a9f75d2-2068-caae-f611-1debbd4fa7ad.png)

以下のようなJSON形式のデータを返します。

### 結果
```json
[
	{
		"code": "1",
		"name": "鈴木 太郎",
		"note": "1行目\n2行目"
	},
	{
		"code": "2",
		"name": "佐藤 花子",
		"note": "旧姓:\"田中\""
	}
]
```

### スクリプト

```java
//#クエリを作成
変数を設定 [ $query; 値:Let ( [
~query ="select
'(((.code.))):(((.'||`code`||'.)))'
,'(((.name.))):(((.'||`name`||'.)))'
,'(((.note.))):(((.'||`note`||'.)))'
FROM `People`
WHERE `name` LIKE '%{名称}%'
FETCH FIRST 10000 ROWS ONLY "
];
　Substitute ( ~query
　; ["`"; "\""]
　; ["{名称}"; GLOBAL::gSearch ]
　)
)]

//#ExecuteSQLを実行
//#フィールド区切りを","、レコード区切りを"},{" で設定
変数を設定 [ $result; 値:ExecuteSQL ( $query　; "," ; "},{" ) ]

//#改行とダブルクォーテーションの処理
変数を設定 [ $result; 値:"[{" & 
Substitute ( $Result 
	; [¶ ; "\n"]	//改行を"\n"に置換
	; ["\"" ; "\\\""] 	//ダブルクォーテーションを"\""
	; ["(((." ; "\""] 
	; [".)))" ; "\""] ) & 
"}]" ]
```
# スクリプトの説明
## クエリを作成
```
'(((.code.))):(((.'||`code`||'.)))'
```
(((. と .))) は、フィールド内で使用していない文字であれば何でも良いです。
視認性が良いので (((..))) を使用しています。
(((. と .))) は、最終的に " (ダブルクォーテーション)へ置換します。

|| は、クエリ内での連結文字

` (バッククォート)視認性が良いので使用しています。あとで、 " (ダブルクォーテーション)へ置換します。  

`\"` が増えるとクエリが読みにくくなるので。

最初の10000行を取得(なくても良いです)
```
FETCH FIRST 10000 ROWS ONLY
```

作成されたクエリ
※デバッグしやすいように一旦変数に入れてクエリを確認。
(GLOBAL::gSearch が空欄なので "name" LIKE '%%' となっている)
```
select 
'(((.code.))):(((.'||"code"||'.)))' 
,'(((.name.))):(((.'||"name"||'.)))' 
,'(((.note.))):(((.'||"note"||'.)))' 
FROM "People" 
WHERE "name" LIKE '%%' 
FETCH FIRST 10000 ROWS ONLY 
```

## ExecuteSQLを実行
フィールド区切りを","、レコード区切りを"},{" で設定

```java
変数を設定 [ $result; 値:ExecuteSQL ( $query　; "," ; "},{" ) ]
```
結果
```
(((.code.))):(((.1.))),(((.name.))):(((.鈴木 太郎.))),(((.note.))):(((.1行目
2行目.)))},{(((.code.))):(((.2.))),(((.name.))):(((.佐藤 花子.))),(((.note.))):(((.旧姓:"田中".)))
```

## JSON化
改行、ダブルクォーテーション と (((..))) の処理
```java
変数を設定 [ $result; 値:"[{" & 
Substitute ( $Result 
	; [¶ ; "\n"]	//改行を"\n"に置換
	; ["\"" ; "\\\""] 	//ダブルクォーテーションを"\""
	; ["(((." ; "\""] 
	; [".)))" ; "\""] ) & 
"}]" ]
```

### 結果
```json
[
	{
		"code": "1",
		"name": "鈴木 太郎",
		"note": "1行目\n2行目"
	},
	{
		"code": "2",
		"name": "佐藤 花子",
		"note": "旧姓:\"田中\""
	}
]
```
オンラインでプランニングポーカーやってみた

## はじめに


最近スクラム開発を学習し始めたので
アウトプットかつチーム交流を目的としてプランニングポーカーを行いました、その時のことを書いています。



## プランニングポーカーとは
>プランニングポーカーとは、「1、2、3、5・・・」といった数字が書かれたカードを使って、タスクの規模を`相対的`に見積もる手法です。

一文読んでもしっくりこなかったので、`「A機能はB機能と比べてどれだけ大変か、どれだけ大きいタスクかを見積もる」`と解釈するようにすると分かりやすかったです。

ざっくりした例で言うと
```バケツ1杯を水で満タンにする（A）をレベル２とすると
浴槽を水で満タンにする（B）は（A）と比べると何レベルに相当するか？
単純に考えるとおそらく答えはレベル２以上になると思います。レベル８やレベル１２など
浴槽に水を汲む方が使用する水量も多く時間もかかりますよね。なのでバケツの水を満タンにするより「大変」なのです。
```




### 相対的見積もり
冒頭で出したようにプランニングポーカーは相対的に見積もる方法です。

相対的見積もりとは、**基準に対しての比較**で見積もる方法です。

```
タスクAの見積もりを基準とし、これを３とする。
タスクBはタスクAより簡単そうなので、１と見積もる。
タスクCはタスクAより大変そうなので、５と見積もる。
```

といったような方法です。
相対的見積もりでは **「時間」や「日」で見積もりはしません。**


### 絶対的見積もり

では反対の絶対的見積もりとは何のか。これは結構現場で目にすることが多い見積もり手法です。
絶対的見積もりとは、`具体的な時間`を出す見積もり方法です。
```
タスクAは５時間かかる
タスクBは６日かかる
```
といった見積もりの仕方です。
<br>
この絶対的見積もりは属人性が懸念されます。
同じタスクであっても入社２ヶ月の人は「６日」と見積もったり、そのシステムを知り尽くしてる強強エンジニアは「１日」と答えるでしょう。
見積もりに大きな解釈ズレが生じているので、これだと開発メンバーが変わった時にスケジュールにも影響がありそうです。

<br>

その点、相対的見積もりであれば「基準に比べてどれだけ大変か」を測れるので
「時間」「日にち」の概念に対して影響が少なく開発能力は関係なくなります。


## 今回採用したルール

こちらの方のガイドがとにかく分かりやすかったので、当日はこちらの資料をもとに進めていきました。

https://kawaguti.hateblo.jp/entry/20120218/1329524230


今回はオンラインで実施しました。いろいろアプリあります。

https://plapo.net/

<br>


## 今回使用したお題
今回は１時間の枠で３つのネタを見積もることができました。
入社して間もないメンバーも複数いたため、技術系だけではなく日常のことでもネタを募集するようにしました。
最初は日常ネタから議論する方が盛り上がるかもしれません。

<font color='gray'>※ユーザーストーリーは本来もっと詰める必要があります。</font>



**■ まず例：スカイツリーの大きさ**
* 相対基準
  * 東京タワーの大きさを２とする。

<br>

**■ お題①：美味しいイチゴのショートケーキを作りたい。**
* 相対基準
  * プレーンクッキーの作成を２とする。
* ユーザーストーリー
  *  自分がパティシエの立場なら、落ち込んでいる人の気分が晴れるように美味しいケーキを提供したいから。

* ストーリー補足	
  * 使う材料は全て揃っています
  * 使う道具はオーブンとミキサーを使う


<br>

**■ お題②：自社サービスをSPA化したい。**

* 相対基準
  * サービス未登録者は、サービスを利用開始するために、サービスの利用登録ができる、５とする（ログイン機能）

* ユーザーストーリー
  * 自分がユーザーの立場なら、ページ遷移を早くして待ち時間を減らしたい。
* ユーザーストーリーの補足
  * フロント側だけSPA化する、バックのスキーマ等は変化なし
  * フロントのテストは考慮しない
  * ある一つの機能に関連するページだけ対応する。（5~6page）

結

<br>

**■ お題③：恋人をつくりたい。**
* 相対基準
  * 渋谷で知らない人を１人ナンパする、成功の時。（今回はto異性に限定）これを３とする
* ユーザーストーリー
  * 20~30代の若いうちに恋人が欲しい、なぜなら毎年クリスマスを恋人と一緒に過ごしたいからだ。
* ユーザーストーリーの補足
  * 友達から恋人に発展するのではなく、全く知らない人から恋人になる
  * クリスマスだけでなく何もない日でも恋人と一緒に過ごしたい。
  * マッチングアプリを使う





## 最後に

今回は日常ネタも交えて、プランニングポーカーの概要を掴みやすくしました。

オンラインで完結できるのでチームの交流などに使用してもいいかなと思います。
ChatGPTを使ってみたい

## ChatGPTとは？？
`OpenAIが開発したGPT-3という大規模な言語モデルを組み込んだチャットアプリケーション、サービスです。ChatGPTのモデルは、日本語や英語などの文章を入力として受け取り、人間が生成するような自然な文章が生成されるようにトレーニングされています。`
参考：https://aiacademy.jp/media/?p=3546

かなりいろいろなことに答えてくれて、言語もかなり自然です。

### 実際に使ってみたい
https://chat.openai.com/

まず↑にサインイン、ログインをします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/787e8e9a-622a-eb6c-fe73-756bcf3a9bbe.png)

画面下部に入力欄があるのでここに打ち込んでいきます。
何を入力するのかはこちら（[ChatGPT使い方総まとめ](ChatGPT使い方総まとめ)）の方がかなり詳しく説明されていたので参考にさせていただきます。

1\. 普通に質問してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/a89c8aad-f610-be5e-026d-288e9fa2d612.png)
iphoneの歴史について聞いてみました。簡潔にまとめられていて、14モデルという点から最新の情報も得ることができています。

2\. 文章をタスク化してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/15cd4d48-fb2f-0dcb-074b-6ad029e591e2.png)
「以下をタスク化して」という文言を付けることで文章をタスク化してくれるようです。
文章に5つのタスクがありますが、漏れなく列挙されました。

3\.　技術的なことを聞いてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/fc46e1f6-648b-9167-f19a-6ff6c6fb1f06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/486afa2a-8652-2d22-6a1c-6c0b45cc6eb4.png)

なんとご丁寧にサンプルコードまで提示してくれました。

他にもDB設計や単体テストなんかも出力してくれるみたいです。
ただ、間違っていることもあるようなので気を付けましょう
Windowsでdiff, patchする

Windowsでdiff, patchする手順です。Git Bashを使います。

例：`a.txt`と`b.txt`の差分を`a.txt`に適用する
```bash
$ cat Desktop/a.txt
hoge hoge hoge
hoge hoge hoge
hoge hoge hoge

$ cat Desktop/b.txt
hoge hoge hoge
hoge fuga hoge
hoge hoge hoge
```

```bash
$ diff -u Desktop/a.txt Desktop/b.txt > Desktop/hoge2fuga.patch

$ dos2unix Desktop/hoge2fuga.patch
dos2unix: converting file Desktop/hoge2fuga.patch to Unix format...

$ patch -p0 < Desktop/hoge2fuga.patch
patching file Desktop/a.txt

$ unix2dos Desktop/a.txt
unix2dos: converting file Desktop/a.txt to DOS format...

$ cat Desktop/a.txt
hoge hoge hoge
hoge fuga hoge
hoge hoge hoge
```

Powershellコマンドでの組み上げに断念したのでご存知の方はコメントくださると幸いです。
Box×Salesforce活用のススメ

# はじめに
前回はBox for Salesforceをメインテーマにした記事を書かせていただきました。([記事はこちら](https://qiita.com/kamadhi/items/006626ddb0b66a70e902))
今回はBoxとSalesforceをシステム的に直接連携させなくてもBoxの共有リンクやSalesforceのフローなどを活用して、業務の役に立ちそうかな？という使い方を3つ書いてみました。
※記載している内容は、Box APIやSalesforceのApexを利用していません。APIやApexを利用すればもっといいものが作れるのかもしれませんがまだまだ勉強中なので今回は無しで行きます！

# 目次
1. Boxを活用してSalesforceのホーム画面をコンテンツポータルにしてみよう
2. Zoomの録画、Salesforceレコードに紐づけたくないですか？(Box app for Zoomの活用)
3. Salesforceのレコードに参考にしたいコンテンツをブックマークしよう

# Boxを活用してSalesforceのホーム画面をコンテンツポータルにしてみよう
Salesforceのホーム画面ってSalesforceユーザーならば1日1回は目にする画面だと思います。みなさま、ホーム画面にどんなコンポーネントを配置していますか？業績のグラフ、カレンダーなど色々な使い方をされていると思います。
今回は、**Boxを活用したコンテンツポータルとしての使い方**を提案させていただきます！


**コンテンツポータルイメージ**
![ホーム画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/fef292a1-b1bb-901c-d1b3-0c436a006a17.png)

機能例：
「部門関連コンテンツ」にあるフォルダをクリックすると、各部のマニュアルなどが格納されたBoxフォルダへ飛ぶ
「各種コンテンツ提出場所」にあるフォルダをクリックすと、ファイルリクエストが起動し必要なコンテンツを提出できる
「全社共通コンテンツ」にあるアイコンをクリックすると、Box Notes が起動して情報を確認できる


Boxを活用すればSalesforceのホーム画面に柔軟なコンテンツポータルが構築できますね！

# Zoomの録画、Salesforceレコードに紐づけたくないですか？(Box app for Zoomの活用)
続いて、Zoomの録画ファイルを上手くSalesforceレコードに紐づける方法です。

Salesforceでは標準でZoomインテグレーションが可能です。([（参考）Zoomインテグレーション](https://help.salesforce.com/s/articleView?id=sf.video_zoom_parent.htm&type=5))
これにより、SalesforceからZoomURLの発行や、各レコードに活動記録にZoomの録画データのURLが自動で登録されます。
非常に便利です。
しかし、以下の課題に直面する時があります。
* Zoomの録画URLを取引先画面や商談画面で一覧で見たい
* Zoomの録画データにMemoなどを残してわかりやすく管理したい
* Zoomの録画容量制限に達してしまい録画ができない
などなど。

こんな時は([Box app for Zoom](https://support.box.com/hc/ja/articles/4405278735635-Box-app-for-Zoom%E3%81%AE%E4%BD%BF%E7%94%A8))で解決しましょう！
これを活用すると、Zoomの録画データの保存先に直接Boxを指定することができます。
Boxに保存することができれば、Boxの共有リンクをSalesforceのレコードととして登録すれば簡単にSalesforceから録画データを視聴することができるようになりますね！
今回はSalesforceのフローを利用してこんな感じで作ってみました。

**Zoom録画登録イメージ**
![Zoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/416d049a-cb72-dba0-c403-5a1807a6ca80.png)

Salesforceのフローを活用しているので、取引先や商談などのレコードに同時に紐づけることもできますし、Memoなど必要な情報を入力する項目を自由に作成することができます。
レコードとして登録されるのでもちろんダッシュボードで集計することも可能です。誰がたくさんお客様との面談を実施しているか、誰が面談記録をよくシェアしてくれているかなども集計できますね！
この方法ならばSalesforceのディスク容量も消費しない、Boxにあらゆるコンテンツが溜まっていく(正しい使い方)、柔軟にBoxのコンテンツとSalesforceのレコードを紐づけることができる、いいことだらけです。
（もしかしたらBox APIを活用すればもっと格好良く作成できるかもしれませんがそれはまた勉強して書きますね）

# Salesforceのレコードに参考にしたいコンテンツをブックマークしよう
BoxやSalesforceなど、様々な情報が蓄積されているシステムを見ていると、「この提案書今やっている商談の参考になりそう！」「この情報皆に教えたい！」と思うこと、ありますよね。
これも、Salesforceのフローを使ってこんな感じで実現してみました。

**参考コンテンツ登録イメージ**
![参考コンテンツ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/f8ab34ec-658f-e406-a0c7-c125cf0fdaad.png)

**登録されたらChatter投稿で周知**
![Chatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/affd433c-7ffb-492e-18aa-3d144ec8fd36.png)

Boxの共有リンクだけでなく、SalesforceのレコードURLも関連リストとして登録しておくことができます。
これで、Salesforceレコードに紐づけて参考にしたいコンテンツ情報を蓄積しておくことができるので1件1件のお客様対応や商談がスムーズに進むようになりますね！
また、ダッシュボードで集計することでよく参考コンテンツとして登録されているものがわかるので、そういったものは全社に最近参考にされているコンテンツはこちら！のように周知すると良いかもしれませんね。

# さいごに
いかがでしたでしょうか。
今回はかなり個人的にこんな機能あったら便利かなというものを自身の経験をもとに作成してみました。
もっとこういう使い方って実現できる？こんなことに困ってる！などありましたらコメントいただけたら検討させていただきます！
最後までお読みいただきありがとうございました。
A5メモ

```
--------------------------------------------------
1 カラムコピー
タブカラム＞物理名＞マウス左クリック＞cstr c

---------------------------------------------------
2 フィルタ
下記のように適用実行
contract_number like '%SS%'

-----------------------------------------------------
3 ショットカート
Ctrl + q	SQL整形
Ctrl + g	条件を指定してテーブルを開く
Ctrl + Space	テーブル名やテーブルカラム名の入力補完
Ctrl + r	文字列置換
Ctrl + h	実行履歴表示
Ctrl + k	コメントアウト
Ctrl + Shift + k	コメントアウトを解除
--------------------------------------------------
4 データの挿入
対象テーブル＞右クリック＞SQLの生成＞insert チェック＞
生成したinsert SQL文に対象カラムデータを設定。
複数件インサート
INSERT 
INTO cakedb.users(name) 
VALUES ('秋葉原'),('品川')
--------------------------------------------------
5 データ更新表示
データタブ＞右クリック＞更新
--------------------------------------------------
6 日本語化する方法
a5m2\a5m2_2.19.2_x64
A5M2.ENU
上記はコードファイルです、そのままいいか？
--------------------------------------------------
7 テーブルの日本語名称文字化け対応方法
下記の最新のバージョンを利用すれば、解消しました。
a5m2_2.19.2_x64
Git 差分の無いブランチにコミットする方法

いわゆる空コミットの方法
※ 複数人が関わるブランチの場合は運用ルール等を事前に確認してからやりましょう
# 手順
1. 空コミットしたいブランチに切り替え
2. 以下コマンドを実行
```git commit --allow-empty -m "[コメント]"```


コメントには空コミットを行った理由(「初回コミット」とか)を残しておくと良いです


## 何に使うん？
* 新しく作ったブランチの最初のコミットに
* プルリクを送りたい時に
* 他開発・保守作業上必要な場合に
Raspberry Pi 純正タッチディスプレイの向き変更( Debian version: 11 (bullseye) )

# 久しぶりにRaspberry Pi OSをアップデートしたら 純正タッチディスプレイの向き変更方法が変わっていた

以前スイッチサイエンスさんで購入したElement14製の純正タッチディスプレイhttps://www.switch-science.com/products/2556 にRaspberry Pi 3 Model B+を接続してOSを最新の Bullseyeへと更新してみました。
前記のスイッチサイエンスさんの説明では "画面の表示方向を180度回転させるためには/boot/config.txtを編集して、lcd_rotate=2を追加してください。" とのことでしたが変更しても上下逆さまで変化無し。
最新OSでは、設定->Screen Configuration -> DSI-1を右クリックして向きをInvertedに変更することでタッチディスプレイの向きを変更させることができました。
便利になりました。

参考サイト
https://yokahiyori.com/raspberry-pi_4/
playwrightの`beforeAll()`, `beforeEach()`について解説

こちらはNewsPicksアドベントカレンダー2022の6日目の記事です。

https://qiita.com/advent-calendar/2022/newspicks-tech

## はじめに
業務でPlaywrightを用いたE2E自動テストを実装するタスクをしていて、ハマった場所があったため備忘録も兼ねて記事にしてみました。

## Playwrightとは？
https://playwright.dev/

PlaywrightとはE2Eテストを自動化するNode.jsのフレームワークです。

## ハマったこと
元々、
１つのテストファイル内で実行をする際にtest.beforeAll()を一回動作させ、test.beforeEach()でそれぞれのテストの事前処理を実行して欲しかったのですが、
[並列実行](https://playwright.dev/docs/api/class-test#test-describe-configure)で試してみたところ、
`test.beforeAll()`がそれぞれ毎回呼ばれてしまったことがありました。

`test.beforeAll()`, `test.beforeEach()`について認識が浅かったために予想通りに動いてくれませんでした。

ドキュメントの解説はこちらです。

https://playwright.dev/docs/api/class-test

## 解説
`test.beforeAll()`はテスト実行前にworker1つごとに一回ずつ実行されます。
そのため、例えば、

1つのファイル内で3つのテストを[並列実行](https://playwright.dev/docs/api/class-test#test-describe-configure)しようとすると、合計するとworkerが3つ走るため、`test.beforeAll()`も結果それぞれのworker（テスト）に対して実行されます。

結論としては、1つのファイル内でテストを並列実行する際に`test.beforeAll()`を一回だけ走らせるといったことはできません。
`test.beforeAll()`を一回だけ走らせたい場合は並列実行ではなく、順次実行でテストを実行させる必要があります。

## 補足

本記事は事前処理に使われる`beforeAll()`、`beforeEach()`について紹介していますが、事後処理に使われる
- `afterAll()`
- `afterEach()`

についても同じことが言えるため事後処理などで困っている方も同じ様に置き換えて考えていただければと思います。

## 詳しく解説します
### テストの事前処理について
`test.beforeAll()`と`test.afterAll()`はどちらも`test()`が実行される前に実行されるもので、テストに必要な事前処理などを行うために使います。
例えば、
- ユーザ画面が表示されるかどうかをテストしたい

こういった時、事前にログインをする必要がある際にtest.beforeAll()やtest.beforeEach()内にログイン処理を書くことが多いです。

### `test.beforeAll()`と`test.beforeEach()`の違い
`test.beforeAll()`と`test.beforeEach()`を使いこなす必要が出てくるのは、１つのテストファイル内に複数の`test()`が必要となってきた時です。
例えば、
```typescript
test.beforeAll(async () => {
    console.log('beforeAll')
})
test.beforeEach(async () => {
    console.log('beforeEach')
})

// 1つのファイル内にtest()を2つ書く
test('hogehoge1', async () => {
    console.log('テスト１')
})
test('hogehoge2', async () => {
    console.log('テスト２')
})

test.afterEach(async () => {
    console.log('afterEach')
})
test.afterAll(async () => {
    console.log('afterAll')
})
```
これを実行すると、
```
beforeAll
beforeEach
テスト１
afterEach
beforeEach
テスト２
afterEach
afterAll
```
この様に表示されます。期待通りですよね。

playwrightはデフォルト設定では、１つのファイル内は順次実行の設定のため、実際に走るworkerの数としては1つとなるため期待通りの挙動をします。

**しかし**、
```diff_typescript
test.beforeAll(async () => {
    console.log('beforeAll')
})
test.beforeEach(async () => {
    console.log('beforeEach')
})

+ test.describe.configure({ mode: 'parallel' })

// 1つのファイル内にtest()を2つ書く
test('hogehoge1', async () => {
    console.log('テスト１')
})
test('hogehoge2', async () => {
    console.log('テスト２')
})

test.afterEach(async () => {
    console.log('afterEach')
})
test.afterAll(async () => {
    console.log('afterAll')
})
```
上記のファイルに
```typescript
test.describe.configure({ mode: 'parallel' })
```
を追加して並列実行してみると、、
```
beforeAll
beforeEach
テスト１
afterEach
afterAll
beforeAll
beforeEach
テスト２
afterEach
afterAll
```
この様にbeforeAllが毎回呼ばれてしまいます。

理由としては、並列実行した際は複数のテストに対して複数のworkerプロセスが動くためです。


https://playwright.dev/docs/test-parallel#parallelize-tests-in-a-single-file

こちらに軽く説明があるのでご覧いただければと思います。

## 結論
1つのファイル内で`beforeAll()`を１回だけ実行したい場合は
並列実行ではなく、**順次実行**で実行する様にしましょう。

## 参考文献
https://playwright.dev/
Docker がシステムの容量を圧迫している時

Docker がシステム全体のストレージ容量を圧迫していたり、 Docker に与えたディスク容量が使い切られることがある。

Mac でこれを解決した際の備忘録。

## 現在の使用量を確認する

イメージ、コンテナ、ボリューム、ビルドキャッシュそれぞれの使用量が表示される。 [^df]

[^df]: 筆者はすでに container と image を少し整理したあと実行した

```
$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          62        0         40.1GB    40.1GB (100%)
Containers      0         0         0B        0B
Local Volumes   6         0         1.217GB   1.217GB (100%)
Build Cache     462       0         6.574GB   6.574GB
```

## いらないデータを削除する

各サブコマンドに `prune` というコマンドが用意されている。不要な (dangling) データを削除してくれる。

### イメージ

```
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:(sha256ハッシュ)
# ...

Total reclaimed space: 0B
```

### コンテナ

```
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
(コンテナ ID)
# ...

Total reclaimed space: 968.8kB
```

### ボリューム

```
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
(ボリューム ID)
# ...

Total reclaimed space: 250B
```

### ビルドキャッシュ

```
$ docker builder prune
WARNING! This will remove all dangling build cache. Are you sure you want to continue? [y/N] y
Deleted build cache objects:
(キャッシュ ID)
# ...

Total reclaimed space: 7.58GB
```

### 全部まとめて

```
$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y

Total reclaimed space: 0B
```

## それでも解決しない時

`prune` コマンドに `-f` や `-a` のオプションをつけるとさらに頑張ってくれる。しかし、これらは dangling でなく単に使われていないリソースも強制的に削除するため、注意して使う。

筆者の場合は `system prune -af`  を実行して 20.16GB が解放された。
[Node.js]ApplicationInsightsクライアントの実装

# はじめに

Azureでは、ログ蓄積サービスとして[ApplicationInsights](https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview)がある。(AWSのCloudWatch的なヤツ)
自分が今思う最適な実装を書き残しておく。

# 環境

開発環境: macOS 12.4
ランタイム: Node16
作成するサービス: Azure Functions

# 実装

```src/utils/applicationInsights.ts
import { TelemetryClient } from 'applicationinsights'

/**
 * ApplicationInsightクラス
 * ApplicationInsightクライアントをシングルトンで管理する
 */
export class ApplicationInsight {
  private static _applicationInsight: ApplicationInsight // 自クラスのインスタンスを保持するクラス変数
  private static _client: TelemetryClient // ApplicationInsightクライアント
  private static _initialized = false // ApplicationInsightがインスタンス化されているか

  /**
   * ApplicationInsightインスタンスを作成する
   * アクセス修飾子をprivateとし、インスタンスが単一を保つようシングルトンで作成
   */
  private constructor() {
    ApplicationInsight._client = new TelemetryClient(process.env.APPLICATIONINSIGHTS_CONNECTION_STRING)
    ApplicationInsight._initialized = true
  }

  /**
   * ApplicationInsightクライアントをreturnする
   * @returns ApplicationInsightクライアント
   */
  public static getClient(): TelemetryClient {
    // _initialized済で、_clientがnullやundefinedではないなら_clientをreturn
    if (ApplicationInsight._initialized && ApplicationInsight._client) {
      return ApplicationInsight._client
    }

    // インスタンスが存在しない時はインスタンス化
    ApplicationInsight._applicationInsight = new ApplicationInsight()
    return ApplicationInsight._client
  }
}
```

# 処理からの参照

```src/utils/logger/logger.ts
import { TelemetryClient } from 'applicationinsights'
import { ApplicationInsight } from '../applicationInsights'

export class Logger {
  // applicationInsightへの接続クライアント
  private static _client: TelemetryClient = ApplicationInsight.getClient()

  /**
   * 深刻度: インフォメーションのログを発行
   * @param msgId メッセージID
   * @param methodName 呼び出し元のメソッド名
   * @param stack スタックトレース
   * @return void
   */
  public static logInfo(msgId: string, methodName: string, stack = ''): void {
    // applicationInsightへのログ出力を行う。
    Logger._client.trackEvent({
      name: 'applicationLog',
      properties: {
        eventTimeJST: getJst().format('YYYY-MM-DD HH:mm:ss.SSS'), // getJst()は現在日時(JST)を取得する共通処理
        logLevel: 'INFO',
        methodName: methodName,
        messageId: msgId,
        message: msg,
        stack: stack,
      },
    })
  }
}
```

# 課題

テスト実行後、`client`が完全に破棄されきっていないらしく、接続をまだ保持し続けてしまっているっぽく、Jestが正常に終了しない

```terminal
Test Suites: 5 passed, 5 total
Tests:       27 skipped, 109 passed, 136 total
Snapshots:   0 total
Time:        10.896 s, estimated 11 s
Ran all test suites.
Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.
```

DBのコネクションクローズとか、
puppeteerの`await browser.close()`とかみたいに
applicationinsightsのクライアントを破棄する良い方法はないものか……
OpenCVで写真をドット絵調にする

# 概要

ドット絵とはレトロゲーム等に見られる描画方法で, 低スペックのゲーム機内でそれっぽいものを表現する手法です.
現在ではゲーム内の表現手法の一つとして確立しています.

入れた画像をドット絵調にするコードを書きました.

before
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/9b79bf36-f58d-b501-f451-97e4cdb44b2b.jpeg" width="400">
after
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/d8364943-d662-10f4-5fdf-8b68fd3cc3fa.png" width="400">

# ドット絵の特徴

ドット絵の特徴として
* 低画素
* 色数が絞ってある(カラーパレット)
* わかりやすい画調

が挙げられます.
それぞれに対し, ｢画像の縮小｣, ｢K-means｣, ｢輪郭描画+ハイコントラスト｣で対応させます.

# プログラムの流れ

## 背景削除

まず用意した画像の背景を削除します.
powerpointの｢背景を削除｣という機能が便利で, よく使っています.
一応OpenCVにも`cv2.grabCut`という背景を削除する関数が用意されています.

アルファチャンネル(透過情報)込みの状態で読み込むためには
```python
img_original = cv2.imread(PATH_IMG, -1)
```
とすればOKです. 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/c3433425-e9e6-fbb7-2c42-c6776989c3e2.png" width="400">



## 低画素 - 画像の縮小

まずは, 画像を縮小させ, 画素が少ない状態にします.
```python
img_small = cv2.resize(img, dsize=size_img)
```
画像がカクカクになったのがわかるかと思います.

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/6018eee8-528e-38e5-56d7-7bd52911a29c.png" width="400">


## 色数を絞る - K-means

画像一枚に使われる色数を絞ります.
頻度が多い色はひとまとまりにして同じ色に上書きするイメージです.
そのようなクラスタリングを実現させるために, 教師なしクラスタリング手法の一つであるK-meansを行います.
各画素がBGRではられた3次元空間上の点とみなし, その距離の近いものにまとめます

OpenCV内にもK-meansがあるようですが, 今回はscikit-learnで色を絞っていきます.

透過度が高い箇所が悪さしないように, ちょっと複雑なコードになっています.
```python
#透過二値変換
is_invisible = (img_small[:,:,3]<128)
img_small[is_invisible==True] = np.array([0,0,0,0],dtype=np.uint8)
img_small[:,:,3][is_invisible==False] = 255

#カラーパレット削減
pred = KMeans(n_clusters=NUMBER_PALETTE-1).fit_predict(img_small[:,:,:3][is_invisible==False])
colors = np.zeros((NUMBER_PALETTE-1,4))
for i in range(NUMBER_PALETTE-1):
    if len(img_small[is_invisible==False][pred==i])>0:
        colors[i] = np.average(img_small[is_invisible==False][pred==i],axis=0)
    else:
        colors[i] = np.array([0,0,0,0])
img_palette = img_small.copy()
img_palette[is_invisible==False] = np.array( [colors[i] for i in pred] ,dtype=np.uint8)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/9e03383e-24c1-c3da-69ea-09ff0debbe00.png" width="400">

## わかりやすい画調 - 輪郭描画･ハイコントラスト

輪郭取得はCanny法が有名で, それっぽい感じになるのでオススメ
ハイコントラストは画像の色を線形変換すればOKです.


```python
# コントラスト
img_tmp = (img_palette[:,:,:3].astype(int)-128)*contrast+128+offset
img_tmp = (np.clip(img_tmp,0,255)+0.5).astype(np.uint8)
# 輪郭
img_canny_bgr = cv2.Canny(img_small[:,:,:3],c_min,c_max)
img_canny_a = cv2.Canny(img_small[:,:,3],c_min,c_max)
img_canny = (img_canny_bgr==255)+(img_canny_a==255)
#表示
img_res[:,:,:3] = img_tmp
img_res[img_canny] = COLOR_OUTLINE
imgShow(bool*img_res,size=4)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950973/91d8e4cb-fbc4-9f4d-e988-c267e64528d2.png" width="400">
【クエリビルダ】ダウンロードした銀行口座取引をクエリする

銀行から CSV ファイルで取引データが提供される場合があります。 そのような場合、Sharperlight はそのデータを使用して生活費分析を実行できます。
今回はANZ銀行オンラインバンキングを利用してcsvファイルをダウンロードします。

ANZ銀行のインターネットバンキングの口座から取引データをダウンロードします。
「ソフトウェア パッケージ」として **Microsoft Excel(CSV)** を選択します。
日本の皆さんは、日本の銀行のインターネットバンキングで似たようなオプションがありますかね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4085dc18-0440-5bff-ff34-0177772aa3df.png)
Sharperlight アプリケーション メニューから **クエリビルダ** を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b8f8e592-dd50-d238-a4c1-b692133eac0b.png)
`モード` で **詳細レポート** を選択し、`製品` として **システム** を選択します。
`テーブル` で **CSV ファイル** を選択します。
`テーブル` の **CSV ファイル** が選択されるとすぐに、関連するフィルターが表示されます。
ダウンロードした CSVファイルを`ファイル名またはURLリンク`フィルターに選択します。
`ヘッダーを表示`に **N** を設定します。これは、CSVファイルにヘッダー行がないためです。
CSVファイルが選択された直後に、エンジンはファイルの読み取りを開始し、フィールドを取得して `選択` ツリー ビューを構築します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/99c9779d-c500-cce4-e5e7-e41ed12f8bcf.png)
CSVファイルにはヘッダーがないため、`選択`領域の列名には C1、C2、...C8 と表示されます。
列をひとつずつ `出力`領域にドラッグするか、右クリックメニューから **すべてを出力**を選択して、すべての列を出力してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/03129431-bd11-1aa9-5085-1a606dbbe503.png)
`プレビュー`ボタンをクリックしてクエリを実行します。 クエリは正常に動作するはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4292ef0c-b3a2-1e28-a3a5-d3f62bdc8490.png)

`クエリに戻る`ボタンをクリックして、クエリ定義に戻ります。
以下に示すように、出力列の説明を変更します。 右クリック メニューから**説明の変更**を選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/425de366-88a3-a119-1cd9-a815426c569f.png)
列の新しい説明を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6e7729df-8821-98ee-3f88-21e2676841d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c6fe1e07-5128-41d1-dcec-f587369c73ed.png)
今回は不要なのでC4～C8を削除します。
金額列には入金と出金の両方があるので編集してみましょう。
右クリックメニューから拡張表現を追加します。
`関数`ツリービューから`金額`列の参照を見つけて、`拡張式関数の構文`テキスト領域に設定します。
**IIF()** 関数を使用して **出金** の金額のみを返します。 **Val()** 関数を使用して金額を数値に変換することを忘れないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/19abc9f5-a945-ab3e-4884-ac4cdf8d0310.png)
`OK`をクリックして拡張表現を保存し、その説明を **出金** に変更します。
別の拡張表現を追加して **IIF()** 関数を記述し、**入金** の金額のみを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/da79ca75-420e-d11d-1563-c137fe07dc06.png)
`OK`をクリックして拡張表現を保存し、その説明を **入金** に変更します。
元の金額列は表示する必要がないため非表示にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/95909dfc-5044-e69b-7db7-64cbe3805aea.png)
結果をプレビューしてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3341e73a-b1e8-8b82-198d-ed0cde80ddd2.png)
CSV ファイルからデータを簡単に取得できることがわかりましたか?

Sharperlightのクエリおよび書き戻し機能を使用して、CSVファイル内のデータをデータベース テーブルに転送できます。
その後、データベース テーブルを使用して任意のSharperlightレポートを作成できます。
CSVファイルのダウンロードは自動化できないため、タスクを自動化することはできませんが、スケジューラーで読み取りと書き込みを同時に行うタスクを作成できます。
その後、CSVファイルをダウンロードするたびにそのタスクを手動で実行できます。

この記事を読んでいただきありがとうございました。
jestで複数のcsvのDBデータ（外部キー設定あり）を読み込み、設定する時の注意

以下のcsvで読み込んでDBに設定するとする。
```
・Aテーブル
　└カラムA1
　└カラムA2
```
```
・Bテーブル
　└カラムB1
　└カラムB2（外部キーAテーブル.カラムA2）
```
先に参照先であるAテーブルを設定しておかないと、Bテーブル登録時に外部キーエラーになるので注意。
すぐできる固有表現抽出

# はじめに
pythonのライブラリspaCy を使って固有表現抽出する．
今回はspaCyの最も精度が良いRoBERTa ベースのモデルを利用する．

https://spacy.io/


# 実装
## Install

```python
# model 
!pip install https://huggingface.co/spacy/en_core_web_trf/resolve/main/en_core_web_trf-any-py3-none-any.whl

# spacy-transformers
!pip install spacy-transformers -f https://download.pytorch.org/whl/torch_stable.html
```

## load

```python
# Using spacy.load().
import spacy
import spacy_transformers

# model
nlp = spacy.load("en_core_web_trf")

```
## use

この部分はspyCa サイトから

https://spacy.io/

```python
# Process whole documents
text = ("When Sebastian Thrun started working on self-driving cars at "
        "Google in 2007, few people outside of the company took him "
        "seriously. “I can tell you very senior CEOs of major American "
        "car companies would shake my hand and turn away because I wasn’t "
        "worth talking to,” said Thrun, in an interview with Recode earlier "
        "this week.")
doc = nlp(text)

# Analyze syntax
print("Noun phrases:", [chunk.text for chunk in doc.noun_chunks])
print("Verbs:", [token.lemma_ for token in doc if token.pos_ == "VERB"])

# Find named entities, phrases and concepts
for entity in doc.ents:
    print(entity.text, entity.label_)

```

# 感想
- 入力文の長さによって結果が異なります．
- 時々長い文を入力しても，何も返さない場合がある．これは困っています．