OmniAICreator/Qiita-1.07M huggingface dataset:
CircleCI で Ubuntu 14.04 と 16.04 を利用した実行があれば 2022/05/31 迄に Ubuntu 20.04 以降に移行しましょう


## はじめに

CircleCI で Ubuntu 14.04 と 16.04 を利用した CI/CD 実行が 2022/05/31 以降行えなくなることが発表されました
メンテナンスできてない workflow 等がもしあれば を検討しましょう

## なぜこの記事を書いたか

CircleCI タグを付け投稿される Qiita 記事の多くに対応が必要になる記述が多く、意外と認識されていない可能性があると思ったのて作成しました

https://qiita.com/tags/circleci

## なぜ利用できなくなるか

> CircleCI is committed to providing you and your team with the most stable and secure experience possible. Deprecating our Ubuntu 14.04 and 16.04 images in favor of newer versions has several benefits, including improved upstream support and stronger security and compatibility for your Linux VM-based pipelines.

詳細は Reference 記載の公式 Blog を参照していただきたいですが、Ubuntu のサポートも終了している古いイメージのメンテナンス/サポートすることは多くのコストがかかること
新しいバージョンを採用することで、アップストリームサポートの改善、LinuxVM ベースのパイプラインのセキュリティと様々な互換性の強化などのいくつかの利点があり今回のアナウンスに至ったようです

## 廃止対象バージョン

公式 Blog には以外のバージョンが対象と記載されていました
また、 `machine: true` と記載している場合 2022/05/31 以降 Ubuntu 22.04 が利用されます

### Ubuntu 14.04 のイメージ

- machine: true
- circleci/classic:201703-01
- circleci/classic:201707-01
- circleci/classic:201708-01
- circleci/classic:201709-01
- circleci/classic:201710-01
- circleci/classic:201710-02
- circleci/classic:201711-01
- circleci/classic
- circleci/classic:latest
- circleci/classic:edge

### Ubuntu 16.04 のイメージ

- circleci/classic:201808-01
- ubuntu-1604:201903-01
- ubuntu-1604:202004-01
- ubuntu-1604:202007-01
- ubuntu-1604:202010-01
- ubuntu-1604:202101-01
- ubuntu-1604:202104-01

## 対象のバージョンを利用している場合

引き続き VM を継続利用する場合は、 Ubuntu 20.04 または Ubuntu 22.04 を利用するよう変更をします
また、Docker を利用できる場合は、 Docker machine executer 等に移行するのも 1 つです

イメージが、今後利用できないことを認識してもらえるよう、該当イメージを利用している場合 2022/03/29,
2022/04/26 の 2 日 10 分 から 1 時間程度 Job の実行ができなくなります

### 移行方法について

移行方法については、以外公式ドキュメントを参考に実施してください 🙏
Middleware 等バージョンにも差異が生じるためすべて記載することが難しく省略させていただきます

https://circleci.com/docs/2.0/images/linux-vm/14.04-to-20.04-migration/

https://circleci.com/docs/2.0/images/linux-vm/16.04-to-20.04-migration/

## Reference

https://circleci.com/blog/ubuntu-14-16-image-deprecation/

https://circleci.com/blog/why-brownouts/

## 追記

### 2022/04/11

CircleCI さんからも日本語アナウンスが公開されたようです 🙏

https://discuss.circleci.com/t/ubuntu-14-04-16-04-ubuntu/43634
【Rust】AWS LambdaでDynamoDB検索


AWS LambdaをRustで実装する際のサンプルコードが少なすぎるのでメモ

# 内容

DynamoDBの検索（スキャン）
例として、とある学校の生徒管理テーブルから指定した部活に所属する生徒の氏名一覧で取得することを考える。

- テーブル名：students_table
    - 項目1：name（氏名）
    - 項目2：club（部活）

# コード

```toml:Cargo.toml
[package]
name = "sample"
version = "0.1.0"
edition = "2021"

[dependencies]
aws-config = "0.9.0"
aws-types = "0.9.0"
aws-sdk-dynamodb = "0.9.0"
lambda_runtime = "0.5.1"
serde_json = "1.0.79"
tokio = "1.17.0"
```

```rust:main.rs
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_dynamodb::model::AttributeValue;
use aws_sdk_dynamodb::Client as DdbClient;
use aws_types::region::Region;
use lambda_runtime::{service_fn, Error, LambdaEvent};
use serde_json::{json, Value};
use std::process::exit;

#[tokio::main]
async fn main() -> Result<(), Error> {
    let func = service_fn(func);
    lambda_runtime::run(func).await?;
    Ok(())
}

async fn func(_event: LambdaEvent<Value>) -> Result<Value, Error> {
    // DynamoDBクライアント用意
    let region_provider = RegionProviderChain::first_try(Region::new("ap-northeast-1"));
    let shared_config = aws_config::from_env().region(region_provider).load().await;
    let client = DdbClient::new(&shared_config);

    // 検索
    let club = "baseball"; // 検索対象（野球部）
    let names = match client
        .scan()
        .table_name("students_table")
        .filter_expression(format!("club = :val"))
        .expression_attribute_values(":val", AttributeValue::S(club.into()))
        .send()
        .await
    {
        Ok(output) => {
            println!("Found {} items from DynamoDB", output.count());
            let mut names: Vec<String> = Vec::new();
            // 検索結果一覧取得
            let items = output.items().unwrap();
            // name取り出し
            for item in items {
                names.push(item["name"].as_s().unwrap().clone());
            }
            names
        }
        Err(e) => {
            println!("Got an error while scanning DB: {}", e);
            exit(1);
        }
    };

    // 検索結果を表示
    for name in names {
        println!("{}", name)
    }

    Ok(json!({ "message": "success" }))
}
```
ついにUnrealEngine5が正式リリース

#ついにUnrealEngine５が公開

ついにUnrealEngine５が正式に公開されました。
ビジュアル面での計算性能も向上しており、ベータの機能はしっかりそのまま残されているようです。

詳しくは下記ページに掲載しております
https://www.gamerspal.net/ue5%e3%81%8c%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e9%96%93%e8%bf%91-%e6%9c%80%e9%ab%98%e3%81%ae%e6%96%b0%e6%a9%9f%e8%83%bd%e3%81%a8ue4%e3%81%a8%e3%81%ae%e9%81%95%e3%81%84/
ソフトウェアRAIDのファイルシステムをext3からext4に変更

# あらすじ
3TB x 4 (ext3) でソフトウェアRAID(raid5)を組んでいたが、一本ずつ6TBに入れ替え、いざ領域拡張！というところで失敗した。

https://qiita.com/t_mozomozo/items/557f29815e7bf8add75b

# 解決策
ext3 はファイルシステムとして16TBまでしか扱えない(ブロックサイズ4KBの場合)。
ext4 に変換することで領域の拡張が可能となる。

:::note warn 
注意
下記で今回うまくいったが、データ消失の可能性もあるのでバックアップは必ず取っておくこと。
:::

# 手順
### ext3からext4に
```
# umount /dev/md0
# fsck.ext3 -pf /dev/md0
# tune2fs -O extents,uninit_bg,dir_index /dev/md0
# fsck.ext4 -yfD /dev/md0
```
umount … マウントしてたらアンマウント
fsck.ext3 … ext3のファイルシステムチェック。-pは自動修復 -fはforce
tune2fs … extファイルシステムのパラメータ変更。-Oで属性をセット
fsck.ext4 … ext4のファイルシステムチェック。-yはyes、-fはforce、-Dはディレクトリの最適化

ファイルシステムを変更したので /etc/fstab の記述を変更。
ext3 としていたところを ext4 に。
```
# vi /etc/fstab
/dev/md0                /data                   ext4    defaults        1 2
```
### 領域拡張
```
# tune2fs -O 64bit /dev/md0 
# e2fsck -f /dev/md0
# resize2fs -b /dev/md0
# e2fsck -f /dev/md0
# resize2fs -p /dev/md0
# mount /dev/md0
```
tune2fs -O 64bit /dev/md0 … 64bitフラグを /dev/md0 で有効化
e2fsck … ファイルシステムのチェック。-f はforce
resize2fs … ファイルシステム変更。 -b で64bitにコンバート
e2fsck … 変更が完了したら再度ファイルシステムをチェック
resize2fs … リサイズの実行。-p はプログレス表示
mount … マウント

### 結果
```
# df -h | grep /dev/md0
/dev/md0                   17T  7.7T  7.8T   50% /data
```
増えた。

# 実は詰まった部分
linux のバージョンが古いと resize2fs の -b オプションが存在せず実行できない。
e2fsprogs というものに含まれているとのことで、最新版を入れてやる。
```
# git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
# cd e2fsprogs/
# mkdir build
# cd build/
# ../configure --prefix=/usr/local
# make
# make check
# make install
```
既存のほうを参照してしまう場合はフルパスで実行。
```
# /usr/local/sbin/tune2fs -O 64bit /dev/md0
# /usr/local/sbin/e2fsck -f /dev/md0
# /usr/local/sbin/resize2fs -b /dev/md0
# /usr/local/sbin/e2fsck -f /dev/md0
# /usr/local/sbin/resize2fs -p /dev/md0
```

# お世話になったページ

https://documentation.suse.com/ja-jp/sles/12-SP3/html/SLES-all/cha-raid-resize.html

https://documentation.suse.com/ja-jp/sles/12-SP3/html/SLES-all/cha-resize-fs.html

https://www.novell.com/ja-jp/documentation/sles11/stor_admin/data/resizeincr.html

https://askubuntu.com/questions/390823/how-do-i-get-more-than-16tb-out-of-ext3

https://serverfault.com/questions/312724/convert-a-software-raid-volume-from-ext3-to-ext4-or-ext2

https://askubuntu.com/questions/779754/how-do-i-resize-an-ext4-partition-beyond-the-16tb-limit

https://qiita.com/eru_tndl/items/e616284a2027d615f2ad
基本情報技術者試験対策　27日目

基本情報技術者試験勉強　27日目
-
この記事の目的
-
今年の5月に基本情報技術者試験を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

プロフィール
-
・文系大学の３年生
・ITパスポートは保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

今日の目標
-
今日も引き続き、午前問題を中心に取り組む。実際の試験と同じように80問取り組む。

間違った箇所
-
1、MOT(Management of Technology)
技術開発の成果によって事業利益を獲得する

2、ロックの粒度
データベース、表、物理的な出力単位であるブロック、行といったロックをかける資源を指す
ロックの範囲が狭い　→ トランザクションの並列処理が増すが、CPUの負荷が増す。
反対に粒度が大きいと、スループットが低下

3、標準タスク法
開発プロジェクトで必要な作業のWBSを作成し、各作業の工数を見積もる

4、疑似法
過去の類似例を探し、その実績と際などを分析評価して開発規模を見積もる

5、垂直パリティチェック
１ビットの誤りを検出できる

6、傾向分析（トレンド分析）
資源の使用状況やサービスのパフォーマンスに関するデータを収集し、それらの推移を分析することで将来予測を行おうとする手法

7、ベースラインモデル
モデル化の第一段階として、現在達成されているパフォーマンスを正確に反映したモデルを作成


振り返り
-
改善したいこととして、目標である80問を取り組むことができなかったことと計算問題も間違った箇所があったが、うまくまとめることができず、記載することができなかった。次は、80問解きたい！

>引用
基本情報技術者試験ドットコム
https://www.fe-siken.com
Pythonで変数名を文字列として扱う方法

# はじめに
pythonを扱っていて、ログの解析や処理の実行中に変数の中身がどうなってるのか調べたいことありますよね？
デバッガを使うのが一番簡単なのですが、
処理の中で頻繁に値が変わったり作動中のログに変数Aには何の値が今入ってるのか調べるには、実際に変数名と値を出力するのが一番簡単だと思います。

## locals(), globals()を使わない

python 変数名 取得　などで調べるとまず出てくるのが 組み込み関数のlocals(), globals()を用いる方式です。
現在使用してる名前空間(シンボルテーブル?)にアクセスして、変数名と一致するものを探索して取得する方法です。

参考: https://qiita.com/ragnar1904/items/55a21c521858802dc501

```python
def hoge():
    for variable_name, value in locals().items():
        print(f"{variable_name} -> {value}")
```
現在の全ての変数名、値に対して取得する場合については良いですが、特定の変数名についてのみ変数名、値を取得する方法としては微妙かなと思いました。


## 取得方法

一通り調べてみた結論として、変数名そのものを取得する方法はなさそうだということに。

ジョージ・ジョースターⅠ世は言いました。
「逆に考えるんだ。」
逆転の発想で、変数名から値を取ればいいじゃないか。

pythonでは `eval`という関数があります。文字列を式として扱う関数です。引数に変数名を与えるとその変数の値を返します。

以下のような使用方法で、変数名を文字列として扱えます。
(やってることは変数名の文字列を変数として扱ってるだけですが、やりたいことを満たすことはできると思います。)

```python
def print_name_value(_str):
    print('{}: {}'.format(_str, eval(_str)))

hoge = 0
print_name_value('hoge')

# 出力
>> hoge: 0
```


# 参考
https://qiita.com/ragnar1904/items/55a21c521858802dc501
「量子もつれ」をわかりやすく解説


## ヤフーニュース
最近、「国産量子コンピューター、初号機を今年度中に」という記事がヤフーニュースで出ましたね。
https://news.yahoo.co.jp/pickup/6423110

私自身、量子力学は全くの専門外なので、とっかかりのイメージだけお伝えできればと思っています。
詳細は専門系のサイトにお任せします。

## 量子コンピュータ　って、何？
簡単に言えば、ものすごく処理速度が速いコンピュータの事です。

なぜ処理速度が速いのか、その理由の一つの事象に「量子もつれ」と言われるものがあります。

## 量子もつれ　って、何？
ここの理解がネット情報だと正直、私には難しすぎたので、私なりに調査した内容を中学生でもわかるレベルで落とし込みたいと思います。

その前に、重要な前提知識があります。

「ドラゴンボール」はご存じでしょうか？
そう、それだけでいいのです。

キャラクターである「ピッコロ」、「神様」この二人（二匹？）の関係性です。

この二人は「運命共同体」でしたよね。
片方が死ねば、もう片方も同時に（？）死んでしまう。
※同時にという方が話が速いのでそう理解してください

「量子もつれ」とはまさにこの事象なのです。

2つの量子が強力な相関関係にあり、片方の状態によって、もう片方の状態が同時に確定する、というものです。
それが、どんなに距離が離れていても、です。
何千光年離れていてもです。
光の速さを超えて、情報が伝達する、というのが「量子もつれ」なのです。

そして、これは「なぜ光の速さを超えて、情報が伝達するのか」という質問は野暮で、
「そういうものだから」という位置づけになっているようです。

さらに、これは「死後の世界」への足掛かりとなる「量子脳理論」という少しスピリチュアルな
内容にもつながるようです。

人の意識は量子でできており、死によって、「宇宙＝神」に観測され、「神」の一部に戻っていく、
とかそんな話のようです。
よくわかりませんが、大体。

ここから先は、理系の詳しいサイトをご覧ください！
JupyterLabでPlotlyを使うとグラフが表示されない件

JupyterLabでPlotlyを使うとグラフが表示されず、対応に時間がかかったので覚書

### 環境
macOS Catalina 10.15.7
python3.8.0

### 対応
①  Node.js (安定版)をインストール(Homebrew使う)
```shell
brew install nodebrew
nodebrew setup
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
source ~/.bash_profile
nodebrew install stable
#最新版をインストールしたいときは
#nodebrew install latest
```
② JupytarLabの機能を拡張
```shell
jupyter labextension install jupyterlab-plotly;
```

### 参考URL
https://www.webdesignleaves.com/pr/jquery/node_installation_mac.html

https://qiita.com/hasoya/items/0e4d260592dcc36285f2
GitHub issue(やPullRequest)テンプレートの作成方法

# 概要
IssueやPullRequestを作成するときに共通のテンプレートを使用できるように、設定する方法をアウトプットします。

## Settingsを選択する
![スクリーンショット 2022-04-09 22.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226343/3b02a6d3-e958-e818-eaf6-23c1649356d0.png)

## 「Set up templates」を押下する
![Setup_templates.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226343/a4f3a9e9-092d-e031-2b42-8dfc4c344042.png)

## 「Add template: select ▼」からテンプレートを作成する
![add_template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226343/249ed640-2a78-f268-767f-55477f0e9b86.png)

## 作成したテンプレートの「Preview and edit」→「編集アイコン」から編集画面に移行する
![add_template_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226343/b9ef12fd-e3e2-64f8-7789-59733911f65e.png)

## テンプレート内容を編集後、commitする
![commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2226343/d2f3a94b-9a71-4df9-e6dd-d86289e1c289.png)

commitメッセージや、ブランチを指定した後、commitする。


## 全体のリポジトリに対して、テンプレートを反映させる
1.```public```で```.github```リポジトリを作成する。
2.先に記載した```Settingsを選択する```からの手順を行う。
HTTPS接続を実装してみた(Tomcat)

# はじめに

こんにちは、山田です。
現在関わらせていただいている案件で、TomcatでHTTPS接続を実施したので記載していきます。

# TOmcatのインストール
以下のTomcatのサイトより、ダウンロードリンクのアドレスをコピーします。
今回は、tar.zipを使用します。
https://tomcat.apache.org/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/990d9e5f-ed0c-23b4-d718-4bbffb7a75d0.png)

対象のサーバにログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/b7933e78-f0b2-d694-1145-f113bc6230c6.png)

先ほどコピーしたダウンロードリンクを使用し、Tomcatをダウンロードします。

```python
wget https://ftp.postgresql.org/pub/source/v13.4/postgresql-13.4.tar.gz
```

tarコマンドを用いて、ファイルを展開します。

```
tar -xvzf postgresql-13.4.tar.gz
```

# https接続の有効化
/tmcat9/conf/server.xmlに以下の記述を追加します。

```
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               scheme="https"
               secure="true"
               clientAuth="false"
               sslProtocol="TLS"
               sslEnabledProtocols="TLSv1.2,TLSv1.1,TLSv1"
               keystoreFile="使用する証明書のパス" keystorePass="使用する証明書のパスワード" />
```
/tmcat9/conf/startup.shを実行して、Tomcatを起動させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/692783d6-9132-be3d-cf49-93a0d0438340.png)

# 動作確認
https://IPアドレス:8443で接続します。
以下のTomcatの画面が表示されれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/4b4c8fd0-01d1-1713-4a44-ed0f2f4b4308.png)
【Cordova】"duplicated with element declared at AndroidManifest.xml"の対処方法



# 事象

CordovaプロジェクトをAndroid用にビルドしようとしたところ、以下のようなエラーに遭遇。

```sh
$ cordova build android
...
> Task :app:processDebugMainManifest FAILED
<my-app-dir>/platforms/android/app/src/main/AndroidManifest.xml:17:5-90 Error:
        Element uses-permission#android.permission.CAMERA at AndroidManifest.xml:17:5-90 duplicated with element declared at AndroidManifest.xml:16:5-65
<my-app-dir>/platforms/android/app/src/main/AndroidManifest.xml Error:
        Validation failed, exiting

See http://g.co/androidstudio/manifest-merger for more information about the manifest merger.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:processDebugMainManifest'.
> Manifest merger failed with multiple errors, see logs

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org`
...
```

上記エラー文で大事なのはこの部分

```sh
Element uses-permission#android.permission.CAMERA at AndroidManifest.xml:17:5-90 duplicated with element declared at AndroidManifest.xml:16:5-65
```

つまりは "AndroidManifest.xml 内で uses-permission#android.permission.CAMERA の要素が重複してますよ" ってこと。


# 原因
調べてみたところ、自分のプロジェクトで使用する以下2つのプラグイン内でそれぞれカメラアクセスを求めており、その記述方法が微妙に異なっていたため、両方が AndroidManifest.xml に書き込まれてしまいエラーの原因になっていた。

- cordova-plugin-qrscanner

```plugins/cordova-plugin-qrscanner/plugin.xml
<uses-permission android:name="android.permission.CAMERA" android:required="false" />
```

- cordova-plugin-flashlight

```plugins/cordova-plugin-flashlight/plugin.xml
<uses-permission android:name="android.permission.CAMERA" />
```

このくらいCordova側でうまく調整してほしいが無理みたい。


# 解決方法

まずは各プラグインのplugin.xmlの記述方法を統一。今回は cordova-plugin-qrscanner を修正。

```plugins/cordova-plugin-qrscanner/plugin.xml
<!-- <uses-permission android:name="android.permission.CAMERA" android:required="false" /> -->
<uses-permission android:name="android.permission.CAMERA" />
```

次に変更を反映させるためにAndroidプラットフォームを一度削除してから再追加。

```sh
$ cordova platforms remove android
$ cordova platforms add android
```

これで改めてビルドすればうまくいくはず。
with torch.no_grad():　とは何か

trainingの後で、モデルをテストするパートに書かれるアレです。

```python
with torch.no_grad():
    for data, target in loaders['test']:
        ...
```
こんな感じ.

この記事では、
1. torch.no_grad()の役割
1. withとは何か（pythonの文法）

について説明します。

### 1. torch.no_grad() について

* そもそもTensor型の変数とは
ndarrayのように行列やベクトルを扱えることに加えて、GPUを使え、勾配情報を保持することができる変数のこと。```requires_grad=True```で勾配保持、```=False```で保持しない選択ができる。

```python
x = torch.ones(2,2,requires_grad=True)
print(x)

---出力---
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
```

さて、勾配情報はモデルのトレーニング時に重みの更新に使われるが、テスト時には必要ない。そこで```with torch.no_grad()```ブロックで定義されたテンソルは全て、```=False```とされる。これはメモリ消費量減に貢献する。

ここで少し寄り道。よく似たものに、```optimizer.zero_grad()```というものがある。PyTorchでは、次のバッチの勾配を計算するときも前の勾配を保持している。即ち、
$$今回のgrad = 前計算したgrad + 今計算したgrad$$ となっている。
RNNを除いて、これをバッチ毎に勾配を０に初期化することで、正しい計算ができる。

話を戻そう。
ところで、```with```ってなんだ？？？

### 2. withとはなにか

[この記事](https://blog.mtb-production.info/entry/2018/04/10/183000)を参考に書きます。

```with```文は、煩雑なコードになりがちなtry/finally文をwith一つでスッキリさせるために生まれた。また、context managerによって定義されたメソッドでラップするために使うことができる。ファイル操作や通信関係のプログラムでよく見るのは、close()といった後処理を書く必要がないためにエラーやバグを減らすことができるからなのだ。
　ここでcontext managerは、```__enter__()```と```__exit__()```メソッドを持っていて、それぞれwithブロックに入るときと、そこから抜けるときに実行される。

では、それらのメソッドはどんな処理をするのか？？？

今後追記します。
Xcode13.3 + CarthageでXCframeworkへ移行 

Xcode13.3 + Carthageでビルド形式をframeworkからXCFrameworksに移行しました。

## ポイント

* carthageのビルドオプションに--no-use-binariesを指定
    * XCframework形式でバイナリ配布していないライブラリがあるため
* General - Frameworks, Libraries, and Embedded Contentで、carthageで管理してるライブラリのEmbedを「Do Not Embed」から「Embed & Sign」に変更

##


Xcode12以降、Carthageでビルドが通らなくなり、以下のいずれかの対応が必要でした。

* XCFrameworkに移行する
* こちらの[回避策](https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md)のシェルでビルドする

XCode12の時はxcframeworkへの移行が一筋縄では行かなかったことがあり、回避策のシェルを使う形で対応していましたが、Xcode13へのアップデートで回避策を適用してもビルドエラーが発生するようになり*1、この機会にXCframeworkへの移行に再トライしました。

*1 現在はこちらの[PR](https://github.com/Carthage/Carthage/pull/3248)でXcode13向けの対応がされています

一応公式のREADMEでframework形式からXCFrameworks形式への[移行手順](https://github.com/Carthage/Carthage#migrating-a-project-from-framework-bundles-to-xcframeworks)の記載があるのですが、自分の環境では追加で対応が必要でした。

* Carthage/Buildフォルダの削除
* --xc-frameworksオプションを追加してビルド
* Build Phaseからcarthage copy-frameworksの削除
* General settingsのFrameworks, Libraries, and Embeddedで、frameworkを削除し、ビルドしたXCFrameworksを追加

## carthageのビルドオプションに--no-use-binariesを指定

carthageはライブラリ提供元でバイナリが配布されている場合、ビルドが不要になることがメリットなのですが、framework形式のみで配布しているライブラリも沢山あります。

この場合、--xc-frameworksオプションを指定してもビルドが実行されず、XCFrameworkが生成されません。

--xc-frameworksと合わせて、--no-use-binariesを指定してバイナリは使用せずソースからビルドすることで、確実にXCFrameworkが生成されます。

```
carthage update --platform ios --use-xcframeworks —no-binaries
```

## Embedded Contentを「Do Not Embed」から「Embed & Sign」に変更

General - Frameworks, Libraries, and Embedded Contentで、framework形式の場合は、Do Not Embedを選択していました。

Do Not EmbedのままXCFrameworkを指定するとビルドは通るのですが、起動するとライブラリが見つからずクラッシュします。

```
Library not loaded: @rpath/Apollo.framework/Apollo
```

実際にシミュレーターのディレクトリを見るとCarthageでビルドしたライブラリが含まれていない状態です。

XCFrameworkの場合は、Embed & Signに変更することで、ライブラリがバンドルされ、クラッシュしないようになりました。

![スクリーンショット 2022-04-09 22.50.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48172/a2165ef4-bf0a-69cb-7ff0-978704020801.jpeg)

公式READMEの[Quick Start](https://github.com/Carthage/Carthage#quick-start)には、XCFrameworkの場合はEmbed & Signを選ぶよう記載があるのですが、移行手順だけ見ていると見逃してしまいます。


XCFrameworkに移行できたので、M1 Macにも移行できる見通しが立ちました。
ニワトリでもわかるオブジェクト指向🐓

オブジェクト指向で躓いてしまう人
オブジェクト指向ってなんなの？という人
そんなあなたのために解説します。


## なぜ、オブジェクト指向を理解できないのか？
それは、プログラミングを学ぶ過程でプロセス指向の頭が出来上がってしまっているからなんです。


### 1. プロセス指向とは？
プロセス指向とは、「処理(関数)」を中心に考える方法です。
(わかりやすくするための考え方ですので正確には違います)

試しに次のアルゴリズムを考えてみましょう。

#### 「3 + 5 を計算し、答えを出すプログラムを作ってください」


ここで、「引数で3と5を受け取ってたした結果を返す関数を作ればよい！」
と考えたあなたはプロセス指向です。（笑）

なぜなら、処理(関数)から考えてしまっているからなんですね。

### 2. オブジェクト指向とは？
では、さっきのアルゴリズムをオブジェクト指向で考えるとどうなるのか？

- まず、登場人物を考えます。
ここでは「３」さんと「５」さんの二人です。
(じつは、「５」さんは今回は仕事をしませんが律儀に登場人物を洗い出します。)

- 次に、「３」さんに呼びかけます。
お～い、「３」さん！あなたに５を足したらいくつですか？

- 「３」さんは答えます。
はいはい。私に５を足したら８ですよ！

**これがオブジェクト指向です！**

いかがでしょうか？
あらゆるものをオブジェクト(ものや生物)としてとらえて、登場人物として考え、
その登場人物に対して問いかけ(メッセージ)のやり取りでプログラムを書く。
これがオブジェクト指向なんですね。

もちろん「３」さんの中では、プロセス指向で考えた関数を書いておくことが必要です。
呼び出し側が「３」さんの処理内容を知らなくてもよいということもポイントです。


もうわかってきましたね？
最後にもう１つ
#### 「3 の平方根を計算し、答えを出すプログラムを作ってください」

オブジェクト指向で考えたら
もちろん
「３」さんに問い合わせます。
「３」さん！あなたの平方根はいくつですか？
といった具合です。

もちろん「３」さんの中には **「このメッセージを受けたら自身の平方根を返す」**
といった処理を書いておくことが必要です。


### これで今日から全部オブジェクト指向でプログラムできる！？
ちょっと待ってください。
オブジェクト指向は保守面や開発の分担などで大いに効果を発揮しますし、
登場人物によっては、より分かりやすい構造でプログラムできるはずです。

だからと言って全部オブジェクト指向でコードを書くのはあまりお勧めしません。
特に簡単なプログラムや小規模開発などはプロセス指向の方がシンプルになるからです。

(いちいち「３」のような数字のためにオブジェクトを作ってたら大変ですし。。。)

JavaやPythonといった言語では、プロセス指向、オブジェクト指向両方でコーディング可能なので、
メリットデメリットをよく考えて両方使いこなせるようになっていただけるとよいと思います。



以上、お疲れ様でした。
OSX: InstallESD.dmg ファイルから、インストールUSBディスクを作成する



## InstallESD.dmg とは

以前のバージョンのOSXのインストーラーに同梱されていたインストールイメージが含まれているディスクイメージファイル。古い MacBook などに古いインストールイメージをインストールしたい場合に使う。
Mac は、ネットワークにつながっていれば、Shift+Option+Command+R を起動時に押下することでネットワークからリカバリーすることできるが、インストーラーダウンロード中にエラーになったりしてリカバリー中にエラーがでるなどのため、USBインストールディスクからリカバリーする場合がある。

インストーラーAppが　
https://support.apple.com/ja-jp/HT211683
からダウンロードできる場合は、
https://support.apple.com/ja-jp/HT201372
を読み、インストールディスクを作ることができる。
しかし、OSX Sierra 以前の OSXが必要なとき、 InstallESD.dmg のみが入手できる。


## USB メモリーのフォーマット

8GBの USBメモリーを用意し、ディスクユーティリティを使い、消去する。
（GPT、MacOS 拡張ジャーナルあり）

## Base System の書き込み

ダウンロードした InstallOS.dmg をダブルクリックしてマウントする。
ターミナルを開き、 InstallOS.pkg ファイルを以下の手順で解凍する。

```
xar -xf /Volumes/Install\ macOS/InstallOS.pkg
```

InstallOS.pkg ディレクトリのなかに InstallESD.dmg ファイルがあるので、デスクトップなどに移動して、ダブクリックしてマウントする。
InstallESD 内にある BaseSystem.dmg が、USBで、OSXを起動できるイメージなので、これを　USB に書き込む（NO NAME が USBディスク）。

```
sudo asr restore -source /Volumes/OS\ X\ Install\ ESD/BaseSystem.dmg -target /Volumes/NO¥ NAME  -erase
```

## OSX インストーラーをコピーする

InstallESD にある　Packages がインストーラーなので、これを BaseSystem 内のインストーラーとして置き換える。

```
rm /Volumes/OS\ X\ Base\ System/System/Installation/Package
cp -R /Volumes/OS\ X\ Install\ ESD/Packages /Volumes/OS\ X\ Base\ System/System/Installation
```

USBメモリーを取り出す。

## Mac に USBメモリを接続して起動する

起動時に、Optionキーを押下しつづけることで、起動ディスクを選べるので、OS X Base System を選ぶ。
起動後は、画面に従って、インストールすればよいが、ネットワークが接続されていなかったり、Mac の時計があっていないとインストールの最初でエラーもでないのに先に進めないことがあるので、ネットワークに接続し、時計を合わせること（時計は、ターミナルを開いて合わせることができる）。
システム設計って具体的に何するの？入社半年の新人エンジニアが経験と理解をまとめてみた。

## 記事を書こうと思ったきっかけ


就職活動をする際「どんな仕事をするのか？」を調べない人はほぼいないと思います。
ただ、ネットで検索をかけても具体的な仕事内容がイメージしにくいことは結構あります。
自分が「ITエンジニアになりたい！」と思って転職活動をしていたとき、一番イメージが湧かなかったのが「システム設計」についてでした。

いまの会社に入社して半年。
新人エンジニアとして設計業務に携わる機会があったので、そこで経験したことを備忘録的に記しておきます。
ITエンジニアやIT業界に興味があって、仕事内容を知りたい方向けの記事です。
ツッコミ所は多々あるかと思いますが、自分なりにイメージをお伝えできたら幸いです。

## システム開発における設計とは
「システム設計」と聞いて思い浮かぶものは何でしょうか。
IT業界に興味がある方は、よくある**ウォーターフォールモデル**の図を思い浮かべるのではないでしょうか。

参考：[ウォーターフォールモデルとは アジャイル型開発との違いを２つの視点から紹介](https://service.shiftinc.jp/column/4850/)

「要件定義」の後、「コーディング」の前の「基本設計」とか「詳細設計」とかいうやつですね。

要件定義は、どんな成果物が欲しいのか、お客さんからヒアリングをするイメージ。
コーディングは、エディタや開発環境を使って文字通りコード（プログラム）を書くイメージ。

これらの工程は少し調べればイメージが湧く方も多いと思います。

では、2つの設計工程では何をしているのでしょうか？
転職活動していた頃のぼくは、なんとなくCADみたいな小難しいソフトウェアを使って図を書いたりするのかな？というイメージでした。

確かに、システム設計を行うためのソフトウェアはたくさんありますが、それはあくまで手段であって目的ではありません。
システム設計の目的を体現する、具体的な業務とは何か？答えはシンプルです。

それは「**設計書を書くこと**」です。

設計書は、お客さんからの ~~要望~~ 要件を満たすシステムを作るのに必要な情報が詰まった文書です。
そしてコードを書く時も、テストをするときも作業は設計書を見ながら行います。
つまり、**要件定義が終わっていないと設計書は書けない**し、**設計書がないとコーディング以降の工程に進めない**のです。

だからこそ、**設計書こそが設計工程の成果物**なのであり、
設計書を書き終えることで、設計工程が完了するのですね（超ざっくりした説明）。

::: note warn
基本設計と詳細設計は分けて説明されることが多いですが、実際にはその境界はあいまいです。
また、どちらも「設計書を書く」という点では同じなので、この記事ではその違いには触れません。
:::

## 設計書を書くとはどういうことか（具体例）
さて、一口に「設計書を書く」と言ってもイメージが湧かないのではないでしょうか。
そして、新人エンジニアに設計書なんて書けるの？という疑問もあるでしょう。
では、ぼくが実際に経験した業務を具体例として書くと以下のようになります。

「**設計書を書くこと**」
=「**先輩エンジニアの指示や資料をもとに、お決まりの形式のExcel文書を記入すること**」

どうでしょうか。これなら、大分イメージが湧いてきました。
なんとなく、新人でもできそうな気がします。

先輩エンジニアはお客さんの要望を聞いて、「これとこれとこれを組み合わせたらこーんなシステムができるだろうなー」というのを考えてきます。いわゆる、技術仕様を決める、というやつです。
これは、**本当の意味での設計**です。流石に知識のない新人にはできませんね。

では、先輩がいきなり設計書を全部書くのかというと、そうではありません。
設計書というのは公式な文書なので、書き方に細かい決まりや制約（会社によって違います）があって、結構な作業量が必要なのです。

そこで、先輩は頭で考えたシステムの仕様を、メモ書き程度の資料（適当なExcelファイルだったりテキストファイルだったりする）にまとめておくわけです。

**新人エンジニアであるぼくの業務は、先輩の指示やメモ書き資料を、設計書に**「**清書**」**していくこと**です。
設計書の書式は、過去の案件のものをコピペしたりマネしたりします。
時には、先輩の指示が理解できなかったりメモ書きが足りなかったりするので、その都度確認や質問をします。

そんな感じで作業をしていると、設計書っぽいものが一応出来上がります。
これを先輩に提出→添削してもらうという手順を何回か繰り返すと、無事に設計書が完成します。やったね。
新人のぼくは技術的な理解がある程度深まりますし、
先輩エンジニアは設計書を書く作業そのものに時間をとられなくてWin-Winですね。

実際には設計段階で決まらない細かい仕様があったり、コーディング時にミスを見つけて設計書のほうを直すことがあったりします（無論、よくないです）。
何事も、教科書どおりにうまくいくわけではありませんね。
また、あくまで個人の経験談ですので、現場における具体例のひとつとして考えてくださいね。

# まとめ
- システム設計の具体的な業務は「設計書を書くこと」に要約される。
- 新人エンジニアに課せられた「設計書を書く」業務は、「先輩の考えた技術仕様を、決まった形式のExcel文書に清書する」ことであった。

2022/04/19 コメントでご指摘いただいた内容をもとに内容を微修正しました。
コマンドパレットやファジーファインダーのようにインクリメンタルサーチして絞り込むWindowsアプリを作った

# 3行で説明
- VSCodeのコマンドパレットや、いろいろなアプリについている、インクリメンタルサーチして絞り込む機能、便利ですよね。（ファジーファインダーとも言うそうです）
- 単体アプリとして作って遊ぶと楽しそうです。
- [というわけで作りました。こちらからダウンロードできます。](https://github.com/cat2151/mini-incremental-search-filter)
    - （実験的で、起動は遅く機能も限定的ですので、使うには遊び心が必要です）

# 記事の目的は？
- 情報を共有することです。
- （きっと、Windows用の接続先を問わない汎用の単体アプリとして、機能が上位互換で、より起動が速いものがあるよね）と思っています。
- が見つかりませんでした。
- 近い機能を持つアプリは、知る範囲では :
    -  コンソールで使うもの
        - [fzf](https://github.com/junegunn/fzf)（広く使われているようです）
        - [percol](https://github.com/mooz/percol)（migemo対応）
        - Vim系のファジーファインダー系プラグイン（後述します）
    - 自前ウィンドウで動くもの
        - [afxfazzy](https://github.com/yuratomo/afxtools)（便利です。あふw用です。migemo対応です）
        - 当アプリ

# 関連リンク
- [migemoをWindows + Pythonで楽に使う方法](https://qiita.com/cat2151/items/c02cb0139ac6abd39424)
    - 当アプリをmigemo対応しながら書いた記事です。
- [簡易コマンドパレットを秀丸エディタとサクラエディタとMeryに実装した(experimental)](https://qiita.com/cat2151/items/fdff8476cd1e1f2ca941)
    - 当アプリを使い、各種エディタ用のコマンドパレット（ファジーファインダー）拡張を実装した記事です。
- [Percol | percol の基本操作](https://qiita.com/tbpgr/items/c933e031260e0127aa31)
    - percolと近い機能を持つアプリの紹介があります。（2014年の記事）

>Percol はPython製のインタラクティブな grep ツールです。
>同種のツールとして以下があります。
>name	impl lang	github url
>canything	C	https://github.com/keiji0/canything
>zaw	Shell	https://github.com/zsh-users/zaw
>peco	Go	https://github.com/peco/peco
>fzf	Ruby	https://github.com/junegunn/fzf

## ファジーファインダー
- こういった機能は`ファジーファインダー`とも呼ばれ、コンソール用やVim用は活発に開発が進んでいるようです。
- [ファジーファインダー系プラグインとは（Vimにたくさんあるファジーファインダー系プラグインを比較してみる より）](https://zenn.dev/yutakatay/articles/vim-fuzzy-finder#%E3%83%95%E3%82%A1%E3%82%B8%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E7%B3%BB%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%AF)
- [ファジーファインダーとは（TypeScriptでVimのファジーファインダーを実装して開発体験が最高になっている話 より）](https://zenn.dev/yano/articles/vim_with_fzf_preview_is_best_experience#%E3%83%95%E3%82%A1%E3%82%B8%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%81%A8%E3%81%AF)
React18で環境構築したが、エラーが出たので、React17へダウングレードした話

備忘録として残します。
また、同じ事で詰まった方へ向けて、参考になれば幸いです。

>React 18が、2022年3月29日にリリースされました。
>[React 18 is now available on npm!](https://reactjs.org/blog/2022/03/29/react-v18.html)

## 要約

React18にて環境構築をすると、下記エラーが発生。
>Warning: ReactDOM.render is no longer supported in React18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React17.

色々情報収集すると、周辺ライブラリやらまだ対応していない事から、
React17へダウングレードを実施したので、その方法を共有します。

## 手順

### １）create-react-appで環境構築
```
npx create-react-app . --template typescript
```
React18(Typescriptベース)のテンプレートを作成する

### ２）ブラウザで確認(`npm run start`)するとエラーが表示される
```
Warning: ReactDOM.render is no longer supported in React18. Use createRoot instead. Until you switch to the new API, your app will behave as if it's running React17.
```

ふむふむ。そうなのか。
そもそもReact18が先週リリースされていたとは。。

色々調べてみると、まだリリースしたばかりで対応していないライブラリやら多いようで、
このままプロジェクトを進めるのは避けようと判断。

### ３）React17へダウングレード
```
npm install -save react@17.0.2 react-dom@17.0.2
```

この状態でブラウザで確認してみると、２）のエラーは出なかった。
ほっ。。


## 所感
手順をサラッと書いてますが、
実は、React17へのダウングレードの方法が分からず、結構調べました。。

現時点（'22/4/7）では、`create-react-app`　を実行すると、
自動的にReact18がインストールされるので、エラーが出ると思います。
しばらくは、React17で様子見していた方がよさそう。

今後も備忘録として、色々アウトプットしていきたいと思います。
（React.js, TypeScript, AWSメイン）
PHPでプリペアドステートメントを使った検索機能でつまずいた所

## はじめに
PHP勉強中してます。間違ったりしていたら指摘等よろしくお願いします。

## 環境
|ツール  |バージョン |
|---|---|
|MAC  |Big Sur 11.5.2|
|PHP  |7.4.0  |

## つまずいたところ事
ブログアプリ作成時、プリペアドステートメントを使った検索機能のbindValueのパラメータの書き方でつまずいた。

## どんなエラーが起きたか
下記のSQLだと、うまく取得できずにNULLがかえってくる。
```
//検索ワードをPOST送信
$searchWord = $_POST['search'];

//SQL
$sql = <<< EOF
    SELECT
    *
    FROM
    blogs
    WHERE
    contents
    LIKE
    '%" :searchWord "%'
    EOF;
```
```
//bindValue
$statement->bindValue('searchWord', $searchWord, PDO::PARAM_STR);
```

## 解決方法
SQLのLIKEでは%を入れずプレースホルダのみ。
後でbindValueを書くときに、第2引数に%を追加したら実装できました。
```
$sql = <<< EOF
    SELECT
    *
    FROM
    blogs
    WHERE
    contents
    LIKE
    :searchWord
    EOF;
```
```
//bindValue
$statement->bindValue(':searchWord', '%' . $searchWord . '%', PDO::PARAM_STR);
```
## 参考
http://none.3rin.net/php/php%20pdo%20prepare%E3%81%A7like%EF%BC%88%E9%83%A8%E5%88%86%E4%B8%80%E8%87%B4%EF%BC%89
【Rails】使用環境・記述は間違っていないのにjQueryが動作しない

はじめまして。
まだ学習を始めて間もないので間違っていたらぜひ教えてください。

# 対象の方
GitHub上にjQueryが使えるアプリを作成済みで、
それをcloneしたからjQueryが動く環境なはずなのに動かないって方。
ちょっと特殊？です。
（インストール方法や使い方の説明ではありません)


# 環境
Rails: 6.1.4
Ruby: 2.6.3
ローカル環境 （AWS cloud9)

# 経緯
GitHubからすでに動作するアプリをcloneしてきた際に起こった問題です。
＊cloneした元々のディレクトリにはjQueryもインストール済みです。
（cloneしてからwebpackをinstallやらcompileしてから使っています）

環境・記述が間違っていないというのは、
毎回全く同じ方法で同じディレクトリをGitHubからローカルへcloneしてきているからです。
前まではその方法で問題なく動いていたのでそこは間違いないです！


# 解決策？
なぜなのかわかりませんが、app/config/webpack/environment.js
(いつもjQueryの記述がしてあるところ)の記述の順番を入れ替えたら直りました。

元の記述↓↓
```javascript:environment.js
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery',
    Popper: 'popper.js'
  })
)

module.exports = environment  //これを上に持っていくだけ
```

変更した記述↓↓
```javascript:environment.js
const { environment } = require('@rails/webpacker')

module.exports = environment  //ここに！

const webpack = require('webpack')
environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery',
    Popper: 'popper.js'
  })
)
```
は？って感じですがこれだけでした。

あと必要なのかわかりませんが一応jQueryの動作が確認できたら元の位置に戻すようにしています。
（戻してもきちんと動作はしています！）

### 原因は？
わからないので完全に憶測です。
jQuery動かない？？？？と思ってctl+cでサーバー落とした際に、直前のターミナル上にcompiling ~ 的なことがちらっと見えた気がするので、

rails s
↓
何らかが原因でcompileが完全にはされない
（すぐサーバー落としたわけじゃなく、しばらく待っても使えなかったので時間の問題ではないと思います）
↓
compileされなかったためjQueryが使えない
↓
environmentの記述に変更を加える（順番の入れ替え）
↓
変更点があったため新たにcompileしてjQuery読み込んでくれた？
とざっくりと考えています。

### 最後に
順番入れ替えるだけなので、もしダメでもその後に影響がないと思います。
もしみなさんも同じ状況でしたらぜひ一度お試し下しさい。

拙い文章で分かりづらい点があったかと思いますが、
お読みいただきありがとうございました！
競プロで使うテンプレートファイル（C++）

# 自己紹介
4ヶ月前に競技プログラミンを始めて、結構はまって、ようやく茶色になった競プロerです。
C++で参加していて、Rustでもできるようになればなと夢見ています。

# C++のテンプレートファイル
最近、友人に競技プログラミンを勧めて、自分が競技プログラミンで使用しているテンプレートファイルを紹介しました。
Qiitaにも投稿してみます。
ほかにもこんなマクロとか関数置いておくといいよ！というのがあれば、ぜひぜひ教えてください！！

```c++
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using ll = long long;
#define REP(i, left, right) for (ll i = left; i < right; i++)
#define RREP(i, right, left) for (ll i = right; i >= left; i--)
#define REPEQ(i, left, right) for (ll i = left; i <= right; i++)
#define FORE(elem, container) for (auto & elem : container)
#define ALL(x) (x).begin(), (x).end()
template<class T> bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; } return false; }
template<class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; }
template<class T> T gcd(const T &a, const T &b) { if (b == 0) return a; else return gcd(b, a % b); }
template<class T> T lcm(const T &a, const T &b) { return abs(a) / gcd(a, b) * abs(b); }

int main() {
    return 0;
}
```
避難施設の一覧表のPDFをCSVに変換

https://twitter.com/Naikakukanbo/status/1511622289842118658

# 説明

https://www.kokuminhogo.go.jp/hinan/list.html

上記から都道府県のファイルをダウンロードし「data.pdf」で保存

位置情報はYahoo!地図のURIより抽出

# プログラム

```python
import urllib.parse

import pandas as pd
import pdfplumber


def uri2latlon(uri):
    qs = urllib.parse.urlparse(uri).query
    qs_d = urllib.parse.parse_qs(qs)
    return pd.Series({"lat": qs_d["lat"][0], "lon": qs_d["lon"][0]})

# 列名
col = [
    "名称",
    "市町村名",
    "住所",
    "緊急一時避難施設",
    "コンクリート造",
    "２４時間避難可能",
    "地下施設",
    "地理院地図",
    "googleマップ",
    "Yahoo!地図",
]

with pdfplumber.open("data.pdf") as pdf:

    dfs = []

    for page in pdf.pages:

        df_uri = (
            pd.DataFrame(page.hyperlinks)
            .query('uri.str.startswith("https://map.yahoo.co.jp/")', engine="python")
            .sort_values("top")
        )
        df_uri.reset_index(drop=True, inplace=True)

        df_latlon = df_uri["uri"].apply(uri2latlon)

        table = page.extract_table()

        df_tmp = pd.DataFrame(table[1:], columns=col).join(df_latlon)

        dfs.append(df_tmp)

df = pd.concat(dfs).reset_index(drop=True)

df.index += 1

df["名称"] = df["名称"].str.replace("\s", "", regex=True)
df["住所"] = df["住所"].str.replace("\s", "", regex=True)

df.to_csv("result.csv")
```
ARKitのLocation Anchorsがサポートしているエリア

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/15121635-a67a-edce-8dfa-cf774169977d.png)

Location Anchorsは、GPSだけでなくカメラから取得した視覚情報も活用してユーザの絶対的な位置を割り出し、絶対的な位置にアンカーを記録するAPIです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/df9fac4c-3ad7-b846-ed4c-b78c1e2f45d4.png)

ARKitの機能の一つであるLocation Anchorsは、対応するエリアでした利用できません。

では、対応しているエリアはどこなのか。
公式ドキュメントに記載があったので引用します。
ちなみに**日本はありません。**

## Location Anchors対応エリア
アリゾナ州
　フェニックス

カリフォルニア州
　アラメダ、アーデンアーケード、コントラコスタ、ロサンゼルス郡、マリン郡、ナパ郡、オレンジ郡、リバーサイド、ローズビル、サクラメント、サンベルナディーノ、サンディエゴ、サンフランシスコ、サンノゼ、サンマテオ、サンタクララ、サンタクルス、ソラノ郡、ソノマカウンティ

コロラド州
　デンバー

フロリダ州
　クリアウォーター、マイアミ、サンクトペテルブルク、タンパ

ジョージア州
　アトランタ

インディアナ州
　ブルーミントン

メリーランド州
　ボルティモア、タウソン

マサチューセッツ州
　ボストン

ミシガン州
　デトロイト、リヴォニア、ウォーレン

ミネソタ州
　ミネアポリス、セントポール

ミズーリ州
　セントルイス

ネバダ州
　ラスベガス

ニュージャージー州
　ジャージーシティ

ニューヨーク州
　ニューヨーク市

オレゴン州
　ポートランド、ヒルズボロ

ペンシルベニア州
　フィラデルフィア、ピッツバーグ

テキサス州
　オースティン、ダラス、ヒューストン、ニューブラウンフェルズ、サンアントニオ

ワシントンDC

ワシントン州
　シアトル、バンクーバー

**ローカリゼーションイメージのみ対応。**
イギリス
　ロンドン

引用元
https://developer.apple.com/documentation/arkit/argeotrackingconfiguration
ネットワークポート番号のまとめ[暗記用メモ]

TCP/UDPにおけるポート番号について、個人的な暗記用まとめです。

- 随時追加予定です。
- 代表的なネットワークコマンドについてはこちら。

https://qiita.com/y-vectorfield/items/4df7a209aaf741ab7ca1#_reference-77b12018af5ecc98d4ad

## ポート番号とプロトコル
ポート番号はTCP/UDPにおいて、通信をアプリケーションプログラム（サービス）ごとに識別するために使用される。具体的にはTCP、UDPヘッダで「宛先ポート番号」「送信元ポート番号」に設定される。
ポート番号はプロトコル番号(TCP/UDP/SCTP..)ごとに```0~65535```の2^16通りの指定ができる。この中で、```0~1023```はウェルノウンポート番号(Well-Known Port Number)と呼ばれる代表的なサービスの割り当てられるポート番号である。また、```1024~49151```はウェルノウンポート番号ではないが、正式に登録がされているポート番号である。

表1: TCPの代表的なウェルノウンポート番号

|ポート番号|サービス|説明|
|--|--|--|
|1|tcpmux|TCP Port Service Multiplexer //SGI Irixのテスト用通信ポート|
|7|echo|Echo|
|20|ftp-data|File Transfer [Default Data]|
|21|ftp|File Transfer Protocol [Control]|
|22|ssh|The Secure Shell (SSH) Protocol|
|23|telnet|Telnet|
|25|smtp|Simple Mail Transfer Protocol|
|80|http|World Wide Web HTTP|
|110|pop3|Post Office Protocol - Version 3|
|143|imap|Internet Message Access Protocol|
|220|imap3|Interactive Mail Access Protocol v3|
|443|https|http protocol over TLS/SSL|
|587|submission|Message Submission|
|989|ftps-data|ftp protocol, data, over TLS/SSL|
|990|ftps|ftp protocol, control, over TLS/SSL|

表2: UDPの代表的なウェルノウンポート番号

|ポート番号|サービス|説明|
|--|--|--|
|53|domain|Domain Name Server|
|69|tftp|Trivial File Transfer|
|123|ntp|Network Time Protocol|
|161|snmp|SNMP|
|162|snmptrap|SNMPTRAP|
|520|router|local routing process (on site); uses variant of Xerox NS routing information protocol - RIP|

#
- 参考文献
  - [1] オーム社『マスタリングTCP/IP 入門編 第6版』
  - [2] [IANA - Service Name and Transport Protocol Port Number Registry](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
【VSCode】拡張機能「rust-analyzer」のフォーマッタを設定する

VSCodeの拡張機能「rust-analyzer」を使用し、フォーマッタを有効にする設定についてメモしておきます。
※ 2022/6/19 更新
# 設定内容
~~`setting.json`などに下記を追加します。~~
下記は旧設定です。（設定してもWarningになるかと思います。）
```setting.json
{
    "[rust]": {
            "editor.defaultFormatter": "matklad.rust-analyzer"
    }
}
```

現在はrust-analyzerのパブリッシャーがrust-langになった？ため、下記を追加します。
```setting.json
{
    "[rust]": {
            "editor.defaultFormatter": "rust-lang.rust-analyzer"
    }
}
```

ファイル保存時やペースト時、入力後に自動でフォーマットしてほしい場合は下記を追加します。
```setting.json
{
    "editor.formatOnSave": true,
    "editor.formatOnPaste": true,
    "editor.formatOnType": true
}
```
ランニングコスト0の書籍管理webアプリ！　QuaggaJSってどんなもの？

# ランニングコスト0の書籍管理webアプリを開発！　QuaggaJSってどんなもの？

※こちらの記事の内容は2022/4/9に執筆したものです。


## 初めに

この記事は、[以下の元記事](https://qiita.com/keisuke_suzuki_engineer/items/3be494864dffb3b5543b)で紹介しているアプリを構築する際に使ったQuaggaJSの機能について紹介している記事です。元記事からご覧ください。

https://qiita.com/keisuke_suzuki_engineer/items/3be494864dffb3b5543b


## バーコードって？

書籍どころかほぼすべての商品についているバーコードですが、具体的に何なのかご存じですか？実はバーコードの招待は単なる文字(数字)でしかないのです。
文字を特定のルールで白と黒の線で表したものがバーコードなのです。つまるところ、バーコードを読み込むというのは文字を自動入力しているようなものなものなのです。


## QuaggaJSって？

QuaggaJSとはjsのライブラリの一つで、画像を渡すと映っているバーコードを自動で認識して文字を抽出までしてくれます。


## どのように使うの？

ざっくりとこんな感じです。わかりやすい説明をしている記事はいくらでもあるので、ここでは最低限の書き方のみ載せておきます。

```js:sample.js

	Quagga.decodeSingle({
		decoder: {
			readers: ["ean_reader"] // List of active readers
		},
		locate: true, 
		src: //TODO 画像のインスタンス
	}, function(result){
		//TODO 認識後の処理
	});
```
指定のディレクトリへのcmakeのinstall 

cmakeの説明については割愛します。

事前に以下を実行しておく
```
sudo apt install build-essential
```
```
sudo apt-get install libssl-dev
```
# cmakeをダウンロードする
https://cmake.org/
ダウンロードボタンをクリック
![cmake1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591933/c8d6d427-3b9c-c174-85ad-3782d721ef95.png)
Unix/Linuxプラットフォームの最新版をクリック
![cmake2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591933/b88b7cb2-4bec-02b2-c836-f9e5f392d295.png)

# Downloadされたtar.gzファイルを解凍する
筆者の環境はWSL2のUbuntu20.04LTS
以下を実行
```
tar -xvzf cmake-3.23.0.tar.gz
```

# 指定ディレクトリへのインストール
解凍したディレクトリ内に入る
```
cd cmake-3.23.0
```
インストールする。因みに結構時間がかかる
```
./configure --prefix=インストールしたいディレクトリのフルパス/cmake
```
```
make -j 4
```
```
make install
```

# PATHを通す
bashrcに以下を追記
```
PATH="$PATH":インストールしたディレクトリのフルパス/cmake/bin
```
保存してターミナルで以下を実行
```
source ~/.bashrc
```
インストールできたか確認するため以下を実行
```
cmake
```
以下のように出力されたらOK
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591933/89fa5814-2c68-d16e-a484-f5077a321df7.png)
TensorFlowのModelClass入門

# はじめに

TensorFlowのModelClassの知見が溜まってきたので、まとめたいと思います。

以下のサイトを引用しています。

https://www.tensorflow.org/guide/keras/custom_layers_and_models?hl=ja

# import

```python
import tensorflow as tf
from tensorflow import keras
```


# 基本

```python
class Linear(keras.layers.Layer):
    def __init__(self, units=32, input_dim=32):
        super(Linear, self).__init__()
        w_init = tf.random_normal_initializer()
        self.w = tf.Variable(
            initial_value=w_init(shape=(input_dim, units), dtype="float32"),
            trainable=True,
        )
        b_init = tf.zeros_initializer()
        self.b = tf.Variable(
            initial_value=b_init(shape=(units,), dtype="float32"), trainable=True
        )

    def call(self, inputs):
        return tf.matmul(inputs, self.w) + self.b

   def calc(self):
       return self(inputs) ** 2

   def getclass(self):
       return self
```

superで自身のclassを引数にする必要があります。

```python
x = tf.ones((2, 2))
linear_layer = Linear(4, 2) # (1)
y = linear_layer(x) # (2)
z = linear_layer.calc(x) # (3)
print(y)
```

(1)では、コンストラクターに代入され、
(2)では、callメソッドに代入されます。
(3)では、自身のcallメソッドを呼び出しているため、selfの中に
代入させます。


```python
   def getclass(self):
       return self
```

ちなみに、pythonでは、return selfとした場合は、インスタンス変数を引き継いだ状態のclassを返すことができます。
強化学習で用いられる数学とそのコーディング

# はじめに[^1]

　本記事は高校数学を基礎として強化学習を行う上でつまづきやすいところを選出しています。本記事に掲載されていない部分で引っかかる場合は、高校数学を復習して見ると、答えが見つかるかもしれません。
　環境は、colabとTensorFlow2.x系を使用しています。


| 名称 | 意味 |
|:---:|:---|
| P(A&#124;B) |条件ＢのもとでのＡの確率|
| x~P(x) |確率変数xは分布Pを持つ|
| [a, b] |aとbを含む実区間|
| (a, b] |aを除き、bを含む実区間|
| A:=B |AはBと定義する|
|clip(A,min,max) | min ≤ A ≤ max の場合はA <br>又は - A < min の場合は min<br> 又は - max < A の場合は max |
| θt+1←θt+α∇J(θt) |θt+1をθt+α∇J(θt)で更新する|

# よく使われる数学

## ①確率分布

```math
a_t \sim \pi(\cdot | x_t) \\
意味：確率変数a_tは分布\pi(a_t | x_t)を持つ。
```
・はa_tの省略

## ②条件付き確率

```math
P(s',r|s,a)
```
意味：s(状態)の時にa(行動)した場合、r(報酬)をもらい次のs'(状態)になる確率

## ③クリッピング[^2]

![Screen Shot 2021-09-09 at 18.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/a5712a8b-fd87-44c6-20e6-93ef87f8281f.png)


clip_value_min ≤ value ≤ clip_value_max の場合は value
又は - value < clip_value_min の場合は clip_value_min
又は - clip_value_max < value の場合は clip_value_max

```python
t = tf.constant([[-10., -1., 0.], [0., 2., 10.]])
t2 = tf.clip_by_value(t, clip_value_min=-1, clip_value_max=1)
t2.numpy()
```

```console
array([[-1., -1.,  0.],
       [ 0.,  1.,  1.]], dtype=float32)
```

-1 ≤ value ≤ 1 の場合は value
又は - value < -1 の場合は -1
又は - 1 < value の場合は 1
を満たす形になっていることが、わかります。

## ④勾配

定義

```math
スカラー場 f(x,y,z) \\
\nabla = grad f = (\frac{\partial f}{\partial x},\frac{\partial f}{\partial y},\frac{\partial f}{\partial z})
```

fの向きを表している。

```python
x = tf.ones((2, 2))

with tf.GradientTape() as t:
  t.watch(x)
  y = tf.reduce_sum(x)
  z = tf.multiply(y, y)

# 元の入力テンソル x に対する z の微分
dz_dx = t.gradient(z, x)
```

### 方策勾配定理
方策勾配法で用いられる方策勾配定理は以下の通りです。

```math
\nabla J(\theta)=\sum_{s \in S}d(s)\sum_{a \in A}\boldsymbol{\nabla} \pi(a|s;\theta)Q(s,a)
```

## ⑤総乗

```math
\prod_{k=1}^{n} a_k = a_1 \times a_2 \times a_3 \times \cdots \times a_n \\
= a_1 \cdots a_n
```

```python
x = tf.constant([1.0, 10.3, 26.9, 2.8, 166.32, 62.3])
b = 6

def _infinite_product(x, max_num):
    num = 1.0
    for i in range(max_num):
        num *= x[i]   
    return num

a = _infinite_product(x, b)
a.numpy() # 8038593.5
```

### V-traceターゲット[^3]

IMPALAで用いられるV-traceターゲットは以下の通りです。

```math
\mathcal R^n V(x_s) := V(x_s) + \mathbb 
\sum_{t=s}^{s+n-1} \gamma^{t-s}(\prod_{i=s}^{t-s} c_i)\delta_tV

```





[^1]: https://nthu-datalab.github.io/ml/slides/Notation.pdf

[^2]: J. Schulman, F. Wolski, P. Dhariwal, A. Radford, O. Klimov "Proximal Policy Optimization Algorithms"(2017) In OpenAI.

[^3]: L. Espeholt and K. Kavukcuoglu, et al. "IMPALA: Scalable Distributed Deep-RL with Importance Weighted Actor-Learner Architectures"(2018)
時間管理アプリtogglでApple Watchから記録開始

最強の時間管理アプリ「<a href="https://track.toggl.com/">Toggl Track</a>」
フリーランスの時間管理にはこれ以上ないのではないかと思う。
Toggl TrackではAPIも用意されているので、iphoneアプリはもちろん、CURLからも操作できる。



今回は、Apple Watchから時間記録を開始する方法について解説する。

iphoneアプリ「ショートカット」を開く。
そして新規ショートカットを作成し、記録したい内容を受け取れるようにする。
今回は、音声入力したものを、テキスト入力で修正、その結果を記録としてAPIで投げる。

APIをたたくために、
「Appおよびアクションを検索」で「URLの内容を取得」を選択。
![IMG_1641.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265311/159d9608-7f92-58e2-291b-0df748a46e40.jpeg)

、

そして以下のように、入力していきます。
![IMG_1637.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265311/c4770024-d3a1-8cb9-50fc-6e1999526d64.jpeg)

ヘッダーは
左に<code>Content-Type</code>、右に<code>application/json</code>
一行追加して
左に<code>Authorization</code>、右に<code>Basic [*YOUR_TOKEN*:api_tokenをbase64でエンコードしたもの]</code>
*YOUR_TOKEN*は、https://track.toggl.com/profile の下の方にあります。クリックしないと表示されないようです。
私はChromeのデベロッパーツールのコンソールログに
<code>console.log(btoa("*YOUR_TOKEN*:api_token"))</code>
と入力して値を得ることができました。

TogglのREADMEには例として
```
'{"time_entry":{"description":"Meeting with possible clients","tags":["billed"],"pid":123,"created_with":"curl"}}'
```
https://github.com/toggl/toggl_api_docs/blob/master/chapters/time_entries.md

これを再現するには、
本文を要求のしたの部分にはtime_entryと入力して、値には辞書を配置します。
辞書の内容は、すべてテキスト形式です。
descriptionに対応する値に、「入力を要求」ショートカットの結果を設定するなど、
任意を値を設定することで、自由に記録が開始できます。
pidはhttps://track.toggl.com/project
のプロジェクト一覧から、何か一つクリックすると、
https://track.toggl.com/xxxxxx/projects/yyyyyyy/tasks
というURLになっていることが確認できます。
pidはこのURLでいうyyyyyyyの部分にあたるものです。
記録にプロジェクトの入力が不要であれば、本文に含める必要はありません。
![IMG_1639.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265311/13b0d2be-e8ca-8d98-ad63-09a43c676153.png)

楽天でナンバーシェアサービスを使っている方は、Apple Watch単体で通信できるため、
iPhoneが水没したり、電池切れになったとしても、
Apple Watchのショートカットから直接APIをたたくことで、記録を開始できる。
ショートカットのTogglから操作することもできるが、Apple Watchにおいては、上記のように直接APIをたたく方が、早く、安定して記録の開始ができるという印象があります。

サンプルは
https://www.icloud.com/shortcuts/e99ab468125b475b9812d26f7e6eceec
から入手いただけます。Authorizationをご自身でカスタマイズしていただければ幸いです。
なお、プログラムの利用は自己責任でお願いいたします。
Dart でコードを分割した時にimportする書き方

DartまたはFlutterを使っていてコードを分割した時、他のファイルを参照するimportの書き方。

次のディレクトリ構成を想定します。

```shell
project/
+ lib/main.dart
+ lib/sub.dart
```

main.dartに記載することを想定して、

```dart
import 'package:project/sub.dart';
```

または

```dart
import 'Project/sub.dart';
```

と書きます。

packageで指定するのは `pubspec.yaml` で 

```yml
name: project
```

と記載してある必要があります。
goquery 単語から兄弟要素を取得

```golang
type WebSpider struct {
	url      string
	keyword  string
	document *goquery.Document
}

func NewWebSpider(url string, keyword string) *WebSpider {
	return &WebSpider{
		url:      url,
		keyword:  keyword,
		document: nil,
	}
}

func (ws *WebSpider) Run() {
	ws.document, _ = ws.buildDocument()
	route := ws.findRoutesFromKeyWord()[ws.keyword]
	ws.document.Find(strings.Join(route, " ")).Each(func(i int, s *goquery.Selection) {
		fmt.Println(s.Text())
	})
}

func (ws *WebSpider) buildDocument() (*goquery.Document, error) {
	response, err := http.Get(ws.url)
	if err != nil {
		log.Fatal(err)
		return &goquery.Document{}, err
	}

	document, err := goquery.NewDocumentFromReader(response.Body)
	if err != nil {
		log.Fatal(err)
		return &goquery.Document{}, err
	}

	return document, nil
}

// Routesと複数形の理由はキーワードに正規表現を使ったときを想定して。
func (ws *WebSpider) findRoutesFromKeyWord() map[string][]string {
	routes := make(map[string][]string, 0)
	body := ws.document.Find("body")
	body.Find("*").Each(func(i int, s *goquery.Selection) {
		text := s.Clone().Children().Remove().End().Text()
		if text == ws.keyword {
			routes[text] = ws.findRouteFromNode(s)
		}
	})
	return routes
}

func (ws *WebSpider) findRouteFromNode(node *goquery.Selection) []string {
	route := make([]string, 0)
	currentNode := node
	for {
		route = append(route, goquery.NodeName(currentNode))
		if goquery.NodeName(currentNode) == "html" {
			break
		}
		currentNode = currentNode.Parent()
	}
	// reverse
	for i, j := 0, len(route)-1; i < j; i, j = i+1, j-1 {
		route[i], route[j] = route[j], route[i]
	}
	return route
}

func GoquerySample() {
	ws := NewWebSpider(
		"https://ja.wikipedia.org/wiki/%E5%9B%BD%E3%81%AE%E4%B8%80%E8%A6%A7",
		"日本国",
	)
	ws.Run()
}
```
【論文読み】部分観測マルコフ決定過程を用いた異常検知

## はじめに

こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「部分観測マルコフ決定過程(POMDP)を用いた異常検知手法の開発」という論文です。  

- タイトル：部分観測マルコフ決定過程(POMDP)を用いた異常検知手法の開発
- 出典：木村友彰, et al.; 人工知能学会, 2020  
- URL：https://www.jstage.jst.go.jp/article/pjsai/JSAI2020/0/JSAI2020_2I4GS201/_pdf/-char/ja  


## 概要
時系列データで、DQN(Deep Q-Network)により学習を行い、異常検知モデルを構築した。
Q値の比(異常のQ値と異常でないQ値)を用い異常を検知する。閾値を変更、ROC曲線で評価した。

- マルコフ決定過程・・・状態遷移が確率的に生じる動的システムの確率モデルであり、状態遷移がマルコフ性を満たすもの。  
- マルコフ性・・・前後1時刻のみによって状態の変化が記述されていると仮定する。  

## 技術的特徴
- 観測Otが時系列データの値、行動At+1が異常であるかの2値の離散的なアクション、Rtが行動At+1に対してデータOtが実際に異常であるかにより与えられる。  
- Q関数は1~tの時刻の観測と行動に対して定義される。    
- LSTMを使用。ステップ数のパラメータを6パターン検証し、ステップ数が大きくなると正確にQ値を表現できる一方、大きすぎると情報をうまくまとめることができず精度が悪くなると考えられることを考察。


## 想定される適用例
- 時系列データでの異常検知全般


## 参考
- [部分観測マルコフ決定過程(POMDP)を用いた異常検知手法の開発](https://www.jstage.jst.go.jp/article/pjsai/JSAI2020/0/JSAI2020_2I4GS201/_pdf/-char/ja)  
- [軽く動く強化学習、基本のQ学習からニューラルネットやLSTMの応用まで、4種のエージェントと7種のタスク](https://qiita.com/itoshin/items/7ff9981a957db0814abe)
VSCodeのJavaのOrganize Importsで削除済みファイルが候補に残り続ける場合の対処法

名前変更等で削除されたファイルがキャッシュに残り続け、Organize Imports時に候補になってしまう現象への対処方法です。

コマンドパレット（F1キー等で起動）で以下のコマンドを実行します。
```
Java: Clean Java Language Server Workspace
```
一応スクショも。
![スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139956/38c20fc8-4a1d-94c1-9d38-368f3843f8e2.png)
VSCodeのキャッシュのクリア等で検索すると `Clear Editor History` コマンドが出て来ますが、この現象に対してそちらは効果がありません。
同じような原因でビルドエラーになった際、たまたま今回のコマンドに気づいたのでメモとして残しておきます（通常はすぐビルドするから今回のような現象でハマらないのかも知れない…）。
Laravelインストール時に「PHP拡張モジュールがない」というエラーが発生し、php.iniを修正して対応

laravelをインストールする際、下記エラーメッセージが発生。

```
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/framework[v9.2.0, ..., 9.x-dev] require league/flysystem ^3.0 -> satisfiable by league/flysystem[3.0.0, ..., 3.x-dev].
    - league/flysystem[3.0.0, ..., 3.x-dev] require league/mime-type-detection ^1.0.0 -> satisfiable by league/mime-type-detection[1.0.0, ..., 1.9.0].
    - league/mime-type-detection[1.0.0, ..., 1.3.0] require php ^7.2 -> your php version (8.1.3) does not satisfy that requirement.
    - league/mime-type-detection[1.4.0, ..., 1.9.0] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
    - Root composer.json requires laravel/framework ^9.2 -> satisfiable by laravel/framework[v9.2.0, ..., 9.x-dev].

To enable extensions, verify that they are enabled in your .ini files:
    - C:\php-8.1.3\php.ini
You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode.
Alternatively, you can run Composer with `--ignore-platform-req=ext-fileinfo` to temporarily ignore these required extensions.
```

エラー内容を確認するに、PHP拡張モジュールがないとのこと。
php.iniのファイル内で有効化されていないようなので、php.iniを修正することで対応。

```
;extension=gd
↓
extension=gd
```

```
;extension=gd
↓
extension=gd
```
```
;extension=fileinfo
↓
extension=fileinfo
```

以上の変更を加えることで、Laravelをインストールできるようになった。

※参考にした記事
https://qiita.com/sola-msr/items/95e06e66730468b6c7bc
VSCodeおすすめ【まとめ】

## ターミナル

- clear コンソールクリア

## ショートカットキー

- ctrl shift o 関数やメソッドの検索

## おすすめ拡張機能
- ESLint
- Prettier
- “Bracket Pair Colorizer 2”
- indent-rainbow
- Git History
- Debugger for Chrome