OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】モンティホール問題

全プログラマーの10%は書いたであろうモンティホール問題のシミュレータ

```js:モンティホール問題.js
// 0以上最大未満の整数をランダムで返す
function ランダム(最大) {
    return Math.floor(Math.random() * 最大);
}

// 当たりがひとつだけ存在する3つのドアを返す
function ドア一覧生成() {
    const 当たり = ランダム(3);
    let i = 0;
    return [
        { 当たりか: i++ === 当たり },
        { 当たりか: i++ === 当たり },
        { 当たりか: i++ === 当たり },
    ];
}

function 交換候補のドアを探す(ドア一覧, 選択ドア) {
    if (選択ドア.当たりか) {
        // 外れのドアのどちらかを返す
        return ドア一覧.filter(ドア => !ドア.当たりか)[ランダム(2)];
    }
    else {
        // 当たりのドアを返す
        return ドア一覧.filter(ドア => ドア.当たりか)[0];
    }
}

const 試行回数 = 10000;
let 交換しなかったときの当たり回数 = 0;
let 交換したときの当たり回数 = 0;

for (let i = 0; i < 試行回数; i++) {
    const ドア一覧 = ドア一覧生成();
    const 最初に選択したドア = ドア一覧[ランダム(3)];
    
    // プログラム上、変数「交換候補のドア」を定義する意味は全くないが、
    // モンティホール問題のストーリーが分かるようにするためだけに定義する。
    const 交換候補のドア = 交換候補のドアを探す(ドア一覧, 最初に選択したドア);
    
    if (最初に選択したドア.当たりか) {
        交換しなかったときの当たり回数 += 1;
    }
    else if (交換候補のドア.当たりか) {
        交換したときの当たり回数 += 1;
    }
    else {
        throw new Error("ここが実行されることはありえない。");
    }
}

console.log(`ドアを交換しなかった場合\t${交換しなかったときの当たり回数 / 試行回数}`);
console.log(`ドアを交換した場合\t${交換したときの当たり回数 / 試行回数}`);
```

```text:結果
ドアを交換しなかった場合        0.3335
ドアを交換した場合      0.6665
```

## これも読んでほしいな

https://qiita.com/mogamoga1337/items/7ca169c5263e9401f7b6
2023マナビDXクエスト　第１ターム修了

2023マナビDXクエスト修了しました。
PBL01需要予測・在庫最適化を選択。
初めてのAIモデリングでしたがなんとかGold修了することが出来ました。

【結果】
モデルコンペ：82/712位（RMSE3.816）
プレゼン　　：上位20%圏外（平均2.75点）
総合　　　　：上位20％圏外...orz

反省点は時間の確保とモチベーションを高く保てませんでした。
eラーニングもあまり頑張れなかったし、勉強会等への参加はゼロ、slackでも全く相談できませんでした。

提供データの外れ値を削除したり色々モデルを試した結果、最終的にはk-近傍法になりました。
特徴量を追加できなかった。

この辺りの理解が全然進んでいないです。
事前にアルゴリズムの基礎は多少勉強してのぞみましたが、実際にやってみると全然だめ。
もっと勉強しないとー！！
```
from sklearn.neighbors import KNeighborsRegressor

model = KNeighborsRegressor()
model.fit(X_train, y_train)
```
Windows Update が成功しているように見えてなんかおかしい挙動しているときの対応

# 何を言っているのか？
Windows Update を毎月適用するのですが、適用したあとに再起動した結果なにか挙動がおかしくなっていることが年に１，２回ありました（もともとUpdateが問題あるときもあります）。そんなときの対応です。

## こんなときその１
Windows Update を適応後に再起動すると「コンピュータの電源を入れたままにしてください。」が、１時間以上表示され進まない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/cebf2ddd-ac6c-9f82-02ca-f2cb402be48c.png)

仕方ないので電源OFFってしまいますが、何か壊れている可能性があります。

## こんなときその２
Windows Update を適応後にデフォルトのロック画面になるとき。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/1aade0f6-b02c-252c-f055-fae10b6d5fee.png)

割と怪しい・・※直近これでした

# どんな挙動だったのか？
私が遭遇したのは以下でした
　・PowerShellのリンクが切れている
　・PowerShellが立ち上がってきてもハングアップする
　・Hyper-V マネージャーでホストが表示されない
　・その他、なんか変な挙動
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/061749c8-12ce-ee16-161d-b6c34c4185b3.png)

とくに上記・・・
 
# 対応方法について
対応方法は、以下があります。正直にいうとこのような状態になったら心機一転し初期化してきれいな状態にした方がよいのですが、使用しているアプリを再度インストールするとか、各種設定するのは流石に骨がおれますよね。・・

対応方法
　① OS初期化してクリーンインストール
　② システムを復元
　③ OSの上書きインストール（修復インストール）
　④ レジストリをいじるとかうんぬん

割と簡単なのが ③ の 修復インストール です。こちらがよいかなと。
ただ選択する項目を間違えてしまうとクリーンインストールとなるので、必ずバックアップをしてから実行しましょう（大丈夫と油断していると危ないｗ）。

https://freesoft.tvbok.com/win10/install/overwriting_install.html

https://pc.watch.impress.co.jp/docs/column/win11tec/1408839.html

# 最後に
家のPCは、割とつけっぱなしな私。人知れずWindows Updateが実行され再起動がかかり意外に壊れてるっていうときが、あるのでこの記事を書いてみました。
QuickSightアカウントについて

## はじめに
QuickSightは、アカウント作成するだけでお金がかかります。
BIツールにしては安いと言われていますが、アカウントでどれくらいお金がかかるか明確にしたいと思い整理してみました。

QuickSight 導入検討の材料になれば幸いです。
本記事では、アカウントについての一般的な話（+行レベルセキュリティ）について触れたいと思います。

## QuickSight とは
AWSで使える高速クラウドBIサービスツールのことで、簡単にデータを可視化することができるものです。
所感として、非エンジニアでも慣れれば使えこなせそうと感じました。

### メリット
- 少ないコストから始められる（他の有料BIと比較して）
- セットアップが簡単
- 将来予測や異常検出の仕組みを実現できる
- ユーザーの管理がしやすい
- AWS内のデータ統合が簡単
- メンテナンスが不要

### デメリット
- カスタマイズが少ない（他のBIと比較して）
- リアルタイム反映が難しい

など、安く利用できる分、カスタマイズはまだまだ発展途上という印象です。

## QuickSight を使ってみて
###  アカウントについて

30日間の無料トライヤル期間があります。

| 項目 | Enterprise版 | Standard版 |  
| --- | --- |  --- | 
| 作成者 (年間契約の場合) コスト | 24(18) USD/月 | 12(9) USD/月 |
| SPICE 搭載容量 | 10 GB/ユーザー | 10 GB/ユーザー | 
| SPICE コスト  | 0.38 USD/GB	 | 0.25 USD/GB | 
| エディションの変更	 | × | ○ |
| 閲覧者の追加 | ○ | × |
| 閲覧者 コスト | 0.30 USD/セッション～最大 5 USD/月 | × |
| メールレポート	 | ○ | × |
| 行レベルのセキュリティ | ○ | × |
| プライベート VPC およびオンプレミスのデータへの安全なアクセス	 | ○ | × |

Enterprise版 から Standard版 へ変更はできず
運用面から、**<span style="color:#d70910;">Enterprise版</span>** がおすすめされています。

Enterprise版 は閲覧者を作成できるが、Standard版 には 閲覧者権限の概念がない。

作成者権限のユーザーあたりの料金や SPICE 容量の料金は Standard Edition の方が安くなるが、
閲覧者が多い場合は Enterprise版 の方が安くなることがあります。 

例）
100人分（1人の作成者、99人の閲覧者）のアカウント作成が必要な場合

`Enterprise版 `
24USD × 1人 + (0.30 ~ 5) USD × 99人 = <mark>(53.7 ~ 519) USD/月</mark>

`Standard版`
12USD × 100人 = <mark>1200 USD/月</mark>

Standard版が必ずしも安くなると言えないことが分かります。

###  行レベルセキュリティ
行レベルセキュリティとは
データセットへのアクセスを制限するものです。
ユーザー単位もしくは、グループ単位で制限をかけることができます。

ユーザー（グループ）の所属に伴い、アクセスできるデータとアクセスできないデータがあり、
そのような場合のアクセス制限設定を行うことができます。

例えば、ユーザー単位で制限をかけるときに、
csvファイルを利用して、以下のようにユーザーごとの制限をかけることができます。

| No | 権限（所属） | UserName（ユーザーのメールアドレス） | データセットの権限 |
| --- | --- | --- | --- |
| 1-1 | なし | レコードなし | レコードなし | 
| 1-2 |  なし | hoge@example.com | レコードなし |
| 2 |  A | hoge@example.com | A | 
| 3 |  A B C | hoge@example.com | "A,B,C"  | 
| 4 | フル権限 | hoge@example.com | ""（空文字） | 


```No.1-2 サンプル.csv
UserName, 所属 
hoge@example.com,
```

```No.2 サンプル.csv
UserName, 所属 
hoge@example.com,A
```

```No.3 サンプル.csv
UserName, 所属 
hoge@example.com,"A,B,C"
```

```No.4 サンプル.csv
UserName, 所属 
hoge@example.com,""
```

 ""(空文字) だと権限なしをイメージしがちだが、
 行レベルセキュリティだとフル権限になります。
node.jsとnpmのバージョンを上げて失敗する方法。※2022年8月

:::note warn
うまくいかなかった方法です。
:::
:::note warn
古い情報を元に作業するとこうなるという見本です
:::
:::note warn
※この内容は2022年8月に記録した内容です。
:::

小規模サイトの開発環境として使用しているgulpでエラーが出ることが増えてきた。
node.jsはv.10で、古いのでアップデートしたい。

結果、nodeだけでなくnpmやモジュール類のアップデートも含めた面倒な作業となったので備忘として。

## 手順1　node.jsのアップデート
ノードのバージョンを調べる
```sh
$ node -v
```
homebrewをインストールしているとして、
```sh
$ nodebrew ls-remote
```
バージョンリストが並ぶ。

```sh
$ nodebrew install-binary v12.0.0  // インストールしたいバージョン
$ nodebrew use v12.0.0 // 使用するバージョンを指定
```

## 手順2 npmのバージョンアップ
```sh
$ nodebrew
```
package.jsonの中にある以下のモジュールを最新にする。
```package.json
"dependencies": {
"connect-ssi": "^1.1.1",
"del": "^6.0.0",
"gulp-autoprefixer": "^8.0.0",
"gulp-connect": "^5.7.0",
"gulp-connect-php": "^1.0.3",
"gulp-imagemin": "^7.1.0",
"gulp-notify": "^4.0.0",
"gulp-plumber": "^1.2.1",
"gulp-sass": "^5.1.0",
"gulp-sourcemaps": "^3.0.0",
"gulp-uglify": "^3.0.2",
"imagemin-gifsicle": "^7.0.0",
"imagemin-mozjpeg": "^9.0.0",
"imagemin-pngquant": "^9.0.2",
"sass": "^1.54.5"
},
"devDependencies": {
"browser-sync": "^2.27.10",
"gulp": "^4.0.2",
"gulp-watch": "^5.0.1",
"util.promisify": "^1.1.1"
}
```

## 結果
gulpfile.jsでrequireを使用しているのは古い書き方。これがエラーとなってしまう。
これからはimportで書くことになる。
Vueの基礎勉強 v-on

(Vue.js 3.1.5を使用)

ボタンをクリックしたときにイベント処理したいなどの時。

v-onディレクティブというものがある。
`
v-on:イベント名 = "メソッド名" 
`
という構文を使う。

ボタンをクリックすると、コンソールにクリック!と表示される処理。

```html:html
<div id="app">
    <button v-on:click="onClick">クリック!</button>
</div>
```

v-on:click="onClick" と書いたので、
javascript側の、onClickメソッドが呼ばれる。
```javascript:javascript
const app = Vue.createApp({
    methods:{
        onClick: function() {
            console.log('クリック!')
        }
    }
})
app.mount('#app')
```
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284134/be002347-3748-2a30-96ce-692caedc7450.png)

ボタンを２回クリックしたから、コンソールに、②クリック!と出ている。





##### 追記
v-on:click は、@clickとも書ける。
```html:html
<div id="app">
    <button @click="onClick">クリック!</button>
</div>
```
オープンソースのアプリ開発ツールSkeetのサーバーレスアーキテクチャ図を公開しました

![SkeetArchitecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/d0a97f8d-fb9b-ebcb-c2a4-1aa61c7f8cf8.png)


gm! ELSOUL LABO、Epics DAOのkishi.solです。

つい先日、オープンソースのアプリ開発ツール Skeet のサーバーレスアーキテクチャ図を公開しました。

オープンソースの開発ツール市場に新たな革命をもたらす Skeet は、TypeScript で構築された最先端のサーバーレスアプリ開発フレームワークです。開発者が直面する様々な課題に柔軟に対応し、煩雑なインフラ管理から解放します。

Skeet - 全体アーキテクチャ: 

https://skeet.dev/ja/doc/general/overall-architecture/

■ 製品の概要

Skeet は、必要な機能を自由に選択し、プロジェクトに即座に適用することができる柔軟性を備えています。Firebase Functions で Stripe や Discord API といった WebAPI を利用することで、フロントエンドの開発を省略し、機能開発に集中することも可能です。さらに、BigQuery を用いたデータ分析や、ブロックチェーンウォレットに対応した Web3 アプリの開発まで、モダンなアプリ開発を包括的に支援します。

■ 開発者の利点

Skeet CLI は、開発者がアプリケーション開発に専念できるよう、クラウドアーキテクチャの構築を完全サポートします。生成 AI (LLM)を活用しており、翻訳ファイルの生成、Prisma スキーマのサポート、Firebase Functions のルーティングを含む、多言語対応やドキュメント生成などの強力な機能を提供します。

■ オートスケーリングとコスト管理

オートスケーリング機能により、予測が難しい負荷変動にも自動で対応。複雑なインフラの設計・開発コストとリソースの確保から開放されます。従量課金制で、使用したリソース分のみの課金が可能でプロジェクトを始めやすくなっています。

■ CI/CD とセキュリティ

GitHub Actions のネイティブ対応により、CI/CD 環境のセットアップが容易になります。また、ロードバランサーの設定や Cloud Armor を利用したセキュリティ強化機能も搭載しています。

## Google Cloud、Firebase 上でサーバーレスアプリを爆速開発できるオープンソースの Skeet フレームワーク

![SkeetJA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/f73b46cd-0d97-a3b0-c742-452c5e4b52cf.png)


Skeet は GCP (Google Cloud) と Firebase 上にフルスタックアプリを構築できるオープンソースの TypeScript 製サーバーレスフレームワークです。

Skeet を使えば、API サーバーから Web・iOS・Android アプリまですべてを TypeScript で爆速開発することができます。TypeScript は静的型付けを提供し、エラーを早期に検出し、コードの品質とメンテナンス性を向上させます。さらに、Skeet は GraphQL や Firestore などのモダンな技術を積極的に採用し、開発者に優れた開発体験を提供します。ChatGPT や Vertex AI などの AI を活用したアプリケーション開発や Solana などのブロックチェーンを活用した Web3 dApp 開発も簡単に行うことができる現代的なアプリケーションフレームワークとなっています。

下記リンクからデモをお試しいただけます。PaLM2・Vertex AI、そして Open AI 社の ChatGPT (GPT-3.5, GPT-4)も同時にお試しいただくことができますので、どちらがどのような特徴を持っているか比較検討していただくことができます。

Skeet デモ: 

https://skeeter.dev/ja/

また、こちらのデモのアプリは Skeet CLI を使えば 5 分でご自身の PC 環境やクラウド環境で動かすことが可能です。

まずはどのようなことができるかデモでイメージしていただき、その後は Skeet CLI を使ってすぐにアプリ開発をスタートできます。Skeet CLI にも AI が搭載されており、チャットによるコード生成等の強力なサポートにより、開発者の生産性を大幅に向上させます。

Skeet CLI (GitHub): 

https://github.com/elsoul/skeet-cli

Skeet は世界中すべてのアプリケーション開発現場の開発・メンテナンスコストを削減、開発者体験を向上させるためにオープンソースとして開発されています。

詳しくは公式ドキュメントを御覧ください。

Skeet ドキュメント: 

https://skeet.dev/ja/


ここまでお読みいただきありがとうございました！

記事へのいいねや各種アカウントフォローもとても喜びます。

いつも応援いただきありがとうございます。

Discordでもお待ちしております👇

https://discord.gg/GmHYfyRamx

LFG🚀🔥
暗号通貨の評価額を管理するスプレットシートの作り方

暗号資産の管理をしたいと思ったときに不便を感じて解決した方法を紹介します！

:::note info
売買を頻繁に行う想定ではなくあくまでも「今どれくらい収益 or 損益」が出ているのか？を確認するだけのものです！
:::

## 何を解決したかったのか？
暗号資産を貸し出しをする場合、利益計算を一目で確認できるようにしたかったです！

### 暗号資産の貸し出しとは？
貸し出しというのは、一定期間貸し出すと少し利息を上乗せして変換されるというものです。
貸し出しの期間や利息については取引所によって異なるので詳細は割愛します。

## 発生した問題とは？
含み益の計算が正しく行わらない…という問題が発生しました。

私が利用している取引所の一つLINEBITMAXでは、「平均取得価格」に「持っているコイン」をかけた数字が合計金額として表示されます。

:::note alert
貸し出すために保有していたコインは1コイン100円で購入したのに、変換時のレートが1コイン120円だった場合、120円で買ったことになり平均取得価格になります。
:::

原因は、発生した利息はその時のレートで購入した計算になるためです。

:::note warn
なので実際は増えているのに最悪の場合減っているように表示される場合もあります…
:::

それを解決するためにGoogleのスプレットシートを活用することを考えました。
調べるとGoogleのスプレットシートでできそうだということがわかったので作ってみました。

## スプレットシートの作り方
作り方は簡単で、拡張機能を入れて関数を利用してコインのレートを取得します。
あとは単純な計算式を入力するだけです！

:::note warn
手間なのはインストールしたプラグインはアカウントを作る必要があることぐらいです！
:::

1. Cryptosheetsをスプレットシートにインストールする
1. スプレットシートの「拡張機能」からCryptosheetsを選択して「Launch Sidebar」を選択する
    1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/80f99db8-eb48-c4ae-2376-c99b6892ed02.png)
    1.  Cryptosheetsでユーザー登録をする
1.  関数を利用して、その日のレートを取得する（取得までに時間がかかる場合はしばらく間を開ける。最悪日が変われば取得できると思います）
1.  最後に計算式を組みます

https://docs.cryptosheets.com/introduction/

## レートを取得する
下記の関数をセルに入力してください！

```
=CSPRICE("BTC","JPY",$B$1)
```
関数の引数は、コインの銘柄、表示金額の設定、日付の順番です。
記載のコードの日付は指定のセルを参照するようにしています！

http://help.cryptosheets.com/en/articles/4156694-cs-price-or-csprice-pull-current-historical-price-data-for-any-pair-across-any-exchange-in-cryptosheets-using-custom-functions

指定したセルでは`=TODAY()`を利用してその日の日付を取得しておくと毎日レートが更新されるので便利です！

あとは必要に応じてスプレットシートを改造してください！

:::note info
私は購入枚数、購入金額、貸し出しによって増えたコインの数を手動で入力してあとは計算式を組むことで含み益を表示できるようにしています！
:::

もしかするとレートが取得できないコインもあるかもしれませんが、基本的に世の中で使われているコインの略称で良いはずです。
下記のサイトから確認いただけますので参考にしてください。

https://coinmarketcap.com/ja/

ちなみに私が知っており、レートを取得することができるコインを表にまとめておきます！

|コイン|略称|
|--|--|
|ビットコイン|BTC|
|イーサリアム|ETH|
|ステラルーメン|XLM|
|フィンシア|FNSA|

## まとめ
もっと良い方法がある気もしますが、個人レベルでは十分かと思っています。
本当はLINEBITMAXから自動で取得するなど全て自動化できるといいのですが今は一旦このままで良いと思っています！

:::note info
もっといい方法がある！というのがあればぜひ教えてください！
:::
IBM iのIFS（統合ファイルシステム）のファイルサイズを調べたい

## IBM i のファイルシステムは大別して ライブラリー と IFS
IBM i のファイルシステムは以下の2つに分類されます。2.はさらに細かく分類できますが省略しています。
1. ライブラリーベースのファイルシステム
    WRKLNKコマンドで /QSYS.LIB以下に表示されるファイル・ディレクトリーです。
    IBM i OSのWRKLIBコマンドで表示されるライブラリーと同一で、S/38やAS/400以来存在するRPG,COBOL,Db2 for iの物理ファイル（テーブル）等,各種待ち行列（MSGQ, OUTQ,etc.),ユーザープロフィール、コンパイラー等のシステムオブジェクトが含まれます。
2. (狭義の)IFSファイルシステム
    1.のライブラリー以外のファイル・ディレクトリです。WRKLNKコマンドでルート'/'直下や/QSYS.LIB以外のファイル・ディレクトリーが該当します。
ちなみにIFS（統合ファイルシステム）には２つの意味合いがあります。狭義には2.のライブラリーでないファイル・ディレクトリを指します。

広義には1.と2.を併せたIBM i のファイルシステム全体をIFSと呼ぶこともあります。ここでは主に2.狭義のIFSについて説明します。
## IFSとは？
※IFS=Integrated File System の略で、AS/400 V1時点ではライブラリーベースのファイルシステムとそれ以外のファイルシステム（例：PCサポート共用フォルダー等、現在は狭義のIFS下に統合済み）は別々なファイルシステムとして実装されており、現在のIFSのように '/'ルート配下で統一したアクセス方法がありませんでした。それを '/'配下に統合して1つのファイルシステムとして操作可能としたことからIFSと呼ばれるようになりました。

## IFSオブジェクトのサイズ確認方法（レガシーな）
上記の1.についてはDSPOBJDコマンド等でオブジェクト（ファイル）のサイズを容易に確認、リスト作成等できますが、2.の狭義のIFSについてはこれまではGO DISKTASKSメニューの1番からバッチでファイル・ディレクト情報を収集して、収集完了後に上記メニューの2番で印刷スプールとしてリスト出力する方法が基本でした。
GO DISKTASKSメニュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/29bfe585-df7f-c66e-ea4f-d5d2b6f65772.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/586e91de-757a-58ae-4735-0f1d3450ecdd.png)

## IBM i 7.x以降でのIFSオブジェクトサイズ確認方法（SQLで）
IBM i 7.x ではACSのSQLスクリプトサンプルにIFSのファイルサイズを調べるサンプルが提供されています。こちらをご紹介します。

■ACS SQLサンプルのIFSファイルサイズ出力方法
1. ACSのSQLスクリプトの実行 を開く
2. 編集->例から挿入 を選択する。下記画面で、SYSTOOLS for youを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b6680004-c15d-4338-cb3d-b18fdcb3d5e8.png)

3. Analyze IFS storage consumptionを選択して、挿入ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/d2fec96d-0b1c-7e45-40e3-77b58e8b3dc8.png)

4. SQL実行画面にサンプルがコピーされるので、ウィンドウ上部の すべて実行アイコン をクリック。
数個のSQLが順番に実行されます。このときIFSのファイル情報がIFSINFOライブラリーのIFSINFO2D, IFSINFO2O　に格納されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2a5d76ed-8214-3e49-9436-23e4d1761f64.png)

5.コピーされたSQLサンプルには STOP という行が挿入されており、その行でSQLの実行は停止します。ここまででIFSの情報取得が完了しています。
STOPの下にもうひとつ、SELECT文がコピーされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8dc6587e-c131-e1df-4865-c0ff1c5f8b8b.png)
以下のSELECT文が上記2つのテーブルに格納されたIFSファイル菜情報を検索するサンプルになっています。必要に応じてSQL文を修正できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1a028d8c-4126-4b37-7ce3-e5cf076f7593.png)

6.このSELECT文を実行すると下記のような結果が出力されます♪
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/2c7ccd40-b9c5-da74-adc7-455ba1b16283.png)

SELECT文ですので、対象ファイルのタイプや、ディレクトリ、サイズなど様々に条件指定できますし即時実行できますので、従来のGO DISKTASKSメニューから検索するよりもずっと利便性が高いと思います。

このようにIBM i のここ最近はSQLが色々と便利に拡張されています。
ESPr Developer 32 Type-Cで遊ぶ

「ESPr Developer 32」は、スイッチサイエンス社が出しているESP32の評価基板。
2200円ととても安い。子育て中の私のおこづかいでも買える。

ESP32は組み込み系のブログを見るといたるところで使われているのと遊べそうなので買ってみた。

:::note info
必要部材
・[ESPr Developer 32 Type-C](https://www.switch-science.com/products/6364)
・[ブレッドボード](https://akizukidenshi.com/catalog/g/gP-02314/)
・[ジャンパ](https://akizukidenshi.com/catalog/g/gC-05159/)
・[LED（抵抗なし）](https://akizukidenshi.com/catalog/g/gI-12605/)
・[抵抗(270Ω 赤紫茶金)](https://akizukidenshi.com/catalog/g/gR-25271/)
・[タクトスイッチ](https://akizukidenshi.com/catalog/g/gP-03647/)
・[ブザー](https://akizukidenshi.com/catalog/g/gP-04118/)
・[ピンヘッダセット]https://www.amazon.co.jp/%E3%82%A2%E3%82%A4%E3%82%A6%E3%82%A3%E3%82%B9-IWISS-2-54mm%E3%83%94%E3%83%83%E3%83%81-2550%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF-%E3%83%87%E3%83%A5%E3%83%9D%E3%83%B3%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF/dp/B092ZP3C5D/ref=sr_1_50?keywords=%E3%83%94%E3%83%B3%E3%83%98%E3%83%83%E3%83%80&qid=1699486193&sr=8-50
:::

ブレッドボードって案外高いな…。

ピンヘッダが付いていないものを買ってしまったので、まずはちまちまとはんだ付けする。
![F-SG3EWawAAXVqg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283529/11c9f736-3dc8-b38e-f1d3-a95e912e9a6f.jpeg)

定番のボタン入力、LED点灯、ブザー鳴動を作った。
ブレッドボードやLEDやらは昔買って結局使ってなかったもの。

https://twitter.com/i/status/1722378773243572277

環境はArudino IDE。ボードは「ESP32 Dev Module」でOK。

スケッチ。button_led_buzzer.ino
```button_led_buzzer.cpp
const int DIN_PIN = 13;                // ボタン入力のピン番号
const int LED_PIN = 25;                // LED出力のピン番号
const int BUZZER_CHANEL = 0;           // ブザーのチャネル番号
const int BUZZER_PIN = 2;              // ブザーのピン番号

const int BEAT = 300;                  // 音の長さ（0.3秒間隔）

// 初期設定
void setup() {
  // ピン設定
  pinMode( DIN_PIN, INPUT_PULLUP );
  pinMode( LED_PIN, OUTPUT );
  // PWM設定(チャンネル（0～15）,PWM周波数（～40MHz）,ビット数（1～16）)
  ledcSetup(BUZZER_CHANEL, 12000, 8);
  ledcAttachPin(BUZZER_PIN, BUZZER_CHANEL);
}

// メインループ
void loop()
{
/*
  const int TONENUM = 16;
  int onkai_tbl[TONENUM] = {
  // ド　レ　　ミ　ファ　　ソ　　ラ　シ
    262, 294, 330, 349, 392, 440, 494, 
    523, 587, 659, 698, 784, 880, 988,
    1049, 0
  };
*/
  const int TONENUM = 16;
  int onkai_tbl[TONENUM] = {
    262, 262, 392, 392, 440, 440, 392, 0,
    349, 349, 330, 330, 294, 294, 262, 0
  };

  int value = 0;

  value = digitalRead( DIN_PIN );

  if ( value == LOW ){
    // ボタンON
    digitalWrite( LED_PIN, LOW );  // LED消灯

   // 音階テーブルを実行
   for (int i=0; i < TONENUM; i++){
      if (0 != onkai_tbl[i]){ // 0は消音しないでキープ
        ledcWriteTone(BUZZER_CHANEL, onkai_tbl[i]);
      }
      delay(BEAT) ;
    }
  }
  else
  {
    // ボタンOFFはLED点灯しブザー消音
    digitalWrite( LED_PIN, HIGH );
    ledcWriteTone(BUZZER_CHANEL, 0);
  }
  delay( 100 );
}
```

参考
・LED配線
https://electwork.net/esp32-1/

・ボタン配線、入力
https://deviceplus.jp/arduino/arduino_f06/

・ブザー
https://www.e-tecinc.co.jp/blog/2021/04/23/esp32_buzzerpwm/
RAIDシステムのメリット・デメリットをわかりやすく説明してみた

Hello Qiita people!

ストレージの冗長性とパフォーマンスは、ストレージ管理の世界では永遠のテーマですよね。
この記事では、RAIDの基本から、各RAIDレベルのメリット・デメリット、そして高冗長性をもたらす特定のRAID技術について、説明していきます。


## RAIDシステムの概要と各レベルのメリット・デメリット

RAID（Redundant Array of Independent Disks）システムは、複数のディスクドライブを組み合わせることでデータの冗長性とパフォーマンスを向上させる技術です。ここでは、その主なメリット・デメリットと、代表的なRAIDレベルについて説明します。

## RAIDシステムのメリット

- **データ冗長性**: RAIDは、ディスクの一部が故障してもデータを保護できます（RAIDレベルにより異なります）。
- **パフォーマンス向上**: 複数のディスクにデータを分散させることで、読み書きの速度が向上することがあります。
- **フォールトトレランス**: システムが一部のディスク故障時も稼働し続けることを可能にします。

## RAIDシステムのデメリット

- **コスト**: 複数のディスクが必要になるため、初期費用が増加します。
- **複雑性**: 設定や管理には技術的な知識が必要になることがあります。
- **復旧時間**: ディスクの再構築には時間がかかることがあります。

## 各RAIDレベルのメリット・デメリット

### RAID 0 (ストライピング)

- **メリット**: 全ディスクの容量を利用し、パフォーマンスが高い。
- **デメリット**: 冗長性がなく、一つのドライブ故障でデータが失われる。

### RAID 1 (ミラーリング)

- **メリット**: 単純な冗長性があり、一つのドライブ故障でもデータ保護される。
- **デメリット**: 容量が半減し、コストが増える。

### RAID 5 (パリティレイド)

- **メリット**: 読み取りパフォーマンスが良く、一つのドライブ故障でもデータ保護。
- **デメリット**: 書き込みパフォーマンスの低下と再構築に時間がかかる。

### RAID 6 (ダブルパリティ)

- **メリット**: 二つのドライブ故障までデータを保護。
- **デメリット**: パリティ計算によるパフォーマンスへの影響が大きい。

### RAID 10 (ミラーリングとストライピングの組み合わせ)

- **メリット**: 優れた冗長性とパフォーマンス。
- **デメリット**: 高コストで、利用可能容量が半分。

## 高冗長性RAID形式

### RAID DP（Diagonal Parity）

- **メリット**: 二つのドライブ故障までデータ保護し、パフォーマンス低下が少ない。
- **デメリット**: ストレージ容量効率が低下し、パリティ計算によるオーバーヘッドがある。

### RAID TEC（Triple Erasure Coding）

- **メリット**: 三つのドライブ故障までデータを保護する非常に高い冗長性。
- **デメリット**: ストレージ効率が著しく低下し、パフォーマンスへの影響が最も大きい。

## あとがき
以上がRAIDの基本的な概要と、各レベルのメリット・デメリット、さらに特定の高冗長性RAID形式の説明です。皆さんのストレージ管理に少しでも役立つ情報が提供できれば幸いです。

もし質問や詳細な情報が必要な場合、または実際の経験に基づくアドバイスがあれば、コメントでの交流を歓迎します。情報共有はコミュニティを豊かにするものですから、みんなで知識を深め合いましょう。

最後まで読んでいただきありがとうございました。次回の投稿でお会いしましょう！

Thank you!
Databricksにおけるヘルスケア関連のサンプル集

まとめます。

:::note
**注意**
リンク先のノートブックは古いものもあるため、そのままでは動作しない場合があります。
:::

# ソリューションアクセラレータ

具体的なユースケースのサンプルです。

https://qiita.com/taka_yayoi/items/3929677d4e0c9dffaef4

https://qiita.com/taka_yayoi/items/2ae740ab884c26e5906e

https://qiita.com/taka_yayoi/items/fcf396cf75418e87ec76

https://qiita.com/taka_yayoi/items/35863e696c72f0d08909

https://qiita.com/taka_yayoi/items/144c319882674d736198

https://qiita.com/taka_yayoi/items/3c3dcf73136b580d545c

https://qiita.com/taka_yayoi/items/dbb6e5230628797bc922

https://qiita.com/taka_yayoi/items/8f6929b9777ab83681dc

https://qiita.com/taka_yayoi/items/25f0e689de211c17f3d5

https://qiita.com/motokazu_ishikawa/items/e89f9c6655216674e4d1

https://qiita.com/motokazu_ishikawa/items/b506c015436371418c46

# Glow

[Glow](https://glow.readthedocs.io/en/latest/)は人口規模での遺伝データを操作するためのオープンソースのツールキットです。

https://qiita.com/taka_yayoi/items/d218797152fa480b6673

https://qiita.com/taka_yayoi/items/72e96f8f7c0f888782a3

https://qiita.com/taka_yayoi/items/afb2bc6d90f983ae412e

# ADAM

[ADAM](https://adam.readthedocs.io/en/latest/)はSparkで動作するゲノムデータ処理ツールです。

https://qiita.com/taka_yayoi/items/1a00d3d85363a88a1367

# Hail

[Hail](https://hail.is/)は大規模遺伝子データセットの分析のためにSpark上で利用できるライブラリです。

https://qiita.com/taka_yayoi/items/620a829729b147446c58


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
確率統計学・統計検定学習備忘録　①条件付き確率　のイメージをつかむ問題

普段より、自分のプログラミング等に関する質問に答えて下さっている皆様ありがとうございます。m(_ _)m　統計検定の学習等に利用していただけますと幸いです。マークダウンが雑なのは、慣れるまでご容赦ください。もう少し時間をください。慣れたら見やすくします。

※2023.11.15日執筆時、この日初めて、大学・大学院時に散々苦しめられたTeXという数学徒専用のプログラミング経験が役に立つと知り愕然としています。（約10年前、私が学生当時はおそらくQiitaのようなものはなく、出力結果がエディターと同時に開けない状態でした。）

<h1>「条件付き確率」例題及び解答

さて、先日Xにて、ある問題をポストしました。以下の通りです。
**「A、Bという２人の人物がいる。4枚の異なる柄のトランプから2枚をAが引き、色が揃ったらAの勝ち、揃わなかったらBの勝ちとする。有利なのはどちらか？」**
結論から言いますと、

**Aが勝つ確率は$\frac{1}{3}$、Bが勝つ確率は$\frac{2}{3}$ のため、「有利」という言葉の定義をここでは「勝負に勝ちやすい」こととすると、答えはB**（が有利）となります。
<h1>なぜ、Bが有利なのか？（＝なぜBが勝つ確率が高いのか？）

まず、 そもそも **「（Aが勝つ確率は）$\frac{1}{2}$ じゃないの？？？」** と思われた方は、
条件付き確率の意味もしくは **問題の捉え違い** をしている可能性があります。

ここで多くの方が、**どちらが有利がを考えるのに「どちらの方が勝ちやすいか？、つまりは勝率」** を考えたと思われるのですが、ここでの **Aが勝つ条件は「色を揃える」** ことです。

よって、
<h3>1枚目が赤でも黒でも2枚目は残り3枚のうち1枚だけが同色になるため、

**Aが勝つ確率は $\frac{1}{3}$** となります。そして、統計っぽく言うと、これは
**「1枚目のカードの色が分かっているときに）2枚目のカードの色がそろう条件付き確率」** に当たります。(数式とか記号とか出てくるとどうなるかは後述します。)
<h1> 問題を別の視点から考えてみる。仮に一気に2枚引く状況だとしても・・

**「スペード（黒）、クラブ（黒）、ダイヤ（赤）、ハート（赤）」とすると、（数字は頭で整理しやすいように例えば全て1としましょう）**

この中から **（順番を考えずに）** 一気に2枚取った場合、取り方は
①（スペード（黒）,クラブ（黒））、
②（スペード（黒）,ダイヤ（赤））、
③（スペード（黒）,ハート（赤））、
④（クラブ（黒）,ダイヤ（赤））、
⑤（クラブ（黒）,ハート（赤））、
⑥（ダイヤ（赤）,ハート（赤））、
の **「6」パターン** となります。そのため、このうち「色が揃う」ものを数えると、
①、⑥の2パターンなので、このときも確かに**Aが勝つ確率は $\frac{1}{3}$** となります。

式で書くと、**$\frac{{}_2 C_2+{}_2 C_2}{{}_4 C_2} = \frac{1+1}{6}=\frac{1}{3}$** です。
※分子は同じ色2枚に限定した状態から2枚引く×2のイメージ
____
ここで1つ注意が必要です。それは、たまたま数字が一致するだけで、
**この1つ上のAが勝つ確率$\frac{1}{3}$は実は、一番最初の「1枚目のカードの色が分かっているときに）2枚目のカードの色がそろう条件付き確率」を考えているわけではない**ということです。
___
もし、仮に一番最初の問題
「A、Bという２人の人物がいる。4枚の異なる柄のトランプから2枚をAが引き、色が揃ったらAの勝ち、揃わなかったらBの勝ちとする。有利なのはどちらか？」を
**条件付き確率および乗法の定理を使うことを「強調する」、かつ統計検定で出されるような形式で** **「問題を読み替えると」** 例えば、次のようになります。
<h4>「Aが4枚の異なる柄のトランプから順に1枚ずつ計2枚引く。このとき、色が揃う確率を求めよ。また「色が揃ったらAの勝ち、色が揃わなかったら俺の勝ち」という提案を友人のBがして出してきたときに、この提案はフェアであるか？」

____
上記のような問題の書き方であれば、まずAが勝つ確率を求めるのに

**①黒で揃える場合
$\frac{2}{4}×\frac{1}{3} = \frac{1}{6}$**　←乗法の定理を使って計算している式（の1つ）

同じように、
**②赤で揃える場合
$\frac{2}{4}×\frac{1}{3} = \frac{1}{6}$**　←乗法の定理を使って計算している式（の1つ）

だから、どちらのパターンも考えて結果、Aが勝つ確率は
$\frac{1}{6}+\frac{1}{6}=\frac{2}{6}=\frac{1}{3}$

で、Bが勝つ確率はその余事象の確率だから、
$1-\frac{1}{3}=\frac{2}{3}$

結果、Bの方が有利そう・・と見当をつけやすいように思うのですが、

**条件付き確率とは上の①、②の「～で揃える場合」の下の式の「×の後ろの」$\frac{1}{3}$にあたるもの**を指します。冗長になりそうなので、もうこのあたりで筆を止めますが、心配な方はお手持ちの参考書等で、何が何にあたるのか対照させてみてください。
個人的には **「ベン図や簡単な（問題を表す）落書き」** を答案用紙の端などに書いてみることを推しておきます。

なお、どうも条件付き確率は事象（ここでは、「そろえる」ではなく「～色のカードを引く」と考えないとたぶん頭が混乱します）の数が3つ以上になる、要は事象がA、B、の次にCが出てくると、かなり面倒なことになりそうです。

※昨年度の統計検定1級の数理統計1がそれであったため、Qiita化次第、下にリンクを貼ります。


<h1>オススメ参考資料一覧（※全部の内容を自分も理解できているわけではないです。）

・青チャートI＋A、Ⅱ＋B　数研出版
・理工系の微分積分学　吹田信之、新保経彦　共著　学術図書出版書
・線形代数入門　齋藤正彦　著　東京大学出版会
・定本　解析概論　高木貞治　著　岩波書店　
・数学シリーズ　数理統計学　改訂版　稲垣萱生　著　裳華房
・数学シリーズ　集合と位相　内田伏一　著　裳華房　（の前半）
・one point 推定と検定　鷲尾泰俊　著　共立出版
M5UnitV2 でHello World

## 目的
M5UnitV2のクロスコンパイル環境でプログラムを作成し、
Hello Worldを実行します。

## 事前準備
[M5Stack UnitV2のクロスコンパイル環境を構築する手順](https://qiita.com/nnn112358/private/9e15450265b689300216)

## プログラムの作成
以下のように、C++言語で、Hello Worldのプログラムを作成します。

```test.cpp
#include <iostream>
using namespace std;
int main() {
    cout<<"Hello UnitV2 World"<<endl;
    return 0;
}
```

## プログラムのコンパイル

まずは、通常環境のコンパイラ g++でプログラムをコンパイルしてみましょう。

```
g++ test.cpp -o test
```
ubuntu-PCの中でバイナリを実行すると、Hello Worldが出てきました。
```
$ ./test 
hello world
```

次に、arm用のクロスコンパイラarm-none-linux-gnueabihf-g++
を使ってプログラムをビルドします。

```
$ arm-none-linux-gnueabihf-g++ test.cpp -o test
```
arm環境のバイナリなので、ubuntu-PCの中で実行しても
Hello Worldは出ません。

```
$  ./test 
bash: ./test: バイナリファイルを実行できません: 実行形式エラー
```

ファイル形式を調べるためのコマンド「file」でファイルを見てみましょう。
arm環境のバイナリであることが確認できました。

```
$ file ./test
./test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, with debug_info, not stripped
```

このバイナリをUnitV2環境にコピーします。
PCとUnitV2とをUSBで接続し、SCPコマンドでバイナリをコピーします。

```
$ scp ./test  m5stack@unitv2.local:/media/sdcard/
```
SSHでUnitV2にログインして、バイナリを実行します。

```
$ ssh m5stack@unitv2.local
unitv2% cd /media/sdcard/
unitv2% ./test 
Hello UnitV2 World
```

Hello UnitV2 Worldが表示できることが確認できました。


## 参考資料
この記事を作成するにあたり、以下のウェブサイトを参考にしました。

- [M5 UnitV2 ドキュメント](https://docs.m5stack.com/en/unit/unitv2?id=description)
- [GitHub:m5stack/UnitV2Framework](https://github.com/m5stack/UnitV2Framework)
- [GitHub:meganetaaan/UnitV2Framework](https://github.com/meganetaaan/UnitV2Framework)
- [RT Humanoid Robot Blog / M5Stack UnitV2用クロスコンパイル環境の構築：ししかわの二足ロボ研修 Part.5](https://rt-net.jp/humanoid/archives/3955)
- [RT Humanoid Robot Blog /M5Stack UnitV2Frameworkをビルドする：ししかわの二足ロボ研修 Part.6](https://rt-net.jp/humanoid/archives/3962)
Bard の公開リンクの期限

Google Bard の公開リンクに期限があることに気付きました。

期限は右上の歯車から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32057/0426a975-8515-7831-3e5d-d702de9b24a9.png)

公開リンクは一時的な利用に留めて、残したい情報はどこかにコピーして公開した方が良さそうです。

なお、念のため ChatGPT の方も共有リンクの設定を確認しましたが、こちらは特に期限は書かれていませんでした。

# 追記

期間制限なしで公開したい時は、ログを Markdown 化して GitHub に置くような運用を行っています。詳細は以下の記事を参照してください。

https://qiita.com/7shi/items/7f9c8ea1a4e380c02af1
Bard でログの長さに注意

Google Bard でログが長すぎると問題が起きるようです。参考までに経験談を書いておきます。

# サルベージ的な何か

Google Bard で約 50 個の質問を 1 つずつ投稿していた所、20 回を超えた辺りでレスポンスが悪くなり、エラーが発生して回答が生成されなくなりました。

埒が明かないため、新規チャットで続きから作業を再開しました。残りの質問が 2 個くらいになった所でまたレスポンスが悪くなりました。残りが少ないのでやり切ってしまおうとしたのが良くなかったようです。思ったような回答が得られずに再生成や文面を変えての再質問を繰り返しているうちに、またエラーが発生しました。

リロードしてから新規チャットで続けようとしたところ、新規ログインのような状態になって履歴が消えてしまいました。負荷をかけ過ぎてしまったためアカウント停止の前兆かと焦りました。

※ リロードしたのは、以前、エラーが発生して操作を受け付けなくなったとき、リロードすると CAPTCHA が表示されて、それをクリアすれば続行できた経験があったためです。

そういえば ChatGPT に履歴機能が付いた頃、しばらく表示されない不具合が発生したのを思い出して、様子を見ることにしました。

30 分ほど経ってからリロードすると履歴は復活しました。しかしエラー発生直前の 10 回くらいの投稿が断片化（別チャットに分離）しており、いくつかは失われていました。ディスクやファイルシステムで異常が発生してサルベージした状態に似ています。

その時のシステム全体の負荷なのか、自分の作業が原因なのかは分かりませんが、高負荷で異常が発生して復旧処理が走ったようです。

ちなみに ChatGPT に切り替えて作業を続行しようとしたところ、関連性はないと思いますがそちらも高負荷でエラーが発生してしまいました。タイミング悪過ぎです。

※ Bard の方が投稿回数の制限が緩いので、Bard でうまく処理できないことだけ ChatGPT で作業していました。

# 教訓

:::note info
ログは適度に分割する。
:::

質問内容にもよるのですが、長めのやり取りが続くと負荷がかかってしまうようです。

今回の質問は個々に独立しておりコンテキストに依存したものではありませんでした。このような場合は無理に 1 つのチャットで続けるのではなく、適度に分割した方が無難なようです。

Bing AI は 1 つのチャットの上限が 30 回と明示されているのに対して Bard では特に明示されていませんが、今後は同じようなものだと考えて接することにします。

:::note info
再生成や再質問を繰り返しても想定した回答が得られないときは、新規チャットに移行する。
:::

同じプロンプトを使っているのに反応が変わって想定した回答が得られなくなったときは、粘っても改善することはなく、どんどん変な方向に行く傾向があります。

そのような場合は新規チャットに移行すれば、すんなり想定通りの動きをしたりします。

人間の感覚では慣れればどんどん作業効率が上がるような気がするのですが、その逆です。会話を繰り返すことで何らかの情報が蓄積していって、表面化したときには修正不能になるような印象を受けます。

※ ChatGPT でも同じような傾向はありますが、Bard の方が表面化しやすい気がします。

# 追記

:::note warn
他サービスについての記述のため Bard にはそのまま当てはまらないとは思いますが、参考までに追記します。
:::

Claude の説明にはヒントになりそうなことが書かれています。

* [クロードプロの使い方について | Anthropicヘルプセンター](https://support.anthropic.com/ja/articles/8324991-%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%89%E3%83%97%E3%83%AD%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

> メッセージを送信するたびに、Claudeは全会話を再読み込みする必要があるため、新しい会話を開始することで、会話を続けるためにClaudeが行う必要のある作業量を制限できます。追加のメリット: 短い会話では、Claudeの応答も速くなります。

AI がコンテキストをどのように把握しているのか疑問でしたが、Claude では全会話を再読み込みしているようです。

Bard にどこまで当てはまるかは不明ですが、もし同じような処理を行っているのであれば、ログが長くなるほど不安定になるのは理解できます。

Bard は以前の指示をすぐに忘れる傾向があるため、全会話を再読み込みしているわけではない気はします。FAQ によると意図的な制限のようです。

https://bard.google.com/faq

> 会話中に私が以前に言ったことを Bard が覚えていないのはなぜですか？
> 
> Bard がコンテクストを把握する能力は、現時点では意図的に制限されています。学習を積み重ねることで、より長い会話においてコンテクストを把握する能力が高まっていきます。

なお、Claude については以下の記事で紹介しています。

https://7shi.hateblo.jp/entry/2023/10/28/170020

# 関連記事

Bard の挙動については、API との比較で推測できることがあります。

https://qiita.com/7shi/items/667e1206469b2a1a4e00
gpt-code-ui-docker起動時のエラーメモ

# Docker環境のgpt-code-ui-docker構築メモ
Docker環境でgpt-code-ui-dockerを構築しようと、上手くいかず時間を無駄にしたためメモしておく。

# gpt-code-ui-dockerとは
詳細は割愛しますが、ChatGPTの機能であるCode InterpreterをAPIで使用できるものです。
以下参照下さい。
　https://ricklamers.io/posts/gpt-code/

# 発生した事象
docker-compose.yamlの修正後、docker-compose upで起動したところ以下のエラーが発生
```
"Port 8080 is in use by another program. Either identify and stop that program, or start the server with a different port."
```

#解決方法
docker-compose.yamlにWEB_PORTを記述
```
WEB_PORT:XXXX
```
githubのコミュニティにも質問が出ておりました。。
https://github.com/localagi/gpt-code-ui-docker/issues/1

# 反省
ハマったときは直ぐにコミュニティ確認すること。
Dockerの構成を今一度勉強します。
オブジェクト指向　例外について

オブジェクト指向プログラミングの仕組みの1つである例外についてまとめています。

:::note
例外を一言で表現すると、「**戻り値とは違う形式で、メソッドから特別なエラーを返す仕組み**」と言える。

特別なエラーの例
* ネットワークの通信障害
* ディスクのアクセス障害
* データベースのデッドロック
:::

### 従来のサブルーチンの仕組みでの対応方法
従来のサブルーチンの仕組みでは、戻り値として適切な値を返せない場合は、**エラーコード**を使うのが常套手段でした。

エラーコードが1の時はデッドロック、2の時は通信障害、3の時はその他の致命的なエラー、といった具合に値の意味を決めてサブルーチンの戻り値として返す方法をとっていた。

#### この方法の2つの問題
##### エラーコードの判定処理をアプリケーションで確実に行う必要があること
もし判定処理を書き忘れたり、値を間違えたりしてしまうと、障害発生時に原因を特定するのが難しくなる。エラーコードの値を追加・削除する場合には、関係するサブルーチンを全て書き換える必要がある。

##### エラーコードを判定する同じようなロジックがサブルーチンの間で連鎖してしまうこと
呼び出す側のサブルーチンでは、エラーコードの値を判定するロジックを常に書く必要がある。このようにエラーコードの判定処理がアプリケーション全体に連鎖してしまうと、プログラムのロジックが非常に冗長になっていく。

### 例外の仕組み
:::note
例外の特別な仕組みでは、特別なエラーを返す可能性のあることをメソッドで宣言する。
:::

例外を宣言しているメソッドを呼び出す側では、例外を処理するロジックを正しく書いていないと、コンパイル時または実行時にエラーになる。

また例外を宣言されているメソッドを呼び出す側では、エラー発生時に特別な処理を行わずに、さらに上位のメソッドにエラーを伝えれば良い場合には、例外が発生する可能性があることをメソッドで宣言するだけで、エラー処理を書く必要がなくなる。これにより、エラーコードが冗長になることを防ぐことができる。
C# .NET MAUIアプリを使ってWindowsアプリを起動するとエラーになった時の対処法

## 参考資料
- .NET系のバージョン確認
  - https://dotnet.microsoft.com/ja-jp/download/dotnet/7.0

## 開発環境
  - Windows 10 Pro
  - Visual Studio 2022(v17.6)
  - .NET 7.0.13
     - Visual Studio 17.7.6
     - SDK 7.0.403
     - ASP.NET Core ランタイム 7.0.13
     - C#12.0

## 事象
- Visual Studioを最新バージョンでインストール後、.NET MAUIアプリを作成し、Windowsアプリを起動すると「デバッグするには、プロジェクトを配置する必要があります。構成マネージャーで配置を有効にしてください。」といったエラーが表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/4b8b5d37-4237-7012-1551-5b7f2cfeba2e.png)

- 出力には下記のようにSplashScreen.pngが見つからないといった旨のメッセージが表示されている。。
>エラー DEP0700: アプリの登録に失敗しました。[0x80073CF6] AppxManifest.xml(33,27): エラー 0x80070003: スプラッシュ スクリーン イメージ [SplashScreen.png] が見つからないため、パッケージ chhlvl.designIT7_xzp7k71ajzmr6 をインストールまたは更新できません。パッケージにアプリケーションのスプラッシュ スクリーンとして使用できるイメージが含まれていること、およびパッケージ マニフェストがこのスプラッシュ スクリーン イメージが存在するパッケージ内の正しい場所を指していることを確認します。デザインIT7   

- ソリューションのリビルドを実行するのみでいけた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/940bba54-1d48-a349-3eef-aa56da90b4cd.png)
※リビルドはオブジェクトファイルを再生成するので、いけるかなと思ってやってみるとうまくいきました。

- ビルド、リビルド、クリーンについてざっくりと説明
  - ビルド：変更があった部分のみをビルドする。
  - リビルド：ビルドをやり直すこと。変更箇所だけでなくすべてを再度ビルドする。クリーンとビルドを合わせた処理。
  - クリーン：「ビルド」「リビルド」によって作成された成果物や中間ファイルを削除する。
 
- Windowsアプリを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/b941cb74-2a60-144d-d14a-6c9d8df29ba8.png)

- これでOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711955/3dc07580-3e25-4384-0ad3-b02da8edf735.png)
Rustで、非同期関数を途中で中断する方法

# 初めに
最初は自力で書きましたが、その1分後に[CancellationToken](https://docs.rs/tokio-util/latest/tokio_util/sync/struct.CancellationToken.html)
を見つけて、悲しみました。

# 使い方
```rust
use tokio::select;
use tokio_util::sync::CancellationToken;

#[tokio::main]
async fn main() {
    let token = CancellationToken::new();
    let cloned_token = token.clone();

    let join_handle = tokio::spawn(async move {
        // Wait for either cancellation or a very long time
        select! {
            _ = cloned_token.cancelled() => {
                // The token was cancelled
                5
            }
            _ = tokio::time::sleep(std::time::Duration::from_secs(9999)) => {
                99
            }
        }
    });

    tokio::spawn(async move {
        tokio::time::sleep(std::time::Duration::from_millis(10)).await;
        token.cancel();
    });

    assert_eq!(5, join_handle.await.unwrap());
}
```

# 自作
自分が作ったやつ
使い方はかなり似てます
```rust
pub mod waiting_future {
    use std::{
        pin::Pin,
        sync::{Arc, Mutex},
        task::{Context, Poll, Waker},
    };

    use futures_util::Future;

    #[derive(Clone, Debug)]
    pub struct WaitingFuture {
        shared_state: Arc<Mutex<SharedState>>,
    }

    #[derive(Debug)]
    struct SharedState {
        completed: bool,
        waker: Option<Waker>,
    }

    impl Future for WaitingFuture {
        type Output = ();
        fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
            let mut shared_state = self.shared_state.lock().unwrap();
            if shared_state.completed {
                Poll::Ready(())
            } else {
                shared_state.waker = Some(cx.waker().clone());
                Poll::Pending
            }
        }
    }

    impl WaitingFuture {
        pub fn new() -> Self {
            let shared_state = Arc::new(Mutex::new(SharedState {
                completed: false,
                waker: None,
            }));

            WaitingFuture {
                shared_state: shared_state,
            }
        }

        pub fn finish(&self) {
            let mut shared_state = self.shared_state.lock().unwrap();
            shared_state.completed = true;
            if let Some(waker) = shared_state.waker.take() {
                waker.wake()
            }
        }
    }
}
```
Streamlit cloudにAPIキーなどを格納して公開する方法

# はじめに
以前にPythonのフレームワークである`Streamlit`をもとに[楽曲レコメンドWebアプリ](https://qiita.com/ushi05/items/f30d3874b2d9584ebcb8)を作成しました。そのアプリは`Streamlit Cloud`で公開したのですが、利用しているAPIキーをどこに保持していいか分からず、それについて調べた結果をまとめた記事です。

## APIキーとは
APIキーとAPIを利用するために必要なパスワードみたいなもので、これがないとAPIを叩けません。（簡単な例でいうと、実家の鍵みたいな感じ）
そのため、`GitHub`で公開してしまうと、最悪の場合**不正利用**されてしまう可能性があります。もし誤って公開すると、`GitGuardian`から大量の英語メールが届きます。
***ゼッタイに公開してはダメ。***

## 普通はどうする？
**下記のように設定してAPIキーを利用します。**
* Pythonでは`dotenv`を用いて`.env`ファイルを作成し`.gitignore`の対象にする。
* ターミナルやコマンドプロンプトで環境変数として設定する。

## `Streamlit Cloud`で公開する場合
`Streamlit Cloud`で公開する場合は`GitHub`で公開されているリポジトリを参照してデプロイしています。
***
### はじめに
そのため、`Streamlit Cloud`のページの設定したいアプリを探して下の画像の**三点リーダ**をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559951/06c6ff2c-439d-4132-c096-9d2639ad986d.png)
***
### 設定の中ば
クリックすると下の画像が出てくるため、`Settings`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559951/562a2952-d79b-5dce-f3bc-9f585f641f77.png)
***
### あと少しで設定完了
そうすると下の画像が出てきます。この`Secrets`にAPIキーを記入することで、他人には見られずにデプロイできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559951/c6167045-064c-df18-b54b-b9cdc34a4d55.png)
***

この`Secrets`に記入したAPIキーはデプロイするアプリの###.py（例えば、app.py)に`st.secrets`で利用することができる。
```:Secrets
[ファイル名]
####_APIKey = 'qwerty12345'
```

```python:app.py
API_KEY = st.secrets['ファイル名']['####_APIKey']
```

## 最後に
今回デプロイするときに`dotenv`やターミナルで環境変数に設定してみてもうまく行かず...
今後、`Streamlit Cloud`でアプリをデプロイされる方のお助けになれば幸いです。
「テキストが文字化け」FastAPIを使用

FastAPIを使用している際に日本語のテキストが文字化けする原因は主に、レスポンスボディのエンコーディングが適切に設定されていない場合に起こります。

デフォルトでは、FastAPIは`utf-8`を使用してレスポンスをエンコードしますが、この設定がレスポンスヘッダーに正しく反映されていないと、クライアント（ブラウザやAPIクライアントなど）がレスポンスを適切に解釈できず、文字化けが発生する可能性があります。


FastAPIで日本語の文字化けを避けるための解決策は、レスポンスを返す際にヘッダーで`charset=utf-8`を明示的に指定することです。

これは、`JSONResponse`オブジェクトを使用して`media_type`パラメータに`charset=utf-8`を含めることで実現できます。

また、サーバー側で正しく設定されていても、クライアント側の設定やブラウザのデフォルトの文字エンコーディングが異なる場合にも文字化けが発生することがあります。

したがって、クライアント側もレスポンスの`Content-Type`ヘッダーを確認し、適切に対応する必要があります。


FastAPIを使用する際には、このような文字エンコーディングの問題に気をつけることが重要です。特に、多言語を扱うアプリケーションでは、国際化（i18n）と地域化（l10n）のベストプラクティスを適用することが推奨されます。
VSCode拡張機能の右クリックメニュー項目を設定で非表示にできるようにする

## はじめに

- 拡張機能を開発する人向けの記事です
- 拡張機能で追加している右クリックメニューを、設定で非表示にできるようにします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/12dbe98a-be34-9edc-b5ea-db94a93658a6.png)

## 概要

やり方の概要は以下。

1. メニューの表示条件 (when clause) に独自のコンテキストキーを指定する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/1a991574-f128-d475-382b-c48bd856f6b7.png)

1. bool型の設定値を用意する
1. 起動時と設定変更時に設定値を読む
1. 設定値に合わせて独自のコンテキストキーの値を変更する
    この例は独自コンテキストを true にする場合
    ```typescript
    vscode.commands.executeCommand('setContext', '(独自のコンテキストキー)', true);
    ```

## when clause に独自のコンテキストキーを指定する

package.json のメニュー項目を記載している箇所のwhen句で、独自のコンテキストキーが true の場合に表示するように指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/1a991574-f128-d475-382b-c48bd856f6b7.png)

独自のコンテキストキーは任意の文字列でよいが、他の拡張機能や標準のコンテキストキーとかぶらないユニークな文字列にしたほうがよい。
作成した拡張機能では、`(拡張機能名).(コンテキスト名)` にした。

## bool型の設定値を用意する

package.json の contribution - configuration - properties に bool型の設定値を用意する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590852/7f1a847c-2ab4-23e0-13ad-7d0845dcd2aa.png)

この値が true の時にはメニュー項目を表示、false なら非表示になるようにする。

## 起動時と設定変更時に設定値を読む

起動時は `activate` メソッドが呼び出されたとき。
設定変更時は イベントハンドラを登録する。

```typescript
import { commands, ConfigurationChangeEvent, ExtensionContext, workspace } from 'vscode';

export function activate(context: ExtensionContext) {
    /* (中略) */

    // 設定値に合わせてカスタムコンテキストキーの値を更新する
    updateContextState();

    // 設定変更時のイベントハンドラを登録
    context.subscriptions.push(
        workspace.onDidChangeConfiguration((event) => this.onDidChangeConfiguration(event))
    );
}

// 設定変更時のイベントハンドラ
function onDidChangeConfiguration(event: ConfigurationChangeEvent): void {
    for (const service of this.contextServices) {
        // 設定値に合わせてカスタムコンテキストキーの値を更新する
        updateContextState();
    }
}

// 設定値に合わせてカスタムコンテキストキーの値を更新する
function updateContextState() {
    let state = <boolean>workspace.getConfiguration("markdowntable.showMenu").get("format");
    commands.executeCommand('setContext', "markdowntable.contextkey.config.showMenu", state);
}
```

## 設定値に合わせて独自のコンテキストキーの値を変更する

上の例で書いてしまいましたが、
設定の読み込みは `workspace.getConfiguration(セクション名).get(項目名)` で行います。

```typescript
    let state = <boolean>workspace.getConfiguration("markdowntable.showMenu").get("format");
```

セクション名には設定項目キーの . より前部分を指定します。項目名には設定項目キーの . より後部分を指定します。
設定項目キーが `markdowntable.showMenu.format` なら、セクション名は`markdowntable.showMenu` で、項目名は `format` です。

独自のコンテキストキーの値を変更するには `commands.executeCommand` で setContext を実行します。

```typescript
    commands.executeCommand('setContext', "markdowntable.contextkey.config.showMenu", state);
```

第二引数にコンテキストキーを指定し、第三引数に値を指定します。

## 参考

自作の拡張機能ですが、設定でメニューを非表示にできるようにしています。

https://github.com/takumisoft68/vscode-markdown-toc-num

マーケットプレイスに公開しています。

https://marketplace.visualstudio.com/items?itemName=TakumiI.markdown-toc-num
GithubとKiCadを用いた学生ロケットのチーム開発 vol. 1

:::note alert
間違いがある可能性があります．あらかじめご了承ください．
:::

# はじめに
　私は大学に入って初めて回路設計やプログラミング，Githubを用いた開発を行いました．その過程で開発したものを**残すこと**がいかに大切なのかを学んだためTSRPの計測制御班で2022年8月ごろから導入したチーム開発方法をまとめようと思います．
~~もう，ロストテクノロジーはしたくない~~

学生ロケットはもちろん，誰かの参考になり回路・電装系を盛り上げることができたらうれしいです．

:::note info
TSRP とは，東海大学学生ロケットプロジェクトの愛称です．
**T**okai **S**tudent **R**ocket **P**roject の頭文字をとっています．
:::

# システム構成

![DevelopmentBlockDiagram.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356803/f016cd07-5a55-1f42-64ab-8987fc7faacc.png)

上記のように Github と連携させながら開発を行っています．
それぞれの役割や使い方について説明していきます．

## Github
とても有名なソフトウェア開発のプラットフォームです．Git を用いたバージョン管理はもちろんのことチーム開発を行う際に便利な機能を使用することができます．

Visual Studio Code と相性が良いです．

## Visual Studio Code
Microsoft 社が運営しているソースコードエディタです．最近？勢いを増し，人気な開発環境ツールとなってきました．VScode の名で親しまれています．
主に，ソースコードの開発，デバッグ，書き込みをVScodeで行っています．

[参考 Visual Studio Code](https://code.visualstudio.com/)

Github との相性が良いです．

GUI が充実し，分かりやすいため Push や Pull, Clone などは Visual Studio Code を介して行っています．
また，拡張機能をインストールすることで Arduino の開発環境や各種便利ツールを使用することができます．

## KiCad 7.0
オープンソースの EDA（自動電子設計）用ソフトウェアです．
同様のソフトウェアに Fusion 360 がありますが，動作の軽さや直感的な分かりやすさから KiCad を利用し始めました．
若干 Github と相性が良くないですが，大きな支障になっていないため引き続き利用しています．

[参考 KiCad](https://www.kicad.org/)

## 要件定義書
これは各団体，個人によって異なると思いますが TSRP の計測制御班では行うことや目指すべきことを明確にするために作成しています．

後の，報告書などを作成する際に資料として利用できます．

## 手順書
完成した搭載計器の組み立て手順はもちろんのこと，ソースコードの説明や渡航（打ち上げ実験）に持って行ったものを必要に応じてまとめています．

これは，大規模な感染症の影響を受けた世代だからこそまとめておくことは大切であると感じました．
これまでは先輩から後輩へ対面や打ち上げ実験を通して引き継がれていましたが，1回でもその経験がなくなるとどうしたものか途端に何を持っていくのかやどのような手順を踏めばよいのかわからなくなってしまいます．
少しでも資料は残すようにした方がこれからのためになります．（もちろん，自分のためにも）

## 解析・報告書
達成したことや成果はもちろん，失敗したことも重要な情報となるはずです．
もしかしたら，アプローチの方法が間違っていただけかもしれませんし，のちの世代が失敗の原因を見つけより良いシステムを構築するかもしれません．
とりあえず，まとめておきましょう．

## おわりに
次回は，実際に KiCad と Github を連携させる方法について記述していこうと思います．
誰かの参考になれば幸いです．
2分探索の細かな部分を確認する

# 2分探索を実装しようとすると何が答えになるのかあいまいになる。
アルゴリズムの典型である2分探索だが、実際に何か得たい値がある場合に、leftを出力するのか、それともrightを出力するのかどうすればよかったのかあいまいになる。そこで、このあいまいさを排除し、使いやすくなるように備忘録として残しておく。

# 2分探索の実装を改めて考える
2分探索を用いる場合、片方にTrueが塊り、もう片方にFalseがあり、その境目を探す問題であることが多いと思う。

例えば、Aさんに1から10までの数字のうち好きな数字を思い浮かべてもらい、その数字を、答えた数字以上か未満かを答えるゲームをするとき、Aさんが思い浮かべた数字が4だとすると, Aさんの回答は以下の配列になる。

|1|2|3|4|5|6|7|8|9|10|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|True|True|True|False|False|False|False|False|False|False|

ここで以下のようなプログラムで2分探索を行う。
```
long long target = 4; //思い浮かべた数字

long long left=0;
long long right=11;
while (right-left>1){
    long long mid = (left+right)/2;
    if (mid < target) left=mid;
    else right=mid;
}
cout << right << endl;
```
上のプログラムではrightを出力することで、Aさんが思い浮かべた数字を出力することが可能となるが、もっと複雑な場合では、rightを出せばよいのかleftを出せばよいのか迷ってしまうだろう。
そこで、上記例をもとに理解を深めたい。
まず、```right-left>1```という条件についてだが、これにコメントをつけるとしたら、"rightとleftの距離が1になったら終了する"というコメントがふさわしいと思う。0になる可能性は？？とふと思ってしまうわけだが、このプログラムでは、right-leftが0に到達することはない。
この理由を考えるために、midにleftやrightに代入した場合に、どれだけ近づくことになるのかについて考える。
leftにmidを代入する場合。
```math
left' = (left+right)/2
```
となり、その差は, 
```math
right-left'=right-(left+right)/2=(right-left)/2
```
同様にして、rightにmidを代入する場合は、
```math
right' = (left+right)/2
```
となり、その差は
```math
right'-left=(right-left)/2
```
よって、2分探索を行うと、rightとleftの差が2分の1になるということが分かる。ここで、rightとleftの差とその差を2で除算してint型に直したものを並べると以下のようになる。
|1|2|3|4|5|6|
|:--:|:--:|:--:|:--:|:--:|:--:|
|0|1|1|2|2|3|

leftとrightの差が2と3の場合では、明らかに1に到達することが分かり、4,5,6の場合でも差が2,3になるため、明らかに1を経由する。まとめると, leftとrightの差が2以上で始まって、1を経由せずに0に到達する場合は存在しないことがわかる。よって、```right-left>1```の```right-left```が0になることがないことが確認できた。
次に, leftをとるかrightのどちらを出力にすべきかについて考える。
これにはif文の条件をしっかりと見る必要がある。
```
if (mid < target) left=mid;
    else right=mid;
```
からもわかるように、条件はmid < targetとなっている。if (mid < target) left=mid;となっていることから、leftは必ずtargetよりも小さいことが分かる。つまり、どんなに頑張ってもleftは3までしか、いくことができないことが分かる。
|1|2|3|4|5|6|7|8|9|10|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|left|left|left|
|True|True|True|False|False|False|False|False|False|False|

次にrightに追加も同様に考えると、if文の条件より、4までしか行けないことが分かる。
|1|2|3|4|5|6|7|8|9|10|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
||||right|right|right|right|right|right|right|
|True|True|True|False|False|False|False|False|False|False|

さて, 上の表でleftとrightは上の表の範囲で任意の値をとる可能性があるわけだが、whileの終了条件であるleftとrightの距離が1であるというのを満たしている組み合わせはどこにあるだろうか？
明らかに、leftが3, rightが4の場合しかないことが分かる。
|1|2|3|4|5|6|7|8|9|10|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|||left|right|
|True|True|True|False|False|False|False|False|False|False|

つまり、2分探索の終了時には上のような状態となることが必ず保証される。
ここで、leftについて考えると、leftはtargetよりも小さいことが保証されているため、targetになることは絶対にない。それに対して、rightはtargetになりうる可能性がある。rightの条件は mid >= targetとなっていることから、rightはtarget以上であることが保証される。しかし、left-rightの距離が1という終了条件からrightはrightのとりうる値の中で最小値であることが保証される。
よって、rightが求めたい値であることが分かる。

複雑な課題で、leftかrightかを見分けた場合、終了時点では、leftとrightが
|1|2|3|4|5|6|7|8|9|10|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|||left|right|
|True|True|True|False|False|False|False|False|False|False|

上のような状態になることを意識し、自分が出力したいのがTrue側に含まれているのか、それとも、False側に含まれているのかをイメージし、leftとrightの選択すると、出力を決定しやすくなると思われる。
APIエンジニアのデスク紹介

弊社では週3出勤、週2リモートワークを実施しているが、家にあってよかったデバイス・家具を紹介

# デバイス

## MacBook Pro 14-inch, 2023, M2
会社支給マシン。M2は互換性の問題があると聞いていたが、現在問題なく動いている。
電池持ちが(IntelCPUと比べて)格段に良くなったのがとても嬉しい。

## [Dell 34 曲面ゲーミングモニター - S3422DWG](https://www.dell.com/ja-jp/shop/dell-34-%E6%9B%B2%E9%9D%A2%E3%82%B2%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-s3422dwg/apd/210-azhm/%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B5%E3%83%AA%E3%83%BC)
作業領域の広いモニターが欲しかったため購入。WQHDの解像度は細かさと作業領域のバランスがちょうどいい。
ディスプレイを購入するときに、譲れなかった条件は以下の通り。

- 144HZ以上のリフレッシュレートであること(ゲームと兼用で使用したいため)
- ワイドディスプレイであること
- 縦方向のサイズが27インチモニター相当以上であること
- PIP / PBP機能があること


以上の条件を満たすモニターが[Dell 34 曲面ゲーミングモニター - S3422DWG](https://www.dell.com/ja-jp/shop/dell-34-%E6%9B%B2%E9%9D%A2%E3%82%B2%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-s3422dwg/apd/210-azhm/%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B5%E3%83%AA%E3%83%BC)くらいしかなかったため、購入。
実際はUSB-C入力/USB-C給電機能も欲しかったが、給電機能のあるゲーム用モニターはほぼ存在しないためこれで妥協している。

## [Keychron K2 Wireless Mechanical Keyboard (Version 2)](https://www.keychron.com/products/keychron-k2-wireless-mechanical-keyboard)
自宅用のキーボード。現在はゲーム用も兼ねている。
Windows/Mac両対応、Bluetooth/Wired両対応なのに価格も高くないバランスのとれたキーボード。

## [プラス オフィスデスク 平机 SH-127H 天板ホワイト/本体ブラック 643-728](https://www.amazon.co.jp/gp/product/B004HCE91S/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&th=1)

横幅の広いデスクデスクを探していたため購入。天板がスチールになっているため磁石がつくのが便利。

## [AirPods Pro 2](https://apple.com/jp/airpods-pro/)
業務用+普段使い用。Apple製品なのでiphoneとMacの間の接続切り替えがシームレスにできて便利。
【Zod】ファイルの拡張子のバリデーション

以下のようにすることでファイルのバリデーションを設定できます。

```js
const schema = z.object({
  avatar: z
    .any()
    .refine(
      (files) => ['image/jpeg', 'image/png'].includes(files?.[0]?.type),
      '.jpg, .jpeg, .pngのファイルを選択してください。'
    )
})


```
優柔不断な私は、今日のランチを誰かに決めてもらいたい

## ランチを迷う時間って、もったいないですよねぇ？

みなさんこんにちは、『ITに毛が生えたヤツ』です！
皆さんは今日のランチに何にしようかな…？と悩むことはありませんでしょうか。
例えば、この私、休憩に行こう、と思っても働く先は商業施設！
優柔不断な私は、「昨日はラーメンだった、一昨日はカレー…」とか考えてしまいます。

そんな時の強い味方！！『Today's lunch API』！
なんじゃそりゃ？と思われた方も多いかと思うので、まず一度X(旧Twitter)をご覧ください…。
https://twitter.com/obatan_aa/status/1722630869322768867?t=8rNbzwY8_tF-05pQX0mvIw&s=19

0～9の数字を入れれば、ランダムに今日のおすすめランチを教えてくれます…！！

### …と言うbotを作りたかったのですが、作り方が分からない！
今回は荒治療のセルフでのランダム方式、休憩に入った時間の分数の1の位を入力すれば、
ランチの品目は決めてくれるBOTになっています。

:::note alert
### 読者の皆さんと私とのお約束です^^①
くれぐれも、『キリのいい時間（＝●0分）から休憩行ったら毎日同じメニューじゃね…？」とは言わないこと！改良予定なんだから言わないで！
:::


## 種明かし編
![qiita用①全景.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580275/d6dd981c-328c-bbf6-9260-636ebd468c92.png)

まずは全景です。どうやって作れば良いのかと調べると、何やら[SSSAPI](https://sssapi.app/)とやらを使っている様子・
会員登録をすると使い慣れた(?)スプレッドシートで簡単にAPIを作れるらしく、これを使わない手はありません。

### 躓いたところ
スプレッドシートの追加はSSSAPIのビジュアルで簡単に分かるUIによって難なくクリア。
皆さんが気になるのはきっと、躓いたところだと思うので、そこを簡単にお伝えしようと思います。
![qiita②JSON.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580275/9e803c87-372f-19a1-4a0c-3f5150b94252.png)

でん！『え？ただのhttpじゃん…」と思ったあなた。それは違います！
『先生から習ったHTTPと違う！ナニコレ！ドコ！！』←私

しかし人間には休息と言うものが必要で、分からなくて挙動不審の私は一旦スイカゲームをプレイ。
ぼーっと考えていると、『HTTPと入力して、●●を選択してください」と言っていた先生の言葉が降ってきました。
![qiita③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580275/0a5c3dfb-aa0e-ff8a-217f-cebbda455354.png)

これだああ！「MAKE A REQUEST」を選択する。

## 振り返り
もう少し凝ったAPIが良いなあ、と思いながらも、立ちはだかる言語の壁。
MAKEで何が出来るのか、もう少し調べ方無いのかなあ…☁

次なる目標として、完全ランダム！秒数で取れば割と高いランダムなのでは？
でもLINEから飛んでくる情報に秒は入ってない…うーん…
今後の成長をどうぞ温かい目で、守りください！