OmniAICreator/Qiita-1.07M huggingface dataset:
【PostgreSQL】不要になったROLEを削除する〜エラー対応含む

## 環境
CentOS7
PostgreSQL 11.18

## 事前準備
### ロールを作成

``` sql
CREATE ROLE sample_role LOGIN PASSWORD 'sample1';

-- 作成されたか確認
¥du
```
### テーブルを作成

``` sql
CREATE TABLE tbl (
    id int PRIMARY KEY,
    name text NOT NULL
);

-- 作成されたテーブルを確認
¥dt
```

### sample_roleにSELECT権限を付与する

``` sql
GRANT SELECT ON tbl TO sample_role;

-- 付与した権限の確認
SELECT grantee,
    table_name,
    privilege_type
FROM information_schema.role_table_grants
WHERE grantee = 'sample_role';
```

## ROLEの削除
### sample_roleを削除する

``` sql
DROP ROLE sample_role;
```

### エラー
SELECT権限などがROLEについていると削除が出来ないためエラーが出る。
``` sql
postgres=# drop role sample_role;
ERROR:  他のオブジェクトが依存していますのでロール"sample_role"を削除できません
DETAIL:  テーブルtblの権限
```

対応としては権限を取り消してから削除を実施する。

### 権限を取り消す

``` sql
REVOKE SELECT ON tbl FROM sample_role;
```

今回は検証なので1件だけですが、運用しているDBなら複数件取り消さないといけないことが大半。
下記のSQLを実行して複数のREVOKE文を作成する。

``` sql
select 'revoke ' || privilege_type || ' on ' || table_name || ' from ' || grantee || ';' FROM information_schema.role_table_grants WHERE grantee = 'sample_role';

revoke 権限 on tbl from sample_role;
revoke 権限 on tbl from sample_role;
~
```

### 再度ROLEを削除する

``` sql
DROP ROLE sample_role;

-- ROLEを確認する
¥du
```
Renderからメールが来たため翻訳してみた

# Renderからメールが来た
英文だったため、Googleの翻訳機能を利用してどんな内容だったか書き留めておこうと思います。


```
Hi there,
Your free plan database, xxxx_production, has been suspended. Your database will be inaccessible unless you upgrade to a paid plan.
If you don't wish to upgrade to a paid plan, your database and all backups will be deleted in 14 days, please make sure to backup your data prior to this.
You can read more about free plan databases in our docs.
If you have questions, feel free to reply to this email and we'll get back to you promptly.
The Render Team
```
```:翻訳
やあ、
無料プランのデータベース、xxxx_production は停止されています。
有料プランにアップグレードしない限り、データベースにはアクセスできません。
有料プランにアップグレードしたくない場合は、データベースとすべてのバックアップが 14日後に削除されます。
その前に必ずデータをバックアップしてください。
無料プランのデータベースについて詳しくは、ドキュメントをご覧ください。
ご不明な点がございましたら、お気軽にこのメールにご返信ください。早急にご連絡いたします。
```

# Renderについて
アプリケーションの公開、運用を行うためのプラットフォームを提供しています。
2018年にスタートした比較的新しいサービスです。
特徴としては、デプロイ作業が容易であり、基本機能だけであれば無料で使えるところです。
現在、自分で作成したWebアプリケーションを公開していますが、確かにデプロイ作業は手軽に思えました。

ここではrenderでのデプロイ手順については書きません。

# Renderを使用する際の制限について
- Webアプリケーションに関する制限

1. 無料プランでは、非アクティブ状態が15分間続くと自動的にアプリがスリープします。新しいリクエストが来るとスリープが解除されますが、最大30秒の応答遅延が発生する可能性があります。

1. 無料プランで使用できるのは、 1か月あたり750時間の実行時間と、100GBまでのデータ転送です。100GBを超える場合、0.10 USD/GBが課金されます。

1. 無料枠を超えると、サービスは自動的に中断され、有料プランにアップグレードされるか、無料枠がリセットされるまで、トラフィックを処理できなくなります。無料利用は毎月1日にリセットされます。

1. 通常、無料の Web サービスのビルドは、有料サービスのビルドよりも遅くなります。ビルドとデプロイの時間を短縮するには、有料プランにアップグレードしてください。


- データベースに関する制限

1. Renderで推奨されるデータベースはPostgreSQLで、初期状態ではMySQLを使用できません。

1. 無料でデータベースを作成し利用することができますが、作成後90日でアクセスできなくなります。

1. アクセスの停止から14 日間の猶予期間がありますが、この期間をすぎるとデータベースはデータと共に削除されます。

1. 無料のデータベースは、一度に１つだけアクティブにすることができます。

1. 無料のPostgreSQLデータベースはバックアップされません。有料プランにアップグレードして、毎日の自動バックアップと手動バックアップを利用できるようにします。

無料枠についての詳細（公式ドキュメント）
https://render.com/docs/free

# どうするか
私の場合ですが、メールでお知らせされたWebアプリケーションについては、AWSにてデプロイし直しているためrenderで公開することはなさそうです。
そのため、停止された状態、14日後に削除されても構わないという結論が出たため、そのままスルーしたいと思います。

renderの情報があまり無いように思うので、こんな方法もあるよ！とかこうした方がいいのでは？といった情報があればご教授いただきたいです。

以上です。
自分で作ったAI同士を会話させてみた



会話AIを2人分作成し、お互いに会話をさせてみました。また雑談としての面白さの検証と記録を兼ねて、その様子をYoutubeで生配信することにも挑戦してみました。以下のチャンネルで実験を行っています。

https://youtube.com/@aivtuber2378


今回はその経緯で得られた知見や結果を報告していきます。

# 事前の準備

## 人工知能の構成

まず大切なのは会話の作り方です。Chat-GPTをはじめとする最新の言語モデルなら会話文ごと生成することが可能です。これを分割して2人が話しているかのように表示、または音声を再生すれば対話を作り出すこともできます。

しかしこれは本質的には一人二役であり、実際に応答しているわけではありません。そこで今回はなるべく独立した2つのAIを用意して人間のそれに近い環境を再現しました。

## 個性付け

2つのAIにはそれぞれ個性ともいうべきキャラクター性を加えています。これは会話に彩りを加えること、そしてどちらの発言か分かりやすくするという狙いがあります。

![1-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/1f102463-f5c4-c670-110e-2314d051cd44.jpeg)
![Eveki-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/9cf312a9-891f-45ed-ebdb-c0593569331a.jpeg)

ちなみに画像等もAIによる自動生成を試してみました。Live2Dはまだ完成していないですが、静止画だと寂しいので瞬きとちょっとした動きをさせるようにしています。AIVtuberという肩書きのチャンネル名からも分かるように、アバターを使った配信形式であるVtuberを参考にしています。

## 文章生成、音声など

文章の生成には自作した会話AIアプリ『Eveki』をJavaScriptから使う形をとっています。音声合成にはVOICEVOXを利用しました。これらによって生成された文章を読み上げてくれるようになります。

![Eveki-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/713689/18e810ad-89c2-3bcc-65cb-7b8567a8eb52.jpeg)



# 実際の会話内容

私が実際に行ったライブ配信は以下のようになりました。なかなか長いのでとりあえず下の文章だけ読んでいただければ大丈夫です。　

<iframe width="560" height="315" src="https://www.youtube.com/embed/7aahrrC69VA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

## 口調の伝染

右のハンナは関西弁で、左のレイテは「〜ですわ」といったお嬢様言葉で話すように設定していました。しかし実際に会話させてみると、お互いひとりで話すときよりこの口調の反映のされ方が弱くなるような印象を受けました。また片方の話し方に影響されることもあり、両方とも関西弁になることもあります。

この結果は興味深いものです。単独のAIが出力した会話文ならこのような口調の混同は避けられたかもしれません。それらの学習元である文章、小説や戯曲であればひとりひとりの話し方の特徴は明確に定義され、変更されることはありません。

しかし現実の会話では話し方、口癖の伝染は頻繁に起こるものです。こちらにより近づいたと考えれば個性の揺らぎはむしろ良い結果なのかもしれません。

## 会話を終わらせようとする

実験段階から数分ほどのやり取りで会話も終わらせようとする動きが見られました。どこかに外出する、もう寝る、といった具合に話を切り上げようとしてしまいます。

よく考えてみるとこれは当然のことです。学習元である文章の中の会話は数分、長くて数十分くらいの会話を描写したものであるはずです。「カラマーゾフの兄弟」のように長い対話を元にした小説も存在しますが特殊な例にすぎません。

さらに人間自体も数時間ずっと内容のある会話ができるとは限りません。配信やラジオがお便りや投稿を元に話題を作っていることを考えると、AIが話を切り上げてしまうのも仕方ないことかもしれません。

# まとめ

## 考察と改善

独立2つのAIを用いることで実際の会話に近い、適度に個性を反映させた応答が可能になりました。一方で話題を見つけ会話を長続きさせるには人間と同じような創意工夫が必要だと言えます。この点に関しては適度にコメントを拾うことで改善ができると考えています。ただコメントの取得にはAPIの制限があるため頻度は調整する必要があります。

## 今後について

GPT-3などではなく自作の人工知能を使っているため比較的安価に何度も配信を試すことができます。これを利用して精度や配信としての魅力を高めていこうと考えています。もし興味があればチャンネル登録などしていただけると嬉しいです。

レイテ自体は公式LINEを通してメッセージのやり取りをすることができます。また会話AIアプリ『Eveki』はiOSにてリリースしています。こちらもよければぜひ試してみてください。


- [『Eveki』公式LINE](https://liff.line.me/1645278921-kWRPP32q/?accountId=289qekki)
- [会話AIアプリ『Eveki』](https://textcheckai.page.link/toapp)
サクラエディタでcsvを見やすく表示する設定

# 概要

こんな表示が…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/099478dc-0752-3c9b-a197-1ce74be059f1.png)

こうなって、見やすく＆編集しやくすくなる。
（カラム単位で縦揃えしてくれる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/776c773e-95d8-9b83-192c-9150b2db70c0.png)

カラムの間にタブが入る訳ではなく、あくまでサクラエディタの **表示が** 変わるだけ。

# やり方

なんでもいいのでcsvを開いてる状態で、 『設定』 ⇒ 『タイプ別設定』 。
該当拡張子のファイルを開いている状態で『タイプ別設定』開くと、その拡張子の『タイプ別設定』がすぐ開いて便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7ee254db-3d4f-b069-87b3-72ef431d544c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0f8ffe62-6997-3541-b9d1-57555205a1bd.png)

# 参考サイトさん

https://qiita.com/moromi25/items/70e638a3d47894ca7d6c

https://monaski.hatenablog.com/entry/2018/07/12/234948

# バージョン

Windows 10 Pro 22H2 OSビルド 19045.2546
サクラエディタ   v2.4.1.2849 32bit (tag v2.4.1)
Oktaを使ったSAML2.0の設定手順（Webアプリケーション連携）

## この記事でわかること

開発の中で、Webアプリケーション(SP)とOkta（IdP）のSSO（SAML2.0）設定を行ったので、その手順を備忘録的にまとめます。（23年1月時点のもののため、変更になる可能性があること、ご了承下さい）

この記事を読んでわかること

- OktaとWebアプリのSSOインテグレーション設定

## Okta（IdP側）の設定

1. Oktaの管理画面から左ペインのApplicationを選択。遷移した画面からApplicationを押下。Create App Integrationを押下。
    ![管理者メニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/ae8246b2-6241-55d2-d99a-0eed3e238393.png)
     ![SAML設定①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/2791ab74-793b-a65e-05af-e58b37ca95f6.png)

2. SAML2.0を選択し、Nextを押下
    ![SAML設定②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/a4d6da73-5380-e991-a25b-c78ccb42cab9.png)
   
3. 任意のアプリ名を入力し、Nextを押下
    ![SAML設定③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/c8e66237-3717-3e68-bf22-d035c1a400f5.png)

4. SAML Settingsの画面上で必要項目を入力し、Nextを押下
    ![SAML設定④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/ab96f1b6-6d12-8784-6c05-413e700e6bb1.png)
    | Okta管理画面上の表記 | 一般的解釈 |
    | --- | --- |
    | Single-sigin-on URL | SP側の応答URL |
    | Audience URI  |  SP側のエンティティID |
    | Default RelayState | SP側のログインURL |
    | Name ID format  | SAMLRequestのName IDフォーマット。SP側のSAMLrequestの仕様によるが、メールアドレスが主流 |
    | Application username | SP側のユーザIDの形式 |
    | Update application username on | プロビジョニング設定。SP側でユーザIDに変更が合った場合にOktaにも設定を反映してくれる |
5. I'm an Okta customer adding an internal appを選択※し、Finishを押下。
   ※フィードバックの構成のため、社内のみでの利用の場合は上記でOK。
    ![SAML設定⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/e2a3e6a6-dda1-866e-c523-18eced369fb8.png)
    
    
    

## メタデータXMLの抽出方法

※SP側にOktaの情報を認識させるために利用

1. Oktaの管理画面から左ペインのApplicationを選択。遷移した画面のSign Onタブを選択
    ![SAML設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/6db88bb2-4f5f-f638-4d89-4133655ccee3.png)


2. ページ下部にある、SAML SetupのView SAML setup instructionsを押下
    ![SAML設定⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/876d12e3-dda9-001a-91d1-13064eba45b2.png)

3. 遷移したページでOptionalのXMLをコピー
    ![SAML設定⑧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956558/2f08ad04-e4b9-ee0c-2af9-15c60f10fdc4.png)

4. テキストエディタに貼り付け、拡張子「.xml」で保存（整形してもよい）
   ※ ここのいい方法をご存知の方がいれば教えて下さい。
    

## Oktaユーザのアプリケーション紐づけ

1. Oktaの管理画面から左ペインのApplicationを選択。ユーザを紐づけたいアプリケーションを選択
2. Assignmentを押下、Assign to Peopleを選択
3. 紐づけたいユーザを選択し、Fin

## まとめ

今回の開発では複数のIdPに触りましたが、応答URLやエンティティIDが各サービス毎に呼び名が異なり、困惑しました。

幸いOktaは日本語ドキュメントが豊富なため、あまり迷うことなく設定ができましたが、日本で認知度の低いIdPサービスだと一苦労だろうなと思います。

（Opsを考えた時にサービス選定の基準になるかもです）
Noderedでalexa.amazon.co.jpにログインできなくなったので、各スマート家電メーカーのAPIを叩く(初投稿)

# 環境
* Windows11 Desktop
    * Wireshark v4.0.3
* iPhone 12 mini
* +Styleのアプリ
    * +Styleのスマート電球
* Wifiルータ
    * 上記全てのデバイスが有線/無線でこのルータに接続
    * インターネットWANもこのルータに接続

# いきさつ
過去に、

参考文献1

https://www.zumid.net/entry/raspberry-pi-nodered-alexa-speak/

参考文献2

https://dream-soft.mydns.jp/blog/developper/smarthome/2020/05/1035/

などを参考に Alexa と自宅VPNサーバを兼ねている RaspberryPi 3B+ を連携して、
キーボードの入力から Alexa の定型アクションを実行できるようにしていた。

# Alexa が Nodered で使えなくなる

それが最近(2023/02/06)になって、急に Nodered の Alexa-remote2 のアカウント認証が通らなくなった。
認証画面にてメールアドレスやパスワードを入力すると、以下のようなサイトに移動してしまう。
alexa.amazon.co.jp がなくなったらしい？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/fbc7913a-bb8e-8ed8-645c-853d4a0b702a.png)

調べても同じ問題に直面している人がいなかったから、
参考文献2での Nodered のコード変更がまだアップデートなどに対応していないせいかと思い、
Amazon.com のアメリカサーバに新しくアカウントを作ったが、上手くいかなかった。

Nodered から Alexa 内の定型アクションが実行できないと、 Alexa を通してしか実行できないコマンドが使えなくなってしまう。非常に不便。

とりあえずの解決策は取れたが、それは次の投稿で。
まずは投稿する癖をつけよう。

続けて次の投稿をしようと思ったら、投稿頻度が高すぎるとQiitaに怒られたので、
このまま続きを書く。

## もともと Nodered と Alexa でやっていたこと

元々キーボード入力で実現したかった定型アクションは、電球の切り替え。
PC用デスクと寝室が一体の部屋で暮らしているため、
PCを触るときには天井の電球をオンに、
布団でスマホを触るときは間接照明をオンにしたい。
この切り替えをするために毎回「アレクサ」と呼びかけるのが面倒だった。
だから Raspi にワイヤレステンキーを接続して、その入力に応じて Nodered から Alexa の定型アクションを行う、という手順を取っていた。

しかし Nodered と Alexa の連携が取れなくなったので、
Nodered から直接スマート電球のオンオフをコントロールすることにした。

# 今回の作業

自室で使用しているスマート電球は
SwitchBot製
Tplink製(正確にはスマートプラグが電球に接続していて、スマートプラグのオンオフで電球を操作する)
+Style製
※この合成獣状態が良くないとは思うのだが、これのおかげで勉強するいいきっかけになったのでヨシ。

上記3つのうち、 Nodered から直接叩けるものは SwitchBot と Tplink。
+Styleに関してはスマホアプリはあるものの、nodered 上では操作できなかった。
SwitchBot と Tplink に関して開発してくれた方に感謝。

## SwitchBot

SwitchBotは

https://digital-light.jp/2021/09/09/how-to-all-switchbot-api-from-node-red/

を参考に node-red-contrib-switchbot-api で以前行っていた。
SwitchBot の スマートリモコンが必要で、アプリから認証ファイルとかを出力する必要があったはず。
明記できなくて申し訳ない。

## Tplink

Tplinkは node-red-contrib-tplink が最も良さげに見えるのだが、上手くいかなかった。
node-red-contrib-tplink-tapo-connect-api の方で上手くいった。
ただ、 node-red-contrib-tplink-tapo-connect-api は各ノード毎にメールアドレスとかを書く必要があるのが面倒だったので、
command ノードにmsg.payloadを設定する function ノードを付けることで、コピペで複製しやすくした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/97defc94-0fc2-5355-eaf9-076a7b303bd2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/2d36efa5-e7f7-cdb2-d5d2-f5ec8c36df40.png)

それと、43un700b というモニターを使っていて、RJ45を使うとコマンドラインからモニターのpbpを制御できたりするから、そのノードも組み合わさって、(例: bash /home/shiganai/43un700/off.sh)
以下のような switch ノードで単純につなぐものが出来上がった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125845/64d4c783-beef-0848-78e6-1fa134c1686c.png)

+Style製の電球に関してはスマホアプリを解析することで
以下のように乗っ取れないかと試行しているところ。
メインの電球ではなかったので問題は大きくないが、勉強になるので頑張っている。

https://www.gcd.org/blog/2020/09/1357/

アプリを乗っ取るのにtcpやtslの勉強が必要で、おそらく乗っ取れない。
アプリ乗っ取りの試行錯誤はまだ決着がついていないので、次回に回す。

# 追記:
* (23/02/06)アプリの乗っ取りは出来なかった。

https://qiita.com/shiganai/items/82c90c30736d499f0bee
Ruby インスタンスを生成してプログラムを作成

# インスタンスの生成を行ってプログラムをつくる

ターミナルで、以下のように出力されるようプログラムを作っていきます。

```ruby
採れたて新鮮な果実です
リンゴは120円です
オレンジは200円です
イチゴは60円です
# ターミナル
```


```ruby
class Fruit

  def self.fresh
    puts "採れたて新鮮な果実です"
  end

  def initialize(name, price)
    @name = name
    @price = price
  end

  def introduce
    puts "#{@name}は#{@price}円です"
  end
  end

  apple = Fruit.new("リンゴ", 120)
  orange = Fruit.new("オレンジ", 200)
  strawberry = Fruit.new("イチゴ", 60)

  Fruit.fresh
  apple.introduce
  orange.introduce
  strawberry.introduce
```

## 解説
この問題は、もともと条件提示と雛形があり、それに沿って作成していく問題でした。
作成手順を書いていきたいと思います。
- インスタンスを生成し、インスタンス変数の定義を行います。
インスタンスを生成するときに引数を書くこと。
そして、nitializeメソッドについて覚えているか？→忘れていました。
これはnewメソッドの引数を受け取ることができるメソッドです。
なので、以下のように書きます。

```ruby
def initialize(name, price)
  @name = name
  @price = price
end

# メソッド外
apple = Fruit.new("リンゴ", 120)
orange = Fruit.new("オレンジ", 200)
strawberry = Fruit.new("イチゴ", 60)
```

- クラスメソッドfreshを定義します

下記のようにしてクラスメソッドを定義します。
```ruby
class クラス名
  def self.メソッド名
    # 処理
  end
end

# クラスメソッドの呼び出し
クラス名.メソッド名(引数)
```

```ruby
def self.fresh
  puts "採れたて新鮮な果実です"
end
```
putsの内容は、条件で指定があったためこのように書きました。
- インスタンスメソッドを定義します

```ruby
def introduce
   puts "#{@name}は#{@price}円です"
end
```

- クラスメソッドとインスタンスメソッドを呼び出します

クラスメソッド：クラス名.メソッド名
インスタンスメソッド：インスタンス.メソッド名

```ruby
Fruit.fresh
apple.introduce
orange.introduce
strawberry.introduce
```
ESP32: i2c でデータの取り込み

こちらの部品を使います。
[３軸ディジタルコンパスモジュール HMC5883L](https://strawberry-linux.com/catalog/items?code=12105)

レジスタマップは次にあります。
[HMC5883L ディジタル３軸地磁気センサ](https://strawberry-linux.com/pub/hmc5883l-manual.pdf)

```text
センサとの通信がうまくいっているか確認するために、最初は Identification Register を読み込んでみてください。
```

上記に従い、0X0A,0x0B,0x0C のレジスタを読みます。
そして、値の入っている、0x03,0x04,0x05,0x06,0x07,0x08
を読みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1f77d400-20f4-17bc-f60f-4eec1e4ee2da.png)

## プログラム

```text:geomagnetic.ino
// ---------------------------------------------------------------------
//	geomagnetic.ino
//
//						Feb/06/2023
// ---------------------------------------------------------------------
#include <Wire.h>
#define	PROGRAM	"geomagnetic.ino"
#define	VERSION	"2023-2-6 AM 10:46"

// デバイスアドレス(スレーブ)
uint8_t DEVICE_ADDRESS = 0x1E;  
 
// ---------------------------------------------------------------------
void setup()
{
	Serial.begin(115200);
	delay(3000);
	Serial.println(PROGRAM);
	Serial.println(VERSION);
	Serial.println();

	Wire.begin();			 
	// Mode Register(測定モード) 
	Wire.beginTransmission(DEVICE_ADDRESS);	
	// Mode Registerのアドレス		
	Wire.write(0x02);
	// 測定モードを連続測定モードにする
	// 00 連続測定モード
	// 01 単位測定モード(デフォルト)
	//		※1度だけ測定後、アイドルモードとなる
	// 10,11 アイドルモード
	Wire.write(0x00);	
	Wire.endTransmission();
}

// ---------------------------------------------------------------------
uint8_t read_register_proc(uint8_t address)
{
	Wire.beginTransmission(DEVICE_ADDRESS);
	Wire.write(address);
	Wire.endTransmission();
	Wire.requestFrom(DEVICE_ADDRESS, 1);
	while (Wire.available() == 0 ){}
	uint8_t aa = Wire.read();

	return aa;
}

// ---------------------------------------------------------------------
void read_data_proc()
{
	// XYZレジスタ用のテーブル(6byte)
	uint8_t RegTbl[6];

	// 6byteのデータを取得する
	for (int it=0; it< 6; it++){
		RegTbl[it] = read_register_proc(0x03 + it);
	}

	for (int it=0; it<3; it++)
		{
		int jt = it * 2;
		Serial.printf("%d\t%x\t%x\r\n",it,RegTbl[jt],RegTbl[jt+1]);
		}
	Serial.println(""); 
}

// ---------------------------------------------------------------------
void loop()
{	
	uint8_t aa = read_register_proc(0x0a);
	Serial.printf("A: %x\r\n",aa); 
	uint8_t bb = read_register_proc(0x0b);
	Serial.printf("B: %x\r\n",bb); 
	uint8_t cc = read_register_proc(0x0c);
	Serial.printf("C: %x\r\n",cc); 

	read_data_proc();

	delay(5000);
}

// ---------------------------------------------------------------------
```

実行結果

```text
A: 48
B: 34
C: 33
0	0	b3
1	0	53
2	0	48
```
経費申請モバイルアプリをつくってみた【構造・テンプレート準備編】

# はじめに
現状、社内で諸々の申請を行う際、

①Excelテンプレートとして用意されている申請書をコピーし、内容に必要事項を入力
②添付画像（領収書等）があれば、スマホ撮影
③撮影した画像をOneDrive等でPCへ共有
④作成した申請書、添付画像を総務へメールで送り、申請

といった流れをとる必要があります（個人の環境にもよります）。

画像の取り込み等でスマホとPCを行き来しなければならなかったり、そもそもPCが使えない環境でサクッと申請ができなかったり…もう少し何とかならないかと考えていました。
そこで作成したモバイルアプリをご紹介します。


本記事は構造・テンプレート準備編です。


# 構造
### SharePoint
今回はドキュメントライブラリをDBとして使用します。
主な役割は以下です。
- 申請書テンプレートの配置
- 申請書および添付画像の格納
### PowerApps
アプリの外側となります。
- 情報の入力
- 画像の選択
- 画像の取り込み
- PowerAutomateへ情報の引き渡し
### PowerAutomate
PowerAppsで入力した内容を処理し、申請を行います。
- 申請別にフォルダを生成
- Shareoint上の申請書テンプレート（Excelファイル）のコピー
- Excelファイルへの書き込み
- 画像の生成
- 総務および上司へTeamsで申請通知

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/07ac053e-884f-143d-d88f-71521870e967.png)

# 作成準備
### テンプレート作成
PowerAutomateがExcelに値を書き込む際、最も簡単な方法は「テーブルへの書き込み」です。
今回は、申請書用シートとは別にテーブルを用意し、PowerAutomateで書き込みを行います。
さらにその値を申請書側の各項目に数式を入れ、探す方式で作成しました。

#### ①申請に必要な情報の洗い出し
テーブルを作成する前に、申請に必要な情報を確認します。
今回は下記申請書を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/f4904953-f384-44eb-ac7d-0520534f3676.png)

必要情報は、
- 申請日
- 部署
- 社員番号
- 氏名
- 会計用途
- 件名
- 発生事象
- 申請内容
- 添付書類の画像名
- 枚数

が挙げられます。
この情報をもとに、テーブルを作成します。

#### ②テーブルの作成
テンプレートファイルの別シートに、テーブルを用意します。
①で挙げた必要情報を羅列し、テーブル化します。
テーブル名を付けておくと後の工程でわかりやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/e9581bbc-fa60-2ee9-636f-6ec30c7cec1f.png)



#### ③申請書シートの各項目に数式を入力
テンプレート作成の段でも述べましたが、「PowerAutomateでテーブルに書き込み、各値を数式で探す」構造となります。
今回はHLOOKUP関数を使い、各項目を埋めていきたいと思います。

:::note info
**HLOOKUP関数とは**
ざっくり言うと、「行を指定して水平方向に検索する」数式。
書式は、
HLOOKUP(検索値,範囲,行番号,検索の方法)
です。
:::
申請書シートの各項目に、上記HLOOKUP関数を入れていきます。
今回の範囲は「申請用テーブル[#すべて]」、行番号は「2」、検索の方法は完全一致のため「FALSE」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/7715d576-e6a1-adc3-73ac-ea3bc780583d.png)

#### ④SharePointに申請書テンプレートファイルを配置
作成したファイルをSharePointの任意のドキュメントフォルダに配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641628/0590940c-f360-bd37-64a6-394cdb4b9c2a.png)

# PowerApps編へ
これでテンプレートの準備が完了しました。
次回はPowerApps側の処理を作成していきます。

↓↓PowerApps編

https://qiita.com/pbuchiumi/items/5c27edaf271be1a8009f
HTMLを基本からまとめてみた【インライン要素とブロック要素】

## ブロックレベル要素
ブロックレベル要素とは、その名の通りコンテンツをまとめる箱のような使い方をする要素のこと。このブロックレベル要素によってWebサイトの大枠を形作られる。
```sample.html
//例　
<div>こんにちは<div>
<div>こんにちは<div>
<div>こんにちは<div>
```
```
//screen

こんにちは
こんにちは
こんにちは
```

## インライン要素
インライン要素とは、文章の一部として扱われる要素のこと。基本的にブロックレベル要素の中で使用され、ブロックレベル要素の内容に効果をもたらす要素が多く含まれる。
※ 横幅と縦幅は指定する事ができない

```sample.html
//例　
<span>こんにちは<span>
<span>こんにちは<span>
<span>こんにちは<span>
```
```
//screen

こんにちはこんにちはこんにちは
```

##### htmlniは、タグが何種類かある。初めて見たタグは、『ブロックレベル要素』『インライン要素』か確認すること！
上記の方法で確認すれば、『ブロックレベル要素』『インライン要素』がわかる。





## 参考サイト
[【基礎知識】ブロックレベル要素・インライン要素の性質と違い](https://www.itra.co.jp/webmedia/block-inline-difference.html)
【php】メモリ不足時にphp.iniのmemory_limitを変更する前に変数の解放を試したい

# 概要
phpで負荷の高いプログラムを書いてるときに
Allowed memory size of ~~ みたいなメモリ不足エラーがでることがままあるが、

普段このエラーが発生したときは脳みそ停止して、
「php.iniのmemory_limit調整しなきゃ･･･」みたいに思ってたんだけど、
そもそもプログラム側にメモリの無駄があるんじゃないかと思い色々調べた話です。

## 不要になった変数の解放
普段あまり意識してなかったけど、
当然と言えば当然だが、プログラム上で変数に値を持たせれば
その容量に応じてメモリを使ってることになる。

PHPにはガベージコレクションという仕組みがあって、
関数とかのまとまった処理を抜けると、そこで使っていた変数は勝手に開放されるらしい
（この辺はまだちゃんと調べてないが･･･）

言い換えれば、関数とかを抜けなかったらメモリは勝手に開放されないわけで･･･

例えば、
DBからデータを抽出→インポート用にデータを変換→他DBにデータをインポート
みたいな処理を考える
```
# データの抽出
$export_data = $this->dataExport();
→ ここで大量のデータをエクスポート

# データの変換
$import_data = $this->dataTransform($export_data);
→ エクスポートしたデータをインポート用に変換

# データのインポート
$this->dataImport($import_data);
→ ...メモリエラー発生
```
上記のようなプログラムでは、
抽出するデータ量が膨大だと、それだけのデータを$export_dataに格納し続けることになるので、
その分だけメモリを抱え込むことになる。
それが原因で、後続処理でメモリエラーが発生するかもしれない

データ変換後であれば、抽出データは必要ないはずなので、
データ変換後に、$export_dataを明示的に開放してやると、メモリエラーを回避できるかもしれない。

```
# データの抽出
$export_data = $this->dataExport();
→ ここで大量のデータをエクスポート

# データの変換
$import_data = $this->dataTransform($export_data);
→ エクスポートしたデータをインポート用に変換

# export_dataの開放
unset($export_data);

# データのインポート
$this->dataImport($import_data);
→ ...メモリエラーなく実行できる、かも？
```
自分が作っていたプログラムだと、これでメモリエラーが回避できたので
なるほどなぁって感じでした。

# プログラムの最適化も大切という話
メモリ不足となって、php.iniの値を512M,1024M,2048M...と大きくするのも一つだけど、
まずはプログラムに無駄なコードが無いかを見直してみるのが大切かもしれないですね。
もちろん、それでもメモリ不足なるならiniをいじってやらないといけないかもしれませんけども。
【ScrapeStorm】学術研究にオススメ | 文献管理ツール 5選

## 学術研究とは？
学術研究は人文・社会科学、自然科学のあらゆる学問分野にわたるものであり、その目的、性格、規模、方法等が極めて多様である。また、学術研究においては独創性が重視されるとともに、萌芽的な研究や長期間を経て波及効果が現れる研究など評価が困難なものも多い。

## 文献管理ツールとは?
論文執筆に必要な文献をオンラインで蓄積・管理し、論文の引用文献リストを簡単に作成することが可能な、文献管理・論文執筆支援ツールです。

本文はいくつかの文献管理ツールを紹介します。

## 1.Wizdom.ai(元Colwiz)
ホームページ:**www.wizdom.ai**
世界のデータの 90% は過去 2 年間に作成されたものです。wizdom.ai はその意味を理解するのに役立ちます。人工知能を使用して、wizdom.ai は研究風景の最も包括的な画像を生成し、トピック、機関、国、ジャーナル、および資金提供機関に関する洞察を提供します。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2022/11/1.Wizdom.ai_-1500x757.png)

## 2.EndNote
ホームページ:**www.endnote.com**
EndNote（エンドノート）は文献の収集・管理・閲覧・引用・共有などの機能を有した、論文を読む方、論文を執筆する方に最適な文献管理・論文作成支援ソフトです。自分だけの文献データベースを作成し、文献の管理を効率化します。学術文献データベースやフルテキストPDFから文献情報を簡単取り込み、Wordなどのワープロソフトと連携して参考文献リストを自動作成します。手間のかかる参考文献リストの作成もカンタンです。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2022/11/4.EndNote-1500x757.png)

## 3.Zotero
ホームページ:**www.zotero.org**
「zotero」は、インターネット上で検索した論文や参考URLなどを一括で登録し、参考文献リストを自動作成する機能があります。また、100MBまでの登録は無料で行うことができ、容量が足りなくなった場合にはプラスの容量を購入して増やすことも可能なのです。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2022/11/3.Zotero-1500x757.png)

## 4.RefME
ホームページ:**アプリケーショ**
RefMeは、携帯電話で紙を読むプロセスを可能な限り簡単にするアプリケーションです。何千ものオープン教育リソースを読むことができます。関連するトリアージされた論文だけを見て、グーグル検索のノイズを取り除きます。スキャンすることで素早く簡単に参考文献が作れる無料アプリです。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2022/11/2.RefME_-1500x827.png)

## 5.Mendeley
ホームページ:**www.mendeley.com**
Mendeleyは文献情報の管理や研究ネットワーキング、最新研究の発見において研究活動を支援する、無料の文献管理・学術ソーシャルネットワーキングツールです。PDFからの論文情報の取り込みに優れ、引用文献リストも希望のスタイルで 簡単に出力可能です。研究を整理し、他の人とオンラインで協力し、最新の研究を発見するために役立ちます。
![代替テキスト](https://jp.scrapestorm.com/wp-content/uploads/2022/11/5.Mendeley-1500x757.png)
接触式マイクを使って、騒音環境下できれいな音を取る

## はじめに
音取りする現場が病院の近くだったりすると、救急車のサイレンに影響されないか心配です。
というわけで、Mononeマイク（接触式マイク）を使ってサイレン（騒音）がどの程度きれいになるのかを検証してみました。

## 実験方法
### 測定対象
・モータ音（取りたい音）
・サイレン（騒音）
### 実験環境の準備
音取りする現場（工場）を再現するため、モータを準備しました。
モータの回転音を取得しました。
サイレンを再現するために、スマートフォンで音を出しました。
スマートフォンで流したサイレンは、効果音ラボにある音源を使いました。
マイクは、Mononeマイク（接触式マイク）と空間伝播マイクを使用しました。
取得状況は、以下の写真の通りです。
![音データ取得状況.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025654/00b771a6-8690-76fa-fe9b-a21bb314d5d9.png)

### 実験手順
1. 音データは、下記の４条件で取得する
  （１）空間伝播マイク_サイレンなし
  （２）空間伝播マイク_サイレンあり
  （３）Mononeマイク（接触式マイク）_サイレンなし
  （４）Mononeマイク（接触式マイク）_サイレンあり  　
1. 取得した音データを解析する

### 取得した音データ
こちらが音データです。
#### 空間伝播マイク_サイレンなし
<iframe width="560" height="150" src="https://www.youtube.com/embed/ZzuZ_JKMG-4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
モータ音がしっかり取れていることがわかります。

#### 空間伝播マイク_サイレンあり
<iframe width="560" height="150" src="https://www.youtube.com/embed/RqNByBlBvsg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
モータ音も聞えますが、サイレン音がうるさいですねー。

#### Mononeマイク（接触式マイク）_サイレンなし
<iframe width="560" height="150" src="https://www.youtube.com/embed/OoVxDeoAHqk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
こちらもモータ音がしっかり聞こえます。

#### Mononeマイク（接触式マイク）_サイレンあり
<iframe width="560" height="150" src="https://www.youtube.com/embed/Te2Y1FYmlq0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
モータ音はよく聞こえますが、サイレンが全く聞こえないです。

## 解析結果
取得した音データのメルスペクトログラムとFFTプロットを、集音したマイクごとに「サイレンあり」と「サイレンなし」で比較してみます。
### Mononeマイク（接触式マイク）_プロット
![接触式マイク_プロット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025654/2dd0500d-7efb-1f69-3caa-273f02fc9e99.png)
メルスペクトログラムとFFTプロットにほとんど違いがありません。サイレン音の影響をほぼ受けていないことがわかります。

### 空間伝播マイク_プロット
![空間伝播マイク_プロット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3025654/05d7d49a-ead7-7d0a-c47c-2a8320dd6c8a.png)
こちらは、はっきりした違いが確認できます。
まず、メルスペクトログラム上で､｢サイレンあり｣の方にだけ､強く反応しているメルバンドがあります。
また、FFTプロット上に、「サイレンあり」の方にだけ、強く出ている周波数が２つあります。

調べてみると、サイレン音（ピーポー音）の周波数は、

「ピー」が９６０Hz（厳密には９７０Hzでビブラートがかかっている）
「ポー」が７７０Hz（厳密には７６０Hzでビブラートがかかっている）

とのことでした。

確かに、その付近の周波数帯のメルバンドが強く反応していますねー。
FFTプロットだと、「ピー」と「ポー」のそれぞれのスペクトルの違いまでわかります。（「ピー」を赤色、「ポー」を青色でそれぞれ図示）

プロット上からも、サイレン音を拾ってしまっていることがはっきりと確認できました。


## 結論
空間伝播マイクだと騒音を拾ってしまいますが、Mononeマイク（接触式マイク）だと騒音のないきれいな音が取れました。

## まとめ
今回はMononeマイク（接触式マイク）を使うと、騒音環境下でもきれいなモータ音が取れることを確認しました。
Mononeマイク（接触式マイク）のメリットを改めて実感できました。

今後も、騒音がうるさい現場で積極的にMononeマイク（接触式マイク）を使っていきたいと思います。


## 参考
[効果音ラボ](https://soundeffect-lab.info/)
[サイレン音の周波数](https://degitekunote.com/blog/2015/07/18/sairen/)
SASS

1.yarn add sass
にてインストール。

2.cssの拡張子を.scssへ変更


3.記述方法
下記のような入れ子や、変数名を定義して色を指定なども可能

```css
$main-color: pink;

.App {
  width: 100%;
  height: 100vh;
  overflow: hidden;
  display: flex;
  font-size: 16px;

  h2 {
    background-color: $main-color;
  }
}
InfluxDB Query 行が存在しないデータを除外する方法

exists演算子を使用してみることができます:

from(bucket: "my_bucket")
     |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
     |> filter(fn: (r) => r["_measurement"] == "my_data")
     |> filter(fn: (r) => r["_field"] == "temp1"  or r["_field"] == "temp2" or r["_field"] == "temp3" )
     |> filter(fn: (r) => exists r._value)  // this line will filter out null values
     |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
     |> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
     |> yield()
macamでNTSC

OV511+SAA7111

![OV.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f67fb31c-c097-10e0-88d3-8a47596bcaad.jpeg)

USBVision+SAA7111

![USBV.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7274d803-3321-f679-2113-5abe652230cd.jpeg)

EM2820+TVP5150

![EM2820.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/da1bd247-a004-90e8-17d0-91c6c6eb8f91.jpeg)

EM2860+SAA7113

![EM2860.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8d26de5a-7032-b23c-c7e7-000dfc014bf0.jpeg)

OV511とUSBVisionはUSB 1.0なのでこのサイズでも一秒間に5フレームくらいしか表示できません。EM2820やEM2860はUSB 2.0でちゃんと30フレーム表示できます。

CX23416などのmpegモジュールでリアルタイムに表示するためにはホスト側でデコードが必要になりかなり難易度高いです。

リアルタイムに見るのではなく、ファイルに録画するのであればmpegモジュールを使うのが良いです。

これらは私が拡張したもので、コードはここにあります。

https://github.com/yamori813/macam
Valueを付与した変数にJUnitでモックする

# Valueを付与した変数にJUnitでモックする方法

## 概要
- `@Value`を付与した変数を扱うクラスのテストを実施した際、`@Value`の変数の値がテスト時のみnullとなってしまう事象が発生

- 以下テスト対象のクラス

```java
@Component
public class HogeService {

  @Value("${sample.variable}")
  private String sampleVariable;  ← ここの変数がテストでnullで返ってくる
...
```

↑の件、少し解決につまづいたので、解決方法を記載

## 結論

- `org.springframework.test.util.ReflectionTestUtils`を利用することでmockできる
```java
ReflectionTestUtils.setField(instance, "name", "value", String.class);
```

### サンプル

- `@Value`を利用しているクラス
```java
@Component
public class HogeService {

  @Value("${sample.variable}")
  private String sampleVariable;
...
```

- `@Value`を利用しているクラスのテストコード
```java
@ExtendWith(MockitoExtension.class)
public class HogeServiceTest {

  @InjectMocks
  private HogeService hogeService;

  @BeforeEach
  private void setup() {
    ReflectionTestUtils.setField(
        hogeService,
        "sampleVariable",
        "test",
        String.class);
  }
...
```


## 理由
- `@Value`は外部から値をインジェクションしているため、JUnitでテストを実施する際もmockの設定をしなければ、外部のファイルから自動で読み取ってくれないので、@Valueを付与した変数は値がnullになってしまう
- そのため、テストでは`@Value`を付与した変数に`ReflectionTestUtils.setField`を利用し、値をインジェクションすることで解決

## 補足

### @Valueとは
- `@Value`は別のファイルから値をインジェクションしたいときに用いるアノテーション
- application.ymlやapplication.propertiesに記載されている値を読み取ると気に利用する

#### 例
- 読み取り先のファイル
```yml:application.yml
sample:
  hoge: test
```

- 指定方法
```java
@Value("{sample.hoge}")
private String sampleHoge;
...
```


## 参考
- https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config
- https://qiita.com/rebi/items/e575a556dd27106894b0
- https://qiita.com/DriftwoodJP/items/d8c8d544ab8da89630d8
Cloudflare Area 1 Email Security 用に Gmail BCC 設定を行う



# 目的

- [Setup phishing risk assessment for Gmail with Area 1 · Cloudflare Area 1 Email Security docs](https://developers.cloudflare.com/email-security/deployment/api/setup/gsuite-bcc-setup/)

こちらの内容を日本語でキャプチャしながら実施してみます。

Gmail では、外部でサードパーティソリューションが電子メールのコピーを受け取るために BCC 設定を追加できます。

メールセキュリティソリューションの検証フェーズでは、BCCデプロイメントの方式をとることで既存のメール通信に影響を与えない形で効果測定を行うことができます。

- [Google Workspace の無料試用について - Google Workspace 管理者 ヘルプ](https://support.google.com/a/answer/6388094?hl=ja)

Google Workspace は無料試用を提供しているので、無料でテストアカウントを作成できます。

> ![Email flow when setting up a phishing assessment risk for Gmail with Area 1.](https://developers.cloudflare.com/email-security/static/deployment/api-setup/gmail/gmail-bcc-flow.png)

# BCC 用サービスアドレスの確認

Cloudflare Area 1 Email Security のアカウントが払い出されていることが前提になりますが、

https://horizon.area1security.com/support/service-addresses から「サポート ＞ サービスアドレス ＞ BC」にある `xxx@mxrecord.io` の情報を設定に使うため、事前にメモしておきます。

![image-20230206000359842](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230206000359842.png)

# コンテンツコンプライアンス設定の追加

Google Workspace 管理コンソール https://admin.google.com > Gmail > コンプライアンスにアクセスします。

![image-20230205171626207](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205171626207.png)

コンテンツコンプライアンスを設定します。

![image-20230205171741068](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205171741068.png)

名前を「Area 1 - BCC」等に設定し、「影響を受けるメール ＞ 受信」をチェックします。

「次の一部がメールに一致する場合 ＞ 表現」を追加します。

![image-20230205172109936](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205172109936.png)

「高度なコンテンツマッチ」を選択し、以下のように「一致タイプ ＞ 正規表現に一致する」、「正規表現 ＞ `.*`」とします。

![expre](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/expre.png)

次に「その他の配信先 ＞ 受信者を追加」にチェックをして、受信者を追加設定します。

![image-20230205173101837](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205173101837.png)

「詳細」を選択し、「エンベロープ受信者 ＞ エンベロープ受信者を変更する ＞ 受信者を変更する」にメモしておいた `xxx@mxrecord.io` を追加します。

また、「この受信者に迷惑メールを送信しない」のチェックを外し、

「X-Gm-Spam ヘッダーとX-Gm-Phishy ヘッダーを追加」にチェックを入れます。

![image-20230205172957748](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205172957748.png)

最後に「オプションを表示する ＞ 影響を受けるアカウントの種類 ＞ ユーザー、グループ」にチェックを入れて設定を完了します。

![image-20230205173241663](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205173241663.png)

設定が完了すると、以下のような形で確認できます。

![image-20230205173353480](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205173353480.png)

# BCC で転送されていることを確認

BCC 設定が正常に作成され、状態が有効になっていれば、

https://horizon.area1security.com/home から Cloudflare Area 1 Email Security で BCC メッセージを処理する様子が確認できます。

![image-20230120160658522](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230120160658522.png)
Cloudflare Area 1 Email Security で M365 向け Retraction 設定を行う

# 目的

Cloudflare Area 1 Email Security を Journaling/BCC モードでセットアップする場合、メール脅威の隔離に API Retraction が設定できます。

Area 1 で判定した脅威分類別にアクション強度を設定でき、Microsoft Graph API と連携してメール操作を行います。

![image-20230205013530031](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205013530031.png)

# API Retraction 設定

- [Retraction guide for Microsoft Office 365 · Cloudflare Area 1 Email Security docs](https://developers.cloudflare.com/email-security/email-configuration/retract-settings/office365-retraction/)

具体的な設定ステップは以下の通りです。

認証を追加します。

![image-20230125011907113](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230125011907113.png)

権限を許可します。

![image-20230125012001741](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230125012001741.png)

コメントと対象ドメインを選択します。

![image-20230125012126532](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230125012126532.png)

以下のように正しく構成されたリストが確認できます。

![image-20230125012242953](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230125012242953.png)

Area 1 で判定した脅威分類別にアクション強度を設定できます。

![image-20230125012440257](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230125012440257.png)

# テスト

私がテストを行った限りでは、一度受信して Inbox に入ってから隔離処理が行われるまで数秒〜10秒以内程度といったところでした。

Area 1 で実施する脅威判定処理自体もその中で行われており、分析も高速に行われることがわかります。

>  ![threat_analytics_speed](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/threat_analytics_speed.png)

## ジャンクメール

迷惑メールフォルダ内で確認できる。

![image-20230205012648327](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205012648327.png)

## ソフト削除（ユーザーによりリカバリ可能）

ユーザのゴミ箱フォルダからさらに削除された状態として確認できる。

![image-20230205012030018](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205012030018.png)

![image-20230205012243237](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205012243237.png)

## ハード削除（管理者によりリカバリ可能）

ユーザーフォルダからはメールの確認ができず、管理者によって eDiscovery 機能を使って復元が可能です。

- [【Microsoft365参考書】Microsoft365グループの削除したアイテムを復元するには？ - 社畜の所業](https://it-bibouroku.hateblo.jp/entry/Microsoft365%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E5%BE%A9%E5%85%83)

![image-20230205021158461](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205021158461.png)

# 手動 Retraction

手動での Retraction 操作も可能です。

![image-20230205022813531](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230205022813531.png)
AIが何についてのポエムを作ってるのか当てるゲーム作った

これ。

https://whatword-5dyx7gwrfq-an.a.run.app/

# これは何？

AIが何についてのポエムを作ってるのか当てるゲームです。

ルールは以下の通り。

1. 秘密のキーワードが指定されます。これが何であるかはプレイヤーに知らされません。
1. そのキーワードをテーマにAIがポエムを作ります。
1. プレイヤーはそのキーワード(英語)が何かを当てます。
1. 誤回答するたびにキーワードが１文字ずつ開示されます。
1. 全部開示されるまでにキーワードを当てられたらクリアです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33890/426ee93f-fec8-1ac2-7aeb-096656e72491.png)

こんな画面です。

>赤い鼻と大きな嘘は鏡の中に映る
悲しい笑顔を見せる怪しい影
ハンドピースを掲げて遊ぶように
輝く瞳が消えた時には

これが何についてのポエムなのかを当てます。
なんだか悲しげですね。

ちなみに答えは『CLOWN』です。日本語でいうとピエロ。


# 技術解説

### AI部分

これはChatGPTで有名なOpenAIのAPIを叩いてるだけです。
2023年2月6日現在ではChatGPTのAPIは公開されていないため、ChatGPTの兄弟と言えるようなテキスト生成モデルを利用しています。

OpenAIのAPIでは現在4種類のモデルが公開されており、このゲームでは一番強いtext-davinci-003を利用しています。

|  モデル名  |  特徴  | 価格  |
| ---- | ---- |---- |
|  text-davinci-003  |  一番優秀。でも一番遅い。  | 1000トークン0.0200ドル  |
|  text-curie-001	  |  まぁまぁ優秀。遅い。  |1000トークン0.0020ドル  |
|  text-babbage-001		  | 単純なことならできる。速い。  |1000トークン0.0005ドル  |
|  text-ada-001		  |  凄く単純なことならできる。凄く速い。  |1000トークン0.0004ドル  |

英語なら1000トークンは約750単語くらい。日本語だともっとトークン消費するらしい。

3ヶ月のあいだは無料ですが、それを過ぎると課金しないとAPIは使えなくなります。ChatGPTが出始めのころにアカウント作った人はそろそろ無料期間終了ですね。自分はDALLE2が出始めの頃にアカウントを作ったので既に終わってました。

料金は月額の予算を決めてその範囲内で課金する形のため、自分の懐事情に合わせて遊べます。

#### 呪文

このゲームでは以下の呪文を使ってポエムを生成しています。

```
「${keyword}」に関する4行の詩を日本語で作ってください。
  ただし歌詞の中で「${keyword}」や${keyword}を意味する日本語を絶対に使わないでください。
```

キーワードがCROWNの場合は

>「CROWN」に関する4行の詩を日本語で作ってください。
  ただし歌詞の中で「CROWN」やCROWNを意味する日本語を絶対に使わないでください。

こんな文章になります。
UIの関係でポエムの長さを4行に制限し、ゲームを成立させるために文章の中に「CROWN」やCROWNを意味する「ポエム」を使わせないようにしています。

ただ残念なことに、この約束は結構な確率で破られます。
現時点のAI利用は「どれだけ不確実性を許せるか」がキモになってきそうです。

### アプリ部分

Next.jsを利用しています。

OpenAIのAPIへのアクセスにはAPIキーが必要で、それが漏れると悲惨なことになるので完全にフロントエンドだけで完結するのは難しいです。そのためリクエストを中継するプロキシ的なAPIを用意する必要があります。

そしてこのプロキシAPIも用途によっては結構神経を使います。今回の用途は「キーワードに応じたポエムを作る」だったので、プロキシAPIはポエムを作る機能だけを提供しています。ポエム生成にしか使えません。しかしより柔軟な用途に使う場合は、クライアントから生に近いクエリをプロキシが受け取る必要があります。そうなると誰かにプロキシをタダ乗りされ、OpenAIのAPI利用料で損をする可能性があります。

### ホスティング部分

これ、意外と困りました。

最初Vercelにホスティングしていたのですが、DavinciモデルだとOpenAIのAPIが返ってくるのに10秒前後かかります。Vercelの無料プランはバックエンドの処理で10秒以上かかるとタイムアウトしてしまうので、2回に1回くらいの確率でエラーになります。有料プランならこの制限は緩和されますが、月額20ドルは結構痛いです。

Netlifyもダメでした。同じく10秒制限があります。結局Google Cloud Runを利用することになりました。これならかなり長い時間かかってもタイム・アウトすることはありません。

Google Cloud Run立ち上げスピードどうだったかなぁ～とも思ったのですが、最近は[CPUブースト](https://cloud.google.com/blog/ja/products/serverless/announcing-startup-cpu-boost-for-cloud-run--cloud-functions)という機能もあり、コールドスタートの時間も気にならないレベルになっていました。


# おわりに

2023年2月時点での感想としては、やっぱり生成系AIをコントロールするのって難しいですね。
AIを利用したWebサービスを作る…と言ってもただAPIを叩いて結果を利用するだけではありますが、不確実性が許される用途を探し、不安定な結果をどう料理して安定した結果に整形するかが腕の見せどころになりそう。(それもいずれはAIの進化で解決するでしょうけど)


Webサービス：

https://whatword-5dyx7gwrfq-an.a.run.app/

リポジトリ：

https://github.com/kurehajime/whatword
React props渡し方

子供コンポーネント
```javascript

import React from "react";

const Button = ({ name, age }) => {
  return (
    <div>
      私は{age}歳です。名前は{name}です
    </div>
  );
};

export default Button;
```

親コンポーネント

```javascript
import Button from "./components/Button";
<Button name="JOHN" age={20} />
```
Elastic Network Interfaceが削除できない

# 課題
Elastic Network Interface(ENI) が削除できない

■削除できない表示
![2023-02-06_084220.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/70b42c83-984b-628d-4df4-8959e9ecfa88.jpeg)

# 解決方法
1. まず説明をきちんと読む・・・・
　(CloudFormation 利用時に見に覚えがないサービスが一緒に展開されていたりする)

■赤枠が説明書きがある箇所
![2023-02-06_08445202.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/e356ba65-255f-25b3-386c-10dfe921d0e7.jpeg)

2. 対象となるサービスを削除
　EFSの削除後、ENIも一緒に削除されていた

■何故か利用されてたEFS
![2023-02-06_085251.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/043386df-e481-feba-6c97-f8071b6a314d.jpeg)

■EFS削除成功
![2023-02-06_085421.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/2a0e85d8-8402-cf3d-8538-f41cf7938590.jpeg)

■ENIも削除されてた
![2023-02-06_085842.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/00f8d088-102f-09d1-f46d-90474d78bb43.jpeg)
【Flutter】SingleChildScrollViewの中で上下中央揃えする方法


`SingleChildScrollView` を使ったときに上下中央に揃えるためのメモ。

## SingleChildScrollViewの中で上下中央揃えにならない理由

通常、`SingleChildScrollView` を使う場合、上下中央に揃えることができません。

なぜなら、子Widgetは高さの最大値が決まらないので、どこまでも縦に伸ばせてしまうためです。

## 解決策

- LayoutBuilder
- ConstrainedBox
- AlwaysScrollableScrollPhysics

この3つを使うことで、`SingleChildScrollView` の中で上下中央揃えが実現できるみたいです。

```dart
LayoutBuilder(
  builder: (context, constraints) => SingleChildScrollView(
    physics: AlwaysScrollableScrollPhysics(),
    child: ConstrainedBox(
      constraints: BoxConstraints(minHeight: constraints.maxHeight),
      child: Center(child: Text('sample'),
    ),
  ),
)
```

これで `SingleChildScrollView` の中身を表示域と同じサイズにできるので、上下中央に表示できます。

## 参考

https://api.flutter.dev/flutter/widgets/SingleChildScrollView-class.html

https://qiita.com/kikuchy/items/1c95e1a3b2300ff44d21
ESP32: i2c のスキャン

こちらのページと同じことを行いました。
[Wire/examples/i2c_scanner/i2c_scanner.ino](https://github.com/stm32duino/Arduino_Core_STM32/blob/main/libraries/Wire/examples/i2c_scanner/i2c_scanner.ino)

Ubuntu 24.04 上の Arduino IDE 2.3.2 を使いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/226755f6-f2cd-021e-37d8-d2a056f93c0b.png)

## プログラム

```text:i2c_scanner.ino
// ---------------------------------------------------------------------
//	i2c_scanner.ino
//
//						Feb/06/2023
// ---------------------------------------------------------------------
#include <Wire.h>

#define	PROGRAM	"i2c_scanner.ino"
#define	VERSION	"2023-2-6 AM 08:37"

// ---------------------------------------------------------------------
void setup()
{
	Wire.begin();

	Serial.begin(115200);
	delay(3000);
	Serial.println(PROGRAM);
	Serial.println(VERSION);
	Serial.println();
}


// ---------------------------------------------------------------------
void loop()
{
	byte error, address;
	int nDevices;

	Serial.println("Scanning...");

	nDevices = 0;
	for(address = 1; address < 127; address++ ) 
	{
		// The i2c_scanner uses the return value of
		// the Write.endTransmisstion to see if
		// a device did acknowledge to the address.
		Wire.beginTransmission(address);
		error = Wire.endTransmission();

		if (error == 0)
		{
			Serial.print("I2C device found at address 0x");
			if (address<16) 
				Serial.print("0");
			Serial.print(address,HEX);
			Serial.println("	!");

			nDevices++;
		}
		else if (error==4) 
		{
			Serial.print("Unknown error at address 0x");
			if (address<16) 
				Serial.print("0");
			Serial.println(address,HEX);
		}		
	}
	if (nDevices == 0)
		Serial.println("No I2C devices found\n");
	else
		Serial.println("done\n");

	delay(5000);
}

// ---------------------------------------------------------------------
```

## 実行結果

```text
Scanning...
I2C device found at address 0x1E	!
done
```
秋月の0.96インチ白色OLEDで遊ぶ(Arduino UNO)P-12031


x 過去ログをみよ (SSD1306互換機のログ)

![o_cop524.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d2721ff0-fd29-b048-2930-4b8d45bdd018.jpeg)




目的
SSD1306その互換機の標準的なライブラリになっている
Adafruit SSD1306　+ Adafruit GFXのインストール で
文字列を表示して遊ぶ
I2Cアドレスと縦の画面幅でハマるて沼る人が多数の為
Adafruit純正だと
128x32 3C
128x64 3D

秋月のは、128x64の3C



SCL-SCL
SDA-SDA
3.3V-3.3V
GND-GND



レシピ


０．９６インチ　１２８×６４ドット有機ＥＬディスプレイ（ＯＬＥＤ）　白色
通販コード　P-12031
発売日　2017/11/27

[秋月のホームページより引用]

![o_cop373.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e279d4b1-3e78-91ca-6e69-e3de3971c34a.jpeg)


[配線は、各自確認の事]

![o_cop374.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/17a1cac5-7836-2bcb-73ab-d754aede795b.jpeg)




https://akizukidenshi.com/catalog/g/gP-12031/


https://qiita.com/caa45040/items/f7698f087967381f91af


https://qiita.com/caa45040/items/3c57c159be0fd0f7a718


https://qiita.com/caa45040/items/a92670598d49e6e547aa


https://qiita.com/caa45040/items/cca0092baad5476b3493


https://qiita.com/caa45040/items/574231109a31cb6c55eb


https://qiita.com/caa45040/items/444a05da951b44b5a471


実用的な時計や温度計のまとめ(参考)


![o_cop385.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/54d34992-dcae-f0cb-ef12-201ead121588.jpeg)



https://qiita.com/caa45040/items/bd2b8b9d757bde8c169b

プログラムのサンプル

![o_cop371.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/588d8304-0be4-9d27-4e6f-e0ece3d07286.jpeg)








手順


1.Adafruit SSD1306のインストール
2.Adafruit GFXのインストール
3.アドレスの確認
4.とりあえず表示してみる
5.ビットマップの表示





```c++



//i2c_ssd1306_UNO_uno_1


//ヘッダーファイル
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.clearDisplay();

  // テキストサイズを設定
  display.setTextSize(3);
  // テキスト色を設定
  display.setTextColor(WHITE);
  // テキストの開始位置を設定
  display.setCursor(0, 10);


  // 1行目に46を表示
  display.println("UNO");

  // 描画バッファの内容を画面に表示
  display.display();

  delay(1000); //1秒待つ

}//loop



```
React Queryのkey管理を簡単に良い感じに行う



## 概要

react-queryを使っていてqueryKeyの管理をどうしようかと思い、公式のドキュメントでも紹介されていた[lukemorales/query-key-factory](https://github.com/lukemorales/query-key-factory) を使用してみたら使い勝手が良かったので記事を書きました。

https://tanstack.com/query/v4/docs/react/community/lukemorales-query-key-factory

なぜReact Queryを使う上でqueryKeyの管理が重要になるか＋ライブラリを使用せずqueryKeyを上手に管理する方法は下記の記事たちがとても参考になりました。

https://tkdodo.eu/blog/effective-react-query-keys

https://zenn.dev/brachio_takumi/articles/d6ddb655c4c30f908c67

## query-key-factoryの概要

> Focus on writing and invalidating queries without the hassle of remembering how you've set up a key for a specific query! This lib will take care of the rest.
> 

プロジェクトのREADMEの一番上に書かれている内容ですが、簡単な設定で型安全で自動保管付きのqueryKey管理を行うライブラリです。

## プロジェクト構成

実際のプロジェクトでは[bulletproof-react](https://github.com/alan2207/bulletproof-react)の構成を参考にsrc配下で機能ベースでディレクトリ分けを行なっており、下記のように各機能ベースでqueryKeyの管理をしています。

プロジェクト内でqueryKeyを設定するのは各`queries.ts`内のみで行い、useQueryでのqueryKeyの指定やcacheのコントロール等queryKeyが使用される全ての箇所でここで定義したqueryKeyのみを使用します。


```jsx
src/
  - features/
     - todos/
       - queries.ts
     - comments/
       - queries.ts
```

## 機能ごとのQuery管理

各queriesファイル内で、下記のようにライブラリから提供されている`createQueryKeys` を使用して、設定したいkeyごとに`queryKey`と`queryFn`(ここで設定しなくても良い)を記載します。

```jsx
import { createQueryKeys, inferQueryKeys } from "@lukemorales/query-key-factory"
import { api } from 'features/todos/api'

export const todoQueries = createQueryKeys('todos', {
  detail: (id: number) => ({
    queryKey: [id],
    queryFn: () => api.getTodoDetail(id)
  }),

  list: (filters: TodoFilters) => ({
    queryKey: [{ filters }],
    queryFn: () => api.getTodos({ filters }),
  }),
});

export type TodoQueries = inferQueryKeys<typeof todoQueries>
```

あとは上記で定義したqueryKeyを必要な箇所で使用するだけです。

```jsx
import { useQuery } from '@tanstack/react-query'
import { todoQueries } from 'features/todos/queries'

export const useTodoList= (filters: TodoFilters) => {
  const { data, isLoading, error } = useQuery({
     ...todoQueries.all(filters),
    }
  })
  return { data, isLoading, error }
}
```

## 感想
文字列だけでqueryKeyを管理するのと比べると、まとめて管理ができ、型安全・自動補完が効いてくれて開発がやりやすくなった気がしてます。
SELECT文の色々：SQLでデータ取得してみる！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はDBのデータを操るSQLでデータを取得する方法について更に詳しく調べてみましょう！
![インスタスライド_202301222.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/6582d61d-64b7-83fe-4144-5f088a84f823.gif)


# こんなテーブルがあった時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/55b19ca7-a2ce-fe96-e8f4-dd1807b4d500.png)
# SELECTとは

SELECTするSQL文
⇒　SELECT　社員コード、社員名　FROM　社員マスタ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/5c8842c5-b791-8161-de0c-20e1e3595fa1.png)

# whereとは
whereするSQL文
⇒　SELECT　* FROM　社員マスタ
      WHERE 社員コード = “00002”
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/8f2ab5f0-b013-9b4b-d57b-7aeb0e1ad961.png)

# Order byとは
並び替えするSQL文
⇒　SELECT　＊　FROM　社員マスタ
　　 order by 社員コード desc

descは降順、 デフォルトは昇順 asc
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/76aff52b-b588-b3c4-c65d-dfdc44b925f2.png)

# max関数とは
MAX値を取得する
⇒　SELECT　max(社員コード）　FROM　社員マスタ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/967d8254-128c-19ef-dc3b-0504e920ccb2.png)

# count関数とは
件数を取得する
⇒　SELECT　count(社員コード）　FROM　社員マスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/5e5eb961-c869-79fa-d2ad-a95437bebc6a.png)

# まとめ
ーSQL言語でデータを操作できる

ーselectは選択

ーwhereは抽出

ーorder by　並び替え

ーmax,countは関数

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
2023/2/6主にITとかセキュリティの記事

患者電子カルテを不正閲覧＆拡散でエヌジェーシーと契約解除、近畿大学病院(2/3)
https://cybersecurity-jp.com/news/78094

データ会社ＩＯＮ攻撃のハッカー集団、身代金受け取り主張(2/4)
https://jp.reuters.com/article/fintech-cyber-ion-idJPKBN2UE044

「微笑」する中国・習近平…裏で見据える「台湾統一」へ向けた「ハイブリッド戦争」の好機(2/4)
https://news.yahoo.co.jp/articles/28385ea830a5e917747826832c7028c9da29fef7?source=rss

ハッカー、カナダ病院攻撃を謝罪　捜査の追及かわす狙いか(2/4)
https://www.sanyonews.jp/article/1359368/

2段階認証でマイクロソフトアカウントを保護する方法(2/4)
https://ascii.jp/elem/000/004/123/4123461/?rss

Pornhubにアクセスするのに身分証が必要な地域がある(2/4)
https://www.gizmodo.jp/2023/02/pornhub-id-18-redtube-youporn-adult-content-1849944461.html

2023年、ビットコイン／暗号通貨市場の行方。モビアス氏ら識者の予測は？(2/4)
https://news.yahoo.co.jp/articles/2187abcf951c4d9f6cc880021695fca090a7d263?source=rss

米国でTikTok禁止の流れが加速、CEOは3月に米下院公聴会で証言へ(2/4)
https://news.yahoo.co.jp/articles/a40c0899cb5ec3367da14fa87f3f132bc66f0770?source=rss

フランスからの訴え:パーツのペアリングは計画的陳腐化を助長する(2/4)
https://jp.ifixit.com/News/71390/%E3%83%95%E3%83%A9%E3%83%B3%E3%82%B9%E3%81%8B%E3%82%89%E3%81%AE%E8%A8%B4%E3%81%88%E3%83%91%E3%83%BC%E3%83%84%E3%81%AE%E3%83%9A%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AF%E8%A8%88%E7%94%BB%E7%9A%84

ゲーム業界を標的にする「Ice Breaker」、顧客を装いチャットを介して攻撃(2/4)
https://news.mynavi.jp/techplus/article/20230204-2582468/

【取材】NFT・ブロックチェーン活用の教育採用サービス「ONGAESHI」発表＝コクヨ、SMTB、慶應FinTEKセンター、TUSIM、IGSら運営(2/3)
https://www.neweconomy.jp/posts/293585

Chromebookの管理を解除するエクスプロイト「SH1MMER」に注意(2/4)
https://news.mynavi.jp/techplus/article/20230204-2582472/

ConsenSys が世界中のユーザーが利用できる教育プラットフォームを立ち上げ(2/3)
https://nextmoney.jp/?p=56482