OmniAICreator/Qiita-1.07M huggingface dataset:
Github Actionsで簡単なワークフローを試す。

# Github Actions　使ってますか？
※本記事ではGithubについての説明は割愛します。
Github Actiosとは、GithubによるCI/CDパイプライン構築のためのワークフローです。
CI/CDとはContinuous Integration/Continuous Delivery & Deploymentの略。継続的インテグレーション・継続的デリバリーのことで、要するにコードに変更を加えてマージし（インテグレーション）、本番環境に反映させる（デプロイメント）漸進的に改良を加え続け、より良い価値を届けるためのプラットフォームを築き続けるということです。

しかし、開発における継続的なコードのインテグレーション（統合）・デプロイメントは人の手で行おうとすると少なくない工数と手間がかかり、「継続性」の担保が難しい状況に陥る可能性があります。その為、リモートリポジトリへの変更のプッシュ等のイベントにフックして（フックはぶら下がるという意味の英単語です。ここにおいては作業開始の合図みたいなものだとお考えください。）ワークフローを自動実行します。
変更を引き金にしてビルド・テスト・デプロイを全て自動化して走らせ、コードの変更後に行うべき作業をGitに任せてしまおうというものですね。

[Github Actions　公式ドキュメント](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions)

## ひとまずやってみる

非常に簡易的ですが、「git-remote-demo」というリポジトリを作成して試してみます。
上部メニューのActionsを選択するとワークフロー一覧ページへ遷移できます。
![スクリーンショット 2024-04-08 9.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/4f92cf3c-8929-565f-944a-e0bd90304a99.png)


向かって左側メニューバーの「Workflows」が既に作成済みのワークフロー一覧になります。画面中央の「2 workflow runs」下に表示されているのは既に実行された後のworkflowです。青いチェックマークは問題なくフローが完了したという印ですね。
![スクリーンショット 2024-04-08 9.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/cf56585f-cd06-aab5-a355-990d424115cb.png)

ワークフロー単体の詳細画面を見てみます。
![スクリーンショット 2024-04-08 9.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/490a3aa6-ba77-e9c2-d57b-7520ebfe97a9.png)


今回の形式では特にブランチを指定せず、全てのブランチでpushが行われた場合にワークフローが起動する設定です。対象とするブランチを指定したり、実行スケジュールをcron式で指定しておくことで、定期実行という形でワークフローを構築することも可能です。
こちらのymlファイルは
プロジェクト直下に.githubディレクトリを作成、更にその配下にworkflowsディレクトリを作成し、そこに配置します。
.github/workflows/workflow_demo2.yml に配置します。
当該ファイル内には実行するフローを定義し、YAML形式で記述しております。


```yml
name: GithubActionsDemo-2 #ワークフロー名
on: push #トリガーするアクション

#ワークフロー時に走らせるjobと仮想環境を記述
# jobs: 実行したい処理をまとめたもの
# steps: 実行する1つ1つのコマンド
jobs:　
  my_first_job:
    name: Greeting
    runs-on: ubuntu-latest
    steps:
      - run: echo "Actionsのテスト2個目です"

```

では早速ローカルで１つの変更をpushしてみましょう。
![スクリーンショット 2024-04-08 11.13.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/82ae8391-9d46-d435-ac52-0eef18c0fe46.png)

「GithubActions起動デモ用のプッシュです。」というコメントをつけてコミットとプッシュを実施。
![スクリーンショット 2024-04-08 11.15.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/2e845ae9-a346-960b-cd7f-e522a60946b1.png)

ワークフロー側の画面はというと、
![スクリーンショット 2024-04-08 11.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/e13eec5c-415d-3d4d-4a50-4b6d8beeb7ac.png)
![スクリーンショット 2024-04-08 11.16.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/54f3317c-a165-3b4c-a0ab-6ca1b0312b3f.png)
workflow.ymlの定義通り、プッシュすることでワークフローを実行し、数秒で完了していますね。


⇩ワークフローの実行ログも見れます。

![スクリーンショット 2024-04-05 15.14.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/0ea7d75a-547f-1c55-361d-3290adbd180e.png)


## 終わり
今回はTHE・チュートリアルというような形で極単純なフローを作成・実行まで試しました。
応用すればSlackに通知を送ったり、マージ後に自動でブランチを削除したりとどんどん自動化できます。
使いこなせるようになればチームに貢献できるはずなので、身につけていきたいですね。
【Go】サブスライスは元スライスとメモリを共有する

## どんな記事？
Go言語において、スライスの一部分を切り出してサブスライスを作成する場合、**データのコピーを作るのではなく2つの変数がメモリを共有することになるため変更を共有する**という記事です。
もしオリジナルとはメモリを共有しない独自のスライスを作成する必要がある場合、`make`と組み込み関数の`copy`を使いましょう。
スライスを一部切り出した場合と、`copy`関数を使用した場合とでどのような違いがあるか説明していきます。

## 一部切り出しについて
以下のようにスライスを一部切り出した場合、両者は同じメモリを参照することになります。これはメモリ効率がいいという反面、一方を変えるともう一方にも影響が及ぶことを意味します。
```go
package main

import (
	"fmt"
)


func main() {
	original := []int{1, 2, 3, 4, 5}
	subSlice1 := original[1:3]
	subSlice2 := original[2:4]

	fmt.Println("Before:", original, subSlice1, subSlice2)
	//=> Before: [1 2 3 4 5] [2 3] [3 4]

	subSlice1[0] = 20
	subSlice2[1] = 40

	fmt.Println("After:", original, subSlice1, subSlice2)
	//=> After: [1 20 3 40 5] [20 3] [3 40]
}
```
一部を切り出したサブスライスの変更によって、オリジナルのスライスの値が変更されていることがわかると思います。
また、以下のコードで同一のメモリを参照していることが確認できます。

```go
func main() {
	original := []int{1, 2, 3, 4, 5}
	subSlice1 := original[1:3]
	subSlice2 := original[2:4]
	fmt.Printf("original address: %p, subSlice1 address: %p\n", &original[1], &subSlice1[0])
	fmt.Printf("original address: %p, subSlice2 address: %p\n", &original[2], &subSlice2[0])
}
```


## copy関数について
`copy`関数を使用することで、メモリ領域を共有しない独立したスライスにデータをコピーできます。
```go
func main() {
	original := []int{1, 2, 3, 4, 5}
	newSlice1 := make([]int, 2)
	newSlice2 := make([]int, 2)
	copy(newSlice1, original[1:3])
	copy(newSlice2, original[2:4])

	fmt.Println("Before:", original, newSlice1, newSlice2)
	//=> Before: [1 2 3 4 5] [2 3] [3 4]

	newSlice1[0] = 20
	newSlice2[1] = 40

	fmt.Println("After:", original, newSlice1, newSlice2)
	//=> After: [1 2 3 4 5] [20 3] [3 40]
}
```
また、以下のコードで異なるメモリを参照していることが確認できます。
```go
func main() {
	original := []int{1, 2, 3, 4, 5}
	newSlice1 := make([]int, 2)
	newSlice2 := make([]int, 2)
	copy(newSlice1, original[1:3])
	copy(newSlice2, original[2:4])

	fmt.Printf("original address: %p, subSlice1 address: %p\n", &original[1], &newSlice1[0])
	fmt.Printf("original address: %p, subSlice2 address: %p\n", &original[2], &newSlice2[0])
}
```

## 終わりに
今回はSliceの操作について説明しました。これからもGoについての記事を挙げていこうと思っているので、読んでもらえたら嬉しいです。ここまで読んでいただきありがとうございました。

## 参考記事
https://pkg.go.dev/builtin#copy
【Docker Compose】depends_onについて

## はじめに
`docker-compose.yml`を用意する際に`depends_on`設定の扱いについて調べたので記録を残しておきます。

### 詳細

`depends_on`設定は依存関係を定義してコンテナの起動順序を制御するものです。
例えばDBコンテナが起動する前にWebサーバが起動しようとすると、Webコンテナ側の起動時にDBに対して接続する`db:migrate`のような処理がある場合に、DBが予め起動して接続を受け付けていないとWebコンテナがエラーでコケてしまい起動に失敗することがあります。
そういった時のために予め起動順序を指定できます。

## 記述例

例えば、以下のように設定したサービスは`db`のサービスが起動した後に起動される。
（停止するときは逆に`db`が先に停止される。）
```yml
depends_on:
  - db
```


また、
```yml
depends_on:
  db:
    condition: service_started
```

のように、`condition`という条件を設定することもできる。

- `service_started`:	指定したサービスが起動したら起動する
- `service_healthy`:	指定したサービスが起動し、更にhealthcheck が通れば起動する
- `service_completed_successfully`:	指定したサービスが正常終了したら起動する


## おわりに
他にも色々と設定項目があるので、順次確認していきたい。
[裏話]Dockerを利用して自分だけのDB環境をつくってみた

## はじめに

本記事は、[この記事](https://qiita.com/Shina-0308/private/54576f400cb9c510aea4)を作成するにあたりわからなかった点や調べたことなどをまとめたものです。  

## Dockerfile

```
FROM mysql:8.0-debian
```

apt-getを使いたいのでdebianのもの、かつ記述時点でなるべく新しいものを指定した。

```
# set timezone
ENV TZ=Asia/Tokyo
```

タイムゾーンを日本時間にする。

```
RUN apt-get update
RUN apt-get install -y locales
RUN echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen
ENV LANG=ja_JP.UTF-8
```

日本語が使用できるようにする設定。  
`/etc/locale.gen`に`ja_JP.UTF-8`がコメントアウトされて記述されているため、コメントアウトなしの`ja_JP.UTF-8`で上書きする。  

```
# cat /etc/locale.gen 
# This file lists locales that you wish to have built. You can find a list
# of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add
# user defined locales to /usr/local/share/i18n/SUPPORTED. If you change
# this file, you need to rerun locale-gen.


# C.UTF-8 UTF-8
# aa_DJ ISO-8859-1
# aa_DJ.UTF-8 UTF-8
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ja_JP.EUC-JP EUC-JP
# ja_JP.UTF-8 UTF-8
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# zh_TW.UTF-8 UTF-8
# zu_ZA ISO-8859-1
# zu_ZA.UTF-8 UTF-8
```

`locale-gen`コマンドを実行して、`/etc/locale.gen`に記述されている言語を使用できるようにする。(ロケールの生成)

参考記事  
[Dockerでapt-get: command not foundエラーの解消法](https://syoukinkubi.com/?p=941)  
[DockerのMySQLで日本語が使えない！？](https://tech.anti-pattern.co.jp/docker-no-mysql-de-japanese/)  
[ロケール設定を確認する・変更する方法](https://armadillo.atmark-techno.com/blog/15288/11526)

## compose.yaml

いつも`docker-compose.yml`として作成・記述していたが、`compose.yaml`とするのが推奨されているらしい。

また、最上位のversionの記述（一行目に`version: '3.1'`とか書くやつ）は非推奨のようだ。

`services:`下に起動するコンテナ（＝サービス）の設定を記述する。  
サービスは複数設定でき、サービス名（今回は`db`）は任意の名前がつけられる。

`container_name: mydb`は、そのサービスのコンテナ名を指定している。  
デフォルトでは「プロジェクト名-サービス名-インデックス番号」となる。  
コンテナ名の重複はできない。

`build: .`で、カレントディレクトリの`Dockerfile`を使用することを示している。

`environment:`は、環境変数を指定している。  

`volumes:`で、ボリュームの指定をしている。  
今回は、`./init:/docker-entrypoint-initdb.d`で、ホスト側のカレントディレクトリの`init`ディレクトリと、コンテナ側の`/docker-entrypoint-initdb.d`をバインドマウントしている。

参考記事  
[雰囲気でDocker Composeを触っている状態から脱するために調べたこと（2023）](https://synamon.hatenablog.com/entry/2023/03/17/125933)  

## docker compose up -p mydb --build -d

`-p mydb`はプロジェクト名を`mydb`に指定している。デフォルトはディレクトリ名。  
複数環境立ててそれぞれを管理したい場合などに使われるそう。

`--build`を設定することでコンテナ起動前にイメージをビルドする。

`-d`はデタッチド・モード。  
バックグラウンドでコンテナを起動してくれる。


## docker compose down

今回は`/var/lib/mysql`にマウントしていないため、これだけでOK。

`/var/lib/mysql`にマウントしている場合は、そのボリュームのデータも消す必要があるため`--volume`をつけて実行する。

参考記事  
[dockerのmysqlでdocker-entrypoint-initdb.dが実行されない問題の対応](https://zenn.dev/gki/scraps/4231ff2ed5601c)
AWS Certified Advanced Networking - Specialtyの有効期限を更新した話

# はじめに

AWS認定は、有効期限が３年までとなっています。

https://aws.amazon.com/jp/certification/recertification/

有効期限を延長するためには、現行の本試験を再度受験して合格せねばなりません。

AWS Certified Advanced Networking - Specialty
は、試験バージョンのバージョンアップがあり、
+ ANS-C01 
のバージョンでした。

差分で感じたこと、出来事、など、メモ書きしておきます。

# スコア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/cbe0a991-c2c3-d8f2-bec1-f382f4061ded.png)

前回受験時の時よりは、完全にお手上げ！って問題は少なかったと思います。

+ 確信をもって回答できる問題回答していく。（３分以上悩みそう＆２～３回設問を読み返しそうはフラグをつけて飛ばす）・・・１時間弱
+ フラグを付けた問題を時間多めにとって回答・・・１時間
+ 見直し・・・１０～２０分

位の時間感覚で、ギリギリのギリまで見直してたり、あれこれ悩んだりといった事はしませんでした。

:::note warn
 **初回受験は注意**
プロフェッショナル＆スペシャリティは、設問の文章が飛躍的に長くなります。
一定の受験慣れができるまでは、見直し時間を確保するのも難しいかもしれません。
:::

# 受験対策

## 公式模擬試験

https://explore.skillbuilder.aws/learn/course/external/view/elearning/14837/aws-certified-advanced-networking-specialty-official-practice-question-set-ans-c01-japanese

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/c243cc97-64de-515d-31ff-9155ef5a2ed9.png)


前回受験から、今回受験の差分という所で、以前はAWS公式模擬試験が有料だったの **無料** になってます。
しかも有料なのに点数しか分からず、正答がなんだったのか分からず仕舞いだったのですが、無料な上に正答と解説もついてるので、受験前の腕試しに受験しておくと良いと思います。

今回は受験直前に模試を受けて、満点でした。

## AWS Web問題集で学習しよう

https://techstock.jp/

の問題集が、私の感想としては有用でした。
他の認定を受ける際には、

https://www.whizlabs.com/

や

https://www.udemy.com/ja/

も活用しています。

## 抑えておいた方が良いサービス（と一言ポイントメモ）

+ AWS Transit Gateway
頻出問題です。リージョン跨ぎでセキュアに通信したい時のピアリングや、管理工数を減らす目的の主旨で選択するケースが多い。

+ AWS PrivateLink
多数のAPIエンドポイントがある場合あど、バックヤードが大漁にあって、それを隠したい時などの設問が多かった印象です。

+ S3インターフェースエンドポイント、ゲートウェイエンドポイントの使い分けを問う問題が多かった印象です。オンプレが絡む時にはゲートウェイエンドポイントを利用できない。AWSに閉じた話のときはゲートウェイエンドポイントを選ばせる問題が多かった印象です。

+ 仮想アプライアンス
が絡むときは、AWS Transit Gatewayのアタッチメントや、Grobal Load Balancerを活用するケースが多かった印象です。

# まとめ
ネットワーク（TCP／IP）の世界の事など、AWSよりもソッチ方面の基礎知識問う問題が、昔は多かったと思うのですが、だいぶAWSよりに設問内容が傾いてた印象です。

Specialty最難関と名高いですが、AWS方面の知識だけでもいけるようになってきてるかも、、、しれません。（ネットワーク知識がある方が、より正答を導きやすいというは相変わらずですが。。。）

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
Databricks on AWSの東京リージョンでサーバレスモデルサービングが利用できるようになりました！

見逃してました。

https://docs.databricks.com/ja/machine-learning/model-serving/model-serving-limits.html

![Screenshot 2024-04-08 at 10.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6860c5fc-88f7-21f1-b9f2-51b14d13f645.png)

ここでは、**外部モデル**をサービングエンドポイントにデプロイします。

:::note info
**注意**
お使いのワークスペースで本機能が有効化されていない場合には、Databricks担当者までお問い合わせください。
:::


# シークレットの設定

OpenAIのAPIキーを[シークレット](https://docs.databricks.com/ja/security/secrets/secrets.html)に登録する必要があります。

Databricks CLIをインストールしたローカルマシンで以下を実行します。`-p tokyo`はプロファイルを指定しています。

```sh
databricks secrets create-scope demo-token-takaaki.yayoi -p tokyo
```

```sh
databricks secrets put-secret demo-token-takaaki.yayoi openai -p tokyo           
```

プロンプトが表示されるのでAPIキーを入力します。

```
✔ Please enter your secret value:
```

# サービングエンドポイントの作成

サイドメニューの**サービング**にアクセスし、**Create serving endpoint**をクリックします。
![Screenshot 2024-04-08 at 10.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d57ec187-f28d-3e85-8089-6592378b7d75.png)

**Source**で**External model**を選択します。
![Screenshot 2024-04-08 at 10.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c1bd56de-3a4c-2f9d-2556-974db157cde5.png)

**Provide**で**OpenAI**を選択します。
![Screenshot 2024-04-08 at 10.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/adcc5bc6-5e36-88a3-dd3a-ccf92132a60f.png)

**External model name**は、[こちら](https://docs.databricks.com/ja/generative-ai/external-models/index.html#supported-models)を参考ください。`gpt-3.5-turbo-instruct`を指定します。
![Screenshot 2024-04-08 at 10.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/421e480b-abd2-629a-d8d3-92fa7f043bb4.png)

**OpenAI API key secret reference**には`{{secret/scope/key}}`の形式で指定します。今回は`{{secrets/demo-token-takaaki.yayoi/openai}}`となります。

これで、エンドポイントが作成されました。
![Screenshot 2024-04-08 at 10.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fa0bcee1-5311-170d-e203-888c3cfbb6ef.png)

右上の**Query endpoint**で動作確認します。
![Screenshot 2024-04-08 at 10.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/75f7762e-7aac-21ca-4690-0a56ececde14.png)

![Screenshot 2024-04-08 at 10.51.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/962861cb-c864-1952-8004-4c72b7cce001.png)

動きました！
![Screenshot 2024-04-08 at 10.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2fa5e9ef-6f54-c783-11ee-2e4eb7f96c49.png)

マニュアルはこちらです。是非ご活用ください！

https://docs.databricks.com/ja/machine-learning/model-serving/index.html

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
型でデータのカーディナリティを意識しよう

# 型はデータに意味を与える

型はバグ防止機構という以上に**データに意味付けを与えるもの**としての役割が重要です。

その一つの例としてカーディナリティがあります。今回はこれを紹介していこうと思います。

普段から型を使っている人はおそらく暗黙裡にこのカーディナリティに注意しながら型付けを行っているんじゃないかと思います。

# 型によるカーディナリティの分類

筆者の趣味で Scala で表現していますが、好きな言語で読み替えてください。

|型|カーディナリティ|補足|
|---------------|----|-----|
|A              |1   |`A` は `Int` とか `String` を始めとする任意の型|
|Option[A]      |0..1|言語によっては `A?`, `Nullable<A>`, `A \| null` に相当するもの[^1]|
|List[A]        |0..n|言語によっては `A[]`, `Array<A>` に相当するもの|
|NonEmptyList[A]|1..n|大抵の言語には存在しませんがこういうのもあります|

[^1]: 細かいことを気にしてはいけません

# よくあるミスと改善策

表に登場する型たちはデータのカーディナリティを表すので、それらをユニオン型で組み合わせた型は普通作りません。例えば以下のようなものです[^2]。
- `A | Option[A]`
- `A | List[A]`
- `List[A] | Option[A]`

[^2]: JavaScript で書かれたライブラリに TypeScript であとから型付けしたコードではこういうパターンもよく見かけますが参考にしないほうがいいでしょう

クラスのフィールドの型が  `A | List[A]` になっているものをたまに見かけることがあります。もともと `A` という型だったけど `List[A]` の場合も扱いたくなって追加されたという具合のものだと思います。こういうケースでは次のことを考えて設計を見直してみるとよいでしょう。
- もともと `List[A]` とするべきだったのではないか
- `A` の場合と `List[A]` の場合では別々のフィールドに分けたほうがいいのではないか

型を単なるバグ防止機構と考えるとこのように型をいじってなんとかしようとしてしまうかもしれません。ですが型をデータに意味付けを与えるものだと意識すれば、こういった場合に設計を改善するヒントを得ることができるのです。

(そもそもむやみにユニオン型を使うべきではないというのがあると思います。)

# まとめ

データのカーディナリティを表現する型を紹介しました。カーディナリティを意識することでよりよいコードを書いていきましょう。
Ubuntuサーバでexcelファイルをpdfで変換

トイ・プロジェクトどしてubuntuサーバでexcelファイルをpdfで変換しようとしました。

excelファイルをpdfに変換の際、よく使われる方法はpywin32を用いてpdfで変換するのですが、問題は

>windows OS だけで動く

のが問題でした。僕の場合はLinuxで動作するのが必要でした。

なので探した方法は二つがありました。



#### 1. Adobe Developer site のAPIを利用する。

[Adobe Developer Site](https://developer.adobe.com/document-services/docs/overview/pdf-services-api/)を見るとpdf関連apiをAdobe社が提供することがわかります。自分が開発者で登録してAPIキーをもらって使います。珍しいのはAPIがzipファイルで提供されますが、このAPIキーがそのまま適用されています。別に設定ファイルを触る必要はないです。

java, nodejs, ・netは全部支援し、pythonはpdfからテキストを洗いだすのみ支援するので注意して下さい。



#### 2. unoserverを設置して利用する

Adobeの開発者で登録するのは有効期間があって更新するべきし、言語の制約もあるのでちょっと不便です。それで改めて探した方法はubuntu用のlibreofficeを使用することでした。

でもpdf変換のためにlibreoffice全体をインストールするのはかなり時間もかかるし、サイズも大きいです。そのためlibreofficeの変換機能だけをREST APIで提供するのがunoserverです。これをdocker container化して誰かがhub.docker.comで共有しました。

![](https://raw.githubusercontent.com/cheuora/cheuora.github.io/master/_posts/2024/images/image-20240402002626324.png)

 適当なAlphine versionを選択して（ここには「edge」を選びました）docker pullをもらってdocker containerを立ち上げます。内部ポートは2004番を使うのでポート・マッピングを2004でさせました。

```
docker pull libreofficedocker/libreoffice-unoserver:edge
```

```
docker run -d --name unoserver -p 2004:2004 libreofficedocker/libreoffice-unoserver:edge
```

これでunoserverをubuntuサーバに立ち上げました。

さ…簡単にテストをやってみましょう。クライアントはcurlを用いました。exceltest.xlsxをfile.pdfで変換の結果は下のようです。

```
curl -s -v \
   --request POST \
   --url http://127.0.0.1:2004/request \
   --header 'Content-Type: multipart/form-data' \
   --form "file=@/home/ubuntu/exceltest.xlsx" \
   --form 'convert-to=pdf' \
   --output 'file.pdf'
```

遂行結果は下のようです。

```
*   Trying 127.0.0.1:2004...
* Connected to 127.0.0.1 (127.0.0.1) port 2004 (#0)
> POST /request HTTP/1.1
> Host: 127.0.0.1:2004
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 39785
> Content-Type: multipart/form-data; boundary=------------------------996e3a5643b7c2b7
>
} [39785 bytes data]
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Content-Length: 157671
< Content-Type: application/pdf
< Last-Modified: Mon, 01 Apr 2024 15:39:51 GMT
< Date: Mon, 01 Apr 2024 15:39:51 GMT
<
{ [3917 bytes data]
* Connection #0 to host 127.0.0.1 left intact
```

file.pdfが正確にできました。

![](https://raw.githubusercontent.com/cheuora/cheuora.github.io/master/_posts/2024/images/image-20240402004127602.png)
【Julia】VSCode上でipynbファイルを実行するときにマルチスレッドを使用する

（筆者はVSCodeで`ipynb`を実行している。）
例えば4coreを使用したいなら、`setting.json`に

```python:マルチスレッド
"julia.NumThreads": 4
```

を加筆し、VSCodeを再起動すると良い。

```julia:notebook
Threads.nthreads()
>> 4
```
RaspberryPi Picoで264KBのメモリ制限と戦ってみた

めんどくさくなって動画と画像貼ってお茶を濁すスタイル。
<iframe width="516" height="315" src="https://www.youtube.com/embed/RtD5ZQ7IGIo?si=MtHLslYX7ZFkhaao" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
材料費総額時価5千円ぐらい。ケーブルは5V電源を取ってるだけでPCには繋がっていない、単なる赤外線学習リモコン with ハードウエアボタン、あえてカッコよくいえば「左手デバイス」です。(何かに似てるとか言ってはいけない)

画面切り替えを使用すればPicoの264KBのメモリが許す限り赤外線コマンドは追加可能でLCDのスリープモードにも対応します。とはいうもののLCD点灯時でも消費電流は0.1A程度。
今のところ、照明とオーディオ、エアコンのリモコンに対応させてます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986568/ec8e2c85-929d-fd2d-f9af-dafd901e2e60.jpeg" width="180" height="240" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986568/ef0c26a4-a623-07d5-3cfa-b89914de094f.jpeg" width="240" height="180" /><img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986568/25d7cd5a-e288-8232-1851-0d2dd93b64ad.jpeg" width="240" height="180" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986568/2e6bf264-ed1a-b261-af51-438433fb58ac.jpeg" width="240" height="180" /><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986568/76f65249-ff6b-63c7-4b8b-ad818ea5bb1a.jpeg" width="240"/>

## チョー手抜きの説明
[WAVESHAREのPico用3.5インチLCD](https://www.waveshare.com/pico-restouch-lcd-3.5.htm)(時価3000円ちょい)の解像度は480x320/16bit colorなのですが、一画面全てにはバッファが300KB必要なのでこれだけでもPicoの264KBメモリにはとてもじゃないが収まらず[^1]、最低でも2分割、今回の場合では4列x3段の12分割でやりくりしてます。

赤外線データも同様で、[ビットストリームでのjson](https://qiita.com/iotberrypi/items/a2c739049bee4bb615c8#%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E9%80%81%E5%8F%97%E4%BF%A1%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E6%B1%BA%E5%AE%9A%E7%89%88-remotepy)のサイズが50KB近くになったので一旦Byte単位に積み上げてPicoに保存、使用時に使用する部分だけビットストリームに戻す処理を入れました。

クリック感のあるボタンにしたかったのでLCD内蔵?のタッチパネルは不使用ですが、
- ハードウエアボタン (デジタル Max 16bit、74HC165 x2カスケード接続)
- 画像保存用にLCD付属のSDカードスロット入力
- アナログジョイスティック X/Y 2入力(ただし十字Pad的にしか使ってない)
- 赤外線出力/入力
- HTTPサーバ用のWLan

ともうほぼPinの空きがない状態で、リモコンの種類を増やすのは兎も角、他に何か機能を追加しようとするとすぐメモリが不足しがち。

ソフトウエア的には意地になってAll Pythonで書いてみましたが内容が多岐に渡るため(＆清書がめんどくさくて人に見せるほど綺麗じゃないため)詳細説明は省略、なので今回はGithubにも上げてません。まぁあちこち車輪の再発明のツギハギなのでいいでしょ。(もちろん、もし何か聞かれるような事があったらわかる範囲で答えますけどね)

では、また。

### おまけ
もちろんプログラムを差し替えればフルスクリーンの表示は可能です。
![IMG_4222.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986568/723ec281-80c8-aafc-0375-027f9a0dc6a2.jpeg)


[^1]: このあたり、掲載のデモプログラムすら動かずメーカーのサポートと直接やりとりしたものの、意思疎通すら難しい状況で役に立たず。結局自己解決するしかありませんでした。まぁ安い中華製品なので止む無し。
グローバル クイック アクションのまとめ

[クイックアクションのまとめに戻る](https://qiita.com/Keiji_otsubo/items/c60ef6c377af9913216d)



# グローバル クイック アクションで連絡先名が自動入力されなくなった

+ [Autofill Contact Name with Global Quick Action](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JgYZC)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6621260c-7903-2649-5104-806281cb78f1.png)


:::note
 In Case?  Check this:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e650351f-6a3f-82db-c601-6db10bacddd6.png)
::: 

# レコード詳細ページのレイアウトでは、アクティビティ コンポーネント (通話の記録、新しいタスク、予定) でグローバル アクションを使用しています。新しい部門を作成中なので、新しい選択リストの値を作成する必要があります。ただし、ユーザーとしてログインすると、組織の他のメンバーと同じ選択リストの値が表示されます。ユーザー プロファイルで標準レコード タイプの選択を解除し、カスタム レコード タイプのみを使用すると、通話の記録と新しいタスクが表示されなくなります。すべてのユーザーにとってすべてがうまく機能します。この新しい部門用に新しい選択リストを作成したいだけです。どのような手順や設定が不足しているのでしょうか?

+ [【未解決】Global Action Picklist Values](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aiOXi)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e5b34f1e-7dfc-36ff-199d-0d10e84d8f1b.png)

# 未解決

+ [グローバルアクション - 追加フィルターを使用したパブリッシャーレイアウトの割り当て?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cm9YG)

:::note
これはカスタム Aura コンポーネントまたは LWC で実現できると思います。

カスタム Lightning コンポーネントまたは Aura ページを作成します。
Apex コントローラを使用して、ユーザーの役職とプロフィール情報を取得します。
取得した情報に基づいて、グローバルアクションを動的にレンダリングまたは非表示にする
:::
AWSアカウントのルートユーザーでMFAの設定がほぼ必須に！

# ■初めに
AWSアカウントのルートユーザーに対してMFAをオススメ（ほぼ強制）のようなメールが届きましたので書いてみます。
以下のような内容でした。

件名：
```
[Action Required] Enable MFA on the root user of your account [AWS Account: xxxxxxxxxxxx]
```

# ■GPT的に要約すると…
#### ・2024年5月16日から、AWSコンソールにアクセスする際に、AWS Organizations管理アカウントのルートユーザーに対して多要素認証（MFA）を必要とします

#### ・MFAは追加費用なしで設定できます

#### ・MFAをまだ有効にしていない場合は、今すぐMFAを有効にして、アカウントにもう一層の保護を追加することを強くお勧めします

#### ・MFAを有効にしない場合、有効にするまでAWSコンソールにアクセスできなくなる可能性があります

#### ・MFAを有効にするには、AWS管理コンソールの右上のアカウントメニューのドロップダウンから「セキュリティ認証情報」ページにアクセスしてください

↑↑

「お勧めします」とは書いてありますが翻訳見る感じほぼ強制のような雰囲気でした…

# ■MFAの手順
恐らく一番簡素な部類の設定方法だと思いますが、以下の記事を書いています！
参考になりましたら。

https://qiita.com/zenden/items/0d29b3160e4fb0c06897


以上です！
Flow Orchestrationのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



# A context record is required for interactive steps

+ [Flow orchestration error - A context record is required for interactive steps, what does this mean?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ywd6M)

:::note
 I ran into similar situation. What worked for me was, I opened up those interactive steps, for example, the one that says "Set Input Values for the Selected Action" turn off the toggle, and turn it back on, and select the variable again. Repeat this for the 'Select Where to Complete the Action" too. (In some steps, pretty much redo everything) and then save again. Once I did that, the error went away and I was able to activate the orchestration.

私も同様の状況に遭遇しました。私にとってうまくいったのは、対話型のステップを開くことでした。たとえば、「選択したアクションの入力値を設定する」というステップを開き、トグルをオフにしてからオンに戻し、変数を再度選択しました。 「アクションを完了する場所の選択」でもこれを繰り返します。(一部の手順では、ほとんどすべてをやり直します)、再度保存します。これを実行すると、エラーは解消され、オーケストレーションをアクティブ化できました。
:::



# トレイルヘッド

+ [Orchestrate Complex Processes with Flow Orchestration](https://qiita.com/Keiji_otsubo/items/83bcbe7fd3c7093540dc)
Stripeで"その人限定"のサブスクリプションプランを実現する方法（Subscription / Checkout API編）

サブスクリプションビジネスにおいて、料金体系を決めることはとても重要なビジネス判断の１つです。安すぎた場合、ユーザー数を獲得することができてもマネタイズが困難になるリスクが生まれますし、高すぎた場合はそもそも申し込み数が減少してしまう可能性があります。

## 「ユーザーごとに価格を決定する」

B2Bむけのサービスなどで、ユーザーごとにカスタマイズや必要な機能が異なる場合には、あえて一律の価格を設定せずに提供することがあります。この場合、ユーザーが利用したい機能や人数・プロジェクト数などの数量といったユースケースに合わせて価格を個別に提示します。この方法は、パーソナライズされた体験・サービスを提供するタイプのサービスなどでも、応用することが可能です。

## Stripeでパーソナライズした価格（インライン料金）を提示する方法

StripeではSubscription APIまたはCheckout Sessions APIを利用して、ユーザーごとにカスタマイズされたアドホックな料金を設定することができます。APIリクエストのうち、料金IDを設定する`price`の代わりに、`price_data`パラメータにデータを渡しましょう。

https://docs.stripe.com/products-prices/pricing-models?lang=node#variable-pricing


インライン料金を設定する際は、APIリクエストの`price_data`パラメータに詳細な価格情報を設定します。
以下では、月額5,000円のサブスクリプションを作成する例を、Subscription APIそしてCheckout Sessions APIそれぞれで実装しています。どちらのAPIリクエストでも、`unit_amount`で金額、`currency`で通貨、`product`で商品ID、`recurring`で課金間隔を指定しています。この価格データは常に動的に変更できます。

### Subscription APIを利用した実装例

```diff_javascript
const subscription = await stripe.subscriptions.create({
  customer: 'cus_xxxxxxxxxxxxx', 
  items: [{
-    price: 'price_xxx',
+    price_data: {
+      unit_amount: 5000,
+      currency: 'jpy',
+      product: 'prod_xxxxxxxxxxxxxx',
+      recurring: {
+        interval: 'month',
+      },
+    },
  }],
});
```


https://docs.stripe.com/api/subscriptions/create#create_subscription-items-price_data

### Checkout Sessions APIを利用した実装例

```diff_javascript
await stripe.checkout.sessions.create({
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
  line_items: [{
-    price: 'price_xxx',
+    price_data: {
+      currency: 'jpy',
+      product: 'prod_xxxxxxxxxxxxxx',
+      unit_amount: 1000,
+      recurring: {
+        interval: "month",
+      }
+    },
+    quantity: 1
  }],
  mode: 'subscription',
})
```

https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-line_items-price_data

:::note
オーダーメイド商品など、一回きりの注文をサポートしたい場合は、こちらの記事もご覧ください。
👉 [Stripe Checkoutで事前に料金を登録せず（アドホック）に決済ページを作成する](https://qiita.com/hideokamoto/items/6bd31422e2ebb27d4eaa)
:::

## 大口顧客への特別オファーにも

この機能はAPIだけでなく、ダッシュボードのサブスクリプション更新画面からも利用できます。このため、複数のプランを契約して頂いている大口顧客に対して、特別オファーを提示するような場面にも使うことができます。

![スクリーンショット 2024-04-04 13.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/6bbbbaa0-72cf-d4f0-ee87-76f2ad15a13f.png)

クーポンを利用した割引機能と組み合わせることで、顧客に満足してもらえるオファーやキャンペーンを様々な形で企画することも可能です。

![スクリーンショット 2024-03-27 16.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/88e913b4-0b79-2142-9b3d-01460aba6091.png)


## Stripeの料金モデルを活用して、ビジネスのマネタイズをより柔軟に

Stripeでは、さまざまな料金モデルをサポートしています。また、今回の記事で紹介したように、そのユーザーだけの料金プランをアドホックに作成するインライン料金機能も用意しています。これによって、従来の固定プランでは対応が難しかった要件にも、きめ細かく対応することが可能です。

Stripeの機能を最大限活用し、満足度の高い顧客体験を提供しましょう。

## 関連ドキュメント

https://docs.stripe.com/products-prices/pricing-models?lang=node#variable-pricing

https://docs.stripe.com/api/subscriptions/create#create_subscription-items-price_data

https://docs.stripe.com/api/checkout/sessions/create#create_checkout_session-line_items-price_data
Quick Start: Einstein Analytics


https://trailhead.salesforce.com/content/learn/projects/quick-start-einstein-analytics?trail_id=wave_analytics_enable_and_produce

# Create a Dashboard with a Conversational Query

+ [【未解決】Struggle to find "top 10 amounts by opportunity name"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bKxIQ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/11b229c8-0ebc-821c-08ba-cd21c36be83d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ce8824d7-c370-7576-040a-465914988cfa.png)


# We can't find that conditional formatting has been applied to the table widget. Be sure to follow the instructions to apply conditional formatting to the table widget.

+ [I can't verify the "Create a Dashboard with a Conversational Query" Task. I saved it to my amazing App and checked the Query Properties](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FTbIK)

+ [Apply Conditional Formatting and Annotate a Saved Dashboard View](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000OqKCo)
IBM i サービスどのOSバージョンで実装されたか？の確認ページ

## IBM i サービスがどのOSバージョンのどのPTFレベルでサポートされたか？をまとめたサイト

***IBM Support : IBM i Services (SQL)***
https://www.ibm.com/support/pages/ibm-i-services-sql

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/14158167-7bf6-af00-87db-380d8fcd0b18.png)

## IBM i サービスって？

IBM i のシステム資源、システムステータス、ジョブ実行操作などをSQLで行うための機能総称です。IBM i 7.2以降で実装・順次拡張されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/661a5a29-36a1-26e6-974c-253db9e112f7.png)
Db2 for i Services Directory : SYSTOOLS.COMPARE_FILE 表関数②ソースPFの比較

[前回](https://qiita.com/gomAnomalocaris/items/bc55fe598c40d62207c5)の続きです。今回はSYSTOOLS.COMPARE_FILE 表関数でソース物理ファイル（オブジェクトタイプ*PF 属性 SRC-PF）の比較をしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/795ba937-891d-b793-4e25-25237ec0e2cc.png)

## テスト用ファイル
***比較用*SRCPF① DEMOLIB/QRPGLESRC/K201R***
※EOLのK201RをCVTRPGSRCコマンドでILE RPG変換したソースファイルです。
今回は50.00行目のEXCEPT命令を修正しソースファイルに差異を作ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/cc3692cd-2e79-f005-c8a7-dfb6edf8c206.png)

***ファイルの所有者はQDFTOWN***です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0353135f-7319-b177-db2e-4026ad1d9b8e.png)



***比較用*SRCPF② GOMALIB/QRPGLESRC/BCH110***
※①のファイルをコピーして作成し、50.00行目をSEUで編集。***命令ステートメント自体は①と同一に書き戻します。ですが、行の更新日付は更新されます。（下記では240408に更新されています）。①のファイルでは　880528 となっています。***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8b7ee2b2-fe59-9d08-19d9-e4ca70e6411e.png)

※余談ですが、つまりこのファイルのオリジナルRPGⅢの作成日は1988/05/28なのでしょうか？OS/400 V.1で書いたソースファイルが何世代もSAVE/RESTOREされて今に至る、、みたいな・・だとしたら感無量T T)。あれ、でもCVTRPGSRCしたときソース編集日付も残りましたっけ？確認してみます。

***ファイルの所有者はGOMA***に変更しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d45d79ab-6d57-d53b-da53-dc41913395d0.png)

## テスト結果
### 実行例1 属性の比較 ATTRIBUTES *YES
```
SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
                                       LIBRARY1=>'DEMOLIB', FILE1=>'QRPGLESRC', 
                                       LIBRARY2=>'GOMALIB', FILE2=>'QRPGLESRC',
                                       COMPARE_ATTRIBUTES=>'YES',
                                       COMPARE_DATA=>'NO'
                                       ));
```
※（現在の？）首記関数ではソースメンバー名の指定ができません。メンバー名指定できるとより使いやすいのではと思います。
結果の方は、データベーステーブルと同様にオブジェクト属性の差異を表示してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ab2b1434-ec92-2f05-e895-e5b7ff3bdc13.png)

### 実行例2 データの比較 COMARE_DATA *YES
次はファイルの中身の比較です。
```
SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
                                       LIBRARY1=>'DEMOLIB', FILE1=>'QRPGLESRC', 
                                       LIBRARY2=>'GOMALIB', FILE2=>'QRPGLESRC',
                                       COMPARE_ATTRIBUTES=>'NO',
                                       COMPARE_DATA=>'YES'
                                       )
```
その結果は、、ソースの行単位の編集日付も比較してくれているようです。50.00行目が返されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8875621c-45a6-0c2e-bdb0-ccb02729e61f.png)

なるほど、この結果からするとソースファイルの比較には使えるかもしれません。
パッと触った考慮点としては、ソースファイルを総なめしますので相応に処理時間がかかりそうなこと、CPU負荷などは気にする必要がありそうです。
Acsessでエクセルを外部テーブルとしてインポートする方法

```vb
Sub ImportExcelToAccess()
    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim fld As ADODB.Field
    Dim strExcelPath As String
    Dim strSQL As String

    ' Excel ファイルのパスを設定
    strExcelPath = "C:\path\to\your\excel.xlsx"

    ' Excel への接続文字列 (Excel バージョンによって異なる場合がある)
    conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Data Source=" & strExcelPath & ";" & _
                            "Extended Properties='Excel 12.0 Xml;HDR=YES';"
    conn.Open

    ' Excel ファイルの特定のシートと範囲からデータを選択するSQLクエリ
    strSQL = "SELECT * FROM [Sheet1$]"

    ' クエリを実行して結果を Recordset に格納
    rs.Open strSQL, conn, adOpenStatic, adLockReadOnly

    ' 結果をループして処理（例: デバッグ出力にフィールド名と値を表示）
    Do While Not rs.EOF
        For Each fld In rs.Fields
            Debug.Print fld.Name & ": " & fld.Value
        Next fld
        rs.MoveNext
    Loop

    ' オブジェクトを閉じてクリーンアップ
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
End Sub
```
AWS CodeCommit クローン時にエラー 資格情報ヘルパー

CodeCommitからcloneしようとした際に以下のエラーが出てた。

```
git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/wildrydes-siteSS
Cloning into 'wildrydes-siteSS'...
kinoko@git-codecommit.ap-northeast-1.amazonaws.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

# 解決

以下の `Step 3: Set up the credential helper` に記載がありますが、資格情報ヘルパーの設定をしたら動作した。

https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-https-unixes.html#setting-up-https-unixes-credential-helper

# 資格情報ヘルパー？

認証情報ヘルパー（Credential Helper）は、Gitと外部システム間での認証情報の管理をしてくれる。
Gitでは、リモートリポジトリへのアクセス時に認証が必要になることがあるが、毎回認証情報を入力するのは不便なので、認証情報ヘルパーを使用することで、認証情報を安全に保存し、必要時に自動的に提供可能となる。

git config --global credential.helper '!aws codecommit credential-helper $@': 

- aws codecommit credential-helperをGitの認証情報ヘルパーとしてグローバルに設定
- credential-helperに続く$@は、Gitから認証情報ヘルパーに渡される引数を表す
- !で始まるコマンドは、シェルコマンドとして実行されることを意味する
- この設定により、CodeCommitにアクセスする際、AWS CLIが管理する認証情報を使用して自動的に認証を行う

git config --global credential.UseHttpPath true: 

- Gitは通常、ホストレベルで認証情報を保存するが、この設定をtrueにすることで、パスレベル（つまりリポジトリレベル）で認証情報を区別して使用する
- これは、同じサーバー上に複数のCodeCommitリポジトリがある場合に特に有用

## つまり

これらの設定により、AWS CodeCommitのリポジトリにアクセスする際に、AWSの認証情報（通常はAWS CLIを通じて設定されたもの）を自動的に使用して認証することができます。これにより、リポジトリにアクセスするたびにユーザー名とパスワードを入力する手間が省けるということらしい
【Next.js】async await ができない（pageルータ）

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回はNext.jsを使って開発している時に困ったことについての備忘録として記事を作成しました。

# 困ったこと

```
Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
```

このエラーが出てしまった async await ができなくなってしまいました。

# 解決策

pageルーたからappルータに処理を変更したら解決しました。

>app ディレクトリ内のページはデフォルトで Server Componentsとして動作します。これはクライアントコンポーネントである pages ディレクトリのページとは異なる挙動なので、その点に注意しながらページの置き換えを進めます。
(引用：https://zenn.dev/ryo_manba/articles/b48b85513d08d5)

pageルーたとappルータの仕様についてしっかりと理解しないといけませんでした。

それと、サーバコンポーネントとクライアントコンポーネントについてもです。


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://zenn.dev/ryo_manba/articles/b48b85513d08d5
ICOからSTOへ: 資金調達の新時代を読み解く

きっかけがあって、STOsについて勉強したことをまとめてみました。

:::note warn
注意
以下はセキュリティトークンについて門外漢の勉強ようメモです。
:::

## その前にICOってなんだっけ

ICO（Initial Coin Offering）は、企業が新しいプロジェクトの資金を集めるために行うトークンの販売です。このプロセスを、新しいカジノを建設するために事前にカジノチップを販売するという比喩で考えてみましょう。例えば、将来$1の価値があるカジノチップを、建設資金を調達するために80セントで事前販売します。この事前販売により、カジノは開業前に資金を集めることができ、チップを購入した人は開業後にカジノでチップを使用できるようになります。（よくセブンイレブンでもなんかの商品買ったら発売前のコーヒーの引換券もらえるけど、それってこの応用じゃないかな。）

## ICOで発行されるトークンの種類

- **ユーティリティトークン:** 未来の製品やサービスへのアクセス権を提供します。例えば、ブロックチェーンベースのプラットフォーム上で使用される特定のサービスへのアクセス権を与えます。

- **セキュリティトークン:** 株式や債券のような、投資から利益を得ることを目的とした金融資産を表します。投資者は配当や利益の分配を期待できます。

- **ガバナンストークン:** プロジェクトのガバナンス、つまり、プロジェクトの意思決定プロセスに参加する権利をトークン保有者に提供します。これにより、トークン保有者はプロジェクトの将来の方向性や規則の変更に投票できるようになります。

## 市場の拡大: 資産クラスのトークン化

STO（セキュリティトークンオファリング）は、不動産、美術品、希少なコレクターアイテムなど、従来は高価で流動性が低かった資産クラスをトークン化することで、より広い範囲の投資家にアクセス可能にします。トークン化とは、これらの実質資産をデジタルトークンに変換し、ブロックチェーン上で表現するプロセスです。このプロセスにより、資産の所有権の一部を小額から購入できるようになり、資産への投資がより柔軟でアクセシブルになります。たとえば、不動産トークン化により、高価な不動産への投資を複数の投資家が分割して行えるようになり、それぞれが資産の一部を所有することができます。このアプローチは、資産クラスの流動性を高め、新しい市場の機会を創出します。
いろんなものをトークン化できる理想の世界に一歩ずつ近づいているようでワクワクしますね。

### STOの利点

STOは、法規制とブロックチェーン技術を統合し、安全で信頼性の高い効率的な資金調達ツールを提供します。主な利点には以下があります：

- **セキュリティと信頼性**：セキュリティトークンの取引と起源はブロックチェーン上で暗号学的に検証可能で、信頼性の高い記録を提供します。
- **運用の柔軟性**：STOは24時間365日運用可能で、投資家が新しい情報に迅速に対応し、有利なポジションを保つことを可能にします。
- **仲介者の削減**：STOにより、多くの伝統的な仲介者を排除し、コストと取引時間を大幅に削減できます。
- **流動性の向上**：セキュリティトークンによる分割所有が可能となり、市場の流動性が大幅に向上します。
- **プログラマビリティ**：セキュリティトークンは特定のルールをプログラムすることが可能で、コンプライアンスやガバナンスのプロセスを自動化できますhttps://pixelplex.io/blog/sto-regulations/

### STOを立ち上げる際の課題と解決策

STOを立ち上げるプロセスは複雑で、以下のようないくつかの課題があります：

- **規制の遵守**：STOの規制遵守を確保することは重要です。マルタ、スイス、アメリカなど、国によってSTOに関する規制が異なります
- **技術とプラットフォームの検討**：正しいトークン化プラットフォームの選択が重要です。プラットフォームはトークン化のプロセス、トークンの発行後のサポート、および二次取引の問題に対するアプローチが異なりますhttps://dilendorf.com/resources/14-key-considerations-when-launching-a-security-token-offering.html
- **銀行および金融サービス**：クリプトフレンドリーな銀行サービスへのアクセスは限られています。トークン発行者は、金融運営を円滑に行うために、銀行要件とサービスを慎重にナビゲートする必要がありまhttps://dilendorf.com/resources/14-key-considerations-when-launching-a-security-token-offering.html
- **二次市場と流動性**：セキュリティトークンの二次取引のためのプラットフォームを確立することがSTO成功の鍵らしいhttps://dilendorf.com/resources/14-key-considerations-when-launching-a-security-token-offering.html
### 追加の考慮事項

STOを立ち上げる前に、何がトークン化されるのか、トークンの管轄区域、適切な企業構造とガバナンスを確実にすることが必要。
さらに、AML（反マネーロンダリング）およびKYC（顧客確認）要件に準拠し、プロジェクトの目標と法的要件に合致する適切なトークン化プラットフォームを選択することが必要です
https://cointelegraph.com/learn/sto-101-a-beginners-guide-on-launching-a-security-token-offering
Yocto 4.3.3でPokyをビルドしQEMUで動かしてみた

# はじめに
Yocto 4.3.3を用いてリファレンスディストリビューションであるPokyをビルドし、QEMUで動かしてみました。

# 参考にしたサイト
- [Yocto Project Quick Build](https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html)

# 構成図
```
+------------------------------------------------------+
| +--------------------------------------------------+ |
| | +----------------------------------------------+ | |
| | | Poky                                         | | |
| | +----------------------------------------------+ | |
| | QEMU                                             | |
| +--------------------------------------------------+ |
| Ubuntu Server                                        |
+------------------------------------------------------+
```

# 各ソフトウェアのバージョン
## Ubuntu Server
```
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.6 LTS"
```

## QEMU 
```
$ qemu-system-aarch64 --version
QEMU emulator version 8.1.4
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers
```
- Pokyをビルドした時に生成されたqemu-system-aarch64を使用しました。
  ```
  /home/iotsudo/github/yocto/yocto-4.3.3/poky/build/tmp/work/x86_64-linux/qemu-helper-native/1.0/recipe-sysroot-native/usr/bin/qemu-system-aarch64
  ```
  - 後述のrunqemuコマンドを実行すると、上記コマンドが実行されます。

# 前提条件
- sudo権限を持ったiotsudoというユーザで操作しました。
- 以降の作業は、iotsudoユーザのホームディレクトリ/home/iotsudoの配下で行いました。

# リポジトリのクローン
1. 以下のディレクトリを作成し、そのディレクトリに移動してください。
   ```sh
   mkdir -p /home/iotsudo/github/yocto/yocto-4.3.3
   ```
   ```sh
   cd /home/iotsudo/github/yocto/yocto-4.3.3
   ```
1. yocto-4.3.3のリポジトリをクローンしてください。
   ```sh
   git clone -b yocto-4.3.3 https://github.com/yoctoproject/poky.git
   ```

# Pokyのビルド
1. 以下のディレクトリに移動してください。
   ```sh
   cd /home/iotsdo/github/yocto/yocto-4.3.3/poky
   ```
1. 以下を実行し、環境変数の設定を行ってください。
   ```sh
   source oe-init-build-env
   ```
1. vimなどでconf/local.confの末尾に以下を挿入してください。
   ```
   MACHINE = "qemuarm64"
   ```
1. bitbakeコマンドでPokyのビルドを行ってください。
   ```sh
   bitbake core-image-weston
   ```
   - 今回はwestonを使いたかったので、core-image-westonを指定しました。
   - 最小限の構成でビルドする場合は、core-image-minimalを指定してください。
     - 参考: https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html#building-your-image

# PokyをQEMUで実行する
1. 以下のコマンドを実行してください。
   ```sh
   runqemu qemuarm64
   ```
   - GUIを使わない場合は、以下のコマンドを実行してください。
     ```sh
     runqemu qemuarm64 nographic
     ```

1. 実行後、以下のような画面が表示されます。
   ![weston-wayland.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552998/f3559615-2588-f790-2114-3fb032272021.png)
   - FIXME: Windows 11 -- RDP --> Ubuntu Server 20.04 -- QEMU --> Pokyで接続しているためか、ターミナルに「ls」と打とうとすると「lllllllllllsssssssss」となる事象が起きています…うーんQEMUだとつらいか…

# さいごに
本当はGUIでいろいろ試したいことがあったのですが、QEMU環境だとちょっとつらいようです…
【モンティホール問題】記憶喪失しても確率は変わらない


## これ is 何

ダウンロードフォルダ内の無駄な画像を削除しているときに、
モンティホール問題はドアを変える直前に記憶喪失するとドアの確率が変化する！と主張していた人に反論で使った画像が出てきて、それがなかなか面白かったので思い出と知識の共有のために貼っておく。

## 本題

**赤文字は記憶保持者の世界**
**青文字は記憶喪失者の世界**

青文字が覚えていること
・モンティホール問題のルールとその性質
青文字が忘れていること
・自分が最初に選択したドア

![mon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/63957ab1-e3d5-5e76-10a7-27a432d77e61.png)
itako: Anthropic APIを用いたロールプレイチャットボットの開発|gradio,streaming,claude,colab



## はじめに

近年、自然言語処理技術の発展に伴い、チャットボットの開発が盛んになっています。本記事では、Anthropic APIを利用して、ユーザーが指定した役割、口調、発話例、制約条件に基づいてロールプレイを行うチャットボットアプリケーション「itako」の開発について解説します。

https://colab.research.google.com/drive/1D-e78pmMvJtntKWgbDeE97h7ymq0a6Es?usp=sharing

## 開発環境

- Python 3.x
- Gradio
- Anthropic API

## アーキテクチャ

itakoは、以下のような構成になっています。

1. フロントエンド：Gradioを使用して、ユーザーインターフェースを構築します。ユーザーは、設定パネルでモデルやパラメータを指定し、ロールプレイの役割や口調などを入力します。

2. バックエンド：Pythonを使用して、Anthropic APIとの通信を行います。ユーザーの入力に基づいて、System promptを生成し、APIにリクエストを送信します。APIからの応答を処理し、フロントエンドに表示します。

## 主要な機能

1. `create_system_prompt`関数：ユーザーが指定した役割、口調、発話例、制約条件に基づいて、System promptを生成します。

2. `respond`関数：ユーザーのメッセージとSystem promptを用いて、Anthropic APIにリクエストを送信し、アシスタントの応答を生成します。この関数では、ストリーミングAPIを使用することで、応答をリアルタイムに表示します。

3. ロールプレイの例：`examples`変数に、あらかじめ定義されたロールプレイの例を格納しています。これにより、ユーザーは簡単にロールプレイを試すことができます。

## 実装の工夫点

1. ストリーミングAPIの使用：`respond`関数では、ストリーミングAPIを使用することで、アシスタントの応答をリアルタイムに表示しています。これにより、ユーザーは応答を待つ間、テキストが徐々に表示されていく様子を見ることができます。

2. System promptの生成：`create_system_prompt`関数では、ユーザーが指定した役割、口調、発話例、制約条件を組み合わせて、System promptを生成しています。これにより、アシスタントはユーザーの意図に沿ったロールプレイを行うことができます。

3. カスタマイズ性：`examples`変数や`create_system_prompt`関数、`respond`関数を変更することで、アプリケーションの動作をカスタマイズできます。これにより、開発者は自分のニーズに合わせてitakoを拡張することができます。



## おわりに

本記事では、Anthropic APIを用いたロールプレイチャットボットの開発について解説しました。itakoは、ユーザーが指定した条件に基づいてロールプレイを行うことができる、柔軟性の高いチャットボットアプリケーションです。今後も、自然言語処理技術の発展に伴い、より高度なチャットボットの開発が期待されます。

---

この技術記事では、itakoの開発環境、アーキテクチャ、主要な機能、実装の工夫点、今後の展望について解説しています。実装の詳細や工夫点を具体的に説明することで、読者にitakoの技術的な側面を伝えることができます。また、今後の展望を示すことで、itakoのさらなる発展の可能性を示唆しています。
2024/4/08主にITとかセキュリティの記事

「中国、ＡＩで情報操作して韓国選挙介入の可能性」　ＭＳが警告(4/6)
https://japanese.joins.com/JArticle/317105?sectcode=A30&servcode=A00%20title=

「中国は韓国の選挙でAIによる捏造情報を拡散する恐れ」　マイクロソフトが警告(4/6)
https://www.chosunonline.com/site/data/html_dir/2024/04/06/2024040680005.html

韓国、Temuとアリエクスプレスの個人情報利用実態を調査(4/6)
https://www.epochtimes.jp/2024/04/215785.html

ＬＩＮＥヤフー、韓国ネイバーとの「資本関係見直し」に疑念　情報管理の杜撰さに深刻なリスク　国を挙げた検証と「脱ＬＩＮＥ」を(4/6)
https://www.zakzak.co.jp/article/20240406-HA42WYUKGVPL7A6SSMMY7MIT34/

韓国ネイバー、自社の生成AIは「GPT-4やLLaMAより仕事上手」とアピール(4/6)
https://www.afpbb.com/articles/-/3513639?cx_part=top_category&cx_position=1
https://www.afpbb.com/articles/-/3513639

流出…サークル応募の29人、個人情報が閲覧可に　ネット上の設定ミスが原因、子育てセンターが謝罪「第三者が流用した形跡ない」　申し込み者が異変に気付く　アプリ利用した3人のメールアドレスも公開されていた(4/6)
https://www.saitama-np.co.jp/articles/74684

[AWS]クラウドプラクティショナーとは？(4/5)
https://qiita.com/Yumesan/items/2c8a523980b21671b4e4

セキュリティポリシー策定支援サービスとは！その必要性などを解説(4/6)
https://cybersecurity-jp.com/column/96962

イオス（$EOS）はどんな仮想通貨？特徴と将来性を完全解説！(4/6)
https://crypto-times.jp/what-is-eos/

考えておきたい、企業データのBCP対策について(4/7)
https://japan.cnet.com/release/30960606/?ref=rss
https://www.jiji.com/jc/article?k=000000373.000040956&g=prt

Amazon で横行する「商品ページ乗っ取り」。サードパーティー出品者は諦めムード(4/6)
https://digiday.jp/modern-retail/a-hijacked-amazon-product-page-highlights-a-major-third-party-seller-pain-point/

gradleでの依存関係の管理でハマったこと(4/4)
https://qiita.com/taka194/items/e982d7c080e923f5487f

Chromeのセキュリティ機能がアップデート　リアルタイムでプライバシーを保護しフィッシング試行をブロック(4/6)
https://atmarkit.itmedia.co.jp/ait/articles/2404/06/news030.html

Amazonから妻宛てに「3万円」の代引き荷物が！→帰宅後の妻「頼んでないけど？」まさか「代引き詐欺」に引っかかった!? お金は返ってくるの？ 対処方法を解説(4/6)
https://nordot.app/1149212138086301886

「JINS」「Zoff」で一部レンズの販売に影響が　「OWNDAYS」「眼鏡市場」でも納期遅れる(4/5)
https://www.fnn.jp/articles/-/681655
デバッグ環境でuseEffectが2回実行される

# 困ったこと
Next.jsで開発をしていたら以下のような`useEffect`が2回発火した

```tsx
useEffect ( () => {
//初めてレンダリングされたときの処理
}, []);
```

依存配列に何も渡していないので一度だけ実行されるはずが、実際には二度実行され、原因が分からなかった

# 原因
Reactの[Strictmode](https://ja.react.dev/reference/react/StrictMode)が原因だった
[公式ドキュメント](https://ja.react.dev/reference/react/StrictMode)によれば、
> コンポーネントは、純粋でない (impure) レンダーによって引き起こされるバグを見つけるために、レンダーを追加で 1 回行います。

とこのこと。
これによってコンポーネントが二度レンダリングされていたため`useEffect`も二度発火した
試しに`yarn build` -> `yarn start`で試してみると、きちんと一度だけ`useEffect`が発火した

# 解決方法
一時的に`<Strict>`を外せば本来の動作を確認できる
ビルドして確認してもよい

# 参考
* [&lt;StrictMode&gt; – React](https://ja.react.dev/reference/react/StrictMode)
Next.js×TypeScriptでモダンなWebアプリを作る[環境構築編]

# 1. はじめに
「レンダリング手法の選択肢の多さ」や「環境構築の簡単さ」などから、近年人気が高まっているReactフレームワーク**Next.js**。そのNext.jsは**TypeScript**をサポートしており、より安全な開発を行うことが可能です。
そんなNext.jsとTypeScriptを用いてモダンなWebアプリを作成してみようと思います。

# 2. 環境構築
Next.jsではサーバーサイドでJavaScriptを実行するため、**Node.js**のインストールが必須です。[公式サイト](https://nodejs.org/en/download)からインストールできます。
ターミナルで`node -v`を実行し、バージョンが表示されればOKです。

次に、Nextプロジェクトを作成します。
プロジェクトを作成したいディレクトリで、以下のコマンドを実行します。
`npx create-next-app [プロジェクト名]`

すると、色々聞かれますのでご自身のお好きなように設定しましょう。
私は以下のようにしました。
```
Would you like to use TypeScript? » Yes
Would you like to use ESLint? » Yes
Would you like to use Tailwind CSS? » No
Would you like to use 'src/' directory? » Yes
Would you like to use App Router? » Yes
Would you like to customize the default import alias (@/*)? » Yes
What import alias would you like configured? » ~/*
```
**ESLint**：構文エラーやコーディング規約をチェックすることができるツール
**Tailwind CSS**：CSSフレームワーク
**App Router**：Next.jsにおけるルーティングシステム

インストールが終わったら`npm run dev`コマンドを実行し、立ち上がったローカルサーバーにアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633708/3bc2c2c3-331c-46b3-9c1a-92a67e23bdf1.png)

画像のように表示されれば、とりあえず環境構築は完了です。

# 3. おわりに
今回はNextプロジェクトを起動するための環境構築を行いました。
次回からは実際にコードを書いて、アプリを作って行こうと思います。
Streamlining Office Operations with Project Management Solutions

In the digital age, where collaboration and organization are the cornerstones of success, leveraging the right project management tools and apps can significantly enhance office efficiency. Let's explore four essential solutions that are revolutionizing the way modern workplaces operate:

Project Management Software: Maximizing Collaboration and Coordination
Project management software serves as the backbone of efficient office management, providing teams with centralized platforms to plan, execute, and monitor projects collaboratively. With features like task assignment, Gantt charts, and real-time updates, these software solutions empower teams to stay aligned and focused on their goals.



Key Features: Collaboration, Task Management, Progress Tracking

Project Management App: Productivity On-the-Go
In today's fast-paced work environment, flexibility and mobility are key. Project management apps cater to this need by offering mobile solutions that allow users to manage projects and tasks from anywhere, at any time. Whether it's updating task statuses or communicating with team members, these apps ensure seamless workflow continuity.

Key Features: Mobile Accessibility, Task Updates, Communication

Project Tracker Tool: Monitoring Progress with Precision
Effective project management hinges on the ability to track progress and identify potential bottlenecks. Project tracker tools provide comprehensive insights into project status, timelines, and resource allocation. By visualizing progress and identifying dependencies, teams can proactively address issues and ensure timely project completion.

Key Features: Progress Monitoring, Timeline Visualization, Resource Allocation

Office Management Software: Orchestrating Seamless Operations
Beyond project-specific tools, office management software plays a vital role in optimizing overall workplace efficiency. These comprehensive solutions encompass various aspects of office administration, including communication, document management, and resource planning. By centralizing essential functions, office management software fosters cohesion and streamlines workflows across departments.

Key Features: Communication, Document Management, Resource Planning

Conclusion: Enhancing Office Efficiency with the Right Tools
In today's competitive business landscape, efficiency is the key to success. By leveraging advanced project management software, apps, tracker tools, and office management software, organizations can unlock new levels of productivity and collaboration. Whether it's streamlining project workflows or optimizing overall office operations, investing in the right tools is essential for staying ahead of the curve.

Empower your team with these innovative solutions and embark on a journey towards unparalleled efficiency and success in the modern workplace.
Pythonで「バイナリファイルの読み込みと書き込み」の動作を確認してみた

# 概要

Pythonで「バイナリファイルの読み込みと書き込み」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/file/index4.html

# 実装

以下のファイルを作成しました。
```sample.py
fr = open('circle_o.png', 'rb')
fw = open('circle_c.png', 'wb')

while True:
  data = fr.read(1)
  if len(data) == 0:
    break
  fw.write(data)

fw.close()
fr.close()
```

以下のファイル（circle_o.png）を準備しました。
![circle_o.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/548904e5-dd91-e6ae-f725-33be654452bf.png)

以下のコマンドを実行しました。
```
$ python3 sample.py
```

以下のファイル（circle_c.png）が作成されました。
![circle_c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/9c3c9ecc-15c1-11d3-6b9e-9a2b1c3356bd.png)

# まとめ

何かの役に立てばと。
Build input file cannot be found: ~~Info.plist ビルドできないエラーについて

アプリを作成している中で、ファイル名に謎の空白が存在していることに気づき、途中でファイル名を書き直しました。
するとエラーがでしまいて、ビルドできなくなりました。

## 対処法
![スクリーンショット 2024-04-08 0.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715605/7f50aa46-9cbc-bfcc-1687-17a270ca70d7.png)

緑線🟢で囲っているところ、変更前のプロジェクトファイル名/info.plistになっているはずですので、変更後のプロジェクトファイル名/info.plistに修正する。

## おわりに
学習を進めていく中で、エラーに出会い解決するたび成長を感じます。
これからも少しずつ着実に学習を進めていこうと思います。
Vscodeのターミナルからコマンド操作でエクスプローラーを開く方法（備忘録）

# はじめに
Vscodeのターミナルからエクスプローラーを開きたい時はないでしょうか。
いちいちパスをコピーして、エクスプローラーにパスをペーストして対象の階層を開く・・等していては面倒です。

# 環境
- vscode
- powershell

# コマンド
以下のコマンドで対象の階層のエクスプローラーを開けます。

```powershell
start .
```