OmniAICreator/Qiita-1.07M huggingface dataset:
OllamaのK/V Context量子化で実現するVRAM削減とモデル性能向上


## はじめに：K/V Context量子化とは

Ollamaに革新的な機能、K/V context cache量子化が実装されました。この技術により、LLM（大規模言語モデル）のVRAM使用量を大幅に削減しながら、より大きなコンテキストサイズやモデルの活用が可能になります。

> 💡 **重要ポイント**：
> K/V context cache量子化は、モデル自体の量子化とは異なり、LLMの「作業メモリ」に当たる部分を最適化する技術です。

## 主要なメリット

K/V Context Cache量子化がもたらす3つの主要なメリットをご紹介します：

### より大規模なモデルの実行が可能に
- 既存のハードウェアでより強力な大規模モデルを実行
- 同じVRAMでより高性能なモデルの使用が可能

### コンテキストサイズの拡大
- より多くの情報を一度に処理可能
- 長文の文章生成や複雑なコーディングタスクで特に効果的
- より詳細で文脈を理解した応答が可能に

### ハードウェアリソースの効率化
- メモリ使用量の大幅な削減
- 複数のモデルを同時に実行可能
- コスト効率の向上

## VRAM使用量への具体的な影響

### 📊 8Bパラメータモデル（32Kコンテキスト）での比較

| 量子化タイプ | VRAM使用量 | 削減率 | 品質への影響 |
|------------|-----------|--------|------------|
| F16 K/V    | 約6GB     | -      | なし       |
| Q8_0 K/V   | 約3GB     | 50%    | 最小限     |
| Q4_0 K/V   | 約2GB     | 66%    | 若干あり   |

> 💡 **活用例**：
> Q8_0による3GBのVRAM節約で、以下のいずれかが可能になります：
> - コンテキストサイズを32Kから64Kへ倍増
> - より大きなモデル（8Bから14B）への移行

## Ollamaでの設定方法

### 基本的な設定手順

```bash
# 1. Flash Attentionを有効化
export OLLAMA_FLASH_ATTENTION=1

# 2. K/V cache量子化をQ8_0に設定
export OLLAMA_KV_CACHE_TYPE="q8_0"

# 3. Ollamaを起動
ollama serve
```

### 🔧 詳細な設定オプション

1. **最新バージョンの入手**
   - メインブランチからのビルド
   - または、[公式リリースページ](https://github.com/ollama/ollama/releases)からのダウンロード

2. **量子化レベルの選択**
   - Q8_0：バランスの取れた選択（推奨）
   - Q4_0：最大のVRAM削減が必要な場合

## 性能と品質への影響

### 💻 性能への影響
- Kキャッシュ量子化：わずかな性能向上
- Vキャッシュ量子化：若干の性能低下の可能性
- 全体的な影響：実用上問題のないレベル

### ⚡ 品質への影響

#### Q8_0の特徴
- 通常のテキスト生成で最小限の品質低下
- ほとんどのユースケースで推奨
- パープレキシティの増加はわずか0.002程度

#### Q4_0の特徴
- 顕著な品質低下
- VRAMが極めて限られている場合の選択肢
- パープレキシティの増加は約0.206

## 対応ハードウェア

### 🖥️ プラットフォーム別の対応状況

1. **Apple Silicon**
   - Metal経由で動作
   - M1/M2チップで優れたパフォーマンス

2. **NVIDIA GPU**
   - Pascal世代以降のGPUに対応
   - CUDAサポートが必要

3. **AMD GPU**
   - ROCmサポート対応GPU
   - ※CUDAやMetalと比べてサポート状況に差あり

## まとめ：K/V Context量子化の可能性

K/V Context Cache量子化は、LLMの実用性を大きく向上させる革新的な技術です。特にQ8_0量子化は、品質をほとんど犠牲にすることなくVRAM使用量を半減できる優れたソリューションとなっています。

> 🎯 **おすすめの使い方**：
> - 通常使用：Q8_0を選択
> - VRAM制約が厳しい場合：Q4_0を検討
> - 品質重視の場合：F16を使用

## 参考資料

- [オリジナル記事：Bringing K/V Context Quantisation to Ollama](https://smcleod.net/2024/12/bringing-k/v-context-quantisation-to-ollama/)
- [Ollama公式ドキュメント](https://ollama.ai/docs)
- [llama.cpp公式リポジトリ](https://github.com/ggerganov/llama.cpp)
JavaScript/スプレッド構文(...obj)とObject.assign()



- [スプレッド構文(...obj)とObject.assign()の用途](#スプレッド構文(...obj)とObject.assign()の用途)
- [スプレッド構文の使い方](#スプレッド構文の使い方)
- [Object.assign()の使い方](#Object.assign()の使い方)
- [シャローコピー](#シャローコピー)
- [マージ](#マージ)

## スプレッド構文(...obj)とObject.assign()の用途
スプレッド構文(...obj)とObject.assign()はどちらもオブジェクトのシャローコピーやマージに使用される。


## スプレッド構文の使い方
```javascript
//配列の場合
const fruits = ['apple', 'banana', 'grape'];
const fruits2 = [...fruits, 'peach'];  //...(コピー元の配列名)

console.log(fruits2);  //['apple', 'banana', 'grape', 'peach']
console.log(fruits2.shift());  //apple

//オブジェクトの場合
const person = {
  name: 'Takuto',
  gender: '男',
};
const person2 = {...person, age: 20};  //...(コピー元のオブジェクト名)

console.log(person2);  //{name: 'Takuto', gender: '男', age: 20}
```

## Object.assign()の使い方
```javascript
const target = { a: 1, b: 2 };
const source = { b: 3, c: 4 };

const returnedTarget = Object.assign(target, source);
console.log(returnedTarget);  //{a: 1, b: 3, c: 4}
//targetも更新される
console.log(target);  //{a: 1, b: 3, c: 4}
```
引数はいくらでも指定できてキーが被っていた場合は後の引数のものが優先される

## シャローコピー
シャローコピーとはオブジェクトや配列の1階層目のプロパティだけをコピーする。
ネストされたオブジェクトや配列は参照が共有されるため、元のオブジェクトも影響を受ける。
### スプレッド構文を用いた場合
```javascript
const person = {
  name: 'Takuto',
  gender: '男',
  info: {
    age: 20,
    interests: 'reading',
  },
};

const shallowcopy = {...person};  //シャローコピー 

shallowcopy.name = 'Kazuya';
shallowcopy.info.age = 21;

console.log(person.name);  //Takuto  変更されない
console.log(person.info.age);  //21  変更される
```
### Object.assign()を用いた場合
シャローコピーの行を以下に変更
```javascript
const shallowcopy = Object.assign({}, person);  //シャローコピー
```

## マージ
### スプレッド構文を用いた場合
```javascript
const person = {
  name: 'Takuto',
  gender: '男',
  age: 20
};

const person2 = {
  name: 'Takuto',
  gender: '男',
  age: 21,
  interests: 'reading',
};

const merged = {...person, ...person2};  //マージ

console.log(merged);  //{name: 'Takuto', gender: '男', age: 21, interests: 'reading'}
```
### Object.assign()を用いた場合
マージの行を以下に変更
```javascript
const merged = Object.assign({}, person, person2);  //マージ
```
味噌汁で考えるアルゴリズム｜文章題で身に付くプログラミング思考入門️（6/25）

## はじめに

突然ですが、良いアルゴリズムってどんなものでしょうか？

### まず最初に、アルゴリズムとは、簡単に言えば「やり方」のことですね。

では、良いやり方とはどんなものでしょうか？

効率性？正確性？安定性？シンプルさ？公平性？
拡張性や、メンテナンス性などの観点もあるかもしれません。

『文章題で身に付くプログラミング思考入門️』は、日常や文章問題からプログラミング思考を身に付けていく、簡単で身近で、あなたをちょっと輝かせてくれるシリーズです。

今回は、アルゴリズムについてお話ししていきましょう。

## 前回のまとめ

抽象化：本質を捉えるトレーニング
- 抽象化することで、当てはまるケースが増えます。
- どのくらいの具合で抽象化・具体化するのが良いかは、使う人に聞くのが一番いいです。使い勝手は、使ってくれる人に合わせましょう。
- ラテラルシンキング（水平思考）とは、何らかの要素を頼りに、自由に連想を広げていく思考のことです。

前回の記事は[こちら](https://qiita.com/yuki-TheWaggle/items/810b6379598e64c47e5a)
第一回は[こちら](https://qiita.com/yuki-TheWaggle/items/a6845c85a464c3c46ab2)

## 対象者
- プログラミングを学びたい人
- プログラミングに挫折したことのある人
- 論理的思考を鍛えたい人
- 文系の人
- エンジニアの思考を理解したい人

## 概要
まず、アルゴリズムについてもう少し詳しくお話ししましょう。

**アルゴリズムとは、ある目的を達成するために、どのようなルールで進めるか？を定めたものです。**

アルゴリズムという言葉は、様々な文脈で使われます。
プログラム、マーケティング、投資など様々なシーンで語られ、とても奥の深い言葉だと思います。

ただ、あんまり専門的な話だと難しいし、そもそも私にとっても簡単ではないので、

ここでは、日常の行動から、アルゴリズムの良し悪しとは何か？について考えていきましょう。
アルゴリズムとは、要はやり方のことなので、味噌汁の作り方でも考えながらやってみましょうか。

さあ、それでは味噌汁を作っていきましょう。

```
1. 材料と道具を用意する
2. 出汁をとる
3. 具材を切って鍋に入れる
4. まな板と包丁を洗う
5. 具材を煮る
6. 味噌を溶かす
7. 一煮立ちさせる
8. 盛りつける
```

大まかに、味噌汁を作るアルゴリズムはこんな感じでしょうか。
料理は片付けもセットですから、具材を煮ている間にまな板と包丁を洗ったりしますよね。
そう、効率化です。アルゴリズムを効率化してみます。

```
1. 材料と道具を用意する
2. 出汁をとる
3. 具材を切って鍋に入れる
4. 具材を煮る + まな板と包丁を洗う
5. 味噌を溶かす
6. 一煮立ちさせる
7. 盛りつける
```

次に、もっと効率良くするために出汁入り味噌を使ってみましょうか。

```
1. 材料と道具を用意する
2. 具材を切って鍋に入れる
3. 具材を煮る + まな板と包丁を洗う
4. だし入り味噌を溶かす
5. 一煮立ちさせる
6. 盛りつける
```

具材を切ったり道具を片付けたりするのが面倒なので、カット野菜を使うことにしました。

```
1. 材料を用意する
2. 具材を煮る
4. だし入り味噌を溶かす
5. 一煮立ちさせる
6. 盛りつける
```

もっと時短できるかなと思ったので、インスタント味噌汁を使うことにしました。

```
1. お湯を沸かす
2. 材料をお椀に入れる
3. お湯をそそぐ
```

さて、アルゴリズムを効率化していったらインスタント味噌汁に到達しました。

今の時代、楽チンで簡単な商品が身の回りにたくさんあって、私たちは日々恩恵を受けています。
材料を買って自分で作るよりは価格が割高ですが、代わりに手間と時間を肩代わりしてくれているんですね。

世の中には、インスタントを好む人もいれば、手作りにこだわる人もいるでしょう。
包丁とまな板が家にない人もいるのではないでしょうか。
土日は自炊で平日は簡単に済ませる、なんて習慣もあるでしょう。
また、昭和時代には、カット野菜もインスタント味噌汁も存在しませんでした。

### つまり、どのようなアルゴリズムが良いアルゴリズムなのかは、人や、環境や、時代や、状況によって変わります。
新しい技術や価値観に応じて、何が「良い」とされるかは大きく変わりますね。

**ただし、悪いアルゴリズムは存在します。**
それは、そもそもアルゴリズムに欠陥がある場合です。

味噌汁を作るのに、
- 味噌を入れる過程がない（プロセスが漏れている）
- お椀に盛り付けた後に、切ったばかりの大根を入れる（順番を間違っている）
- たこ焼き器で味噌汁を作る（使うものを間違っている）

などです。

システムや商品開発の際に大事なのは、欠陥のないアルゴリズムで作るのは前提として、

### ユーザーが何を大切に思っていて、本当は何をやりたくないのか。ユーザーに寄り添うことです。

私の場合は、味噌汁のアルゴリズムに効率化を求めたらインスタント味噌汁に辿り着きました。
あなたは、アルゴリズムに何を求め、どこに辿り着いたでしょうか？

次回は、 [条件分岐 ](https://qiita.com/yuki-TheWaggle/items/8132190b747f97815b5b)について解説していきます。


## まとめ
- アルゴリズムとは、簡単に言えば「やり方」のことです。
- どのようなアルゴリズムが良いアルゴリズムなのかは、人や、環境や、時代や、状況によって変わります。
- 大事なのは、ユーザーが何を大切に思っていて、本当は何をやりたくないのか。ユーザーに寄り添うことです。

## 最後に
ここまで読んでくださってありがとうございます！
少しでも役に立ったら「いいね」をください。続ける励みになります。
味噌汁がどこに辿り着いたか、是非コメントで教えてください。
答えにたどり着いてもらう思考整理

## 本の情報
**タイトル**
プロの思考整理術

**著者**
和仁 達也

**概要**
著者がコンサルタント経験の中で考えた、相手の思考を整える「プロの思考整理術」についての本。
「プロの思考整理術」では、「タイトルを決める」「現状を知る」「理想を描く」「条件を探す」の4ステップを行うことで、相手の思考をスッキリさせることができる。
加えて、思考整理を促進するツールとして「着眼点」「事例ストーリー」「図解」が紹介されている。

## 印象に残った点
### 仮置きして進める
思考整理を行う際は、各ステップで仮置きしながら進めていくことがポイントとなる。
1. タイトルを決める
→何について話しているのか を始めに決めておく必要があるが、とっさに考えるのは難しいこともある。
そういった場合は、仮置きという前提で一度タイトルを決めて次のステップに進む。
最初は悩みが何なのか分かっておらずタイトルが変わることも多いので、最初のタイトルは仮置きという意識を持っておくと思考整理が進めやすい。

1. 現状を知る
→タイトルを踏まえて、疑問や気になった点を掘り下げていく。
その際に、思考の流れを止める原因になっていそうな箇所(「したいけどできない」のような言葉)がでてきたら、そこが原因と仮置きして深堀りしていくと気づきが得られる可能性がある。

1. 理想を描く
→一度理想をイメージすることで、思考が上向きになってできる方法を考えられるようになる。
そのために、「自分にはできない」「こういう条件があって難しい」という枠を外して「今言ったことは何でもかなう状態」を仮置きして考えると理想を描きやすい。
また、理想が出てこない場合は「仮に、こうなっていたら良いのでは？」という形で相手に示してみるのも有効。

1. 条件を探す
→理想を描けたら、どのように実行に移すかを決めることで行動できるようになる。
「能力」「行動」「環境」の3つの視点から、理想と現状のギャップを埋める方法を仮で考えて実践する。

### アドバイスをしない
問題解決をする際に解決方法のアドバイスをすることは、あまり得策ではない。
仮に相手がその通りに実行したとしても、結果はアドバイスした側の責任になってしまい、当人の解決力の向上にはならない。
また、相手が実行しなかった場合は、アドバイスしたのに実行しなかったという結果から、気まずさを生んでしまう。
→人は、基本的にはアドバイスされるのが好きではない。
　悩みの答えは相手の中にあるが、それは本人には見えない盲点に隠れているため、相手が自分で解決策を出さない限り、相手がすっきりすることはない。

## 所感
### 仮置きして進める
一度決めたことを無条件に信じてしまう傾向があり、必要になった際に方針転換ができないことは自身の問題の一つであると感じていました。
その点において、仮置きをして進めるという考え方は対策の一つになる印象を受けました。

### アドバイスをしない
仕事とは関連しない部分もありますが、余計なことを言いがちな自覚があるため、言ってしまう側 / 言われた側双方の掘り下げがあったことにより、納得感をもって理解ができました。
アドバイス自体が不要 ということではないため、相手にとって本当に必要なのか / アドバイスをすることでどんな利益があるのか を念頭に置くようにします。

## まとめ
著者が、コンサルタントとして相手の問題解決を行う際に行っている思考整理の方法についてまとめられた本でした。
対象が相手という点で求めている内容とは異なる部分もありましたが、本文でも述べられていた通り、この思考整理法自体は自分にも適用できる部分がある内容でした。
今の自分に適用できるところを探しつつ、立場が変わった際にまた読み直したいと思います。
社内輪読会「みん読会」が大好評なワケを教えよう

## 「みん読会」とは

2023年に当時1年目のメンバーと私で、「インフォコムグループ分け隔てなくさまざまな部署のメンバーが入り混じり、みんなが気軽に参加できる輪読会」を目的として、社内輪読会「みん読会」を開始しました！
始動から4冊の書籍をテーマとして開催してきましたが、スキルアップを目指す若手社員から、長年の経験を活かしたいベテラン社員まで、多様なメンバーが集まる場となっています。

## 参加者からのフィードバック
（ほんっっっの一部を抜粋しています）
- 業務に役立つ内容がたくさんで、参加者から多くの気付きが得られます
- Miroを使った議論形式のおかげで、参加者同士の意見交換がとても活発
- ファシリの工夫や改善が毎回見られて、参加するたびに新鮮な体験ができるのが魅力的
- 発表がカジュアルでリラックスできる雰囲気なので、参加者は気楽に参加できます
- 様々なバックグラウンドを持つメンバーからの意見を聞けて参考になります

多いときは30人ほど参加するイベントになっていますが、毎回参加者の満足度は上々で、毎回「企画して良かったな～次も頑張ろう！」という気持ちになります。

今回は、「みん読会」の運営方法をメインに話そうと思います。これから社内で輪読会を始めようと思っている方に参考になれば嬉しいです。

## 議論形式の工夫

議論を深め、参加者同士の知識交換を促すため、「みん読会」ではMiroを活用しています。
これは、toppanさんの記事を参考にさせていただいて、我々なりにアレンジしています。
https://note.erhoeht-x.jp/n/n228711566e4a

各参加者が自由に付箋に意見を書き込み、5つの項目を基にしながらディスカッションを進めます。この方法は、気軽に意見を出しやすく、議論が活性化します。

- わかったこと: 学びになった点・初めて知った点を共有
- わからなかったこと: 不明点や疑問を整理し、議論が活発になる項目です
- 皆に聞いてみたいこと: 他部署やチームでの事例を聞く場で、ここも議論が活発になる項目です
- 明日からできるアクション: 学びからすぐ実践できる行動を見つける項目です
- その他（自由記入）: 新しいアイデアや感じたことを自由に記入してもらってます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2993387/dd2da5de-cfe8-fb39-b021-8185562c17ef.png)

## 一般的な失敗事例とみん読会

社内読書会を成功させるうえで、避けて通れない失敗事例も存在しますが、私たちはそれを上手に回避できていると感じています。

- 参加者のコミットメント不足に対して
    - 「みん読会」では、多様な参加形態や、参加ハードルを下げる仕組みを生み出し、参加したくなるような運営を目指しています
- 書籍やテーマの選択ミスに対して
    - 「みん読会」では、アンケートの実施や会社のMVVと親和性の高さを考慮し、参加者の興味を反映させたテーマ選定を心がけています
- 運営の負担が大きいに対して
    - 「みん読会」では、まずは運営の我々がやる気の出るテーマを第一優先として考えています！
- 議論の不活性に対して
    - 「みん読会」では、Miroを使用した議論方式が、発言のハードルを下げ、多くの意見を引き出しやすいです
- リモート環境での課題に対して
    - 「みん読会」では、オンラインでも一体感を持てるよう、Miroを始めとしたデジタルツールを積極的に活用しています

## 運営で大事だと感じたポイント

ここまでで話したことと被ることはあるのですが、
1. 運営が学びたいテーマを選定する
1. 参加者の参加ハードルは激下げを心がける
1. 運営の運営ハードルも激下げを心がける
1. 同じ志を持つ仲間を探す（一緒に運営を回すメンバー、毎回参加してくれるメンバーのおかげです、ほんとに）
1. ファシリは観られることに快感を覚える（自信を持て！という意味です）

## さいごに

今回はみん読会の運営についてのお話でした。ここまで4冊の書籍をテーマに開催してきたので、それらのお話もできればと思います！
[Rust]条件分岐：Rustのifとmatch文

## シンプルな条件分岐であれば`if`を使える

真偽値に応じて処理を分岐させたい場合は`if`を使用します。TypeScriptと違い、条件は`()`で囲みません。
他の言語と同様に`else`も使用できます。

```rust
fn main() {
    let number = 7;

    if number < 10 {
        println!("Number is less than 10");
    } else {
        println!("Number is 10 or greater");
    }
}
```

### `if`ブロックは値を返すことができる

`if`ブロックは値を返すことができるので、いわゆる三項演算子（TypeScriptでいう`const a = b ? c + d;`のようなもの）は不要です。

```rust
fn main() {
    let condition = true;
    let number = if condition { 5 } else { 10 };

    println!("The value of number is: {}", number);
}
```

:::note
`if`ブロックの最後の式で値を返すことができるのは新鮮で、単純に便利だと思いました。三項演算子より直感的ですよね。
```ts
const condition = true;
const number = condition ? 5 : 10;
console.log(`The value of number is: ${number}`);
```
:::

## ある値に対してパターンマッチングしたい場合は`match`を使う

いわゆる、TypeScriptでいう`switch`文に相当しますが、よくある`switch`文とは若干記法が異なります（明示的な`break`が不要）。
複数の値を一つのパターンにまとめる場合は`|`で繋げます。評価対象が数値で、パターンとして範囲を指定したい場合は`Range`構造体を使います。シンプルなやり方は`..`を使う方法です。`p..q`と書くと、`p`以上`q`未満を表現する`Range`を作成できます。
どれにも当てはまらない場合は`_`で受け取ります。

```rust
fn main() {
    let number = 5;

    match number {
        1 => println!("One"),
        2 | 3 | 5 => println!("Prime number"),
        4..=10 => println!("Number is between 4 and 10"),
        _ => println!("Other number"),
    }
}
```

:::note
TypeScriptの`switch`文は`case:`とセットで使い、インデントで処理を分けるので、Rustの`match`の記述量の少なさに驚きます。
上記の例と同等のTypeScriptのコードは以下のようになります。
```ts
const number = 5;

switch (number) {
    case 1:
        console.log("One");
        break;
    case 2:
    case 3:
    case 5:
        console.log("Prime number");
        break;
    case 4:
    case 6:
    case 7:
    case 8:
    case 9:
    case 10:
        console.log("Number is between 4 and 10");
        break;
    default:
        console.log("Other number");
}
``
:::

`if`と同様、`match`も値を返すことができます。

```rust
fn main() {
    let number = 3;
    let message = match number {
        1 => "One",
        2 | 3 | 5 => "Prime number",
        4..=10 => "Number is between 4 and 10",
        _ => "Other number",
    };

    println!("{}", message);
}
```

`match`は後日解説する`Enum`や`Option`を組み合わせることで強力な処理フローを実現します。

注意点として、Rustの`match`は**包括的**（公式ドキュメントより）です。すなわち、比較対象が`Enum`のように有限個の値を取る場合、そのすべてを拾えるようなパターンマッチングでなければコンパイラはエラーを出力します。もし特定のパターンだけ処理を実行し、それ以外は無視したい場合は、前述のように`_`を利用しましょう。
[CAIレシピ] OSコマンドの実行

## はじめに
この記事ではCAIプロセスからOSコマンドを実行して、実行結果を取得する手順を確認します。

今回はコマンド`cat /proc/meminfo | grep Mem`の実行結果を取得する手順を確認していますが、記載の手順にてJavaやPythonコードなどを実行することもできます。CAIではプログラミング言語としてXQueryを使用できますが、XQueryでは実装が難しい場合もあると思います。そのような場合、今回の紹介するレシピを用いてJavaやPythonコードなどを実行できるので汎用性の高い実装レシピになると思います。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [プロセス実行環境の切り替え(Secure Agent環境での実行)](https://qiita.com/shunsuzu/private/2afc72613d894b4d553e)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)


## OSコマンドの実行許可設定

次の手順でOSコマンドの実行を許可する設定をします。

1. アプリケーション統合コンソールを開いて、__サーバーの環境設定__ タブを選択します。
1. 画面上部のリストボックスにてOSコマンドの実行を許可するSecure Agentを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/864fdc20-aba4-773c-4a4a-64178652ac7b.png)

1. __シェルサービスの有効化__ にチェックを入れて保存ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/e966cb0d-385e-ee18-f8f4-998a53b5a435.png)

## OSコマンドを実行するCAIプロセス

### CAIプロセスの作成

次の手順では、コマンド`cat /proc/meminfo | grep Mem`を実行して、OSのメモリに関する情報を取得した結果をレスポンスとして返すCAIプロセスを作成しています。

1. CAIプロセスを次の設定で作成します。
    - 名称を __recipe-psa-stepOScmd__ とする
    - __匿名アクセス__ を許可する
    - __Secure Agentサーバー__ にデプロイする

1. 出力フィールド __output__ を __タイプ=テキスト__ として定義します。出力形式を __ペイロード全体__ とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/892b4dae-2474-45dc-4776-4d2111a271b9.png)


1. CAIプロセスが次の順に実行されるように各種ステップを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/717bcba6-7aca-f967-c7f3-377a686eb1bb.png)

1. サービスステップを選択、サービスタブを選択して __サービスタイプ=システムサービス__,__アクション=シェルコマンドの実行__ を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/e7cb34ec-f662-5743-70a4-de94b7ff1530.png)

1. 入力フィールドタブを選択して、フィールドの追加ボタンをクリックして、次のフィールドを設定します。
● Command = `cat meminfo | grep Mem`
● Working Directory = `/proc`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/1657218b-1628-c419-9660-fd151fca55e9.png)

1. 割り当てステップを選択して出力フィールド __output__ に __コンテンツ__ として __Output String__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/c7b9343f-7ca6-e999-d44f-bea65a920b80.png)


### CAIプロセスの実行

curlコマンドを例とした動作確認結果です。コマンド`cat /proc/meminfo | grep Mem`の実行結果が得られる動作を確認できます。

```:curlコマンドと実行結果
// curl コマンド
curl -k https://localhost:7443/process-engine/public/rt/recipe-psa-stepOScmd

// 実行結果
MemTotal:       32652892 kB
MemFree:          855540 kB
MemAvailable:   18313232 kB
```





## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)
bundle install で発生した calloc 部分のエラー


## 発生したエラー

bundle install時に以下のエラーが発生した。

```
Installing prism 0.19.0 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
（略）
src/diagnostic.c:285:69: error: 'calloc' sizes specified with 'sizeof' in the
earlier argument and not in the later argument [-Werror=calloc-transposed-args]
285 |     pm_diagnostic_t *diagnostic = (pm_diagnostic_t *)
calloc(sizeof(pm_diagnostic_t), 1);
|
^~~~~~~~~~~~~~~
src/diagnostic.c:285:69: note: earlier argument should specify number of
elements, later size of each element
src/diagnostic.c: In function 'pm_diagnostic_list_append_format':
src/diagnostic.c:315:69: error: 'calloc' sizes specified with 'sizeof' in the
earlier argument and not in the later argument [-Werror=calloc-transposed-args]
315 |     pm_diagnostic_t *diagnostic = (pm_diagnostic_t *)
calloc(sizeof(pm_diagnostic_t), 1);
|
^~~~~~~~~~~~~~~
src/diagnostic.c:315:69: note: earlier argument should specify number of
elements, later size of each element
cc1.exe: all warnings being treated as errors
make: *** [Makefile:49: build/static/diagnostic.o] エラー 1
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

## 原因

c言語のコードで使用されている`calloc`関数の引数の指定に誤りがあること。
```c
void *calloc(size_t num, size_t size);
```
`num` は確保するメモリの「要素数」、`size` は各要素の「サイズ」

https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/calloc?view=msvc-170

```c: エラーが発生しているコード
pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) calloc(sizeof(pm_diagnostic_t), 1);
```
先にサイズを指定し、その後メモリの要素数を指定している。

```c: 正しいコード
pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) calloc(1, sizeof(pm_diagnostic_t));
```

## 修正

該当のコードを手作業で修正したが、bundle installする度にインストールし直されるため効果なし。

エラーが発生している箇所は、prismというgemのインストールの箇所だが、Gemfileで特段指定していなかった。また、バージョンが古いことに問題がある可能性を考え、Gemファイルに以下を追加した。

```ruby: Gemfile
gem "prism", "1.2.0"
```

これに伴って、prismのバージョンと会わなくなった他のgemのバージョンを変更したところ、エラーなくbundle installが完了した。
プリザンターで画面表示が遅いなと思ったら・・・

# 概要
プリザンターを使い続けると画面表示が遅くなったように感じることがあるかもしれません。そんなパフォーマンスの課題について、対処策とまではいきませんが今までの経験を踏まえたTips的なことをお伝えしたいと思います。

# 1. エディタの設定
プリザンターは基本的な仕組みとしてサーバ側で表示するHTMLをすべて組み立ててクライアントに送信しています。そのため、組み立てるHTMLの簡素化を行うことでパフォーマンスの改善が期待できます。

## 1-1. 「検索機能を使う」をONにする
特に他テーブルをリンクした場合に有効な対処方法です。  
分類項目の選択肢を設定すると通常はドロップダウンリストとなります。HTMLとしてはselectタグで選択肢の分だけoption要素が生成されます。
そのため、編集画面上に他テーブルリンクの分類項目が多い場合や、選択肢の数が多い（上限500件[^1]）場合、selectタグを生成するためのデータ取得およびHTML生成の処理に時間がかかります。
「検索機能を使う」をONにすると、ドロップダウンリストではなく、検索ダイアログの表示となります。htmlとしてselectタグの生成は行わないため、選択肢生成のためのデータ取得処理などがスキップされますので、結果としてパフォーマンスが改善する可能性が高くなります。
なお、この設定は編集画面の他、一覧画面のフィルタでも有効ですので、編集画面と一覧画面両方のパフォーマンス改善が期待できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/38fdd30c-03a3-c461-d46d-dbff963668f3.png)
[^1]: General.jsonの「DropDownSearchPageSize」で設定変更できます。

## 1-2. リンク情報を非表示にする
1-1.と同様に他テーブルをリンクした場合で、特にリンク元レコード（子レコード）の件数が多い場合に有効です。
デフォルトの設定では、リンク関係を設定し親テーブル、子テーブルにレコードを登録すると、画面下部に「リンク」としてリンク元／先のレコードが一覧で表示します。この表示を行うためにリンク元／先のテーブルからリンクしている／されているレコードを取得する処理とHTMLを生成する処理、またクライアント側でHTMLを描画する処理が実行されますので、リンクを非表示にすることでパフォーマンスが改善する可能性が高くなります。
リンク情報を非表示にするには「エディタの管理」の「リンクを表示しない」にチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/7573d8f0-2ed8-b566-1c11-0195d83e84ff.png)


## 1-3. テーブル構成をシンプルにする
こちらもリンクに関連した内容です。プリザンターの基本的な仕組みとしてテーブルを開く際にサイトの構成情報を読み込みますが、その際、リンク元／先の情報を読み込みます。この読み込みは「親の親の親の・・・」「子の子の子の・・・」とリンクがつながっているテーブルを全て探索する仕組みとなっています。そのため、テーブル構成が複雑なほど読み込みに時間がかかる傾向になりますので、可能な限りシンプルな構成にしたほうがパフォーマンス向上につながります。

# 2. スクリプトの設定
特に画面表示時点で ```$p.apiGet``` などで他テーブルに対するデータ操作を行う場合は注意が必要です。 ```$p.apiGet``` などは内部的にはプリザンター自身に対してAPIを実行するため、実装内容によってはサーバ側から処理結果が返ってくるまで画面表示が待たされる場合があります。

# 3. サーバスクリプトの設定
サーバスクリプトは一覧画面、編集画面の表示において下記の順序で各条件が呼び出されます。条件の設定次第で画面表示のタイミングで同じ処理が複数回呼び出される可能性もあり、その結果パフォーマンスに影響する場合があります。条件の呼び出し順序とそれぞれの条件で実行したい処理内容を適切に見極め、サーバスクリプトを設定することでパフォーマンス改善が期待できます。
### 一覧画面表示の実行順
1. サイト設定の読み込み時
2. ビュー処理時
3. 画面表示の前  
～以降はレコード件数分繰り返し実行～
4. レコード読み込み時
5. 行表示の前

### 編集画面表示時（新規登録時）
1. サイト設定の読み込み時
2. 計算式の前
3. 計算式の後
4. 画面表示の前

### 編集画面表示時（登録済みレコード表示時）
1. サイト設定の読み込み時
2. ビュー処理時
3. レコード読み込み時
4. ビュー処理時
5. 画面表示の前

# 4. 基盤スペックの見直し
プリザンターはスモールスタートできる点がメリットですが、利用規模が拡大するにつれてスタート時点の基盤スペックでは不足してくる場合もあります。その際は基盤のスペックアップをご検討ください。
基盤の更改は多くの課題があるので画面設定など違い気軽に対応できるものではありませんが、システムを快適に利用するためにはユーザ数・データ量など利用規模に見合った基盤を準備することが大切です。


# まとめ
以上記載した内容のまとめになります。
**このTipsをやれば必ず改善するわけではありませんのでその点はご了承願います。**
* 「検索機能を使う」をONにする
* 「リンク情報」を非表示にする
* テーブル間のリンク関係をシンプルにする
* スクリプト ```$p.apiGet``` などのAPI実行メソッドは画面表示のタイミングでは極力使用しない
* サーバスクリプトは各条件で必要な処理が実行するように見極める
* 基盤のスペックアップも検討する


# 最後に
今年もプリザンターご利用いただきありがとうございました。より皆様に使っていただける魅力のある製品にするべく取り組んでいきますので、ぜひご期待ください。
来年もプリザンターをよろしくお願いします。
【初心者の覚書】GPUとは

新しいPCを求め彷徨っていたところ、聞いたことのないCPU(AMD,Snapdragon...)を知り、CPUを調べると複数種類あり、投機目的として頑張っている人たちもいることを知り、"Nvidiaが熱い"と気づき、GPUってなんだ？(情弱)となったため、GPUについて書き連ねた。

# GPUとは
> GPU（Graphics Processing Unit）とは、コンピュータに搭載される半導体チップの一種で、画面表示や画像処理に特化した演算装置。
[GPU 【Graphics Processing Unit】 グラフィックスプロセッサ](https://e-words.jp/w/GPU.html)

CPUが「中央処理装置」だったのと比べて、GPUは「画像処理装置」。
正直、GDP(Gross Domestic Product)、GNI(Gross National Income)、GNP(Gross National Product)など、"G"のつく単語には過去のテスト勉強で悩まされた記憶があり、その一種だと完全に思っていた。
しかし、独自に画像専用の処理装置も存在しているとのことだ。

Youtuberのように動画処理を沢山する方、ゲーミング利用のためには「GPU」が重要になるのかもしれない。
ついつい神格化してしまっていたが、これらはしっかりと存在しており、話題の半導体である。そして、「内蔵GPU」としてCPUと一体型になっているものもあれば、独自に存在しているものもあるようだ。

> 内蔵GPUはすべてのCPUに搭載されているわけではありません。
CPUメーカーのIntelとAMDでも傾向が違います。
IntelのCPUには基本的にGPUが内蔵されています。
AMDのCPUには基本的にGPUが内蔵されていません。
[内蔵GPUとは何か？ グラフィックボードとの違いやメリット・デメリットを解説](https://www.choke-point.com/whts-onboardgpu/#index_id1)

実物を見た方が理解できるかもしれない。

## 内蔵GPUの画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/d76a8a88-c16d-93ac-1063-6d73c1b3aa51.png)
画像参照：[「ビデオカード高騰中の今だから気になる内蔵GPU性能。第11世代Core＆Ryzen Gでどこまで戦える!?(2/25)」、PCWatch](https://pc.watch.impress.co.jp/img/pcw/docs/1336/867/html/028-01_o.png.html)

わかりやすい画像を探してしまい、上記は約4年前2021年の記事となり、価格や性能に変動があるため、雰囲気だけにとどめていただきたい。

内蔵GPUについて最新のものを調べていたところ、AMDの最新"APU"というものが2024年2月に発売されていたとのことだ。
自分は"GPU"でも一杯一杯だったのに、また未知の言葉に出会ってしまい複雑な心境である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/64b26a00-b0dc-ec0f-1cad-ac53ee8733a0.png)
[ついにデスクトップにも到来！待望の高性能APU「Ryzen 8000G」をテスト](https://pc.watch.impress.co.jp/docs/column/hothot/1564587.html)

ちなみに上記のRyzen 8000Gを「FPSおじさん」というPC好きな方がお勧め動画を挙げており、サムネの「グラボ不要じゃん」というパワーワードが記載されており、気になる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/deda0c27-30e7-c210-e77e-50585f9a509a.png)

動画：[最強の内蔵GPU Ryzen 7 8700Gをレビュー 5700GやGTX1650と比較 AFMF検証 7200MHzメモリもテスト](https://www.youtube.com/watch?v=uuxQzaAuElQ)



## グラフィックボードの画像(外付け)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/78f7a977-2301-3d63-a864-274343f61460.png)
画像参照：[「グラフィックボードのおすすめ12選 コスパのよいモデルや高性能モデルも紹介」、ビックカメラ](https://www.biccamera.com/bc/i/topics/osusume_graphic_board/index.jsp)

そういえば自作PCをよく自慢してくる友人がPCを分解して掃除しているのを見た時、扇風機みたいなこれを自慢してきた記憶が蘇ってきた。

これが凄い画像処理をしてくれるなんて想像するのが難しすぎる。

ちなみに「ビデオカード」という、病棟によくある有料でテレビが見れるカード「テレビカード」のような名前のものも、グラフィックボードと同義のものらしい。
> PCがディスプレイに映像を映し出すためのパーツがグラフィックボードで、ビデオカードとも呼ばれます。
[「グラフィックボード・ビデオカードの選び方」、価格コム](https://kakaku.com/pc/videocard/guide_0550/)


# まとめ

GPUはGDPとは無関係で、画像処理に特化した半導体のことである。
CPUに内蔵されているものもあれば、外付けの場合もある。

![スライド1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/94eb4c18-85bd-d06d-43bc-67425530cfcb.jpeg)


# 参考にした記事

https://e-words.jp/w/GPU.html

https://www.kagoya.jp/howto/engineer/hpc/gpu1/

https://www.choke-point.com/whts-onboardgpu/#index_id1

https://pc.watch.impress.co.jp/img/pcw/docs/1336/867/html/028-01_o.png.html

https://www.biccamera.com/bc/i/topics/osusume_graphic_board/index.jsp

https://pc.watch.impress.co.jp/docs/column/hothot/1564587.html
親切なtimeといえばhyperfine

メリークリスマス！[開発環境を紹介します Advent Calendar 2024](https://adventar.org/calendars/10438)です。

今日も今日とて隙間産業。
本日紹介するのは、前回ripgrepを紹介したときにベンチマークをとったhyperfineです。

## [hyperfine](https://github.com/sharkdp/hyperfine)

hyperfineはRust製のコマンドラインベンチマークツールです。
言うならば、Rustで現代風に再実装されたtimeコマンドです。

メジャーなtimeコマンドに比べて、以下のような利点があります。
とりあえずコマンドを叩けば十分な結果を出してくれる親切さが良いです。

- デフォルトでほどよいN回を推定し実行してくれる
- 実行中の視覚的フィードバック
- シグマのような統計値も出してくれる
- 数値に問題があると改善案を警告で提案してくれる
  - 結果が速すぎて正確な値じゃないかもしれない、とか
  - 最初の数値だけ遅いとwarmupをしないか、とか
- 様々な出力形式に対応
  
### 実行例

前回の記事で行った、grepとripgrepの比較の様子です。
実行中にプログレスバーが出てわかりやすいですね。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/79a1fadd-50c0-acc1-eee5-b813719c7c1b.gif)

上記gifの最後に出ている結果はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/8df002e0-479b-693f-62a1-fd1e53ad7987.png)

- それぞれ10回実行され、統計値（σ、max、min）を出してくれる
- 初回実行が遅いと警告を出し、以下をお勧めしている
  - `--warmup`オプションによる実行前にN回のウォームアップ
  - `--prepare`オプションによるキャッシュクリアコマンドの指定
- コマンドを2つ入力すると、比較結果を出してくれる

## まとめ

hyperfineの紹介でした。
timeの代わりに親切なhyperfineを使おう！
2>&1 の使い方と応用（連載第25回/25回）

# はじめに
### `2>&1` の使い方と応用

`2>&1` は、LinuxおよびUnix系システムのシェルで使用されるリダイレクト演算子です。これにより、標準エラー出力（`stderr`）を標準出力（`stdout`）にリダイレクトし、両者を同じ場所に出力することができます。これは、デバッグやログファイルの収集に非常に有用です。

#### 基本的な使い方

シェルスクリプトやコマンドラインで、`2>&1` を使用して標準エラー出力を標準出力にリダイレクトします。ここで、`2` は標準エラー出力を示し、`1` は標準出力を示します。`>` 演算子はリダイレクトを意味します。

```powershell
command > output.log 2>&1
```

このコマンドは、標準出力と標準エラー出力の両方を `output.log` ファイルにリダイレクトします。

***標準出力（stdout）***
ファイルディスクリプタ番号 `1` として表されます。通常、端末やファイルにコマンドの出力を送ります。

***標準エラー出力（stderr）***
ファイルディスクリプタ番号 `2` として表されます。エラーメッセージを表示するために使用されます。

***リダイレクトの仕組み***
`>` : 標準出力を指定した場所にリダイレクトします。

`2>&1` : 標準エラー出力を標準出力にリダイレクトします。ここで `&` は「ファイルディスクリプタ」の意味です。

#### 応用例

```powershell
# 標準出力のみをファイルにリダイレクト：
#標準出力のみを output.log ファイルにリダイレクトし、標準エラー出力は端末に表示します。
command > output.log

# 標準エラー出力のみをファイルにリダイレクト：
# 標準エラー出力のみを error.log ファイルにリダイレクトし、標準出力は端末に表示します。
command 2> error.log

# 両方の出力を同じファイルにリダイレクト：
# 標準出力と標準エラー出力の両方を output.log ファイルにリダイレクトします。
command > output.log 2>&1

# 標準出力と標準エラー出力を別々のファイルにリダイレクト：
# 標準出力を output.log ファイルに、標準エラー出力を error.log ファイルにそれぞれリダイレクトします。
command > output.log 2> error.log
# 標準エラー出力を標準出力にパイプし、さらに別のコマンドに渡す：
# このコマンドは、標準エラー出力を標準出力にリダイレクトし、さらにそれをパイプで別のコマンドに渡します。
command 2>&1 | another_command
```
# おわりに
`2>&1` の基本的な使い方と応用例を理解することで、シェルスクリプトやコマンドラインでのデバッグやログ収集が効率的に行えるようになります。

一覧

https://qiita.com/advent-calendar/2024/pig
インタラクティブプレビューつき置換 visual-regexpの紹介

メリークリスマス！[Emacs Advent Calendar](https://qiita.com/advent-calendar/2024/emacs)です。

本稿では、Emacsのパッケージであるvisual-regexpを紹介します。
今年開催された[東京Emacs勉強会 サマーフェスティバル2024](https://tokyo-emacs.connpass.com/event/321255/)の懇親会で紹介したら好評だったので記事にしてみました。

## 置換の様子の比較

さっそくですが、次の動画はuse-package節をleaf節に置換している例です。
途中で間違えてqueryを修正する様子もいれてあります。

### Emacs標準 `query-replace-regexp`

![query.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/b519f3f3-da0d-7c03-53d3-dde2f90be920.gif)

### visual-regexp `vr/query-replace`

![visual-regexp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/f9a39fbd-2b98-0eef-9444-595a65a92308.gif)

## visual-regexpの良さ

Emacs標準の置換である`query-replace`や`query-replace-regexp`に対して、visual-regexpの`vr/query-replace`には以下のような良さがあります。

- 置換元の入力中に、`\( \)`で括ったキャプチャグループのマッチをハイライト
- 置換後の入力中に、結果をインタラクティブにプレビュー表示

特に置換後のプレビューが便利です。
`query-replace-regexp`だと、置換を1つ`y`で実行してみて、間違っていたらundoして、queryを修正して、また置換してみて…。
となりがちでした。
それがvisual-regexpだと、入力中すぐに間違いを見つけられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/7855b727-4fee-a87b-a101-120dc724d607.png)

## まとめ

- visual-regexpはいいぞ
- Emacsの設定沼は楽しい
M5Stackでつくる初代プレイステーション用ファイル転送サーバー

## はじめに
　初代プレステ（以降、PS1）でunirom8というユーティリティソフトを起動すると、シリアルポート経由で自作プログラムを転送可能です。
　unirom8では、転送元でwindowsプログラムの「nops.exe」を使うことが推奨されています。

https://github.com/JonathanDotCel/unirom8_bootdisc_and_firmware_for_ps1

　転送プログラムを動作するためだけに、windowsマシンを用意するのは大変です。マイクロコントローラのボードを活用できれば、PS1よりも小さくできますし、電源をPS1からとることも可能となります。
　Pythonプログラムだとマイクロコントローラにも利用可能なので、「sioload.py」をunirom8対応に改良しました。詳細は、kazuedaの活動記録2024の12月23日の記事「ファイル転送プログラムsioload.pyをLLMを使ってunirom8対応にする」で紹介しています。

https://qiita.com/advent-calendar/2024/kazueda_records_2024

さらに、ESP32搭載のボタンと画面のついているM5StacGrayで動作すると、可搬性と操作性の両方が高まります。

https://docs.m5stack.com/en/core/gray

　
　本稿では、改良版sioload.pyを参考にM5StackGrayで動作するArduino IDE用CPPファイルを作成したので紹介します。

本稿の内容は、「東海道らぐの万鹿博覧会ライトニングトーク大会 in 大阪南港」での発表内容を含みます。

https://tokaidolug.connpass.com/event/334044/

## M5StackGray
　320x240のTFTLCDが搭載されており、画面下に3つの物理ボタンがついています。マイクロコントローラとしてESP32を搭載しているので、Arduino IDEを使って開発が可能です。

## LLMを使った移植
　改良版sioload.pyをアップロードし、sioload.pyの動作の解説をLLMに行わせます。
　次に、sioload.pyをM5StackGrayを対象としたCCPファイルへの移植をLLMに行わせます。その際に、追加機能として、SDカード上の指定したディレクトリに保存したファイル名の表示、指定したディレクトリ内のファイルをボタン操作で選択、ファイル選択後にボタンを押すことでのファイル転送、を付け加えるよう指示しました。
　Arduino IDE上でコンパイルしたのち、M5Stackに書き込みます。特にエラーは出ませんでした。
　
## 実際の動作
　初代プレステ用uCLinuxのカーネルを転送して、カーネルパニックになるのを確認します。
　使用したカーネルは以下のサイトのものです。

https://github.com/CodeAsm/PS1Linux/tree/0d3c1fe1171be8d818a033a37e14786bd0a1ea06

　M5Stackのボタンを使って、アップロードするファイルを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/6aefbf64-4946-2adb-4127-079d17ac1840.png)
　転送用ボタンを押すと、プレステ側の画面が変わって「DOWNLOADING .EXE…」が表示され、転送が始まります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/c17e9cc4-5120-a569-b3ba-7a9e43ae2967.png)
　ブロックごとにファイルが転送されているのが、M5StackのLCDに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/26df0572-18d0-548a-a3cb-3b589a20c28b.png)
　ファイル転送が完了すると、プレステ上でuCLinuxが動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/562a8584-d428-8027-3b1e-a1ac7be156eb.png)
　画面が流れているので、NTSC表示ではないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/8eaebbc3-22ea-2dbe-2361-f7facf139ab0.png)
　ドン･キホーテTV-171-BKだと、文字がずれてるけど静止して、表示されます。

## おわりに
　M5Stack上のファイルをPS1に転送することができました。画面表示に修正の余地がありますが、目的の機能を実現することができました。
　ファイル転送後に、シリアルターミナルとしてPS1の起動の様子が表示されたり、M5Stackに接続したキーボードから入力できたりするとよいかもしれません。
ファミコンでオープンソースのBASICインタプリタを動かす話

## はじめに
　ファミコンで動作するOSを探していると、C64のカーネルとBASICインタプリタを移植した話を見つけました。ファミコンでBASICプログラムというと、ファミコン用に販売されたファミリーベーシックのカートリッジとキーボードのセットを思い出します。このセットで、プログラムの勉強を始めた方も多いのではないでしょうか。
　本稿では、移植されたC64のカーネルとBASICインタプリタの動作実験を紹介します。
　本稿の内容には、「レトロゲーム勉強会#10」と「Open Source Conference 2024 Kyoto」の展示内容の発表内容が含まれます。

https://retrog.connpass.com/event/308272/

https://event.ospn.jp/osc2024-kyoto/

## NES64
　6502CPUを搭載したパソコンに、コモドール社のC64があります。C64に搭載のカーネルとBASICインタープリタが、 2024年にcalcwatchさんによって、ファミコンに移植されました。この環境がNES64です。
　ファミリーベーシックキーボードを使って、文字入力を行います。
　MMC5カートリッジを使うことで、32 kB程度のRAMを利用可能です。
- PRG ROM	8Mbit
- CHR RAM	8Mbit
- WRAM		32KB+32KB

「POKE」、「PEEK」や「SYS」は利用できません。

https://github.com/calcwatch/nes64

## 実際の動作
　NES64ではROMイメージが「nes64.zip」として提供されているので、ダウンロードします。

https://github.com/calcwatch/nes64/releases

　使用するカートリッジはMMC5対応のものです。EverDriveN8ProFamiを入手して使うのがおすすめです。

https://krikzz.com/our-products/cartridges/n8-pro-fami.html

起動時すると使用できるRAMがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/5290d67b-9c89-fb1d-4637-6eed587f498d.png)
ファミコンで、24575 BのRAMが使用できます。
プログラムを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/0a26dae4-7ad3-b1c2-7cef-1b70d819f84c.png)

## おわりに
　ファミリーベーシックの世界と比べると、広大なRAMの領域が広がっています。C64BASICなので、ファミリーベーシックとは文法が少し異なりますが、ファミコンで大きなソフトを作ることが可能となりました。
ファコンのNES-OSを起動した話

## はじめに
　ファミコンで動作する自作ソフトを探していると、OSを見つけることがあります。本稿では、2016年に公開されたNES-OSを紹介します。

https://github.com/Skidlz/NES-OS

　本稿の内容には、「Open Source Conference 2024 Kyoto」の展示内容が含まれます。

https://event.ospn.jp/osc2024-kyoto/

　以下に展示の様子を示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/42b4e0fa-9241-bc07-5dc6-03a2da4ccf9e.png)
　右側の黄色いカートリッジが接続されているのが、NES-OSの展示です。

## NES-OS
　2016年にSkidlzさんによって開発されたOSで、「BrainF Interpreter」、「Snake」や「Life」が動作するそうです。
　コマンドとして、「echo」、「pause」、「clear」、「edit」、「brainf」、「peek」、「poke」等が利用可能だそうです。
　想像で話しているのは、文字入力の方法が詳細に記載されていないからです。PS/2キーボードを接続して利用するようですが、接続方法が不明です。
　入力できる文字は、コントローラのボタンのAとBです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/f3930373-30e4-e2cf-4cae-bd7b19065d5d.png)
## windows上でNES-OSのROMファイルの作り方
１．以下のurlからNES-OSをダウンロード

https://github.com/Skidlz/NES-OS

２．NES-OSのSourceディレクトリに以下のurlから「NESASM3.exe」をダウンロード

https://github.com/mitch3b/MashyMashy/blob/master/NESASM3.exe

３．NES-OSのSourceディレクトリ内のasm.batを起動

「keyb.rom」が生成しますので、このファイルをROMカートリッジに保存して起動します。OSC2024京都では、EverdriveFamiを使って動態展示を行いました。

## おわりに
　OSC2024京都では、PS/2キーボードでの入力まで再現ができませんでした。「Iコン、IIコンのどちらでのデータ処理か教えてください」とLLMに問い合わせました。答えは以下の通り。

`KEYB.asm.txt`ファイルの内容から判断すると、キーボード入力処理は**Iコン**（コントローラ1）で行われています。

具体的には、以下のコード部分でIコンのデータを読み取っています：

```assembly
controller:
 lda #$01
 sta $4016
 lsr a ;clear a
 sta $4016
CHECK_A: 
 lda $4016
 and #$01
 beq CHECK_B
```

このコードでは、アドレス`$4016`を使用してコントローラポートからの入力を読み取っています。`$4016`はIコンのデータレジスタです。

#### まとめ
- **キーボード入力処理**は**Iコン**（コントローラ1）を使用して行われています。
- コントローラポートのデータレジスタ（アドレス`$4016`）を操作することで、キーボードからの入力を読み取ります。

他に質問があれば教えてくださいね。


　ということですので、Iコンの端子にPS/2キーボードをつないでみます。
ファコン実機上でLUnixが起動途中で止まる話

## はじめに
　ファミコンでUNIX風OSのLUnixが動作するということで、エミュレータのMesenとファミコンクラシックミニを使った起動実験を行いました。
　本稿では、実機での動作実験の結果を報告します。
　本稿の内容は、「鹿児島Linux勉強会 2024.03(オンライン開催)」での発表内容を含みます。

https://kagolug.connpass.com/event/311025/

　LUnixの説明は、kazuedaの活動記録2024の12月19日の記事「ファミコンエミュレータMesenでUNIX風OSのLUnixを動かす話」を参照してください。

https://qiita.com/advent-calendar/2024/kazueda_records_2024

## ファミコン本体、EverdriveN8Famiとファミリーベーシックキーボードでの起動
　ファミコンで自作ソフトを動作させる際に利用可能なカートリッジにEverdriveN8Famiがあります。

https://krikzz.com/our-products/legacy/edn8fami.html

　このカートリッジでは、ディスクシステムのエミュレーションが搭載されていますので、ディスクシステムが無くても、LUnixの動作実験可能です。
　このカートリッジで使用するマイクロSDカードに「lunix.fds」を保存し、起動時に表示されるファイルリストから「lunix.fds」を選択すると、LUnixが起動します。
　「.」が表示されたら、ファミリーベーシックキーボードから「l sh」と入力します。
　この組み合わせでは、「[0001] unhandledd: I/O error」のエラーが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/c4e4a322-4f7f-e7d2-fe10-62890af4d581.png)


## ファミコン本体、RAMアダプタ、FDSKeyとファミリーベーシックキーボードでの起動
　ファミコンディスクシステムのドライブ部分のエミュレータとして、FDSKeyがあります。

https://github.com/ClusterM/fdskey

　作者のClusterさんは、ファミコンクラシックミニのツールとして知られる「hakchi2」の作者としても知られています。
　さて、他にもディスクドライブのエミュレータはありますが、このディスクドライブエミュレータの特徴はドライブの動作状況がLCDに表示されることです。
　このディスクドライブエミュレータを使って、どこでエラーが出ているか確認しました。
　「lunix.fds」を起動すると、LCDに以下のエラーが表示されます。
```
"Error, Wrong block CRC" 
```
　FDSKeyはオープンソースですので、ディスクドライブエミュレータのソース内のCRCチェック部分をスキップするよう修正したもので、動作確認しました。
　エラー表示は無くなりました。LCDの表示では、ディスクの先頭に移動してディスクの最初の部分を読み込んでしばらく移動したところで、移動が止まりました。
　「lng-fds」では、先頭部分にブートローダーとミニシェルがあり、そのあとに各種コマンドが存在します。コマンドが入力されると、ディスクの先頭に戻り、コマンドのある場所まで移動してコマンドのプログラムを読み込むようです。
　想像の域を出ませんが、ディスクの終わりにディスクの最後を示すコードが書かれていなくて、2周目の始めは、ディスクの最後の続きの様に判定されているのかもしれません。
　FDSのフォーマットの勉強をして、lunix.fdsのソースファイルを調べてみます。

https://www.nesdev.org/wiki/FDS_disk_format

## おわりに
　ファミコンの実機でLUnixを動かそうとしましたが、起動までしか成功しませんでした。この記事を書くために、githubのページを見ていると、作者による修正が少し行われているようです。
　最近の修正で動作がどのようになっているか確認してみます。
ファミコンエミュレータMesenでUNIX風OSのLUnixを動かす話

## はじめに
　8ビットCPUで動作するOSの情報を集めていると、ファミコン上でUNIX風OSの動作に成功したとの記事を見つけました。
　実際に、どのように動くか確認しました。
　本稿の内容は、「鹿児島Linux勉強会 2024.03(オンライン開催)」での発表内容を含みます。

https://kagolug.connpass.com/event/311025/

## LUnix Next Generation
　ファミコンのCPUは6502という8ビットCPUをベースに作成されました。

https://ja.wikipedia.org/wiki/MOS_6502

　6502のCPUを搭載したコンピュータのうち、Comodore64、Commodore128、Atari 400/800、Apple IIで動作するUNIX風OSにLUnix Next Generation（以降、LNG）があります。このOSはTCP/IPをサポートしており、ネットワーク接続の実験ができます。

https://en.wikipedia.org/wiki/LUnix

https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AB64

https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A2%E3%83%89%E3%83%BC%E3%83%AB128

https://ja.wikipedia.org/wiki/Atari_8%E3%83%93%E3%83%83%E3%83%88%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF


https://ja.wikipedia.org/wiki/Apple_II

https://lng.sourceforge.net/

https://github.com/ytmytm/c64-lng

## lng-fds
　2024年1月にLNGがファミコンに移植されました。
　Youtubeの解説を見ると、ファミコン本体のRAMが2 KBなので、ディスクシステムのRAMアダプタの32 KBも活用して、動作環境を構築したようです。LNGはディスクシステムから起動し、ファミコンディスクへの読み書きも可能なようです。キーボードには、本体の拡張端子に接続可能なファミリーベーシックキーボードを利用します。

https://www.youtube.com/watch?v=SVqN_FixG0M&t=447s

　Youtubeの動画では、Mesenというエミュレーターでの操作が最初に紹介され、その後、NESとEverDriveの組み合わせで実機での起動が紹介されています。残念ながら、キーボードが接続されていないので、起動時に表示されるピリオド状のプロンプト表示までで、動画は終わります。

## エミュレータのMesenでの動作
　動作に必要なLNGのディスクイメージはあらかじめコンパイルされており、「lunix.fds」として公開されています。
 
https://github.com/decrazyo/lng-fds/blob/main/lunix.fds

　使用されているエミュレータのMesenで「lunix.fds」を動作させるためには、RAMアダプタに搭載のディスクシステムの制御用ROMのイメージファイルが必要です。

https://www.mesen.ca/

　RAMアダプタからROMイメージをダンプしてもいいのですが、本実験では、ニンテンドークラシックミニのROMファイルを使用しました。

https://www.nintendo.co.jp/clv/index.html

　Mesenを起動後に「lunix.fds」を読み込むと、LUnixが起動します。パソコンのキーボードがファミリーベーシックキーボードをエミュレートしますので、「Init v0.1」の次の行の「.」のところに「l sh」と入力すると、LUnixのShellが起動して、コマンドプロンプトが表示されます。



## おわりに
　ファミコンエミュレータのMesen上で、LNGが動作しました。
　ファミコンクラシックミニにもファミコンエミュレータが搭載されているので、起動を試したところ無事起動したのですが、ファミリーベーシックキーボードのエミュレーションの方法がわからず、コマンドプロンプトには至っていません。
　以下にファミコンクラシックミニでLNGを起動した動画を掲載します。

https://x.com/i/status/1761618783566004257
芸能事務所Webサイトから学ぶサーバの負荷対策

# きっかけ

芸能事務所さんのリリースを見ていて、バズってしまったときの負荷対策ってどうしているんだろう思ったので調べてみました。

今回の3社はWordPressで構築されていたのですが、構成が多種多様でおもしろかったので順に紹介します。
（各社社名は頭文字などをとっているわけではないです）

# A社

### 月額コスト固定の構成

さくらのクラウドのELBで冗長化されていました。AWSだとLBのリクエスト数などによって費用が変動するので、ランニングが固定になって良いなと思いました。

CDNなどは利用している様子がないようでしたがWordPressのキャッシュプラグインでうまくチューニングをしているようでした。

トップページの動画などのコンテンツも外部のオブジェクトストレージや、YouTubeではなく、WebサーバのNFS？に直置きしているようだったのでストレージの構成が気になりました。

# B社

### けっこう王道な構成

AWSでホスティングしているようでした。
ほぼ全てのコンテンツ（HTMLなども）をCloudFrontでキャッシュしているようでした。

すべてキャッシュさせることは負荷対策としては効果的なのですが、コンテンツの更新がかかった際にキャッシュの要因で記事の投稿が遅延するのでどうカバーしているのかが気になりました。


# C社

### 用途別にサーバを分散する構成

保守のコストが嵩そうですがよい構成だとおもいました。

タレント検索サーバはフリーワード検索になっておりCDNで捌きにくいコンテンツなので分けることはよいなと思いました。

一方で、出演情報サーバは画像等が多く掲載されあまり変更もないことからCDNですべてのコンテンツをキャッシュするような構成でした。

速報性の高いリリース（謝罪など）は本体サイトに載せていました。CDNでキャッシュはしておらずリリースに画像を使えないようにしていたり、ナビゲーションバーの軽量化などの工夫がされていました。急ぎの文言の変更などをすぐに反映できるため良い構成だなと思いました。

# まとめ

結構サイトによって個性があって面白いとおもいました。
お客様によい提案ができるように色々なサイトをデベロッパーツールで見てみると面白いと思います。
Rust製ターミナルエミュレーター"Alacritty"のおすすめ



# はじめに

この記事は、Qiita Advent Calendar 4日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/2b60d47a2d0e64a273c3

# 本編

## どんな状況でも同じ状況が欲しい！

以前にZSHに関する記事をあげたことがあるのですが、僕は基本的にどこでも同じ環境で開発できる環境を整えることを目標にしています。例えば普段はMacを使いますが、デュアルブートでLinuxを使うこともありますし、はたまたWindowsを使う機会だってあります。どのような状況であっても同じ体験を得るというのはそれぞれの場所でストレスフリーに活動できることを意味すると考えています。

## その名も、Alacritty!

ということで、まず今回はGUI環境でクロスプラットフォームなターミナルエミュレーター環境を用意できるAlacrittyを紹介したいと思います。

https://github.com/alacritty/alacritty

このAlacritty、GPU上で処理されていて尚且つRust製なのでめちゃめちゃ動作が早いです（僕の場合は大元のZSHが遅いのでまあまあ意味ないですが）。ちなみに僕のAlacrittyの画面は下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/820323b0-5dbf-98d8-efae-8810f127440c.png)

## 設定方法

### パッケージマネージャーからインストール

Homebrewで公開されていいます。

```zsh
brew install --cask alacritty
```

とりあえずMacを使っていて試してみたいという方はこちらで試してみてはいかがでしょうか。

### ソースコードをクローンしてビルド

僕はこちらの方法で利用していて、基本的にCargoでビルドしています。

#### 1. ソースコード準備

```zsh
# クローン
git clone https://github.com/alacritty/alacritty.git

# ディレクトリ移動
cd alacritty
```

#### 2. rustup.rsの設定
```zsh
# rutup.rsの設定
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

#### 3. ビルドの設定

```zsh
# ビルド設定
rustup override set stable
rustup update stable
```

#### 4. 依存関係の解決

これは環境ごとに異なるのでそれぞれの状況に合わせてインストールしてください。

https://github.com/alacritty/alacritty/blob/master/INSTALL.md#dependencies

#### 5. ビルド

```zsh
# Linux, Windows, BSD
cargo build --release

# Mac
rustup target add x86_64-apple-darwin aarch64-apple-darwin
make app-universal
```

これで使えるようになります！！

# 最後に

明日は今回設定したAlacrittyの設定とOh-My-ZSHの設定についての記事を書きたいと思います。寒くなってきましたのでみなさまがた体にお気をつけください。
AppInventorと格安USB-シリアルアダプタでシリアル通信

## はじめに
　2024年の目標の一つに、モノ作りイベントでの展示がありました。
　展示の内容は、「自分を応援してくれるロボット」と題して、Androidタブレット上の迷路を解くと、紙製のロボットがおめでとうメッセージを出す仕組みです。
　Androidタブレットのプログラム環境としてAppInventorを使い、ロボットの制御にはRaspberry Pi Picoを用いることにしました。
 
 https://appinventor.mit.edu/
 
 AndroidタブレットとRaspberry Pi Picoの間は、有線のシリアル通信で信号をやり取りすることにしました。
　本稿の内容は、「鹿児島らぐ」での相談とつくろか！の「百舌鳥堂」ブースの展示を含みます。

https://kagolug.connpass.com/

https://tsukuroka3.notion.site/3-WEB-26e2a0c5174641bc8382d63a6dd70ab0

## AppInventorの有線シリアル通信
　AppInventorに標準で用意されているのは、USBホストケーブルを介してArduinoに接続する場合のシリアル通信拡張機能です。
　このモジュールを使う場合、Arduinoに標準搭載のUSB-to-serialアダプタチップにのみ対応していて、汎用の安いUSB-to-serialアダプタでは利用できません。

## Appinventor-SerialOTG
　AppInventorで利用可能なUSB-to-serialアダプタ用拡張機能に、rkl099さん作成の「Appinventor-SerialOTG」があります。

https://github.com/rkl099/Appinventor-SerialOTG　

　この拡張機能では、PL2303、PL2303HX、(PL2303HXN用は未移植)、 FTDI FT232、 CP210x、CH341、CH341 (「偽物」) のチップに対応しています。さらに、CdcAcmとして、オリジナルのArduino Uno、Adafruit Feather M0 と Adafruit CLUE、Micro:bit、Teensy、OpenCR、DigiCDCライブラリを使うATTINY85に対応しています。

https://docs.arduino.cc/hardware/uno-rev3/

https://learn.adafruit.com/adafruit-feather-m0-basic-proto/

https://learn.adafruit.com/adafruit-clue

https://microbit.org/ja/

https://www.pjrc.com/teensy/

https://wiki.ros.org/opencr

https://www.microchip.com/en-us/product/attiny85

　この機能拡張を使って、汎用の安いUSB-to-serialアダプタとRaspberry pi picoと通信します。
## AppInventor上のプログラム
　AppInventor上で「SerialOTG.aia」を追加することで利用可能となります。

https://github.com/rkl099/Appinventor-SerialOTG/blob/main/SerialOTG.aia

　使用方法は「SerialOTG_1.5.pdf」を見るとわかりますが、9600 bpsの通信速度が初期設定です。

https://github.com/rkl099/Appinventor-SerialOTG/blob/main/SerialOTG_1.5.pdf

　以下に、作成したプログラムを示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/fff25e82-e2fc-b7f8-ccb4-df1cdf197123.png)

　
　紫色のブロック「呼び出す SerialOTG1 .Initialaize」、「呼び出す SerialOTG1 .Write データ “BEGINQ”」、「呼び出す SerialOTG1 .Write データ “GOALQ”」の3か所で使用しています。
　配線は以下の通りです。
Androidタブレット＜－USBホストケーブル＋マイクロUSBケーブルー＞USB-to-serialアダプタ　＜－ジャンプワイヤー＞Raspberry Pi Pico

## おわりに
　つくろか！の「百舌鳥堂」ブースの展示では、USB-to-serialアダプタを利用して、AndroidタブレットとRaspberry Pi Picoを接続しました。
　CdcAcmが利用可能ですので、USB-to-serialアダプタを省略できるかもしれません。この点は今後の課題です。
2024アドカレ初参加で完走した感想

# はじめに
- アドカレ初参加で完走した感想を書きます
- 完走のために意識したことを書きます

# 結論
- アドカレ完走してよかった！！！
- 完走とは言わずとも参加してみると面白いよ！！！

# 完走のためにやったこと
- 記事の管理をする
- 11月までに記事の貯金を作る
- ネタ探しをする
- いいキーボードを買う
- この記事を書く

### 記事の管理をする
- どの日付に・どのカレンダへ・どの記事を投稿するのか・その記事は完成しているのか　がQiitaの画面だとわかりにくかった
    - 以下のような表で管理した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/c5ffba68-1de0-e072-7190-9befe89eec2e.png)

### 11月までに記事の貯金を作る
- 12月になってから毎日記事を書くのは非現実的だったので、なるべく11月まで記事を書き溜めておいた
    - 結局書き溜められたのは8本
    - 書きかけは＋10本くらい
    - 12月に入ってから新規で書いたのは7本くらいになった

### ネタ探しをする
- 仕事中でもなんでも記事のネタに出来そうなものを探した
    - 自分が作ったツールとか
    - やってきたこととか学んだこととか
    - 業務外でやった勉強の話とか

### いいキーボードを買う
- [HHKB](https://happyhackingkb.com/jp/products/hybrid_types/)を買った 
    - ~~ずっとほしかった~~
    - タイピングが楽しくなる感覚が分かった
        - 記事を書くモチベーションになった気がする

### この記事を書く
- この記事を書いて予約投稿設定しておく
    - 自分を追い込む
    - なんかの本で「成功イメージは具体性が高ければ高いほど実現しやすい」とか書いてあったので
        - 予祝

# 参加の動機
- 社内の人との差別化
    - 資格頑張ってきたけどみんな取り始めて差別化にならなくなってきた
    - そんならアウトプットでもしてみるか
- アウトプットの練習
    - 100本ノック的な

# アドカレに参加してよかったこと
- 業務のトラブルに前向きになれた
    - 記事のネタを探しているので、何か起きると「新たな学び（＝記事のネタ）になるかもしれない！」と思える
- 急かされると途端にやる気がなくなることがわかった
    - 私「担当日…**ノルマ感**あるなあ…めんどくさ…」
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/6dbead0a-9a90-3def-7370-949ecdfe68d6.png)
- 普段の記事よりもいいねがもらえる
    - 普段は数週間経って1,2個いいねがつけば御の字
    - アドカレは当日に3つくらいもらえたりする
        - うれしい

# 大変だったこと
- 単純にしんどい
    - 25本記事書くのは大変
MSX0でuZix0.1

## はじめに
　M5Stackに移植されたMSX0を入手しました。

https://mobile-app.camp-fire.jp/projects/648742/view?utm_source=google&utm_medium=display&utm_campaign=PO_GDN_pmax&gad_source=1&gclid=CjwKCAiA0rW6BhAcEiwAQH28IlIRq3-bcij6Jcg0oVc9kEn9Jf2Bm4in0sef-IGIAnIB90Onq5nNQxoCtHEQAvD_BwE#argument=33pKQw5N&ai=a60d03e8ac3fbc

　MSX0はM5StackCoreに全てのMSXの規格が移植されたもので、動作するMSX2+を持っていない場合、大変便利なガジェットになります。
　この理由は、8ビットCPUで動作するUNIX風OSのFuzixの動作実験をMSXで行いたい時、MSXにはBIOSのライセンス問題があり、実機を持っていない場合は、いろいろと制限のあるC-BIOSを利用することになるからです。
　MSX0を入手することで、BIOSのライセンス問題を気にせずに、MSX環境の動態実験ができるようになりました。
　さらに、MSX0で、NextorROMを使ったハードディスクイメージのサポートが実現しましたので、大容量メディアの必要なイメージファイルの取り扱いも容易になりました。
　Fuzixの先祖の一つであるuzixの動態実験が可能となります。

https://www.msx.org/wiki/Uzix

　本稿の内容は、OSC2024名古屋での「Fuzixユーザーグループ」の展示内容を含みます。

https://event.ospn.jp/osc2024-nagoya/

## 2024年にMSX0でuzixを起動する
　NextorROMに対応したMSX0でのuzixの起動には、フロッピーディスクイメージとハードディスクイメージを使う選択肢があります。
　しかし、最新のuzix2.0の情報サイトが消失し、InternetArchiveに保存された資料を参照するしかありません。
　現存する情報サイトには、sourceforge上のuzix1.0と、uzix-kernelのソースファイルを保存するgithubのページがあります。

https://sourceforge.net/projects/uzix/

https://github.com/marioaugustorama/uzix-kernel

　ソースファイルはないものの、uzix2.0のフロッピーディスクイメージが1.0のフロッピーディスクイメージとともに公開されているサイトがあります。

https://download.file-hunter.com/OS/Uzix/

「UZIX v1.0.5 (19xx)(Adriano Cunha)(beta).zip」と「UZIX v2.0.0 (2001)(Adriano Cunha).zip」が公開されています。


https://download.file-hunter.com/Games/MSX2/DSK/

上記のサイトのRUNボタンを押すと、エミュレータのwebmsxが起動し、その中でuzixを利用することが可能です。

　また、ハードディスクイメージも含めた解説は、ロシア語のサイトに掲載されています。

https://sysadminmosaic.ru/msx/uzix/uzix

　このサイトには、SunriseIDEとBeerIDEに対応したハードディスクイメージが掲載されています。

　MSX0のハードディスクドライバはNetorROMに内蔵されているものを使うようで、SunriseIDEとBeerIDEに対応したハードディスクイメージは起動しないようです。
　ここでは、フロッピーディスクイメージを利用します。

　フロッピーディスクイメージとして、「UZIX100.DSK」と「UZIX020.DSK」が配布されているので、これらの動作の確認を行いました。
　「UZIX020.DSK」はloaderの表示でハングアップします。
　一方、「UZIX v1.0.5 (19xx)(Adriano Cunha)(beta).zip」と「UZIX100.DSK」は問題なく起動します。画面は「UZIX v1.0.5 (19xx)(Adriano Cunha)(beta).zip」の例です。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/0e70423c-f96a-36f7-7413-17c99bcb283d.png)

「root」でログインすると、シェルが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/d042ebec-c42d-72ab-b16f-92a8a97b966d.png)

「UZIX100.DSK」には、FudoBrowserが内包されています。プロンプトで「fb」と入力すると、以下の様な起動画面が表示されます。RS232のポートを介してWebブラウジングできる可能性があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/ec1f4ed4-767e-7b3f-2d3e-de984eec7113.png)


　以下に示すように、他のバージョンも公開されています。MSXで動作する実験はまだまだ続きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/b6de96db-7a28-77d7-4136-884f19666533.png)



## おわりに
　MSX0でuZixの起動に挑戦しました。「UZIX100.DSK」を使うと、WebブラウザのFudeBrowZerの起動に成功しました。
　「ESC」キーを押すと、シェルに戻ります。その際、以下の表示がでます。

flybrowserはMSX1でも動作するようで、以下のサイトで公開されています。

https://sites.google.com/site/ricbitmsx/development/flybrowser

また、Fudebrowser単体も「FudeBrowser 1.8.dsk.zip」として配布されています。
MSXでのWebブラウジングの調査を続けます。
ESP-WROOM-02搭載のWA-MIKANとWio terminalでモバイルFuzixマシン


## はじめに
　8ビットCPUやマイクロコントローラで動作するUNIX風OSにFuzixがあります。

https://github.com/EtchedPixels/FUZIX

 　マイクロコントローラの例では、Raspberry pi picoでの動作で有名ですが、ESP8266でも動作することが知られています。ESP8266での動作では、ルートファイルシステムをSDカード上に保存するので、ESP8266とSPI接続可能なSDカードスロットが必要となります。
　実験用だと、ブレッドボード上での配線や空中配線で対応可能ですが、展示の場合、ESP8266とSPI接続可能なSDカードスロットが搭載されている基板があれば、便利です。
　Arduino用のシールドのうち、ESP-WROOM-R2を搭載したシールドとSDカードスロットを搭載したシールドを積み重ねることを思いつきましたが、大げさなシステムになりそうです。
　色々調べていると、2016年にWA-MIKANとよばれる、ESP-WROOM-R2とSPI接続可能なSDカードスロットが搭載されている基板を見つけました。

 
https://www.slideshare.net/slideshow/wamikan/63185478

https://github.com/wakayamarb/wa-mikan

　WA-MIKANを使ってESP8266用Fuzixの動作環境を構築します。
　本稿の内容は、2024年1月27日に開催された「OSC2024大阪」の「受光犬&浜ふぁぐ」共同展示ブースでの展示内容を含んでいます。

https://event.ospn.jp/osc2024-osaka/

## 環境設定
　WA-MIKANはGR-CITRUSの通信用ボードとして開発され、GR-CITRUSの取得したデータをSDカードに保存することが可能です。
　ESP-WROOM-R2のSPIとSDカードスロットとの間が接続されていないので、WA-MIKANのマニュアルに従って、ジャンパを接続します。
　次に、Fuzixのソースファイルの修正を行います。1点目は、SDカードスロットの設定です。
WA-MIKANでは、以下の様にESP8266とSDカードスロットが接続されています。
MSIOがESP8266のIO12
MISOがESP8266のIO13
CLKがESP8266のIO14
CTSがESP8266のIO3
Fuzixのソースでは、以下の様な接続を想定しています。

    NodeMCU pin      GPIO pin     SD card pin
    -----------------------------------------
        D5             14            SCK
        D6             12            MISO
        D7             13            MOSI
        D2              4            CS
ソースファイルの該当箇所を修正します。
　2点目は、SDカードに保存したルートファイルシステムを使用するように、ソースファイルの該当箇所を修正します。
　これらの、修正の詳細は、小江戸らぐさんのLinuxUser2023冬号「FuzixでEthernet」にまとめましたので、詳細は参考にしてください。LinuxUserは、各地で開催されるオープンソースカンファレンスやコミケの「小江戸らぐ」ブースで入手可能です。

https://www.ospn.jp/

https://koedolug.connpass.com/

　Wio terminalの設定は、「PICO-EVA-5500とWio terminalでモバイルFuzixマシン」を参照してください。
　以下の配線済み写真では、SDカードを挿入していないので、カーネルパニックの表示が出ています。Wio terminalのGrove端子から、電源、GND、RX、DXが接続されています。
　薄茶色の基板がWA-MIKANで、裏側にSDカードスロットがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/f4f9f392-601d-bc76-8c78-959297856313.png)

## おわりに
　マイクロコントローラで動作するFuzixの動態展示として、ESP-WROOM-R2（ESP8266）とSPI接続のSDカードスロットを用いたモバイルFuzixマシンを紹介しました。
　電子工作を趣味にされている方は、ESP-WROOM-R2を複数個所有されているかとおもいます。ぜひ、試してみてください。
JamfProで気をつけないとやらかす話

[さくらインターネット Advent Calendar 2024](https://qiita.com/advent-calendar/2024/sakura) 6日目です。
6度目まして。さくらインターネットで情シスをしている小泉行生(dumixnet)と申します。

さくらではMacやiPhone,iPadの管理をJamfProで行っております。
私はその管理をメインで行っていたりします。
その話をちょっと書いてみようと思います。

# スマートグループには気をつけろ！
本体のインベントリ情報を見て自動的にグルーピングしてくれる便利な機能。それがスマートグループです。
たとえば… OSがSonomaの端末だけをグループ化させたりできます。
ただ「やってはならない」ことがあります…
それは！「一回作って何かに紐づけたスマートグループは修正してはならない」ということです。
ワタクシ、紐付けしたスマートグループを修正してしまい… 皆さんがお使いの端末に入っているアプリを消してしまう大失態を犯しました😭

スマートグループはいくつ作っても無課金なので、
むやみやたらに修正せず、「コピー」を作って新しい条件を作り保存。 その後「抽出条件」が想定したものになるか「表示」で確認してから、「ポリシー」や「構成プロファイル」の紐付けを入れ替えましょう！

# 送り仮名や省略には気をつけろ！
これは「名前」の付け方なので汎用的に使えるかな？と思いますが…
「持込」「持込み」「持ち込み」
「パソコン」「PC」
なんてのがあった場合3*2=6の名前をつけて保存できます。
勘のいい人はここでわかると思いますが、「選択する時に確実に迷います」
私のようなズボラは1個目と2個目の名前で送り仮名を変更して名前をつけて失敗する事がよくあります。
「01」「02」も同じやつなので要注意です。

# クライアントのMDM証明書が失効してMDM管理ができなくなっちゃった…
これは直近で冷や汗かいたのですが、MDM登録時にインストールされる証明書の有効期間が「2年」になってます。
予備機で長い間寝かしておくと失効してコントロールできなくなってしまう危険があります。
年に1回くらいは起動して証明書の更新を行うのが良いようです。
ただ、それでもうまく更新できない端末があるので…
その場合は「クライアントからコマンドを打つ」という手段で解決できるようです。
今回はこれでも証明書が更新されない端末が出てしまい… OS再インストールの刑になってしまった端末が出てしまいました😭
スマートグループで「証明書が半年以内に切れそうな端末」を作って個別に連絡してコマンド打ってもらったり
全台を対象に「証明書を更新」のコマンドを送りつけたりして端末を保全するということが必要になりました。

# 最後に
台数が多くても少なくても「やらかし」はメンタルにダメージが大きいです。
この記事を読んでやらかしがひとつでも減ってくれればなによりです。