OmniAICreator/Qiita-1.07M huggingface dataset:
Bizrobo! Design Studio テストステップの条件分岐について

## はじめに
Design Studioのテストステップは柔軟に活用できる反面、
開発時にミスが起こりやすいステップだと考えています。
今回はテストステップを使用する際に気を付けている点について共有します。
<br>

:::note warn
※現場や考え方によって変わる部分ですので、
一つの考え方として見ていただければと考えております。
:::


<br>
ビズロボのDesign Studioで開発されている方は、<br>
下記の画面に見慣れていると思います。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/c88858b8-c443-c81c-b66f-cc0b105c9bcb.png)





コンバータとエクスプレッションのどちらを使うのかなど、
迷う点は多々ありますが、今回はIfの条件についてです。


## 値判定のIfとは
ビズロボでは条件を満たす場合と満たさない場合で処理を分けることができます。
プログラミングの基本的な処理とはなりますが、<br>様々な条件を組み合わせることで複雑な処理も可能となります。


<br>
※バージョンによっては、一部表示が異なります。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/e18e7074-6272-c9ba-b4bd-0d6a02189f1b.png)


条件を満たしている場合にエラーとすることもできれば、
条件を満たさない場合をエラーとすることも可能です。


## 開発時に気を付けていること
### 1.基本的には条件式を満たさない場合にエラーとする

シンプルなロボットの作成であれば問題にはなりませんが、
テストステップが多く存在する場合や、テストステップの中にテストステップがある状態（入れ子状態）になった際にはかなりややこしくなります。

<br>
条件式を満たす場合にエラーとするテストステップと<br>条件式を満たさない場合にエラーとするテストステップが混在している状態では、<br>開発時のミスや改修時に苦労することとなります。

そのため、基本的には条件式を満たさない場合にはエラーとして、
エラーハンドリングに進むように設計していくことが重要だと考えています。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/cf559dcd-391a-a048-cbd8-e0016a5049e7.png)


:::note info
条件式を満たす場合にエラーとするケースとしては、
検索処理時に「該当条件がありません。」が表示されている場合はエラーへと進むなどというケースがあるかと思います。

適宜使い分けていきましょう。
:::


### 2.ステップ名をわかりやすくする
下記のようなステップ名の場合処理で何を行っているのかを一つひとつのステップを見ていかないと大まかな処理が把握できません。

![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/0b893810-74ce-b9fb-ada9-cba09386b455.png)


一方で下記は商品の個数を判定しており、10個以上の場合は本処理へ進み、<br>10個未満の場合にはメール通知を行うと視覚的に理解ができます。
（※ステップ名と実処理が異なっている可能性もあるため詳細確認は行う前提となります。）
![スクリーンショット 2024-09-03 162602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291018/5c251213-18fe-2482-aefd-01d21c0457bf.png)


### 3.できるだけステップ内にベタ打ちをしない。
テストステップ内で数値やテキストをベタ打ちしている状態は、
今後変更があった際にロボットファイルの修正が必要となるということです。

できるだけ変数を使用し、変数の値は設定ファイルや動的なページから抽出するなどの、<br>別で用意するなどの対応をすることが望ましいと考えています。



## 最後に

今回はテストステップについてでした。

テストステップだけではなく変数の命名やエラーハンドリングなど、
保守性を高めるために工夫するべき点は多くあり、
私自身も日々模索中となります。


稼働後に改善点が見えてくるシーンが多々ありますので、
繰り返さないように今後の開発に活かしていきたいです。

最後まで見ていただきありがとうございました。
AWS「Prompt Flows」S3 Retrievalノードを使ってみた

# はじめに
今回はAmazon Bedrock「Prompt Flows」のS3 Retrievalノードを使って、Amazon S3の場所からテキストデータを取得し、そのテキストに英語で返答する、シンプルなアプリケーションを作成してみました。

「Prompt Flows」は、ノードを配置して生成AIのワークフローを開発・管理できるサービスです。

https://aws.amazon.com/jp/bedrock/prompt-flows/

# 導入
アプリケーションの全体像は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806967/5965541b-a052-31dc-adfb-65f69a07096f.png)

**①オブジェクトキーの入力**
**②S3からデータを取得**
**③Promptsでの処理**
**④処理結果の出力**
という流れになっています。

今回Amazon S3を使用するにあたって、バケットの作成をおこないましたので、その方法も共有します。
以下のような設定でバケットを作成しました。

バケットを作成
↓
バケットタイプ：汎用を選択
↓
バケット名を記入
↓
ACL無効
↓
パブリックアクセスをすべてブロック
↓
バケットのバージョニング：無効
↓
暗号化タイプ:Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
バケットキー：有効
↓
詳細設定
オブジェクトロック：無効

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806967/d1c39337-5085-8dd9-5a50-aae8ac685f32.png)


アプリケーションの流れについて説明します。

**①オブジェクトキーの入力**
Flow Inputでは、オブジェクトキーの入力をおこないます。
まず今回使用する2つのファイルについて説明します。

これらのファイルを事前にアップロードしておきます。
・1つ目
オブジェクトキー：folder/aws_pf_test.txt
内容：こんにちは。 今日は良い天気ですね。

![s3r_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806967/317537d9-22bd-efdd-4bc1-55461ab30dd7.png)

・2つ目
オブジェクトキー：aws_pf_test2.txt
内容：Good afternoon. How are you today?

![s3r_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806967/50ba57b4-af7d-2046-b8d3-6e570f3039fc.png)

**②S3からデータを取得**
S3 Retrievalノードでは、S3からデータを取得してフローに導入できます。
S3 Bucket Nameで、データを取得するバケットを指定します。
Inputはオブジェクトキーで、OutputではS3ロケーション内のコンテンツを出力として返します。

![s3r_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806967/64b19aec-5414-b054-d859-d8897049c458.png)

**③Promptsでの処理**
今回Promptsでは、バケットから取得したテキストデータに対して、英語で返事するように指示しています。

```
{{s3Content}}の文章に英語で返事して。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806967/3217e951-bcfd-7ee6-ccdc-14cf9916ba01.png)


**④処理結果の出力**
**③Promptsでの処理**でおこなった処理の結果を出力します。


# 実行結果
実行結果は、それぞれ以下のようになっています。
・1つ目のファイル
実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806967/6cb0b1d5-54aa-c453-c77c-00aae3cb1512.png)


・2つ目のファイル
実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806967/3dea9d82-0d58-1292-6621-5520ae3427d6.png)


# まとめ
今回は「Prompt Flows」のS3 Retrievalノードを使って、S3からテキストデータを取得し、そのテキストに英語で返答する、シンプルなアプリケーションを作成してみました。
今後はもっと発展した内容の例を作成したいと考えています。
【日本語】What is Pest 3.0(PHP Testing Flamework)

Laravel11からデフォルトのテストフレームワークとなったPestですが、近日バージョンアップが行われます。
まだまだPHPUnitの歴史が深く、浸透していないですが、日本最速(？)キャッチアップを目指して紐解いていきます。

## Pest 2.0との互換性
完全下位互換性があるため、簡単にバージョンアップ可能です。
この辺は昨今当たり前になってきていますね。

## 主要なアップデート
タスク管理、アーキテクチャプリセット、ミューテーションテストの3点です。
以下にまとめます。

## タスク管理
タスク管理を使用すると、担当者(assignee)、課題番号(issue)、プル リクエスト番号、メモなどをテスト上で直接追跡できます。タスクを追跡すると、テストで常に利用できる作業履歴を保持できます。
TDDが捗りそうです。
```php
test('some test 1', function () {
    // ...
})->todo(assignee: 'paulredmond', issue: 13);
 
it('returns a successful response', function () {
    $response = $this->get('/');
 
    $response->assertStatus(200);
})->todo(
    assignee:'nunomaduro',
    issue:11,
    pr:1,
    note:'Need to assert the response body.'
);
 
// Eric is a closer ☕️
test('drives always go in the fairway', function () {
    // ...
})->done(assignee: 'nunomaduro', issue: 11);
```
`#11`や`@nunomaduro`をクリックすればGithubにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798970/ce700745-2321-b759-8aad-ac63e10b3ba3.png)

コマンドラインから、担当者または問題別にテストをフィルタリングできます。
```sh
$ pest --issue=11
$ pest --assignee=paulredmond --pr=1
$ pest --assignee=ericlbarnes
$ pest --issue=13
$ pest --notes # returns tests with notes
```

## アーキテクチャプリセット

アーキテクチャ プリセットは、複数のプロジェクトで同じアーキテクチャ ルールをすばやく使用し、Laravel、PHP、Strict/Relaxed PHP プリセットなどの一般的なプリセットを活用する方法です。これにより、デバッグ関数などを残すなどの操作が防止されるため、コードの一貫性が向上します。
社内の開発環境の均一化の手段の1つとして有効です。またLaravel初心者がいるPJで、PRで指摘しあう必要もなくなるので、より高度なコミュニケーションに集中できます。

これらのプリセットは次の方法で使用できます
`arch()->preset()`
```php
arch()->expect('dd')->not->toBeUsed();
```
ddを使っていないことだけをテストすると下記のように検知されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798970/cb5e7296-dab1-5cc2-68be-0377b300bd26.png)

上記のようなテストを1つずつ書くこともできます。（既存PJや大規模PJ向け）
新規PJや中規模、小規模なPJ向けには、下記のように呼び出すだけで一括でテストできます。
```php
// die(), phpinfo()といった不要な関数の呼び出しがないことをテストします。
arch()->preset()->php();
 
// eval(), md5()といったセキュリティに問題ある関数の呼び出しがないことをテストします。
arch()->preset()->security();
 
// コントローラのメソッドを検証するためのプリセットです、
// コントローラファイルの接尾辞が `Controller` である、など。
arch()->preset()->laravel();
 
// クラスがfinalなものであることを保証するプリセットです。
arch()->preset()->strict();
 
// 厳密な型が使用されないようにプリセットされ、finalもprivateメソッドもないことをテストします。
arch()->preset()->relaxed();
```
## ミューテーションテスト
使い方は、`--mutate`オプションを付けるだけです
コードをわずかに自動改変し、テストを実施します。
この時テストが失敗すれば、テストは正しく書かれています。
もし、テストが成功してしまうと改変したコードに対してテストが行われていないことがわかります。

## 参考
動画を見てわかるように、ここまでサクサクと試せるのはPestだけではないのでしょうか？
まさにPestの素晴らしさを体現している動画だと思い、私は非常に感動しました。

https://www.youtube.com/watch?v=BNhbgcNJyAk

https://laravel-news.com/everything-we-know-about-pest-3
アシスタント機能のアップデート Cognos Analytics 12.0.3

## 概要
自然言語の入力でグラフの作成が行える「アシスタント」の機能に関して、こちらの記事で以前に紹介していました。
**Cognos Analytics 12.0 新機能 アシスタント**
https://qiita.com/shinyama/items/7eabb9e07926aa2d2354

今回はCognos Analytics 12.0.3での機能アップデートをご紹介します。

## 参考情報
**アシスタント 12.0.3**
https://www.ibm.com/docs/en/cognos-analytics/12.0.0?topic=2024-assistant

## 12.0.3でのアップデート
このようなコーヒーショップの販売データがサンプルとしてあり、製品、店舗、スタッフなど色々なデータの中で販売に対して何が一番影響を与えているのかを一つの質問で見る事が出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8a0abd9e-7d50-12a2-d024-bf92d21cf50c.png)

Assistantで「コーヒー販売とマーケティング」をデータソースに指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/40bfcd2c-f76b-6ddd-6204-8d39b3537378.png)

いきなりですが「what impact sales?」と聞いてみます。
スパイラル・グラフで表示されました。
円の中心にある点ほど、Salesに強く影響を与える因子という事になります。
今回の結果では、緑の点の「Product Type、Retail Price、Quantity、Unit of Measure、Revenue」の組み合わせが、Salesに対して95%の相関を持っているという結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/50cf8242-7307-a99c-16ef-04c96c16b27b.png)

円の中心から離れた点をクリックしてみると、このように詳細が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d2067e04-7874-c8e2-d7fb-4c00b8096238.png)

質問は「what influence ～」でも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/bcb9d5f4-e5e9-4db1-e656-5d72b174515d.png)
ファームウェア大事

周辺機器があって、それぞれに対するリアルタイム性が重要なときには、ファームウェアがなおさら大事だ。

#### 注意
　この文章は、ファームウェアを実装したことのない人物が書いています。

ファームウェア「ファームウェアとは、電子機器に組み込まれたコンピュータシステムを制御するためのソフトウェアで、ソフトウェアをROM等の集積回路にあらかじめ書き込まれた状態で、機器に組み込んだもの。」

## ファームウェアが必要な理由
- 多数の周辺機器があってリアルタイムのモニタリングや制御を必要とする場合、CPUボード上で全ての面倒をみることはできない。
- それぞれのデバイスの信号はマイコンを経てそれぞれのコネクタ・通信のプロトールで、CPUボードと接続している。
    - UART / SPI / I2Cといった通信規格
- CPUボードに用意されているインタフェースは、カスタムボードでも限られる。
そのため、マイコンを経て各種デバイスのモニタリング・制御が必要になる。
- 生じた変化に対して高い応答性で対応するには、少ない時定数の中で処理をしなくてはならない。
    - 例：熱いものに触った時に手を引っ込めるのは反射です。脳に信号が伝わってから判断して行動しているわけではありません。周辺機器の制御の場合にも、応答性が必要な場合、CPUを介さずに処理する必要があります。ロボットの実装においてもそのようなアプローチがとられることがあります。


UART は、調歩同期方式によるシリアル信号をパラレル信号に変換したり、その逆方向の変換を行うための集積回路である。本機能のみがパッケージングされたICで供給されるものと、マイクロプロセッサのペリフェラルの一部として内蔵されるものとがある。[wiki](https://ja.wikipedia.org/wiki/UART)

シリアル・ペリフェラル・インタフェースは、コンピュータ内部で使われるデバイス同士を接続するバスである。パラレルバスに比べて接続端子数が少なくて済むシリアルバス規格の一種で、比較的低速なデータ転送を行うデバイスに利用される。[wiki](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%BB%E3%83%9A%E3%83%AA%E3%83%95%E3%82%A7%E3%83%A9%E3%83%AB%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9)

I²Cはフィリップス社で開発されたシリアルバスである。低速な周辺機器をマザーボードへ接続したり、組み込みシステム、携帯電話などで使われている。 Inter-Integrated Circuit の略で、I-squared-Cが正式な読みとされている。[wiki](https://ja.wikipedia.org/wiki/I2C)


[LOVOTを動かすファームウェア](https://tech.groove-x.com/entry/inside-of-lovot-fw)


[パルス幅変調とは?](https://jp.mathworks.com/discovery/pulse-width-modulation.html)

[RaspberryPiのPythonによるPWM出力について](https://qiita.com/tanutanup/items/39b339c9575cf2f551d4)

## この文章の結論：
- 各種周辺機器があって、モニタリング・制御がある場合、マイコンとファームウェアを含めた設計が不可欠。
- ファームウェアの存在を無視してOSを議論しても不十分だ。
- ファームウェアのレイヤーで何が必要なのかを考えた設計と実装が、各種周辺機器を使いこなす。
マイグレーションツールまとめてみた

## はじめに
SAPの勉強していく中でごちゃごちゃになっていたマイグレーションツールについて整理してみました。
ツール全部を詳しく書くと記事に収まらないので、実試験を解くために簡単にまとめた程度の記事です。

## 対象者
- AWS初学者
- AWS SAA、AWS SAPを取得しようと思っている方

### 1. AWS Migration Hub
複数の AWS およびパートナーソリューション間でのアプリケーション移行の進行状況を追跡する。
アプリケーションの全体の以降のステータスを可視化もできる。

### 2. AWS Application Discovery Service
オンプレミスのデータセンターに関する情報を収集する。

### 3. Migration Evaluator（旧：TSO ロジック）
インサイトにアクセスし、AWS への移行に関する意思決定を無料で加速できる。
データ収集に続いて、AWS クラウドでオンプレミスワークロードを実行することによる予測コスト見積もりと節約を含む評価を速やかに受け取れる。

### 4. AWS Server Migration Service
オンプレミスの VMware vSphere、マイクロソフトの Hyper-V/SCVMM、および Azure 仮想マシンの AWS クラウドへの移行を自動化する。

### 5. CloudEndure
物理ベース、仮想、またはクラウドベースのインフラストラクチャから AWS にアプリケーションを無償で移行するための CloudEndure Migrationを提供する。

### 6. AWS Database Migration Service (DMS)
リレーショナルデータベース、データウェアハウス、NoSQL データベース、およびその他のタイプのデータストアを簡単に移行する。

### 7. AWS Storage Gateway
オンプレミスのソフトウェアアプライアンスとクラウドベースのストレージを接続し、オンプレミス環境と AWS ストレージ間のデータセキュリティ機能とのシームレスな統合を提供する。

### 8. AWS Transfer Family
Amazon S3 または Amazon EFS に対してファイル転送を行うフルマネージドサービス。

### 9. AWS DataSync
オンプレミスのストレージシステムと AWS ストレージサービス間、および AWS ストレージサービス間のデータ移動を簡素化、自動化、および高速化するオンラインデータ転送サービス。

### 10. AWS Snowball
AWS SnowFamily の一部であり、エッジコンピューティング、データ移行を実行する。

### 11. AWS Snowball Edge
一部の AWS 機能用のオンボードストレージとコンピューティングパワーを備えた Snowball デバイスの一種。

### 12. AWS Direct Connect
オンプレミスから AWS への専用ネットワーク接続を簡単に確立できるクラウドサービスソリューション。

### 移行ツールの依存関係
![migrationtools-1-1024x572.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/abbe2a17-5621-b9f2-6032-bc3c83a82cca.png)
実問題もこちらの画像で要件を満たしながら考えると解きやすかったです

## 参考資料
[これだけは押さえておきたい、AWS移行全12ツール一挙紹介！](https://aws.amazon.com/jp/blogs/psa/migration_tools/)
[AWS Application Discovery Service のよくある質問](https://aws.amazon.com/jp/application-discovery/faqs/)
[AWS Application Discovery Service](https://aws.amazon.com/jp/application-discovery/)

## 最後に
後日AWS Migration Hubについて
実際に触ってみたので実際のキャプチャや操作感についても、まとめられたら記事にしてみようと思います。
（仮）新規アプリ開発

## ゴール
５年後に年間売り上げが3000万円の事業を作り、2億円で売却する。

### 今できること
- アプリがつくれる
- 各種生成AI

## 計画

#### 1. 市場調査とアイデア出し
目標設定: 年間売上3000万円を達成するためには、月間約250万円の売上が必要です。これを達成するために、どのようなアプリが適しているか検討します。
市場調査: アプリ市場のトレンドを調査し、競合分析を行います。自分の強み（例えば、UXデザインや特定分野の知識）を活かせるニッチを見つけます。
アイデア出し: 複数のアプリコンセプトを考え、その中から需要があり、収益化が見込めるものを選定します。ユーザーの問題を解決するアイデアが強力です。

#### 2. プロトタイプと検証（1年目）
プロトタイプ開発: 簡易的なプロトタイプを作成し、ユーザーテストを行います。早期のユーザーフィードバックを得て、改良を重ねます。
MVP（最小限の実用的製品）開発: MVPをリリースし、実際のユーザーに使用してもらいます。
収益化の検証: 広告、サブスクリプション、課金モデルなど、収益化の方法をテストします。

#### 3. スケールアップとマーケティング（2〜3年目）
ユーザー獲得: マーケティング戦略を立て、ユーザー数を増やします。SNSマーケティングやSEO、広告など、多様な手法を試します。
フィードバックを基に改善: ユーザーのフィードバックをもとに、機能追加や改善を行います。
チーム拡大: 必要に応じて、開発支援やマーケティング支援のためにチームを拡大します。

#### 4. 収益最大化と新機能開発（4〜5年目）
収益化の最適化: これまでのデータをもとに、収益化モデルの最適化を行います。定期的なアップデートでユーザーの離脱を防ぎます。
新機能開発: 収益をさらに増加させるための新機能を追加します。ユーザーのニーズに応じたパーソナライズなどが考えられます。
多様な収益化戦略: コラボレーションやB2Bの展開も視野に入れ、新たな収益源を探ります。

#### 5. 年間売上3000万円達成のための戦略（5年目）
KPIのモニタリング: 収益、ユーザー数、リテンション率などのKPIを定期的にチェックし、目標達成の進捗をモニタリングします。
柔軟な戦略の見直し: 必要に応じて戦略を見直し、目標達成に向けた最適なアプローチを維持します。

## 市場調査のステップ

#### 1.市場規模と成長トレンドの把握

アプリ市場全体の規模や成長率を確認します。特に注目すべきは、どのジャンルが成長しているか（例：健康、教育、エンターテインメントなど）。
世界的なトレンドと国内のトレンドを比較して、ターゲット市場の選定に役立てます。
#### 2.競合分析

競合アプリをリストアップし、ダウンロード数、収益モデル、ユーザーレビュー、機能の特徴などを分析します。
競合の強み・弱みを把握することで、自分のアプリが差別化できるポイントを明確にします。
#### 3.ターゲットユーザーの特定とニーズの理解

ターゲットとするユーザー層（年齢、性別、地域、趣味など）を明確にし、彼らのニーズや課題を把握します。
ユーザーインタビューやアンケートを通じて、具体的なフィードバックを得ます。
#### 4.収益化モデルの分析

市場で主流となっている収益化モデル（広告、サブスクリプション、アプリ内課金など）を確認します。
収益化の成功例や失敗例を調べ、最も効果的な方法を検討します。
#### 5.トレンドと新しい技術の確認

現在の技術トレンド（AI、AR/VR、ブロックチェーンなど）がどのようにアプリに活用されているかを調査します。
新しい技術を活用することで競争優位性を持たせられるか検討します。

## 次のアクション

具体的な市場データや競合情報を集めるには、関連するリサーチレポートや統計データを参照する必要があります。
もし、特定のジャンルやターゲットが決まっていれば、その情報を元にさらに深い調査が可能です。
Github Actions で隠しディレクトリ・ファイルがアップロードできない ( actions/upload-artifact@v4 )

# 問題

`.up` のような隠しディレクトリをアップロードしようとすると、エラーが起きてしまう

エラー例

```
Error: No files were found with the provided path: .up/. No artifacts will be uploaded.
```

# 解決

`upload-artifact@v4` では隠しファイル、ディレクトリをアップロードする時はオプションを指定しなければいけなくなったようだ


```diff
jobs:
  setup:
    name: 'Setup'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Upload Test
        uses: actions/upload-artifact@v4
        with:
          name: upload-test
          if-no-files-found: error
+         include-hidden-files: true
          path: .up
```

# 公式

https://github.com/actions/upload-artifact/blob/main/docs/MIGRATION.md

https://github.com/actions/upload-artifact?tab=readme-ov-file#v4---whats-new
静的なLPをdistをルートとして確認する


静的なLPをつくってるとルート相対パスなどサーバー上げないと確認できないことがある。
phpでlocalhost:8000でサーバー起動して確認できる！

```
npm run build
cd dist
php -S localhost:8000
```

http://localhost:8000/
AWS Cost Anomaly Detectionの解説

## はじめに

**AWS Cost Anomaly Detection**は、AWSサービスの利用料金に異常がないか、機械学習を使って自動的にチェックしてくれる機能です。

**なぜ使うべき？**

- クラウドサービスの利用料金は、週や月によって大きく変動します
- 従来の監視方法では、小さな異常を見逃してしまう
- AWSコストアノマリーディテクションは、機械学習で過去の利用パターンを分析し、異常な支出を検出する

**どんなことができるの？**

- **異常な支出パターンを検出**: 過去のデータから、予測される支出と実際の支出を比較し、異常な支出を特定できる
- **原因分析**: 異常な支出の原因を分析し、どのサービスでどれくらい料金が発生しているのかを詳しく調べることが可能
- **通知機能**: 異常な支出が検出された場合、メールやAmazon SNSで通知を受け取ることができる

**設定は簡単！**

- AWSマネジメントコンソールでAWSCostExplorerを有効化すると、AWS Cost Anomaly Detectionも自動的に有効化
- コストモニター、機械学習モデル、アラートサブスクリプションといった機能を使い、監視対象や通知方法などを設定できる

**検出結果の確認**

- 検出履歴から、異常が検出された日付、継続期間、コストへの影響などが確認できる
- 詳細ページでは、異常の原因を詳しく分析するが可能

**利点**

- **コスト削減**: 異常な支出を早期に発見することで、無駄なコストを削減
- **迅速な対応**: 通知機能を活用することで、異常が発生した場合に迅速に対応
- **運用効率化**: 自動化された監視により、人手に頼っていた監視作業を効率化

**まとめ**

AWS Cost Anomaly Detectionは、AWSサービスの利用料金を効率的に管理するための強力なツールです。この機能を活用することで、コスト削減、迅速な対応、運用効率化を実現できます。まだ利用していない方は、ぜひ設定してみてください！

**関係資料**
[AWS Cost Anomaly Detection AWS Black Belt](https://www.youtube.com/watch?v=lrpdhXdfvnY)
[AWS Cost Anomaly Detection AWS Black Belt/PDF](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbURnbXM4TFBTQ01VcGRnNG1nV1RZa1JZMjVWd3xBQ3Jtc0trNk5YV2dzcU55dHNKNDBVRWU1SlJxYVpqTjREOE1LZENWX3JzazA1OXVKNTRxMkp6ZDQtREFjY3NHQU9FTXpXUkdId2JsTFN2cExOS1BjQnIwRktGaUlBZGNPWmdHa3VDdnJnWFJ1LU4wam01dFN1aw&q=https%3A%2F%2Fpages.awscloud.com%2Frs%2F112-TZM-766%2Fimages%2FAWS-Black-Belt_2024_AWS-CostAnomalyDetection_0831_v1.pdf&v=lrpdhXdfvnY)
CloudFrontでビューワー制限した画像をHTMLメールで送信する

CDNとしてCloudFrontを利用していて、閲覧制限をかけたいという場合、[署名付きCookie](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-cookies.html)を利用しているパターンが多いのではないでしょうか。
例えば、ログイン済みの特定のユーザーのみ閲覧できる画像があるケースです。

このような場合におけるメールに画像を添付する方法について共有します。

結論、[署名付きURL](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html)を利用して解決しましたが、そこに至るまでの経緯も含めて紹介します。

## 署名付きCookie

最初に検討したのが署名付きCookieをそのまま利用する方法でした。しかし、通常のWebサイトと異なり、メーラーで必ずしもCookieを利用できない、できたとしてもメーラーごとに仕様が異なり対応は難しいと分かりました。

そこでCookieを利用せず、画像をURLで設定するのではなく、base64エンコーディングして埋め込む、添付した画像を参照するなどの方法も検討しました。

Laravelには以下のようにしてメールに画像を埋め込むことができたため利用してみました。

```
<img src="{{ $message->embed($pathToImage) }}">
```

しかし、埋め込むため、メールの容量が重くなってしまいました。複数の画像を埋め込む予定であったため、この方法も諦めました。

## 署名付きURL

署名付きURLを利用することで、署名付きCookieで閲覧制限をかけた画像をメールに添付することができました。

AWSには以下のような記述がありました。これに早く気づいていれば良かったです。

> ビューワーのアクセスを制限する
> ビューワーのアクセスを制限する場合、ビューワーがコンテンツにアクセスするには
> CloudFront 署名付き URL または署名付き cookie を使用する必要があります。

ビヘイビアの編集からビューワーの設定をしている箇所に記載がありました。

![ビヘイビアの編集からビューワーの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717486/8283194c-d2e0-fb86-d2cb-b132959fdc58.png)

AWSがCookieを利用できない場合を考慮してくれていました。

AWSのドキュメントにも使い分けの説明がありました。今回のようにメールに添付する場合は2つ目のケースですね。

[署名付き URL を使用するか、署名付き Cookie を使用するかを決定する](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-choosing-signed-urls-cookies.html)

>次のような場合は、署名付き URL を使用します。
>・個別のファイル (アプリケーションのインストールダウンロード) へのアクセスを制限する場合。
>・ユーザーが Cookie をサポートしていないクライアント (カスタム HTTP クライアントなど) を使用している場合。
Windowsのコマンドプロンプトで他にどんなユーザーがログインしているか確認

# 概要

リモートデスクトップしてシャットダウンや再起動をしたい。
でも他にログインしている別ユーザーの編集途中のファイルがあるかもしれない…。

なので、まずは他にどんなユーザーがログインしてるか確認したい。

# やり方

```bat:
quser
```

実行結果例は下記。
このコマンドは『アイドル時間』『ログオン時刻』が見れるのが良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/27370b6c-adc8-83af-1295-14b215a62a3e.png)

# バージョン

Microsoft Windows [Version 10.0.22631.4112]
Arduino UNO 3で合計を取って遊ぶ


Arduino UNO 3で合計を取って遊ぶ


●なんやこれーーーー ムズイ　ムズイ

![o_coq366.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6ca438e9-cb51-a08b-45d2-bdcb5655203e.jpeg)



いろいろ
アルゴリズム的には、単位半分くらいでドラクエ1的には、レベル55
最終章は、ソート　レベル的には99


結果

![o_coq367.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/70348ab5-4aed-47ad-08ef-3f9844a640c3.jpeg)




プログラム


```c++



//初期化
// the setup routine runs once when you press reset:
void setup() {

  //シリアルポートの初期化
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

}//setup



#define n 10

//メインループ
// the loop routine runs over and over again forever:
void loop() {

  int x[n + 1];

  x[1] = 1; x[2] = 2; x[3] = 3; x[4] = 4; x[5] = 5;
  x[6] = 6; x[7] = 7; x[8] = 8; x[9] = 9; x[10] = 10;

  int z = 0;
  for (int k = 1; k <= n; k++) {

    z = z + x[k];

  }//for

  //結果の表示
  // print out the value you z:
  Serial.println(z);
  delay(1000);        // delay in between reads for stability

}//loop


```
Loggerとユニットテスト

```c#:Log.cs
public static partial class Log
{
    [LoggerMessage(EventId = 1000, Level = LogLevel.Information, Message = "{Message}")]
    public static partial void OutputMessage(this ILogger logger, string message);
}
```

```c#:MyService.cs
public class MyService(ILogger<Service> logger) : IMyService
{
    private readonly ILogger<Service> _logger = logger;

    public void DoSomething()
    {
        _logger.OutputMessage("DoSomething");
    }
}
```

こんな感じのコードを作って、ログを出力しているかどうかのテストを作ると

```c#: MyServiceTests.cs
public class MyServiceTests
{
    [Fact]
    public void DoSomethingTest()
    {
        var logger = new Mock<ILogger<Service>>();
        var service = new MyService(logger);

        service.DoSomething();
        logger.Verify(logger => logger.Log(It.Is<LogLevel>(loglevel => loglevel == LogLevel.Information),
                                       It.Is<EventId>(eventId => eventId.Id == 1000),
                                       It.Is<It.IsAnyType>(o, t) => true),
                                       It.IsAny<Exception>(),
                                       It.Is<Func<It.IsAnyType, Exception?, string>>((v, t) => true)),
                      Times.Once);
    }
}
```

こんな感じのコードになる。[Copilot](https://copilot.microsoft.com)に作らせても同じようなコードになる。
が、実行すると例外を吐いて止まってしまう。

> Performed invocations:
> Mock<ILogger<IdentityUserService>:1> (e):
> ILogger.IsEnabled(LogLevel.Information)

`ILogger.IsEnabled(LogLevel)`って何よってことで、デバッカで掘っていくと

``` c#:LoggerMessage.g.cs
if (logger.IsEnabled(global::Microsoft.Extensions.Logging.LogLevel.Information))
{
    __OutputMessageCallback(logger, message, null);
}
```

こういうコードに突き当たる。

というわけで、
```c#: MyServiceTests.cs
public class MyServiceTests
{
    [Fact]
    public void DoSomethingTest()
    {
        var logger = new Mock<ILogger<Service>>();
        logger.Setup(logger => logger.IsEnabled(LogLevel.Information)).Returns(true);

        var service = new MyService(logger);

        service.DoSomething();
        logger.Verify(logger => logger.Log(It.Is<LogLevel>(loglevel => loglevel == LogLevel.Information),
                                       It.Is<EventId>(eventId => eventId.Id == 1000),
                                       It.Is<It.IsAnyType>(o, t) => true),
                                       It.IsAny<Exception>(),
                                       It.Is<Func<It.IsAnyType, Exception?, string>>((v, t) => true)),
                      Times.Once);
    }
}
```

こうすることでテストが完走するようになりました、という実体験を文字起こし。
(QA) Db2 for i のジャーナル（ログ）の項目、レイアウトを調べたい

上記ご質問をいただきまして。

Oracleその他のRDBのログをDb2 for i ではジャーナル（データベースジャーナル）と呼びます。

## ジャーナルのレイアウトなど基本情報

こちらのマニュアルページに記載がありました。

**ジャーナル表示 (DSPJRN)**

https://www.ibm.com/docs/ja/i/7.4?topic=ssw_ibm_i_74/cl/dspjrn.html


**ジャーナル項目情報ファインダー**

例えば、DBテーブルへのレコードの追加はジャーナル項目タイプ (ENTTYP)が 'PT' となります。この項目タイプが何か？を調べるのに便利です。

https://www.ibm.com/docs/ja/i/7.5?topic=information-journal-entry-finder


例として上記のジャーナル項目情報ファインダーで、　文字で検索　に　'PT'  を入力すると下記のように結果が返ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7b49321e-6b6b-54e2-9097-44508ad9cd3e.png)

下記のように結果が返ります。現状、結果ページは英語のようです・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/efde3509-a40f-b460-ceb5-0bd8ea0d2db0.png)
ギャラリーに写真を保存

Android 9以前で、アプリから端末の標準写真フォルダ（ギャラリーアプリ）に画像を登録するには、以下の手順を行います。

### 1. 画像を保存する
まず、画像を保存するためのコードを実装します。たとえば、外部ストレージの「Pictures」フォルダに画像を保存する場合、次のようにします。

```kotlin
val filename = "example_image.jpg"
val picturesDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val file = File(picturesDirectory, filename)

val outputStream: OutputStream = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
outputStream.flush()
outputStream.close()
```

### 2. `MediaScanner`を使用してギャラリーに画像を登録
保存した画像をギャラリーアプリに認識させるためには、`MediaScannerConnection`を使用して画像をスキャンし、メディアデータベースに登録します。

```kotlin
MediaScannerConnection.scanFile(context, arrayOf(file.toString()), null) { path, uri ->
    // スキャン完了時に呼び出される
    Log.d("MediaScanner", "Scanned $path:")
    Log.d("MediaScanner", "-> uri=$uri")
}
```

このコードは、指定したファイルをスキャンし、標準の写真フォルダ（ギャラリーアプリ）に画像が表示されるようにします。

### 3. パーミッションのリクエスト
外部ストレージに書き込むためには、以下のパーミッションを`AndroidManifest.xml`に追加する必要があります。

```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```

さらに、Android 6.0以降では実行時にパーミッションをリクエストする必要があるため、以下のコードを追加します。

```kotlin
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
    != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_WRITE_STORAGE)
}
```

`REQUEST_WRITE_STORAGE`は任意のリクエストコードです。

これで、画像を端末の標準写真フォルダ（ギャラリーアプリ）に登録することができます。

### 補足. Intent.ACTION_MEDIA_SCANNER_SCAN_FILE
```
val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
val file = File(picturesDirectory, filename)
val contentUri: Uri = Uri.fromFile(file)
mediaScanIntent.data = contentUri
sendBroadcast(mediaScanIntent)
```
【riverpod】 .familyをinvalidateする時

```dart
final messageProvider = Provider.family<Message, String>((ref, messageId) {
  final message = ref
      .read(messageRepositoryProvider)
      .fetchByMessageId(messageId: messageId);

  return message;
});
```

.familyとするとProviderで引数を使用することができ、memoIdごとのProviderが作成されます。
一度初期化メソッドが呼び出されると取得した値がキャッシュされ、それ以降の呼び出しではキャッシュされた値が提供されますが、再度値を取得し直したいタイミングがあるかと思います。

```dart

ref.invalidate(messageProvider);

```

.invalidateするとproviderを初期化することができますが、すべてのmessageProviderが初期化されてしまいます。
特定のmessageIdを持つProviderのみ初期化したいときは

```dart
ref.invalidate(memoId);
```
としてあげると、他のProviderを初期化することなく特定のProviderのみ初期化することができます。
SIGNATE Cup 2024 夏 60th solution

# 自己紹介
データサイエンスを学んでいる、大学4年生です。
最近は、SIGNATEのコンペに参加しながら、東京大学の松尾・岩澤研究室主催のサマースクールを3つ受講し、マナビDXにも参加しています。

Xはこちら→@uki_datascience
# 概要
先日、SIGNATE Cup 2024 夏で60位となり、銅メダルを獲得しました。今回は、備忘録も兼ねて、解法をアウトプットしたいと思います。
# コンペについて
今回のコンペでは、旅行会社が保有する顧客データ（属性や志向、営業担当との接触履歴等）を元に、旅行パッケージの成約率を予測するものでした。
# 解法
### 前処理・特徴量エンジニアリング
ここでは、各変数ごとに施した前処理を記述します。
- Age
    - 'nan'を欠損値として扱う
    - 全角の数字を半角に変換
    - 漢数字を数字に変換
    - 〇代は〇5に変換（例.10代→15）
    - 「14-25」「26-30」「31-40」「41-50」「51-65」に分けた"Agebin"という特徴量を追加
- TypeofContact
    - ラベルエンコーディングを採用
- CityTier
    - そのまま使用
- DurationOfPitch
    - 欠損値が多く、使わない方が精度も高かったため、不使用
- Occupation
    - ラベルエンコーディングを採用
- Gender
    - 表記揺れを修正
    - ラベルエンコーディングを採用
- NumberOfPersonVisiting
    - そのまま使用
- NumberOfFollowups
    - 外れ値（100, 200, 300, 400, 500, 600）を欠損値として扱う
- ProductPitched
    - 表記揺れを修正
    - ラベルエンコーディングを採用
- PreferredPropertyStar
    - そのまま使用
- NumberOfTrips
    - 回数を年換算（例.「年に1回→1」「半年に1回→2」）
- Passport
    - そのまま使用
- PitchSatisfactionScore
    - そのまま使用
- Designation
    - 表記揺れを修正
    - ラベルエンコーディングを採用
- MonthlyIncome
    - 文字列を含んでいるため、すべて数値に変換
- customer_info
    - 「婚姻状況」「車の有無」「子どもの人数」をそれぞれmarried, car, childという特徴量として追加
    - married
        - 「未婚：0」「独身：1」「結婚済み：2」「離婚済み：3」としてラベルエンコーディングを採用
    - car
        - 表記揺れを問わず、所持を1、未所持を0としてラベルエンコーディングを採用
    - child
        - 文字列を含んでいるため、すべて数値に変換
        - 欠損値は0で補完
### モデリング
- カテゴリカル変数（TypeofContact, CityTier, Occupation, ProductPitched, Designation, Agebin, Passport）をcategory型に変換
※marriedは、変換しない方が精度が高かったため、そのまま使用
- KFold：10
- LightGBMの分析結果をキャリブレーション

※ハイパーパラメータは手作業でチューニング
# うまくいったこと
### キャリブレーション
Discordで紹介されているのを見て、今回初めて使いましたが、ある程度効果があったと思います。「LightGBMではあまり効果がない」という記事も拝見しましたが、今回は一定の効果があったかなと思います。
### KFold
これまではtrain_test_splitだけを使っていて、何気にこちらも初めて使いました。どう考えても使わない理由はないなと思うぐらい効果がありました。
### Agebin
年齢の区分を表したAgebinという特徴量を追加しましたが、設定する区分によって大きく精度が変わったので、ここの閾値をうまく設定できれば使うべきだったと思いますが、うまく設定できなければこの特徴量は使わない方が賢明だったかと思います。
### 未婚と独身の区別
Discord上でも議論がありましたが、「未婚」と「独身」の違いについて少し言及しようと思います。僕の解釈は、こんな感じです。
- 未婚：現在独身で、結婚歴がない人
- 独身：現在独身の人（結婚歴は問わない）
- 離婚済み：現在独身で、結婚歴がある人
「独身」を「未婚」と同じ扱いにしてみたり、「離婚済み」と同じ扱いにしてみたりしましたが、最終的にはすべて別という扱いにした方が精度が良かったです。
### 車の有無
婚姻状況の特徴量でいろいろあったので、車の有無でも同じようなことがあるのではないかと思いました。
実際、「車未所持」「車あり」「自動車未所有」「車所持」「自家用車あり」「車保有」など、さまざまなパターンの表記揺れがありました。
婚姻状況と同じように「すべて別」として扱ったところ、精度が下がったので、最終的には、意味的に所有している場合は１、所有していない場合は０としました。
※もっと細かく分類すれば、もう少し良い落としどころがあったかもしれません。
# 感想
今回のSIGNATE Cupでは、LBで金圏だった人が誰一人としてPBで金圏に入れないという、非常にシェイクの大きいコンペになりました。

そんな中、LB：69位、PB：60位と大きなシェイクの影響を受けずに終えることができました。以前の「第2回金融データ活用チャレンジ」では、100位以上シェイクダウンしてメダルを逃したので、少しは成長できたかなと思います。

大変なコンペだったと思いますが、参加されていた1000人以上のみなさん、改めてお疲れさまでした。そして、上位入賞されたみなさん、おめでとうございます！

偉そうに解法共有はしてきましたが、今回は、60位で銅メダルという結果に終わってしまったので、上位の方の解法からしっかり学ばせていただこうと思います！
Postman OAuth2.0のCallback URL

PostmanでのOAuth2.0設定で利用するCallback URLについて。PostmanではAPIリクエスト設定で認可タイプを選択・設定することでさまざまな認可設定を簡単にできるようになっているが、その中でも比較的複雑な認可設定にOAuth2.0がある。

https://learning.postman.com/docs/sending-requests/authorization/oauth-20/

このOAuth2.0用にPostmanでは、次のようなデスクトップアプリ、ブラウザアプリ、VS Code拡張機能アプリなど利用オプションごとの専用Callbackエンドポイントを用意している。Grantタイプが認可コード(Authorization Code)だったりすると、ユーザーインタラクションが発生するが、その後のリダクレクトのために認可サーバー側でCallback URLの許可設定が必要になる。利用オプションに応じて、これらのURLを認可サーバーのCallback URL一覧に加えてください:pray: 

| Postman 利用オプション | Callback URL |
| --- | --- |
| デスクトップ | https://oauth.pstmn.io/v1/callback |
| ブラウザ | https://oauth.pstmn.io/v1/browser-callback |
| VS Code拡張機能 | https://oauth.pstmn.io/v1/vscode-callback |

関連issue: [postmanlabs/postman-app-support#9390](https://github.com/postmanlabs/postman-app-support/issues/9390)
Matching Rules　一致ルール

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

+ [【ヘルプ】Matching Rules](https://help.salesforce.com/s/articleView?id=sf.matching_rule_map_of_reference.htm&type=5)

+ [一致ルールの条件に参照関係を含めている場合、取引先名で判断されるのでしょうか？取引先IDで判断する方法があればご教示いただきたいです。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifhYi)

:::note
以下の回避策が使えるかもしれません。買取受付のオブジェクトに親の個人取引先のIDをセットします。この回答ではフローで値をセットしています。（数式項目では一致ルールとして選択できないからかな）

I got around this by making a custom field and populating the recordtypeid with a triggered-flow (quick update flow), which is same/similar to a before apex trigger.

https://ideas.salesforce.com/s/idea/a0B8W00000GdfX1UAJ/include-record-type-as-a-field-option-for-matching-rules
:::
JavaScript Developer I Certification Maintenance (Summer '24)


+ [JavaScript Developer I Certification Maintenance (Summer '24)](https://trailhead.salesforce.com/content/learn/modules/javascript-developer-i-certification-maintenance-summer-24)

# バグ？　2024/11/26

+ [error in JavaScript Developer I Certification Maintenance (Summer '24)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erH1vSAE)
+ [Has the bug problem with Hands-on Lightning-Record-Picker been solved yet?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000napi)

:::note
これはバグです。Salesforce にケースを提出し、修正プログラムが行われました。問題は解決し、boatPicker コードを正常に検証できました。新しいプレイグラウンドを作成して、演習をやり直すことをお勧めします。それでも問題が解決しない場合は、Salesforce にケースを提出してください。
:::



+ [Get Hands-on with Lightning-Record-Picker](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J9KGp)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/71da0a00-7484-c3dd-eb8d-9a6cb13a1bae.png)

+ [lightning-record-picker Not show on the home page.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000mS5c)

:::note
I solved this issue by changing the home page layout assignment from DE to Home Page on Profiles

この問題は、ホームページレイアウトの割り当てをDEからプロフィールのホームページに変更することで解決しました。
:::





# Get Hands-on with Lightning-Record-Picker

+ [In the boatPicker controller, we can't find the proper configuration of which additional fields to search](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifk3o)

:::note
Please check this article. 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erH1vSAE

The issue was just replace code snippet at the top of the controller.
問題は、コントローラーの上部にあるコード スニペットを置き換えることだけでした。
:::

+ [コード有:error in JavaScript Developer I Certification Maintenance (Summer '24)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erH1vSAE)


# In the boatPicker controller, we can’t find the proper configuration of which additional fields to display.

+ [【未解決】In the boatPicker controller, we can’t find the proper configuration of which additional fields to display.'](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifizlSAA)
+ [Challenge not yet complete in PD 1 Maintenance 2024 Dec](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000Ow8f0AC)


# We can’t find the expected data in the org. Please complete the prework.

+ [JavaScript Developer I Certification Maintenance (Summer '24) - Error on challenge validation](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifnub)

:::note
よく分からんけど、プレイグランドを使えばいいらしい
:::
権限セットのユーザの割り当て時のエラー



# Failure : Alice Diop can't be assigned the B2B Buyer Permission Set One Seat permission set license, because Alice Diop's user license doesn't support it.

+ [help: Add assignement](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erILS)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/36a9d527-d1fb-3018-6be7-41ca2eafeed4.png)

:::note
I don't think you can assign B2B Buyer Permission Set  to these users.

Buyer users require a Customer Community license or a license with a higher level of privileges. Buyer managers and account switchers require a Customer Community Plus license or a license with a higher level of privileges.

Permission Sets for Buyers, Buyer Managers, and Account Switchers for B2B Stores
https://help.salesforce.com/s/articleView?id=sf.commerce_buyer_and_buyer_mgr_perm_sets.htm&type=5
:::

+ [Hi, how to resolve this message please: Failure : Alice Diop can't be assigned the B2B Buyer Permission Set One Seat permission set license, because Alice Diop's user license doesn't support it.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erILNSA2)


# Control what Your Users have Access ライセンスの違いでアサインできない

[User Managementでも発生](https://qiita.com/Keiji_otsubo/items/7853ac6806d7fa841c64)

+ [How do I resolve this?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahw76SAA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f81911ce-18d3-2cc6-9720-05043efdb4db.png)


:::note
I've been able to assign the permission set group to Anna now. I deleted the permission set and created a new one and then the assignment was successful.


これで、権限セット グループを Anna に割り当てることができました。権限セットを削除して新しい権限セットを作成したところ、割り当ては成功しました。
:::

+ [【未解決】Keep on getting "We can’t find the ‘Sales User Muted’ muting permission set related to the ‘Sales User’ permission set group."](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clqc2)
(QA) Db2 for i テーブルにWindowsからファイル転送すると㈱、㈲、①②、が化けてしまいます。

## Windowsからファイル転送すると㈱、㈲、①などが文字化けしてしまいます。

ファイル転送の方法はFTP, ACS/PCOMMのデータ転送機能、CSVでIBM i のIFSにアップしCPYTOIMPFコマンドでインポートなど様々ありますが基本どの方法でも同様に文字化けするようです。

## 文字化けする理由：㈱、㈲、①が外字扱いになっているから

受け入れ側のDb2 for i の文字コード（CCSID）が5035でした。CCSID 5035では㈱、㈲、①などのいわゆるNEC選定文字などが標準文字セットで定義されておらず外字扱いになってしまうため、文字化けしていました。

CCSID 5026のDb2 for i テーブルでも同様に文字化けします。CCSID 5035/5026は定義されている文字セットは共通です。一部の文字（半角英小文字、半角カタカナのヘキサ表示の文字コードが異なります）

## 解決策：CCSID 1399のテーブルを作成し、ファイル転送する

CCSID 1399はCCSID 5035の上位互換？で、5035の文字セットに㈱、㈲、①等の文字を標準文字セットとして追加したものです。
1399であれば、外字扱いではなくなるので上記の文字も文字化けしなくなります。
【無料枠で使いたい】AWSアカウント作成後にしておきたい設定

## はじめに
私事で恐縮ですが、先日(9/2)誕生日でした。
自分に何かプレゼントを。と思い、**個人用のAWSアカウントを作成しました。**（？）

![AdobeStock_327117350.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/deedb28d-9ff2-d6e0-47c1-ccc49ce3c6bc.jpeg)

仕事でAWSを触ることはありますが、個人のアカウントを持つのは初めてです。
突然、高額請求が来ると困るので、アラートを設定しておきたいです。

ネットで調べると、多くのサイトで見かけたのが、「まずはマネジメントコンソールからマイ請求ダッシュボードを開く」というものですが、**マイ請求ダッシュボードが見つかりません。**
GUIが変わったのかもしれませんね。
本記事では、今のGUIでアラートを設定してみます。

## 無料利用枠のアラート設定方法

・AWSマネジメントコンソールにアクセスし、画面右上のアカウント名をクリック→「アカウント」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/9c4ab1a4-42c5-acc4-be8f-784d8ef2c784.png)

・画面左側の「請求設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/da67c9a6-8eea-1e50-25e3-cb4e754b24ed.png)

・アラート設定の「編集」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/586bea93-b29a-207f-8074-8c1366a95d61.png)

・「AWS無料利用枠アラートを受信する」にチェックを入れ（①）、アラートを受信するメールアドレスを入力します。（②）
・「CloudWatch請求アラートを受信する」にチェックを入れ（③）、「更新」をクリックします。（④）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/0ae7d634-8d38-cbc8-caf1-6e309c91a731.png)

・こんなメッセージが表示されたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/75e32272-8a61-3876-6404-8a4bc99814ab.png)

この設定により、無料利用枠を超えそうになったらアラートが飛んでくるようになります。


## 無料利用枠以外（料金発生時）のアラート設定方法
次は、無料利用枠を超えてしまったときのための設定です。

・AWSマネジメントコンソールにアクセスし、「Budgets」のページに飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/42bd9404-eba1-3517-de5f-a0796487ebb9.png)

・「予算を作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/77373a2c-4358-8279-d1b5-ec42af2c5c18.png)

・予算のタイプを選択します。今回は利用料が1ドルを超えたり、超えそうな時にアラートが来るようにしてみます。
「テンプレートを使用（シンプル）」と、「月次コスト予算」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/87ea2aea-d652-e377-b768-833c80e8fdd5.png)

・予算名には、予算設定に付ける名前を入力します。
・予算額には、予算を入力します。
・Eメールの受信者には、アラートを受け取るメールアドレスを入力します。
・「予算を作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/c0658953-d74a-c475-4abe-4246f2f22234.png)

・予算が作成されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/5728c243-1d32-e29e-d26c-06f0cac5ce98.png)

<br>
<br>

アラートメールの見落としに注意しながらAWSを楽しみましょう！
PCの日付を利用して最新7日間を抽出する(SPSS Modeler データ加工逆引き1-20)

# PCの日付を利用して最新7日間を抽出する

![スクリーンショット 2024-08-30 11.09.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/357699fb-0a4c-f1ed-c501-f8ec612cc88f.png)

## 1.想定される利用目的

・定形レポートのための抽出
・SPSS　CADSを利用したストリームの自動化

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/latest7days_PC.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-08-30 11.11.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1551dd71-74f3-3298-f1d7-6010bb3cb4ef.png)

a.入力するデータは以下の通りです。日付と部問名（Cate）にランダムな実績値(Value)を割り当てています。

![スクリーンショット 2024-08-30 11.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/613871f0-0adc-a5e8-42bf-6d2cab2e8191.png)

#### PCの日付を関数として利用する

b.[フィールド作成]ノードを編集します。
![スクリーンショット 2024-08-30 11.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/95b51ed0-db2e-abb0-a8aa-6be4412cdfc1.png)

式ビルダを起動して、関数リストにアットマーク関数を選びます。
![スクリーンショット 2024-08-30 11.34.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ddf81097-4541-87e9-c76f-defcde76fcaa.png)


[テーブル]を実行します。　この例では2024年8月30日ですが、処理した日で抽出されます。Valueもランダムなので毎回変わります。

![スクリーンショット 2024-08-30 11.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d8e792a4-1f0f-4c4c-3ac2-c5c7ab9ec3b6.png)

#### 6日前を起点にして本日までの7日間を抽出する

c.[フィールド作成]ノードを編集します。Modeler18.5以降に搭載された関数[date_add_days]を利用します。本来N日後に使う関数ですがマイナスを利用しN日前を表現できます。

![スクリーンショット 2024-08-30 11.14.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f87b7581-5c05-f244-c583-5ac70366c585.png)

[date_add_days]は以下の記事で詳しく取り上げています。

https://qiita.com/416nishimaki/items/b5c30d27573625c4f89f


[テーブル]を実行します。　結果は処理した日に応じて変化します。Valueもランダムなので毎回変わります。

![スクリーンショット 2024-08-30 11.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/00758c8f-92fa-b08f-5225-99ea29787f3f.png)


#### 注意事項

Ver18.4以前には関数[date_add_days]がありませんので　c　のように基準時間を利用した記述にします。

![スクリーンショット 2024-08-30 11.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d3f010b5-b379-ce90-0d26-c7ce381f7e43.png)

## 4.参考情報

#### タイムスタンプの差の計算

https://qiita.com/kawada2017/items/8e1291801aacf5427e7d

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
解熱消六鎮閣剤→理解不能なOCRのテキスト誤認識を赤ペン先生GPT-4oが直します！

## お薬手帳持って行ってますか？
皆さん病院に行くとき、必ずお薬手帳を持って行ってますか？
私は最近病院に行ったとき完全に頭から抜けていました...


:::note info
__お薬手帳を持っていったときのメリット__
1. 飲み合わせや重複などを確認できる
2. 転居や災害時でも処方してもらえる
3. 管理指導料が安くなる場合がある
:::

お薬手帳には、上記のようなメリットがありますが、正直病院へ行く際に忘れてしまう人は多いのではないかと思います。

今回は、お薬手帳を持たなくても済むように、お薬手帳に貼る薬の情報が書かれたシールの画像から、薬の情報をデータ化してみました。

### 元の画像
スマホで撮った画像です。
![IMG_3190.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682615/7b48af78-14b7-6751-9e99-865daa3644a1.jpeg)

### 最終的な出力
JSON形式で、「薬の種類」、「効能」、「一日何錠」、「一回何錠」を出力しました。
必要な情報をかなり精度良く抽出できているのではないかと思います。
```json
[
    {
        "薬": "ロキソプロフェンナトリウム錠60mg「CH」",
        "効能": "解熱鎮痛剤",
        "一日何錠": 3,
        "一回何錠": 1
    },
    {
        "薬": "トランサミン錠250mg",
        "効能": [
            "抗アレルギー剤",
            "止血剤",
            "消炎剤"
        ],
        "一日何錠": 3,
        "一回何錠": 1
    }
]
```

## 実装
### ライブラリの読み込み
```python
import pyocr
from google.colab import files
from PIL import Image, ImageEnhance
import pytesseract
import openai
```

### pyocrツールの確認
選択されたOCRツールの名前を表示し、Tesseract (sh)と表示されればOKです。
```python
# pyocrが使えることを確認する
tools = pyocr.get_available_tools()
# tesseractのみダウンロードしたため0番目を指定
tool = tools[0]
print(tool.get_name())
```

### ファイルのアップロードと画像の読み込み
ユーザーが画像ファイルを選択し、Google Colab上でローカルファイルをアップロードします。
```python
# ローカルファイルをアップロードする
uploaded = files.upload()

# アップロードされたファイル名を取得
img1_path = list(uploaded.keys())[0]

# 画像を開く
img = Image.open(img1_path)
```

### 画像から文字を抽出（OCR）
pytesseractを使用して、指定した画像（img）から文字列を抽出します。
ここでは日本語の文字認識を指定しています。
```python
# OCRを使用して画像から文字を抽出
text = pytesseract.image_to_string(img, lang="jpn")

# 結果を表示
print(text)
```
ここでの出力結果が以下になります。
__「解熱消六鎮閣剤」__ → 全く意味がわかりません。
OCRだけだと、所々変な日本語になっている箇所があります。
```python
# output
[11ロキリプ ロフェッナトリウム錠60mg「CH」 1日 3錠1回1錠)
効能) 解熱消六鎮閣剤
一般: ロキソブロフェンNa錠60mg

[2]トランサミン錠2250    1日 3錠(1回1錠)
効能) 抗アレルキー剤
効能) 止血剤
効能) 消炎剤
※一般 トラネキサム酸錠 250mg         、
1日3回 毎食後服用  い    xx 邊眉人
```

### OpenAI APIを用いたテキスト処理
OCRでの出力結果をプロンプトに入れて、変だった個所を修正し、JSON形式で薬の種類ごとに情報をまとめてみました。
```python
# OpenAI APIキーを設定
openai.api_key = "YOUR OPENAI API"  # APIキーをここに入力してください

# プロンプトを定義
prompt = f"""
以下のテキストはOCRで画像から抽出した文字列である。
正しくないと思う個所は修正し、薬の種類ごとに、効能、一日何錠、一回何錠、をjson形式でjsonの情報のみ答えなさい。

テキスト：{text}
"""

# APIリクエストを送信
response = openai.ChatCompletion.create(
    model="gpt-4o",  # GPT-4モデルを指定
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt}
    ],
)

# 結果を出力
print(response['choices'][0]['message']['content'].strip())
```
出力結果としては、以下のようになりました。
抜き出したい情報を間違いなく抽出することができました。
```json
[
    {
        "薬": "ロキソプロフェンナトリウム錠60mg「CH」",
        "効能": "解熱鎮痛剤",
        "一日何錠": 3,
        "一回何錠": 1
    },
    {
        "薬": "トランサミン錠250mg",
        "効能": [
            "抗アレルギー剤",
            "止血剤",
            "消炎剤"
        ],
        "一日何錠": 3,
        "一回何錠": 1
    }
]
```
## まとめ
今回はお薬手帳をデータ化したいということで、OCRを試してみました。
OCRの課題である文字の誤認識をGPT-4oで改善することができたのではないかと思います。

お薬手帳をデータ化しましたが、実際に薬の情報を管理するようなアプリはあるので、試してみようと思いました。
Dockerグループにユーザを追加

環境　Fedora
linuxサーバ上でdockerをbuildしようとすると、下記のようなエラーに遭遇

```
ERROR: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied
```

自分のユーザーがdockerデーモンにアクセスする権限を持っていない。

以下は調べてみた感じの解決策。
### １: dockerコマンドをsudo付きで実行
いちいちsudo dockerとやる方法。面倒臭い

### 2 : dockerグループにユーザを追加

以下のコマンドでユーザ追加
```
sudo usermod -a -G docker $USER
```

再起動
```
sudo reboot
```

これがスタンダートなやり方らしい。
noice.nvim プラグインのカーソル点滅バグ対応に、プラグインバージョン指定で対処する

# はじめに

LazyVim をアップデートすると、突然コマンドライン入力時にコマンドライン入力部分とエディタ部分のカーソルが高速に点滅する事象が起きた。
これやこういったプラグインの事象に対する一時対応の方法のメモ。

画像の様な点滅が発生するようになっているのが現状。

![output-palette.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/a6829cdb-8b47-fdae-2d27-780646802dbd.gif)

# 環境

* Windows 11 Pro 
* Windows 10 Pro
* NeoVim v0.10.0
* LazyVim 12.x
* noice.vim v4.5.0

# 問題

実際に次の Issue にも上がっているが、別の Issue 対応によるアップデートで、最新版で同様のエラーが起こる報告がなされている。

https://github.com/folke/noice.nvim/issues/931

# 解決方法

Issue コメントにも書かれているとおり、`4.4.7` では問題ないらしいとのこと。
つまり、プラグインバージョンを明確に指定してあげればいい。

これには、あえてプラグインファイルを作成して、指定したプラグインバージョンでアップデート・インストールされるように指定する。

```lua:$LOCALAPPDATA\nvim\lua\plugins\temp.lua
return {
  -- Handling the cursor flickering bug
  -- https://github.com/folke/noice.nvim/issues/931
  { "folke/noice.nvim", version = "4.4.7"}
}
```

この後、nvim を立ち上げなおすか、Lazy コンソールを開いて Update をかける。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/b2cd98c1-d542-35c5-1c0f-9dfe44e33b02.png)

すると、画像の様に先の事象は起こらない。
（あまりにも静止画っぽくなるので、ちょっと操作してみている。）

![output-palette.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/0d692cb6-0ca7-88cd-eed1-1b2f2c45213b.gif)

# まとめ

とりあえずバグに当たって、原因を調べてどうしようもなさそうであれば、バグが起きてなかったバージョンにダウングレードする！
Raspberry piのSDカードバックアップメモ

## 背景
自宅のラズパイにTVサーバを導入している。結構ほしいTV番組をTailscale経由で外出時でも不意に後で見たい番組を録画しておけるので便利なのだ。
ふとある時気づいたのだが、そういえばこのTVシステムのSDカードのバックアップとっていないなぁということで、急遽バックアップを取った時のメモです。

## 結論
### 条件
以下の条件でバックアップ・リストアを実施
- バックアップ時のSDカードはリストア時のSDカードより容量が大きい（128GBだが、メーカ違いでサイズ合わず）
そのため、イメージの縮小化が必要。

### 得られた知識
1. ddやWin32DiskImagerでバックアップを取るのはいいが、リストア先のSDカードのサイズはバックアップ元より大きい方が良い（メーカ・型番違いでサイズが微妙に異なるのでそのままリストアできないため）
1. PiShrinkでバックアップイメージを縮小するも、ファイルシステムのセクタサイズもそのままバックアップされているため、raspi-configでサイズ拡張できない
未検証だが、Win32DiskImagerでバックアップリストアしたからかもしれない。ddならそのあたりはうまいことやってくれるのだろうか？
1. リストアしたSDカードの縮小した部分をSDカード容量一杯まで拡張するために、Windows OS + minitool partition wizardで拡張を試みるも、縮小化した部分がext4フォーマットなのでできず。そのためLinux + GPartedを利用し、無事拡張できることを確認した。


## メモ (今後実施するかもしれないので)
### バックアップ
Windows + Win32 Disk Imagerを利用しバックアップした。
注意点はSDカードサイズ分だけ容量を消費するので、空き領域を事前に確認しておくこと

### イメージの縮小化
WSL + PyShrinkを利用し、縮小化を実施した。

コマンドプロンプトを開いて以下を実行することでWSLをインストールする。
```powershell
wsl --install
```

WSLを開いて以下を実行することでPiShrinkをインストールする。
```shell 
wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
chmod +x pishrink.sh
```

以下を実行することでバックアップイメージを縮小化する。
（念のため、元のバックアップイメージを取っておいた方が良い）
```bash
# Eドライブに移動する
cd /mnt/e/raspi_back
# 縮小化する
sudo pishrink.sh backup_image.img
```

結果26GBまで縮小化できた。
なんでこんなに容量使っているのかな…Dockerのせいかな…

### リストア
Windows + Win32 Disk Imagerを利用しリストアした。

### 縮小部分の拡張化
Linux(ubuntu) + GPartedを利用し/root領域(/dev/mmcblk0p7)を拡張した。
（GUIで操作するだけ）

## 動作確認
リストアしたSDカードをラズパイに挿入して動作確認。
連携しているシステムがそのままそっくり動いたら問題なし！
M5Stamp S3でボタン入力して遊ぶ


M5Stamp S3でボタン入力して遊ぶ


目的
GPIOのテスト
(いきなり、ドラクエ1でいうところのレベル1)



結果


![o_coq364.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f977fb13-97e3-e4d0-3a83-f019cd203f9e.jpeg)

![o_coq365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b0905234-5c04-6b1d-59c8-09dd4a829754.jpeg)


プログラム


```c++


//WS2812_button_S3_1


//初期化
void setup() {

  //GPIOの初期化
  pinMode(21, OUTPUT); //WS2812
  pinMode(15, INPUT); //button

}//setup


//メインループ
void loop() {

  //ボタンの信号の読み込み
  int a = digitalRead(15);


  //ボタンが押されたら点灯、ボタンが離れたら消灯
  if ( a != 0 ) {

    //白を点灯
    neopixelWrite(21, 64, 64, 64);

  } else {

    //消灯
    neopixelWrite(21, 0, 0, 0);

  }//endif


  delay(300);//0.3秒待つ

}//loop


```
続 platformioでmsp430

MacOSX El Capitanのpythonを3にして、PlatformIO Coreを6にして、試してみました。

pythonはネットで調べるとほとんどパッケージマネージャーを使ってインストールしていますが、必要ないので素のpythonのインストーラでインストールしました。

MSP430F5529を使ったLaunchPadはrun --target uploadで問題なくファームが焼けました。

G2553を使った自作の基板はplatformio.iniのboardはlpmsp430g2553にしてありますが、LaunchPadの書き込み回路ではなくて、FTDIのモジュールで書き込むのでplatformio.iniに以下を追加しました。

```
upload_port = /dev/cu.usb*
upload_command = mspdebug rom-bsl -d $UPLOAD_PORT "prog .pio/build/lpmsp430g2553/firmware.elf"
```

platformioのmsp430はframeworkなしでもビルドできます。

手持ちのターゲット

|チップ|PIO|
|:--|:--|
|G2542|○|
|G2553|○|
|F169|×|
|F2274|×|
|F5507|△|
|F5529|○|
【React】100本ノック #03 TODO

## はじめに
フロントエンドスキル向上のため書籍やudemyでインプットを行っていますが、アウトプットも並行して進めるべく[@Sicut_study](https://qiita.com/Sicut_study "Sicut_study")さんのReact100本ノックを始めることにしました。

https://qiita.com/Sicut_study/items/5dec3c42c8f3c90f0487

## ルール
- 主要なライブラリやフレームワークはReactである必要がありますが、その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）を組み合わせて使用することは自由
- TypeScriptを利用する
## 今回作るもの
簡単なTODOリストアプリ

## 条件
1\. 入力フィールド: ユーザーがタスクを入力するためのテキストフィールドが存在する。タスク名が1文字以上でない場合はバリデーションする。
2\. 追加ボタン: 入力されたタスクをTODOリストに追加するためのボタン。
3\. タスクリスト表示: 追加されたタスクがリストとして表示される。
4\. 削除ボタン: 各タスクの隣には削除ボタンがあり、それをクリックすることで該当のタスクをリストから削除する。

## 成果物
https://endearing-sunshine-568b18.netlify.app/

https://github.com/okido-yukinari/03_todolist.git

### 使用技術

- React
- TypeScript
- MUI

### PC
![03_todo_pc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453680/930d0158-fbff-e1cd-89c2-285763f8a1b8.png)

### SP
![03_todo_sp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453680/5b2ab021-127b-7550-944c-235aea87d8a8.png)

## 感想
状態管理の基礎を学ぶことができた。
今後の展望として、①タスクごとに期限を設ける、②タスクの絞り込み機能など、やれることが結構ありそうなので、時間がある時にアップデートしていきたい。
git stash applyした後の諸々変更した後に，もう一度stashの時点から戻りたいとき

`git stash apply stash@{0}`を実行した後に諸々変更を加えていたが，もう一度stashの時点からやり直したい時があったのでその時の作業コマンドをメモする．

### 適当なブランチを切る
git stash applyした後の作業内容を一旦temp_branchに退避させる．
```
git checkout -b temp_branch
```
その後にコミットする
```
git add .
git commit -m "temp commit"
```

### 戻る
```
git checkout develop
```

### 新しい作業ブランチでstashを適用
```
git stash branch temp_stash_branch
```

### 退避させたブランチを削除
```
git branch -D temp_branch
```