OmniAICreator/Qiita-1.07M huggingface dataset:
Open Libertyをオフライン環境でもZIPファイルから起動する

Open Libertyをオフライン環境で動作させたい場合に、ZIPファイルから起動する方法を記載します。

ただし毎回ZIPファイルを手動で展開したりアプリケーションをデプロイするのは面倒です。Liberty Maven pluginを活用しながらZIPファイル起動を試みます。


## 本記事で使用するコンポーネント

|コンポーネント名|バージョン|
|:--|:--|
|JDK|OpenJDK 17.0.9 (IBM Semeru Runtime Open Edition)|
|Open Liberty|24.0.0.1|
|Apache Maven|3.9.6|
|Liberty Maven plugin|3.10|

```shell
$ java -version
openjdk version "17.0.9" 2023-10-17
IBM Semeru Runtime Open Edition 17.0.9.0 (build 17.0.9+9)
Eclipse OpenJ9 VM 17.0.9.0 (build openj9-0.41.0, JRE 17 Mac OS X amd64-64-Bit Compressed References 20231017_583 (JIT enabled, AOT enabled)
OpenJ9   - 461bf3c70
OMR      - 5eee6ad9d
JCL      - 3699725139c based on jdk-17.0.9+9)
```

## Open LibertyのZIPファイルの入手

Open Libertyの「Get Started」ページからZIPファイルを入手します。
使いたいバージョンおよびパッケージ名からダウンロードリンクを辿ります。

https://openliberty.io/start/

パッケージはWebアプリ目的かつ使いたいFeatureが分かる場合は「Web Profile ~」、どのFeatureを使うかわからない場合は「Jakarta EE ~」を選んでおくと後からFeatureが足りないといった手戻りが少ないです。

この記事では「Web Profile 10」のZIPファイルを使用します。

## pom.xmlの設定

他のローカル開発環境での起動方法同様に、ZIPファイルからの起動はLiberty Maven Pluginを使用します。

アプリケーションのpom.xmlにLiberty Maven pluginを追加します。
このMaven pluginもMaven Centralからダウンロードしますので、オフライン環境では事前にローカルリポジトリ(`.m2`など)にpluginのJARファイルを配置しましょう。

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<project>
  ...
  <build>
    <finalName>offline-demo</finalName>
    <plugins>
      <!-- Liberty Maven plugin -->
      <plugin>
        <groupId>io.openliberty.tools</groupId>
        <artifactId>liberty-maven-plugin</artifactId>
        <version>3.10</version>
        <!-- ZIPファイルから起動する -->
        <configuration>
          <runtimeArchive>/path/to/openliberty-webProfile10-24.0.0.1.zip </runtimeArchive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
```

重要な部分は `configuration > runtimeArchive` のブロックです。
`runtimeArchive` に先ほどダウンロードしたZIPファイルのパスを指定します。
この状態でMavenゴールを指定するだけで自動的にZIPファイルを展開してアプリケーションをデプロイするようになります。

```xml
<project>
  ...
  <build>
    <plugins>
      <plugin>
        ...
        <!-- ZIPファイルから起動する -->
        <configuration>
          <runtimeArchive>/path/to/openliberty-webProfile10-24.0.0.1.zip</runtimeArchive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
```

## 稼働確認

前述のLiberty Maven pluginの設定を追加した状態で Open Liberty を起動します。
ログにローカルのZIPファイルを使用された旨のメッセージが出力されています。

```shell
$ mvn liberty:dev
...
CWWKM2102I: non-artifact based assembly archive : /path/to/openliberty-webProfile10-24.0.0.1.zip を使用しています。
...
Installing assembly...
Expanding: /path/to/openliberty-webProfile10-24.0.0.1.zip into /path/to/project/liberty-demo-app/target/liberty
...
[監査      ] CWWKZ0001I: アプリケーション liberty-demo-app が 11.048 秒で開始しました。
```

## 参考

[ci.maven - Liberty installation configuration](https://github.com/OpenLiberty/ci.maven/blob/main/docs/installation-configuration.md#using-a-packaged-server)

---

以上。
NavLinkを使ってみた（備忘録）

# NavLinkとは
https://reactrouter.com/en/main/components/nav-link

```<Link>```の特別な種類で、それが「アクティブ」か「保留中」か「遷移中」かを知っています。

ナビゲーションメニューでどれが現在選択されているかを表示するのに便利です。

デフォルトでは、```<NavLink>```コンポーネントがアクティブになるとactiveクラスが追加されるので、CSSを使ってスタイルを設定することができます。

# サンプルコード
```tsx
return (
    <div className={styles['header-nav']}>
      <nav>
        <ListItem>
          <ul>
            <NavLink
              to="/pagea"
              className={({ isActive }) => (isActive ? styles['active'] : '')}
            >
              ページA
            </NavLink>
          </ul>
          <ul>
            <NavLink
              to="/pageb"
              className={({ isActive }) => (isActive ? styles['active'] : '')}
            >
              ページB
            </NavLink>
          </ul>
          <ul>
            <NavLink
              to="/pagec"
              className={({ isActive }) => (isActive ? styles['active'] : '')}
            >
              ページC
            </NavLink>
          </ul>
```

classNameプロップは通常のclassNameのように動作しますが、リンクのアクティブ状態と保留状態に基づいて適用されるclassNameをカスタマイズするために関数を渡すこともできます。
trusted publishingとは？

# 概要

「信頼された出版を設定する」[^1]とか日本語訳されている「trusted publishing」とは何か？を、GitHub Actionsを用いてPyPIに配布パッケージをアップロードする（登録する）場面に即して解説する。

[^1]: https://packaging.python.org/ja/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/#configuring-trusted-publishing


# trusted publishingとは？

PyPIへの登録を行える人を、PyPIアカウント所有者以外に追加で登録する仕組み、と捉えることが出来る。

通常はPyPIアカウントの所有者が実行した「アップロード処理」に限ってPyPIは許可する。これに対して「私の代わりに、このPublisherにもアップロードの権限を与えてくれ」と設定すること、と言える。

通常のTwineを用いたアップロード処理の流れは以下の通り。
![pypi-by-twine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125588/15fb6a6e-2b42-80f8-6d3e-279b97227e8d.png)

これに対して、「登録済みのPublisher（＝信頼されたPublisher）に対して、都度に有効期間の短いAPIトークンを発行してアップロード処理を許可する」仕組みであるtrusted Publisherを用いたアップロード処理は以下の通り。

![pypi-by-trusted-publiser-secquence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125588/95660845-0fdb-b7e7-204e-580e98c9a3ee.png)

APIトークンは、都度に「PyPIアカウント→登録済みのPublisher」へ発行してすぐ有効期限切れになる。Publisherに対して、Aさん自身が**APIトークンの管理をしなくて良い**、が利点だね。（つまり、GitHub SecretsにAPIトークンを登録する必要が無い）。
samdal-network

誰かが ｻﾝﾀﾞﾙと叫んだんです　それが始まりだったと思います
こちら ｻﾝﾀﾞﾙﾈｯﾄﾜｰｸになるます


![rogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/fe2fbc65-b29b-082b-1d45-19224ec967e1.png)



娘のぱそ美@amenoudumeに書いてもらいました
詳しい事は　ここに書くかも　書かないかも

https://qiita.com/amenoudume/items/4f0b4024db9577669b32?utm_campaign=post_article&utm_medium=twitter&utm_source=twitter_share

この samdal-networkの core node
samdal-samdalCore-001の nodeinfoはこうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/a09a673e-2985-8ac1-88ba-780c0d759861.png)


"networkGenerationHashSeed": "2C922AF117618EC9CBA13D64243456305C9C0BABD6ED492F2979B7017F6102AB"

"networkIdentifier": 104,
ここが 104なので mainnet仕様です 使用通貨は samdal.sdlです
挙動は symbol mainnetと同じ筈（？）です

とりあえず 2~3基の nodeで引っ張って行こうと思ってます

まぁそのこの networkに参加するには2通りの方法がありますね
そこらへんは娘のぱそ美@amenoudumeが書いてるんでそっち見て下さい
資金や技術がなくてもSNSをリリースできる３つのコツ【個人開発】


はじめまして、しゅんすけと申します。
このたび、アートコレクター向けのウェブサイトをリリースしました。
エンジニアが個人開発のサービスを紹介する場としてQiitaは最適だと思ったので、ここに紹介させていただきます。

いま流行りのフロントエンドのフレームワークを使わずに、プログラミング言語としてはDjangoだけを使っています。ウェブサービスを公開するにあたって、需要があるかどうかわからないサービスをつくっていくのに、余計なコストをかけたくなかったからです。

また、サービスをつくるうえにあたって、生成AIによる技術支援が当たり前になっている現在では、技術にコストをかけるよりもいかに早く創造するかに重心を置いた方が良いと思っています。（※ここでいう、コストとはサーバー代など実際に支払う必要のあるインフラコストのことだけでなく、新しい技術を学ぶことにかかる学習コストと、複雑な設計を問題なく運用させるための運用保守コストも含まれます。）

そのため、新たな技術フレームワークを学びたい人にとっては、あまり役に立たない記事かもしれませんが、技術はあくまでも手段であり、なにか自分でウェブサービスを構築したいという人にとっては、参考になるかもしれません。

記事投稿から3ヶ月あまりですが、少しずつ機能やコンテンツを追加しています。
１年後には少しでも参加しやすいプラットフォームになっていれば幸いです。

## 資金や技術がない個人がSNSをリリースするために
### １、コストをかけない
はじめにも書いていますが、まず第一にこれを制約とした方がいいです。サービスは継続してナンボです。
一般的なIT企業で働くと、それなりに良い設計でセキュリティの高いNWなどを構築していることが多いですが、コストをかけてしまうと、早く収益を得たいと思い、サービスの本質に向き合う時間が減ってしまうような気もします。
ゆっくりじっくりサービスを育てていきましょう。

代表的なコスト
・インフラコスト
これは、サーバー代やドメイン維持・取得費用など、実際に支払いがあるもの

・技術コスト
学習コストともいうが、あえて技術コストと書く。

・運用コスト
プログラムのバグフィックス、サーバーの問題なども継続的に迅速に改修・対応できること

### ２、最新技術を学ばない
・バグは未知数であり、ChatGPTなどでだいぶ解決手段が増えたものの、日本語ドキュメントが少ない
・技術好きな人はつい新しいことを試したくなりますが、それよりもユーザーにとって良い機能をさっさとつくることに時間をかけた方がよいという意味です。
・あくまでも「学習コストのかかる新しい技術　＜　すばやい機能の提供」という意味なので、中長期的に費用対効果のある技術であれば取り入れる

### ３、締切を作らない
・時間に余裕がある方でなければ、だいたい仕事や学業の隙間時間につくることが多いと思うので、締切を作ってしまうと、精神的に体力的にも厳しい。
・少しずつでいいから機能を増やす・改善する

## サービス紹介
### アートコレクションSNS「exhiwork」

https://www.exhiwork.com

### コンセプト
~~作家を応援するアートコレクターとつながるSNS~~
アートコレクターのためのソーシャルネットワークサービス

### ピッチ
1. 誰のためか　→　資金力のないアートコレクター（自分）
2. どんな課題があるか　→　作家・コレクションを発見・共有・記録したい
3. どのように解決するか　→　ウェブ２．０
4. なぜウェブか　→　つながりやすく可視化しやすい、実績あるデータ運用
5. ビジネスモデル　→　広告モデルからフリーミアムへ

## 機能（更新中）
### リリース当初
1. アカウント登録
2. コレクション登録
3. ネーム（作家・ギャラリー・ジャンル）登録
4. プロフィール閲覧
5. 検索
6. フォロー
7. お気に入り（調整中）
8. いいね（調整中）

### リリース以降
* 2024.03 リポジトリ登録(ネーム廃止)
* 2024.03 コレクション登録
* 2024.03 ブログ登録
* 2024.04 sitemap.xml
* 2024.05 ブログタグ登録
* 2024.05 展覧会登録

### 未対応
1. アート画像の掲載
2. 非ログインユーザーへの共有・閲覧
1. アカウント周りの細かい設定
2. モダンな画面・UI
2. ソーシャルログイン

## 運用環境
1. Render.com
2. Django
3. AWS S3
4. SendGrid

## 参考
https://akiyoko.hatenablog.jp
https://zenn.dev/hathle
https://note.com/nssystems
https://qiita.com/terubooon/items/08c145aac0dd10ea8cbc

Djangoフレームワークの情報を大変丁寧に提供していただいている先駆者の方たち。

## リリースするにあたって意識したこと
* 一人でできることから少しずつ進め、〆切を決めない
* 開発言語や利用ツールなどの技術の幅を広げすぎない
* 最新技術より確実に自分が使えるものを選択（日本語ドキュメントが多いもの）
* 実装で悩んだときはできるだけシンプルな方へ
* ChatGPTも積極的に活用（無料版）
* インフラは低コストで寿命を長くする（今の所、ウェブサーバーとデータベースで月額２１００円程度。ドメイン維持費は別）
* 受託開発レベルのセキュリティ意識を捨てる

## リリースまでの経緯
* 2018年に構想
* 2019年に商標登録、技術力がなく実現できず頓挫
* １からシステム開発を学ぶために就職
* 2022年に一度リリースするものの集客できず９ヶ月ほどで停止
* アクセラレータープログラムに参加
* スタートアップコミュニティと関わり、投資家へピッチをしたり仲間を探す
* もう一度自分で開発することを決める
* 2023年10月頃から週末に開発を進めて現行の形までほぼ4カ月で完成


## 自己紹介
以下、2024現在
* 30歳から未経験で地方在住SE
* Javaを5年ほど実務で触る
* 基本情報技術者試験
* オラクルマスターシルバー
* オラクルJavaシルバーSE8
* AWS 6冠　(CLF,SAA,SOA,DVA,SAP,DBS)


## 今後の予定
* ユーザー＆仲間探し
* 技術スタックの底上げ
* ユーザーの声を取り入れて、自分のできるペースで引き続き開発

# さいごに
誰にでもやさしいアート市場を目指して、アートの敷居が下がるようなプラットフォームを創りたいと思って何年もかかりましたが、ようやくファーストステップを踏み出せました。
身近な作家を応援しているパトロンやコレクターの存在が可視化され、新しいアートの世界が開けることを期待しています。
まだ始まったばかりですが、少しでも参考になれば幸いです。
5分ではじめるLINEBot（python編）

# LINEBotをpythonで手軽にはじめたいZE！
## なんの記事？
LINEBotを手軽に始める方法はたくさんあって、とりあえずGASでやるのが王道な印象がありますが、pythonで手軽に始める方法です。
pythonはプログラミング言語のひとつです
## ChatGPTと仲良しな言語
ご存じのとおり、ChatGPTは「Advanced Data Analysis」という機能でpythonで実行可能なプログラムを作成でき、プログラミングがわからなくても、ガリガリとコードを書いていけます！
また、ChatGPTなどの生成AIの技術を使おうとするとだいたいサンプルコードがpythonだったりするので、pythonでもサクッと始められるといいなと思って記事にしました。

# 準備するもの
- Railwayのアカウント登録（[こちらから](https://railway.app/)）
    - 料金については[こちら](https://railway.app/pricing)
    - 自分のGithubからリポジトリを選択するので、Github連携をしておきましょう
    - 著者はHobbyPlanで登録していて毎月5＄かかっていますが、趣味にはお金がかかると割り切っています
- LINEDeveloersのアカウント
    - CHANNEL_SECRET
    - CHANNEL_ACCESS_TOKEN　が必要です
    - Webhookの設定が必要です
- Githubのアカウント

# 作成手順
## テンプレートを自分のリポジトリにコピー
Githubのこちらのリポジトリの「Use this template」 > 「Create a new repository」をクリックし、自分のリポジトリとしてコピーします。

https://github.com/cog1t0/railway-py-linebot

![スクリーンショット 2024-02-03 18.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/d3300869-2274-806c-82e6-6d2223fbe34b.png)

## LINE Developers
他記事参照

## Railway
「New Project」 > 「Deploy from Github repo」 > 「さっきコピーしたrailway-py-linebot」　> 「Add variables」を選択

![スクリーンショット 2024-02-03 19.07.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/0c711fcb-0ad5-e193-9766-6c5bb6fe7fc9.png)

次の画面でLINEDevelopersの「CHANNEL_SECRET」と「CHANNEL_ACCESS_TOKEN」を設定
![スクリーンショット 2024-02-03 19.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/51352449-95e0-c0ab-5f18-eb8620474ed6.png)

設定したら「Deploy」をクリックして、再度デプロイします
![スクリーンショット 2024-02-03 19.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/225a2e59-d398-31a2-a9cb-2da20e0bdfdd.png)

デプロイできたらURLをクリックします
![スクリーンショット 2024-02-03 19.27.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/43f98717-a549-b221-c513-2498dafe17a5.png)


# LINEDeveloperでWebhookの設定
最後に先ほどのURLに **「/callback」をつけたもの** をLINE Developersで作ったLINEBotのWebhookに設定します

![スクリーンショット 2024-02-03 19.27.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/29faedad-f703-84f1-2683-d78d912df75e.png)

これでpythonでオウム返しのLINEBotが完成しました！

# さいごに
いかがでしょうか？操作に慣れていると、5分もかからずにpythonによるLINEBotを立ち上げられます。
ただ、機能としてはオウム返ししかないので、ChatGPTなどとpythonのコードをpythonで書いて、やりたいことを実現していきましょう！

:::note
コードの更新を行うと、リポジトリにpushした時点で、Railwayのアプリケーションにも自動で反映されるので、その後の開発も楽チンです！！
:::
samdal👡network

https://x.com/pasomi_3/status/1753684129907126695?s=20

https://x.com/pasomi_3/status/1753688912164503646?s=20

さんだる👡ねっとわぁく
めいんのーど：
http://samdal-samdalcore-001.dusanjp.com:3000/node/info
えくすぷろぉら
http://samdal.dusanjp.com:8080
とぉけぃ
http://samdal.dusanjp.com:3003/nodes
じゃぐち
http://samdal.dusanjp.com:100

うぉれっとはぁ
ですくとっぷ👛うぉれっと(めいんねっとの方なの)で
http://samdal-samdalcore-001.dusanjp.com:3000
http://samdal-1.dusanjp.com:3000
http://samdal-3.dusanjp.com:3000
http://samdal-12.dusanjp.com:3000
のどれかにつなげるとぉ👡みえるよん💗

**のぉどを参加させるのもできるの**
やりかたはね？ふたぁつあるの👡好きな方をえらんでね

# **やりかた👡その①**
symbol-bootstrapをつかうやり方なの
```
mkdir samdal
cd samdal
wget 6.dusanjp.com/samdal/samdal.tar.gz
tar -zxvf samdal.tar.gz
vi sdl.yml
```
sdl.ymlのなかみ
```
assembly: dual
preset: samdal.yml

privateKeySecurityMode: ENCRYPT
nodes:
    -
        host: IPか domain
        friendlyName: のぉどのお名前
```
のぉどを動かすの
```
symbol-bootstrap start -c sdl.yml -d
```
あとは　しんぼるのぉどと一緒なの

# **やりかた👡その②**
samdal-bootstrapってゆ〜の作ったのぉ
これはね？　ぷりせっとに samdalがあるの

じゃあ🌺やってみるの
場所はどこでも良いの　できれば🌺ほぉむでぃれくとりね

samdal-bootstrapの👡いんすとぉる
```
wget 6.dusanjp.com/samdal/samdal-bootstrap.tar.gz
tar -zxvf samdal-bootstrap.tar.gz
cd samdal-bootstrap
npm install
npm run build
sudo npm install -g .
```
いんすとぉる🌺できたかな？
確認するの
```
samdal-bootstrap -v
```
ってするとぉ
```
samdal-bootstrap/1.1.10 linux-x64 node-v14.18.1
```
みたいになったら🌺おっけー
```
cd
mkdir samdal
cd samdal
vi sdl.yml
```
sdl.ymlのなかみ
```
assembly: dual
preset: samdal

privateKeySecurityMode: ENCRYPT
nodes:
    -
        host: IPか domain
        friendlyName: のぉどのお名前
```
のぉどを動かすの
```
samdal-bootstrap start -c sdl.yml -d
```
samdal-bootstrapはぁ
symbol-bootstrapとぉ使い方は一緒なの🌻

さんだるぅ👡

さんこうにならないぺぇじはここなの

https://qiita.com/dusanjp/items/e0ef483b993162990d42

さんだるぅ👡

![rogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246298/63e29945-670c-5ff1-4828-66245bc70b52.png)
【AWS】API Gatewayのログ設定方法

## はじめに
API GatewayとLambdaを使ってLINE Botを作成中、デフォルトではAPI Gatewayのログが出力されておらず困ったのでやり方を調べてみました。
※間違いなどあればコメントで指摘をいただけると嬉しいです！

## 結論：専用のIAMロール作成が必要

設定は以下の3ステップ。これで、CloudWatchのロググループにログストリームが出力されるようになりました。

①IAMロールの作成：
「AmazonAPIGatewayPushToCloudWatchLogs」のポリシーを持つIAMロールを作成する

②IAMロールの適用：
上記①のIAMロールをAPI Gatewayの「設定」＞「ログ記録」に設定する

②ログ出力の設定：
対象API Gatewayの「ステージ」でCloudWatchへのログ出力を設定する

## 設定手順
### IAMロールの作成
IAMロールを作成します。ポリシーはAWSで用意しているものを使います。
![IAM-menu.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/ae14f18e-750c-f5c7-c474-19682e4d7a38.png)

信頼されたエンティティは「AWSのサービス」、ユースケースは「API Gateway」を選びます。
![IAM-usecase.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/297d5216-9451-dc2b-20d3-5b4425d53e7c.png)

許可ポリシーに「AmazonAPIGatewayPushToCloudWatchLogs」が入っていることを確認します。
![IAM-addpolicy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/425fe787-a50b-6117-b544-869be2c85ccf.png)

ロールの名前やタグの設定をして、ロールを作成します。
![IAM-name.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/f6d3d691-8af3-a867-8ff6-38805454f3c7.png)

作成できたら、ロールARNをコピーしておきます。
![IAM-arn.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/20692793-5520-a976-81ba-c843fe694481.png)

### IAMロールの適用
API Gatewayの「設定」を開きます。
![APIG-setting.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/67e34302-adb5-107d-9ac9-a58b966801be.png)

「ログ記録」を編集します。
![APIG-log-arn_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/e27155e3-608c-166f-b290-41c2a28128b2.png)

先ほど作成したIAMロールを設定します。
![APIG-log-arn.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/a70e7c59-64b9-d807-6326-3fa72e342d24.png)

### ログ出力の設定
お使いのAPIの「ステージ」設定を開き、「ログとトレースの設定」を編集します。
![APIG-log-trace_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/926dc220-cf54-8100-8f15-70d056d87923.png)

CloudWatchに出力したい情報（エラーのみ or 全てのログ）を選び、変更を反映します。
![APIG-log-trace.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/7d9750b7-4488-ab58-1b17-fe088942a0e4.png)

## 結果確認
### APIを叩く
ここまで設定できたらログが出力されるはずなので、APIを叩いてログ出力を確認します。

### CloudWatchログストリームの確認
CloudWatchの「ロググループ」を開きます。
![APIG-log-grp.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/6f3dc4c2-6f01-27aa-74bd-c665b015ba92.png)

ロググループが作成されているか確認します。
名前は`API-Gateway-Execution-Logs_{rest-api-id}/{stage-name}`です。
![APIG-loggroup.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/62623c9d-5699-0ef7-c301-dba39129bf10.png)

対象のロググループをクリックすると、ログストリーム（一連のログイベント）が表示されます。
![APIG-logstream.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/e9c057c6-9201-cedd-9675-c87a27302194.png)

確認したいログストリームをクリックすると、ログイベントが一行ずつ表示されます。
これでログを確認できるようになりました！
![APIG-logsevent_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517310/712d3f95-911b-1593-373a-02d038361927.png)

## 参考

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/set-up-logging.html?icmpid=apigateway_console_help

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/view-cloudwatch-log-events-in-cloudwatch-console.html
rex0220 計算式プラグイン グループ選択項目のメンバー

計算式プラグインでグループ選択項目のメンバーをテーブルにセットします。

# 概要

グループ選択項目のグループ名、グループコード、メンバーを取得します。
グループメンバーを文字列項目にセットすることで、計算処理のパフォーマンス改善を図ることができます。

※[rex0220 計算式プラグイン 組織選択項目の組織メンバー](https://qiita.com/rex0220/items/dc9abc4128d88884485b) と基本的な考え方は同じです。

![2024-02-03_19h02_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/99d1cdc3-d019-f8c5-aa1e-79ab1a3407df.png)

# 計算式プラグイン設定

GINFO, UINFO 関数を使用するため、「ユーザー情報」をチェックします。
グループメンバー項目を最終行に配置しましたが、グループメンバーの計算を先に行うため、ランク 1 を指定します。

- テーブル
    - グループメンバーの数をセット。0 の場合は 1 をセット
- ユーザー選択
    - テーブル行位置に対応する組織メンバーをセット
- 社員番号
    - ユーザー選択の値から社員番号をセット

![2024-02-03_19h03_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/992375f3-7e90-a748-56f2-64f9c6302263.png)

```.js
// グループ名 SINGLE_LINE_TEXT
SEL_NAME(グループ選択,"text")

// グループコード SINGLE_LINE_TEXT
SEL_CODE(グループ選択,"text")

// テーブル SUBTABLE
LET(a,SPLIT(グループメンバー,","),
  MAX(ARRAY_COUNT(a),1)
)

// テーブル.ユーザー選択 USER_SELECT
LET(a,SPLIT(グループメンバー,","),
  b,ARRAY_GET(a,ROWNO(テーブル)),
  SET_CODE(b)
)

// テーブル.社員番号 SINGLE_LINE_TEXT
LET(a,SEL_CODE(ユーザー選択,"array"),
  UINFO(a,"employeeNumber")
)

// グループメンバー SINGLE_LINE_TEXT (rank:1)
LET(a,SEL_CODE(グループ選択,"array"),
  b,GINFO(a,"users"),
  c,UINFO(b,"code"),
  c
)
```
databricksのAutoMLでモデルの最適ハイパーパラメータを探索

# databricksのAutoMLでモデルの最適ハイパーパラメータを探索

## tryしたこと

[第2回 金融データ活用チャレンジ ](https://signate.jp/competitions/1325) のtrainデータをdatabricksのAutoMLで学習してもらいAUCが最大モデルのハイパーパラメータを確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/972365a4-cb8c-57ed-2e19-3d5567cd9ea1.png)


### AutoML アルゴリズム
選択できるモデルは [AutoML アルゴリズム](https://learn.microsoft.com/ja-jp/azure/databricks/machine-learning/automl/how-automl-works#automl-algorithms)

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/efb98d76-7c52-3e6a-e123-5ca4d31c6071.png)

### 実行結果
少し字が小さくて見えにくいかもしれないが

![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/de52d098-38b2-a8e0-6f87-9a727a8d9b3c.png)


Run Name列の<span style="font-size:150%;color: green;">●</bm></span><span style="color: blue">enchanting-snail-9</span> をクリックすると

![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/51a942d6-9e2c-fdb5-410e-293fad194570.png)


またfeature engineering(説明変数の前処理)も確認できる

![image-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/2c5d04be-17e4-2562-598a-80611569b0bd.png)


## 感想
AutoMLが探索してくれたハイパーパラメータを指定したモデル(xgb_AutoML)と何も指定しないモデル(xgb)を比較した結果の性能差は一目瞭然

滅茶苦茶重宝してます

AutoMLのアルゴリズムを拡張していただけることを期待したい

![image-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687201/b827f735-1222-a51f-c0d5-6495d5a6373c.png)

(参考)
|ハイパーパラメータ|値|
|---|---|
|max_depth|6|
|min_child_weight|5|
|learning_rate|0.12469004141974227|
|colsample_bytree|0.3426659786494081|
|subsample|0.6375820909703716|
PostgreSQLをWindows 10上で使えるようにする


### 開発環境
- Windows 10 Pro(64bit)

### ダウンロードとインストール
1. [ダウンロードページ](https://www.postgresql.jp/download)へアクセス

2. ダウンロードリンクの中から、Windowsのリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/8708a07d-cc54-c907-be67-1c45ac7512e1.png)

3. Download the installerと書かれたリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/6f28a674-587a-8305-54d5-2f0bfa6d2133.png)

4. 今回は最新版の16.1のWindows x86-64の列にあるマークをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/0d51fbfc-5f2f-6b50-8f8d-a5565bf7e4a5.png)

5. 変なページへ転送されるが、そのまま放置していると、インストーラ(**postgresql-16.1-1-windows-x64.exe**)のダウンロードが始まる。ファイルサイズは364MBあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/23deb742-b329-2f2d-e380-be83bf614ec3.png)

6. ダウンロード完了後、インストーラを実行

7. Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/f54380c6-1e2e-f925-7291-4d291af0c9ee.png)

8. Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/cc2f9459-7756-d381-b69b-cb3e5e4bb207.png)

9. Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/1f988631-47ca-69b0-1915-e844591d89bd.png)

10. Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/3d861a7c-2f3f-cf14-0be4-df60ff7b3f32.png)

11. SQLサーバーへログインする際のパスワードを2回入力し、Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/8531d70c-1cf6-d4cb-ca7a-d44e20a5cf29.png)

12. ポート番号を入力(デフォルトでは5432)して、Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/2f8ce84c-c9e9-8f1d-de7e-29e1bc9ba749.png)

13. Localeを選択(自分の場合は、**Japanese, Japan**)して、Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/b99067d4-4af3-27e8-5c10-b0c1e3f39dfa.png)

14. Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/b59fa461-5738-d471-c320-c6380e8f46d0.png)

15. Nextをクリックすると、インストールが開始するので、終了まで、待つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/11a578c3-179e-ddbb-2a91-f0a417ef54bd.png)

16. **Stack Builder may be～**のチェックを外して、Finishをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/fef8f52b-d206-bd0c-4395-5eb0ef877287.png)

17. psql.exeのあるフォルダのパスを環境変数に設定する
自分の場合は以下、
```
C:\Program Files\PostgreSQL\16\bin
```
環境変数の設定の手順は以下を参照。(ショートカットキーで呼び出すならば、Windowsキー + R → sysdm.cplで呼び出して、詳細設定タブの環境変数をクリックすればいいです。)

https://qiita.com/ryo-sato/items/e24c81eca6ffe9db3fb0


### PostgreSQLへログイン
コマンドプロンプトを実行し、以下のコマンドを実行して、バージョンがでれば、パスは通っています。
```
psql -V
```

PostgreSQLへログインするには、以下のコマンドを実行
(**ユーザー名postgresが、データベース名postgresへログインするという意味です**)
```
psql -U postgres -d postgres
```

パスワードをここで聞かれるので、先ほど、インストール時に入力したパスワードを入力して、Enterを押し、以下のようになればログイン成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/ed31a6a6-2b9f-1e27-3d78-beaf8b233c68.png)
cloud schedulerでpostするときにjson形式のparameter(パラメーター)を付与する方法

## 結論
schedulerのジョブの「本文」に下記形式で設定する
```plaintext
{"argument": "{\"key-1\": \"val-1\", \"key-2\": \"val-2\"}"}
```
上記の形式で設定するとpostできます。

## 詳細
他には、HTTPヘッダーに下記の設定が必要です
key: `Content-Type`
val: `application/json`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121605/a4698c55-8ce7-03f0-7021-7fb5122680dc.png)

あと、cloud runやfunctionsで受ける場合はjson loadsをする必要があります
```python
@app.post(f"/post-test")
async def index(params: dict):
    params = json.loads(params["argument"])
    print(params)
    return JSONResponse(content={"result": "success"}, status_code=status.HTTP_200_OK)
```

他の設定は自由です。色々検索しても出てこなくて苦労したので同志向けに記載しました
Eclipce（STS）ショートカット一覧

## Eclipce（STS）で使用できるショートカットを記載。
※参考 兼 自身のメモ用
※随時追記

<table>
  <caption>ショートカット一覧</caption>
  <thead>
    <tr>
      <th>機能</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> 宣言元の参照 </td> <td>「F3」</td>
  </tr>
  <tr>
    <td> 行削除 </td> <td>「Ctrl」＋「D」</td>
  </tr>
  <tr>
    <td> 検索ダイアログ表示 </td> <td>「Ctrl」＋「H」</td>
  </tr>
  <tr>
    <td> 指定行へ移動 </td> <td>「Ctrl」＋「L」</td>
  </tr> 
  <tr>
    <td> フォーマット </td> <td>「Ctrl」＋「Shift」＋「F」</td>
  </tr>
  <tr>
    <td> インポートの編成 </td> <td>「Ctrl」＋「Shift」＋「O」</td>
  </tr>
  <tr>
    <td> 対応する括弧の確認 </td> <td>「Ctrl」＋「Shift」＋「P」</td>
  </tr> 
  <tr>
    <td> リソースを開く </td> <td>「Ctrl」＋「Shift」＋「R」</td>
  </tr>
  <tr>
    <td> 大文字に変換 </td> <td>「Ctrl」＋「Shift」＋「X」</td>
  </tr>  
  <tr>
    <td> 小文字に変換 </td> <td>「Ctrl」＋「Shift」＋「Y」</td>
  </tr> 
  <tr>
    <td> javadocの生成 </td> <td>「Alt」＋「Shift」＋「J」</td>
  </tr>  
</table>
Gitコマンドの使い方

Gitはプロジェクトによってコマンド・GUI操作が分かれており、いまいち理解し切れていない部分があるので、勉強用にまとめてみる。

## 作業の流れ

### ①クローン
資材をローカル環境に取り込む。
```
> git clone [URL]
```

　

### ②ブランチ確認・チェックアウト
最初に現在のブランチを確認し、想定していないブランチにいる場合はチェックアウトする。
 ```
> git branch
* master　　　// 大体こういう感じで表示される
   develop

> git checkout develop
   Switched to branch 'develop'

> git branch
   master
* develop　　　// ブランチが切り替わっている
```

　

### ③最新資材をプル
作業用ブランチ（featureブランチ）を切る前に最新資材をプルする。
```
> git pull origin develop
```

　

### ④ブランチを切る・チェックアウト
現在のブランチ（今回の例ではdevelop）から作業用ブランチ（featureブランチ）を切り、チェックアウトする。
```
> git branch feature/58
  master
* develop
  feature/hogehoge

> git checkout feature/hogehoge
  Switched to branch 'feature/hogehoge'
   
> git branch
  master
  develop
* feature/hogehoge　　　// こうなっていれば成功
```

↓こっちはブランチ作成とチェックアウトを同時にやるコマンド。
```
> git checkout -b feature/hogehoge
  Switched to branch 'feature/hogehoge'

> git branch
  master
  develop
* feature/hogehoge　　　// 結果は同じ
```
　

### ⑥実装
頑張ろう

　

### ⑦変更したソースファイルを確認
「⑥実装」で作成・修正したソースファイルを確認する。
```
> git status
  On branch hogehoge
    Changes not staged for commit:
    (use "git add/rm <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working    directory)

    modified:   src/HogehogeServiceImpl.java
    deleted:    src/HogehogeService.java

    Untracked files:
    (use "git add <file>..." to include in what will be committed)

    src/HogehogeRepository.java

    no changes added to commit (use "git add" and/or "git commit -a")
```
色々書いてあるが、確認すべきところは以下3点である。
　・修正　　　modified
　・削除　　　deleted
　・新規作成　Untracked files

　

### ⑧コミットする
「⑦変更したソースファイルを確認」した内容をローカルリポジトリに反映する。
```
> git add src/HogehogeServiceImpl.java　　　// フルパスで指定しないとエラーになる

> git commit -m"Repositoryクラスを新規作成"　　　// コメントはパッと見で分かりやすい内容にする
```

　

### ⑨プッシュする
いよいよプッシュする。リモートリポジトリに反映されるので、プルすれば他の人も見れるようになる。
```
> git push origin feature/hogehoge
```

　

### ⑩マージする
ここまでの作業だけでは大元のdevelopブランチには反映されていないので、feature/hogehogeで作業した内容をマージする。
```
> git checkout develop
  Switched to branch 'master'

> git branch
  master
* develop
  feature/hogehoge

> git merge feature/hogehoge
```

　

### ⑪リモートリポジトリの更新を忘れずに
```
> git push origin develop
```



内容は適宜更新...するかもしれません。
初投稿なので見づらいところはご容赦ください。
オブジェクトを発光させる

Unityでスクリプトからオブジェクトの色を変更して、オブジェクトが自ら発光するようにします。動作環境はUnity 2022.3.10fです。

# Sceneビューを暗くする
光っていることを確認しやすいように次の手順でSceneビューを暗くしておきます。

・Directional Lightを選択してInspectorビューでチェックを外して非アクティブにする。
・Main Cameraを選択してInspectorビューでClear FlagsをDon't Clearに設定する。
・Window→Rendering→Lighting→Environmentを選択してIntensity Multiplierを0にする。

# 発光するオブジェクトの作成
Hierarchyビューの3D Objectから発光させるためのオブジェクトを作成します。
以下のスクリプトを作成して3Dオブジェクトにアタッチします。

```C#:Emission.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Emission : MonoBehaviour
{
    void Start()
    {
        this.gameObject.GetComponent<Renderer>().material.EnableKeyword("_EMISSION"); //Emissionを使用できるようにする
        this.gameObject.GetComponent<Renderer>().material.SetColor("_EmissionColor", Color.cyan); //エミッションカラーを指定
        GameObject lightObject = new GameObject("Point Light"); //空のゲームオブジェクトを生成
        Light light = lightObject.AddComponent<Light>(); //空のゲームオブジェクトをライトにする
        light.type = LightType.Point; //ライトの種類を指定
        light.color = Color.cyan; //ライトの色を指定
        lightObject.transform.parent = this.transform; //ライトを子オブジェクトに設定する
        lightObject.transform.localPosition = Vector3.zero; //ライトのローカル座標を親オブジェクトの原点に設定
    }
}
```

実行すると以下の図のように光ります。
3D ObjectからPlaneを作って発光オブジェクトの下に設置しておくと、光が床に反射しているように見えて、発光していることがわかりやすくなります。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644510/49a6f7f0-0e85-c3a2-7324-8b4aeb9a07c5.png)

# オブジェクトを点滅させる
Emission.csを以下のように書き変えることでオブジェクトが点滅するようになります。

```C#:Emission.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Emission : MonoBehaviour
{
    private GameObject lightObject;
    private Light light;

    void Start()
    {
        this.gameObject.GetComponent<Renderer>().material.EnableKeyword("_EMISSION");
        lightObject = new GameObject("Point Light");
        light = lightObject.AddComponent<Light>();
        light.type = LightType.Point;
        light.color = Color.cyan;
        lightObject.transform.parent = this.transform;
        lightObject.transform.localPosition = Vector3.zero;
    }

    void Update()
    {
        light.intensity = Mathf.PingPong(Time.time * 10, 5); //ライトの明るさを一定周期で変化させる
        this.gameObject.GetComponent<Renderer>().material.SetColor("_EmissionColor", Color.cyan * Mathf.PingPong(Time.time * 2, 1)); //エミッションカラーの明るさを一定周期で変化させる
    }
}
```

# 参考
https://edunity.hatenablog.com/entry/20200410/1586448954
https://beginne28949926.com/unity/script-light/
クラウドフレアのアカウントを作ろう！

<iframe width="560" height="315" src="https://www.youtube.com/embed/1v8SQxMrJjw?si=r5BMaVW0qTZx9F78" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
【aws cli ses】sendrawEmailで添付ファイル付きメールを送る方法【linuxシェル】【json形式】

# 1.sendRawEmailコマンドで添付ファイル付きメールを送る方法
先日AWS cli sesを使用してlinuxのシェルでjson形式を使用して
メールを送る処理を書く機会がありました。

そのときsendRawEmailで添付ファイルを送る方法が書かれていないので
何かの役に立てばと思い残します。
 
# 2.基本の解説（ヘッダ）

ヘッダとはFromやToなどの要素のことを示します。

# 3.基本の構文の説明 
ヘッダは改行区切りのテキスト（文字）形式で「項目名: 値¥m」という記法で設定を列挙します。

### 良い例
    From：[メールアドレス]¥nTo:[メールアドレス]¥nSubject:[メールタイトル]¥n
と書きます。

:::note warn
このとき改行をせずに改行文字を入れてください。
:::

### 悪い例

```
From：[メールアドレス]
To:[メールアドレス]
Subject:[メールタイトル]
```
# 4.添付ファイルの記載方法

まず、例を示してから解説をします。

### 例
~~~
aws ses send-raw-email --raw-message "{\"Data\":\"From: [送信元メールアドレス]\nTo: [送信先メールアドレス]\nCc: [CC欄メールアドレス]\nSubject: [メールタイトル]\nMIME-Version: 1.0\nContent-type: multipart/mixed; boundary=\"a-random-boundary\"\n--a-random-boundary\nContent-Type: text/plain; charset=\"UTF-8\\\"\n[本文]\n--a-random-boundary\nContent-Type: application/octet-stream; name=\\\"[ファイル名]\\\"\nContent-Transfer-Encoding: base64\nContent-Disposition: attachment\n[ファイルの中身]\n--a-random-boundary--\"}"
~~~

### 解説
    \"Data\" :
一番最初に書く

:::note warn
以下のメール内容（Fromから下の内容）は¥"¥"で囲む
:::


    From: 　[送信元メールアドレス]
[送信元メールアドレス]にはメールアドレスを書く

    To: [送信先メールアドレス]
[送信先メールアドレス]にはメールアドレスを書く

    Cc: [CC欄メールアドレス]
[CC欄メールアドレス]にはメールアドレスを書く

    Subject: [メールタイトル]
[メールタイトル]にはメールタイトルを書く
メールタイトルに空白が含まれる場合は¥"¥"で囲む

    MIME-Version: 1.0 
MINEのバージョン宣言

    Content-Type: multipart/mixed;
「multipart」タイプは複合データを表し、複数のデータの組み合わせを一度に伝送したい場合に用いる。「mixed」サブタイプは連結されたデータの形式やデータ間の関連性について特に何も示さず、単に複数のデータが連結されていることのみを表している。
 
    boundary=¥\"a-random-boundary¥\" 
バウンダリの文字列を指定
パートの境界は、「バウンダリ：boundary」と呼ばれる任意の文字列の行で示される。
 
    --a-random-boundary 　
バウンダリ文字列で一つのパートの開始を表す

    Content-Type: text/plain;text/plain
テキストファイルを送るときのContent-Type

    charset=¥\"UTF-8¥\"　
文字コードの指定
 
    [本文]
本文を記載する
空白が含まれる場合は¥"¥"で囲む

    --a-random-boundary　--
バウンダリ文字列で二つ目のパートの開始を表す

    Content-Type: application/octet-stream;　
電子メールの添付ファイルでファイルの種別を表すのに用いられるMIMEタイプの一つ

    name=　[ファイル名]
ファイル名を指定する
ファイル名に空白が含まれる場合は¥"¥"で囲む

    Content-Transfer-Encoding: base64　
[ファイルの中身]のエンコード形式の指定
この場合はbase64を指定しているContent-Transfer-Encoding: base64　

    Content-Disposition: attachment　
ファイルをダウンロードできることを示す

    [ファイルの中身]
ファイルの中身を記載する
に空白が含まれる場合は¥"¥"で囲む

    --a-random-boundary--　
バウンダリ文字列のパートの終了を示す

 

:::note warn
[送信ファイルの中身]はContent-Transfer-Encodingで指定した
方法でデコードする必要がある。
:::

以下にbase64のエンコード指定したときを示します。
## デコード例
~~~
[デコードしたファイルの中身]=$(base64 -w 0 "ファイルの名前")
~~~

# 5.注意点

json形式では送れない文字があります。
その場合以下のようにエスケープする必要があります。

| 送れない文字 | 読み方|
|:-:|:-:|
| ¥”  |ダブルクォーテーション   |
| ¥\   | バックスラッシュ  |
| ¥/    |スラッシュ　|
|¥b	|バックスペース|
|¥f	|改ページ |
|¥r	|ラインフィード　|
|¥n	|改行・キャリジリターン|
|¥t	|タブ　|
|¥uXXXX	|4桁の16進数で表記されたUnicode文字|

# 6.締め
コピペOKですのでコマンドを使用してメールを送ってみてください！
【パルワールド】マップとチュートリアルがリセットされてしまったときの対処法(専用サーバー対応)

# パルワールドのマップが消えた！
パルワールドをプレイしているとマップとチュートリアルが消え、
最初の3匹のパルが出てくるKAWAIIカットシーンが始まりました。
発生が2回目で流石に心折れそうだったので調査してみました。
## データって何処に保存されてるの？
公式サーバーの質問チャンネルで、
「パソコンを変えたらマップとか色々リセットされた」
といった旨の質問があったのでもしやサーバー側ではなく
クライアント側にそこら辺のデータが残っているのでは...?と思って確認してみたらビンゴでした。
##### って訳でここを消える元のデータに戻せば復旧できます！！！
# 直し方
#### 以下はSteam版の手順です。Xbox?ナニソレオイシイノ
#### 専用サーバーで確認してます。ローカルの場合は知らん。
パルワールドは終了しなくてもいいですが、ワールドからは抜けておいてください。
## ①
Windows+Rで出てきたやつもしくはエクスプローラのパスの部分に
「%localappdata%/Pal/Saved/SaveGames/」
と入れてEnterしましょう。
※なんか後ろに映ってるのはパルってるだけです
![9733f49056abbdc42230556a7fa020ce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346456/f7058b04-eb05-c92f-5ad0-51eaaf18ffb4.png)
![86c5dc207d27584282e2c4b1d6312d66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346456/7f60a2be-5150-9825-ce20-a60ffc4754e0.png)
## ②
そこに17桁ほどの数字の名前のフォルダかあると思うので開いてください。
人にもよりますがそこに大量のフォルダがあると思います。
そこから対象ワールドのフォルダを開きましょう。
多分分からないと思うのでフォルダの更新日時で判断しましょう。
## ③
開いたら多分こんな感じでしょう。
![fc850854266372ce9142392c5a071840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346456/182c2960-34c1-7e56-ffaa-41acac9914f7.png)
backupを開き、フォルダを開いていって大丈夫そうなLocalData.savを見つけましょう。
おそらくデータが壊れた直後は6kbほどになっているはずです。(自分の場合はそうでした)
データが壊れる前はそれより大きいはずです。
なので、データサイズで判断しましょう。気合です。

めんどくさいとか、backup内にない(別パソコンなどの)場合は[ここのSteamクラウド](https://store.steampowered.com/account/remotestorageapp/?appid=1623730)から落とすのもよしです。
ファイルサイズが見れます。
## ④
後は簡単、backupの一つ前のフォルダのLocalData.savと置き換えるだけです。
置き換える前に念のためLocalData.savの名前を変えるなどして残しておきましょう。
## ⑤
ワールドに入って、復旧していたら成功です。
# 以上
ありがとうございました。
勢いで書いたので見にくかったら是非編集リクエストしていただければ幸いです。

[ぼくのついったーもよければみてね](https://twitter.com/ReYYYYoking)
VSCodeで「The git repository at あなたのディレクトリ has too many active changes, only a subset of Git features will be enabled.」という警告が出たら

## 環境
next: 13.2.1
react: 18.2.0
hardhat: 2.12.5
Windows10

## 状況とエラー内容
Next.jsのプロジェクトで`git init`をした直後、画面右下に警告(下の画像)が出てきました。
VS CodeメニューバーのSource Controlに`10k+`と表示され、緑色にハイライトされるべきいくつかのファイルもハイライトされず...
この警告はVSCodeを立ち上げるたびに表示されます。

(訳: "/~"はアクティブな変更が多すぎるため、Gitの機能のサブセットのみが有効になります。)
![qiita_git_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684682/bf7047df-be38-7ac5-e163-4065f16fe96d.png)

## 原因
今回のディレクトリの構成が、Next.jsのプロジェクトにサブディレクトリとしてHardhatのプロジェクトが入っている感じ(node.jsのプロジェクトの中にnode.jsのプロジェクトがある感じ)なのですが、
`.gitignore`にNext.jsのプロジェクトのものしか記述していませんでした。

そのため、"アクティブな変更が多すぎるため"と怒られているように、Hardhatプロジェクトの中身全てがGit管理対象になっていた事が原因でした。

## 解決
ということで
`.gitignore`にHardhatプロジェクト内のnode_modulesなど無視したいものを記述することでエラーを消すことができました。
AWSのLIGHTSAIL(WORDPRESS)をGITHUB ACTIONS連携する話（3）

[AWSのLIGHTSAIL(WORDPRESS)をGITHUB ACTIONS連携する話（2）](https://qiita.com/weeeveeee/items/af46fb3f05a1d823436a)でAWS LIGHTSAILのGITHUB ACTIONS の設定をしました。

ここでは　LIGHTSAIL にGITをインストールするところまでやります。
記事を分けた理由としては、ここでもSSHキーがでてきますが、GITHUB actions で使用したSSHキーとは違うものです。
混在しないためにも、別記事にしました。

ここでやることは
1.　LIGHTSAILサーバにGITをインストールする
2.　LIGHTSAILサーバでSSHキーペアを作成する
3.　SSHキーのパブリックキーをアカウントのSSHキーに登録
4.　GITHUBの接続を確認する
5.　作業ディレクトリに移動して、git cloneする
6.　GITHUB　Actions を Re:Run する

## 1. LIGHTSAILサーバにGITをインストールする

下記コマンドでGITをインストールする
```
sudo apt-get install git-all
```

## 2.LIGHTSAILサーバでSSHキーペアを作成する

コマンドでSSHキーを作成する
```
ssh-keygen -t rsa 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398694/861c2db6-db54-84dd-e08e-1b800b97354a.png)

この時にパスフレーズを指定しないで、なにもせずにENTERするとよい
※ パスフレーズを設定したい場合は、GitActionsのymlファイルにパスフレーズを指定すること

パブリックキーをコピーする
```
cat ~/.ssh/rsa.pem
```
中身をコピーする

## 3.SSHキーのパブリックキーをアカウントのSSHキーに登録
GITHUBアカウントページに移動。 `SSH and GPG keys` を選択して、　｀New SSH key` をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398694/61f59386-cb7e-92e9-ec9b-e55838580356.png)

｀Add SSH key` を押して登録


## 4.GITHUBの接続を確認する
LightSailのサーバにログインする

```
ssh -T git@github.com
```
をクリック

```
You've successfully authenticated, but GitHub does not provide shell access.
```
と表示されたら、接続完了

## 5.作業ディレクトリに移動して、git cloneする

今回はWordPressなので、LightSailのWordPressのThemesディレクトリに移動する

```
/opt/bitnami/wordpress/wp-content/themes
```

[AWSのLIGHTSAIL(WORDPRESS)をGITHUB ACTIONS連携する話（2）](https://qiita.com/weeeveeee/items/af46fb3f05a1d823436a)で作成したリポジトリをcloneする

```
git clone git@github.com:*********/****.git
```

themesフォルダ内に、{リポジトリ名}がcloneされます


GITHUBリポジトリのSettingにあるSecretにいきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398694/f9b7940b-8f1e-20e7-a115-1396e69a57d4.png)

```
/opt/bitnami/wordpress/wp-content/themes/{リポジトリ名}
```
DEPLOY_DIRを上記フォルダパスに変更する

## 6.GITHUB　Actions を Re:Run する

[AWSのLIGHTSAIL(WORDPRESS)をGITHUB ACTIONS連携する話（2）](https://qiita.com/weeeveeee/items/af46fb3f05a1d823436a)でエラーを起こしたactionを再度実行します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398694/8acbc106-1bf6-f30a-737c-34cc42a493f8.png)

成功しました！！

これでGIT actionsによってGITリポジトリとサーバの連携は完了です。
先にGITをインストールしてもいいですが、その際はGITのSSHキーとactionsで使用するSSHキーを間違えずに、設定してください。


### 関連記事
> [AWSのLIGHTSAIL(WORDPRESS)をGITHUB ACTIONS連携する話（1）](https://qiita.com/weeeveeee/items/7596b777d463c9ac76ba)
[AWSのLIGHTSAIL(WORDPRESS)をGITHUB ACTIONS連携する話（2）](https://qiita.com/weeeveeee/items/af46fb3f05a1d823436a)
[AWSのLIGHTSAIL(WORDPRESS)をGITHUB ACTIONS連携する話（3）](https://qiita.com/weeeveeee/items/111e2353a5b08e992d71)
基本情報技術者資格を2週間で資格を取る方法

お疲れ様です。
基本情報技術者試験を二週間で取る方法を公開します。
本当は載せたくないのですが載せます。

## 目次
- 資格の勉強をしたメリット
- 勉強法

## 1年目webエンジニアが基本情報技術者資格を持っていて得したところ
まずは勉強をしていて、何がためになったのかを載せます。IPAを参考に正直にかいてみました！！

### IPAが提示したものに対しての正直な評価
|求める要件|評価|理由|
|:---|:---|:---|
|上位者の指導の下に、ITを活用した戦略の立案、システムの企画・要件定義|〇|立案から要件定義まで出来る|
|上位者の指導の下に、システム又はサービスの提案活動|〇|提案活動が増えた|
|上位者の指導の下に、システムの企画・要件定義|△|取る前からやっていた|
|上位者の指導の下に、情報セキュリティの確保を考慮して、システムの設計・開発・運用|〇|sqlインジェクション、xxsインジェクション、秘密鍵、公開鍵などの概念が理解できるようなった|
|上位者の指導の下に、ソフトウェアを設計|×|基本設計や詳細設計などは別途調べる必要あり|
|上位者の方針を理解し、自らプログラムを作成できる|〇|疑似コードになったが理解は出来る|

## 勉強法
結論は毎日以下の内容をやるだけです
これだけって思いますが、本当にこれだけです。
やることは大きく二つです。　
△が無くなるまで解く。×が無くなるまで解く

### △が無くなるまで解く
- 過去問道場を分野ごとに三問ずつ解いてみる
- 3問中2問以上間違っていた分野は△
- △の分野を10問とく

### ×が無くなるまで解く
- 過去問道場を分野ごとに三問ずつ解いてみる
- 3問中1問以上間違っていた分野は×
- ×の分野を10問とく
mx25lを直した

WHR-300HP2N(MT7620A)が二台あり片方がremoteでのupdateに失敗します。コンソールを見てみたところflashの書き込みが上手くいっていないです。

dtsのFlashの最後のほうに1Mのpartitionを作ってカーネルをビルドしてイメージを作り焼いてテストしてみます。

```
dd if=/dev/random of=/tmp/abc bs=1m count=1
dd if=/dev/abc of=/dev/flash/spi0s.test obs=64k conv=osync
md5 /tmp/abc /dev/flash/spi0s.test
```

やはりハッシュ値が異なります。

コードはsys/dev/flash/mx25l.cです。

上手くいくほうはs25fl064で、失敗するほうがw25q64でした。

このモデルでは以前上手くいっていた様な記憶があり、NYC*BUG dmesgdをながめていてFlashが違うことにきがつきました。

コードを見るとw25q64にはFL_ERASE_4Kが指定されています。

どうもFL_ERASE_4Kが正常に動いていないようなので、FL_NONEにしてみたところ問題が解消しました。

そもそもSPI Flash的には64Kがデフォルトで4KはオプションなのでFreeBSDでは4Kのサポートは必要ないと思います。

FL_ERASE_4Kのフラグはかなり前からあって、それを有効にしたのが以下の修正のようです。ちゃんとテストしたのかはなはだ疑問です。

https://svnweb.freebsd.org/base/head/sys/dev/flash/mx25l.c?r1=331138&r2=331139
【VBA】画像の拡縮マクロ

画像をクリックすると、画像が拡大/縮小するマクロです。
画像にこのマクロを登録して使います。
「代替テキスト」をフラグのように使って処理しています。

``` vb
Sub GazouKakusyuku()
    With ActiveSheet.Shapes(Application.Caller)
        .LockAspectRatio = True '縦横比を固定する
        .ZOrder msoBringToFront '最前面に表示する

        '拡大処理
        If .AlternativeText = "" Then
            .AlternativeText = .Height '元の画像サイズを「代替テキスト」に退避しておく
            NextHeight = 1.5 * .Height '拡大後の画像サイズを求める
            
            eachStep = (NextHeight - .Height) / 20 '20段階で拡大する場合の1段階あたりの変化量
            
            For i = 1 To 20
                If i >= 20 Then
                    .Height = NextHeight
                    Exit For
                Else
                    .Height = .Height + eachStep
                End If
                Application.Wait [Now()] + 20 / 86400000 '20ミリ秒待つ
            Next i
        '縮小処理（※元の画像サイズに戻す）
        Else
            NextHeight = .AlternativeText
            
            eachStep = (.Height - NextHeight) / 20

            For i = 1 To 20
                If i >= 20 Then
                    .Height = .AlternativeText
                    Exit For
                Else
                    .Height = .Height - eachStep
                End If
                Application.Wait [Now()] + 20 / 86400000 '20ミリ秒待つ
            Next i
            .AlternativeText = ""
        End If
    End With
End Sub
```
rex0220 計算式プラグイン 組織選択項目の組織メンバー

計算式プラグインで組織選択項目の組織メンバーをテーブルにセットします。

# 概要

組織選択項目の組織名、組織コード、組織メンバーを取得します。
組織メンバーを文字列項目にセットすることで、計算処理のパフォーマンス改善を図ることができます。

![2024-02-03_17h05_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a3d3664c-43ae-787a-3863-3c1c19b28a26.png)

# 計算式プラグイン設定（パフォーマンス改善前）

OINFO, UINFO 関数を使用するため、「ユーザー情報」をチェックします。

- テーブル
    - 組織メンバーの数をセット。0 の場合は 1 をセット
- ユーザー選択
    - テーブル行位置に対応する組織メンバーをセット
- 社員番号
    - ユーザー選択の値から社員番号をセット

![2024-02-03_17h05_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5c8917bd-ae32-b48f-0787-a958b4c6bd3b.png)

```.js
// 組織名 SINGLE_LINE_TEXT
SEL_NAME(組織選択,"text")

// 組織コード SINGLE_LINE_TEXT
SEL_CODE(組織選択,"text")

// テーブル SUBTABLE
LET(a,SEL_CODE(組織選択,"array"),
  b,OINFO(a,"users"),
  c,UINFO(b,"code"),
  MAX(ARRAY_COUNT(c),1)
)

// テーブル.ユーザー選択 USER_SELECT
LET(a,SEL_CODE(組織選択,"array"),
  b,OINFO(a,"users"),
  c,UINFO(b,"code"),
  d,ARRAY_GET(c,ROWNO(テーブル)),
  SET_CODE(d)
)

// テーブル.社員番号 SINGLE_LINE_TEXT
LET(a,SEL_CODE(ユーザー選択,"array"),
  UINFO(a,"employeeNumber")
)
```

# 計算処理改善版

前記の計算式をみると、組織メンバーを取得する計算が多くあります。
組織メンバー数が多い場合に、計算処理が遅くなるため、組織メンバーを文字列にセットして、それを参照するように改善します。

![2024-02-03_17h33_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e25cebba-1a59-e65f-09ac-e4a98e314234.png)

## 計算処理改善版プラグイン設定

組織メンバー項目を最終行に配置しましたが、組織メンバーの計算を先に行うため、ランク 1 を指定します。

![2024-02-03_17h37_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e6541bac-4916-c3e7-d652-9dfd8f9007bb.png)


```.js
// 組織名 SINGLE_LINE_TEXT
SEL_NAME(組織選択,"text")

// 組織コード SINGLE_LINE_TEXT
SEL_CODE(組織選択,"text")

// テーブル SUBTABLE
LET(a,SPLIT(組織メンバー,","),
  MAX(ARRAY_COUNT(a),1)
)

// テーブル.ユーザー選択 USER_SELECT
LET(a,SPLIT(組織メンバー,","),
  b,ARRAY_GET(a,ROWNO(テーブル)),
  SET_CODE(b)
)

// テーブル.社員番号 SINGLE_LINE_TEXT
LET(a,SEL_CODE(ユーザー選択,"array"),
  UINFO(a,"employeeNumber")
)

// 組織メンバー SINGLE_LINE_TEXT (rank:1)
LET(a,SEL_CODE(組織選択,"array"),
  b,OINFO(a,"users"),
  c,UINFO(b,"code"),
  c
)
```
Web ARを比べてみた（AR.js,MindAR,model-viewer,Babylon.js）

# ARの体験をどうぞ
　Web ARのライブラリ3種類(AR.js,MindAR,model-viewer)のサイトを作ってみました。まずは、使ってみてそれぞれの特徴を体験してください。
 
### AR.jsの体験

Widndows、ChromeBook、iOS（iPad、iPhone）、Androidのブラウザで作動します。

https://kaihatuiinkai.jp/nesopuro2/artool/


AR.jsの体験用マーカー
※AR.jsでは通常「Hiroマーカー」ですが、「AR表示」を強調するため、このマーカーにしました。
![pattern-AR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509199/63c27270-e599-289d-aca7-b925b99a5ee7.png)

### MindARの体験

Widndows、ChromeBook、iOS（iPad、iPhone）、Androidのブラウザで作動します。

https://kaihatuiinkai.jp/nesopuro2/mindar/index.html

MindARの体験用マーカー
![armind_marker2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509199/852b3530-3e36-8eec-6640-4ef7ca736c05.png)

### model-viewerの体験

iOS（iPad、iPhone）、Android用です。
Widndows、ChromeBookでは3Dモデルをマウスで動かすことはできますが、AR表示はできません。

https://kaihatuiinkai.jp/nesopuro2/modelviewer/index.html

マーカーなしでAR表示します。

### Babylon.jsの体験

VR表示はできるのですが、手持ちのAndroidでAR表示の確認ができないので、体験サイトは作っていません。バージョンの関係かな？それとも教育委員会で配布されたAndroidにはロックがかかっているのかな？

# 4つのWeb ARの比較
|         |AR.js       |MindAR     |model-viewer |Babylon.js |
|:--------|:-----------|:----------|:------------|:----------|
|Windows(Chrome,Edge)| 〇  |〇  |×  |×  |
|macOS(safari)       | 〇  |〇  |×  |×  |
|chromebook          | 〇  |〇  |×  |×  |
|iOS(safari)         | 〇  |〇  |×  |×  |
|iPadOS(safari)      | 〇  |〇  |〇 |×  |
|Android(Chrome)     | 〇  |〇  |〇 |〇（のはず） |
|マーカー |必要（黒ワク）| 必要（ワクなし可）|不要|不要|
|導入の難易度   | 簡単  | 簡単  | 簡単  |簡単（コードは少し多い）|
|日本語資料の多さ|多い  |ある  |少ない|少ない|

# まとめ（個人的感想）
### AR.js
日本語資料がたくさん公開されており、利用事例も多いです。図の拡大縮小、移動や回転などのパラメータも指定できます。ARの表示は安定しています。マーカー認識をかなり厳密にしているようで、マーカーの一部を隠すとARは表示されなくなります。ただし、マーカーの黒ワクが気になります。

 ### MindAR
日本語資料は多くありませんが、参考にするには十分な数が公開されています。AR.jsと同様に、図の拡大縮小、移動や回転などのパラメータも指定できます。「ワクなしマーカー」なので、配布する資料などにマーカーを入れても気にならないと思います。マーカーの一部を隠してもARが表示されますが表示が振動します。

 ### model-viewer
　日本語資料は少ないです。マーカーなしでAR表示できるのが大きな特徴です。キャラクターや物体が「すぐそこ」にARで表示されることはインパクトがあります。しかし、iPad、iPhone、Android用であり機器が限定されます。
　Android用glbファイル、iPad・iPhone用usdzファイルの2種類の3Dデータを用意する必要があります。usdzファイルがない場合、Android用glbファイルからデータを自動変換してくれます。しかし、iPad・iPhoneでの表示がうまくいかない場合がありました。例として、Tinkercadで書き出したglbファイルでは正しくAR表示ができません。そのglbファイルをMetasequoiaで読み込んで保存したglbファイルでは、ARが正しく表示されました。理由について、どなたか教えてください。

### Babylon.js
AR表示ができるのはAndroidのみなので、GIGAタブレット（Windows,ChromeBook,iPad）で利用ができません。となると、授業での活用は難しい状況です。Microsoftが開発しているようですので、もしかするとAR作動機種がこれから増えるのでしょうか？なぜ、Windowsで作動しないのか不思議です。表示のためのパラメータが多いので、プログラムが少しだけ長くなりますが、細かな設定までできるようです。

# どれを使えばいいの？
　どれを利用したら良いかは、「ARを利用して何をしたいか」によって異なる思います。3つのサイトは「中学校技術」の授業で活用してもらうために作成しました。AR表示の安定性、マーカーの有無などの違いの特徴から、生徒たちはどの方法を選ぶのでしょうか。とても興味があります。
docker execのオプションについてまとめてみた

---
<font color="green">docker exec</font>のオプションについてまとめてみた
---

**目次**
- [1. そもそもdocker execとは](#1-そもそもdocker-execとは)
- [2. オプション一覧](#2-オプション一覧)
- [3. おわりに](#3-おわりに)

# 1. そもそもdocker execとは

　docker exec コマンドは、既に実行中のDockerコンテナ内で新たなコマンドを実行するために使用されます。

&emsp;このコマンドは、コンテナの外部からコンテナ内部のプロセスを起動する際に非常に便利です。

docker exec コマンドの一般的な使い方は以下の通りです：

```bat
docker exec [オプション] コンテナ名 コマンド [引数...]
```

# 2. オプション一覧

&emsp;以下にいくつかの一般的なオプションとその説明を示します。


1. `-d`, `--detach`
   - **説明**: コマンドをバックグラウンドで実行します。
   
2. `-i`, `--interactive`
   - **説明**: コマンドの標準入力を開いたままにします。対話式コマンドやシェルを使用する際に役立ちます。

3. `-t`, `--tty`
   - **説明**: 疑似TTY（端末）を割り当てます。対話式シェルで利用する場合に便利です。

4. `--env`
   - **説明**: コンテナ内で環境変数を設定します。
   - **例**: `--env VAR=value`

5. `--user`
   - **説明**: 指定されたユーザーとしてコマンドを実行します。
   - **例**: `--user nobody`

<br>
 詳しくは下記を参照してください。

[docker exec](https://docs.docker.jp/engine/reference/commandline/exec.html)

　因みに`-it`は2つの異なるオプション -i （--interactive）と -t （--tty）を組み合わせたものです。

　これらを一緒に使用することで、コンテナ内でインタラクティブなシェルセッションを開始できます。

 -itの使用例：
　以下は、docker execコマンドを使用して、mycontainerという名前のコンテナ内で対話式のbashシェルを開始する例です。

```sh
docker exec -it mycontainer /bin/bash
```

&emsp;このコマンドは、コンテナの標準入力を開いた状態で（-i）、疑似TTYを割り当てた（-t）シェル（/bin/bash）を起動します。

&emsp;これにより、ユーザーはコンテナ内のシェルに対してコマンドを入力できるようになり、シェルの出力が適切にフォーマットされます。

# 3. おわりに

　`-it`が`-i`と`-t`を組み合わせたものとは知らなかったので、勉強になりました。
VirtualBox:Raspberry Pi Pico向けTOPPERS/FMP3のビルド

## 検証環境
VirtualBox バージョン 6.0.4 r128413 (Qt5.6.2)
ホストOS:Windows10 22H2(19045.3930)
ゲストOS:ubuntu-16.04.6-desktop-i386.iso
　http://ftp.riken.jp/Linux/ubuntu-releases/xenial/ からダウンロード

・VirtualBoxのGuestOS起動時のエラー対処
Call to WHvSetupPartition failed
対処　[Windowsの機能]で、以下を無効にしてOS再起動
　 Hyper-V
　 仮想マシンプラットフォーム

・ゲストOSのUbuntuのパッケージを最新版にアップデート。以下のパッケージを追加
```
sudo apt-get update
sudo apt-get install g++ libboost-all-dev openssh-server ruby unzip
```
## 手順
・クロスコンパイラを取得する。
https://developer.arm.com/downloads/-/gnu-rm/5-2016-q3-update
　Linux 32-bit版をダウンロード
　gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2

・TOPPERSのソースを取得する。
TOPPERS/FMP3カーネル ターゲット非依存部パッケージ：
　fmp3-3.2.0.zip
Raspberry Pi Pico簡易パッケージ：
　fmp3_raspberrypi_pico_gcc-20211016.tar.gz

・ディレクトリの作成、および取得したファイルを以下のように配置する。
```
~/pico/bin
　gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2
~/pico/fmp3
　fmp3-3.2.0.zip
　fmp3_raspberrypi_pico_gcc-20211016.tar.gz
~/pico/build
  ファイルなし(空フォルダ)
```
・クロスコンパイラは展開後、パスを追加する。ソースは、fmp3個別パッケージに、pico簡易パッケージを上書きする。
```
cd ~/pico/bin
tar xjf gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2
export PATH=$PATH:~/pico/bin/gcc-arm-none-eabi-5_4-2016q3/bin/
cd ../fmp3
unzip fmp3-3.2.0.zip
mv fmp3_3.2 fmp3
tar zxf fmp3_raspberrypi_pico_gcc-20211016.tar.gz
```
configure、およびビルドを行う。
```
cd ~/pico/build
../fmp3/fmp3/configure.rb -T raspberrypi_pico_gcc -w -S "syslog.o banner.o serial.o logtask.o chip_serial.o"

make
```

## 参考
Qiita:TOPPERS/ASPをビルドして動かしてみる
https://qiita.com/Yukiya_Ishioka/items/9ecbe080939600c323c6