OmniAICreator/Qiita-1.07M huggingface dataset:
「Fingerprintjs2」とは？ 「UUID」との違い

## **Fingerprintjs2とは？**

Fingerprintjs2とは、ブラウザのフィンガープリントを取得するためのJavaScriptライブラリです。フィンガープリントとは、ユーザーのブラウザやデバイスを一意に識別する情報のことを指します。
つまり、Fingerprintjs2を用いることで、ユーザーのブラウザやデバイスを特定し、追跡することが可能になります。

## **なぜFingerprintjs2が必要なの？**

このライブラリの主な利用例は、ユーザー認証や不正アクセス防止、マーケティング分析などです。たとえば、ユーザーが自分のアカウントから異なるデバイスでログインしようとした場合、Fingerprintjs2によってそのデバイスを認識し、二段階認証を求めるなどの対策を講じることが可能です。また、マーケティング分析においても、個々のユーザーの行動を追跡し、そのパターンを分析するのに役立ちます。

## **Fingerprintjs2の利点**

1. **高精度**: Fingerprintjs2は多くのブラウザ情報（ユーザーエージェント、画面解像度、インストールされているフォントなど）を取得し、それを組み合わせることで、高い精度でデバイスを特定できます。

2. **容易な導入**: Fingerprintjs2はJavaScriptライブラリであるため、HTMLに簡単に組み込むことが可能です。

3. **広範囲な互換性**: Fingerprintjs2は様々なブラウザとデバイスに対応しています。


## **UUIDとは？**

UUID（Universally Unique Identifier）は、その名前が示す通り、全世界で一意な識別子を生成するためのものです。UUIDは32の16進数（例：123e4567-e89b-12d3-a456-426614174000）で表現され、その生成には特定のルールが適用されます。一般的には、ランダムまたは時間ベースのアルゴリズムが用いられます。

## **UUIDとFingerprintjs2の違い**

UUIDとFingerprintjs2の主な違いは、それぞれが生成する識別子の性質にあります。

1. **一意性と永続性**：UUIDは全世界で一意の識別子を生成しますが、その識別子は一度生成されると変わることはありません。それに対して、Fingerprintjs2はブラウザやデバイスの状況（例：インストールされているフォント、ブラウザのバージョンなど）に基づいて識別子を生成するため、その識別子は状況によって変わる可能性があります。

2. **個々のユーザーとデバイスの追跡**：UUIDは単に一意の識別子を生成するだけで、特定のユーザーやデバイスに関連付ける情報を提供しません。それに対して、Fingerprintjs2は個々のユーザーやデバイスを追跡するための情報を提供します。

3. **用途**：UUIDは広範囲の用途に使用され、特定のユーザーやデバイスを追跡することが目的ではありません。それに対して、Fingerprintjs2は主にユーザー認証、不正アクセス防止、マーケティング分析など、ユーザーやデバイスを追跡することが必要な場面で利用されます。
Docker imageからコンテナを作成し、コンテナ内のファイルをコピーする

# イメージからコンテナを作成する

まずは、imageの一覧を確認して
該当imageの`REPOSITORY`と、`TAG`の確認をします

```
$ docker images
REPOSITORY             TAG            IMAGE ID         CREATED           SIZE
sample_project       tag_name       d093dc052104   About an hour ago    1.55GB
```

続いて、先ほど確認したimageからコンテナを作成します。

コンテナを**起動する必要はなく、作成するだけ**で対象のコンテナIDの確認が出来ます

```
$ docker create --it [REPOSITORY]:[TAG]
```

```
$ docker create --it sample_project:tag_name
```

https://docs-stage.docker.com/engine/reference/commandline/create/#extended-description

# 作成したコンテナのIDを確認する

`-a` を付けることで、動作中のコンテナだけでなく作成済みのコンテナも全て確認できます

```
$ docker ps -a
CONTAINER ID     IMAGE                 COMMAND            CREATED         STATUS         PORTS                         NAMES
abws64180291   sample_image      "docker-entrypoint.s…"    6 days ago    Up 3 days   0.0.0.0:8080->8080/tcp     sample_project_1
```

https://docs-stage.docker.com/engine/reference/commandline/ps/

# コンテナからファイルをコピーする

最後にlocalへコピーします

```
$ docker cp [CONTAINER ID]:[コピーしたいファイルがあるパス] [コピー先]
```

例えば、localのカレントディレクトリに対して、`/src/static/`配下のファイルをコピーする場合は以下です

```
$ docker cp abws64180291:/src/static/ ./
```

https://docs-stage.docker.com/engine/reference/commandline/cp/

以上です
【Paiza問題集】データセットメニュー/文字列の配列

# Paiza問題集
Pythonで回答

## データセットメニュー/文字列の配列

### Step01 とても大きな数値の入力
```Python:Step01
"""
とても大きな数値の入力
https://paiza.jp/works/mondai/data_structure/data_structure__string_step1
"""

print(input())
```

### Step02 とても小さな値の入力
```Python:Step02
"""
とても小さな値の入力
https://paiza.jp/works/mondai/data_structure/data_structure__string_step2
"""

print(input())
```

### Final問題 文字列の配列
```Python:Final問題
"""
文字列の配列
https://paiza.jp/works/mondai/data_structure/data_structure__string_boss

プログラムの動作
縦Hマス、横Wマスの迷路S
マスが＃の時：壁
マスが.の時：道
maze[r-1][c-1]が壁かどうかを判定する
"""

# 数字を受け取る
H, W, r, c = map(int, (input().split()))
maze = list(input() for i in range(H))

# 壁か判定
print("Yes") if maze[r-1][c-1] == "#" else print("No")
```
日付型のフォーマットをYYYY/MM/DD→YYYYMMDDに変換する際、数式とApexの記載方法を別々説明

数式の記載方法：
日付型のフォーマットをYYYY/MM/DD→YYYYMMDDに変換する際
LPADという関数を使います。
LPADは、指定した桁数になるまで文字列の左側に文字列を埋め込む関数である。
参照資料
https://help.salesforce.com/s/articleView?id=sf.customize_functions_lpad.htm&type=5
下記の数式を記載します。
{!TEXT(YEAR(日付API名)) &
LPAD(TEXT(MONTH(日付API名)), 2 , '0') &
LPAD(TEXT(DAY(日付API名)), 2 , '0')}

出力結果：YYYYMMDD

Apexの記載方法:
```ruby:apex
Date date1 = 日付API名;
String dateMonth = String.valueof(date1.month());
String dateDay = String.valueof(date1.day());
if(dateMonth.length()==1){
   dateMonth = '0' + dateMonth;
}
if(dateDay.length()==1){
   dateDay = '0' + dateDay;
}
String iDate = String.valueof(date1.year()) + dateMonth + dateDay ;
```

出力結果：YYYYMMDD

追記：

対象年月日の日付を1日にしたものを開始日とする。													
開始日に1か月を加算したものを終了日とする。														
場合の計算方法：

```ruby:apex
Date objectDate=Date.newInstance( 2014, 08, 24);
Integer yearNum = Integer.valueof(objectDate.year());
Integer monthNum = Integer.valueof(objectDate.month());
Date startDay = Date.newInstance( yearNum, monthNum, 01);
Date finishDay = startDay.addMonths(1);
system.debug(startDay);//2014-08-01 00:00:00
system.debug(finishDay);//2014-09-01 00:00:00
```
エンジニアのための刑事事件対策まとめ

こんにちは。[モロ](https://twitter.com/moro_is)と申します。
実は[数年前警察のお世話](https://doocts.com/ja/blog/3403)になり、[数年裁判等をやって、昨年晴れて無罪放免となった](https://note.com/morois/m/m1247f5f4ab7e)のですが、そういえばその後どこにも情報をまとめていなかったことに気が付きました。

正直にいうとまったく気の進まない作業ですし、数年間これにかかりきりだったこともあり「わざわざまとめなくても誰でも知ってることでは……？」みたいな気持ちもあります。
とはいえ冷静に考えると大抵の人は一生関わり合いになることのない知識で、お世話になった界隈に対して何も残さないのも不義理という感じがしたため遅ればせながら筆を執らせていただきます。

# はじめに

当記事は、実際に警察のお世話になり、数年間弁護士の方にご指導いただきはしたものの、あくまで法律の専門家でも何でもない一エンジニア（というか多少エンジニアリングをかじったデザイナー）によるもので、第三者による監修等もなされていません。

実体験に基づいて少しでも有益なものになるよう推敲を重ねたものではありますが、正確性を保証するものではありません。

あくまでご自身の判断で参考にしていただけますよう、ご了承ください。

# 家宅捜索は突然に

多くのケースを知っているわけではありませんが、家宅捜索はまったくの抜き打ちで行われました。
厳密には「今からいきますね」程度の連絡はあるものの「なぜ来るのか？」「何をしに来るのか？」ひとつも明かされないため手の打ちようもありません。

もしもう一度やり直せるのなら（全然やり直したくありませんが）この時点で弁護士の方に連絡し、不当な家宅捜索がなされないよう監視する役目を担っていただくのがベストだったように思います。

また、家宅捜索の状況を*録画、録音することも法的には問題ない*そうです。
当然嫌がられますし、阻止する動きもあるでしょうが……。

## パソコンのログインパスワードは教えずに

家宅捜索のあと、当然のようにありとあらゆるデバイスが押収されます。
意識の高いエンジニアなのですべてのデバイスに個別のパスワードを設定していましたが、意外なことに**これを警察に教える義務はない**そうです。
そうすると当然押収は意味をなさず、何を調べられることもなく右から左へ返還されるのだとか。

私は律儀にペラペラ明かしてしまったため目からウロコでした。
そもそも教えようと教えまいと不思議な力で解除されると思っていました。

ただ「とはいえ国家権力は強大だし、不興を買えば何かと理由をつけて留置とかされるんじゃ……？」みたいな疑念もあります。
「潔白を証明する戦いなのだから留置程度を恐れるな！」と自分を奮い立たせてみても、こちとら日夜パソコンをカタカタするだけの日々を送る身です。怖くないはずがありません。

ので、結局のところそのあたりの匙加減は**弁護士の方に相談しましょう**、という結論になります。
普通に生きていれば決して立ち入ることのない土俵入りを強いられるため、専門家の力なくしてはあまりに無力です。

# 耐久取り調べ

取り調べでは出生秘話から日々の食生活まで、「その情報いる？」みたいな質疑応答が丸一営業日ほど繰り返されます。

いうまでもなく、弁護士不在の状況では黙秘が望まれます。
「とはいえ良い子に応じていれば不起訴にしてくれるんでしょう？」というような希望的観測は命取りです。

## 調書に署名しない

取り調べの集大成として署名を求められるのが調書。
のんびりとしたタイピングと要領を得ない日本語で綴られるそれは、しっかりとテキストベースで確認させてもらえるでもなく、少しでも異を唱えれば「じゃあまた取り調べからやらないとね」と**拘束の延長を強いられる恐ろしい書類**です。

極論をいえば、家宅捜索も取り調べも全てはこの書類を作り上げ署名させるためのフローであり、警察の警察による警察のための文章なので十中八九こちらが不利になるよう仕上がっています。
いうまでもなく、署名しない以外の手立てはありません。

## 録音する

不当な取り調べを避けるため録音する、というのはよく聞く話ですし、[私もこれで命拾いをした](https://nlab.itmedia.co.jp/nl/articles/1902/28/news005.html)クチです。
具体的には、音声と引き換えに迂闊にも署名してしまった調書を無効化してもらう形になりました。

ただ、私の場合は幸運にも録音に成功しましたが、取り調べでは持ち物検査や取調室への持ち込みの禁止、身体検査（？）等のフローもありました。
そこで録音機器が見つかった場合はどうなっていたんでしょう。
今となっては知る由もありません。

## 弁護士を呼ぶ

間違いなく唯一絶対の正解です。
**このまとめを通して伝えたいことは、弁護士の必要性でしかありません**。

いかに早い段階で弁護士を取り付けられるか、これに尽きます。

# 裁判

ここから先はもはや**専門家のみに許されたフェーズ（誇張）** です。弁護士を呼ぶほかありません。

そういえば、依頼人として唯一「余計な口出しや発信をしないこと」は褒められた覚えがあります。
私としては「専門外すぎて口の出し方さえよくわからなかった」というのが正直なところですが、多くの場合弁護士さんにまるっとお任せしてしまうのが間違いないようです。

もちろんお任せする弁護士さんが優秀であることが前提となるため、さいごに「[一般社団法人 日本ハッカー協会](https://www.hacker.or.jp/)」をプッシュして終わります。


# さいごに

要約すると、刑事事件は極めて専門性の高い儀式のため、いくらか細かいハックを駆使したところでデザイナーやエンジニアの手には余ります。
ほとんどの場合、いかに早い段階で優秀な弁護士さんに出会えるかがすべてですが、その**選定すら素人には簡単ではありません**。

私は幸運にも優秀な弁護士さんに出会えたため「全部任せて良い子にしてたら解決してくれた」程度の感想ですが、まったく逆に「**弁護士の言う通りにしたら酷い目にあった**」というような話も耳にします。

結論として、「[日本ハッカー協会](https://www.hacker.or.jp/)」を頼るのが現時点での最適解かと思われます。
エンジニアであれば無料で登録できますし、登録だけで有事の際に弁護士の紹介を受けられるだけでなく、弁護士費用の補助なども受けることができます。
私は会員ではありませんでしたが、私を弁護してくださった凄腕の弁護士さんもこちらと提携されています。**盤石です**。
（必要以上に推しましたが私は関係者でもなければ宣伝費も受け取っていません。）

以上です。
義務感に駆られてまとめましたが今後は何事もなかったかのように技術者として頑張るぞ！

私を含め、今後こんなまとめが誰の役にも立たないことを祈ります！
whereとorWhereを併用するときは順番に気を付けよう

# はじめに
実務でwhereとorWhereを併用してデータを取得しようとした時に、想定と違ったデータを取得してしまったことがあったので、whereとorWhereを併用する際に気を付けることを備忘録として残します。

# シチュエーション
例として、Bクラスの「田中さん」か「佐藤さん」を取得したい状況とします。

# 実装コード(NG)
まずはNGの例からです。
```
User::where('class','=','B')
　　　->where('name','=','田中')
　　　->orWhere('name','=','佐藤')
　　　->get();
```
まずクラスをBでソートしてから、田中さん or 佐藤さんを取得しようとしています。
しかしこの時、OR条件の「orWhere」よりもAND条件の「where」の方が先に来ているため、AND条件の「where」の方が優先されてしまいます。

そのため「Bクラスの田中さん」or「全クラスの中の佐藤さん」を取得することになってしまいます。

# 実装コード(OK)
```
User::where('name','=','田中')
　　　->orWhere('name','=','佐藤')
　　　->where('class','=','B')
　　　->get();
```
OR条件の「orwhere」の方が先に来ているため、「Bクラスの田中さん」or 「Bクラスの佐藤さん」と目的のものを取得することができます。

# 最後に
順番が少し違うだけで取得できるものが全く異なってしまうので、これからクエリを書く際は充分に気を付けようと思います。
なぜconfig.public_file_server.enabledは環境変数RAILS_SERVE_STATIC_FILESを参照するのか？

https://qiita.com/search?q=RAILS_SERVE_STATIC_FILES を見てみて下さい。環境変数`RAILS_SERVE_STATIC_FILES`を設定し忘れて、静的ファイルが取得出来ない事例がたくさん見みつかります。

多くの人がつまづくにも関わらず、なぜ`config.public_file_server.enabled`は環境変数`RAILS_SERVE_STATIC_FILES`を参照するのでしょうか？

[config/environments/production.rb](https://github.com/rails/rails/blob/7-0-stable/railties/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt#L25-L27)

```ruby
  # Disable serving static files from the `/public` folder by default since
  # Apache or NGINX already handles this.
  config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
```

ソースコードのコメントを見ると、静的ファイルはApacheやNGINXで扱うはずと書かれています。導入されたころのプルリクエストを漁ってみると次の記述を見つけました。

[Speed up static file service by caching existence checks by schneems · Pull Request #16464 · rails/rails](https://github.com/rails/rails/pull/16464)

> Currently the ActionDispatch::Static middleware hits disk on every GET and HEAD request to check if the given request maps to a file on disk.
>
>  When benchmarked with the entire Rails stack we still see an increase but it is roughly ~2.6% speed increase:

Railsの静的ファイル配信機能をOFFすると2%くらいの性能向上があったようです。ただし、9年前の情報です。Rails 4.2の頃の情報です。今でも同じ効果があるとは限りません。少なくとも導入当初は性能上のメリットがあったようです。

どうやら、Railsをデプロイする標準的なサーバー構成としては、Railsサーバーの手前にApacheやNGINXをリバースプロキシとして配置すると考えられているようです。そのため、デフォルトではRailsの静的ファイル配信機能は無効化されているようです。開発環境での動作確認など限られた状況で手軽に有効に出来るように、環境変数を参照しているようです。

ところで4ヶ月前にマージされた興味深いプルリクエストがあります。
[Turn on static file server by default by dhh · Pull Request #47137 · rails/rails](https://github.com/rails/rails/pull/47137)
どうやらRails 7.1では、静的ファイル配信機能がデフォルトで有効になるようです。

> Modern deployments don't need NGINX/Apache when using CDNs or caching LBs in front.

今時は「ApacheやNGINXは使わないで、RailsサーバーとCDNだけで構成する」のだそうです。

## 参考

- https://github.com/rails/rails/pull/18100
- https://github.com/rails/rails/pull/17347
プロンプトを駆使しておいしいスイーツを作ろう

## プロンプトエンジニアリングを駆使しておいしいスイーツを作ろう！



プロンプトエンジニアリングって面倒ですよね。
普通にググった方が早かったりします。

そこで今日は、超簡単に、驚くほど効果が出る、3つのプロンプトをお伝えします！



■検証
エンジニアリングなし(比較対象)
①区切り文字
②Let's think step by step
③ゴールシークプロンプト




## 〇エンジニアリングなし(比較対象)
うーん。これだとググった方が早いかな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/366ba440-29bd-2b24-8cb4-c8f02ae78143.png)




③区切り文字
GPTは変数名を理解できます。また、区切り文字があると命令と情報の区別がつき精度向上します。
例示をしたい場合は、#出力例#みたいにしても良いですね。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/cf168834-7ef6-a40b-1015-58db4edc1d3c.png)





## ②Let's think step by step(一歩ずつ考えよう)
「重要な事から」「一歩ずつ考えよう」は論理的思考を促す魔法の呪文と言われてます。
言語モデルは論理的思考が苦手なので、プロンプトで促す事で順序立てて演繹的に考えてくれるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/c96c15cc-b0c5-287e-843b-f06a28bae072.png)






![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/af8220e1-bd25-6311-b415-51ecc473752e.png)


















## ③ゴールシークプロンプト
Excelのゴールシークからきているらしいです。ゴールを設定してそこに至るまでのプロンプトを考えてもらいます。




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/79102552-87e3-888d-e26e-5746ca9c0a6d.png)

プロンプトが完成しました！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/0f678bf4-b2e9-b997-6b39-55cd7bd73746.png)



## まとめ

「なんかスイーツ食べたい」といったテキストからエンジニアリングで多様な出力が得られました。
出力だけでなく、その過程で思考が整理されるのもメリットかもです。







## おまけ

片桐！！！！！！！！！！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337456/51bacdd6-fefb-9069-1c42-fd362db58ea3.png)
pnpmのバージョンを上げたらvercelのデプロイが失敗するようになったので対応したメモ

## 概要
[おしゃれリポジトリ駆動開発][*1]を試しているので、行ったことをQiitaに残していく。
vercelが失敗するようになっていたのが、おしゃれでないので直した。

https://github.com/hibohiboo/RinneCircle

## 発生していたエラー
pnpmのバージョンがvercelとローカルで異なっている模様。
lockfileを確認すると、vercelは6.0でローカルは6.1であった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/9acf47e3-4874-f73c-a380-af26077702dc.png)


<details><div>

```
 ERROR  Command failed with exit code 1: /vercel/.pnpm-store/v3/tmp/dlx-96/node_modules/.bin/turbo-ignore
 ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY  Broken lockfile: no entry for '/eslint/8.41.0' in pnpm-lock.yaml
This issue is probably caused by a badly resolved merge conflict.
To fix the lockfile, run 'pnpm install --no-frozen-lockfile'.
Error: Command "pnpm install" exited with 1
BUILD_UTILS_SPAWN_1: Command "pnpm install" exited with 1
```

</div></details>

## 対応

[実験的な機能でpnpmのバージョン指定が可能](https://vercel.com/docs/concepts/deployments/configure-a-build#corepack)なようなので、これを使用した。

### vercel側の設定
実験的機能を有効化するために、環境変数を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/27e8833e-1a44-11a9-4605-9c7b9653db52.png)

### リポジトリ側の設定
packageManagerでバージョンを指定する。ローカルで`pnpm -v`で確認したバージョンを入れた。

[コミット](https://github.com/hibohiboo/RinneCircle/commit/5ca139d59747b5c2d89f69c33d38492f89566aee)

```diff
{
  "repository": "https://github.com/hibohiboo/RinneCircle.git",
  "license": "MIT",
  "private": true,
  "workspaces": [
    "apps/*",
    "packages/*"
  ],
  "scripts": {
    "build": "turbo run build",
    "dev": "turbo run dev",
    "start": "turbo run start",
    "lint": "turbo run lint",
    "clean": "turbo run clean",
    "ncu": "npx pnpm up"
  },
  "devDependencies": {
    "eslint": "^8.41.0",
    "eslint-config-turbo": "latest",
    "turbo": "^1.9.9"
  },
+  "packageManager": "pnpm@8.6.0"
}
```

## 設定後動作確認

グリーン！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/6b272a9f-e431-ff53-1bca-42c9a9a0f83b.png)


## おしゃれリポジトリでその他やったこと

- [x] 英語でReadme
日本語がないと自分が不安なので日本語も追加している。別ファイルにわけたほうがいいかなｌ
- [x] og:imageの設定
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/34affe8a-0959-e4a4-e22e-ecf754a1775c.png)


## 参考

[個人開発のモチベを上げるおしゃれリポジトリ駆動開発][*1]
[vercel](https://vercel.com/docs/concepts/deployments/configure-a-build#corepack)


[*1]:https://qiita.com/Sicut_study/items/3b762364c95e4673bfbe
BGMアプリ開発記録　【機能・アイデア】変

アプリを開発するにあたりUIやデザインを大切ですがどのような機能をそもそも持たすかということが非常に大事になってきます。
今回私の作るアプリはWebViewを中心に構成しているので一旦チャットGPTにWebを作る際の注意点を聞いてみました。この投稿では機能的な改修があればその都度書き換えていってアプリをどのように設計したかという記録をつけていこうと思います。
記事は私はいつもボイスインで書いているので誤字脱字が少しありますが多めに見てください。。


質問：
>私は今、SwiftUIでBGMを再生させるアプリを作っています。 基本的には自分の運営しているウェブサイトをWebKitで貼り付けて画面を構成しているのですが、 それだけですとあまり面白みのないアプリになってしまいます。 WebViewを貼り付けるといったアプリを作る時に、どのような機能を追加すれば面白くなりますか? また気を付けることがあれば教えてください。


### 回答

SwiftUIとWebKitを使ってアプリを作るときに、より面白くするための機能追加や注意点について、以下にいくつか提案します。

1. **Push通知**: お気に入りのコンテンツが更新されたときや、新機能が追加されたときなどに通知する機能を追加すると、ユーザーのエンゲージメントを向上させることができます。

2. **カスタム検索機能**: Webサイトの全てのコンテンツに対してカスタム検索機能を提供することで、ユーザーの利便性を高めることができます。

3. **ダークモード対応**: ユーザーが好みの表示モード（ライトモードまたはダークモード）を選択できるようにすると、より多くのユーザーに対応できます。

4. **オフラインモード**: ネットワーク接続が不安定な場所でもコンテンツを閲覧できるように、一部のコンテンツをオフラインで利用可能にする機能を考えてみてください。

5. **ユーザーフィードバック**: アプリ内でユーザーからのフィードバックを受け取る機能を追加すると、ユーザーのニーズをよりよく理解し、アプリの改善に役立てることができます。

**注意点**: 

1. **パフォーマンス**: 多くの機能を追加すると、アプリのパフォーマンスに影響を及ぼす可能性があります。このため、新たな機能を追加する際は、その影響を常に確認するようにしてください。

2. **ユーザープライバシー**: ユーザーデータを扱う際は、プライバシーに配慮することが重要です。ユーザーがどのようなデータを共有しているのか、それがどのように使用されるのかを明確にする必要があります。

3. **アプリレビューガイドラインの確認**: App Storeのレビューガイドラインを確認し、アプリがその要件を満たしていることを確認してください。特にWebViewを使用している場合は、Appleのガイドラインに特に注意を払ってください。

なるほど。どれもアプリに入れたい機能ですが、自分のレベルを考慮して実装できそうな機能をまずは取り入れてみたいと思います。特に私はこのアプリ内でユーザーとのコミュニケーションを取れるような機能があればいいなという風に思っています。ユーザーフィードバックの機能はとてもいいかもしれませんので実装の候補に入れたいと思います。

2023/05/30
パッチ特徴はConvで抽出するViT【Early Convolutions Help Transformers See Better】



**原論文**
- Early Convolutions Help Transformers See Better
https://arxiv.org/abs/2106.14881



# 関連研究

Vison Transformerの解説
https://qiita.com/wakanomi/items/55bba80338615c7cce73

CNN+ViTモデルの傾向【サーベイ】
https://qiita.com/wakayama_90b/items/96bf5d32b09cb0041c39



# 結論
ViTはCNNと比較して問題点が4つある．
- lrとwdのハイパーパラメータの頑健性が低い
- 収束が遅い
- オプティマイザーのAdamWとSGDの設定の頑健性が低い
- ImageNetでCNNの精度を越せない

この問題をViTのパッチ分割して線形射影を行う処理を5から7層の畳み込みの処理に変更することによって解決する．




# 概要
ViTの原論文にHybrid ViTの説明がある．Hybrid ViTはパッチの埋め込み部分をResNetのステージ3（バッチノルムをグループノルムに変更した３層の畳み込みが（3,4,9））までの40層を超える畳み込みを行なっている．しかし，これには多くのパラメータが必要である．また，ViTのパッチ分割は16x16で分割（16カーネル，16ストライド）しているとしたら，畳み込み的に考えると大きすぎる．そこで，パッチ分割を少数の積み重ねられたストライド2の3×3畳み込みで置き換えた単純な対応策と比較し，最適化挙動を分析した．SAの処理の前に畳み込みの処理をするだけで，上記のViTの問題4つを解決する．




![スクリーンショット 2023-05-30 6.19.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/b42387c0-5e4c-101a-75fa-a2d4137474f4.png)



# モデル構造
基本的なモデル構造はViTと変わりないが，パッチ特徴量を畳み込みによって計算されていることと，そこに使う計算量を補うために，Transformerブロックの数を1つ減らしている．左が通常のViT，右が提案されたモデルで，変更点を青で示す．

![スクリーンショット 2023-05-30 6.30.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/28aae6f0-8193-bc92-339c-545564fe1cf9.png)




# 実験
## ImageNetと収束
3つの図はモデルの大きさ別で比較する．
ImageNet-1kで今回の提案モデル（ViTc）はViT（ViTp）とCNNベースモデル（RegNetY）と比較して，精度を落とすことなく，ViTpと比較して早く収束する傾向が見られる（**通常のViTより収束が早い**）．

![スクリーンショット 2023-05-30 6.19.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/61efac2c-8159-cdfe-aad6-d36f7abd8c5a.png)


また，ImageNet-21kでも有効である結果も示している．

## オプティマイザーを変更
上向き三角がAdamW，下向き三角がSGDを示す．
通常，オプティマイザーは人手で決定するため，オプティマイザーに影響しすぎるモデルは人任せな感じでよろしくない．
ViTpのパッチはオプティマイザーの変更によるギャップが激しく，反対に，ViTcの畳み込みはギャップが解消されている．畳み込みは最先端のRegNetはほぼない（CNNはオプティマイザーを変更受けない）（**通常のViTよりオプティマイザーの頑健性が高い**）．

![スクリーンショット 2023-05-30 6.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/64aa95fd-6ec6-6afd-8240-bb53703ad3a3.png)



## lrとwdの頑健性
上段にはlrとwdの散布図を示し，中下段にその頑健性を占めす．中下段の図では縦軸の値が高いほど頑健性は高く，ViTcはViTpを上回る性能であり，AdamWの場合は中規模モデルで同程度，大規模モデルでRegNetを上回る性能を示した．


![スクリーンショット 2023-05-30 6.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/4decf7d4-867d-a679-134a-c2ba7fa6695a.png)


# 考察
ViTに畳み込み層を５層入れたくらいでViTの性能がかなり向上するのは，ViTの原論文に考察されているViTの特性である「浅い層は局所的な認識，深い層は大局的な認識を好む傾向」の補助（局所的な認識を畳み込み層に任せる）をしてるのかなと思った．



# まとめ
今回は，パッチ特徴はConvで抽出するViT　Early Convolutions Help Transformers See Betterについて解説した．
lrとwdのハイパーパラメータの頑健性が低い，収束が遅い，オプティマイザーのAdamWとSGDの設定の頑健性が低い，ImageNetでCNNの精度を越せない．これらの問題点をパッチ特徴はConvで抽出して解決する．
cscの作法 その321

# 概要
cscの作法、調べてみた。
サーバーサイドc#なwebserverを発明したので紹介する。
- ポート40002
- アドレスlocalhost
- ブラウザからアクセス
- サーバーサイドc#
- じゃんけんを返す

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9f9f4cc6-6139-1ab5-7054-9283eea5d7fa.png)


# サンプルコード

```


using System;
using System.Net;
using System.Text;
using System.Globalization;

namespace App
{
	class Program {
		static void Main(string[] args) {
			try
			{
				HttpListener listener = new HttpListener();
				listener.Prefixes.Clear();
				listener.Prefixes.Add(@"http://localhost:40002/");
				listener.Start();
				Console.WriteLine("start");
				while (true)
				{
					HttpListenerContext context = listener.GetContext();
					HttpListenerRequest request = context.Request;
					HttpListenerResponse response = context.Response;
					Console.WriteLine(request.RawUrl);
					if (request.RawUrl.IndexOf("favicon") == -1)
					{
						string a = request.RawUrl.Replace("/index.html?q=", "");
						string b = "2";
						string name = "012";
						Random random = new Random();
						StringInfo nameInfo = new StringInfo(name);
						int newNameIndex = random.Next(nameInfo.LengthInTextElements);
						b = nameInfo.SubstringByTextElements(newNameIndex, 1);
						string str = "じゃんけん　　0, グー 1, チョキ  2, パー";
						switch (a)
						{
						case "0":
							switch (b)
							{
							case "0":
								str = "グーとグーで、あいこ";
							break;
							case "1":
								str = "グーとチョキで、あなたの勝ち";
							break;
							case "2":
								str = "グーとパーで、あなたの負け";
							break;
							default:
							break;
							}
						break;
						case "1":
							switch (b)
							{
							case "0":
								str = "チョキとグーで、あなたの負け";
							break;
							case "1":
								str = "チョキとチョキで、あいこ";
							break;
							case "2":
								str = "チョキとパーで、あなたの勝ち";
							break;
							default:
							break;
							}
						break;
						case "2":
							switch (b)
							{
							case "0":
								str = "パーとグーで、あなたの勝ち";
							break;
							case "1":
								str = "パーとチョキで、あなたの負け";
							break;
							case "2":
								str = "パーとパーで、あいこ";
							break;
							default:
							break;
							}
						break;
						default:
						break;
						}
						string html0 = "<html><head><meta charset='utf-8'/></head><body><h1>server side c#</h1><form method='get' action='index.html'>入力：<input type='text' name='q' size='30'><input type='submit' value='送信'><br><textarea rows='15' cols='50'>";
						string html1 = "</textarea></form></body></html>";
						byte[] text = Encoding.UTF8.GetBytes(html0 + str + html1);
						response.OutputStream.Write(text, 0, text.Length);
						Console.WriteLine("ok");
					}
					else
					{
						response.StatusCode = 404;
						Console.WriteLine("404");
					}
					response.Close();
				}
			}
			catch (Exception e)
			{
				Console.WriteLine(e.Message);
			}
		}
	}
}





```

以上。
子供を寝室に向かわせるライフハック

ベッドに向かう時間になっても子供が動いてくれない。
寝る時間がどんどん後ろ倒しになって、朝起きられない！
超絶不機嫌で、朝食を食べられない！
そんな日々が続いて、しまいに体調を崩す。

そんな問題を解決してくれたライフハックをご紹介します。



## 利用するガジェット
[Google Nest Hub](https://store.google.com/jp/product/nest_hub_2nd_gen?hl=ja&pli=1)
[Google Nest Mini](https://store.google.com/jp/product/google_nest_mini?hl=ja)

## 概要
時間になったらスマートスピーカーで寝る時間をアナウンスする。


## 設定画面

スマートフォンで[Google Homeアプリ](https://play.google.com/store/apps/details?id=com.google.android.apps.chromecast.app)を使って設定していきます。
個人的に、手順（７）以降のアクションの設定が試行錯誤した箇所になります。



（１）アプリを開いて「ルーティン」をタップ
<img width="300" alt="23-05-26-20-25-26-434_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/1912c25b-10d6-ca8c-1901-ac5b022f01f0.jpeg">

（２） 画面の右側に表示される「＋」をタップ
<img width="300" alt="23-05-26-20-26-56-205_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/cf1e708b-3eae-3af5-7f32-3f9d34ac8542.jpeg">

（３）ルーティンの種類を選択
　　　（私はいつも「個人用」を選択しています）
<img width="300" alt="23-05-26-21-03-20-489_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/5c000641-aea5-0754-5640-675533bd32f8.jpeg">

（４）「無題」と書かれたあたりをタップして、分かるようにタイトルを入力
　　　（「ねんねの時間」とかで良いと思います）
<img width="300" alt="23-05-26-21-04-24-709_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/a0415b03-0cd3-f7c9-dd7f-45016585a681.jpeg">

（５）「開始条件を追加」をタップ
　　　遷移先の画面で、「特定の時刻」をタップし、時間と繰り返しの頻度を設定してください
<img width="300" alt="23-05-29-08-53-25-551_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/2fb7d0c2-1c78-8f75-829b-b817b2161fac.jpeg">

（６）「アクションを追加」をタップ
<img width="300" alt="23-05-29-08-54-01-739_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/c9677228-820c-6019-391b-ebbd70f787ca.jpeg">

（７）「連絡、お知らせ」をタップ
<img width="300" alt="23-05-29-08-57-19-311_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/1a1dd253-1c0d-edc9-241d-7a959c5e64c2.jpeg">

（８）「お知らせの作成」をタップ
<img width="300" alt="23-05-29-08-57-48-784_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/71b015c5-bc4d-ab4e-1a8d-5f8ec213a8b0.jpeg">

（９）「家族に通知する」を選択し、「メッセージ」にアナウンス内容を入力する
　　　（「○○ちゃん、ねんねの時間です」「歯みがきを忘れないでね」等）
<img width="300" alt="23-05-29-08-58-40-255_deco.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641300/5c3f4bee-88fc-c68a-adf6-f70e6701dfa1.jpeg">


子供の名前の表記がひらがなかカタカナか漢字かで、Googleアシスタントのアクセントが違うので、設定後も実際にテスト実行してみてください。
（２）の手順の画面の青い再生ボタンをタップすれば即時で実行できます。
STM32G071でKnight Rider(ナイトライダー)で遊ぶ(その2)


x 過去ログを見よ


D8からD13まで


![o_cop551.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/29e70ddb-c82b-1765-33ac-a983632bc448.jpeg)





767と同じ


```c++


//GPIO_Knight_Rider2_test_767_1


void GPIO_D13(int s)
{

  digitalWrite(13,s);

} //GPIO_D13

void GPIO_D12(int s)
{

  digitalWrite(12,s);

} //GPIO_D12


void GPIO_D11(int s)
{

  digitalWrite(11,s);

} //GPIO_D11


void GPIO_D10(int s)
{

  digitalWrite(10,s);

} //GPIO_D10


void GPIO_D9(int s)
{

  digitalWrite(9,s);

} //GPIO_D9


void GPIO_D8(int s)
{

  digitalWrite(8,s);

} //GPIO_D8


void GPIO_D8_D13_cls()
{

  digitalWrite(13,0);
  digitalWrite(12,0);
  digitalWrite(11,0);

  digitalWrite(10,0);
  digitalWrite(9,0);
  digitalWrite(8,0);

} //GPIO_D8_D13_cls()

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(PB7, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);

} //setup


void loop() {

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D13(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D12(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D11(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D10(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D9(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D8(1);

  delay(1000);                       // wait for a second

} //loop



```
STM32G071でKnight Rider(ナイトライダー)で遊ぶ

x 過去ログを見よ

D0からD7まで

![o_cop550.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5eebde7a-3268-ebb4-654b-e96a53e239e6.jpeg)


767と同じ


```c++



//GPIO_Knight_Rider1_test_767_1

#define DW digitalWrite 


void GPIO_D0_D7(int s)
{

  digitalWrite(7, (s>>7) & 0x01);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(6, (s>>6) & 0x01);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(5, (s>>5) & 0x01);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(4, (s>>4) & 0x01);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(3, (s>>3) & 0x01);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(2, (s>>2) & 0x01);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(1, (s>>1) & 0x01);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(0, s & 0x01);       // turn the LED on (HIGH is the voltage level)
  
} //GPIO_D0_D7


void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(PB7, OUTPUT);
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);


} //setup

void loop() {

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  GPIO_D0_D7(0x01);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);    // turn the LED off by making the voltage LOW
  GPIO_D0_D7(0x02);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  GPIO_D0_D7(0x04);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);    // turn the LED off by making the voltage LOW
  GPIO_D0_D7(0x08);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  GPIO_D0_D7(0x10);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);    // turn the LED off by making the voltage LOW
  GPIO_D0_D7(0x20);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  GPIO_D0_D7(0x40);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);    // turn the LED off by making the voltage LOW
  GPIO_D0_D7(0x80);

  delay(1000);                       // wait for a second



} //loop



```
情報の表現・コンピューターの構成・CPU

### 1-01　情報の表現
1バイト＝8ビット
表現可能な情報量
１ビットの表現可能量は０と１の2（＝２¹）通り。
ｎビットでは2ⁿ通りの情報を表現できる。

大きな数値を表す接頭語
K,M,G,T
K（キロ）10³　M（メガ）10⁶　G（ギガ）10⁹　T（テラ）10¹²

指数計算↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/fb57e6db-fb45-9758-1b79-c2dd80486a4f.png)


### コンピューターの構成
CPU　　　制御装置　記憶装置からプログラムの命令を取り出して解読し、各装置に指示を与える
     　　演算装置　四則演算や論理演算などを行う
記憶装置　データやプログラムを記憶する　RAM/HDD&SSD　
入力装置　コンピューターの外部からプログラムやデータを読み込む
出力装置　コンピューターの内部で処理されたデータを外部へ書き出す

プログラム記憶方式（プログラム格納方式）は、主記憶に記憶されたプログラムをCPUが順に取り出し、解読、実行する方式です。主記憶はCPUから直接アクセスできる装置で、メモリ/メインメモリと呼ぶ。

### 1-03CPU
クロック信号　各装置の動作のタイミングを合わせるためにCPUが発する周期的な信号　
クロック周波数　クロック信号の高低のサイクルが一秒間に繰り返される回数　単位として㎐（2G㎐とは1S　2*10⁹の信号生成）
内部クロック　CPU内部のクロック周波数　　　↓の数倍速度
外部クロック　CPUと各装置を結ぶ経路の周波数　遅い

バス　コンピューター内部でデータをやり取りするための伝送路　血管のようなイメージ

### CPU動作原理
レジスタ　CPUに内蔵されている高速な記憶装置
命令レジスタ　　　　　　実行する命令を格納する
命令アドレスレジスタ（プログラムカウンタ）　　
　　次に実行する命令のアドレスを格納する　
指標レジスタ（指針寄存器）　
　　基準となるアドレスを格納する、指標アドレス指定方式で使用する。
基底レジスタ（基址寄存器　Base Register）
　　基準となるアドレスを格納する。基底アドレス指定方式で使用する。
アキュムレータ（累算器）
　　演算対象や演算結果を格納する。
汎用レジスタ　
　　演算対象や演算結果を格納する。及びその他。

命令語
　プログラム言語→機械語に変更、解読、実行。機械語の命令語は　
　命令部とアドレス部で構成される。

命令実行サイクル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/2f48426c-2937-930d-b31b-aff4b00b97a1.png)
①命令の取り出し
　命令アドレスレジスタを参照し、命令が格納されている主記憶上のアドレスを取得する。取得したアドレスから命令を取り出し、命令レジスタに格納する。この時、命令アドレスレジスタには、次の命令のアドレスをセットする。
②命令の解読
　命令レジスタの命令部は、デコーダで解読され、演算装置に指示を出す。
③実行アドレス計算
　命令レジスタのアドレス部の値は、アドレスレジスタに送られ、処理対象のデータが格納されているアドレス（実行アドレス）を計算する
④オペランドの取り出し
　処理対象のデータを取り出し、演算装置に送る
⑤命令の実行
　演算装置で演算を実行する。
⑥演算結果の格納
　演算結果を格納する。

要は、命令実行サイクル　　
命令取り出し→命令の解読→実行アドレス計算→オペランド*の取り出し→命令の実行→演算結果格納

*Operand指的是进行计算或操作的数据或值。操作数通常用于各种运算符，如算术运算、逻辑运算、比较运算等。

アドレス指定方式
　命令のアドレス部の値から処理対象のデータが格納されている実効アドレスを求める方式。

・即値アドレス指定方式
　命令のアドレス部にデータそのものを格納している方式。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/61afdaef-5139-3fe7-89eb-78342ce2f561.png)
・直接アドレス指定方式
　命令のアドレス部の値を、実効アドレスとする方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/c5765191-6ee5-476f-d264-9273756edad0.png)
・間接アドレス指定方式
　命令のアドレス部の値が示すアドレスに格納されている値を、実効アドレスとする方式。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/c4614e0e-02d1-1135-6775-484a9b1dd2ae.png)
・相対アドレス指定方式
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/c127e1c7-c87e-2d0f-6f44-621e60094b03.png)
・指標アドレス指定方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/157cb9b6-a64f-f0a4-365a-3d8908ab2de7.png)
・基底アドレス指定方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/397399d9-4525-a7c0-c1ec-efe9993c8701.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/a4ec2269-1177-8845-4cc9-cc18c5a35d80.png)
2023/5/30主にITとかセキュリティの記事

台風など自然災害悪用した詐欺に注意、AI進化でメールの真偽の判断難しく(5/28)
https://news.mynavi.jp/techplus/article/20230528-2688161/

【重要】当社ドメインを装ったフィッシングメールに関する注意喚起 オイシックス・ラ・大地(5/28)
https://www.foods-ch.com/news/press_1896051/
https://www.oisixradaichi.co.jp/news/posts/%e3%80%90%e9%87%8d%e8%a6%81%e3%80%91%e5%bd%93%e7%a4%be%e3%83%89%e3%83%a1%e3%82%a4%e3%83%b3%e3%82%92%e8%a3%85%e3%81%a3%e3%81%9f%e3%83%95%e3%82%a3%e3%83%83%e3%82%b7%e3%83%b3%e3%82%b0%e3%83%a1%e3%83%bc/

学校関連のPC、サーバーがウイルス感染　兵庫・加東市、公共施設の予約など停止(5/28)
https://www.kobe-np.co.jp/news/sougou/202305/0016407882.shtml

「スマホつながらない…」新手の“SIMスワップ詐欺”で1000万被害も　ネットバンク不正送金の手口とは【兵庫発】(5/28)
https://www.fnn.jp/articles/-/531464

秋吉 健のArcaic Singularity：携帯電話サービスの乗り換えをスマホ1つで！ついに開始したMNPワンストップのメリットやリスクを考える【コラム】(5/28)
https://s-max.jp/archives/1823653.html

ハッカーによる仮想通貨窃盗、北朝鮮の新たな資金源に(5/28)
https://www.cnn.co.jp/tech/35203868.html

75歳男性、1900万円詐欺被害　「内閣サイバー職員」かたり「あなたの携帯が悪用されている」　千葉・鎌ケ谷署(5/28)
https://news.yahoo.co.jp/articles/31ed7613fafe469384f79c5e7a46c3112423b3d8?source=rss

3大臣が異例の同時謝罪 “トラブル続出”の「マイナンバーカード」 個人情報も流出…普及拡大の裏で何が？【サンデーモーニング】(5/28)
https://newsdig.tbs.co.jp/articles/-/509206

週刊仮想通貨ニュース｜バイナンスの日本向けサービスの案内に注目集まる、日本政府が仮想通貨の追跡強化など(5/28)
https://coinpost.jp/?p=463233

仮想通貨、取引してる？ 取引で重視することは？(5/28)
https://news.yahoo.co.jp/articles/28a8e416971ff47540d58c645d64947cf60efc32?source=rss

NTT東西が44万件通信障害の原因を発表(5/29)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/051800213/

研究者はChatGPTをどうだましたのか
「検出不能」なマルウエアを数時間で生成(5/29)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800013/051700065/

開発支援AI「GitHub Copilot」の全社導入続々、情報流出を防ぐ勘所とは(5/29)
https://xtech.nikkei.com/atcl/nxt/column/18/02423/052500027/

国防関連の先端ICをクラウド上で設計、Microsoftが技術提供(5/29)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08032/

「中央研究所は持たない」、ルネサスCTO
ルネサス エレクトロニクス　執行役員兼CTO　吉岡真一氏(5/29)
https://xtech.nikkei.com/atcl/nxt/column/18/02127/00032/
Google Cloud Associate Engineer 受験記

# はじめに

2023年5月にGoogle Cloud Associate Engineer試験に合格しました。

# 受験動機

Flutterで個人開発をしていく中でスマホアプリ開発に便利な**Firebase**を知りました。
クラウドはAWSしか触ったことが無かったのですが、**Firebase**への興味からGoogle Cloudも知っておきたいと思ったのが受験のきっかけです。

# 受験者スペック

クラウドのリテラシーはAWSで6冠を取得済み。
今までお世話になった会社から、サーバーサイド、フロントエンド、クラウド問わないで、キャリアを積ませて頂きました。

# 使用した教材

**書籍**
[Google Cloud認定資格Associate Cloud Engineer公式ガイド](
https://www.amazon.co.jp/gp/product/B08Z3KQ2FN/ref=ppx_yo_dt_b_d_asin_title_o07?ie=UTF8&psc=1)

**書籍（Kindle）**
[1週間で攻略！Google Cloud 認定資格 Associate Cloud Engineer 本番用問題集110問(2セット+)詳細解説付き](
https://www.amazon.co.jp/Cloud%EF%BC%88GCP%EF%BC%89%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93-Associate-Engineer-%E6%9C%AC%E7%95%AA%E7%94%A8%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%88%E8%A9%B3%E8%A7%A3%E4%BB%98%E3%81%8D%EF%BC%89-Cloud%E8%AA%8D%E5%AE%9A%E6%9C%AC%E7%95%AA%E7%94%A8%E5%95%8F%E9%A1%8C%E9%9B%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B09P847SVC/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=11OBU68995VXM&keywords=Google+Cloud+%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC&qid=1685374074&s=digital-text&sprefix=google+cloud+%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%2Cdigital-text%2C195&sr=1-1)

**Google公式**
[Associate Cloud Engineer模擬試験](
https://docs.google.com/forms/d/e/1FAIpQLSc7bkUHpDbFShBI5xE4u8OO2vl99DrP0htnswa-la9DQynToA/viewform?hl=ja)

**Udemy**
[【GCP認定資格】Google Cloud Platform Associate Cloud Engineer模擬問題集](
https://www.udemy.com/course/gcp-ace-mogi/)

# 勉強方法および経過
勉強時間は1ヶ月程度。

_Google Cloud認定資格Associate Cloud Engineer公式ガイド_ の章構成をGoogle Spreadsheetへ書き出しました。
章構成を頭の中にマッピングしつつ本を読み込み、重要だと思われる点をSpreadsheetへ書き込んでいきました。
また、gcloudコマンド、kubectlコマンド、IAMロールなどは別途シートを作成し書き出しました。
Spreadsheet作成後は時間があれば眺めるようにしていました。

次に(Kindle Unlimitedに登録されていたこともあり) _1週間で攻略！Google Cloud 認定資格 Associate Cloud Engineer 本番用問題集110問(2セット+)詳細解説付き_ を全問解きました。
その後公式の模擬試験を受けたところ8割ほど取れたのでこれで合格出来るのでは？と考えました。

試験日前日に急に不安になり、Udemyでセールだったこともあり、 _【GCP認定資格】Google Cloud Platform Associate Cloud Engineer模擬問題集_ を購入、全170問を解いてから試験に臨んだ結果、合格することが出来ました。

# 感想
試験勉強をして毎回思うことですが体系的な知識が得られたことは良かったです。（作成したSpreadsheetは今後も眺める機会があると思います）
ただ体系的な知識習得は置いておいて、少ない労力で得点を稼ぐには模擬問題集に当たるのが手っ取り早いと思った体験でした。
（おそらく一日前にUdemyの模擬問題をやろうと着想して実行しなければ落ちていた...）

後はやはり他のクラウドの知識があると習得は早いと思われます。

# 注意事項
Google Cloud試験の受験時にGoogle Cloud Webassessorアカウントを作成するのですが、自分は姓・名前を漢字で作成してしまいました。後から「普通はローマ字綴りにするものだ」と思い直し、プロファイル編集画面から修正しようと思ったのですが、メールアドレスや電話番号は修正出来るものの姓・名前は編集できませんでした…。
もしGoogle Webassessorアカウントを作成する機会のある方は、姓・名前は後から修正出来ると思わないで作成されて下さい。
多量飲酒セーバー付きTwitter投稿Webアプリ

## 立ち寄ったお店をその場でツイートしよう！
<b>このあいだ行ったお店どこだっけ？　何がこのお店美味しかったんだっけ？</b>
そんな経験はないでしょうか？
筆者もその一人であり、友人に連れて行ってもらった路地裏のお店なんかは次一人では行けなくなってしまうこともあります。

そこで、忘れないうちに、つまりはお店にいるあいだに、お店について<b>ツイートして共有＆記録してしまえばよい！</b>という発想に辿り着きました。（単純w）
入力の手間を削減するために、以下の工夫を凝らしました。
　・位置情報を自動で取得してGoogle Mapにピンを打った地図情報を付加
　・店情報と評価を入力および選択できるように入力フォーマットを作成
⇒上記２点の内容をツイートボタンから投稿できるようにURLを自動生成する。

## 投稿動画（デモ）
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【デモ動画】<br>自動で位置情報を取得し、その場所（お店）の評価をTwitterに投稿することで、共有・記録できるWebアプリを作成。<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> <a href="https://t.co/zTV1o0X5vb">pic.twitter.com/zTV1o0X5vb</a></p>&mdash; 焼鳥 (@Ichiros_malt) <a href="https://twitter.com/Ichiros_malt/status/1663198537763667968?ref_src=twsrc%5Etfw">May 29, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 多量飲酒セーバー付きTwitter投稿Webアプリ
WebアプリURL：　<a href="https://alcohol-intake-geo.netlify.app/">多量飲酒セーバー付きTwitter投稿Webアプリ</a>
<b><font color=red>注意1：自宅などプライベートな場所での利用・投稿はご注意ください。</font></b>
<b><font color=red>注意2：利用環境によっては機能を使用できないことがあります。</font></b>

本アプリは２段構成になっていて、上段はお店の登録（Twitter投稿）機能、下段はアルコールの摂取量を計算してくれる機能を提供しています。

下段の機能については以下の記事をご参照ください。

https://qiita.com/Ichiros_malt/items/ba4f74984442ac339223

## Webアプリソースコード
ソースコード一式は以下になります。
位置情報取得やツイートボタンはNetlify等にデプロイすることで、実際に使用できます。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="xxyeyYE" data-user="Ichiros_malt" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Ichiros_malt/pen/xxyeyYE">
  Alcohol intake LvUp</a> by Ichiros_malt (<a href="https://codepen.io/Ichiros_malt">@Ichiros_malt</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## もっとよいWebアプリにするために
・多環境での動作保証が必要
　現状PCブラウザでないと機能しない
　（iOSスマホでは位置情報を取得できず、AndroidスマホではTwitter投稿画面遷移時に既知バグあり）
・処理負荷の軽減
　位置情報取得はインターバル関数と組み合わせないとうまく動作しない
　（ボタンクリック時のような単発の処理では動作しなかった）
・入力フォームの改善
　記録しておきたい情報として他にもないか検討する

## 雑談
最近、本アプリのアルコール摂取量（下段の機能）を使ってみている。
選択肢に限りがあることから厳密には計算できないものの、似たような換算になるように調整しながら計上している（適宜飲みながら計上）。現在のところ赤線の多量飲酒基準ラインを大幅にオーバーするようなことは発生していない。
多量飲酒セーバーとして十分機能しているようだ。
SwiftでCalendarの暦を変更する方法 令和にするなど

## 宣伝

アプリ作っているので入れてみてください！！
よろしくお願いいたします！！

https://apps.apple.com/app/6446189340


https://apps.apple.com/jp/app/meime/id6446994707?l=ja


## 本題


Calendar クラスの Identifier 列挙型には、様々なカレンダーの識別子が用意されています。以下に一部を例示します：
```Swift
    .gregorian: グレゴリオ暦（西暦）
    .buddhist: 仏教暦
    .chinese: 中国暦
    .hebrew: ヘブライ暦
    .indian: インド暦
    .islamic: イスラム暦
    .japanese: 日本の暦（和暦）
    .persian: ペルシャ暦

```

上記は一部の例であり、さらに多くのカレンダーが利用可能です。各カレンダーの動作や特性は異なるため、使用環境や目的に応じて適切なカレンダーを選択してください。

カレンダーの識別子は Identifier 列挙型で提供されており、Calendar インスタンスを作成する際に指定します。例えば、次のようにして japanese カレンダーを取得できます：

```swift

let calendar = Calendar(identifier: .japanese)
```


たとえば中国暦（中国のカレンダー）で日付をフォーマットするには、DateFormatter の calendar プロパティに中国のカレンダーを設定する必要があります。以下に、中国暦での日付表記を取得する例を示します：

```swift

let dateFormatter = DateFormatter()
dateFormatter.calendar = Calendar(identifier: .chinese)
//以下省略

```
Rubyバージョンのアップグレード手順

## 概要
今回は元のRubyのバージョンが3.1.3から3.1.4にアップグレードする工程でアップグレードの手順を記述したいと思います。

## 手順
### 1.Rubyのバージョンを3.1.4にアップグレード
まずは以下のコマンドを実行します。
```bash
rbenv install 3.1.4
```

しかし、以下のようなエラーが出る場合が御座います。

```bash
ruby-build: definition not found: 3.1.4

See all available versions with `rbenv install --list`.

If the version you need is missing, try upgrading ruby-build:

brew upgrade ruby-build
```

これは、ruby-buildにRuby 3.1.4の定義がないということを示しています。解決する為には、ruby-buildをアップグレードする必要があります。
```bash
brew upgrade ruby-build
```

上記コマンドでruby-buildが最新バージョンに更新され、Ruby 3.1.4の定義が追加されます。
なお、Homebrewがインストールされていない場合は、以下のコマンドを使ってインストールを行って下さい。
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
ruby-buildのアップグレードが終わったら、再度`rbenv install 3.1.4`を実行し、Ruby 3.1.4をインストールしましょう。

### 2.Ruby 3.1.4をデフォルトに設定
```bash
rbenv global 3.1.4
```

### 3.設定が正しく行われたかを確認
```bash
ruby -v
```
出力されるバージョンが3.1.4であれば設定は成功しております。
【CommonLisp】末尾pの由来の別説を提唱する

CommonLispでは真偽値を格納したり出力したりするシンボルの名称の末尾にpをつける。
これはそういう習慣であり、predicateのpが由来である。

https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node69.html

それはそうと、このpという文字、?に似ていると思わないだろうか？

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/98785ee1-cfc1-3c7e-097c-7767fb4d9a06.png">

要するに、古のLispエイリアンはpをクエスチョンマークに見立てていたのではないだろうか？

以上
AccessのVBAでエクセルのセル表示形式を設定

# やり方

参照設定に『Microsoft Excel 16.0 Object Library』追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b07157d3-eced-e897-25d3-88bf68ac40a2.png)

```vb:サンプル
Dim excel_ As New Excel.Application
Dim excel_sheet_ As Excel.Worksheet

'バックグラウンドで起動
excel_.Visible = False
excel_.UserControl = False
'Accessファイルと同じフォルダーにあるtes.xlsxが対象
excel_.Workbooks.Open FileName:=CurrentProject.Path & "\tes.xlsx"

'一番左のシートのみを選択状態に
Set excel_sheet_ = excel_.Worksheets(1)
excel_sheet_.Select Replace:=True

'『先に表示形式を設定して値は後』という順番にした方がいい。
'でないと本当は『12345678901234567890』という文字列にしたいのに、
'『1234567E+19』となってしまったりする。

'1行1列目のセル。
excel_sheet_.Cells(1, 1).NumberFormatLocal = "G/標準"
excel_sheet_.Cells(1, 1).Value = "12345678901234567890"

'2行1列目のセル。
excel_sheet_.Cells(2, 1).NumberFormatLocal = "@" '文字列
excel_sheet_.Cells(2, 1).Value = "12345678901234567890"

'3行1列目のセル。
excel_sheet_.Cells(3, 1).NumberFormatLocal = "#,##0" '数値
excel_sheet_.Cells(3, 1).Value = "12345678901234567890"

'4行1列目のセル。
excel_sheet_.Cells(4, 1).NumberFormatLocal = "yyyy年mm月dd日" '日付
excel_sheet_.Cells(4, 1).Value = "2023/07/09"

'Excelファイル保存してExcelアプリケーション終了。
excel_.Workbooks(1).Close SaveChanges:=True
excel_.Quit
```

実行前のエクセルファイルは、下記のようにシートを作っただけの状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5e2ac9e5-f05b-6131-633a-13125bd179fc.png)

実行後は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0da2271d-b9e4-d972-7cb2-16c15bed88ab.png)

セルの幅を広げた状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/25fa4be8-b088-70e2-a160-cc94a1681da6.png)

# 値の設定は後がいい

下記のように **値を設定**  ⇒ **表示形式を設定** とやると…

```vb:上記サンプルの一部を抜粋して処理順を変えたもの
'2行1列目のセル。
excel_sheet_.Cells(2, 1).Value = "12345678901234567890"
excel_sheet_.Cells(2, 1).NumberFormatLocal = "@" '文字列
```

下記のようになってしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/25d83fd7-8a52-cf53-fa99-f1a5657c410e.png)
『1.23E+19』のような表示は嫌で文字列にしたのに、意図した結果になっていない。


# 参考サイトさん

https://www.tipsfound.com/vba/07015

https://excel-ubara.com/excelvba1/EXCELVBA331.html

# バージョン

Windows 10 Pro 22H2 19045.3031
Microsoft Access for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
Microsoft Excel for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット
面倒な文字起こしに音声認識AI whisperを使ってみた話

# 本記事について
音声自動文字起こし"音声認識AI whisper"について試したことをまとめたもの

## 誰のための記事？
- 自動文字起こしツールを探している人
- できるだけお金をかけずに文字起こししたい人
- 文字起こし後にそのまま分析したい人

## 音声認識AI whisperについて
OpenAIが文字起こしサービスとして公開した無料の音声認識モデルです。
Webから収集した68万時間分の多言語音声データを教師付きデータで学習させており、
高い精度で入力した音声を文字起こしすることが可能になっています。
(参考:https://openai.com/research/whisper)
whisperには下記の精度別のモデルが5種類用意されています。
今回はsmallとmediumを試してみました。
![スクリーンショット 2023-05-29 22.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/2a075901-5bc6-87fa-57bd-211e5da6f22a.png)
(参考：https://github.com/openai/whisper)

## whisperを使用した背景
google docsなどの無償のものやsonix、easy-peasy.AIといった有償のものを試してみましたが、無償でも精度が高いものがあるのでは？と思い、whisperにたどり着きました。（本当はお金をかけたくなかっただけです）

## 手順
1.ライブラリをインストール
以下のコマンドでインストールします。
```
pip install git+https://github.com/openai/whisper.git
```
Successfully installed whisper-versionが表示されたら成功です！
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313639353133312f30626138653739322d393565662d356563342d373838632d6631663838666136336235302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/b184fa3a-6652-eaa7-c37e-d8dd7f193b37.png)


2.音声データの準備
mp4などの音声ファイルを準備(wavなども対応可)
私は30分弱、話者3名の会議の録画データ(mp4)を使用しました。

3.スクリプトファイルを作成
meeting.pyなどの任意の名前でファイルを作成し、以下のスクリプトを書いて保存します。
モデルはsmall>medium（時間がかかるため）の順に試すのがおすすめです。
ファイルパスはmp4などの音声ファイルのパスを記載します。
```python
import whisper
import json

model = whisper.load_model("small") #モデル指定
result = model.transcribe("ファイルパス", verbose=True, fp16=False, language="ja") #ファイル指定
print(result['text'])

f = open('transcription.txt', 'w', encoding='UTF-8')
f.write(json.dumps(result['text'], sort_keys=True, indent=4, ensure_ascii=False))
f.close()
```
4.ファイルを実行
ターミナルで該当のフォルダに移動して、以下のコマンドで実行します。
meeting.py部分はご自身で作成されたファイル名にて実行してください。
```
python meeting.py
```
実行すると音声の読み込みが始まります。
![スクリーンショット 2023-05-29 22.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/65ea7982-09dd-9eb3-e0b3-1a02afd89e3c.png)

完了すると以下のようなtxtファイルが生成されます。
![スクリーンショット 2023-05-29 22.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695131/fec059dd-bfa5-d4f7-63da-249acbb6f1d5.png)

## modelと精度について
modelはsmallとmediumを自分の耳で聞いて起こしたものと比較しました。
結論から言うとsmallで十分と言う印象です。smallでは固有名詞や漢字以外はほとんど自分の耳と一致していて、mediumになると速度も落ちて精度も下がるように思います。自分の耳は録音データの再生速度を落としたり、何度も聞き直す必要があるため時間短縮になるならsmallで文字起こしして、明らかにおかしい部分だけ再確認するのが良いと思います。
※注意点
30分弱の録音データ、話者3名なのであくまでも参考としてご確認ください。
精度の検証は[difff](https://difff.jp/) というwebアプリ使って検証しています。
|評価項目  |small  |medium  |自分の耳  |
|---|---|---|---|
|精度  |85〜90%  |70~80%  |100%  |
|速度  |10分 |27分  |50分  |



ここから話者の識別まで自動化してみようと考えています。
会議だけでなく、インタビューの録音データでも形態素解析、レポート作成などまで自動化できないか検証していきます。
最後までお読みいただきありがとうございました。
Excelで日付をフィルタする際は注意

データ抽出する際に気になった仕様があったので掲載する

テストデータ
<img width="" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99234/38b861ea-fcf3-b942-50eb-2f516790e90f.png">


このデータで5/16以前を指定すると、5/16 23:59:59まで選択されそうであるが
5/16 00:00:00までとなる。

<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99234/862c0db7-36da-47b5-842b-8bafd7cad092.png">

<br>

<img width="" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99234/60c6bcae-5c68-36e0-c3ea-ab9d1f90b8d2.png">


また、このデータで5/16より後を指定すると、5/17 00:00:00から選択されそうであるが
5/16 00:00:01からとなる。


<img width="500" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99234/bc65f524-3d96-31ff-dbf1-93928f934172.png">

<br>

<img width="" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99234/7dea7576-ea65-46c6-1930-3c53b3cd184b.png">


シリアル値の値を考えればこの動作になることはわかるが
一般的な感覚だと違うと思われます。
Dockerとは

## Dockerとは

:::note
コンテナ仮想化技術を利用してアプリケーションを開発、配布、実行するためのオープンソースのプラットフォーム
→アプリケーションとその依存関係をコンテナと呼ばれる軽量で独立した実行環境にまとめることが可能
:::

## Dockerのメリット

- コンテナ化
Dockerは、アプリケーションとその実行に必要なライブラリや依存関係を含むコンテナを作成する
コンテナ：仮想化された環境で、ホストシステムから独立して動作
**→コンテナ化により、アプリケーションを異なる環境やマシンで再現可能にする**


- ポータビリティ
Dockerコンテナはプラットフォームに依存せず、ほぼどの環境でも実行できる
**→開発環境から本番環境まで、異なる環境での動作を一貫性を持って保証できる**


- 軽量性
Dockerコンテナは軽量で、ホストシステムのリソースを最小限しか使用しない
**→コンテナは共有カーネルを使用するため、仮想マシンに比べて速くて効率的**

- スケーラビリティ
Dockerは、コンテナを迅速に複製してスケールアップやスケールダウンを実現する
複数のコンテナを使用してアプリケーションを分散させる
**→負荷分散や可用性の向上など、スケーラビリティに柔軟性がある**

- イメージ管理
Dockerはイメージを使用してアプリケーションや環境をパッケージングする
イメージ：ファイルシステムのスナップショットのこと
　　　　　バージョン管理され、共有され、再利用が可能
**→アプリケーションのバージョン管理や再現性を向上**