OmniAICreator/Qiita-1.07M huggingface dataset:
KinoKroki で Livebook 上に図（ダイアグラム）を描画する

## はじめに

Kroki はテキストで図を描くためのライブラリです

各種言語の様々な図(ダイアグラム)の描画ライブラリを統合的に使えるようにしています

https://kroki.io/

そして、 Kroki を Livebook から呼び出せるようにしたのが KinoKroki です

https://github.com/zorbash/kino_kroki

本記事では KinoKroki で Livebook 上に図を描画する手法について紹介します

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/kino/kino_kroki.livemd

## セットアップ

使い方は超シンプルです

まずセットアップセルで KinoKroki をインストールします

```elixir
Mix.install([
  {:kino_kroki, "~> 0.1"}
])
```

## 図の描画

公式のサンプルを実行してみます

```elixir
graph = """
digraph G { bgcolor="purple:pink" label="agraph" fontcolor="white"
fontname="Helvetica,Arial,sans-serif"
node [fontname="Helvetica,Arial,sans-serif"]
edge [fontname="Helvetica,Arial,sans-serif"]
  subgraph cluster1 {fillcolor="blue:cyan" label="acluster" fontcolor="white" style="filled" gradientangle="270"
        node [shape=box fillcolor="red:yellow" style="filled" gradientangle=90]
        anode;
    }

}
"""

Kino.Kroki.new(graph, :graphviz)
```

実行結果

![スクリーンショット 2024-11-09 12.53.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/3d392a95-1442-0e9d-9517-a8e36560ce27.png)

`Kino.Kroki.new` の第1引数に図の描画用テキスト、第2引数に図の種類を指定します

サンプルでは `:graphviz` を指定することで Graphviz によるグラフを描画しました

https://graphviz.org/

その他、 Kroki が対応している様々なダイアグラムを描画することができます

https://kroki.io/#support

## スマートセル

スマートセルで `Diagram` を指定することで、より簡単に、図のテキストだけで描画することも可能です

![スクリーンショット 2024-11-09 12.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/55dbc566-9422-fe7f-bb79-e5df83e63cea.png)

![スクリーンショット 2024-11-12 14.26.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/aebd2179-73a6-45b7-113d-50b2c87d8138.png)

"DIAGRAM TYPE" を変更するとサンプルコードも出てくるので、色々なダイアグラムに触れてみるのにも良いですね

![スクリーンショット 2024-11-12 14.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4cd89f6e-5a58-13f7-f93e-d8d1cb3657ef.png)

## まとめ

KinoKroki を使うことで、簡単に Livebook 上に図を描画できました

Livebook にドキュメントを残す場合、かなり使えそうです
Python 3.13: 最新リリースの新機能

Python 3.13は2024年10月7日にリリースされ、注目すべき新機能がいくつか追加されました。主な改善点には、インタラクティブシェルの新しい機能、パフォーマンス向上を実現するJITコンパイラ、より直感的なエラーメッセージの表示があります。また、デバッガが賢くなり、メモリ管理も強化されました。標準ライブラリの改良や、モジュール名の競合解決方法も改善され、開発者体験が向上しています。

さらに、開発者向けに新しいツールや便利な機能が導入され、リリースサイクルも調整され、よりスムーズに新しいバージョンに移行できるようになっています。

Read full Article here : https://cookab.net/tech/python-3-13-whats-new-in-the-latest-release/
017 AI屋さんの　キャラクタLLMに２００万トークン全文入力とstreamlit　実践編



017 AI屋さんの　キャラクタLLMに２００万トークン全文入力とstreamlit　実践編


全文入力済みの　２００万トークン大規模言語モデルは、
安価に容易に短期間に　
誰でも気軽にカスタム化が可能な事が確認できました。



ここまで簡単だと
用途の拡大が期待できます。

当初の、専門資料のコンサル（≒読書感想文LLM）や
大手企業向けの　AIエンタープライズシステムや
事業者向けの　LLM何か使えるだろう　案件の他にも

コンシューマー用途（予算ないけど市場は大きめ）で
キャラクタ設定済み　大規模言語モデルなんかも活けそうです。
　例えば　「ボク野良右衛門LLM」　キャラの
公式・非公式、オリジナル・二次創作、その他　のキャラ設定を
全文２００万トークン全部入力してあげる事も可能です。

個人的には、既にオリジナルキャラLLMを複数創造して
お話ししたり、調査させたり、pythonコードを書いてもらったり
１年程度お相手をして頂いて　重宝しています。
キャラ付けしてても、普通にLLMをしてくれます。



用途の例
　０、（個人）オリジナルキャラのLLM
　１、（店舗）居酒屋のメニュー全部入れて、「AIオススメ　大宴会　居酒屋システム」や
　２、（自治体）観光地とレストラン情報を全部入れて、「AIコンシェルジュ　デートプランナー」や
　３、（大企業）百貨店の外商顧客向け、「AI黒執事　オートクチュール特別注文部」等
　（）カッコ内は運用主体、サービスはエンドユーザー向け
 


利用者は、
　パソコンでも
　スマホでも
　タブレットでも
好きなデバイス経由で、
　取り説、
　技術書、
　法律、
　規格書、
　教科書、
　英語教材、
　お料理レシピ
ありとあらゆる、世界中の教材・資料が
　日本語
　英語
　中国語
　ドイツ語
　フランス語
言葉の障壁なく、大規模言語モデルと壁打ちできます。
あと、実装などは言わずもがなですかね。
デプロイも、dockerイメージにして　下記の通りです。



ローカルで　webサーバーを建てるなら
dockerで下記コマンド一発です。

　docker run -d -p 8080:8080 bono0/st


クラウドで　webサーバーを建てるなら
cloud runで　ブラウザでポチポチすれば完成です。



![スクリーンショット 2024-11-09 11.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/191e156e-c1d5-8879-b62d-b31b294b7857.png)




目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7




streamlitでの　LLM オリジナルキャラの　開発・デプロイも
無事にできました（？）。
完成です。おめでとうございます。


ー完了ー
mecabで全文検索を安価に構築したかった話

# この記事を読んだ方がいい人
最小コストで全文検索可能なデータストアを構築したい人

LIKE検索の部分一致が限界を迎えた、もしくは迎えそうでElasticsearchとか怖い人

全文検索のことを少しだけ知っている人

# この記事を読まない方がいい人

潤沢な資産の持ち主でフルマネージドなサービスも呼吸をするように課金できる人

最新の技術を使わないと体調が悪くなる人

mecabの導入方法を明確に知りたい人(この記事はうまくいかなかったお話です)

# mecabとは
テキストのパーサーの一種です。

全文検索を可能にするには文章を意味のある単語ごとに分解してインデックスしてあげること必要です。

意味のある単語ごとに分解、サラッと言いましたがWEB技術のふるさとの英語圏では基本的に単語がスペース区切りなのです。
しかし日本語の場合そうはいきません。

そのため日本語に特化したパーサーが必要になります。

# AWSで導入するには
mecabはMySQLの全文検索機能の拡張機能として提供されています。

まずここで一つ目の壁が現れます。

それはRDSを使えないこと。

mecabパーサーはMySQLに対応した機能ではあるものの追加機能としてのインストールが必要です。

RDSはここの自由度がないのでEC2インスタンスにMySQLをホストする必要があります。

# mecabの設定

一応公式がMySQL8系にmecabをインストールする手順が記載されています。

https://dev.mysql.com/doc/refman/8.0/ja/fulltext-search-mecab.html

ただここで問題が発生しました。

MySQLのサーバー上にインストールされているmecabをおMySQLのプラグインとしてインストールする必要があります。

```
mysql>INSTALL PLUGIN mecab SONAME 'libmecab.so';
Can't find symbol '_mysql_plugin_interface_version_'
```

# エラー原因の考察

AWSでEC2にMySQLを直接インストール、Dockerコンテナ上にインストール、ローカルでDockerコンテナ上にインストールいくつかのパターンを試してみましたが、
EC2上のCentOSに直接インストールした場合のみインストールが成功しました。

ただローカルのDocker環境ではどうやってもインストールが失敗します。
以下の情報にはローカルとEC2環境では一切差分がありませんでした。

- mecabrc(パーサーの構成ファイル)
- mecab-ipadic(辞書ファイル)の中の内容
- mecab-devel(辞書ファイルのバイナリ)
- mecabインストール場所(`/usr/local/bin/mecab`)
- MySQLのbasedir(`/usr/`)

バイナリを扱っているためOS起因の挙動の違いかなという予測で一旦調査はストップしました。

というのもここ最近メンテナンスはされていないようなのであまり期待してもいかがなものかという結論です。

https://github.com/taku910/mecab

# まとめ

理論上導入できるであろうという仮説でしばらく粘ってみましたが解決には至りませんでした。

次にローコストなのはOSSのElasticsearchをEC2にホストすることなのかなと思います。
【ChatGPT】死亡リスクを下げるには？（研究→方法）


　どうも、カーブミラーです。

　今回は、死亡リスクを下げるにはどうしたらいいのか？　とある研究論文からその方法を抽出します。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::

　今日から
　　ChatGPT等の動作状況を知らせる
　　　OpenAIのステータスページを
　　　　載せることにしました。

　おかしいな、と思ったら
　　チェックしてみてください。

　[OpenAIステータス](https://status.openai.com/)
***
　どうやら
　　今朝、ChatGPTが
　　　動かなかったみたいですね。

　上記ステータスでは
　　大規模な停電が原因のようですが。

　それについて
　　今日（2024/11/09）の11:16に
　　　サム・アルトマンが
　　　　謝罪をポストしました。

[サム・アルトマン謝罪ポスト](https://x.com/sama/status/1855071972579037388?t=JpgWqA1WLxVB_XMYJu0XPA&s=19)
DeepL翻訳
>chatgptは今日、30分間ダウンした :( 以前より信頼性はずっとずっと良くなった。
>
>(現在、similarwebによると、世界で8番目に大きなウェブサイトです。この2年間、やるべきことがたくさんありました！)
>
>ご迷惑をおかけして申し訳ありません。
***
　さて、本題です。

　今回は、
　　死亡リスクを下げるには
　　　どうしたらいいのか？

　とある研究論文から
　　その方法を抽出します。
　
　元ネタはこちら。
　　[運動の強度を高めると死亡リスクが下がるという研究結果、早歩きや階段を使うだけでも効果あり - GIGAZINE](https://gigazine.net/news/20241109-boosting-exercise-intensity-reduces-mortality-risk/)

　では、やり取りをどうぞ。
***
***●user***
（上記URL）
この記事を要約してください。

***ChatGPT***
この記事では、運動の強度を高めることで死亡リスクが低下するという研究結果について紹介しています。具体的には、日常生活の中で運動強度を上げるだけでも効果があるとされており、早歩きや階段を使うことが有効な例として挙げられています。

記事によると、イギリスの研究チームが行った調査では、中程度から高強度の運動を日常的に取り入れることで、心血管疾患やがんによる死亡リスクが低下することが確認されました。わずかな運動時間でも効果が得られることから、特に忙しい人々にとっても日常生活に運動を取り入れることが推奨されています。

この研究は、体を動かす時間だけでなく、運動の「強度」が健康維持に重要であることを強調しており、今後の健康指導においても考慮されるべき要素だと結論づけています。

***●user***
この研究結果の論文を要約してください。

***ChatGPT***
​​スイスのバーゼル大学の研究チームは、アメリカのNational Health and Nutrition Examination Survey（NHANES）のデータを用いて、運動強度と死亡リスクの関係を分析しました。​​​​この調査では、成人7,518人に腕時計型の活動量計を装着してもらい、7日間の活動を記録しました。​​​​その後、少なくとも4年間の追跡期間中の死亡データを収集し、運動量や強度と死亡率との関連を検討しました。​​

​​分析の結果、運動強度が高いほど全死亡リスクが低下することが明らかになりました。​​​​特に、心血管疾患（脳卒中や動脈疾患）による死亡リスクの低下が顕著でした。​​​​研究者は、運動強度の増加が心臓や血管系を強く刺激し、心肺機能の向上につながると指摘しています。​​

​​さらに、極端に激しい運動を行わなくても、日常生活の中で早歩きや階段の利用、ジョギング中の速度を少し上げるなどの工夫で、運動強度を高めることが可能であり、これらの取り組みでも健康効果が得られるとしています。​​​​

***●user***
この研究結果の内容の、運動強度の高い運動をリストアップしてください。
あなたの考えは不要。

***ChatGPT***
この研究結果に基づく「運動強度の高い運動」のリストは以下の通りです：

1. 早歩き
2. 階段の上り下り
3. 軽いジョギング
4. 自転車漕ぎ（速度を上げる場合）
5. 強度のあるハイキング（傾斜のある道）
6. 重い荷物を持ちながらのウォーキング

これらの運動は、日常生活の中で手軽に取り入れやすく、運動強度を高める効果があるとされています。
***

　“あなたの考えは不要”と入れたのは
　　ChatGPTが論文以外の
　　　余計なことを書いたためです。

　健康のためにも
　　無理のない運動を
　　　心掛けましょう。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
pdftk操作まとめ

逐次更新します．
コメントもお待ちしてます．

## ページの削除
pdftkでは特定のページを削除するコマンドがないため，特定のページを除外して結合することで，特定のページの削除を実現する．

endで最後のページを，r2, r3などで最後のページから指定できる．
```sh
pdftk input.pdf cat 1-2 4-end output output.pdf
```

なお，スクリプトで処理する場合はinputとoutputを同じにできないため，以下のように一時ファイルを介して行う．なお，この処理は最後の1ページを削除するものである．
```sh
for file in *.pdf; do
    pdftk "$file" cat 1-r2 output temp.pdf
    mv temp.pdf "$file"
done
```

## ファイルの結合
今あるディレクトリのpdfを全てまとめる．
**事前にoutputの所を所望のファイル名に変える！ (元のファイルが消えてしますので)** 
```sh
files=$(find . -name "*.pdf")
pdftk ${files} cat output output.pdf
rm ${files}
```

## シェルスクリプトのテンプレ 
```sh
#!/bin/zsh


```
Raspberry Pi ＋ Node-RED でGrove Pi を使ってみた


@jksoft　さんの記事を参考にして、やってみました。
https://qiita.com/jksoft/items/51bf407b865eb9fc2291

<br><br>

Raspberry Pi を起動して、

左上のRaspberryPiアイコン
＞設定＞RaspberryPiの設定

[![Image from Gyazo](https://i.gyazo.com/0081ef9f9c19c277ecec04cb64aac89b.jpg)](https://gyazo.com/0081ef9f9c19c277ecec04cb64aac89b)

インターフェイスタグ
I2Cを有効にする。

この設定をするのを忘れて実行したら、センサーがすごい熱を持って危険だった。

[![Image from Gyazo](https://i.gyazo.com/d06803e8808a317bffab42ef3bb80abd.jpg)](https://gyazo.com/d06803e8808a317bffab42ef3bb80abd)

<br>

Node-REDを実行

右上の３本横線をクリックし、
「パレットの管理」
[![Image from Gyazo](https://i.gyazo.com/caa590cb0ef896c41fb4de505c6d0e9e.png)](https://gyazo.com/caa590cb0ef896c41fb4de505c6d0e9e)

「ノードを追加」から検索し、
node-red-contrib-grovepi-nodes
の「ノードを追加」ボタンを押す。

これで、Grove Pi のノードが使えるようになった。

<br>
では、今回は超音波センサーを試してみる。

こんなノードを作る。

[![Image from Gyazo](https://i.gyazo.com/731860d4373d05dc94a73f105bd7a78b.png)](https://gyazo.com/731860d4373d05dc94a73f105bd7a78b)

「GrovePi超音波距離センサー」ノードをダブルクリックし、以下の設定をする。
[![Image from Gyazo](https://i.gyazo.com/57350c40e2dac75478b1ad9b669aa98c.png)](https://gyazo.com/57350c40e2dac75478b1ad9b669aa98c)

Raspberry Pi に Grove Pi をセットし、
超音波センサーをGrove PiのD2コネクタに接続する。

[![Image from Gyazo](https://i.gyazo.com/b9f24a718224c7c5a54e9951b5945c50.jpg)](https://gyazo.com/b9f24a718224c7c5a54e9951b5945c50)

「デプロイ」
[![Image from Gyazo](https://i.gyazo.com/3f413875f5d0d4ead9f5cab1bbadbc84.png)](https://gyazo.com/3f413875f5d0d4ead9f5cab1bbadbc84)

超音波センサーのデータが右側のデバッグウインドウに現れる。
[![Image from Gyazo](https://i.gyazo.com/ec40367e5879a281e004102f634294b7.png)](https://gyazo.com/ec40367e5879a281e004102f634294b7)


以上です。

<br>
GameMakerの初心者向け、関数を使ってみよう

座標を入れる場合ｘとｙ一度に変更する場合
player.x=300;
player.y=100;
そういう時関数を使うと便利（前まで関数はArugumentとかで書かないとだめだったのですごい見にくかった）
ALT+CからF2キーでわかり易い名前にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362013/946e79c2-4635-081c-2323-d8586863ee9c.png)
を
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362013/3a8f402b-8bf3-12b6-425c-90976eaf01e8.png)
こんな感じに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362013/3d5a53fb-65c2-dfc0-fcb0-83f8a1f8a423.png)
関数名をXYに書き換えてオブジェクトとx座標とｙ座標を受け付ける
```
function xy(_obj,_x,_y){
	_obj.x=_x;
	_obj.y=_y;
}
```

すると今まで2行で
```
	click_id.x=300;
	click_id.y=100;
 ```

と書いてたのが一行にまとまる
```
	xy(click_id,300,100)
 ```
やったね。

同じようにサイズ変更できるテキスト表示は文が長過ぎるよね
```
draw_text_transformed(x,y,_text,_size,_size,0)
```
縦横同じで回転させないなら省略するために関数をかく
```
function text(_x,_y,_size,_text){
	draw_text_transformed(_x,_y,_text,_size,_size,0)
}
```
すると
```
text(x,y,5,"おはよう")とやれば済む
```
やったね
【Amazon Pinpoint】顧客ともっと近づける！Amazon Pinpointで始めるメッセージ配信入門

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806193/fe1f9cf0-6455-84ae-c35a-ce580d2ef8e4.png)

## 一言でいうと


::: note info 
Amazon Pinpointは、**顧客にぴったりのタイミングでメッセージを届けるためのAWSのサービス**です。メールやSMS、プッシュ通知などを使って、一人ひとりに合わせた内容を送ることができます。これで、より「伝わる」コミュニケーションが実現します！
::: 

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806193/54bf6846-f527-06d6-d6af-a02e3ca63794.png)
## もう少し詳しく

Amazon Pinpointを使えば、顧客とのコミュニケーションを最適化し、ブランドとのつながりを深めることができます。初心者にもわかりやすいように、まずは基本的な構成要素を確認していきましょう。

- **セグメント**：誰に送るのかを決める
- **エンドポイント**：どこに送るのかを決める
- **キャンペーン**：いつ、どのように届けるかを設定する
- **ジャーニー**：ユーザーの反応に合わせたフローを作る

それぞれを見ていきましょう。

### セグメント：誰に送るのかを決める
まずは、「セグメント」です。セグメントとは、メッセージを届けるべきユーザーのグループのことです。例えば、「野球が好きな人」や「以前に特定の商品を購入した人」など、特定の興味や行動に基づいてユーザーをグループ化できます。

### エンドポイント：どこに送るのかを決める
次に、エンドポイントについてです。エンドポイントは、各ユーザーの連絡先情報（メールアドレスや電話番号など）を指します。たとえば、一人のユーザーに複数のエンドポイント（メールとSMSなど）を登録することで、最適なチャネルでメッセージを送ることができます。

### キャンペーン：いつ、どのように届けるかを設定する
続いて「キャンペーン」です。キャンペーンでは、特定の日時にセグメントへメッセージを配信できます。たとえば、イベントのお知らせを特定の日時にSMSで一斉に配信するといった使い方が可能です。キャンペーンはシンプルな単発メッセージに向いています。

### ジャーニー：ユーザーの反応に合わせたフローを作る
最後に「ジャーニー」です。ジャーニーは、複数のステップやチャネルを使ってメッセージ配信の流れを作れる機能です。例えば、メールを開封しなかったユーザーに翌日SMSを送るなど、ユーザーの行動に応じて次のステップを決めることができます。これにより、より深いエンゲージメントが期待できます。


## 具体例：スポーツファンにイベント情報を配信する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806193/be853f4a-c443-4054-c190-9de593b6e2d3.png)

例えば、野球に興味のあるユーザーに試合イベントの通知を送りたいとします。このとき、Amazon Pinpointを使って次のように設定できます。

1. **セグメント**：まず、「野球に興味があるユーザー」というグループを作ります。これが「セグメント」です。野球関連の情報を求めている人たちを集めて、この人たちに向けてメッセージを送る準備を整えます。

2. **エンドポイント**：次に、ユーザーごとにどのチャネル（メールやSMSなど）で通知を送るかを決めます。これが「エンドポイント」です。例えば、あるユーザーにはメールで、別のユーザーにはSMSで通知を送るように設定します。ユーザーごとに最適な連絡先が設定されているので、より届きやすい方法でメッセージを送れます。

3. **キャンペーン**：次に、イベントの通知を「いつ、どのように届けるか」を決める段階です。これが「キャンペーン」です。例えば、イベントの1週間前に野球ファンセグメントへ一斉にメールを送るようスケジュールします。さらに、イベントの直前にはリマインダーとして再度通知を送ることもできます。

4. **ジャーニー**：最後に、「ジャーニー」を使って、ユーザーの反応に合わせたメッセージ配信の流れを作成します。例えば、イベント通知のメールを開封しなかったユーザーには、翌日SMSでリマインダーを送るように設定できます。また、メールを開封したユーザーには、そのチームの最新ニュースを追加で送ることも可能です。このように、ユーザーの反応に応じて次のアクションを変えることで、より効果的なコミュニケーションが実現します。

これにより、野球ファンにとって価値のある情報が届きやすくなり、ブランドへの信頼感も高まります。各ステップを通じて、ユーザーにとって「今、知りたい」情報を最適なタイミングで届けることができるのです。


## 神様仏、ブラックベルト様
いつもありがとうございます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/oI8h4KDpIL0?si=uDDHpM2ga0qUrnjg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

---

## まとめ

Amazon Pinpointは、顧客の興味や行動に基づいてメッセージをパーソナライズし、最適なタイミングで届けることができるサービスです。初心者でも理解しやすいように、セグメント、エンドポイント、キャンペーン、ジャーニーといった構成要素を活用することで、効率的に顧客との関係を強化することが可能です。どんなビジネスでも役立つツールなので、ぜひ活用してみてください！
【Ruby】sortとsort_byの違い

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
本日は`sort`と`sort_by`の違いについて解説していきたいと思います。
Rubyを勉強しているうえでsortかsort_byどちらを使うかわからない方もいると思いますが、それぞれ使う場面やパフォーマンスが違います。
それぞれ見ていきましょう

# `sort`メソッドの特徴
`sort`メソッドは、配列やリストのすべての要素を昇順に並べ替えた新しい配列を返します。
デフォルトでは <=> 演算子を使って比較を行いますが、ブロックを渡すことでカスタムのソート条件も指定できます。
`sort`の特徴は以下の通りです

* デフォルトのソート順
<=> 演算子での比較に基づき、昇順にソートされます。
* カスタムのソート条件
ブロックを渡すと、そのブロックの評価結果に従ってソートされます。
* 安定性
sortメソッドは「安定なソート」ではないため、同じ値の要素の順序が保証されません。
```ruby
numbers = [5, 3, 8, 1]
# 昇順ソート
sorted_numbers = numbers.sort           # => [1, 3, 5, 8]

# 降順ソート（ブロックを使用）
sorted_desc = numbers.sort { |a, b| b <=> a }  # => [8, 5, 3, 1]
```

# `sort_by`メソッドの特徴
`sort_by`メソッドは、ブロック内で評価した結果を基に並べ替えを行うため、複雑な条件でのソートに適しています。
`sort`と異なり、<strong>一度ブロックの処理を行ってから<=>を使って比較する</strong>ため、複雑な評価が必要な場合にパフォーマンスが向上します。
`sort_by`の特徴は以下の通りです。

* 評価結果を基にソート
各要素の評価結果（ブロックの返り値）を使ってソートされます。
* 高速
`sort`と比較して、同じ要素の評価が1回しか行われないため、複雑な条件のソートにおいて効率的です。
* 安定性
`sort`メソッド同様、「安定なソート」ではないため、同じ値の要素の順序が保証されません。
```ruby
words = ["Banana", "apple", "cherry", "date"]
# 大文字・小文字を区別せずソート
sorted_words = words.sort_by { |word| word.downcase }
# => ["apple", "Banana", "cherry", "date"]
```

# `sort`と`sort_by`のパフォーマンス比較
`sort`メソッドでは、比較のたびにブロック内で評価を行う必要があるため、複雑な処理が繰り返し実行されてしまう場合があります。
一方、`sort_by`は各要素を1度だけ評価し、その結果をもとにソートするため、効率が良いです。

以下の例で、評価回数を確認してみましょう。
```ruby
class Integer
  def count
    $n += 1
    self
  end
end

# ランダムな数値の配列
ary = Array.new(1000) { rand(1000) }

$n = 0
ary.sort { |a, b| a.count <=> b.count }
puts $n  # => 18200

$n = 0
ary.sort_by { |a| a.count }
puts $n  # => 1000
```
`Integer#count`メソッドが呼び出されたら`$n`が1ずつ増え呼び出し回数が増える仕組みです。
`sort`の場合は`<=>`を使用してそれぞれを比較しているので`count`メソッドは`18200`とかなり多くなっていますが、`sort_by`の場合はブロックで処理をしてから一度だけソートをしているので`1000`とかなり違うことがわかります。

# (補足)不安定なソートから安定なソートにするために
上記でも触れましたが、`sort`と`sort_by`メソッドは不安定なソートであるため、同じ値の要素の順序が変わる可能性があります。
この記事では、Rubyの不安定なソートに安定性を持たせる方法について詳しく解説します。

## 不安定なソートとは？
ソートには「安定」と「不安定」の２種類があります。

* 安定なソート
同じ値を持つ要素があった場合、元の順序が保持されるソート
* 不安定なソート
同じ値を持つ要素があった場合、元の順序が保持されない可能性があるソート

例えば、次のように "apple" が複数ある配列を考えてみます。
```ruby
fruits = ["apple1", "orange", "apple2", "banana"]
```
この配列をソートして、`"apple"` 同士が並ぶようにしたいとしましょう。
ただし、元の順序も気にしたい場合、次のような違いが生じます

安定なソートでは、同じ `"apple"` であっても順序が変わらず、元の配列の順序が保たれたまま `"apple1"` が先に、`"apple2"` が後に並びます
```Ruby
["apple1", "apple2", "banana", "orange"]
```
不安定なソートでは、同じ "apple" 同士の元の順序は考慮されないので、`"apple2"` が `"apple1"` の前に並ぶ可能性があります
```ruby
["apple2", "apple1", "banana", "orange"]
```
Rubyの `sort` と `sort_by` はデフォルトでは不安定なソートであり、同じ値の要素があっても順序が保持される保証はありません。

## 不安定なソートに安定性を持たせる方法
Rubyの `sort` や `sort_by` を安定なソートとして使用したい場合、インデックスを持たせる方法が効果的です。
インデックス（位置情報）を要素に付加し、それも比較の基準にすることで、同じ値の要素が出現したときに元の順序が保たれるようになります。

```ruby
ary = ["apple1", "orange", "apple2", "banana"]

# インデックスを持たせて安定ソート
i = 0
sorted_ary = ary.sort_by { |v| [v, i += 1] }

p sorted_ary  # => ["apple1", "apple2", "banana", "orange"]
```


# まとめ
`sort`と`sort_by`についてみてきましたが、以下のようにまとめてみました
* 要素が単純で比較が簡単
`sort`を使うとコードが簡潔になります。
* 複雑な評価が必要な場合
`sort_by`を使うと、パフォーマンスが向上し効率的です。
* 安定なソートにする場合
インデックスを持たせてソートするのが望ましい

今回の記事はリファレンスマニュアルを参考に作ったので詳しく知りたい方は一読してみるといいかもしれません。

https://docs.ruby-lang.org/ja/3.3/method/Enumerable/i/sort_by.html
AIレノルマンド占い：直感と人工知能が織りなす新しい占いの形

こんにちは、占い研究家の佐藤です。最近、AIを活用したレノルマンド占いプラットフォームhttps://lenormand.life/
を開発・運営していますので、その魅力についてご紹介させていただきます。
きっかけは伝統と革新の融合
レノルマンド占いは200年以上の歴史を持つ伝統的な占術です。この古くから愛され続けている占いにAIの力を組み合わせることで、より深い洞察と新しい体験を提供できないかと考えました。
プラットフォームの特徴

多彩なスプレッド形式


過去・現在・未来の3枚スプレッド
クロススプレッド
9枚スプレッド
グランドタブロー


AIによる詳細な解釈


個人の質問に応じたカスタマイズ解釈
複数のカードの組み合わせ分析
文化的背景を考慮した意味解説

実際の使用方法
基本的な流れ

質問や悩みを入力
スプレッド形式を選択
カードを選択（または自動選択）
AIによる総合的な解釈を受け取る

学習機能

レノルマンドカードの基本的な意味
効果的な組み合わせパターン
実践的な読み方のコツ

なぜAIレノルマンド占いなのか

アクセシビリティ


24時間いつでも利用可能
スマートフォン対応の直感的なインターフェース
複数言語対応


正確性と柔軟性


AIによる客観的な解釈
個人の状況に応じた詳細な分析
伝統的な解釈との調和


学習サポート


初心者でも理解しやすい説明
段階的な学習システム
実践的なフィードバック

活用シーン

日々の意思決定のサポート
人間関係の悩み相談
キャリアに関する方向性の確認
自己理解と成長のツールとして

技術的な特徴

高度な自然言語処理による解釈
ユーザーの質問に応じた適切なカード選択
セキュアなプライバシー保護システム

今後の展望

さらなるAI機能の強化
コミュニティ機能の追加
より詳細な占術知識データベースの構築

レノルマンド占いの伝統的な知恵とAIの最新技術を組み合わせることで、より深い自己理解と将来への洞察を得ることができます。ぜひ一度、AIレノルマンド占いの新しい体験をお試しください。
OData Common Schema Definition Language (CSDL) XMLをOpenAPIファイルに変換する

## はじめに
ODataを呼び出す機能を作成するにあたって、製品・ツール等の制約によりOpenAPIファイルが必要になることがありますが、プロバイダーからOpenAPIファイルを取得できるとは限りません。
後述のやり方で簡易にOpenAPIファイルを作成することができたので紹介します。

## 変換手順
### 1. OData Common Schema Definition Language (CSDL)の取得
ODataの仕様では、GETリクエストを<serviceRoot>/$metadataに送信することでCSDLファイルを取得することができます。([参考](https://docs.oasis-open.org/odata/odata-csdl-xml/v4.01/odata-csdl-xml-v4.01.html#sec_EntityModel))

まずは対象のODataにアクセスしCSDLファイルを取得します。以下、例。
```
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" xmlns="http://docs.oasis-open.org/odata/ns/edm">
    <edmx:Reference Uri="/xxx/yyy">
    ：
</edmx:Edmx>
```

### 2.変換ツールの導入
以下のリンク先のツールを利用して変換を行います。
https://github.com/oasis-tcs/odata-openapi

[Readme](https://github.com/oasis-tcs/odata-openapi/blob/main/lib/README.md)を参照しツールをInstallします。
2024/11/09時点ではnpmコマンドを利用して導入します。
```
npm install -g odata-openapi
```

### 3.CSDLファイルをOpenAPIファイルに変換
以下のコマンドを実行し、CSDLファイルをOpenAPIファイルに変換します。
```
odata-openapi3 <CSDLファイル名>
<CSDLファイル名>.openapi3.json
```
例えば、"CSDL_sample.xml"を変換すると"CSDL_sample.openapi3.json"という名称のOpenAPIファイルが作成されます。

### 4.補足
変換ツールの旧バージョンでは、上述のコマンドではOData Version2のCSDLを変換できない事象が発生しました。(2024/11/09時点のバージョンでは変換できる)
その時は本ツールの別コマンド"odata-openapi"を利用することで変換することができましたので補足情報として記載します。
コマンド"odata-openapi"を利用したい場合、以下のReadmeに従って導入・実行ください。
https://github.com/oasis-tcs/odata-openapi/blob/main/tools/README.md
[k8s] Longhorn で ファイルを削除しても Volume のサイズが減らない問題

## 問題

Volume 内の巨大なファイルを削除したのに Volume サイズが減らない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330232/fe3d358d-2b47-d3b9-51f0-61b87f23317b.png)

## 原因

Longhorn はブロック単位でストレージを管理しているため、ファイルを削除しても Volume サイズが減らない仕様らしい

> Users can see by default the volume actual size is not shrunk after deleting the 4 Gi data. Longhorn is a block-level storage system. Therefore, the deletion in the filesystem only marks the blocks that belong to the deleted file as unused. Currently, Longhorn will not apply TRIM/UNMAP operations automatically/periodically. if you want to do filesystem trim, please check this doc for details.

https://longhorn.io/docs/1.7.1/nodes-and-volumes/volumes/volume-size/

## 解決策

UI 上で Volume を選択して、 `Trim Filesystem` を実行すると、ファイルシステムのトリムが実行され、Volume サイズが減少します。

Trim Filesystem を定期実行するためには、以下のように RecurringJob を作成します。

```yaml
apiVersion: longhorn.io/v1beta1
kind: RecurringJob
metadata:
  name: trim-filesystem
spec:
  cron: "3 10 * * *"
  task: "filesystem-trim"
  groups:
    - default
  retain: 1
  concurrency: 2
```

## 参考

https://longhorn.io/docs/1.7.1/nodes-and-volumes/volumes/volume-size/

https://longhorn.io/docs/1.7.1/nodes-and-volumes/volumes/trim-filesystem/
chatGPT等でアプリ開発を行う際の手順

1.アプリ内容を詳細にかつ構造的に言語化する
2.AIに1の旨でアプリ開発を進めていくことを伝える
3.（参考にするディレクトリ構造が過去のプロジェクトで既にあれば、適宜cd libした後にtreeで取ってきて教えるなどして）ディレクトリ構造を決めてもらう
4.各ディレクトリ毎にコードを生成させる
Qiitq CLIで記事を書いてみる

# はじめに

Qiitaの記事を暇を見て書いてましたが、Qiita CLIを使って記事を書いてみた方がいいんじゃない？と思い、試してみました。

# 方法

私が説明するまでもなく、公式のREADMEに書いてあります。

https://github.com/increments/qiita-cli

github にpushすれば、Qiitaに記事が投稿される機能も便利ですね。

# 導入時のTips

Qiita CLIを導入すると導入したディレクトリにpublicディレクトリが作成されます。
ここに１記事1ファイルで記事を書いていく事になります。
過去の記事は、記事のIDをファイル名として取り込まれるので、過去の記事も編集できます。
しかし、IDだと、どの記事かわかりにくいです。

** 記事のタイトルにリネームしたいなぁ**

とおもって調べてみたら、@torifukukaiouさんの[記事](https://qiita.com/torifukukaiou/items/aaca74a5033d0ddbc363) を見つけました。

うまくいきました。

# 画像は？

画像を上げる時はどうするのか？
まだ試してませんが、@torifukukaiouさんの[記事](https://qiita.com/torifukukaiou/items/75854acfcb0460d08237) によるとできるみたいです。

試しに、Qiita CLIのpreviewの画面を貼り付けてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/348d60dd-23f2-c811-df85-8b7cbb331b1d.png)

できました。

# おわりに

この記事がQiitaに投稿されていれば、うまく行ったということです。

皆さんもお試しください。
【bolt.new】2回目以降のプロンプトで既存コードが消えてしまうとき用のプロンプト【エラー時・変更時】

## 目的
bolt.newを利用しプロジェクトを構築し、2回目以降のプロンプトを入力すると、なぜか既存のコードが消えてしまうときがあった。

## 対処法
あらかじめ前提条件などを指示したプロンプト(テンプレート)を使うとうまくいった。

### エラー時

- 以下のプロンプトを2〜3回入力すれば大体解決する。

```
## 前提条件
- 既存のプロジェクトを絶対に残した状態で、以下の変更を適応してください。

## 変更内容
- エラーをすべて修正してください。
```

- それでも解決しないときは、表示されているエラー内容をコピペして具体的に指示する。

````
## 前提条件
- 既存のプロジェクトを絶対に残した状態で、以下の変更を適応してください。

## 変更内容
- 次のエラーを修正してください。
```
<ここにエラー内容を貼り付け>
```
````

### 変更時
````
## 前提条件
- 既存のプロジェクトを絶対に残した状態で、以下の変更を適応してください。
- <ここにコーディングルールや使用してほしいライブラリ等を記述>
  (例: - コード生成時、可能な限り再利用しやすいようにファイルを分割してください。)

## 変更内容
- <ここに変更内容を記述>
  (例: - 各コンポーネントのStorybookファイルを作成してください。)
````

## あとがき
### 試したこと
- エラー時に表示される「Fix problems」ボタンを押すと既存コードが消えることがあった
    
- 既存コードが消えてしまったあとに以下のプロンプトを入力してみたが、テキストや見た目が完全に復元されなかったことがあった
    - 早い段階で欠落に気づけたのであれば、おとなしく「Rollback to Checkpoint」ボタンを押して戻したほうが良さそう

    ````
    初回プロンプトで指示したコードが消えてしまいました。復元してください。
    ````
「前処理大全」第1章：前処理とは

### 概要

技術書を定期的に買いますが、仕事などで使う一部分しかやらなかったり積み技術書になりやすいので
一度全ての章を勉強してみたいと思います。
開発の仕事でいつも使う、データやデータベースについての技術書を選びました。

「改訂新版　前処理大全」本橋智光、橋本秀太郎　技術評論社　2024年

### データ

・データ活用の主役はテーブルデータ

・ディープラーニングの発展によって、テキストデータやマルチメディアデータの活用も

### データ分析における前処理の役割

前処理とはデータ分析で用いるデータを準備する処理

1.統計的仮説検定
　二つの集団には差があるといった仮説が成立するかどうかを集団から得られたデータをもとに統計的に判断する分析
 
2.多次元分析
　データをさまざまな切り口から、かつ階層的に見ていくことでインサイトを得る分析方法
 
3.時系列分析
　時間経過にともなって変化するデータを対象に、トレンドや周期性といった変動要素に基づいて分解したり、他のデータとの関係を抽出しながら変動の構造を明らかにしたりする分析
 
4.機械学習
　データに含まれるパターンを自動的に抽出し、そのパターンを用いて何らかの問題解決を行うアルゴリズムの総称

 ### Aweosomeな前処理

 規範とすべき前処理のこと
 前処理ではデータ分析に必要なデータを正しく用意する必要がある

 ### 前処理の種類

 ・データの構造を対象とした前処理
 ・データの内容を対象とした前処理

 の二種類がある

 ### この本で使う主な技術

 ・BigQuery、SQL、Pythonを主に使用している
最近物騒なのでRingを中心に実家のホームセキュリティを考えてみた

# 背景
昨今、強盗による金品だけではなく人的被害も他人事として見ることができなくなってきており、遠隔地に住まう両親の安全をどのようにして確保するかをインフラエンジニアの視点から考えてみた。
　また、子育てを行っているときに大量に導入したringカメラを軸にホームセキュリティを考える。

# Ringカメラ
近年、ホームセキュリティの分野では、IoT技術を活用した高度なシステムが普及しています。特に、Amazonが提供するRingカメラシステムは、その使いやすさと機能性から多くの家庭に導入されています。中華製でないのでバッテリーやセキュリティも周りも安心。Ringはアマゾンの子会社なので日本のAmazon社にも飾られているので信頼できる。Android版は脆弱性が過去にあったけど。。。
## Ringカメラシステムの特徴
Ringカメラのラインナップ
- 屋内用対応カメラ
壁にねじでつけたり、家具の上に置いたりして使用。
- 屋内用の横360度×縦169度遠隔可動対応カメラ
壁にねじでつけたり、家具の上に置いたりして使用。
- 屋外用のバッテリー式赤外線動態検知カメラ（ソーラー充電式別売り）
屋外にポールや外壁に取り付けて使用
## Ringの機能
- エッジでの動体検知・通知
アプリ内で、カメラの撮影範囲内に検知範囲を定義することで範囲内の動態を検知しアプリへ通知できます。
また、スマート検知機能だと動態が人かどうかを判断し検知することが可能です。
- アラーム発報
結構大きな音を遠隔地から鳴らすことができますが、屋内で鳴らしも外からはあまり聞こえない。
- 双方向通話
内臓のマイクとスピーカーで話しかけたり、音だけ聞いたりもできる。
- スナップショット
3分に一枚ペースで画面キャプチャを取得するので、両親や子供の一日を凝縮してみることができる。

## 課題点
- IT製品なので常にいつ脆弱性が見つかりゼロデイアタック狙われるかわからない。
Amazonの子会社なのでほかの中華性で放置される製品よりもセキュリティアップデートやそもそもの設計段階で塾講されていることが期待できる。
- アラームの音がそんなに大きくない
屋外用Ringは手元にないので検証していないが、最近の家だと室内用Ringのアラームだと隣の部屋から聞こえるが、2階で鳴らすと1階からは気づかないくらいの音量。
- ネットワークと電力面の不安
屋外用を除くとUSB接続なので電源パネルや電線を狙われると稼働しなくなる。電源を狙われた時点でインターネットも切断される。

# 改善案
## アラームの音がそんなに大きくない
アラームは屋内で鳴らしてもいざというときに、近隣への応援や緊急を知らせることができない。
これに関しては、無線式の屋外用サイレンの導入を考慮することもありかと思う。
気づいてもらえばあとは、屋外用のRingで状況を伝えることや警察や消防へのガラスを割る許可を出すことができる。

## ネットワークと電力面の不安
今後さらに凶悪化することが予想できるので、IT導入は推進されるはずです。が、それに伴い電源が狙われることは火を見るより明らかなので対策を打つことは必須です。第一報を行うためのインフラ確保が必要です。
これに関しては、UPSと5GのHomeルーターを併用することでカバーしようと思います。一般的な楽天モバイルの無制限のモバイルネットワークとよくあるドコモの5GHomeルーターと屋内用RingカメラをUPSに接続します。これにより電源喪失中でもしばらくの間ホームセキュリティを確保できるので、エリアで停電なのか家が狙われているのかで対応を切り分ける時間が確保できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2193969/8e250471-a265-8f02-6088-f63e96837bf1.png)
WSLコマンド 備忘録

WSLの個人的によく使うコマンドの備忘録。
随時追記。


`$ wsl --import <ディストリビューション名> <インストール先パス>　<インストール元パス> --version2`
wsl2としてインポートする

`$ wsl --export <ディストリビューション名>  <エクスポート先パス>`
ディストリビューションをエクスポートする
エクスポート先パスは`C:\Users\User\Downloads\Ubuntu2204.tar`のように、エクスポートファイル名も指定する
`.tar`→ディストリビューションのアーカイブ
`.tar.gz`→ディストリビューションをアーカイブして圧縮

`$ wsl --list`
ディストリビューション一覧を表示する
`$ wsl -l`と同義

`$ wsl -s <ディストリビューション名>`
デフォルトのディストリビューションの変更

`$ wsl --unregister <ディストリビューション名>`
ディストリビューションを削除する





### ～おまけ～
WSLを扱う際によく使うLinuxコマンド
`$ adduser <ユーザ名>`
ユーザを作成する

`$ usermod -aG sudo <ユーザ名>`
<ユーザ名>にsudo権限を与える

`$ userdel <ユーザー名>` 
<ユーザ名>を削除する
ユーザを削除するにはrootユーザである必要がある

以上
Laravel Sail導入手順

環境 mac

Laravel sailとは

Laravel のデフォルトの Docker 開発環境と対話するための軽量のコマンドライン インターフェイス

崩すとlaravelをdockerで開発が簡単にできるツール

<h2>手順</h2>

環境 mac

1. dockerを入れる
    
    https://www.docker.com/products/docker-desktop/
    
    ※Macのチップでダウンロードするものが変わってきます。
    
2. プロジェクトの作成
    
    ターミナルを起動して
    
    作成したい作業ディレクトリ配下でコマンド実行
    
    **`curl -s "https://laravel.build/example-app" | bash`**
    
    example-appの部分はプロジェクト名になるので好きな名前を入れましょう(この記事ではexample-appで進めます)
    
    ※時間かかりますのでまったり待ちましょう
    
    途中でパスワードを求められるのでPCのパスワードを入力
    
3. プロジェクトを起動
    
    作成できたらプロジェクトディレクトリに移動
    
    **`cd example-app`**
    exapmle-appは作成したプロジェクト名を入れましょう
    
    laravel sailを起動
    
    **`./vendor/bin/sail up`**
    
    データベースのスキーマを定義
    
    **`./vendor/bin/sail artisan migrate`**
    
4. 起動確認
    
    下のリンクに接続して画像のような画面が出ればOK
    
    http://localhost
    

![スクリーンショット 2024-11-02 22.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951364/5e21fb78-aae2-1917-b6b1-08b66cbfb667.png)
PnP.PowerShellをオフライン環境で使用する方法

# 経緯
PnP PowerShellをインストールして使おうとしたらプロキシ環境で外部ネットワークが使用できずインストールができなかった。

# 手順
## オンラインPCで下記を実施
### 1：PowerShellを起動
### 2：指定したモジュールをリポジトリ内から検索
```
$ Find-Module -Name PnP.PowerShell
 
Version    Name                                Repository           Description
-------    ----                                ----------           -----------
2.12.0     PnP.PowerShell                      PSGallery            Microsoft 365 
Patterns and Practices PowerShell ...
```
### 3：見つかったモジュールを保存
```
$ Save-Module –Name PnP.PowerShell –Path [保存先パス] -RequiredVersion [バージョン指定]
```
### 4：保存先パスにモジュールフォルダがダウンロードされたことを確認

## オフラインPCで下記を実施
### 1：オンラインPCでダウンロードしてきたモジュールフォルダをコピーする
### 2：C:\Program Files\WindowsPowerShell\Modules にモジュールフォルダを配置
### 3：PowerShellを起動
### 4：PnP.PowerShellをインポート
```
$ Import-Module PnP.PowerShell
```
### 5：PnP.PowerShellで使用可能なコマンドを確認
```
$ Get-Command -Module PnP.PowerShell
```

 # 最後に
 ・下記手順でPnP.PowerShellをオフライン環境でも使用できるようになります。
 ・調べる中でnupkgでの方法も試しましたが、こちらはなぜかうまくインストールができなかったので分かり次第備忘録として残そうと思います。

 # 参考
 https://woshub.com/install-powershell-module-offline/
PHP,Laravelの基礎　～文法、構文～

## はじめに
こんにちは、未経験からエンジニア転職を目指しているものです。
オンラインスクールで本格的に学習して6ヶ月目に入りました。PHP,Laravelを学習しポートフォリオを作成中です。ポートフォリオ作成が順調に進むように、PHP,Laravelの疑問点について整理しようと思います。今回は、Laravelの文法に登場する ::, ->, =>, ' ', " " の記号や構文についてまとめてみました。
## :: （ダブルコロン）
::は、クラスやスタティックメソッド・定数にアクセスするときに使います。クラス名とそのメソッドや定数をつなぐ役割を持っています。

### 具体例:

```php
// クラス定数の例
class MathHelper {
    const PI = 3.14;
}

// クラス定数を参照する
echo MathHelper::PI;  // 出力: 3.14
```

### Laravelの例:

```php
Route::get('/', function () {
    return view('welcome');
});
```

- `Route::get` は、`Route`クラスの`get`という**スタティックメソッド**を呼び出しています。
- `::`を使うことで、`Route`というクラスから直接`get`メソッドにアクセスしています。

## > （アロー）
**>** は、オブジェクトのメソッドやプロパティにアクセスするときに使います。クラスを元に作られたオブジェクト（インスタンス）の中にある関数や変数を操作するための記号です。

### 具体例:

```php
class Dog {
    public $name;

    public function bark() {
        return "ワンワン！";
    }
}

$dog = new Dog();
$dog->name = "ポチ";  // プロパティにアクセス
echo $dog->bark();    // メソッドにアクセス
```

### Laravelの例:

```php
$post = Post::find(1);
echo $post->title;
```

- `Post::find(1)`は、`Post`というモデルからIDが1のデータを探して返す処理です。
- その後、`$post->title`で、見つかった投稿の`title`プロパティにアクセスしています。

## => （アロー、連想配列のキーと値を対応させる）

`=>`は、**連想配列**で使います。配列のキーと値を対応させるために使います。

### 具体例:

```php
$user = [
    'name' => '太郎',
    'age' => 18
];

echo $user['name'];  // 出力: 太郎
```

- `'name' => '太郎'`は、キー`'name'`に対して、値`'太郎'`が対応していることを示しています。

### Laravelの例:

```php
return view('profile', ['user' => $user]);
```

- `['user' => $user]`では、ビューに渡す変数`user`に、コントローラー内の変数`$user`を対応させています。

## ' ' （シングルクォート） と " " （ダブルクォート）
`' '`（シングルクォート）と`" "`（ダブルクォート）は、文字列を囲むために使いますが、PHPでは少し違いがあります。

- **シングルクォート `' '`**: 中に書かれたものがそのまま文字列として扱われます。変数の展開はされません。
- **ダブルクォート `" "`**: 中に書かれた変数が展開され、変数の値が使われます。

### 具体例:

```php
$name = '太郎';

// シングルクォート
echo 'こんにちは、$name';  // 出力: こんにちは、$name

// ダブルクォート
echo "こんにちは、$name";  // 出力: こんにちは、太郎
```

### Laravelの例:

```php
return view('welcome', ['message' => "ようこそ、$name さん"]);
```

- `"ようこそ、$name さん"`では、ダブルクォートを使っているので、`$name`の変数が展開されて表示されます。

## {{ }}（Bladeテンプレートで変数を表示）
{{ }}は、BladeテンプレートでPHP変数を表示するための構文です。エスケープ処理が自動で行われ、セキュリティが高まります。

### 具体例:

```php
// コントローラー
return view('welcome', ['name' => '太郎']);
```

```blade
<!-- welcome.blade.php -->
<p>こんにちは、{{ $name }}さん！</p>
```

- Bladeテンプレートの`{{ $name }}`部分で、`$name`変数の内容がHTMLに表示されます。
- `{{ }}`は自動的にエスケープ処理を行い、セキュリティリスクを軽減してくれます。HTMLタグなどの特殊文字が無効化され、画面にそのまま表示されます。

## [] （配列・連想配列の作成）
[]は、PHPで配列や連想配列を作成する記法です。キーと値のセットも作ることができ、=>を使って指定します。

```php
// 数値の配列
$numbers = [1, 2, 3, 4];

// 連想配列（キーと値のセット）
$user = [
    'name' => '太郎',
    'age' => 18
];
```

Laravelの例
```php
return view('profile', ['user' => $user, 'title' => 'プロフィール']);
```

-   `[ ]`の中でキーと値を指定して連想配列を作成し、ビューに複数のデータを渡しています。
- `['user' => $user]`で、テンプレートに`user`というキー名で`$user`を渡すように設定しています。

## まとめ
- **`::`**: クラスのスタティックメソッドや定数にアクセスする。例：`Route::get('/')`
- **`>`**: オブジェクトのメソッドやプロパティにアクセスする。例：`$post->title`
- **`=>`**: 連想配列でキーと値を結びつける。例：`['name' => '太郎']`
- **`' '` と `" "`**: 文字列を囲むための記号。`' '`は文字通りの文字列、`" "`は変数展開を行う。例：`"こんにちは、$name"`
- **`{{ }}`**: Bladeテンプレートで変数を表示する際に使い、エスケープ処理も自動で行われる。例：`{{ $name }}`
- **`[]`**: 配列や連想配列を作成するための記号。例：`['user' => $user]`

最後までご覧いただき本当にありがとうございました！！
AppleシリコンのMacでUTM仮想環境でグレードアップ中に『Obsolete major version15』が表示された場合の対処方法

###
>環境
ハード ：MacBook Air (15インチ, M2, 2023)
ホストOS ：MacOS Sonoma14.6.1
仮想化ソフト：UTM 4.5.4
ゲストOS ：Kali Linux 2024.3

### 状況

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/2bb19cde-26c5-e8cd-a545-2461ad0a6fb7.png)

>後でこの手続きをするようにChat-GPTから言われました。
<font color=‘red’>「このメッセージは、PostgreSQLのバージョン15が古くなったため、バージョン17にアップグレードするよう促しているものです。「OK」を選択してインストールを続行した場合、次のような作業が後から必要になります。</font>

[やるべき作業]
### 1,PostgreSQLのインストール状況を確認する
```python3
dpkg -l | grep postgresql
```
>このコマンドを実行すると、インストールされているPostgreSQLのバージョンが一覧で表示され、PostgreSQL 15や17がインストールされているかどうかも確認できます。

### 2,新しいPostgreSQL 17のインストール確認
>PostgreSQL 17がすでにインストールされていれば、次のステップに進んでください。インストールされていない場合は、次のコマンドでインストールします：
```python3
sudo apt install postgresql-17 postgresql-client-17
```
### 3,データの移行
>旧バージョン（15）のデータを新バージョン（17）に移行するために、pg_upgradeclusterコマンドを使ってアップグレードを行います。次のコマンドで実行します：
```python3
sudo pg_upgradecluster 15 main
```
### 4,旧バージョン17のデフォルトクラスターを削除（必要な場合のみ）
>PostgreSQL 17をインストールすると、17のデフォルトクラスター（17/main）が自動的に作成されますが、バージョン15のクラスターを17にアップグレードする場合、既存の17クラスターを削除する必要があるかもしれません。削除するには、以下のコマンドを実行します：
```python3
sudo pg_dropcluster --stop 17 main
```
### 5,旧バージョンの削除
>アップグレードが完了したら、旧バージョンのPostgreSQL 15とそのクライアントパッケージを削除してシステムを整理できます：
```python3
sudo apt remove postgresql-15 postgresql-client-15
```
### 6,最後にもう一度”PostgreSQLのインストール状況を確認”してもしバージョン１５が残っていて必要なければ以下を行う。
```python3
sudo apt purge postgresql-15
```

>これらの手順でPostgreSQLの新しいバージョンにスムーズに移行できます。

>＃システムに必要でなくなったパッケージを自動的に削除する
```python3
sudo apt autoremove -y 
```
>＃もう必要のないパッケージのキャッシュファイルを削除する
```python3
sudo apt autoclean
```
RxJS の複数のobservable をまとめる関数の動作確認して理解を深めるまで

## 前置き
複数のobservable をまとめる関数について、気になったあれこれを調べて動作確認をしたのでそのメモ。  
確認した関数は以下の通り。  
- race
- forkJoin
- merge
- combineLatest
- zip
- concat

(下記ページの`I have some Observables to combine together as one Observable, and`を押して遷移後にある関数)

https://rxjs.dev/operator-decision-tree

確認方法としては、下記ページを作成し、console.log の出力を見て確認した。  

https://magurouhiru.github.io/mysite/#/study/observable-n-to-1

なお、確認した関数にはObaservable 以外にも適用できるが、今回はObaservable についてのみ確認した。  

## 本編
### race
一口メモ：最初に値を流してきたObaservable のみを使用する。それ以外は無視する。  

### forkJoin
一口メモ：すべてのObservable がcomplete したら、最後の値のみを配列にまとめて後続に流しcomplete する。  

補足：値を流す前にcomplete したObservable があった場合、すぐにcomplete する。  

### merge
一口メモ：特にひねりとかなく、流れてきた値をそのまま後続に流す。  

補足：すべてのObservable がcomplete したらcomplete する。  

### combineLatest
一口メモ：値が流れてきたら、そのタイミングで最後の値を配列にまとめて後続に流す。  

補足1：すべてのObservable から1回でも値が流れてくるまでは何もしない。
補足2：すべてのObservable がcomplete したらcomplete する。  

### zip
一口メモ：すべてのObservable からn回値が流れてきたら、それぞれのn回目の値を配列にまとめて後続に流す。  

補足1：すべてのObservable から1回でも値が流れてくるまでは何もしない。
補足2：1つでもObservable がcomplete し、後続に値を流せなくなったらcomplete する。  

### concat
一口メモ：順番にObservable を処理していく。  

補足1：処理していないObservable から値が流れてきても無視する。  
補足2：すべてのObservable がcomplete したらcomplete する。  

## 感想
楽しかった。  
1口メモを書くのが一番難しかった。  
そして、結局補足も書かないと表現できなかった。  

今回の記事は以上です。  

前回記事はこちら  

https://qiita.com/magurouhiru/items/6b4365c89602627f9715

詳細見たい人はこちら  

https://github.com/magurouhiru/mysite/pull/55

https://magurouhiru.github.io/mysite/#/study/observable-n-to-1
qiita(253) conference 2024-autumn 予習

qiita conference 2024-autumn
https://qiita.com/official-campaigns/conference/2024-autumn

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words and/or centences in order.
# 20241114
## 大企業の人事業務を20年以上支えてきた「超巨大ソースコード」の保守改善を支える技術の数々
工藤 雅人 
株式会社Works Human Intelligence
https://qiita.com/organizations/works-hi



## EM、DevRel、技術広報、プリセールスエンジニア：技術×新たな挑戦で広がる働き方
山本 学 株式会社セールスフォース・ジャパン

## エンジニアのための効果検証入門
浅見 正洋 株式会社博報堂テクノロジーズ

## 東京都知事選出馬！安野さんと考える「キャリアの転機と意思決定の思考法」
安野 貴博 合同会社機械経営

GitLab的ドキュメント文化を組織にインストールする（実践編:スタートアップMNTSQの事例）
https://note.com/takahiroanno/n/ne7e510a06cb9

## 20分で一緒に考える、モダンQAエンジニア像
松木 晋祐 株式会社ベリサーブ

## エンジニア人生の拡張性を高める「探索型キャリア設計」の提案
大倉 潤也 株式会社リブセンス（転職ドラフト）

## 画像で心を動かす人気サイトの成功と画像最適化の秘訣を見よう！
金本 太一 imgix, inc.

## 巨大組織を牽引するCTOの矜持と未来への展望
藤本 真樹 一般社団法人日本CTO協会 理事/グリー株式会社 取締役 上級執行役員 最高技術責任者

# 2024.11.15 (Fri)2024年11月15日金曜日

## エンジニア創業者が語る、ユーザー中心のプロダクトづくり
柴田 和祈 株式会社microCMS

## 賢く選ぶ！脆弱性診断の最適な選び方ガイド
頭島 龍正 エムオーテックス株式会社

## 野良 API を５分で保護 API にして不幸な API 根絶を目指す取り組み
光富 良裕 株式会社セールスフォース・ジャパン

## プログラミング言語デザインケーススタディ
まつもとゆきひろ

## SESの仕組みを活用したキャリア論
斎藤 昌和 株式会社テクニケーション


## グローバルテック企業から学ぶ、生成AI×開発生産性・開発者体験の最先端と未来
稲葉 将一 ファインディ株式会社

## リモートワークでもチーム力を活かして開発：コネクテッドカーソリューションをAWSサーバレスで実現した舞台裏
志田 隼人 NECソリューションイノベータ株式会社

## 異色のキャリアを経てグローバルベンチャーに入ったふたりが学んだ、日本と世界をつなぐ視点
上杉 周作 Vercel Inc.
石原 ニコラス Vercel Inc.

# 過去記事
Qiita Conference 2024 まとめ
https://qiita.com/owayo/items/425007f70eefce16ba50

## takahiroanno
UTアカマイTシャツのGo言語コードを解読してみた
https://qiita.com/bashildon3843/items/ee75bb8a8bf28a6ac2ed

Vercelで組織内部向けブックスタイルのドキュメント
https://qiita.com/Yut-Ishih/items/b68effbf6581725b48ce
【パッケージ紹介】FlutterのアイコンはIconifyも使える

![スクリーンショット 2024-11-09 111937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/2f55001b-ec1a-7038-4288-aba2c37b48da.png)

# 今回紹介するパッケージ
https://pub.dev/packages/iconify_flutter
### install
```bash
flutter pub add iconify_flutter
```
### yaml
```yaml
dependencies:
  iconify_flutter: ^0.0.7
```


## Iconifyとは
`Iconify`は、以下のような特徴を持つアイコンセットフレームワーク
`Figma`にプラグインがあるので、知っている人もいるのではないでしょうか？
- 多様なアイコンセットがある
- 膨大なアイコンセットを混在させて使用できる
- 150,000個以上のオープンソースベクターアイコンが利用可能
- 必要なアイコンのみをロードするため、リソースを節約できる
- Figmaの便利なプラグインが提供されている
- アイコンの検索や選択が容易で、複数のライブラリから横断的に探すことが可能

## 使い方
### 下記サイトから使いたいアイコンを見つける
https://andronasef.github.io/iconify_flutter/
#### 今回はmdiLightのemailアイコンを使ってみます
![スクリーンショット 2024-11-09 110613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/2d512b61-34d2-687b-31d4-f7433f62b765.png)

### パッケージをインポートする
```dart
import 'package:iconify_flutter/iconify_flutter.dart'; // Iconifyウィジェットを使うためにインポート
```
### 使う
- アイコンをクリックするとインポート方法が記載されているのでそのままコピペしましょう
- Iconifyは`Widget`型のクラスで、引数に`Color?  color`や、`double? size`を取れます
```dart
import 'package:iconify_flutter/iconify_flutter.dart';
import 'package:iconify_flutter/icons/mdi_light.dart';

      Iconify(
        MdiLight.email,
        color: Colors.blueAccent, // Color?型
        size: 40, // double?型
      )
```
![スクリーンショット 2024-11-09 111213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/42ac46af-49e6-023d-51d9-d78ff01bd333.png)
こんな感じで表示されます！

## 注意
アイコンによっては、表示されないものもあります。
パッケージの開発者さん的にはもっとパッケージが有名になってほしいようなので
repositoryにissue立ててあげるといいかもしれません
VMware NSX 4.2 GW Firewallにおける構成の上限について

2024年7月にリリースされた[VMware NSX 4.2](https://docs.vmware.com/jp/VMware-NSX/4.2.0/rn/vmware-nsx-420-release-notes/index.html) において下記の通り、EdgeにおけるGWファイアウォールの構成上限の変更がありましたので、まとめます。

<blockquote>
<strong>ゲートウェイ ファイアウォール<br></strong>
<strong>・vDefend ゲートウェイ ファイアウォールのスケールの強化。<br></strong>
Edge と Tier-0 および Tier-1 ゲートウェイでサポートされる最大スケールにいくつかの更新が行われました。詳細については、https://configmax.esp.vmware.com/home にある NSX 4.2 の構成の上限ツールを参照してください。
</blockquote>

# VMware NSX 4.2 GWファイアウォールの構成上限の変更について

[Configuration Maximums](https://configmax.broadcom.com/home) にて、<font color="red">**Gateway Firewallに関して**</font> VMware NSX 4.1迄とVMware NSX 4.2を比較した場合、下記の変更が実施されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/f2f22467-cb8d-12d1-72fa-557e774f2004.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251519/0b932af5-e6fc-118c-e728-389fd7da0f5a.png)

**主な変更内容**
* ～VMware NSX 4.1.xまで記載のなかった、Edge毎のGateway Firewallの上限数が追加されている。
* **<font color="purple">Medium Edge Node Gateway Firewalls per Edge Node　5</font>**　: Deployed either as T0, T1 or Bridge mode on the same edge node
* **<font color="purple">Large Edge Node Gateway Firewalls per Edge Node  10</font>**　: Can be a combination of either T0, T1, or Bridges. If using only L4 / L7 without ATP - you can deploy upto 25 Firewalls
* **<font color="purple">Extra Large Edge Node Gateway Firewalls per Edge Node 10</font>**　: Can be a combination of either T0, T1, or Bridges. If using only L4 / L7 without ATP - you can deploy upto 25 Firewalls

備考欄に、Medium Edgeであれば「T0、T1、ブリッジとして展開されたもの」、Large Edgeであれば「T0、T1又はブリッジとして展開されたもので、ATPを使用しない場合はL4/L7Firewallを25まで作成可能」との記載があります。


**結論**
VMware NSX でGateway Firewallを利用している環境において、4.2以降にアップグレードする場合は、上記の構成の上限に考慮する必要があります。
VS Code 等で git のコミットログが文字化けする対策

## 原因

Windows 11 において、デフォルトのターミナルは `Windows PowerShell` になっているはずだが、メモリ消費や起動の速さ等から `コマンド プロンプト` に直していたり、VSCodeの以下の設定で、コマンドプロンプトを起動するようにしている場合、日本語のコミットログが `ｭ繝ｳ喧` のように半角カナや手偏・糸偏の難読漢字等に化ける事がある。

```settings.json
"terminal.integrated.defaultProfile.windows": "Command Prompt",
```

## 対策 

PowerShellを起動するようにデフォルト設定に戻すか、意地でもコマンドプロンプトを使いたい場合は、VS Codeに以下の設定等を行い、起動時に `chcp 65001` を実行して、文字コードを `UTF-8` にしてやる。

```settings.json
    "terminal.integrated.profiles.windows": {
        "Command Prompt": {
            "path": [
                "${env:windir}\\Sysnative\\cmd.exe",
                "${env:windir}\\System32\\cmd.exe"
            ],
            "args": ["-c", "chcp 65001"],
            "icon": "terminal-cmd"
        },
    }
```

ターミナルをコマンドプロンプトかつ`UTF-8` にしたい場合は・・・
毎回 `chcp 65001` を実行してから作業するか、何らかの方法でこれを自動実行出来る工夫をする（丸投げ(笑)）
mermaid.jsを使ってGitのブランチ図を書いてみよう（コミット編）

## 概要

コードで作図できるでおなじみのmermaidを使ってGitのブランチ図の記載方法をまとめる。
今回はコミットの表現に絞ってまとめる。

## 前提

図のレンダリングにはmermaid公式のLIVE Editorを使用

https://mermaid.live/edit#pako:eNqFj00KwjAQha8SZm0v0LXSA7iTbMZkTELzR5yIUnp3Y6uCIrh7P99bvAlU0gQ9dF0nIzv21IvdFUP2JAbHQjs0BYOMC2AcDwWzlVEIoVIIjr_lsWBUVmi6kE95bS2pMVX-DH-u32hAF5ckUDH0bwkbaFzb6HZlelQS2FIgCX2TGssoQca5cVg57W9RQc-l0gZq1si0XW--wozxkFKzJ_Tn5kuqxj7dfAdr92mu

## 内容

### コミットの表現

コミットは`commit`と記載することでコミットを作図する事ができる。

```
---
title: コミットの説明
---
gitGraph
   commit
   commit
   commit
```

↓作図結果

```mermaid
---
title: コミットの説明
---
gitGraph
   commit
   commit
   commit
```

### コミットに任意のIDを設定

ただ単に`commit`とだけ記載すると「0-ca0c7a5」のようなランダムなIDが付与されて表示される。
このIDは下記のように`commit id: '表示したいID'`のように記載することで人為的に指定・表示する事ができる。ただし、指定する内容は図内で一意である必要がある。

```
---
title: コミットに任意のIDを設定
---
gitGraph
   commit id: 'first commit'
   commit id: 'A commit'
   commit id: 'B commit'
```

↓作図結果

```mermaid
---
title: コミットに任意のIDを設定
---
gitGraph
   commit id: 'First commit'
   commit id: 'A commit'
   commit id: 'B commit'
```

↓こんな書き方をしても一個のコミットしか表示されないので注意。

```
---
title: コミットに任意のIDを設定
---
gitGraph
   commit id: 'hoge'
   commit id: 'hoge'
   commit id: 'hoge'
```

↓作図結果

```mermaid
---
title: コミットに任意のIDを設定
---
gitGraph
   commit id: 'hoge'
   commit id: 'hoge'
   commit id: 'hoge'
```

### コミット表示の指定

ただ単に`commit`とだけ記載するとコミットの表示はデフォルト（NORMAL）の表示となる。
その他にリバート（REVERSE）やハイライト（HIGHLIGHT）などの表示を行うことができる。
下記の様に`commit type: 表示指定`とすることでコミットの表示を指定できる。

```
---
title: コミットの表示の指定
---
gitGraph
   commit
   commit id: 'ノーマルのコミット' type: NORMAL
   commit id: 'リバートのコミット' type: REVERSE
   commit id: 'ハイライトのコミット' type: HIGHLIGHT
   commit type: HIGHLIGHT
```

↓作図結果

```mermaid
---
title: コミットの表示の指定
---
gitGraph
   commit
   commit id: 'ノーマルのコミット' type: NORMAL
   commit id: 'リバートのコミット' type: REVERSE
   commit id: 'ハイライトのコミット' type: HIGHLIGHT
   commit type: HIGHLIGHT
```

typeを使って表示の指定をしないとNORMALになる。
idとtypeは必ずしも併用する必要はない。

### コミットにタグを付与

コミットにタグを付与することもできる。
下記の様に`commit tag: 'タグ名'`とすることでタグを付与する事ができる。

```
---
title: コミットにタグを付与
---
gitGraph
   commit tag: 'タグ-01'
   commit id: '追加リリース' type: HIGHLIGHT tag: 'タグ-02'
```

↓作図結果

```mermaid
---
title: コミットにタグを付与
---
gitGraph
   commit tag: 'タグ-01'
   commit id: '追加リリース' type: HIGHLIGHT tag: 'タグ-02'
```

長いタグ名を設定すると下記のようにタグが被って表示される場合もあるので注意が必要。

```
---
title: コミットにタグを付与
---
gitGraph
   commit tag: 'release-YYYYMMDD-01'
   commit id: '追加リリース' type: HIGHLIGHT tag: 'release-YYYYMMDD-02'
```

↓作図結果

```mermaid
---
title: コミットにタグを付与
---
gitGraph
   commit tag: 'release-YYYYMMDD-01'
   commit id: '追加リリース' type: HIGHLIGHT tag: 'release-YYYYMMDD-02'
```


## 参考文献

https://mermaid.js.org/syntax/gitgraph.html#syntax

https://mermaid.js.org/syntax/gitgraph.html#adding-custom-commit-id

https://mermaid.js.org/syntax/gitgraph.html#modifying-commit-type

https://mermaid.js.org/syntax/gitgraph.html#adding-tags
paizaラーニングスキルチェック「B145:ビンゴゲームの判定」を解いてみた結果

▼問題

以下のリンクを「B145:ビンゴゲームの判定」で検索してください。

https://paiza.jp/challenges/ranks/b/info

▼結果

https://paiza.jp/challenges/share/LovzhZUdzZrh2qJIWUzh0l0LbWxIhDab1fRWFyqlOik?source=social
Markdown AIを使って、初心者向けのAIコーディングアドバイザーサイトを作ってみた！

Markdown AIを使ってみよう！というキャンペーンが行われています。

https://qiita.com/official-events/6914e7e898953881ef94

どういう風に使うのかが少し難しそうかな？と思いましたが、とりあえず触ってみてからどんな風に使えそうか考えてみよう！と、とりあえず触ってみました！

## 触って、完成したのがこちら！
教えて！ＡＩ先輩！！
https://mdown.ai/content/9eb681aa-94df-4dd8-9dba-b046eb297675
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/c5fcb3ba-dcf3-270a-02f8-ebf22c08180c.png)

## このサイトをつくってみた背景
最近Qiitaの質問に答えてみているのですが、意外と簡単な質問もおおいので、

https://x.com/calcMCalcm/status/1851942531409547720

なんて思っていました。
Markdown AIでは、ChatGPTをはじめとしたAIを、スクリプトでAPI連携を埋め込めるので、まずはAI先輩に聞いてみて、Qiitaでの良記事をサジェスチョンしてもらえば、自己解決でき、また今後の問題解決の対応方法も考えられることができるのでは？というお気持ちです。

https://qiita.com/calcMCalcm/items/982a911ba0822f05a66c

## Markdown AIでのサイトの作り方
こちらの中の人の記事を参考にしました。

https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f

最終的に、publicすると、URL、HTML、codeと選択でき、codeを選択すると、HTMLソースを表示してくれます。このソースを自分のサイトにアップロードすれば、自分のオリジナルサイトが作れる感じですかねー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3679605/6c48a87f-cd43-408b-9b82-8dc3855b332a.png)

## AIのプロンプト （20241110追記）
プロンプトは次のようにしています。
```
貴方は質問者の先輩のロボットです。AIロボットは応答する最初に"ピポ！"とか"Pi！"とか言います。質問者が自分のコーディングで困った点を問い合わせしてくるので、アドバイスや解決方法、解決のヒントを提示してください。問い合わせ内容やキーワードでインターネットを検索して、問題解決の参考となりそうな記事をURLとともに提示ください。記事を提示する際には、問い合わせの問題に対してどのような点で参考や解決につながりそうか簡単にポイントを解説してください。参考として提示するインターネットの記事は、公式の日本語記事、もしくはqiita.comかzenn.devのもので、手順や解決法が丁寧に記載されているものに限定してください。もし適切な記事が存在しなければ、記事の提示は不要です。
参考になりそうな記事は、３つほど提示をお願いいたします。
参考となりそうな記事には直接飛べるようなURLリンクをつけてください。
```
URLのアドレスを貼ってくれるのですが、なぜか404 Not Foundだったりする場合があります。
AIが記事があるものとしてでっちあげてるのか、検索のキャッシュに残っているものの既に消えているのか、よくわかりません。

## Markdown AIを使ってみての印象
"Markdown AI"という名称ですが、"Markdown"＋"AI"というような印象です。マークダウンでレイアウトと整えられて、AIも利用できる、みたいな。
マークダウンとAIが融合しているのかな？と思いましたが、印象では別物。
AIチャットボットの回答がマークダウンのようですが、サイトでの表示はそのまま貫通してしまっているのがちょっと残念です。
AIの回答をマークダウンとするなら、マークダウンで表示できるようにして欲しいですし、マークダウンではなく平文での回答もできるようにして欲しいところです。
AIを、サイトに挿入することもできるのですが、恐らくサイト作成においてもプロンプトからの回答をコピペできるように考えられているように思いますが、埋め込むBOTと同じ入り口になっているため、少しわかりにくいような気もします。
こどもやマークダウンを使ったことがない人にアピールするには、WYGSIG的な、選択したテキストをマークダウン表記にできるようなボタンをつけるとか、マークダウンサイト構築用のAIをBOT構築と別とするのがいいのではないかと思います。
コードで他にコピーしてた場合、チャットボットのAPIの利用料は、どのような扱いになるのか少し気になりました。
考えているサイトのプロトタイプ作成にはちょうどいいのかもしれない？
あと、混んでいるのか、AIのレスポンスが悪かったりするのが、気にはなりました。もう少しレスポンスが早ければなー

## 今後
使い勝手もわかったので、もう少しいろんなパターンで作ってみたいですね
Raspberry Pi の画面左側に灰色の縦長の長方形が現れた


Raspberry Pi をスクリーンに接続するといつの間にか、
画面左側に灰色の長方形が現れてた。

[![Image from Gyazo](https://i.gyazo.com/ed83b079685e5cfc31cab473ea47b09d.jpg)](https://gyazo.com/ed83b079685e5cfc31cab473ea47b09d)


そこを右クリックして、
「このパネルを削除する」をクリック
[![Image from Gyazo](https://i.gyazo.com/cb0dd6c1ea0beb6d2f5fe977fb4ba5d5.jpg)](https://gyazo.com/cb0dd6c1ea0beb6d2f5fe977fb4ba5d5)

直った。
[![Image from Gyazo](https://i.gyazo.com/637ec880e9e79dbc53921ba19e80fcd6.jpg)](https://gyazo.com/637ec880e9e79dbc53921ba19e80fcd6)



これで1時間悩んだ。


ちなみに、右クリック＞「新規パネルの作成」で灰色の長方形が現れる。
無意識に「新規パネルの作成」をクリックしてたのかな。
RaspberryPi でNode-REDを起動してみた


# やること

RaspberryPi でNodeREDを起動する

# バージョン
RaspberryPi 3

# OSインストール

Raspberry Pi Imagerのダウンロードとインストールする。
https://www.raspberrypi.com/software/

パソコンにマイクロSDカードをセット
（容量=32GB もしくは 64GB、速度=U1推奨）

Raspberry Pi Imager　を開き、
デバイス、OS、ストレージ（SDカード）を選択

[![Image from Gyazo](https://i.gyazo.com/22b1ae1b13098db533f159b48331e48a.png)](https://gyazo.com/22b1ae1b13098db533f159b48331e48a)

イメージをSDカードに書き出したら、
RaspberryPiにSDカードを差し込む。
モニター、キーボード、マウスをセットし、
RaspberryPiを起動する。

![IMG_5809.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/7678f618-135a-30ce-6767-b535354085c5.jpeg)

言語、Wi-Fiなど設定。

## Node-RED 

ここを参考にした。
https://nodered.jp/docs/getting-started/raspberrypi


RaspberryPiのターミナルで
以下のコマンドを実行
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

インストールできたら、
以下のコマンドでNodeREDが実行できる。

```
node-red-pi --max-old-space-size=256
```

または、
Menu -> Programming -> Node-RED　
でも実行できる。


「フローを開始しました」とメッセージがでればOK
[![Image from Gyazo](https://i.gyazo.com/c4257ffb269c5bfe56698a8eb81416cd.jpg)](https://gyazo.com/c4257ffb269c5bfe56698a8eb81416cd)

<br><br>

Raspberry Piデスクトップのブラウザの場合、
以下のアドレスでエディタを開くことができる。
http://localhost:1880

ここはRaspberry PiのUsername , Password を入力する。

[![Image from Gyazo](https://i.gyazo.com/ec796361448726bb281047141bb6dcd8.jpg)](https://gyazo.com/ec796361448726bb281047141bb6dcd8)

Node-RED が立ち上がった！

[![Image from Gyazo](https://i.gyazo.com/04b487dd503042dc06eba43f648207c8.jpg)](https://gyazo.com/04b487dd503042dc06eba43f648207c8)

 <br><br>

とはいえ、
Raspberry Piのブラウザよりも
他のPCのブラウザで見る方がいい。

PCのブラウザで以下にアクセスすれば、
Raspberry Pi のNode-RED にアクセスできる。

http:// Raspberry Pi のIPアドレス :1880
（例）http://123.456.78:1880

なお、Raspberry Piの IPアドレスは
Raspberry Piのターミナルで以下のコマンドで確認できる。

```
hostname -I
```


PCのブラウザでRaspberry PiのNode-REDにアクセスできた。

![Gb543yda4AANPCq.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291592/91b5a7e2-cba5-9d39-3d09-760d669e54ac.jpeg)



Raspberry Piの電源がついたときにNode-REDを自動起動させるには、以下のコマンドを実行する。

```
sudo systemctl enable nodered.service
```

なお、Node-REDの自動起動を無効にするには、以下のコマンドを実行。

```
sudo systemctl disable nodered.service
```
<br><br>

以上です。