OmniAICreator/Qiita-1.07M huggingface dataset:
書評集の探し方・黒紗文庫の活用

# 書評集の探し方

　書評集の探し方は、国立国会図書館の記事「書評を探す」を参考にしました。より詳しく知りたい方は参照してください。ただし、この記事において、書評集の中で紹介されている書籍の情報を「横断的に検索できる資料は、あまり見あたりません。」とあります。**そこで黒紗文庫をつくりました。**

https://ndlsearch.ndl.go.jp/rnavi/humanities/post_539

# 黒紗文庫について

■**黒紗文庫**
https://it-social.net/kurosya/

　黒紗文庫へアクセスし、黒紗文庫のトップページ、『書評で紹介されている書籍の検索　検索キーワード:』で書籍を横断的に検索することができるようになりました。ただし、書評で紹介されている書籍の情報を収集中・入力中ですので、いまのところ（2024年1月時点では）20％程度です。

■**動画『黒紗文庫、書評集登録中』**
https://www.youtube.com/watch?v=6ZDd_Ej4Bao

　黒紗文庫は、書評集で紹介されている書籍データベースをボランティアの方々で、作成していく（予定の）プロジェクトです。

　書評集は、書籍を紹介する書籍です。いまのところ、国内で発行された書評集を525冊収録しています（探せばもっとあるかもしれません）。 現在収録されている書評集は、国立国会図書館でのデータベースの検索、Amazonでのデータベースの検索、生成系AIの回答をもとに作成しました。 ここでは電子発行のみの書籍や、海外で発行された書籍は除いています。また、書評をまとめたwebページや、新聞・雑誌に掲載された書評はデータ収集の対象外としました。ここでは、書籍の形となっている書評（＝書評集）を対象としました（新聞・雑誌に掲載された書評をのちに書籍にまとめたものは書評集と定義して、対象としています）。

　書評集は書評家と呼ばれる、書籍を紹介する文章を書くプロです。書評集を読むと、新たな本の世界を発見させてくれます。書評集が広まれば、紹介されている書籍も広がります。 新刊ではなく、すでに発行されていて在庫となっている名著に光があたります。

　書評書を書いている人物には、文芸家ではない方もいます。 小泉今日子さんは『小泉今日子書評集』で97冊の書籍を紹介しています。 芦田愛菜さんは、『まなの本棚』で約90冊の書籍を紹介しています。 ミスターチルドレンの桜井和寿さんや、福山雅治さんほか全体で30人が『私のいちばん好きな本』でそれぞれ1冊ずつの書籍を紹介しています。

　書評集は、書評家によって書かれたもの、ある特定の分野やテーマのオススメの書籍をまとめたもの、新聞や雑誌の書評をまとめて書籍にしたもの、書籍を紹介しながら自分の体験や考えをエッセイ調に書かれたものなどがあります。

　数ある書籍の山の中から名著に出会うのは大変ですので、書評集で紹介されている書籍を読むことは、名著であることが推奨されているので非常に助かります。好きな人物がオススメしている本を読むこともよいきっかけとなります。

　しかしながら、書評集専門データベースと、書評集の中でどのような書籍が紹介されているかはデータベースが存在せず、日々、書評集と書評集で紹介されている書籍を知らずに通りすぎているのではないかと思います。 新しい名著に出会う機会を増やすこと、教育では読むべき本を探す効率化、好きな人物をもっと知れることのために、書評集で紹介されている書籍データベースを整備することにしたプロジェクトが『黒紗文庫』です。 『黒紗文庫』の黒紗（くろしゃ）とは、江戸時代、書評集などの高貴な書籍は黒紗（黒い絹織物）で包んで保管されていたという一説に由来します。

　書評集自体のデータベースは整備しましたが、書評集の中で紹介されている書籍の情報は、対象の書籍を読んでくださった方からの情報をもとにこのwebサイトで紹介していく予定です。書評集の中で紹介されている書籍の情報は、書評集の目次となっている場合、巻末に記載されている場合、一覧とはなっておらず本文から抜き出す場合、別冊で後刷りされる場合などがあります。それぞれの状況が異なるため、いまのところ、書評集に収録された書籍の内容を横断的に検索する仕組みがない理由です。この課題を解決しようと試みているのが『黒紗文庫』です。

　『黒紗文庫』では紹介されている書籍の存在をデータベースにすることに特化しています。著作権に触れるため、書評の内容は掲載の対象外とします。書評の内容を見たい場合は、その書評集を手に取っていただくことで読むことができます。既発行の書評集を知ってもらえる機会になるものと考えます。
隠しファイルとそれぞれの役割 ※随時更新

# 隠しファイルとそれぞれの役割

- ファイル名の先頭にピリオドがついており、一般的にデフォルトでは表示されないディレクトリやファイルのこと
- システムやアプリが使用する設定ファイルなど、通常のユーザーが直接操作する必要がないファイルを区分するために使用.


| 隠しファイル |役割 |
| --- | --- |
| .ssh | SSH関連の設定や鍵ファイルが格納されているディレクトリ |
| .config | 各種アプリの設定ファイルが格納されるディレクトリ |
| .bash | Bash シェルの設定やカスタマイズを行うためのファイル |
| .profile | システム全体の環境設定を行うファイル。ログイン時に読み込まれる |
| .zsh | エイリアスの定義、プロンプト設定、プロキシ設定等をカスタイマイズするためのファイル。 HTTP_PROXY や HTTPS_PROXY の環境変数を設定すると、通信にプロキシを使用するように設定可能 |

※「.bash」と「.bashrc」など「.○○rc」との違い
* 「.○○」：ログインシェルとして対象のファイルが起動された時に読み込まれる
* 「.○○rc」：新しいシェルが開かれるたびに読み込まれる


## Tips
- Macでは「command + shift + .」で隠しファイルを表示できる
NoSQLざっくり理解

# NoSQLって何？
- RDBMSとの対義語
- Not Only SQLの略（SQLだけでない）
- DBの操作をSQL以外で行える
- リレーショナルデータベース（SQLベースのデータベース）以外のデータベース管理システムの総称
- これまでのRDBで使えるデータモデルは、テーブル構造だけだったが、テーブル構造だけでなく以下のデータモデルも使える

  - キーバリュー型
  - カラム指向型
  - ドキュメント指向型
  - グラフ指向型

# なんでNoSQLが生まれたの？なんで必要になったの？どんな課題を解決するの？
### 「RDBの処理遅いな〜」という課題を解決
RDBはデータ量が増えすぎると性能が劣化してしまう。
最近IoTとかでビックデータ扱うんだよな〜RDBのままだと性能が心配だな〜
→あ、じゃあRDBではテーブルの整合性を保つためのトランザクションとか複雑な処理やってるけど、そんなことやらずにシンプルな作りにすれば、高速化できるんじゃね。
→NoSQLおぎゃーおぎゃー


### 「今後データ量が増えたときどうしよう」という課題を解決
従来のRDBシステムは原則として1台のサーバーで動作するように設計されている。
これだといずれデータ量が増えた時に1台のサーバーだけでは処理能力が足りない。
→あ、じゃあスケールアウトしやすいDB作っちゃえばいいじゃん
→NoSQLおぎゃーおぎゃー


# NoSQLのメリット
- 処理が高速
- スケールアウトしやすい（サーバー増やして、処理能力向上）
- 様々なデータ構造に対応している（画像や音声などの非構造化データやJSON・XMLなどの半構造化データ）

# NoSQLのデメリット
- スケールアウトによる処理の分散や、トランザクションがなかったり、データの一貫性を確保できない
- 扱えるデータモデルが多い分、処理が複雑になるため、複雑なクエリに対応しにくい
- 学習コストが高い

# どういうところで使われるの
- IoT
- ソーシャルメディア
- リアルタイムアナリティクス
- ECサイト
- モバイルアプリケーション
- 金融機関

# で、結局どういう時NoSQL使うの？
大量データの利用とシステムの柔軟性を実現したい場合に利用するのがいいらしい


# 参考文献
https://products.sint.co.jp/topsic/blog/nosql
https://www.dsk-cloud.com/blog/gc/about-nosql#:~:text=多様な形式のデータ,複雑になるためです%E3%80%82
https://www.softbanktech.co.jp/corp/hr/recruit/articles/101/
https://blog.trocco.io/glossary/nosql#NoSQLdetabesuno_huo_yong_li
【Linux】Terminalで使用できる基本的なコマンド

# コマンド一覧
- `cd {ディレクトリ名}` 　 ：任意のディレクトリに移動
    - `cd ..` ：現在のディレクトリの一つ上の階層に移動
    - `cd -` ：直前にいたディレクトリに戻る
- `ls` ：ディレクトリ内のファイルとディレクトリを一覧表示（隠しファイルを除く）
    - `ls -a` ：ディレクトリ内のファイルとディレクトリを一覧表示（隠しファイルを含む）
    - `ls -la` ：ファイル一覧とそれぞれの詳細情報を表示
- `pwd` ：ディレクトリのパスを表示
- `mkdir {ディレクトリ名}` ：新規ディレクトリを作成
- `rm {ファイル名}` ：任意のファイルを削除
- `cp {元のファイル名} {新しいファイル名}` ：任意のファイルやディレクトリをコピー
- `touch {ファイル名}` ：空のテキストファイルを作成
- `vim {ファイル名}` ：vimエディタを使用して任意ファイルを編集
- `mv {元のファイル名} {新しいファイル名}`  ：ファイルやディレクトリを移動
- `cat {ファイル名}` ：任意のファイルの内容を表示
- `esho "{text}"` ：任意のテキストを標準出力に表示
- `grep "{検索文字列}" {ファイル名}`   ：任意のファイル内のテキストを検索

## 例：新規ファイルを作成する

```bash
## 任意のディレクトリに移動
$ cd {ディレクトリ名}

## ディレクトリを作成
$ mkdir {ディレクトリ名}

## 新規ファイルを作成
$ touch {ファイル名}

## vimエディタを使用してファイルを編集
$ vim {ファイル名}

##(ファイル編集後保存して終了　※Vimエディタ基本コマンド参照）

## ディレクトリ内のファイルを一覧表示
$ ls

## ファイルの中身を確認
cat {ファイル名}
```

## Vimエディタ基本コマンド

```vim
## ファイルを開く
vim {ファイル名}

## テキストを挿入モードに切り替える
i

## テキストを挿入モードから抜ける
Escキー

## カーソル移動
右移動　l
左移動　h
上移動　k
下移動　j

## 削除
x カーソル位置の1文字を削除
dd 1行削除

## テキスト保存して終了
:wq

## テキストを保存せず終了
:q!
```

## Tips

- Tabでコマンド名やファイル名を補完可能
- 矢印キーで履歴を利用可能
- ワイルドカード `*` 使用可能
AWS IoT のデバイス登録を CLI で行う

RaspberryPi や Arduino などのIoTデバイスを AWS IoT と通信させるには、AWS IoT コンソールから「モノ」を登録する必要があります。

フリートプロビジョニングに対応していないIoTデバイスが、そこそこ纏まった数で納品（出荷）されるようになってくると、これをGUIからチマチマ登録するのは面倒だと気付きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/2e2b5b2f-8373-51ab-dee8-681e052dbf56.png)

そこで、AWS CloudShell (CLI) から登録するよう手順を改めました。

```:証明書保存ディレクトリ作成
mkdir certs
cd certs

# モノの名前をシェル変数に定義
THING_NAME=[モノの名前]

# モノ単位でサブディレクトリを作成（ZIPで固め易くする）
mkdir $THING_NAME
cd $THING_NAME
```

```:モノの作成
aws iot create-thing --thing-name $THING_NAME --thing-type-name [モノのタイプ]
```

モノのタイプは、管理が容易になるよう予め作成してあります。

```:静的グループにモノを追加
aws iot add-thing-to-thing-group --thing-name $THING_NAME --thing-group-name [グループ名]
```

予め、グループに対して権限が設定されています。

```:証明書作成
# JSON形式ですべて出力
aws iot create-keys-and-certificate --set-as-active > cert.json

# X.509証明書ファイルを抽出
jq .certificatePem cert.json -r > certificate.pem.crt

# プライベートキーファイルを抽出
jq .keyPair.PrivateKey cert.json -r > private.pem.key

# パブリックキーファイルを抽出
jq .keyPair.PublicKey cert.json -r > public.pem.key

# 証明書のARN（AWSリソースを一意に識別できるID）をシェル変数に定義
CERT_ARN=`jq .certificateArn cert.json -r`

# 証明書にモノを紐付ける
aws iot attach-thing-principal --thing-name $THING_NAME --principal $CERT_ARN
```

証明書の作成を次のようにしても良いですが、証明書のARNは控えておいて下さい。

```
aws iot create-keys-and-certificate --set-as-active \
    --certificate-pem-outfile certificate.pem.crt \
    --private-key-outfile private.pem.key \
    --public-key-outfile public.pem.key
```

```:デバイスごとの証明書一式をS3にアップロード
# ZIPで固める
cd ..
zip -r $THING_NAME $THING_NAME

# S3に保存
aws s3 cp $THING_NAME.zip s3://example
aws s3 ls s3://example
```
visual studioのC++20で__builtin_popcountを使う方法

# visual studioで「__builtin_popcount」を使う方法
># 「popcount」 を使うとできる
・C++20から使える「*popcount*」という関数を使うことで全く同じことができる(popcountの方が少しだけ実行時間が早かったです)
・popcountを使う場合は引数の型が「符号無し整数型」でないといけないみたいです。
→int型なら「uint32_t」で、longlong型は「uint64_t」でうまくいきました。
>## 実際にコードにしてみる
pop_countをコードで書くと
```C++:C++20
#include <bits/stdc++.h>
using namespace std;
int main(){
  int s = 3;  //2進数で表すと「11」になります
  cout<< popcount(uint32_t(s));
}
```
出力すると
```
2
```
となります。
>## 終わりに
代用する方法を調べていたら見つけました。関数を自作したところ実行時間が__builtin_popcountよりも少し長くて不安でしたが代用できる関数が見つかってよかったです。引用先の記事を投稿してくださった方に感謝します。調べた感じ既出ではなかったので投稿します。引用の許可は取っていません 許してください orz
[popcountを教えてくれたリンク](https://zenn.dev/tetsurom/books/cpp11-cpp20-for-game-developers/viewer/008-bit)
gitの環境構築【Windows】

今までとは別のPCでGitを使用することになったので環境構築します。（備忘録）

## 1.Gitのインストール
以下サイトからGitをダウンロード

https://gitforwindows.org/

実行ファイルを開き、以下サイトを参考にインストール、初期設定など、、、
https://prog-8.com/docs/git-env-win

## 2.VScodeで使いたい
インストール時にデフォルトのエディタとしてVScodeを設定したはずなのに、gitコマンドが使えない…

### パターン1：インストール後にVScodeを再起動していない
→再起動で解決

### パターン2：VScodeがデフォルトのエディタに設定されていない
以下サイトを参考に設定
https://chuna.tech/blog/software/VisualStudioCode/use-git-command-in-vscode/

## 3.備考
ユーザー名、メールアドレス変更時は設定の変更が必要
以下参考
https://qiita.com/couragenki/items/cd547e166d059b646b66
セマンティックセグメンテーションについてザックリ解説【E資格対策】

## セマンティックセグメンテーションとは
画像を境界線で抽出するやつのこと。
有名なのは以下の3種類。
・FCN
・SegNet
・U-Net

# FCN
FCN (Fully Convolutional Network)は、一般的なCNNの全結合層を畳み込み層に置き換えたものです。
畳み込みで得た特徴マップをヒートマップ化して、逆畳み込みしてアップサンプリングして予測している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/92aec00a-87f8-b472-d1d7-356e806f18bd.png)
引用：https://zero2one.jp/ai-word/fully-convolutional-netwok/

# SegNet
SegNetは、Encoder-Decoder型のFCNで、Encoderでプーリングを行うときにその位置を記録し、Decoderでアップサンプリングするときにその位置に戻すことで、情報の一貫性を保持します。これにより、メモリ効率を上げることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/f2ae2497-e4af-46cd-bfc8-80178b41e223.png)
引用：https://arxiv.org/pdf/1511.00561.pdf


# U-Net
生物医学のために開発された、セマンティックセグメンテーション用のモデル。
ネットワークがU字型なので、U-Netっていうらしい。
エンコーダとデコーダから成り立ってるモデルで、真ん中から左がエンコーダ、真ん中より右がデコーダ。下図の通り、がっつりスキップ接続を使ってるのが特徴。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/d95b8e81-72cf-9121-2320-6f0dde02aad9.png)
引用：https://arxiv.org/pdf/1505.04597.pdf



# 参考文献
https://www.acceluniverse.com/blog/developers/2019/11/u-net.html#:~:text=U%2Dnet%E3%81%A8%E3%81%AF,%E3%81%AB%E7%99%BA%E8%A1%A8%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82

https://www.skillupai.com/blog/tech/segmentation2/
Javaの条件分岐

Javaも、他言語と同様にifによる条件分岐が可能です。
条件分岐を表現する時、Javaではboolean型というデータ型を用いた方法があります。

# boolean型
boolean型はtrueとfalseのみを扱う事が出来るデータ型です。
使用するビット数も2ビットと少なく、条件文の分岐フラグの管理で使用されます。
Androidアプリ作成に使えるGradleとKotlinのファイル構成例

以下のリンクは、KotlinとGradleを使用したプロジェクトのレポジトリです。それぞれのファイル構成を確認できます。

Gradle build file for Kotlin library
: Kotlinでライブラリを作成するためのGradleビルドファイルの例です。build.gradle.ktsとsettings.gradle.ktsのみがあります。

Multi-Project Builds - Gradle User Manual
: Gradleのマニュアルで、Kotlinでマルチプロジェクトビルドを行う方法を説明しています。appとlibという二つのサブプロジェクトと、license-pluginというGradleプラグインのプロジェクトがあります。それぞれにbuild.gradle.ktsとsettings.gradle.ktsがあります。

rpp0/gradle-kotlin-example - GitHub
: Kotlinでコンソールアプリケーションを作成するためのGradleビルドファイルの例です。build.gradle.ktsとsettings.gradle.ktsのほかに、src/main/kotlinとsrc/main/resources/META-INFにソースコードとマニフェストファイルがあります。

本当に何もわからないところからアプリを作るのにとても役に立つと思います。使えるところは参考にしてみてください！
[Docker] よく使用するコマンド

## コンテナを起動
通常
```
docker compose up
```
バックグラウンドで起動
```
docker compose up -d
```
## コンテナを停止
```
docker compose stop
```
停止して削除
```
docker compose down
```
## イメージのビルド
通常
```
docker compose build
```
キャッシュなしでビルド
```
docker compose build -no-cache
```
## コンテナの中に入る
```
docker compose exec [サービス名] [コマンド]
```
## コンテナの一覧表示
実行中のコンテナを表示
```
docker ps
```
すべてのコンテナを表示
```
docker ps -a
```
## イメージの一覧表示
```
docker images
```
## コンテナを削除
```
docker rm [コンテナIDまたは名前]
```
## イメージを削除
```
docker rmi [イメージIDまたは名前]
```
## すべてのリソースを一掃
```
docker system prune -a --volumes
```
@supabase/auth-helpers-nextjsを使用した認証周りで起きる画面のチラつきを擬似的に防止する方法

# 目次
[１. 問題の経緯](#1-問題の経緯)
[２. 開発環境](#2-開発環境)
[３. 解決手順](#3-解決手順)
[４. 結果](#4-結果)
[５. おわりに](#5-おわりに)

# １. 問題の経緯
`@supabase/auth-helpers-nextjs`を使用して、ログイン機能を作成したのですが、
ログインをしていない状態でトップページにアクセスすると、
「ログイン後にしか見られない画面が一瞬見えてしまう（チラつき）」
という事象が発生しました。
調べてみた感じだと、特にバグとかそういうのではなさそうでした。

`loading.tsx`や`Suspense`コンポーネントを使用して解決を試みたのですが、
なかなか上手くいかなかったので、今回の方法で落ち着きました。（完全敗北）

なお、今回のログインには、Supabaseの`createServerComponentClient`を使用して、
サーバーサイドで認証されたユーザーの`session`を使用します。

# 2. 開発環境
| Package | Version |
|:-|:-|
| next | 14.0.4 |
| react | ^18 |
| tailwindcss | ^3.3.0 |
| @supabase/auth-helpers-nextjs | ^0.9.0 |
| @supabase/supabase-js | ^2.39.3 |

# 3. 解決手順
まず、以下のように、認証されたユーザーの`session`を取得します。
```tsx:Component.tsx
const supabase = createServerComponentClient({ cookies });

const { data: { session } } = await supabase.auth.getSession();

```
※サーバーコンポーネントになるので、`"use client"`を使用しているコンポーネントで使用する場合は、このセッション情報を`props`で渡して使用する、など工夫が必要です。

次に、`useRouter`を使用して、セッション情報がないユーザーはログイン画面に遷移させる処理を書きます。

```tsx:page.tsx
import { useRouter } from "next/navigation";

const router = useRouter();
if (session === null) {
  router.push("/login");
}
```

この処理が発火するまでに一瞬画面が見えてしまうわけですね。

そこで、`session`の状態で見せる画面（コンポーネント）を切り替えるようにします。
```tsx:page.tsx
return (
  <>
    {session ? (
      // ログイン後に見える内容
    ) : (
      // 未ログインの場合に見える内容
      // ex. 真っ白な画面
      <div className="fixed h-full w-full bg-white"></div>
    )}
  </>
);
```

# 4. 結果
チラつきが発生する間は真っ白な画面が表示され、
少しだけUIが良くなったと思います。


# 5. おわりに
Next.jsの場合、ビルド後はさほど気にならないぐらい短いですが、気になる方はお試しを。
あと、この方法以外で良い解決策があったら教えて下さい。

以上です。
SourceTreeで無視や未追跡のファイルを表示する

普段SourceTreeを使用しているのですが、その際にFirebaseを導入する際のjsonが無視ファイルに分類されていて、普段コミットするファイルの一覧に表示されませんでした。

無視や未追跡のファイルを表示させたので、その時の方法です。

![スクリーンショット 2024-02-11 15.07.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/2e280468-2345-6f94-a141-16c7a1f280fc.png)


ソースツリーにてこの保留中のファイルとなっているため保留中のファイルしか表示されてませんでした。
なのでここをクリックして無視や未追跡などを選択すると表示させることができます。
Module 'Nuke' has no member named 'loadImage'になってブチ切れてる人へ（俺）

# 【背景】

https://mo-gu-mo-gu.com/ios-qiita-client-tutorial-api/

SwiftとUiKitの練習でこの記事のアプリを作ってみっかーと思ったら途中で詰んだので共有。
どうやらNukeの更新でNuke.loadImageがなくなってしまった模様。

ネットで調べてもあまり情報が無いため、メモ代わりにここに書いておく。

# ダメな書き方
```
Nuke.loadImage(with: ***, into: ***)
```

これだと
Module 'Nuke' has no member named 'loadImage'
となる。


# イケる書き方


### その１

```
import Nuke
import NukeExtensions //コレ追加
```
importでNukeに加えて"NukeExtensions"ってやつを追加

### その２
```
loadImage(with: ****, into: ***)
```

この書き方をする。そしたら動いたわ。
Androidアプリの制作フロー概要

昨今生成AIのおかげで個人開発のハードルが下がり、何かアプリを作りたいと思ってる人も多いと思います。

なのでAndroid向けアプリの概要（アプリ開発に必要なサービス等）について簡単に書いてみます。


- AndroidManifest.xml: アプリの構造やメタデータ、コンポーネント、パーミッションなどを定義するマニフェストファイルです。プロジェクトのルートディレクトリにあります。
- java: JavaやKotlinのソースコードファイルが入っているフォルダです。UIのコントローラーとして機能します。
- res: リソースファイルが入っているフォルダです。画像や音声、文字列、レイアウトなどが含まれます。
- drawable: 描画可能なリソースファイルが入っているフォルダです。ビットマップやベクター、シェイプ、レイヤー、ステートなどが含まれます。
- layout: UIのレイアウトを定義するXMLファイルが入っているフォルダです。ビューの階層構造を作成するために、子要素としてウィジェットを追加できます。
- values: 文字列や色、スタイル、テーマなどの値を定義するXMLファイルが入っているフォルダです。
- Gradle Scripts: Gradleビルドシステムを使用するためのスクリプトファイルが入っているフォルダです。ビルドの設定や依存関係を記述できます。

Androidアプリのリリースの手順は、以下のようになります⁶⁷⁸。

1. アプリをリリース用に準備する。このステップでは、リリースバージョンのアプリをビルドするために、以下のタスクを行います。
    - アプリをリリース用に設定する。最低限、ログを無効化して削除し、リリースバリアントにdebuggable falseを設定する必要があります。また、アプリのバージョン情報も設定する必要があります。
    - リリースバージョンのアプリをビルドして署名する。Gradleビルドファイルを使って、リリースバージョンのアプリをビルドして署名できます。署名には、自分の証明書を使う必要があります。
    - リリースバージョンのアプリをテストする。リリース前に、少なくとも一つのターゲット端末と一つのターゲットタブレットで、リリースバージョンのアプリを徹底的にテストする必要があります。Firebase Test Labを使って、さまざまなデバイスや設定でテストできます。
    - アプリのリソースをリリース用に更新する。アプリに必要なリソースファイルやグラフィックなどを、アプリに含めるか、適切な本番サーバーに配置する必要があります。
    - アプリが依存する外部サーバーやサービスを準備する。アプリが外部サーバーやサービスに依存する場合は、それらが安全で本番環境に適したものであることを確認する必要があります。
2. アプリをユーザーにリリースする。このステップでは、リリースバージョンのアプリを公開、販売、配布するために、以下のタスクを行います。
    - アプリをアプリマーケットプレイスにリリースする。Google Playなどのアプリマーケットプレイスにアプリをリリースする場合は、アカウントを作成し、アプリの詳細や価格、配信地域などを設定する必要があります。また、アプリの品質やセキュリティを確保するために、アプリバンドルやプレイアセットデリバリーなどの機能を利用する必要があります。
    - アプリをウェブサイトからリリースする。ウェブサイトからアプリをリリースする場合は、署名されたAPKファイルをホスティングし、ダウンロードリンクを提供する必要があります。また、ユーザーに未知のアプリやソースからのインストールを許可させる必要があります。

実際にGradleとKotlinを使用したアプリの例を以下の記事にまとめています。ぜひ参考にしてみてください！
https://qiita.com/k-ente/items/14b553b789061e60765d


Source: Conversation with Bing, 2/11/2024
(1) Android | Android Application File Structure - GeeksforGeeks. https://www.geeksforgeeks.org/android-android-apps-file-structure/.
(2) Projects overview | Android Studio | Android Developers. https://developer.android.com/studio/projects/.
(3) Publish your app | Android Studio | Android Developers. https://developer.android.com/studio/publish/.
(4) Prepare your app for release | Android Studio | Android .... https://developer.android.com/studio/publish/preparing.
(5) Prepare and roll out a release - Play Console Help. https://support.google.com/googleplay/android-developer/answer/9859348?hl=en.
(6) apk (file format) - Wikipedia. https://en.wikipedia.org/wiki/Apk_%28file_format%29.
(7) Explain the android file and storage structure - Stack Overflow. https://stackoverflow.com/questions/61394772/explain-the-android-file-and-storage-structure.
(8) The Structure of an Android App | Codecademy. https://www.codecademy.com/resources/videos/mobile-development/the-structure-of-an-android-app.
(9) undefined. http://schemas.android.com/apk/res/android.
DartでopenReadを使ってファイルを読み込む方法

# 概要

Dartにおけるファイル読み込み方法のうち、`File`の`openRead`メソッドを使った方法を紹介します。

他の記事では一発で知りたいことが書いてありますが、ここでは一つづつ処理を追い、どうしてそのような書き方にするのかを明確にします。



# 基本的な書き方

```dart:example.dart
import 'dart:convert';
import 'dart:io';

void main(List<String> arguments) async {
  var file = File(arguments[0]);  
  var lines = file.openRead();

  await for (var line in lines) {
    print(line);
  }
}
```

| コード | 説明 | APIリファレンス |
| ---- | ---- | ---- |
| void main(List<String> arguments) async | 引数として文字列リストを受け取ります。関数内でファイルを`openRead`し`Stream`を扱うため、`async`を付与します。 | |
| var file = File(arguments[0]); | 引数を使って`File`クラスのインスタンスを作ります。`arguments[0]`にはファイルパスを渡す想定です。 | |
| var lines = file.openRead(); | `File`クラスの`openRead`メソッドを使用します。このメソッドによる返り値は`Stream`です。 | [openRead abstract method](https://api.dart.dev/stable/3.2.6/dart-io/File/openRead.html) |
| await for (var line in lines) | `Stream`を読み込むために`await for`を使用します。 | |
| print(line) | 読み込んだファイルの行をコンソールへ出力します。 | |

```console:出力結果
[47, 47, 32, 105, 109, 112, 111, 114, 116, 32, 39, 112, 97, 99, 107, 97, 103, 101, 58, 99, 108]
```

単純に`openRead`だけではバイト列として表示されます。

# UTF8へデコードして表示する

```diff_dart:example.dart
import 'dart:convert';
import 'dart:io';

void main(List<String> arguments) async {
  var file = File(arguments[0]);
+ var lines = utf8.decoder
+     .bind(file.openRead());

  await for (var line in lines) {
    print(line);
  }
}
```

| コード | 説明 | APIリファレンス |
| ---- | ---- | ---- |
| utf8.decoder.bind(file.openRead()) | UTF8へデコードするために`utf8.decoder.bind()`を使用します。 | [bind method](https://api.dart.dev/stable/3.2.6/dart-convert/Utf8Decoder/bind.html) |

```console:出力結果
これはhogehogeです。
# コメント hugahuga
```

このように人間が読める文字列となります。

# 一行づつ処理を行う

上記の例では`lines`というStreamにすべての文字列が含まれています。

```text:lines
lines = ["これはhogehogeです。\n# コメント hugahuga", "", ...]
```


`#`によってコメントアウトされた行だけを除き出力したい場合は、一行づつ処理を行います。次のように改行文字でStreamを分割し新しいStreamとします。

```diff_dart:example.dart
import 'dart:convert';
import 'dart:io';

void main(List<String> arguments) async {
  var file = File(arguments[0]);
  var lines = utf8.decoder
      .bind(file.openRead())
+     .transform(const LineSplitter());

  await for (var line in lines) {
+   if (!line.startsWith("#")) print(line);
  }
}
```

| コード | 説明 | APIリファレンス |
| ---- | ---- | ---- |
| .transform(const LineSplitter()) | `LineSplitter()`というStreamトランスフォーマーによってStreamを改行文字列で分割する | [LineSplitter class](https://api.dart.dev/stable/3.2.6/dart-convert/LineSplitter-class.html) |
| if (!line.startWith("#")) print(line) | `startWith()`で先頭が`#`になっている行を検出するようにしている。 | [startsWith abstract method](https://api.dart.dev/stable/3.2.6/dart-core/String/startsWith.html) |

```console:出力結果
これはhogehogeです。
```

先頭に`#`がある行は出力されなくなります。
flutterで他言語化を実装してみる

# そもそもな誤解

他言語化ってapiで吐き出されたデータを翻訳してくれるのではなく、text（）内で自分で書いた文言を他言語に置き換えることを知らなかった。

または勝手に翻訳してくれる機能もあるのかもしれないが、今回はそこを深く調べてないので割愛したい。

## pubspeck.yamlの設定
dependencies:
  flutter:
    sdk: flutter
  //追加
  flutter_localizations:
    sdk: flutter
  intl: ^0.18.0
  // ここまで

  もう１箇所
//# The following section is specific to Flutter packages.
flutter:
  //追加
  generate: true
//ここまで

## mainに記載する
 return MaterialApp(
      //他言語化
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('ja', ''), //日本語
        Locale('en', ''), //英語
        ///他の言語の追加も可能
      ],
      home: MyHomePage(),
    );

  ## l10nフォルダの作成とその中身
  libの中にl10nフォルダを作成。その中にファイルを作成。今回は英語と日本語対応させる
  以下にフォルダ階層
  lib/l10n/app_en.arb
&emsp;&emsp;&emsp;&emsp;app_ja.arb

app_~~.arbファイルの中身は下
{
  "@@locale": "en",//英語。日本語の場合は「"@@locale": "ja",」
  "hintText": "Enter words e.g., apple, cat",
  "key": "「key」と入力すると表示させる文字がこの中に記載されるkeyとvalueの関係",
}


## l10n.yamlファイルの作成
pubspeck.ymlと同じフォルダ階層にl10n.yamlファイルを作成。中身は下
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart


## 使ってみる
//変数で定義　「.hintText」がkeyとなり,valueの値「Enter words e.g., apple, cat」が表示される
 String hintText = AppLocalizations.of(context)!.hintText;

  TextFormField(
          controller: textController,
          decoration: InputDecoration(
            hintText: hintText,//ヒントテキストが他言語化される。
          ),
        ),

エミュレーターのスマホ設定を英語にすると英語・日本語の切り替えができます。
i18n × form.label の使い方 【Rails】

# この記事のまとめ
**`<%= form.label :column %>` で `ja.yml` の `column` にアクセスしたい時は**

例
```erb:app/views/users/new.html.erb
<%= form.label :email %>
<%= form.email_field :email, id: :user_email, class: "form" %>
```

以下のように 
`locals/activerecord/ja.yml` に `activerecord: attributes: model: column` 
に記述すれば良いです。

例
```yml:locals/activerecord/ja.yml
ja:
  activerecord:
    models:
      user: ユーザー
    attributes:
      user:
        email: メールアドレス
```

# i18n × `form.label` 
いつものごとくRailsの魔術です。
```erb
<%= form_for @user do |f| %>
  <!-- 例１ -->
  <%= f.label :name, "名前" %>
  <%= f.text_field :name %>

  <!-- 以下のように書くこともできる -->
  <!-- 例２ -->
  <%= f.label :name %>
  <%= f.email_field :name %>

  <%= f.submit "登録" %>
<% end %>
```

例１はわかりやすいですね。
第一引数 `:name` で、`:name` 属性の入力フィールドと紐づくことを示します。
その後、`"名前"` で 「名前」というラベルを表示します。

例２は魔術です。
`:name` しか書いていないのに、先ほどと同じく「名前」というラベルまで表示します。
ただし、この魔術は、適切な ymlファイル が用意されている場合のみ動作します。

適切な ymlファイル
```yml
ja:
  activerecord:
    attributes:
      user:
	    name: "名前"
```

この時、この ymlファイルは `config/locals` 以下に配置する必要があります。

もし適切な場所に配置されていない場合、`i18n` が認識してくれません。

以下は、ymlファイル の構造を抽象化したものです。
```yml
言語コード（ `ja` や `en` ）:
	activerecord:
		（attributes:）
			model_name:
				key: ""
```

## 注意事項
- `activerecord` はフラットケース（大文字 / `_`を含まない）なので注意！
- パラメータが `enum` の場合、 `activerecord` ではなく `enums` 以下に設定する必要があります。
    例：`role` が `enum` で実装されている（ `{0:admin, 1:general}` のイメージ）
  ```
  ja:
    activerecord:
      model:
        user: "ユーザー"
      attributes:
        user:
          name: "名前"
          role: "権限"
    enums:
      user:
        role:
          admin: "管理者"
          general: "一般"
  ```
GCP Cloud Buildでnode_modulesに変更が無ければキャッシュしない

以前、下記の記事でAngularプロジェクトをGCPにデプロイするのを高速化したけど、もう少し高速化する。

https://qiita.com/beltway7/items/4fbc429df69b8a52d631

デプロイ後にnode_modulesをGCPのStorageに保存してるが、node_modulesを圧縮するのに時間がかかる（40秒程度）

今回は、これを何とかする

# 問題
冒頭で記載した通り、node_modulesの圧縮が遅い。
前回記事の最後に載せた表をもう一度記載する

| ステップ | 修正前 | 修正後 |
|:-----------|------------:|------------:|
| Dockerビルド| 21秒 | -        |
| node_modulesダウンロード | -      | 10秒        |
| node_modules解凍     | -      | 18秒        |
| pnpm install     | -      | 29秒        |
| yarn install     | 2分7秒      | -        |
| Angular build     | 3秒      | 3秒        |
| デプロイ     | 32秒      | 44秒        |
| node_modules圧縮     | -      | 37秒        |
| node_modulesアップロード     | -      | 7秒        |
| 合計     | 3分10秒      | 2分34秒        |

node_modules圧縮で37秒、アップロードで7秒かかってる。
全体が2分34秒なので中々の時間だ。

# node_modulesに変更が無ければキャッシュしない
いつも通りChatGPTに聞いて、色々試行錯誤した結果、下記の結論になった
- pnpm-lock.jsonのハッシュ値を取得
- 前回のハッシュ値と比較して違う場合、node_modulesをキャッシュする

# cloudbuild.yaml修正

## pnpm-lock.jsonのハッシュ値を取得
md5sumコマンドでpnpm-lock.jsonのハッシュ値を取得し、current_pnpm_lock_hash.txtに保存。

そして、前回のハッシュ値をStorageから取得。
![Screenshot 2024-02-11 at 14.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/9b0eb932-5a0c-794d-c4f4-9baf19f973a4.png)

## 前回のハッシュ値と比較して違う場合、node_modulesをキャッシュする
もし、ハッシュ値が一致するなら、そのまま終了。

一致しないならnode_modulesを圧縮してStorageに保存。
current_pnpm_lock_hash.txtもStorageに保存。

# 結果

![TinyPNG Screenshot Feb 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/3f3ed242-a8b8-a367-2c53-90e82db89ffb.png)

Step7〜9がなくなったので、3分33秒から2分37秒と1分近くCIの時間が短縮された。
※前回の記事ではデプロイが44秒で今回は1分21秒と倍近くかかってるのは不明。

コードはこちら

https://github.com/ksakae1216/angular2022/pull/142/files

※一致しない場合、node_modulesを圧縮してStorageに保存する部分がちょっと間違ってました。ubuntuではなく、gcr.io/cloud-builders/gsutilを使う必要があるので、下記の対応も必要。

https://github.com/ksakae1216/angular2022/pull/144/commits/98218021bb92c6d68db043f7f06a9474e0ae0475
Mac マウス ショートカットの登録　覚書

## マウスにショートカットを登録したい時(Mac）
MacBookを買いました。型落ちのMacBookですが、使いやすいし快適です:relaxed:。
初期設定で、マウスにショートカットを登録したかったので、備忘録として載せます。

### Mission Controlを表示させるショートカット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/7b2d3572-7a2f-263a-5c97-8dd65704b511.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/bb4f23bb-e125-0bc7-72ab-78cce7ceafaa.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/aa166ff4-2e4f-264b-d61b-a906627f30a9.png)
## デスクトップを表示させるショートカット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/aa166ff4-2e4f-264b-d61b-a906627f30a9.png)

## ホットコーナーを登録するとき
※ホットコーナーは、マウスを一定の位置までドラッグした場所のことで、右上にマウスを持っていくとデスクトップが表示されるなどの設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/a6697d9e-0819-442f-2c37-ff709998e69f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/a1dbe3ee-82d9-5845-67c8-88b881a7d0c1.png)
初めてGit・GitHubを利用する自分への記録

# Git・GitHubのコマンドについて


## こちらは僕自身がGit・GitHubの操作を忘れないため記事です。もし、これからGit・GitHubを利用する方がいましたら「ヘぇ〜、なるほど」程度に読んでいただけますと幸いです。また間違えやより効率よくできることがあればご教示いただけますと幸いです。
(vscodeのターミナル上でのコマンドと説明です。markdownも適当なのでその点は申し訳ないです。)

## 1.　mkdir ファイル名
### まずは自分でお好みのディレトリを作成する。もしすでに作成ずみの場合はphaseは無視する。

## 2. cd ファイル名
### 作成したリポジトリのディレクトリに移動する。

## 3. git init
### すでにアカウントの設定は終えている状態なので、まだの場合はGitを使う前にGithubでローカルリポジトリを作成する必要がある。

## 4. git add .
### git addコマンドで、作成したファイルをステージングに格納する。

## 5.　git commit -m"コメント記載(例えば、"Initial commit"など)"　
### git commitコマンドで、コミットします。コミットすることで、GitHubにファイルをPushできる状態にする。

## 6. git push origin ブランチ名("mainなど")
### pushコマンドでコミットしたファイルを、GitHubに追加する。この際、ブランチを指定しているので、作成したブランチにpushしている。

## 補足もの
### 何かしらのファイルを作成したいときに使用するコマンド。
touch ファイル名　.md

### フォルダを作成する際に使用するコマンド。
mkdir フォルダ名

### ファイルを開くコマンドです。ファイルを変更したら保存します。
open ファイル名

### untracked fileのエラーで出た際に、エラーで表示されているファイルを削除するコマンド。GitHubにpushする際に、出たエラーを解消するために使用。
git clean -f
bin/rails dartsass:watchをdocker-composeに設定

docker-composeでrail7とpostgresqとdartsassを設定したいので学習メモを残します


# dcokerを使わない場合
dockerを使わない場合は、Procfile.devにコマンドを記述し、foremanでサーバーを立ち上げる
```dev:Procfile.dev
web: bin/rails server -p 8080
css: bin/rails dartsass:watch
```
# dockerを使う場合
こちらを記述する
```yml:docker-compose.yml
version: '3.8' # 現在はcompose specificationで記述しても良い

services:
# 中略
  sass:
    volumes:
    - .:/
    restart: always
    command: bundle exec rails dartsass:watch
```

また、動作を試していないので様子見...
Google Drive アプリ連携解除

# Google Drive アプリ連携解除

1. Google ドライブを開く  

1. 画面右上のギアアイコンをクリック  

1. 「設定」をクリック  

1. 画面左ペイン（メニュー）の「アプリの管理」をクリック  

1. 「ドライブに接続されているアプリの管理」画面になるので一覧より解除したいアプリを探す  

1. 解除したいアプリの「オプション」をクリック  

1. 「ドライブから切断」をクリック

以上
【HackTheBox】つまったところを備忘録的に残す 第二回

【Tier1】課題：Three にて、つまったところを備忘録的に残します。
1:いつものようにwriteupを参照してます。
　いつかはこれを読まずに取り組めるようになりたいです。
　見た感じ、サブドメインのサービスを割り出し、そこに遠隔で操作できるphpファイルを保存し攻撃マシンから見る？と理解。

2:task1～9は特につまることなく進めることができました。
　　最近NMAPはもちろん、GOBUSTERの使い方にも慣れてきました。GOBUSTERは
　　　-min-rate　1000　（時短オプション）
  　　--append-domain（検索結果にドメイン名を付与？）
   を使いました。
   aws configureは初でした。クラウド関係もしっかり理解する必要があると痛感。

3:最終問題：フラッグゲット。
　ncの意味を理解できず１日ほどつまりました。
　＜ポイント＞
　　(1)bash　-iをコマンドで入力するものばかりだと思いコマンドたたくも「接続できない」のメッセージがでるだけ。
  　　　→色々探した結果
　　　　　　ncコマンドでまず攻撃者側ポートをlisten状態にする
　　　　　　その後、bash-iの部分をサーバ側で起動させることで、攻撃者側ポートにデータが送信
       　するものだとようやく気付く。
　　　　　　=>ここにきて、s3サーバに送ったshell.phpとの関連性が理解できた（遅い）
　　(2)bash -i実施後、404メッセージがでてデータが落ちてこないことが判明。
　　　　→bash.shをあらかじめ作成し、それを閲覧させる必要があることに気づく。
　　　　　bash.shには、bash -iのコマンドを記載＝被害サーバがURLに基づき攻撃者側が準備しているbash.shを参照しデータを送信している　　ことにようやく気付く。
　　(3)nc実施したターミナルに示されているフォルダにアクセスすることでflagをゲットした。
　　　→URLのCMD=以下でLinuxのコマンドを受け付けるため、上記で示されたファイルパスをうちflagを見つけました。

　　※余談ですが、cmd=以下に、findコマンドをうっても発見することができました。
  　　→find / -name flag*

veryeasyでこれだと、先が思いやられますが、素人なりに頑張ります。
【Android】startActivity(intent) と startActivity(intent) + finish() の違い

## finish() ありか、なしか
### 画面遷移時 `finish()` あり
```kotlin
  val intent = Intent(this@LoginActivity, NextActivity::class.java)
  startActivity(intent)
  finish()
```
- LoginActivity が終了し、バックスタックから削除される
- つまり、ユーザーが WebActivity を閉じた後にバックボタンを押すと、アプリは直接アプリのメイン画面や前の画面に戻る


### 画面遷移時 `finish()` なし
```kotlin
  val intent = Intent(this@LoginActivity, NextActivity::class.java)
  startActivity(intent)
```
- この場合、LoginActivity は終了せず、バックスタックに残る
- つまり、WebActivity を終了した後でも、ユーザーがバックボタンを押すと LoginActivity に戻る

## 挙動チェック
### finish() あり
![finishあり.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917260/8a259716-0bf3-e2b2-7344-f3c376ca760d.gif)


### finish() なし
![finishなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917260/a73ae3c1-53f1-52c8-ba3d-ab2db62ca75f.gif)

### すみません、、チカチカしますね・・・

## おわりに
QiitaにGif以外の動画のあげ方がイマイチわからなかった・・・
がんばるぞい！
フルスタックエンジニアの悩み

# 概要

フルスタックエンジニアの定義はやや曖昧ですが、様々な開発工程や技術分野において広範な知識を有するエンジニアを指します。

開発工程においては、要件定義、設計、開発、テスト、リリース、運用などが含まれます。技術分野としては、フロントエンド開発、バックエンド開発、そしてインフラ構築が挙げられます。

私は10年ほどにわたりフルスタックエンジニアとしての経験を積んでいます。この経験から得た悩みや考えを記事にまとめ、共有していきたいと思います。

# 簡単な自己紹介

- 開発工程においては、要件定義から運用まで経験しております
- 使用言語は、JavaScript、PHP、Python、Javaなど様々で、特に好きなのはJavaScriptとPythonです
- インフラの経験としては、サーバー構築、AWSやGCPのクラウド環境、Dockerの構築、FWやファイルサーバの運用などがあります
- 個人の開発では、WEBサービスの公開やプラグインの開発を行っています
- 将来的には、スマホアプリの開発や機械学習などにも挑戦したいと考えています
- 過去の記事のタイトルからも分かるように、くだらないことを形にするのが大好きです

# 悩み

## 自分が使いたい技術の開発ができない

開発の役割分担をする際に、人が足りない部分を補うような穴埋めでの業務の割り振りになることが多いです。
そのため、フルスタックになればなるほど、自分の好きな技術を担当させてもらえることは少ないです。（好きなことをするのが仕事ではないのでしょうがないですが...）

対策としては、**「もっとこうしたほうが良いのではないですか」と提案**したり、**作業が遅れている人のサポートをして担当外の部分に手を出す**ようにしています。

## すべての技術を評価してもらえるわけではない

今まで習得した技術はすべて評価につながる訳ではありません。

プロジェクトによっては、バックエンドだけの開発になったりするのですが、その場合にフロント技術やインフラの技術という部分で勝負ができなくなってしまうので、**バックエンドをやり続けたプロフェッショナルより能力が低いと判断されてしまう**場合があります。転職活動においても同じことが言えます。


対策としては、プロフェッショナルとは戦わずに、フロントやインフラにも視野を広げて開発やコミュニケーションをするようにして、差別化しています。

## 経歴だけで判断される

私の場合は、`JavaScript` `PHP` `Python` `Java`と経歴書に書くことになりますが、実際のところは、`Kotlin` `Swift` `R` `Ruby`など、業務では使ったことの無いような技術を使いたいですがエンジニアの経験を重ねるほど、新しい技術のプロジェクトに割り当てられないような気がします。

都合の良い所だけフォーカスが当たるため、「きみは、PHPの人なんだね」みたいなことも言われたことがありますｗ

似たような例をあげると
`COBOL`のエンジニアが、`COBOL`の改修ばかりになったり
`jQuey`のエンジニアが、`Vue`や`React`の開発ができなかったり
と過去に習得した技術が足枷になっている場合があります。


対策としては、自分のやりたいことを自己アピールできれば良いですが、印象としてはよくないので、**上司**や**仕事を取ってくる営業**側が、今までの経験とこれからやりたいことをヒアリングして、適した作業やプロジェクトを割り当てて欲しいです。本人のモチベにもなりますし、成長も全然違います。


# 終わりに

私がフルスタックエンジニアの悩みを紹介しました。
フルスタックエンジニアじゃなくても共感できる方は沢山居るのでないかと思います。
皆さんの悩みや対策を行っているを行っているか知りたいので、ぜひコメントしていただければと思います。


また、フルスタックエンジニアについてネガティブな記事になってしまいましたが、
フルスタックエンジニアの経験が「良かったこと」のほうが多いので、それも記事にできたらなと思います。

ここまで読んでいただきありがとうございました。
Python環境構築覚書 (asdf, poetry)

## この記事はなに？
Python環境構築について、 　
気がつくと月に数回調べているので、自分用の覚書として書く。

## 環境のセットアップ
今回は以下の環境を使っています。

* MacOS
* 複数バージョンの管理：https://asdf-vm.com/
* Pythonのパッケージマネージャー：https://python-poetry.org/

なお、poetry、Pythonともにasdfからインストールできます。

ここでは、asdfがインストールされている前提で、Python、Poetryのインストールから説明します。


### Pythonインストール（asdfから）

基本的には以下のサイトの手順でOKです。
https://dev.classmethod.jp/articles/asdf-python-introduction/

```bash
# Python のプラグインとリポジトリを確認します
% asdf plugin list all | grep python
（出力↓）
python                       *https://github.com/danhper/asdf-python.git

# プラグインをインストールします。
% asdf plugin add python https://github.com/danhper/asdf-python.git

# プラグインがインストールできたか確認します。
% asdf plugin list
（出力↓）
python

# インストール可能なバージョン一覧を確認
% asdf list all python
（出力↓）
ズラズラと出てきます。

# 今回はPython3.11.9をローカルにインストールします。
# メモ：chromadbとの相性により3.12にできない。
% asdf install python 3.11.9
% asdf local python 3.11.9
% python --version
（出力↓）
Python 3.11.9
```

### poetryインストール（asdfから）

poetryのインストールもPythonと基本的な手順は一緒です。

```bash

% asdf plugin-add poetry
% asdf list-all poetry
（出力↓）
（中略）
1.8.3
% asdf install poetry 1.8.3
% asdf local poetry 1.8.3
% poetry --version
（出力↓）
Poetry (version 1.8.3)
```

### poetryのプロジェクト初期化
```bash

# poetry初期化（基本的に全部デフォルトで良い）
% poetry init

# 仮想環境の使用
% poetry config virtualenvs.in-project true --local

# pythonバージョン確認
% poetry run python --version
% poetry env list
```

### requirements.txtから依存パッケージをインストールする
```bash
cat requirements.txt | xargs poetry add
```
Unity ECS でメモリリークを調べる方法

# 概要
掲題の通りです。備忘として記述しています。

# 結論
Unity -> Preferences -> Jobs -> Leak Detection Level を `Enabled With Stack Trace` にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/eed5355f-f7f1-e250-9d0c-af410b2edfb2.png)

すると、実行時にConsoleにリークしてる情報が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163629/726e7176-77f5-8149-f05d-9d5c572893fb.png)

後はそれを潰していけばいいだけですね(白目)
【ST言語ことはじめ】シリンダ制御のサンプルプログラム

## はじめに
本記事では、PLCを用いたシリンダ制御のサンプルプログラムについて解説します。

## 使用機材

|   |機種など   |
|:---:|------|
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |
|アプリ  |GX Works 2    |

I/O割り付けは\[こちら\](https://qiita.com/so2/items/0f0cab2e324179718b89 "I/O割り付け表")を参照してください。

## サンプルプログラム

このプログラムは、ボタン1でサイクルを開始し、ボタン2で強制終了するシンプルな制御を行います。また、ボタン0が押されるとサイクル終了時にシリンダを停止します。

### ST言語

```st
IF X1 THEN
    M1 := TRUE;
END_IF;

IF X2 THEN
    M1 := FALSE;
    M2 := FALSE;
END_IF;

IF X0 THEN
    M1 := FALSE;
END_IF;

IF M1 AND X91 THEN
    M2 := TRUE;
END_IF;

IF X90 THEN
    M2 := FALSE;
END_IF;

YA0 := M2;
```

### ラダー図

```batch:ラダー図
  (+)                                               (-)
   |    X1        X2     M4                    M1      |
   +----|↑|---+---|/|----|/|-----------------(    )----+
   |          |                                        |
   |    M1    |                                        |
   +----| |---+                                        |
   |                                                   |
   |    M1        X91       X90                M2      |
   +----| |---+---| |---+---|/|--------------(    )----+
   |          |         |                              |
   |          |   M2    |                              |
   |          +---| |---+                              |
   |                                                   |
   |    X0        M1                           M3      |
   +----| |---+---| |------------------------(    )----+
   |          |                                        |
   |    M3    |                                        |
   +----| |---+                                        |
   |                                                   |
   |    M3     X91                             M4      |
   +----| |----| |---------------------------(    )----+
   |                                                   |
   |    M2                                    Y0A0     |
   +----| |----------------------------------(    )----+
   |                                                   |
```

## まとめ
本記事では、シリンダ制御のサンプルプログラムを紹介しました。このプログラムを参考にして、実際のプロジェクトでのシリンダ制御に活用してみてください。
【小ネタ】p5.toio を使ったプログラムの実行中に toio のバッテリー残量を確認する（開発者ツールのコンソールを利用する形）

以下の記事でも書いた「p5.toio」の話です。

- [p5.toio を使ったシンプルな p5.js のプログラム：接続中の toio の数の表示や move()、rotate() などによる走行 - Qiita](https://qiita.com/youtoy/items/f67e6a3624ec260f2022)
- [toio をブラウザ上から簡単制御！ p5.js用ライブラリの p5.toio の始め方（p5.js Web Editor上からの利用） - Qiita](https://qiita.com/youtoy/items/0544183ed0f0dba65f51)

内容は、p5.toio を使ったプログラムの実行中に toio のバッテリー残量を確認する、という小ネタです。
 
p5.toio を使った作品を那須で行われた展示イベントに出していた際、展示作品を動かしたまま、予備の toio との交換が必要そうなバッテリー残量になっていないかどうかを確認できないかと、今回の内容を試しました（※ 動作中のプログラムに手を入れず、とりあえずで確認できたらという目的）。
そして、その時にやってみた内容をメモとして記事に書いてみます。

https://twitter.com/youtoy/status/1756200027423469945

## 実行する処理や手順
実際に、実行した内容や手順について説明していきます。

用いた方法は「Chrome の開発者ツールのコンソールで、バッテリー残量を表示させる」というものです。p5.toio の処理としては以下となります。
https://tetunori.github.io/p5.toio/docs/cube/classes/p5tcube#batterylevel

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b3ba2ae4-2a0c-1909-cca4-7395d532e828.png)

具体的には、以下の赤線を引いた部分が、実際に試してみた時の処理内容・表示結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d3e09f02-a9cf-ac1b-49f4-994a9f8b7f69.png)

既に動作させていたプログラムの中身に関し、接続した toio を制御する際に用いていた変数は、[前回の記事](https://qiita.com/youtoy/items/f67e6a3624ec260f2022)のプログラムにも書いていた `gCubes` でした（また上記の状態では、3台の toio と接続済み）。

それで、開発者ツールのコンソールで、その変数 `gCubes` を利用しています。
例えば `gCubes[0].batteryLevel` や `gCubes[1].batteryLevel` と入力して実行することで、個々のバッテリー残量を示す値をコンソール上で確認できます。

その他、 `gCubes` とだけ入力して実行すると、接続済みの toio の情報を参照できます。

バッテリー残量について、1台ずつ確認するのではなく、まとめて確認する場合は、 `gCubes` を使い `for(c of gCubes) console.log(c.batteryLevel)` などとしても良いです。
これにより、接続済みの全ての toio に関するバッテリー残量の情報を得ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3748f8de-137e-7bf3-dd6c-36ff3f423b70.png)
世界の時間を表示する

世界中の時間を表示します。
worldsDataに場所と日本からの時差を入れます。

```html
<div id="world-time"></div>
```

```js
const worldsData = [
  {
    location: "東京",
    TimeDifference: 0
  },
  {
    location: "ベルリン",
    TimeDifference: -8
  },
  {
    location: "上海",
    TimeDifference: -1
  },
  {
    location: "ニューヨーク",
    TimeDifference: -14
  },
  {
    location: "ロサンゼルス",
    TimeDifference: -16
  },
]
const content = document.getElementById('world-time');

worldsData.forEach(function (world) {
  const now = new Date(new Date().getTime() + world.TimeDifference * 60 * 60 * 1000);
  const year = now.getFullYear();
  const month = now.getMonth() + 1;
  const day = now.getDate();
  const hour = now.getHours();
  const minu = now.getMinutes();
  
  const divElement2 = document.createElement('div');

  divElement2.innerHTML = `
  <ul>
    <li>${world.location}</li>
    <li>${`${year}年${month}月${day}日 ${hour}:${minu}`}</li>
  </ul>
  <br><br>
  `
  content.appendChild(divElement2)
});
```

#### 参考
https://www.pazru.net/js/date/3.html
システムの信頼性設計について

## 【問題】システムの信頼性設計に関する記述のうち，適切なものはどれか

+ [ア] フェールセーフとは，利用者の誤操作によってシステムがダウンしてしまうことのないように，単純なミスを発生させないようにする設計方法である
+ [イ] フェールソフトとは，故障が発生した場合でも機能を縮退させることなく稼動を継続する概念である
+ [ウ] フェールソフトとは，故障が発生した場合でも機能を縮退させることなく稼動を継続する概念である
+ [エ] フォールトトレランスとは，故障が生じてもシステムに重大な影響が出ないように，あらかじめ定められた安全状態にシステムを固定し，全体として安全が維持されるような設計手法である

## 【正解】ウ
フォールトアボイダンスは、システムを構成する要素を稼働率が高いものなど信頼性の高いものに取り換えることで、故障の発生確率自体を低下させ、システム全体の信頼性を向上させようという考え方です


- - -
応用情報技術者
平成27年秋期　問14
ABC340の記録

# はじめに
先週出られなかったので2週間ぶりの参加です。

https://atcoder.jp/contests/abc340

成績：ABC3完（600）
# A
AをBになるまでDずつ増やしていくとしか言いようがない。
while文で書いたが、range関数を出力すればそれでよかった。

```python:A
a, b, d = map(int, input().split())
ls = [a]
num = a
while num < b:
    num += d
    ls.append(num)
print(*ls)
```

# B
pythonのappendの仕様そのままなので、言われた通り実行していく。リストを後ろから見るときは-1番目からスタートなので考えやすい。
```python:B
q = int(input())
A = []
for i in range(q):
    n, k = map(int,input().split())
    if n == 1:
        A.append(k)
    if n == 2:
        print(A[-k])
```

# C
制約が$2\le n \le10^{17}$なので、愚直にやると全然間に合わない。
そこで、nを$\lfloor n/2 \rfloor$と$\lceil n/2 \rceil$に分割していく作業を考えると、$\lfloor log_2(n) \rfloor$回まではこの作業によって払う金額はn円で、最後の1回で払う金額は$2・(n-2^{\lfloor log_2(n) \rfloor})$となることに気づく。（証明はできていないが…）

という訳でこれを実装するのだが、桁数が大きくなるとlogが正しく機能せず1WAを喰らったので$\lfloor log_2(n) \rfloor$については数え上げで対応した。
```python:C
import math
n = int(input())
x = 2
cnt = 0
while x <= n:
    x = x*2
    cnt += 1
price = n * cnt
price += 2 * (n - 2**cnt)
print(price)
```

なお想定解はメモ化再帰であったらしい。nをすべて1にするまでに支払う金額をf(n)と定義すれば再帰的に解けるとのこと。
再帰関数の類はまだ馴染みがないのでグラフと合わせて勉強していく必要があるだろうな～。
```python:C-official
from functools import cache
@cache

def f(N):
    if N == 1:
        return 0 
    else: 
        return f(N//2) + f((N+1)//2) + N

n = int(input())
print(f(n))
```
ReactへのTailwindCSSの反映

# はじめに
CRA(create-react-app)でTailwindCSSを使う際の設定ポイントを纏める。

:::note info
インフォメーション
WindowsでエディタはCURSORを使用していますが、VSCodeでもいけると思います。
yarnを使用していますがnpmでもいけると思います。（適宜読み替えてください）
:::


## 大まかな手順
1. TailwindCSSとcracoをインストールする
1. tailwind.config.jsを設定する
1. postcss.config.jsを設定する
1. craco.config.jsを設定する
1. input.cssを用意する
1. package.jsonを設定する
1. input.cssにimportを設定する

## 1. TailwindCSS と craco をインストールする
ターミナルでコマンドを入力しTailwindCSSをインストールする。
```
yarn add tailwindcss postcss autoprefixer
```

次にcracoをインストールする。（指定の仕方が他と若干違うので注意）
```
yarn add @craco/craco
```

## 2. tailwind.config.jsを設定する
まずtailwind.config.jsを生成する。
```
npx tailwindcss init
```

そしてtailwind.config.jsを以下のように設定する。（あくまで参考です）
importantを付けるかどうか、contentのパスはお好みで。
```
/** @type {import('tailwindcss').Config} */
module.exports = {
  important: true,
  content: [
    './public/index.html',
    './src/*.{html,js,ts,tsx}',
    './src/**/*.{html,js,ts,tsx}',
  ],
  theme: {
    extend: {},
  },
  plugins: [],
};

```

## 3. postcss.config.jsを設定する
まずpostcss.config.jsを生成する。
```
npx tailwindcss init --postcss
```
そしてpostcss.config.jsを以下のように設定する。（あくまで参考です）
```
module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  },
}
```

## 4. craco.config.jsを設定する
tailwind.config.jsと同じフォルダにcraco.config.jsを作成し以下のように記載する。
```
module.exports = {
  style: {
    postcss: {
      plugins: [
        require('tailwindcss'),
        require('autoprefixer'),
      ],
    },
  },
};
```

## 5. input.cssを用意する
場所はある程度どこでもよいが、あまりtopフォルダにファイルを作成するのは好きではないので以下の位置にinput.cssを作成。
`src/css/tailwind/input.css`

ファイルの内容は以下の通り
```
@tailwind base;
@tailwind components;
@tailwind utilities;
```

`@tailwind` のところに波線が出て「Unknown at rule @tailwind」と表示されるが無視！
これ以降開くことはないので何も設定していないが、気になる人はsettings.jsonとかでlintのignoreなどを設定してエディタとしてワーニングが出ないようにする。
（そもそもlintを入れていない人はワーニングでないと思う）

## 6. package.jsonを設定する
このままだと `yarn start` をする前に毎回TailwindCSSのCSSファイルを作成するコマンドを実行する必要があるが、だるいので `yarn start` の時に自動的にoutput.cssを作成するように変更する。
```
  "scripts": {
    "start": "BROWSER=none react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
```
上記の部分を以下のように変更する。
```
  "scripts": {
    "build:tailwind": "tailwindcss -i ./src/css/tailwind/input.css -o ./src/css/tailwind/output.css --watch",
    "start": "yarn run build:tailwind & BROWSER=none craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "craco eject"
  },
```
* tailwindcssコマンドを利用して、TailwindCSSのビルド結果を `/src/css/tailwind/output.css` に出力している
* `start` のところで、先に `build:tailwind` を実行してから開始している（`BROWSER=none` は `yarn start` 時にブラウザが自動的に起動しない設定。　今回の件とは関係ない）
* cracoを使ってReactとTailwindCSSを統合している

## 7. index.jsにimportを設定する
`/src/index.js` に ~~`input.css` と~~ `output.css` をimportしTailwindCSSが反映されるようにする。
```
import './css/tailwind/output.css';
```
【ChatGPT有＋DALL-E3】画像DLのファイル拡張子が違う！


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

　今回は、画像ダウンロードのファイル拡張子が違うことに気付いた、という話です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　本日は、建国記念の日。

　働く方々、
　　ありがとうございます。

　お休みの方々、
　　どうぞ、ごゆっくり。
***
　今日はワンフェスですね。
　　ワンダーフェスティバル2024
　　　開催日です。晴れて良かった。

　造形・フィギュアの祭典です。

　場所は幕張メッセ。
　開始は、12時。終了17時。

　売る人、買う人、頑張って！

　これを終えれば、ひと息つける！
***
　さてと、
　　本題です。

　先日（2024/02/09）、
　　画像ダウンロードすると、
　　　PNGだった仕様が、
　　　　WebPになった、と
　　　　　報告しました。
[【ChatGPT有＋DALL-E3】で作成した画像をダウンロードすると、ファイルの拡張子が変わっていた。](https://qiita.com/kabumira/items/2dfef0b57bf9c98bf5fc)

　まぁ、それはそれで
　　大変なことだったのですが……
***
　今朝（2024/02/11）、
　　違う点に、
　　　気付いてしまったのです。
　　　　それを報告します。

　それはたまたまでした。

　私は毎朝、
　　アプリ版を開いて、
　　　履歴整理をしています。

　今朝は
　　必要だったので、
　　　ダウンロードも
　　　　アプリ版でしました。

　Googleフォトで
　　確認していたら
　　　ファイル拡張子が
　　　　JPGになっています。

　それから
　　念のために
　　　別の画像を
　　　　ダウンロードしましたが
　　　　　すべてJPGに
　　　　　　なっていました。

　どうやら
　　それがアプリ版の仕様の
　　　ようですね。

　まとめると
　　Web版で行なうと、　WebP
　　アプリ版で行なうと、JPEG
　　　になります。

　画像のアップロード程度ならば、
　　気にする必要はありません。

　でも、画像を加工する際には
　　対応策を考える必要があります。

　アプリやサービスが
　　対応していないことも
　　　考えられます。

　まぁ、
　　対応していない、というのは
　　　最近のものであれば、
　　　　大丈夫だとは
　　　　　思いますが。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【Rails】local: trueとは？

# local: trueとは
Railsにおける`local: true`は、リンクやフォームなどのHTML要素で使用されるオプションの一つで、リンクやフォームの送信をローカルなリクエストとして扱うことを指定します。

通常、Railsではリンクやフォームを生成する際に、外部のURLや他のサーバーに対してリクエストを送信するようになっています。しかし、`local: true`を使用することで、そのリンクやフォームの送信を現在のアプリケーション内で処理されるローカルなリクエストとして扱います。

例えば、以下のように`link_to`ヘルパーを使用してリンクを生成する際に`local: true`を指定することができます。
```html
<%= link_to "Home", root_path, local: true %>
```
この場合、`root_path`へのリンクがクリックされたときに、そのリクエストはローカルなリクエストとして処理されます。つまり、ページ遷移が発生せず、**現在のページ内でリクエストが処理される**ようになります。

このオプションは、特にAjaxを使用してページの一部を非同期的に更新する場合などに便利です。ページ全体を再読み込みせずに、必要なデータをローカルで取得し、動的に表示することができます。
Geminiの画像解析使ってみたら、またこれ簡単すぎる。そしてちょっと怖い。

こんにちは。
話題のGeminiを軽ーく触ってみました。

下記で、簡単に画像の解析ができました。
```python
from langchain_core.messages import HumanMessage
from langchain_google_genai import ChatGoogleGenerativeAI

image_url = "イメージへのURL"

# Geminiを初期化
llm = ChatGoogleGenerativeAI(model="gemini-pro-vision")

# Geminiに送る文章の作成
message = HumanMessage(
    content=[
        {
            "type": "text",
            "text": "この画像は何ですか？",
        },
        {"type": "image_url", "image_url": image_url},
    ]
)

# 結果を表示
print(llm.invoke([message]).content)
```
[Geminiのセットアップ](https://zenn.dev/open8/articles/tried-using-gemini)

私のQiitaのトプ画を送ると下記が返ってきた。
> これは、一人の男性がビーチで撮った写真です。彼は白いシャツを着て、赤いバッグを腰に巻いています。彼はサングラスをかけていて、とても幸せそうです。後ろにはヤシの木が生えています。

「とても幸せそう」らしいです。笑
こういう感情も含めて画像から抽出できるのは本当にすごい。

# 番外編

同じ画像に対して、下記を聞くと・・・・
```python
message = HumanMessage(
    content=[
        {
            "type": "text",
            "text": "この画像はどこかわかりますか？頑張って推測して下さい。",
        },
        {"type": "image_url", "image_url": image_url},
    ]
)
```

> これはシンガポールのセントーサ島の写真です。

と返ってきて、まじびびった・・・・そしてちょっと怖い。
【Node.js】Error: error:0308010C:digital envelope routines::unsupportedの解決法

# Reactのwebアプリをローカルサーバーで起動できなくなった
あるwebサイトを久しぶりにアップデートしようと手を加えて確認しようとした。

```
$ npm start
```

すると見たことも無いエラーが表示されたのである。。。:rolling_eyes:

```console
Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:69:19)
    at Object.createHash (node:crypto:138:10)
    at module.exports (/home/yonas/git/server/ui/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/home/yonas/git/server/ui/node_modules/webpack/lib/NormalModule.js:417:16)
    at /home/yonas/git/server/ui/node_modules/webpack/lib/NormalModule.js:452:10
    at /home/yonas/git/server/ui/node_modules/webpack/lib/NormalModule.js:323:13
    at /home/yonas/git/server/ui/node_modules/loader-runner/lib/LoaderRunner.js:367:11
    at /home/yonas/git/server/ui/node_modules/loader-runner/lib/LoaderRunner.js:233:18
    at context.callback (/home/yonas/git/server/ui/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
    at /home/yonas/git/server/ui/node_modules/react-scripts/node_modules/babel-loader/lib/index.js:59:103 {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node.js v18.17.1
error Command failed with exit code 1.
```

**何だこれは**

# node.jsのバージョンを上げていたことが原因だった

以前までは問題なく`npm start`ができていたのに、急にできなくなったので環境の問題かな〜と思っていたらその通りでした。。。

## OpenSSLがバージョンアップしていた

https://nodejs.org/en/blog/release/v17.0.0/

Node v17.0.0以降では「OpenSSL 1.1.1」に替わって「OpenSSL 3.0」が収録されるようになりました。

プロジェクトで使っているあるライブラリが、**サポートしていないOpenSSLのバージョンを使っているということ**でエラーになってるぽいです:frowning2:

Node.jsが暗号化関連の操作（ハッシュ関数など）を行おうとしたとき、その操作がサポートされていないということですね。

## OpenSSLとは？？

>ハッシュ、共通鍵暗号、公開鍵暗号、署名に関する機能を集約したソフトウェアです。
秘密鍵、公開鍵、サーバ証明書、クライアント証明書を作成する際などに利用されます。
現時点(2022年4月)の最新版は 3.0.2 ですが、Ubuntu 20.04 や RHEL8 ではデフォルトで 1.1.1 がインストールされます。
Ubuntu 22.04(LTS) からは 3.0.2 となるようです。
1.x 系は OpenSSL License (Apache License Version 1.0 ベース) 及び SSLeay License (四条項BDSライセンスベース) が適用されます。
3.x 系は Apache License Version 2.0 ライセンスとなります。
https://www.tohoho-web.com/ex/openssl.html


node.jsでウェブサーバーを実装する時には、 HTTPS 通信時にサーバ証明書が必要です。それらの色々をやってくれる存在って感じですかね！（間違ってたらすいません！）

# 解決策
じゃどうすれば`npm start`できるんじゃい？ということで、一番簡単な解決策は
「Node.jsに旧式のOpenSSLプロバイダを使用するよう指示する」ということらしいです。

ターミナルで👇のコマンドを実行

```
$ export NODE_OPTIONS=--openssl-legacy-provider
```

これだけで解決します！

**※ただし、この設定はそのターミナルセッションにのみ適用され、ターミナルを閉じるとリセットされます。**

https://stackoverflow.com/questions/75167770/error-error0308010cdigital-envelope-routinesunsupported-node-js-v19-4-0

では他に解決法はあるのか？

 もし`react-script`を使ってる場合

```console
$ npm i react-scripts@latest
```

私の場合、これで毎回ターミナルで👇のコマンドを実行しなくてもいいようになりました。

```
$ export NODE_OPTIONS=--openssl-legacy-provider
```

他にも`package.json`のスクリプト部分に直接設定することも可能なようです。

```json:package.json
"scripts": {
  "start": "react-scripts start --openssl-legacy-provider"
}
```
【JavaScript】同期通信と非同期通信の違い

# 同期通信・非同期通信とは
同期通信と非同期通信は、コンピュータサイエンスやネットワーキングの文脈で使われる用語で、それぞれ異なる動作や処理の方式を指します。
# 同期通信（Synchronous Communication）
- 同期通信では、処理が順番に実行され、次の処理は前の処理が完了するのを待ちます。つまり、一つの処理が終了するまで次の処理が開始されません。
- シンプルで直感的なプログラミングが可能ですが、処理が完了するまで他のタスクを実行できないため、効率が悪い場合があります。
- 典型的な例は、関数の呼び出しやファイルの読み込みなどです。
# 非同期通信（Asynchronous Communication）
- 非同期通信では、処理の完了を待たずに次の処理が開始されます。つまり、複数のタスクが同時に実行され、結果が返ってくるまで待つ必要がありません。
- ファイルの読み込みやネットワークリクエストなど、長時間かかるタスクを効率的に処理するために使用されます。
- 典型的な例は、コールバック関数やプロミス、非同期関数（async/await）などです。

以下は、同期通信と非同期通信の例です。

**同期通信の例（JavaScript）**
```js
console.log("Start");
function syncFunction() {
    console.log("Sync function");
}
syncFunction();
console.log("End");
//Sync function
//End
```
**非同期通信の例（JavaScript）**
```js
console.log("Start");
setTimeout(function() {
    console.log("Async function");
}, 2000);
console.log("End");
//End
//Sync function
```
非同期通信の場合、`setTimeout`関数は2秒後に実行されますが、`console.log("End")`はそれを待たずにすぐに実行されます。