OmniAICreator/Qiita-1.07M huggingface dataset:
【知らないと人生大損!!】生産性爆上がり 検索エンジンにおけるショートカットの設定

# はじめに
YouTubeやGoogle Driveなど、そのサイト内に検索バーを有しているものがあります。

当該サイトで、あるワードについて調べるとき、まずそれぞれのサイトに移って、検索をかけて調べたいものを調べる、、、という手順を取りますよね。

<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/4f22e029-67de-8438-0617-7d68ae55fe6a.png"> 

この手間を省けるなら省いてみたい（つまり、検索エンジンから直接YouTubeやGoogle Driveの検索をかけたい）と思いませんか？

<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/4908636a-5a46-33ff-ae2e-e0c9fbfdbf8f.png"> 

1回あたりたかが5秒の時間短縮ですが、塵も積もれば山となるです。

仮に1日10回ほど使用、つまり1分程度短縮できるとしましょう。
1分×365日=365分(≒ 6時間) を年間で短縮できます。

アホらしく感じた人はどうぞブラウザバックしてください。

**< 完成形 >**
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/0fafdae4-e86c-7cb4-f61b-998e7bca27d0.gif"> 
お使いの検索エンジンから直接YouTube内の「yoasobi」を検索しています。

では早速設定手順を見ていきましょう！
（言われたままにマネすればできるように説明したつもりです。）

# 設定手順
### 1. お使いのブラウザの設定を開きます。
<img width=100% height=30px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/c87748d5-b901-68e0-9cb9-35c90b4c7567.png"> 

### 2. 「検索エンジン」をクリック
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/6137f521-17f7-d38f-1a43-bb77b9915063.png"> 

### 3. 「サイト内検索」にある「追加」ボタンをクリック
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/9441b4e4-2cbd-118f-a26d-aa40e6526867.png"> 

### 4. 検索エンジンの編集
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/9d679dc4-1cf6-89ce-a1a3-443f9eeb9147.png"> 
<br><br>
① 自分がわかりやすい任意の名前をつけましょう。（サイト名などがおすすめです）
<br><br>
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/e0193028-1db3-1b25-3998-37f81b820340.png"> 
<br><br>
② 検索エンジンに打ち込むための任意のショートカットワードを打ち込みましょう。（サイト名の最初の1-3文字がおすすめです。例えば、「YouTube」なら「you」）
<br><br>
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/96c2e0d7-1c28-eee8-be7d-296c2d979e58.png"> 


<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/8397ca7d-c281-66bd-81d3-9ed794fc3bf3.png"> 
<br><br>
③ 直接検索をかけたいサイトのURLを打ち込みます。

※ 直接検索をかけたいサイトで一度何か検索してみましょう。その際、検索ワードの手前の=までのURLをコピー（下記写真でいう黄緑部分）

<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/3babc079-f7c6-20cc-6170-2c1585e03383.png"> 


```:コピーするURL（YouTube）
https://www.youtube.com/results?search_query=%s
```

### ※ Google Driveの場合

<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/50f8e6a3-2c67-fe10-2af9-cf225ca27bc0.png"> 

```:コピーするURL（Google Drive）
https://drive.google.com/drive/u/0/search?q=%s
```

### ※ Amazonの場合

<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/7f9b26bb-b286-1c88-fe90-c18cc8bc3aa4.png"> 

```:コピーするURL（Amazon）
https://www.amazon.co.jp/s?k=%s
```

# 最後に
1回あたりほんの数秒ですが、こういった小さな時間短縮を意識するかしないかで、人生における自由な時間も変わってくるはずです。（そんな細かいことを気にしている人生はしょうもないと言われたらそれまでですが。）
少なくとも私は、これを取り入れることで他の人よりラクしていますし、仕事も人より早いことが多いです。
ぜひまだ取り入れていない人は一度取り入れてみてください！

<img width=250px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/5b4b45a3-8278-6a83-92c8-27e8f052294e.png">
Godot4で3D風２D縦スクロールシューティングゲームを作る　2回目 背景を設定する

 Godot4.1.3でシューティングゲームを作っていきます。

# スクロールする宇宙の背景を設定
　本記事で、背景に宇宙を設定して、縦にスクロールさせます。

# github
　本記事で実装したものをgithubで公開しています。

https://github.com/footinglow/woden/tree/002_set_space_as_background_and_scroll_vertically

# 背景について
　3D空間の背景なので、Playerが上下左右360°どの方向を向いても背景が存在するようにしました。イメージとしては、Playerを中心とした大きな球があって、その球の内側に宇宙の画像を貼り付けるような感じです。
　球の内側は平面ではないので、球の内側に貼りつけたときにきちんと見えるように、パノラマ画像を使用します。
　NASAの宇宙画像を使うと格好良かったのですが、教育以外の目的には使用できなさそうなので、Blenderで作成しました（思ったより時間がかかりました）。シェーダーで星空と星雲を作って、レンダリングする時にレンダーエンジンをCyclesにし、カメラのレンズのタイプを「パノラマ状」、パノラマタイプを「正距円筒図」にして出力したものを使っています。出力画像サイズがディフォルトの1024pixelの場合、スクロールしたときのゆがみが大きかったため4096pixelに変更しました。もっと大きくするとゆがみが目立たなくなると思いますが、ファイルサイズが大きくなるのと、レンダリング時間がかかるため、適切なサイズを考える必要があります。
  パノラマ画像の上の方（もしくは下の方）を見ると、左右に伸びていますが、球の内側に貼ると正しく見えるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/81afb5b1-f64d-c962-e5dd-699061e5c588.png)

# 背景に宇宙を設定する
　WorldEnvironmentを使って、背景を設定します。
 「WorldEnvironment」ノードを追加します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/1f1b7606-9510-db0d-2c3e-86a6220baef3.png)
　WorldEnvironmentのインスペクターを開きます。新規Environmentを作成して、Background/ModeでSkyを選択すると、「Sky」項目が表示されます。
  新規Skyを作成し、新規PanoramaSkyMaterialを作成します。Panoramaは「クイックロード」を選択して、あらかじめ用意した宇宙の画像を選択します。
![スクリーンショット (849).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/6b76ac66-2858-f891-1db8-4567d32f07a9.png)
　クイックロードから背景のspace.pngを設定するとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/2adb6adf-6045-94e7-cb04-eca93bfbcb8c.png)

 # 背景をスクロールする
　WorldEnvironmentにスクリプトをアタッチして、下記のようなGDScriptにします。
　1秒に5°背景の宇宙を回転します。

```GDScript
extends WorldEnvironment

@export var m_d_speed_degps = -5.0		# 回転速度 [degree/sec]

func _process(delta):
	get_environment().sky_rotation.x += deg_to_rad(m_d_speed_degps * delta)
```
# 微調整 
　背景の宇宙がスクロールするようになりましたが、上下にゆがみが目立つため、Custom FOVを45°に設定して目立たないようにしました。
　あと、原因がわかっていませんが、背景の宇宙に薄く青い線が入るため、見えにくいよう位置を適当に探した結果、Sky/Rotationのzに100°を設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/9d86b723-f39b-5b0b-2a4f-339cbf488594.png)

# パノラマ画像の上の方をゆがみを3D空間で確認する
　パノラマ画像の上の方のゆがみの部分が3D空間でどのように見える確認するため、space.pngの画像の上の方に赤い四角を書いて、Godotにインポートしてみました。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/ed6478bf-d2e4-facf-027f-232cf5b7deb3.png)
　Godotの3Dビューで、上の方（Y軸プラス側）に視点を変えると、赤い線が見えました。球の内側に貼りつけるとき横方向に圧縮されるように貼り付けられるので、横方向に延ばされた星は正しく点の星に見えるようになり、赤い四角はつぶれて線になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/5d2acedf-91f0-706b-3e34-6da5f27b513a.png)

# まとめ
　背景を設定すると雰囲気が出て、だいぶ良くなりました。
　しかし上下のゆがみが気になるので、別の方法にすることを検討しています。

 　以上です。
【Algorithm】頻度カウンター(Frequency Counter)パターン

## はじめに
この記事は、株式会社スピードリンクジャパン Advent Calendar 2023 の18日目の記事です。

https://qiita.com/advent-calendar/2023/slj

## 頻度カウンター(Frequency Counter)とは
プログラミングにおける頻度カウンターパターンは、データ内の要素の頻度や回数を計算するために使用される技術です。このパターンは、オブジェクトやマップを使用して、特定の要素がデータ構造（例：配列、文字列）内で何回出現するかをカウントします。特に配列や文字列のような線形データ構造で効果的です。

## 使用目的
頻度カウンターパターンは、複雑な問題を解決する際に時間の複雑さを改善するのに非常に役立ちます。特にデータが多いときに入れ子になったループの使用を避けることで、時間の複雑さをO(N^2)からO(N)に減らして性能を大幅に高めることができます。

### 例：配列要素の二乗を探し
**問題定義**
1つのメソッドを作ります。2つの配列が与えられた場合、1つ目の配列のすべての要素の二乗が2つ目の配列に存在するかどうかを確認する問題です。2つの配列の長さが同じであり、要素の頻度も同じでなければなりません。

```javascript
same([0, 0, 0], [0, 0, 0]); // true
same([1, 2, 3], [1, 4, 9]); // true
same([1, 2, 3], [1, 4, 8]); // false
same([10], [100]); // true
same([1, 2], [1]) // false
```

**入れ子になったループ**
1つ目の配列の各要素を順番に探索して、2つ目の配列でその要素の二乗を探す方法です。この方法は入れ子になったループを使用するため、時間の複雑さがO(N^2)です。

```javascript
function same(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }
  for (let i = 0; i < arr1.length; i++) {
    let correctIndex = arr2.indexOf(arr1[i] ** 2);
    if (correctIndex === -1) {
      return false;
    }
    arr2.splice(correctIndex, 1);
  }
  return true;
}
```

**頻度カウンター**
頻度カウンターを使用して、各配列の要素の頻度を計算し、それを比較する方法です。この方法では、時間の複雑さをO(N)に減らすことができます。

```javascript
function same(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }

  let frequencyCounter1 = {};

  for (let val of arr1) {
    frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1;
  }

  for (let val of arr2) {
    let squareRoot = Math.sqrt(val);
    if (!frequencyCounter1[squareRoot]) {
      return false;
    }
    frequencyCounter1[squareRoot] -= 1;
  }

  return true;
}
```

## 結論
頻度カウンターパターンは、プログラミングにおいて非常に役立つツールです。特に配列や文字列を扱う際、入れ子になったループを避け、時間の複雑さを減らすのに大きな助けとなります。このパターンを通じて、コードの効率性を高めることができます。

## 参考
https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/
属人化脱却の事例紹介 「脱・属・人  」

# はじめに
この記事は[トラストバンクAdvent Calender 2023](https://qiita.com/advent-calendar/2023/trustbank)の記事です。

パブリテック事業部 SREの大場です。
最近、るろうに剣心のリメイクを放映していますね。懐かしくてついつい見てしまいます。

……。

ここまででタイトルが何にかかっているかわかりますよね。
当然、斎藤一の「悪・即・斬」です。

……。

はい、それはさておき、、

SREとしての主な作業は、サービスの運用・保守、インフラ関連の改善、SLO導入などになりますが、現在、「リリース作業の属人化脱却」という大きな課題にも立ち向かっています。

まだ道半ばですが、ここまでの取り組みを紹介します。

# 背景
新規事業部として立ち上がって4年目になりました。当初は人も少なく、スピードを重視していたこともあるため、ある程度属人化してしまうことは仕方のないことだったように思います。

しかし、言うまでもなく**属人化はリスク**があります。
その人がいなくなると業務が回らなくなるというのは当然ですが、チームが育たない、品質向上に限界があるというようなことも挙げられます。

徐々に人も増えチームで作業できる体制になってきたこと、長期化する障害が立て続けに発生したことをきっかけに、ちゃんとチームでリリースできるようにしようと、SREで担当することになりました。


# 状況
今回対象となるサービスは、OEMとして提供いただいたものをカスタマイズしてリリースしています。リリース当初から有識者に全面的にバックアップしていただいていましたが、そのリリース作業がブラックボックス化していました。

特にカスタマイズ作業は非常に難易度の高い作業で、それらを一手にお願いしている状況でした…。また、通常の開発とは違うOEMであるということの難しさというのもありました。

# やったこと
SREチームで新規のリリースをするまでに、大きく３ステップで進めることにしました。

1. **現状把握**
作業内容を理解し、何をしなければいけないかを把握する。
2. **作業トレース**
過去のバージョン対してSREチームで作業をトレースし正しく作業できるか確認する。
3. **新しいバージョンのリリース**
SREチームで新しいバージョンをリリースする。


### 現状把握
兎にも角にもまずは作業内容を把握する必要があります。
作業ログや過去のアウトプットはしっかり残していただいてましたので、それを読み解いたり、ヒアリングを通じて全体像を理解しました。slackには専用のチャンネルを作成し情報が一箇所に集まるようにしたり、特に初めは必要に応じて頻繁にMTGも開催しました。

有識者がチーム側に引き継ぐという意識ではなく、SREチームが主体となって有識者から引き継ぐ意識があったのが非常に良かったと思います。

### トレース作業
ある態度作業内容が見えたところでトレース作業入りますが、作業を複数人で実施するということを考えた場合に大きな課題がありました。

* カスタマイズ作業が想定以上に複雑
* カスタマイズ箇所が多くレビューが大変

品質にも大きな影響を与えますので、Google　Driveで管理していたリリース資材をGitHubに移行することにしました。このタイミングで既存の作業方法を変更するリスクもありますが、今回はメリットの方が大きいと判断しました。

OEMならではの難しさがここにもあり、branch戦略は十分に検討しました。
OEM側のリリースも定期的に実施されて都度提供いただきますが、こちらで実施しているカスタマイズは含まれません。そのため毎回同じようなカスタマイズ＋αをしなければいけないのです。

結果、こんなフローになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958831/891e3439-f21b-1e95-b7f0-5c6ed4fc53c2.png)

あまり見慣れた形ではないですよね…。

ここまで整理した後、実際にこのフローに基づき過去のバージョンに対して作業をしました。作業を通して、作業標準化のために手順書を作成したり、作業のノウハウを多く貯めることができました。正解があるので、自分たちのやろうとしていることが本当に正しいか確認できるというのはとても大きいです。

いきなり新しいバージョンに対して作業すると正解が分からず暗中模索になってしまったと思いますので、時間はかかりますが必要な工程です。

また、トレース作業からzoomの常設ルームを作成していつでもみんなで相談できる環境にしました。これは非常に効果的で、特に新しい作業を開始する時なんかは非常に有効だと感じます。チーム内の評判も良いので今後も続けていく予定です。

### 新しいバージョンのリリース
現在作業中ですが、大きな混乱もなく進められています。


# 最後に
まずは、こんな負担のある作業を長期に渡り属人化させてしまい申し訳ないと反省しました…。当然と言えば当然なのですが、難しく、複雑な作業だからこそ属人化してしまいやすいんですよね。こういう作業こそ、チームや仕組みで取り組んでいくことが重要ですね。

効果は今後計測していきますが、リリース作業の品質向上、安定化への貢献も期待できそうです。作業の標準化ができていること、複数人で基準に則ってレビューできていることで確実に品質は上がっているように思いますし、実際に今まで考慮不足だった箇所が発見できていたりと効果も出てきています。

今後も属人化はリスクであるということを認識し、属人化しない取り組みをしていきたいと思います。

トラストバンクでは一緒に働く仲間を募集しています。
ご興味を持たれた方はぜひ一度ご連絡ください。
属人化はさせません！

https://sg.wantedly.com/companies/trustbank/projects
Can't Start with FastAPI, Docker, and Uvicorn...

## Symptom

It seems to be failing due to something related to DNS... This issue occurs in a container environment but not in a local environment.

```
$ docker container run fastapi
...
ERROR:    [Errno -2] Name or service not known
...
$ 
```

## Solution

Specify `--host 0.0.0.0`, as the default for uvicorn is `127.0.0.1`

```docker
CMD [ "uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000" ]
```

* [Deployment - uvicorn](https://www.uvicorn.org/deployment/)

## Additional Information

In my case, I was using environment variables, so I needed to modify it further like this:

```docker
CMD ["sh", "-c", "uvicorn app:app --host ${HOST} --port 8000"]
```

* [How can I use a variable inside a Dockerfile CMD? - Stackoverflow](https://stackoverflow.com/questions/40454470/how-can-i-use-a-variable-inside-a-dockerfile-cmd)
DBのテーブルの正規化について改めて紹介する


[CA Tech Lounge](https://www.cyberagent.co.jp/careers/special/students/tech_lounge/)の2期生でバックエンドエンジニアとして活動している@tf63です．本記事ではデータベースのテーブルの正規化について端的に紹介します．

この記事は [CA Tech Lounge Advent Calendar 2023](https://qiita.com/advent-calendar/2023/catechlounge) の19日目の記事になります．

## 正規化
テーブルの**正規化**とは，テーブルを冗長性が排除された形（**正規形**）に変換する操作です．正規化が必要とされる理由は，データに冗長性が含まれるとデータ登録時や更新時に不整合が生じることがあるためです．

例として，学部IDと学生IDを主キーに持つテーブルを考えてみましょう．このテーブルには冗長性が含まれます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/2d9092b1-2c76-f362-98d1-2acd8b79973a.png)


サークル名はサークルIDによって一意に決定可能なため，サークル名の列は情報としては不要です．このような冗長性が含まれるとサークル名を更新したい時に不都合が生じます．

例えば「ゆるゆるサッカー部」の運営方針が変わり「ガチガチサッカー部」になったとしましょう．サークル名を更新するには「ゆるゆるサッカー部」に所属する学生を全て探し出す必要がありますが，全ての情報が正しく更新される保証はあるでしょうか？

テーブルを分割し，次のように冗長性を排除すれば不都合なくサークル名を更新できます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/5160586c-5a4c-d8f4-e5fc-b194c2ddb0fe.png)

このように，正規化はデータの冗長性を排除し，今後の操作の一貫性と効率性を保証するために行われます．

:::note warn
**正規化の欠点**
冗長性を排除することには勿論欠点もあります．先の例において，主キーから学生の氏名とサークル名を取得する場合を考えましょう．正規化をした場合にはサークル名を取得するために分割したテーブルを結合する必要があります．テーブルの結合は比較的重い操作であるため，正規化によってパフォーマンスは低下してしまいます．
:::

### 関数従属性
先の例では，「ある列が別の列によって一意に決定可能であること」に焦点を当てて冗長性を排除しました．この性質は**関数従属性**と呼ばれます．関数従属性は正規化を理解するために重要な性質であり，以降では関数従属性の考え方に着目して正規形について紹介します．

## 正規形
**正規形**にはレベルがあり，第一正規形 ~ 第五正規形がよく知られています．このうち，第一正規形 ~ 第三正規形への正規化は可逆であり情報が失われません（**無損失分解**）．本記事では第一正規形 ~ 第三正規形について紹介します．

### 第一正規形
第一正規形では全ての列が主キーに関数従属となるようにします．

第一正規形でないテーブルは次のようなテーブルです．このテーブルでは，複数のサークルに所属している学生をサークルIDの列で配列として表現しています．しかし，これでは主キーを決めても学生のサークルIDが一意に定まらず，サークルIDを登録･更新するときに不効率になります．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/81dd8ac9-f022-c60a-dd36-c52352b741b4.png)

次のようにテーブルを分割することで第一正規形にできます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/6b741195-7971-2f56-e68d-b0ec1b484031.png)



### 第二正規形
第二正規形では全ての列が**主キーを構成する全ての列**に関数従属となるようにします．この状態を**完全関数従属**と呼びます．

第二正規形でないテーブルは次のようなテーブルです．このテーブルは学部IDと学生IDを主キーとしていますが，氏名の列は列{学部ID, 学生ID}にのみ関数従属であるのに対し，学部名の列は列{学部ID}に関数従属となっています．これは**部分関数従属**と呼ばれます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/4dea1174-6561-e6d0-bf29-c7fca75a300b.png)

部分関数従属であるとデータ登録･更新に不都合があります．例えば，新しく学部IDと学部名を登録したいとしましょう．このとき，学生IDと氏名は不要なはずですが，学生IDは主キーの一部でありnullには出来ません．データ更新も先の例と同様に不都合があります．

次のようにテーブルを分割することで第二正規形にできます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/4c9c39b2-4527-589d-fe00-6cb2813d284f.png)


### 第三正規形
第三正規形では**推移的関数従属**を排除します．推移的関数従属とは

主キー → 非主キー → 非主キー

のような関数従属が含まれることです．

第三正規形でないテーブルの例は最初に示したテーブルです．このテーブルは {学部ID, 学生ID} → サークルID → サークル名の列が推移的関数従属です．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/2d9092b1-2c76-f362-98d1-2acd8b79973a.png)

推移的関数従属であると先の例と同様にデータ登録･更新に不都合があります．

次のようにテーブルを分割することで第三正規形にできます．

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291419/5160586c-5a4c-d8f4-e5fc-b194c2ddb0fe.png)

---

以上です．

## 参考

https://www.shoeisha.co.jp/book/detail/9784798124704

https://www.shoeisha.co.jp/book/detail/9784798157825
ハッシュ化と暗号化について

## なぜ知りたいと思ったか？
ハッシュ化も暗号化も悪質ユーザーに読み取られない技術だけど、どこが違うのか知りたかった


## ハッシュ化について
入力した文字や数値が、Webサーバにあるハッシュ関数でハッシュ値に変換され、データベースに保存する
不可逆(元に戻せない)の性質があるので、攻撃者にハッシュ値を参照されても割り出すのが難しい

phpMyAdminのパスワードでは、480ビット分ハッシュ化されている
→複数ユーザーに同パスワードを指定したが、ハッシュ値が違うのはユーザー毎に違う固定値を組み合わせたソルトを使っていると思う
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/bb29c9df-4fb6-b048-2699-8127e1ed7c74.png)

**①ログイン時の検証方法について**
ユーザーが入力したパスワードをハッシュ値に変換して、一致した場合にログインできる
※1文字違うだけハッシュ値が大きく変わるので、正確に入力する必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/ef76e6ae-1b94-1909-1d78-bb7f1216aea6.png)

**②使用用途について**
・電子メール本文の改ざんを判断するため、メール本文とハッシュ値変換データを送信し、受信時にハッシュ値の比較を行う
→悪質ユーザーが送信者側になりすますことが難しく、送信者本人が送ったメールだと信頼できる

**③期待できる効果**
ハッシュ値に変換されても元に戻すことが出来ず(不可逆な性質)、悪質ユーザーがハッシュ値から元データを特定するのが難しくなる

**④問題点**
パスワードは「数学的に不可逆」と言われてきたけど、計算技術の飛躍で覆りつつある。
指紋などを使った生体認証や、1度しか使えないワンタイムパスワードなどを組み合わせた多要素認証が必要になってくる


## パスワードの暗号化について

入力した文字や数値を暗号化アルゴリズムで別のデータに変換し、受信側で元のデータに複合できる
→カード情報入力でよく使われる
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/503cb973-ae62-b042-70e7-f594f4213171.png)

**①暗号化したデータをどうやって複合するか？**
送信側が暗号鍵を使ってデータを暗号化した後、受信側で複合鍵を使ってデータを複合する(元データに変換する)

**②使用用途について**
・ECサイトに入力した個人情報を、受信側で確認できる

**③期待できる効果**
入力データを暗号鍵で別のデータに変換しているので、悪質ユーザーが参照しても元のデータの解析が難しく、安心してデータを受信側に送ることが出来る

**④問題点**
悪質ユーザーが複合鍵を取得してしまうと、元のデータに変換できてしまい情報漏洩に繋がるので、複合鍵をどう受け渡すかを考慮する必要がある


## ハッシュ化と暗号化は何が違うか？
別のデータに変換して、元のデータに戻す必要があるか
<ハッシュ化の場合>
DBでパスワード管理する場合、元のデータに戻すと悪質ユーザーに見られる危険性があるので、変換したままにする
<暗号化の場合>
カード番号を送信する場合、元のデータに戻さないと受信側で確認が取れないので、鍵を使って元のデータに戻す必要がある


ハッシュ化と暗号化の違いについて
https://eset-info.canon-its.jp/malware_info/special/detail/211013.html
manabaのお知らせ欄を広くするCSS


立命館大学の使用しているmanaba+Rにて動作確認しました。
自分の場合はstylebotというChrome拡張で適用していますがURL指定を行う設定画面がわかりにくかったです。デフォルトでドメインごと指定されるので他のページが崩れないよう設定が必要です。
深く考えず書いたCSSなのでもっといいものがあれば提案してください。不要な記述もありそうです。

使用に際して生じたいかなる損害についても責任を負いません

```style.css
.pagebody .contentbody-s{
  width: auto;
}

.pagebody .contentbody-s-700{
  width: auto;
}

.home .contentbody-s-700 .my-infolist-centernews, .home .contentbody-s-700 .my-infolist.my-infolist-kinkyu{
  width: auto;
}

div.my-infolist-header {
  background-image: unset;
}

div.pagebody {
  width: auto;
}

#container{
  width: auto;
  padding:0 10% 0 10%;
}

.my-infolist-body td:nth-child(2){
  width: 70%;
}
.contentbody-s .my-infolist-centernews .my-infolist-body div.news-title{
  width: 100%;
}

#header{
  width: auto;
}

.my-infolist-body table, .board-boxV2  table{
  table-layout: fixed;
}
```
【共有兼自分用】ソフトウェア開発およびプロジェクト管理に関するメモ

# はじめに

最近は、ソフトウェア開発・プロジェクト管理に関して、
自身が持たなければいけない責任もより大きくなってきた部分があるので、
「任せっぱなしではなく、そろそろちゃんと勉強しなくちゃなー」と感じている次第でございます。
個人的なメモ感覚で、”これは役に立ったな”と言う知見・資料をJOTTING感覚で書き溜めていこうと思い、今回をきっかけに随時更新していこうと考えています。

# 初心者や非ITエンジニア向けのスクラム概要

ざっくりと概要見返したい時におすすめのスライドです。

https://slide.meguro.ryuzee.com/slides/76

# アジャイルやスクラムに関するQ&A集

カンペ的にも使えて便利です。

https://www.attractor.co.jp/agile-faq/

# タスク管理

## タスクを分割しないデメリット

作業内容の認識が合わせ辛い

大きいタスクの中で問題が発生すると、サイズが大きすぎて、全体としてどの程度影響が出るかわからない

作業が予定より遅延しているかどうかが判断し辛い

## タスクを分割するメリット

作業内容の認識が合わせやすい

問題が発生しても、問題が局所化しやすい

タスクごとに遅延が検知でき、他タスクも同様に遅延した最悪の場合の見積もりがしやすい

## チケットの書き方

最低限、下記の項目があると良さそう。

・取り組みの背景（本当に取り組むべきなのかの問いかけ・全社視点を忘れない）
・具体的なアクション（工数の可視化とチームへの共有・思わぬ落とし穴/死角がないように補完し合う）
　　・やること
　　・所要時間
・何を達成したらゴールか（ゴールの定義・完成像の齟齬/ズレをなくす）
・期限（不明であれば依頼元に確認）
・その他共有すべき資料の添付
　　・ソース
　　・参考資料
　　・議事録　
　　・etc

# 本記事を含めたドキュメント更新の方針

基本的には、下記の３項目は必ず記載すると良いと考えています。

・決定事項
・決定の背景
・いつ決定されたか（タイムスタンプ）

参考：https://kakehashi-dev.hatenablog.com/entry/2023/10/16/100000

# おわりに

まだまだスクラムペーペーなので、スクラムマスターに近づけるよう努力したいと思います。

本記事はアドベントカレンダー用のメモです。
下記にて、随時更新していく予定です。
http://sokka-tech.com/2023/12/16/%e3%82%bd%e3%83%95%e3%83%88%e3%82%a6%e3%82%a7%e3%82%a2%e9%96%8b%e7%99%ba%e3%81%8a%e3%82%88%e3%81%b3%e3%83%97%e3%83%ad%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e7%ae%a1%e7%90%86%e3%81%ab%e9%96%a2%e3%81%99/
ESP32S3 XiaoでTensorflow LiteのPerson Detectionを動かしてみた。

# ESP32S3 Xiao Sense
![esp32s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615141/a9b540e9-72b3-80d8-5204-32f1fbf408ef.png)

これがターゲットになるSeeed Studio XIAO ESP32S3 Senseになります。プロセッサーは240MHzの２Coreで、Wi-FiとBLEをサポートしていて、バッテリーチャージもサポートしています。また、メモリーは8MBのPSRAM、8MBのオンボードフラッシュ、SDカードスロットで、カメラはoV2640 カメラセンサー 1600*1200が付属しています。開発環境はArduino IDEになります。

# 開発環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615141/33392084-66be-78b8-c765-f934cdbe74bf.png)
<br>
Tensorflow Liteを動かすためには、開発環境であるArduino IDEを開いてESP32S3 XiaoにTensorflow Liteをインストールします。Arduino IDEを開いたら、ライブラリーマネージャーを開いて、EloquentTinyML 2.4.4 をインストールします。

# 動作確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615141/cdc51b42-81d1-1321-2319-b475c9c85541.png)
<br>
動作確認のためにSineExampleをスケッチ例のEloquentTinyML　→　2.4　→　SineExampleを開いてコンパイル＆書き込みをしてみたところ、動かない！？
で、調べたところArduino IDEの最新バージョン（2.1.1）では動かないことがわかりました。ネットで詳しく調べると1.8.19で動くらしいことがわかったので、1.8.19でスケッチを書き込んだところうまく動いた。
こんな感じでシリアルモニターにTinyMLの結果を表示してくれました。
<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615141/0e39c50f-5075-aa65-73ea-ef76583f1d8c.png)
<br>
# 結果
次に、PersonDetectionを動かすために、ESP32S3 XIAOのカメラを動かすスケッチ例のtake_photos_commandを参考にしてPersonDetectionをESP32S3 XIAOでも動くように改良して、結果をDisplayに表示できるようにしたものが次の例になります。
動かした結果が以下のようになります。
<br>
![DSC_0494H.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1615141/145efe69-4122-5a90-37ba-4bbaa56c7470.jpeg)
tailwind css マイチートシート

# はじめに
tailwind cssで自分が忘れがちなユーティリティを随時書く。
# justify-between
justify-betweenをもつ親要素、の中にある子要素を均等に配置する。flexで横並びにする必要あり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/95d298dc-1b92-6fc6-8def-08321aee32d0.png)

```diff_html
<div className="flex justify-between p-5">
    <div>A</div>
    <div>B</div>
    <div>C</div>
</div>
```
  
下記のように子要素を二つにして、二つ目の子要素に要素を複数持たせるとヘッダーが作れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/9047aa20-3ccd-2289-e402-12a6b3d04f76.png)
```diff_html
  <div className="flex justify-between bg-gray-200 p-5">
    <div className="bg-green-400 text-white p-2 rounded-md font-bold">
      Qiita
    </div>
    <div className="flex gap-3">
      <div className="bg-white text-black p-2 rounded-md font-bold">
        下書き保存
      </div>
      <div className="bg-green-400 text-white p-2 rounded-md font-bold">
        公開設定
      </div>
    </div>
  </div>
```

# flex-wrap
入りきらない要素がある場合に折り返してくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/0ee17c83-b1c6-48c0-0808-ca7b9f8aeb59.png)
```diff_html
  <div className="flex flex-wrap p-5 gap-5">
    <div className="p-10 bg-yellow-200">A</div>
    <div className="p-10 bg-yellow-200">B</div>
    <div className="p-10 bg-yellow-200">C</div>
    <div className="p-10 bg-yellow-200">D</div>
    <div className="p-10 bg-yellow-200">E</div>
    <div className="p-10 bg-yellow-200">F</div>
    <div className="p-10 bg-yellow-200">G</div>
    <div className="p-10 bg-yellow-200">H</div>
    <div className="p-10 bg-yellow-200">I</div>
  </div>
```
flex-wrapを書いていない場合は、折り返すことなく横スクロールバーが出現する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/150b094b-3bfe-3126-e223-ba4f2e6c0faf.png)
```diff_html
  <div className="flex p-5 gap-5">
    <div className="p-10 bg-yellow-200">A</div>
    <div className="p-10 bg-yellow-200">B</div>
    <div className="p-10 bg-yellow-200">C</div>
    <div className="p-10 bg-yellow-200">D</div>
    <div className="p-10 bg-yellow-200">E</div>
    <div className="p-10 bg-yellow-200">F</div>
    <div className="p-10 bg-yellow-200">G</div>
    <div className="p-10 bg-yellow-200">H</div>
    <div className="p-10 bg-yellow-200">I</div>
  </div>
```
# 上下左右中央に配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/d336e97a-3895-4649-bc7c-bed9ffa31342.png)
```diff_html
<div className="h-screen w-screen flex justify-center items-center">
  <div className="bg-gray-300 p-10">A</div>
</div>
```

# フォントサイズ
- text-xs
- text-sm
- text-base
- text-lg
- text-xl
- text-2xl
- ~
- text-9xl
初めてのAstro

# はじめに
プロジェクトでAstroを使うことになったので軽くドキュメントの内容をまとめてみました。

# Astroとは
Astroは、コンテンツにフォーカスした高速なWebサイトを構築するためのオールインワンWebフレームワークです。
(https://docs.astro.build/ja/concepts/why-astro/)

Astroは高度なWebアプリケーションを構築するために設計されたフレームワーク(Next.jsなど)とは異なり、ブログやポートフォリオサイトといった静的なWebサイトを作るのに向いています。

Astroはサーバーサイドでのレンダリングをメインとしており、この点も最近のJSフレームワークと異なる点となっています。
サーバーサイドでのレンダリングのおかげでパフォーマンスの向上にも期待ができる。

フロントエンドを触る人には周知の事実かも入れないが一応このような事例がある。
- 高速化100msごと → コンバージョン数1％増（Mobify、年間38万ドルの収益）
- 50%高速化 → 売上12%増（AutoAnything）
- 20%高速化 → コンバージョン数10%アップ（Furniture Village）
- 40%高速化 → サインアップ15%増（Pinterest）
- 850ms高速化 → コンバージョン数7%増（COOK）
- 1秒遅くなるごと → ユーザー数が10%減少（BBC）
**(作りたいアプリやサイトに応じてどのフレームワークを採用するかが1番重要！！)**

# Astroのメリット
- 簡単に始めることができる

以下のコードを見てもらえればわかるように基本的なHTML,CSS,JSを学べばすぐに開発を始めることができる。
```astro index.astro
---
---

<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
    <meta name="viewport" content="width=device-width" />
    <meta name="generator" content={Astro.generator} >
    <title>Astro</title>
  </head>
  <body>
    <h1>Astro</h1>
  </body>
</html>

```

また、Astroには**Astroアイランド**という独自の概念がありJSフレームワーク(React,Vue,Svelte...)の使用を網羅している。
```
---
// 例: 同じページで複数のフレームワークのコンポーネントを混在させる
import MyReactComponent from '../components/MyReactComponent.jsx';
import MySvelteComponent from '../components/MySvelteComponent.svelte';
import MyVueComponent from '../components/MyVueComponent.vue';
---
<div>
  <MySvelteComponent />
  <MyReactComponent />
  <MyVueComponent />
</div>
```

JSを使いたい時には自由にパッケージを追加してお好みのフレームワークで開発を進めることができる。
(JSフレームワークを使わなくてもコンポーネント同士でpropsを渡したりすることができる)
```src/components/GreetingCard.astro
---
import GreetingHeadline from './GreetingHeadline.astro';
const name = "Astro"
---
<h1>グリーティングカード</h1>
<GreetingHeadline greeting="やぁ" name={name} />
<p>素敵な一日をお過ごしください！</p>
```

```src/components/GreetingHeadline.astro
---
const { greeting, name } = Astro.props;
---
<h2>{greeting}、{name}！</h2>
```

**ひとつのページの中にこの部分は静的コンテンツで、反対にこっちは動的コンテンツで実装というように混ぜて開発ができる、これをAstroアイランドという。**


# 終わりに
今回は簡単な概念の説明になってしまいましたが、次回からセットアップを行い簡単なWebサイトを作っていくので次回も読んでいただけたら嬉しいです
サンタさんと一緒に Slack で使われた絵文字ランキングをお届けしてみた

<img width="1240" height="112" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/6d8a7098-9aef-a19a-54fe-83a2d493e033.png" alt="YUMEMI New Grad Advent Calendar 2023">

[株式会社ゆめみの23卒 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yumemi-23-graduation) の 20日目の記事を書きました :santa: 

# 概要
Slack で今年押された絵文字を集計し、ランキング化する絵文字 Bot を作って社内で使用できるようにしました。


# 作る事になった背景

夢の中でサンタさんから 「お主もサンタをやってみないか？」 と誘っていたd...

### 真面目な話

ゆめみでは沢山のカスタム絵文字があり、使われている絵文字を集計してみるのが面白そうだと思いました。
(2023/12/18 現在で9700個のカスタム絵文字があります、凄い)

またチャンネル毎に使われている絵文字が違う感じがあったので、チャンネルの特徴を出すために1年の振り返りのネタとしては良いという発想から作成しました。

個人的に今年やりたい事としてちょっとしたサプライズをしたかったというのもあります。


# 最終的に作成したもの

Bot をチャンネルに追加し `/emoji-statics-2023` というスラッシュコマンドを実行することで、実行したチャンネルで今年押された絵文字をサンタさんが集計してくれるようにしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/baf230f1-d43d-e50d-8f45-243fa252cd91.png" width=300 />

実行結果は以下の画像のように5位までをメッセージとして投稿するようにしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/329854d0-b0cc-7e74-9790-ece85acbb493.png" width=400 />

また6位から30位までをスレッドに投稿する形にしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/407de94b-8679-2c49-8acb-addf3cd0762e.png" width=400 />

また今回は **ojt チャンネルのみでの実行**という制約を追加しました。これは仕事などで使用されるチャンネルをサンタさんが荒らさないような対策として導入しました。


# 社内で使われた様子

現在40人程の方に使用頂いてます。
色々な方に試してもらった結果、ojt チャンネルによって特色が違う結果になりました。

「草」 スタンプで環境保護に取り組んでいる方がいたり

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/6b0e4aaf-b224-55bc-7f81-136152561b0d.png" width=400 />

「お大事に」スタンプで今年は体調が悪かったという振り返りをする方もいました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/1a008fd9-2398-bde7-3fe9-df3b1a56a28d.png" width=400 />

# ハプニング
### 謎のエラーを出す

サンタさんがエラー時に謎の独り言を返すようになっていました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/944187d1-5002-06cd-e827-9505c1e8e4e9.png" width=300 />

これはエラーハンドリングが適切にできておらず、想定外の場所で throw していたので、カスタム Exception を使ってエラーハンドリングを行うようにしました。

今回は
- サンタさんがチャンネルに招待されておらずメッセージが取得できない
- API 呼び出しが連続で10回以上失敗する
- その他エラー

の3通りでエラーハンドリングを行いました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/34180abc-b904-c54c-bce4-85e21caaf793.png" width=300 />


### サンタさんがパンク

インフラのスペックが足りずサンタさんがパンクしました

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/0a1fb7cf-6359-d431-7102-d137e313b0b2.png" width=500 />

これはスラッシュコマンド実行時に API の Rate Limits を超えない都合上 wait している影響で、実行から完了まで長い方だと3時間かかってしまい、プロセスが同時にたくさん動いてしまうのが原因でした。
（5人ほどの同時実行で限界そうだった）

今は実行する方が少ないので大丈夫ですが、また増えそうだったらトナカイさんにお願いして出勤してもらう予定です。


# その他企画について
Bot の稼働は1月上旬に止める予定なのですが、1月はサンタさんはお休みすると思うのでクリスマス以降に働いている方を募集しています！
詳細はこちらから！（現在は受付を終了しています）

また職種問わず全社的に使用されているチャンネルを統計し、リアクションしてくれる優しい方々に表彰を行う予定です。

↓ 社内の雑談チャンネルで使用された絵文字ランキング
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742206/186339a8-cd3e-ecfc-3412-5f5ebe2accd6.png" width=500 />


2023/12/20 にデザイナーさんから社内で使われている絵文字を分析してみた記事が出ますのでお楽しみに！
リンクはこちら → https://note.com/itsumo_momo/n/n293db43e05cd
【AWS】手を動かしながら学ぶAWS SDK for Rust


## はじめに

この記事では 手を動かしながらAWSが提供するAWS SDK for Rust（以下、AWS SDK）を学習していく記事です。主な内容としては実践したときのメモを中心に書きます。
（忘れやすいことなど）誤りなどがあれば書き直していく予定です。

## RustでAWS SDKが使えるようになったとさ

> 投稿日: Nov 27, 2023
本日、AWS は AWS SDK for Rust の一般提供を発表しました。これにより、お客様はこれを本番環境のワークロードに使用できるようになります。AWS SDK for Rust を使用すると、開発者は AWS のサービスを操作し、Rust のコードとベストプラクティスに従った API を楽しむことができます。

[引用：AWS SDK for Rust の一般提供を開始](https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-sdk-rust/)

> Rust のコードとベストプラクティスに従った API を楽しむことができます

RustでAPIを楽しむことができる！！楽しめる！これはやるしかないですね！！

## 事前準備

まずはセットアップをしましょう。動作環境としてはcurlが動くLinuxかもしくはMacOSが望ましいです。WindowsでもWSLやDockerなどで動作すると思います。

```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

インストールが完了したらソースコマンドを実行します。

```bash
source "$HOME/.cargo/env"
```

最後に動作確認でバージョンを確認してみます。

```bash
rustc -V
```

実行結果

```text
rustc 1.74.0 (79e9716c9 2023-11-13)
```

## ドキュメントを見ていこう

今回はEC2クライアントの機能をうまいこと使ってVPCの情報を引用してみます。
つまりは`Hello,World`的なものを作っていきます。

[aws-sdk-ec2](https://crates.io/crates/aws-sdk-ec2)

## 準備体操

### プロジェクト作成からHello,Worldまで実行

`ec2-for-rust`というプロジェクトをデスクトップ上に作成します。
まずはディレクトリを移動します。

```bash
cd ~/Desktop
```

プロジェクトを作成します。

```bash
cargo new ec2-for-rust
```

プロジェクトのディレクトリに変更します。

```bash
cd ec2-for-rust
```

プロジェクトを実行して`Hello,World`が実行できることを確認します。

```bash
cargo run
```

実行結果

```text
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/ec2-for-rust`
Hello, world!
```

## AWS SDKをセットアップ

### Cargo.tomlを追記する

下記の設定を`Cargo.toml`に追記します。

```toml
[dependencies]
aws-config = { version = "1.0.3", features = ["behavior-version-latest"] }
aws-sdk-ec2 = "1.5.0"
tokio = { version = "1", features = ["full"] }
```

```bash
cargo install
```

もしくは

`aws-sdk-ec2`パッケージを追加します。

```bash
cargo add aws-sdk-ec2
```

### コードを修正

```rust
use aws_sdk_ec2 as ec2;

#[::tokio::main]
async fn main() -> Result<(), ec2::Error> {
    let config = aws_config::load_from_env().await;
    let client = aws_sdk_ec2::Client::new(&config);

    // ... make some calls with the client
    let vpcs = client.describe_vpcs().send().await?;

    println!(
        "{:?}",
        vpcs.vpcs()[0]
            .vpc_id()
            .as_deref()
            .unwrap_or_default()
            .as_bytes()
    );
    println!("{:?}", Some("vpc".as_bytes()));
    Ok(())
}

```

プロジェクトを実行するとVPC IDが取得できます。VPCを作成していない場合は作成してから実行しましょう。

```bash
cargo run
```

## まとめ

癖がありましたが、Rustがかける人なら扱えるかなと思えるところです。
Pythonを使ってSDKを動かすことが多いですが、Rustは実行速度が速いので実行速度を上げてリソースを取得したい場合に有効かと思います。

ただ、RustのユーザーでかつAWSが扱える人となるとハードルがバチクソ上がるので組織やチームで使う場合はわりと難易度が高いかもしれません。（技術としては魅力的だけども！）

## 今回使ったコード

[ec2-for-rust](https://github.com/ymd65536/ec2-for-rust)

## 参考

- [What is the AWS SDK for Rust?](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html)
- [What is the code example library?](https://docs.aws.amazon.com/code-library/latest/ug/what-is-code-library.html)
- [AWS SDK for Rust](https://aws.amazon.com/jp/sdk-for-rust/)
- [AWS SDK for Rust - AWS SDK for the Rust Programming Language](https://awslabs.github.io/aws-sdk-rust/)
ゼロから始めるAIハンズオン -「スパムフィルタ」と「メールの件名自動生成」

2023.11.6-7 開催された [JPAAWG 6th General Meeting](https://meetings.jpaawg.org/) で、弊社AIエンジニア Nuwan Senevirathne (@nuwan)により「ゼロから始めるAIハンズオン -「スパムフィルタ」と「メールの件名自動生成」というハンズオンセッションが行われました。その資料をこちらにも共有します。

### 概要
「スパムフィルタ」と「メールの件名自動生成」を作ってみよう。 このハンズオンセッションでは、A1-3セッションで紹介するAIを利用した「スパムフィルタ」と「メールの件名自動生成」のエンジンを実際に作成します。 AIや仕組みについて説明したあと、ハンズオンの手順書を見ながらみなさんで手を動かしてエンジンを実際に構築していただきます。 AIについて全くわからなくても大丈夫です。 プログラミング言語はPythonを使用しますが、わからなくても問題ありません。 AIがどのように作られているのか、実際に体験して楽しんでみてください。

### ハンズオン資料
- [事前準備](https://qualitia-cdev.github.io/jpaawg6th-handson-guide/README.md)
- [AIによるメールの件名生成](https://qualitia-cdev.github.io/jpaawg6th-handson-guide/title_generation_ja.html)
- [基本的な機械学習テクニックによるSPAMフィルタリング](https://qualitia-cdev.github.io/jpaawg6th-handson-guide/spam_classification_ja.html)


### 元のページはこちら
[JPAAWG 6th General Meeting: ゼロから始めるAIハンズオン -「スパムフィルタ」と「メールの件名自動生成」](https://qualitia-cdev.github.io/jpaawg6th-handson-guide/)
最短でgit difftoolを設定する

gitで何も設定せずにdifftoolを実行すると、ゴニョゴニョと文句を言われます。
そして、どうすれば良いか検索して出てくる設定方法はどうもゴニョゴニョと冗長なようです。

とりあえずmeldなら`.gitconfig`に以下のように書き足せば、いけます。
```
[diff]
	tool = meld
[difftool]
	prompt = false
```
たぶんWinMergeとかでも同じのはず。
【ChatGPT無】“ステップバイステップで考えて”を越えられるか。


　どうも、カーブミラーです。

　今回は、「ステップバイステップで考えて」より、精度が高い（と言っている）文言が現れました。それを試してみます。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　昨日（2023/12/17）、
　　X-Twitterで、
　　　Hiroya Iizukaさんから
　　　　下記のポストがありました。
[「ステップバイステップで考えて」より、「正しい答えを得るために、ステップバイステップで考えて」の方が精度が高いのか](https://x.com/0317_hiroya/status/1736035798091460688?t=yZsbAhb6LMffOH59ws4ViA&s=03)

　論文のようですね。
　　もしかしたら、以前からある
　　　文言かもしれません。

　画像中では、
　　“Let's work this out in a step by step way to be sure we have the right answer.”
　　　とあり、DeepL翻訳すると
　　“ステップ・バイ・ステップで正しい答えを導き出そう。”
　　　となりますね。
***
　さっそく、試してみます。

　まずは、
　　何も付けない
　　　ふつうの質問。
***
***User***
初心者向けにプログラミングを学ぶための方法を教えてください。

***ChatGPT***
プログラミングを学ぶための初心者向けの方法はいくつかありますよ。まず、基本的なプログラミング言語（PythonやJavaScriptなど）から始めることがおすすめです。オンラインの無料コースやチュートリアルを利用すると良いでしょう。また、実際に手を動かしながら学ぶことも大切です。小さなプロジェクトを作成したり、問題を解決するためにコードを書いてみることで、実践的な経験を積むことができます。そして、コーディングをする際にはエラーを恐れず、そのエラーから学んでいくことも重要ですよ。
***
　三回繰り返しましたが、
　　たいして変わりませんでした。

　では、
　　ステップバイステップです。
***
***User***
初心者向けにプログラミングを学ぶための方法をステップバイステップで教えてください。

***ChatGPT***
プログラミングを学ぶ際のステップをいくつか紹介しますね：

### 1. 目的を決める
何を作りたいか、どんなアプリやソフトウェアを作りたいかを明確にしましょう。

### 2. 言語を選ぶ
目的に合ったプログラミング言語を選択します。初心者にはPythonやJavaScriptがおすすめです。

### 3. 基本を学ぶ
基本的な構文やコーディングの仕組みを学びます。オンラインのチュートリアルや教材が役立ちます。

### 4. 実践を重視する
学んだことを実際に使ってみましょう。小さなプロジェクトを始めてみると良いですね。

### 5. コミュニティに参加する
オンラインコミュニティやフォーラムで他のプログラマーと交流し、学び合いましょう。

### 6. 継続する
定期的に学習を続け、新しいことに挑戦することで成長します。

これらのステップを追うことで、プログラミングを学ぶ道のりが少しでもスムーズになるかと思います。何か具体的な質問があれば、お気軽にどうぞ！
***
　これも
　　三回繰り返しました。

　最初は、
　　何も付けないものと
　　　似たような回答で、
　　　　内容が濃い感じに。

　あとの二回は、
　　上記のように、
　　　項目を区切ってきました。

　具体的な回答と
　　シンプルな回答でした。

　では、
　　本題です。
***
***User***
初心者向けにプログラミングを学ぶための方法を、正しい答えを得るために、ステップバイステップで考えて教えてください。

***ChatGPT***
プログラミングを学ぶためのステップバイステップのアプローチは次の通りです：

1. **目標の設定**: 何を学びたいのか、どのプログラミング言語を使いたいのかを決定します。例えば、ウェブ開発、データ分析、ゲーム開発などがあります。

2. **基礎知識の獲得**: 選んだ言語の基本概念（変数、条件分岐、ループ）を理解します。オンラインの無料リソースや教材を利用すると良いです。

3. **コーディングの実践**: 知識を実際に使ってみましょう。小さなプロジェクトを始めて、手を動かすことで理解が深まります。

4. **エラーの解決**: 間違いを見つけて修正することは成長の一環です。エラーメッセージを理解し、問題解決のスキルを磨きます。

5. **オンラインコミュニティへの参加**: Stack OverflowやGitHubなどで他のプログラマーと交流し、質問をしたり他の人のコードを見たりすることで学びが加速します。

6. **アルゴリズムとデータ構造の理解**: コーディングのスキルを向上させるために、基本的なアルゴリズムとデータ構造の理解が重要です。

7. **フレームワークやライブラリの学習**: 選んだ分野に特化したフレームワークやライブラリを学び、開発を効率化しましょう。

8. **実践的なプロジェクト**: 大きなプロジェクトに挑戦することで、実際の開発経験を積みます。

9. **コードの最適化**: パフォーマンスの向上やメンテナンス性の確保のために、コードの最適化に挑戦します。

10. **常に学び続ける**: プログラミングは絶え間ない学びの旅です。新しい技術やベストプラクティスを追いかけ、自分を向上させましょう。
***
　こちらも
　　三回繰り返しました。

　最初は、シンプル。
　二つめは、具体的（上記）。
　三つめは、具体的ではあるが、
　　　　　　　二つめほどではない。
***
　このあと、
　　“ラタトゥイユの作り方”で
　　　試してみましたけど、
　　　　どれも変化が見られません。

　まぁ、レシピなんて
　　そうそう変わるものでは
　　　ありませんけどねw
***
　さて、今回の文言は、
　　“ステップ・バイ・ステップ”の
　　　より良い回答が得られる
　　　　文言ではないかとは
　　　　　思います。

　しかし、
　　例としてあげた内容では、
　　　あまり効果が
　　　　見られなかった気も
　　　　　しています。

　もっと、
　　バンッ！と
　　　変化があるかと
　　　　期待していましたので、
　　　　　ちょっと肩透かしでした。

　まぁ、
　　ChatGPT無料版は
　　　三歳児くらいの能力しかない、
　　　　という話ですから、
　　　　　もう少し文言を
　　　　　　砕いてやらないと
　　　　　　　ダメなのかも
　　　　　　　　しれませんね。

　ということで、
　　今回は、ここまで。
Jリーグ推しチームの移籍情報をAlexaにいち早く教えてもらう

この記事は [NTTコムウェア AdventCalendar 2023](https://qiita.com/advent-calendar/2023/nttcomware) 20日目の記事です。

NTTコムウェアの 田中洋輔 です。
私は普段、スクラムマスターとしてアジャイル開発支援をしております。
が、今回の記事はまったく業務に関係ございません。
業務ではエンジニア領域から離れていますが、私生活を豊かにするしょうもないモノづくりには興味・関心が強いので、趣味でやっていることの一部を紹介できればと思い記事を書きました。

# 背景
- 12月はJリーグのオフシーズン期間で、移籍や契約更新が盛り上がる時期です。
- 私は横浜FCというチームを推していて、この時期はハラハラしてます。
- 横浜FCでは、クラブメンバー会員になると、選手移籍などの重大ニュースを公式発表よりも15分早くメールで受け取ることができる特典がついてくるのですが、その15分間でメールに気付けないとクラブメンバーのメリットを享受できません。
- 私はこれまで何回も見逃しており、何とかしていち早く重大メールに気付ける仕組みが欲しかったので趣味で作ってみました。

# 用意したもの
- Amazonのセールで買ったきり部屋に眠ってたEcho Dot（第3世代）※これを何とかして活用したかったのもある
- Alexaアプリ

# 主にやったこと
- メール検知とメール読み上げ用Alexaスキルの設定
    - メールスピーク
    - スマセンサー
    - 手順
        1. メールスピークをAlexaアプリのスキルから探して、アカウントリンクする。
        2. スマセンサー・スキルをAlexaアプリのスキルから探して、有効にする。
        3. Alexaの定型アクションを新規作成する。
    - 参考手順：[メールスピーク公式](https://mailspeak.jp/)

- Gmailのフィルタ作成と転送設定
    - Gmailの検索窓からフィルタを作成して、メールスピークで発行されたメアドを転送先に設定する。
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323569/324371d0-c082-4542-4a70-43d5d886f363.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323569/f898b3ad-f51a-d1d7-45e9-8fc5717de68d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323569/842d7905-c0b2-a6fb-0b72-7361e61c7c2c.png)


# つまづいたこと
- 転送先メアドの確認メールはどうやって確認したらええんやと思ったらちゃんと解説乗ってました。（ちゃんと最後まで読もう）
    - 参考）[転送先の設定（Gmail）](https://mailspeak.jp/#gmailSetting)
- Echoの初期設定
    - 本筋の話ではないけどデバイスの検知やらWi-Fi設定やらのロード時間が意外と長いので心構えが必要です。

# まとめ
- 思いついてから完成するまで1時間くらいで、やりたいことはできました。
- 今は、井上潮音とカプリーニの契約更新メールが読み上げられることを一番楽しみにしています。
- 在宅勤務のWeb会議中に突然、移籍ニュースを読み上げられることでちょっと恥ずかしい思いをすることはあるかもしれないです。
- 次は外出中に気付ける仕組みも考えたいです。


※記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。
いざ火星へ！

㊟　記事の内容は私個人の見解であり、所属する大学・サークルを代表するものではありません。
# はじめに
アドベントカレンダー１８日目です。もともと１０日に書く予定でしたが、体調が悪くなり林田君に代わりにお願いしていました。気温も下がってきたので体調にはみなさん気を付けてください。さて、さっそく宇宙の話をしていきたいと思います。僕自身、高校生の頃に「ボーデの法則」という太陽系の惑星の位置をきれいな数列で表すことができる法則について研究をしました。この研究をする以前から、自分の望遠鏡で星を観察することが好きでした。初めて土星の環を自分の望遠鏡で見たとき図鑑で見ていたものとそっくりでとても驚いたことを覚えています。
# アルテミス計画
冬は夜空を見上げると星がきれいに見える。その一つである火星を今人類は目指している。皆さんはアルテミス計画という計画をご存じであろうか。NASAが提案している、月面プログラム全体をまとめて「アルテミス計画」という。具体的には２０２５年以降に人類を月面に送り、その後、ゲートウェイ計画などを通して月に物資を運び、月面拠点を建設、そして月での持続的な人類の活動をめざす。初めてこの計画を聞いたとき、わくわくしたことが正直である。アームストロングが初めて月を歩いて５０年以上たつ。人類が再び月を歩いていることを想像するだけで大変楽しみである。ここでこれまでどうして月を目指してこなかった、またどうして再び月を目指し始めたのか疑問に思った。１つの理由として火星に行くための中継地として、月の近くに新たな宇宙ステーション「ゲートウェイ」を作ることが挙げられる。月からロケットを打ち上げたほうが、地球からに比べて無重力であり、少ないコストでロケットをうちあげられるそうだ。
# 終わりに
　ここまで主にアルテミス計画について話してきました。読んでいただいてありがとうございます。近い将来、人類が月面に立つことを楽しみにしながら待ちましょう。

# 参考文献
アルテミス計画で米国はなぜ再び月へ？　アポロ計画から半世紀、背景に「地球の危機」https://globe.asahi.com/
月へ、火星へ、そして・・・
有人宇宙探査の未来をひらく　https://humans-in-space.jaxa.jp/
myApplications使ってみた

# はじめに
[にわのわ](https://twitter.com/niwa_nowa)です。
AWS Re:Invent 2023で発表されたmyApplicationsを使ってみました。

# myApplicationsとは
こちらがリリースノートです。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/myapplications-view-manage-applications-aws/

# 使ってみた
2023/12/18現在、マネコンを開くと以下のような画面が表示されます。
一番上の通知か、右上のウィジェットのアプリーケーションを作成から設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/04dcc23b-dfa6-997a-2844-d5ca8c509efc.png)

今回は、[こちら](https://qiita.com/niwanowa/items/d8136c5f476f8596288d)で作成したもので設定していこうと思います。
構成としては以下のようになっています。
![serverlessland.com_patterns_apigw-lambda-dynamodb-terraform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/bdfcd6fd-7883-8fb8-5204-2bf7a71eedca.png)

Application nameのみ入力して、Nextを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/a51bd6b6-de18-02ce-7b77-9f137dbbcdf1.png)

Resource Explorerを有効化していないと、セットアップするよう求められるので有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/e3c7f2b7-78b2-c046-8112-955fcae36dc1.png)

作成したリソースを選択して、Nextを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/40d63833-fc44-3027-e5c3-188e57b2eec2.png)

最後にCreate Applicationを押すと、アプリケーションが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/be0027bc-ceed-5bfe-fe07-5c8ea1a9e6fe.png)

こんな画面になれば一旦完了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/701f97f3-a3f3-444f-c933-92cec9edfad6.png)

# 確認
マネコンに戻るとウィジェットにアプリケーションが追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/3a549a36-47ea-10f7-fc53-9a979a2bcd6c.png)
その他、myApplicationsに移動するとコストなどが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/693b74c4-dbf4-e9b1-6449-9069cfa6de13.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590707/60051c40-1d6e-2de6-265a-66fbc599d2c5.png)

# おわりに
アプリケーション、サービスごとに管理しやすくなっていいですね！
どしどし利用していこうと思います。
初心者必見！！PythonのOpenCVを使って画像から顔の部分を特定しよう

# はじめに
こんにちは!!
MYJLab Advent Calender 2023の19日目を担当させていただく3年生です。
初投稿なので、緊張していますが温かい目で見守ってください笑

昨日の投稿はうのさんのTouchDesignerについてでした。
先日Techプレゼンで発表してくれた内容で、プロジェクションマッピングとか好きな方は特に興味が持てる内容でしたね。
私もチームラボとか好きなのでデザイン系に手を出してみようかなと思いはじめてます笑

さて、今日は「初心者必見！！PythonのOpenCVを使って画像から顔の部分を特定しよう」ということで初心者にはハードルが高い機械学習の部分を"あるもの"で代用して誰でも簡単にできる手順を解説していきます。これを読み終わった後今回使った"あるもの"を自分で作ってみようと思ってもらえるよう頑張ります！
ではどうぞ！

# 目標
OpenCVの予め用意された"あるもの" = "カスケード型分類器"を使って、顔検出して顔部分に四角形を描画する

# 環境
今回はPythonを使います。
- Windows 11 Home
- Python 3.11.0
- opencv-python 4.7.0

# 準備
### カスケード分類器の準備
以下のリンクから学習済みのカスケード分類器をダウンロードします。
[https://github.com/opencv/opencv/tree/master/data/haarcascades](https://github.com/opencv/opencv/tree/master/data/haarcascades)
今回はhaarcascade_frontalface_default.xml(正面からの顔を検出する分類器)をダウンロードして使いましょう！

[ここ重要]
分類器haarcascade_frontalface_default.xmlと検出したい画像(sample.jpg)は、pythonファイルは同じディレクトリに保存します。

### opencvをインストールする

```
pip install opencv-python
```


# コード
```python
#OpenCVライブラリのインポート
import cv2

#顔検出器の定義
face_cascade_path = './haarcascades/haarcascade_frontalface_default.xml'

#顔検出器の読み込み
face_cascade = cv2.CascadeClassifier(face_cascade_path)

#OpenCVで画像の読み込み + グレースケール化
src = cv2.imread('./sample.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

#OpenCVで顔検出をする
faces = face_cascade.detectMultiScale(src_gray)

if len(faces):
    for x, y, w, h in faces:
        cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
else:
    print('Nothing')
    
#顔検出した画像を保存する 
cv2.imwrite('./Images/sample_face_cascade.png', src)
```
* sample.png
* 参考：https://otajo.jp/81849
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617886/83c6d77d-6958-2909-729d-7ad10a9562cd.png)

* sample_face_cascade.png
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617886/c962a71d-0ecc-7eb7-a271-d8865b24cfff.png)

# おわりに
カスケード分類器を使った顔検出はいかがでしたか？
他にも目や横顔を検出するカスケード分類器があるので、興味のある方は試してみてください。
カスケード分類器は容易に使うことはできますが、精度が低いことが現状です。
精度を高めたい方は自分で機械学習することをおすすめします。

qiita初投稿だったのもあり、少々お疲れなので以上で失礼します。良いお年を～～～
Autify認定プログラム - テスト自動化 テスト自動化設計 基礎編

# はじめに

Autify とは

> 非エンジニアでも使えるアジャイル・DevOps時代のテスト自動化ツール、Autify(オーティファイ)

https://autify.com/ja より

ブラウザ上で操作を記録し、それをAutifyによって自動的に操作することができます。
強力な自動テストツールです。


Autify の認定プログラム が用意されました。

> Autify認定プログラム - テスト自動化
> テスト自動化設計 基礎編

Udemy にて、受講することができます。

https://www.udemy.com/course/autify-certification-program-test-automation-basic-jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309141/fbbcaa34-b8b0-3237-324a-034328f6fa72.png)

受講料は ￥2,400 となっております。

Autifyの利用の仕方についての基礎的な映像を見て学習していきます。
内容はわかりやすく、Autifyを最初に使うには良い教材と思います。

また、最後にはテストがあり、テストをクリアすると
バッジを取得することができ、名刺などに使うことができます。

一度、受講してみてはいかがでしょうか。
テレワーク用リモートデスクトップで行った設定

# 経緯
2019頃コロナが流行り、テレワークへ移行していったがうちのプロジェクトではRDP(リモートデスクトップ)を採用した
採用したは良いが、いくつかの問題が発生したのでどうやって解決したのかをメモ
ローカルと遜色ない環境を目指して....

# 環境
クライアントOS: Winsdows10
接続先OS: Windows10
VPN: Fenics Connect

# 問題と対応
## ネットワークが時々切れる
### 原因予想
場所によっては発生したりしなかったりがあるので、無線接続が不安定になっている可能性が高い
### 対応
クライアントPCのネットワークの設定から無線強度を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676040/2685b9ac-38b8-2ac1-95ec-c9479e8458cf.png)
※「送信パワー」ってネーミングちょっと脳筋っぽい

無線LAN側も省電力モードになっていないか確認

閑話休題、無線LANを買い替えたら完全に無くなった

## 操作が実際より遅れる、安定しない
### 原因予想
パケットのロスであると予想
実際MTUを確認してみるとイーサネットとは別でFenics Connect(VPN)にも設定があることがわかった
### 対応
**接続元で**パケットサイズを1ずつ変えてpingし、最適なMTUを調査、1400に設定

```winbatch:Winキー→cmd(管理者で実行)
netsh interface ipv4 show interface
(VPNのIdxを確認)
netsh interface ipv4 set interface [VPNのIdx] mtu=1400
```

### 参考
https://www.server-memo.net/memo/research_mtu.html

### 受信ウィンドウ自動チューニングの調整
```winbatch:Winキー→cmd(管理者で実行)

netsh int tcp show global
netsh interface tcp set global autotuninglevel=restricted
```
|設定名|日本語|説明|
|---|---|---|
|disabled|無効|自動チューニングを無効にし、受信ウインドウサイズを固定します|
|highlyrestricted|高い制限|自動チューニングを厳しく制限します。ウインドウサイズの変更が最小限に抑えられます。|
|restricted|制限|自動チューニングを制限します|
|normal|通常|通常の設定です、受信ウインドウサイズがネットワーク条件に基づいて動的に調整されます。|
|experimental|実験的|より積極的なチューニングを行いますが、安定性が保証されない場合があります。|

## 音声のみ遅延する
### 原因予想
通話した際に相手が音を発しているアイコンは出るのだが、少し遅れて音声が聞こえる
また、音楽や効果音などを再生する時、停止する時に、操作より音が少し遅れる
リモート接続先とVPNサーバー間にネットワーク帯域幅が狭い箇所があるであろうと予想
### 対応
RDP設定を変えることでやりとりするデータの総量を減らすことにした
**接続元で**RDP設定のローカルデバイスとリソースからクリップボード以外の設定を外した
Teams設定の高品質のミュージックモードはオフにする(オンにするとTeamsそのものに遅延が発生する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676040/6540c79b-e7fd-5100-05c8-b0f451953157.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676040/a482fb37-9c90-1e66-c8db-bc7c3fe2e618.png)


## カクつく
### 原因予想
RDPのデフォルトで設定されているフレームレート30になっている、60にすればよい
### 対応
**リモート接続先**のレジストリを参考URLの通り設定を変更し、解決
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations へ 種類は[ DWORD(32 ビット) 値]を選択して DWMFRAMEINTERVAL を作成し、10進数の15 に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676040/be296712-668d-f52f-677d-1a919ae405d4.png)

### 参考
https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/remote/frame-rate-limited-to-30-fps

※Windwos Serverのトラブルシューティングだが、どうやらWindows 10にも効果あるらしい。実際ちゃんと60fpsになってるので
SAR干渉画像が欲しい男の奮闘記

# はじめに
本記事は、SAR干渉画像の入手方法をまとめた記事です。
この画像が欲しい方にとって役立つ記事だと思います。

# SAR干渉画像の見方
以下の記事を参照ください。

https://www.gsi.go.jp/uchusokuchi/sar_procedure.html

# SAR干渉画像の入手方法

最終的に以下のサイトから得ることにしました。

## INSAR Browser

https://gsrt.digiarc.aist.go.jp/insarbrowser/index.html

国立研究開発法人産業技術総合研究所（AIST）が運営するサイトであり、「SIGMA-SAR」を使った解析結果と衛星データがダウンロード出来ます。ただし、PALSARでのものしかないので最近のデータは入手できない難点があります。

## TelluSAR

https://www.tellusxdp.com/market/tool_detail/4969e483-a714-45fe-a5d6-6cef5be85344/7858eca2-2533-4b7c-b689-74c931feedfa

さくらインターネットが運営する衛星画像閲覧サービスです。PALSAR/PALSAR2/ASNARO-2に対応しており、干渉画像の他にも散乱強度のデータも見ることができます。

使い方は以下の記事を参照ください。

https://sorabatake.jp/22161/

## COMET-LiCS Sentinel-1 InSAR portal

https://comet.nerc.ac.uk/COMET-LiCS-portal/

Sentinel-1のSAR干渉画像のデータベースです。世界中の干渉画像を見ることができます。

# SAR干渉画像の活用例

以上のデータを使い、簡単に地図を作ってみました。

## 富士山における地表面変動の検出
![fujiSAR.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586134/82025ee1-cc4c-726d-ad6d-57a26305fe0b.jpeg)


上のSAR干渉画像は富士山の地表面変動を解析したものです。（Sentinel-1、南方軌道右）
上の地図を見ると中心に渦ができていることがわかります。先ほどの、SAR干渉画像の見方のサイトを参照すると富士山はおよそ50cm衛星から西向きの変動、もしくは沈降が見られると考えられます。

# まとめ
以上、SAR干渉画像の入手方法をまとめました。研究などに使う際は自己責任でお願いします。
なお、本記事は「[Nihon University Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nihon-u)」に寄せた記事となります。
【iOS】react-native-webviewのスクロール速度が微妙だっのを修正した

React Nativeアプリを作っているときにiOSのWebViewのスクロール速度が遅いことに気がついた。
指でフリックしても全然滑らない。
同じサイトをSafariで表示させて比べてみても、スクロール量が全然違う。

### UIWebviewの設定値の問題だった
解決策を検索していてたどり着いた記事がこちら。

https://qiita.com/TechMeetMeet/items/44ccc4cb8ce2504091cd

WebView内のscrollViewのデフォルトの設定値が原因らしく、プロパティの変更で対応できるとのこと。

> 以下のようにするだけでスクロールの滑りがUITableViewのデフォルトと同等になります。
> ```
> self.webView.scrollView.decelerationRate = UIScrollViewDecelerationRateNormal
> ```

### react-native-webviewで適用するには？
なるほど、ネイティブコードでの修正方法は分かった。ではreact-native-webviewではどうしたら良いのか？
と思ったら普通にdecelerationRateというプロパティがあった。

https://github.com/react-native-webview/react-native-webview/blob/master/docs/Reference.md#decelerationrate

結論としては、以下のようにdeclerationRateのプロパティを設定することでWebViewのスクロール速度をSafariと同等にすることができた。
```
      <WebView
        source={{uri, headers}}
        decelerationRate="normal"
       />
```

### おわりに
この件について検索しても情報があまりヒットせず、解決するまでに時間がかかってしまった。
知っている人にとっては当たり前のことだからなのか、それとも需要があまりないのか・・・
React Native開発初心者の方や、アプリ開発初心者でWebViewの扱いに困っている人の参考になれば幸いです。
pythonでCPU100%

### シングルプロセス
```
import multiprocessing
import threading
import sys

def max_cpu_task():
    """ CPUを最大限に活用するための単純な無限ループ """
    while True:
        pass

def single_process():
    """ シングルプロセスでCPUを最大限に活用 """
    max_cpu_task()

def multi_process():
    """ マルチプロセスでCPUを最大限に活用 """
    processes = []
    for _ in range(multiprocessing.cpu_count()):
        p = multiprocessing.Process(target=max_cpu_task)
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

def multi_threaded():
    """ シングルプロセス・マルチスレッドでCPUを最大限に活用 """
    threads = []
    for _ in range(threading.cpu_count()):
        t = threading.Thread(target=max_cpu_task)
        t.start()
        threads.append(t)

    for t in threads:
        t.join()

if __name__ == "__main__":
    if len(sys.argv) >= 2:
        mode = sys.argv[1]
        if mode == "single":
            print("シングルプロセスモードで実行します。")
            single_process()
        elif mode == "multi":
            print("マルチプロセスモードで実行します。")
            multi_process()
        elif mode == "thread":
            print("シングルプロセス・マルチスレッドモードで実行します。")
            multi_threaded()
        else:
            print("無効なモードが指定されました。'single', 'multi', または 'thread' のいずれかを指定してください。")
    else:
        print("モードが指定されていません。'single', 'multi', または 'thread' のいずれかを指定してください。")
```

### C言語
```C
#include <stdio.h>
#include <time.h>

int main() {
    long long count = 0;
    int sum = 0;
    time_t start, end;

    // 現在の時刻を取得
    time(&start);

    // 5秒間足し算を実行
    while (1) {
        sum += 1; // 何か単純な操作
        count++;

        // 現在の時刻を取得
        time(&end);

        // 5秒経過したらループを抜ける
        if (difftime(end, start) >= 5.0)
            break;
    }

    printf("Total iterations: %lld\n", count);

    return 0;
}
```