OmniAICreator/Qiita-1.07M huggingface dataset:
ABC381Dを解いた【尺取法?】


筆者はレート800前後の茶～緑コーダ

ABC381のD問題を解いていく

https://atcoder.jp/contests/abc381/tasks/abc381_d

# 実装コード

解説を見たがよくわからなかったので公式解説の解法2のコードをPythonに移植した。

尺取法みたいな実装でいいようだ。

詳しいコードの解説を生成AIから抜粋したのでどうぞ

<details><summary>生成AIによる解説</summary>

1. 連続する同じ数字のグループを見つけるための変数を初期化:
   - ans: 最大値を格納（初期値は0）
   - l: 最後の同じ数字のインデックスを格納（初期値は0）

2. 配列Aの各要素に対してループを行う

3. 条件分岐:
   - if (i-l) % 2 == 0:
     この条件は、偶数番目の要素に対応する
     - if last[a]==i-1:
       最後の同じ数字が1つ前の位置にある場合、lを更新
     - elif last[a]>=l:
       最後の同じ数字が現在の位置以上にある場合、lを更新
   - elif A[i-1] != a:
     これは奇数番目の要素に対応する
     新しい数字が見つかった場合、lをリセット

4. 各ループ内で:
   - 現在の状況をエラー出力（デバッグ用）
   - 現在のグループのサイズ（i-l+1）をansに更新
   - last辞書を更新

5. ループ終了後:
   - ans以下の最大の偶数を出力

</details>


```python:main.py
import sys
from collections import defaultdict
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N = rI()
    A = rLI()
    last = defaultdict(lambda: -2)
    
    ans = 0
    l = 0
    for i,a in enumerate(A):
        if (i-l) % 2 == 0:
            if last[a]==i-1:l=last[a]
            elif last[a]>=l:l=last[a]+1
        elif A[i-1] != a:l=i
        # err(f"{i=},{a=},{l=},{ans=},{last[a]=},{i-l+1}")
        ans=max(ans,i-l+1)
        last[a]=i
    print(2*(ans//2))            

if __name__ == '__main__':
    main()

```

# まとめ

ABC381のD問題解いた。

尺取法で使えばいいようだが、解説がよくわからなかったので、詳しい解説ができなかった。
Makefileで悩んだこと(VSコードの設定)

先日、勉強がてらMakefileを作成してmigrationのコードを実行しようとしていたときにエラーがでて悩んでいたことの記事を書こうと思います。

自分みたいな初心者は設定できていないと思います。


### 結論
・tab ではなく space　でインデントを行っている
・VSCodeの設定でtab入力していても space　に変換される
・VSCodeを設定する必要がある


### Makefile
```

# マイグレーションのアップ
.PHONY: migrate-up
migrate-up:
    migrate -path $(MIGRATIONS_PATH) -database $(DB_URL) up

# マイグレーションのダウン
.PHONY: migrate-down
migrate-down:
    migrate -path $(MIGRATIONS_PATH) -database $(DB_URL) down

# マイグレーションのバージョン確認
.PHONY: migrate-version
migrate-version:
    migrate -path $(MIGRATIONS_PATH) -database $(DB_URL) version

# マイグレーションの状態をリセット
.PHONY: migrate-force
migrate-force:
    migrate -path $(MIGRATIONS_PATH) -database $(DB_URL) force 1

```

今回入力したMakefileです

こちらcopilotに聞いて入力したものです。
コードの上にパスを変数として定義して書いています。


コードを実行すると出てくるエラーがこちら ↓
```
make migrate-up
Makefile:9: *** target pattern contains no `%'.  Stop.
```

copilot先生に聞いてみた答えが
「Makefileのインデントがスペースではなくタブである必要があります。」と教えてくれました。

なるほど🧐

書いてあることは簡単だなと思い修正してもう一度実行しても同じエラー

### 原因

最初はcopilot先生が間違えていると思い自分で検索して調べていたらどうやら **VSCode では、デフォルトで tab が space に変換される設定になっており、Tab キーを押したとしても実際に入力されるのは space** になるそうです。


### 解決策
VSCodeの設定から　**Insert Spaces** こちらで検索してチェックを外してください

またはVSCode の settings.json を開き、以下の内容を追記します。
```
{
  "editor.detectIndentation": false,
  "editor.insertSpaces": false
}
```

**insertSpaces** は、tab キーを押したときに space が入力される設定。

**detectIndentation**は、ファイルごとに既存のコードのインデントを検出し、それに合わせて space/tab の切り替えやインデントの大きさの調整を行ってくれる設定担っているみたいです。

makefile ではこれらの設定を off にすることで、tab キーを押したときにちゃんと tab が入力されるようになります。


以上VSCode初心者のはまりがちな内容の記事でした。


### 追記
copilot先生が修正してくれたコードはタブに変換したと言っててもできていなかったので　command ＋　F （windowsの場合はCtr＋F）で半角スペースを検索してtabに切り替えました。

みんな知っているか💦
非エンジニアがIT業界の用語に翻弄されながら培った知識_その③

# これは何?
Qiitaに勤めて分からなかった単語をまとめた記事
- 1回目の記事

https://qiita.com/yukihiro-toda/items/aefc38739608f8c56e2a

- 2回目の記事

https://qiita.com/yukihiro-toda/items/22c9ecd35cccaf584b4d

# この記事の目的
IT関連の仕事をしている非エンジニアの方にIT関連の用語について、ざっくりとしたイメージを持ってもらう

# 知らなかった用語
### LLM
大規模言語モデル（Large Language Modelsの略）のこと
有名なものだと、ChatGPTやGeminiがある。
生成AIとLLMは同じだと思っていた……
生成AI（テキスト、画像、音楽など）の一部としてLLMがあることを最近知った

### リポジトリ
コードやプロジェクトのファイルを保管しておく「フォルダ」のようなもの。
また、過去にどんな変更があったのかを記録することもできる。
これによって、複数の人が一緒に作業する時、誰がいつどんな変更をしたのか分かるので、混乱を防ぐことができる。

### QA（キューエー）
バグや不具合がないかテストを行い、仕様通りに動くかを確認する作業
Slackでエンジニア同士で「QAやろう」というのを「クイズでもやるのかな?」と本気で思っていた

### Linux（リナックス）
WindowsやMacOSと同じようなOS
インターネット上のサービスを支える「インフラ」のようなもの。
例えば、YouTubeなどの大規模なウェブサービスは、バックエンドでLinuxを使っていることが多い。
多くの人が同時にアクセスしても安定して動くようになっていて、インターネットや様々なサービスの基盤として活躍している。
### Laravel（ララベル）
サイトやアプリを作るための「フレームワーク」
※フレームワークとは?料理を作る時のレシピみたいなもの
サイトやアプリを作る時に、他の人が作った仕組みや部品を利用させてもらいスムーズに作ることができる



## 最後に
- まだ知らない単語はあるので、これからも精進していきます。
【GAS】Googleスライドにテキストボックスを挿入して箇条書き/番号付きリストにする

## やりたいこと

GASでこんなリストを挿入する
![upload0](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917871/f30fefcf-1b3a-2d6e-65b2-ef426e20f690.png)

## テキストボックスの挿入

スライドオブジェクトを取得して、insertShape()でシェイプを挿入

ポイント単位でシェイプの種類、挿入位置とサイズを指定できる（テキストボックスはTEXT_BOX）

```js: 左から50pt、上から100ptの位置に幅300pt、高さ150ptのテキストボックスを挿入
  var presentation = SlidesApp.getActivePresentation();
  var slides = presentation.getSlides();
  var shape = slides[0].insertShape(SlidesApp.ShapeType.TEXT_BOX,50,100,300,150); //shapeType, left, top, width, height(pt)
```

insertShape | Class Slide | Apps Script | Google for Developers

https://developers.google.com/apps-script/reference/slides/slide?hl=ja#insertshapeshapetype,-left,-top,-width,-height

## テキストを書き込む

getText()でTextRangeオブジェクトを取得して、setText()で文字列を書き込む（文字列中\nで改行）

```js: 
  var textbox = shape.getText();
  textbox.setText("はじめに\n今年度のふりかえり\n来年度の計画\nおわりに");
```

setText | Class TextRange | Apps Script | Google for Developers

https://developers.google.com/apps-script/reference/slides/text-range?hl=ja#setText(String)

## 箇条書き/番号付きリストを設定

TextRangeオブジェクトからListStyleを取得し、applyListPreset()でリストの形式（listPreset）を指定する

黒丸リストならDISC_CIRCLE_SQUARE
数字付きリストならDIGIT_ALPHA_ROMANなど

```js: 黒丸リストを指定
  var textbox = shape.getText();
  textbox.getListStyle().applyListPreset(SlidesApp.ListPreset.DISC_CIRCLE_SQUARE); //listPreset
```

詳しくは↓のドキュメントへ
リストプリセットの種類

https://developers.google.com/apps-script/reference/slides/list-preset?hl=ja

## 行間隔の設定

行間を設定するときはParagraphStyleオブジェクトを取得して、setLineSpacing()で値を指定する（値は％）

```js: 行間隔を150%にする
  var textbox = shape.getText();
  textbox.getParagraphStyle().setLineSpacing(150);
```

setLineSpacing | Class ParagraphStyle | Apps Script | Google for Developers

https://developers.google.com/apps-script/reference/slides/paragraph-style?hl=ja#setLineSpacing(Number)

## スクリプト全体

全体はこのようになります
```js: 
  var presentation = SlidesApp.getActivePresentation();
  var slides = presentation.getSlides();
  var shape = slides[0].insertShape(SlidesApp.ShapeType.TEXT_BOX,50,100,300,150); //shapeType, left, top, width, height(pt)
  
  var textbox = shape.getText();
  textbox.setText("はじめに\n今年度のふりかえり\n来年度の計画\nおわりに");
  textbox.getListStyle().applyListPreset(SlidesApp.ListPreset.DISC_CIRCLE_SQUARE); //listPreset
  textbox.getParagraphStyle().setLineSpacing(150);
```
DjangoをEC2にデプロイしてみた

Djangoのデプロイをしてみます。

・前提
Githubにプッシュ済み。
EC2を起動している。
セキュリティグループで、カスタムTCPの8000ポートを0.0.0.0で解放

まず、ローカルからEC2(Amazon Linux)にssh接続をします。

```
yusuke@mbp % sudo ssh -i /Users/yusuke/Downloads/xxxx.pem ec2-user@18.xxx.xxx.x12
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-172-xx-12-238 ~]$ 
```
ルートに切り替えて、Python、pipとgitをインストール

```
[ec2-user@ip-172-xx-12-238 ~]$ sudo su -
[root@ip-172-xx-12-238 ~]# yum install -y python
[root@ip-172-xx-12-238 ~]# yum install -y pip
[root@ip-172-xx-12-238 ~]# yum install -y git

```
pipをインストールしたので、Djangoをインストール
```
[root@ip-172-xx-12-238 ~]# pip install Django
```
gitからDjangoアプリをクローンします。
```
[root@ip-172-xx-12-238 ~]# git clone git@github.com:yxxxxxxx/mesagee_app.git
```

settings.pyの以下を今回のIPにします。
EIPではないので、EC2を再起動すると、変わってしまうものですが。
```
ALLOWED_HOSTS = ['18.181.188.212']
```
では、こちらでサーバ起動をします。
```
[root@ip-172-xx-12-238 ~]# python manage.py runserver 0.0.0.0:8000
```
こちらで、ブラウザから8000ポートでアクセスすると、無事アクセスができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676205/db59ede2-3cef-def6-a0ba-237b5fcd8482.png)

1回目の投稿をクリックしてみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676205/869316d5-c566-5b13-b1e0-30202d274eba.png)

ちゃんと詳細ページが開けました。
最低限のリリース完了です。
【Flutter】個人開発で利用規約とプライバシーポリシーを作成してみよう！

## はじめに
個人開発でも、アプリを公開する際には
「利用規約」と「プライバシーポリシー」の準備が重要です！

特にプライバシーポリシーは、ユーザーのデータを取り扱うアプリでは必須です！
そこで記事では、利用規約・プライバシーポリシーの作成方法を学び、
Flutterアプリで実装する方法を紹介します。

## 利用規約とプライバシーポリシーについて
### 必要性
- 利用規約: アプリの利用ルールを明示し、開発者とユーザーの間で
トラブルを未然に防ぎます
- プライバシーポリシー: アプリが収集するデータとその用途、データ保護への取り組みをユーザーに説明します

### Notionが便利！
一番手っ取り早いのはNotionで作成することです。

https://www.notion.com/ja/desktop

:::note info
Notionで作成したページのURLを実装で使用することで、
利用規約もプライバシーポリシーもすぐに作成が可能です！
:::


### 雛形

利用規約とプライバシーポリシーは下記のサイトで
雛形が存在します。

勿論ご自分のサービスに合わせて、内容を変更する必要がありますが
これだけでも勉強になりますね！

#### 利用規約

https://kiyaku.jp/hinagata/gp.html

#### プライバシーポリシー

https://kiyaku.jp/hinagata/privacy.html

:::note warn
自分のサービスに合わせて、内容変更を忘れずに！
:::

## 作成してみよう！

### まずはNotionでページを新規作成

最近ではAIに質問すれば利用規約の雛形を書いてくれそうな
感じもしますね

![スクリーンショット 2024-12-02 0.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/123ca053-52c2-65ef-7e7f-217549f975a6.png)

### 雛形を使用してページを作成

マークダウンが効いており、コピーするだけでそれっぽく
なりますね！

![スクリーンショット 2024-12-02 0.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/43eab470-2c91-279b-ada4-27b59b2e9a5e.png)

### ページを公開しよう

右上にある「共有>公開タブ>公開ボタン」を押下して、ページの公開をすると
モバイルやシミュレータ環境からもページを参照できます。

![スクリーンショット 2024-12-02 0.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/d2d0f851-1c2a-e954-dd5f-2aeb2895d416.png)

後はサービスに合わせて内容をご変更ください！

## Flutterで実装しよう

利用規約やプライバシーポリシーをアプリ内で表示する方法を解説します。
WebViewで外部URLを表示してみます。

### url_launcherをインストール

https://pub.dev/packages/url_launcher

```
flutter pub add url_launcher
```

### 実装例 (リンクを開く関数)

外部URLを表示する関数とUIを分けて記載します。

```sample.dart
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

void openUrl(BuildContext context, String url) async {
  final Uri uri = Uri.parse(url);
  if (await canLaunchUrl(uri)) {
    await launchUrl(uri, mode: LaunchMode.externalApplication);
  } else {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text('URLを開くことができませんでした: $url')),
    );
  }
}
```

### 実装例 (利用規約とプライバシーポリシーのリンクを設定)

```sample.dart
class LoginScreen extends StatelessWidget {
  const LoginScreen({super.key});

  final String termsUrl = 'https://example.com/terms';
  final String privacyPolicyUrl = 'https://example.com/privacy';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('設定')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextButton(
              onPressed: () => openUrl(context, termsUrl),
              child: Text('利用規約', style: TextStyle(color: Colors.blue)),
            ),
            TextButton(
              onPressed: () => openUrl(context, privacyPolicyUrl),
              child: Text('プライバシーポリシー', style: TextStyle(color: Colors.blue)),
            ),            
          ],
        ),
      ),
    );
  }
}
```

## まとめ
Flutterアプリで利用規約とプライバシーポリシーを作成・実装する手順を紹介しました。

適切な規約の準備は、ユーザーとの信頼関係を構築する重要なステップです。
ぜひ参考にして、皆様のアプリの安全性に貢献できれば嬉しいです！

## 参考文献

https://kiyaku.jp/index.html
M5StackのNeoPixelオプション”Puzzle”をmicro:bitで使ってみる

みんな大好きNeoPixel。

海外のM5Stackストアで発売(2024/12/01時点で在庫切れ）されているNeoPixelオプションPuzzleをmicro:bitで動かしてみました。

Puzzleは同梱されているコネクターを使って複数を接続していくことができます。

製品名：[Puzzle Unit 8x8 LED Matrix (WS2812E)](https://shop.m5stack.com/products/puzzle-unit-8x8-led-matrix-ws2812e?variant=45762853568769)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/4f6b92e1-bde8-fce4-7376-e843556f8ee7.png)



## コーディングサンプル

MakeCode上の拡張機能からNeoPixelを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/b32aeca4-b4ba-6c11-3dd1-352e1b179b11.png)

今回は64ｘ4=256のNeoPixelを操作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/a1acc897-af8b-4193-d283-3376f9cb6d35.png)

[サンプルコード](https://makecode.microbit.org/S68225-92958-68752-08852}


<iframe width="560" height="315" src="https://www.youtube.com/embed/Zri9P9KtfaE?si=BQNAS_xlzmadm2yW" 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>

micro:bitとの接続：IN＞P0、3V>5V、G>GND
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71746/e611b4bb-b762-5912-d9cb-aadfd36f7119.png)


## 日本でのPuzzleの発売について
2024/12/01時点ではまだスイッチサイエンスさんで未発売ですが発売になるのを楽しみにしています！
ElixirでPAY.JPのライブラリ作成シリーズ⑥ mix test

https://qiita.com/Yoosuke/private/9f17d9febc61cc64d03d

こちらの続きです

さて、これで基本的なところは完成したので、テストを実行してバグが無いか確認してみます。
テストはターミナル等で```mix test```を実行すればできます。

```bash
mix test
```

無事にテストを行うと何もエラーが無ければ以下のような表示が出ると思います。

```bash
Compiling 1 file (.ex)
Running ExUnit with seed: 213485, max_cases: 32

...........
Finished in 0.02 seconds (0.00s async, 0.02s sync)
4 doctests, 7 tests, 0 failures
```
この結果は、以下のような意味です。

Compiling 1 file (.ex)
1つの Elixir ファイルがコンパイルされたことを示します

Running ExUnit with seed: 213485, max_cases: 32
seed: テストの実行順序を決めるランダムシード値
max_cases: 並行実行される最大テストケース数

テスト実行結果
ドット（.）11個: 11個のテストが成功したことを示します
内訳:

4 doctests: ドキュメント内のテスト（@docの中の例）が4つ
7 tests: 通常のテストが7つ
0 failures: 失敗したテストが0個

実行時間
Finished in 0.02 seconds: テスト全体の実行時間
(0.00s async, 0.02s sync):

async: 非同期実行にかかった時間
sync: 同期実行にかかった時間

@docの中は、例えば以下のような記載の箇所がテスト実行されます。
```elixir
  ## Examples
      iex> Payjpex.Config.get(:api_base)
      "https://api.pay.jp"
```

これがそのままテストケースになります。

実際にテストが通ったのでコンパイルして動かしてみましょう。以下のコマンドでコンパイルします。

```bash
iex -S mix
```

サンプルと同じように動かしてみると無事に動くことがわかりました。

```elixir
iex(1)> Payjpex.Config.get(:api_base)
"https://api.pay.jp"
iex(2)> 
```

さぁ、いよいよApiclientを実装していきたいと思います。この続きは、起業するならElixirシリーズの方で書いていきます。
システム日付や時刻の表記「T」と「Z」

システム日付や時刻の表記において、特にISO 8601形式で使用される「T」と「Z」について説明します。
### T:
- 意味: 日付と時刻の区切りを示します。
- 使用例: 2024-12-02T14:30:00
- 詳細: ISO 8601形式では、日付と時刻を一つの文字列で表現する際に「T」を使用して日付部分と時刻部分を区切ります。例えば、「2024-12-02T14:30:00」は2024年12月2日の14時30分00秒を意味します。
### Z:
- 意味: 協定世界時（UTC）を示します。
- 使用例: 2024-12-02T14:30:00Z
- 詳細: 「Z」は「Zulu time」（ズールータイム）の略で、UTC（Coordinated Universal Time、協定世界時）を表します。時刻の後に「Z」が付くことで、その時刻がUTCであることを示します。例えば、「2024-12-02T14:30:00Z」は2024年12月2日の14時30分00秒（UTC）を意味します。
例
- ローカル時刻: 2024-12-02T14:30:00
これは特定のタイムゾーンを示していないため、ローカル時刻として解釈されます。
- UTC時刻: 2024-12-02T14:30:00Z
これはUTCでの時刻を示しています。
- タイムゾーンの表記
オフセット付きの時刻: 2024-12-02T14:30:00+09:00
これはUTCからのオフセットを示しており、日本標準時（JST、UTC+9）での14時30分00秒を意味します。
まとめると、「T」は日付と時刻の区切りを示し、「Z」はその時刻がUTCであることを示します。これらはISO 8601形式での標準的な表記方法であり、国際的に広く使用されています。
[Git] show コマンドの復習

こんにちは！

前回、[`git log` コマンドの記事](https://qiita.com/yam_dev/items/97b6604d3e86a152a956)を書いて、`git show` も気になったのでまとめ。
優秀な機能が多いですね。

ネタ元は[こちら](https://git-scm.com/docs/git-show)

# git show コマンドについて

## 概要
`git show`は、Gitのコミット、タグ、ツリー、ブロブなどの各種オブジェクトの詳細を表示するコマンドです。

## 基本的な使い方
```text
git show [オプション] [オブジェクト]
```

## よく使うケース

#### 1. 直前のコミットの内容を確認
```bash
git show
# または
git show HEAD
```
私もよく使います。


#### 2. 特定のコミットの内容を確認
```bash
git show abc123  # コミットハッシュを指定
```

こちらもよく使います。

### 3. タグの情報を表示
```bash
git show v1.0.0  # タグ名を指定
```

たまに使うことがあります。

## 知っとくとよさそうなもの

#### 1. 差分を表示しない
```bash
git show --no-patch
```
出力例:
```
% git show --no-patch 
commit aa99d9bbe75cca773d50f8cf77d8b25814890806 (HEAD -> TASK_MNG-2)
Author: member1 <menber1@gmail.com>
Date:   Tue Oct 8 00:58:58 2024 +0900

    レポート機能追加

```

#### 2. 変更されたファイルの統計情報を表示
```bash
git show --stat
```

出力例:
```
% git show --stat    
commit aa99d9bbe75cca773d50f8cf77d8b25814890806 (HEAD -> TASK_MNG-2)
Author: member1 <member1@gmail.com>
Date:   Tue Oct 8 00:58:58 2024 +0900

    レポート機能追加

 src/Format.css          | 123 ++++++++++++++++++++++
 src/Format.tsx          | 268 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/ReportGenerator.tsx | 103 ++++++++-----------
 src/SettingModal.tsx    | 249 +++++++++++++++++++++++++-------------------
 src/SettingsModal.css   | 239 ++++++++++++++++++++++++++----------------
 src/types.ts            |  11 +-
 6 files changed, 743 insertions(+), 250 deletions(-)
```

#### 3. ファイルの特定バージョンを確認
```bash
# masterブランチの3個前のコミットにおけるREADMEファイルを表示
git show master~3:README.md
```

出力例:
```bash
% git show master~3:README.md
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

.....
```

3個前はデフォルトの README.md だったので、それが表示されました。

#### 4. --pretty と --no-patch による出力内容のコントロール

一行表示
```bash
% git show --pretty=oneline --no-patch 
aa99d9bbe75cca773d50f8cf77d8b25814890806 (HEAD -> TASK_MNG-2) レポート機能追加
```

作成者とコメントを表示
```
% git show --pretty=short --no-patch
commit aa99d9bbe75cca773d50f8cf77d8b25814890806 (HEAD -> TASK_MNG-2)
Author: member1 <menber1@gmail.com>

    レポート機能追加
```

作成者と日付、コメントを表示
```
% git show --pretty=medium --no-patch
commit aa99d9bbe75cca773d50f8cf77d8b25814890806 (HEAD -> TASK_MNG-2)
Author: member1 <menber1@gmail.com>
Date:   Tue Oct 8 00:58:58 2024 +0900

    レポート機能追加
```

他にもありますが、一旦ここまで。

# まとめ
普段から使ってる `git show` コマンドですが、こちらも多機能。
オプションとしてはまだたくさんあるので、改めて使ってみようと思います。
Emacs Plusとは何か

メリークリスマス！ [Emacs Advent Calendar 2024]です！

# Emacsどうやってインストールしていますか？

私が管理しているEmacs JPのページがあるのですが、Emacsをインストールする方法はOSごとに何種類もあります。

https://emacs-jp.github.io/tips/versions#macos

現状の表ではこんな感じ。

![スクリーンショット 2024-12-01 23.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4121/f26aa488-ee4c-7996-048b-4e4d3ab7a369.png)

この一つが[Emacs Plus][](Emacs+)です。

https://github.com/d12frosted/homebrew-emacs-plus

[Emacs Plus]: https://github.com/d12frosted/homebrew-emacs-plus
[Emacs Advent Calendar 2024]: https://qiita.com/advent-calendar/2024/emacs

Emacs Plusの特徴は

 * バージョンを選択してEmacsをインストールできる
 * 有効化する機能を選択できる
 * GUI上のEmacsのアイコンを選択できる

[Doom EmacsのセットアップでmacOSでは2番目におすすめ](https://github.com/doomemacs/doomemacs/blob/master/docs/getting_started.org#on-macos)のやつなので、Emacs Mac Port(EMP)を使ってない人は使ってみてもよいのではないでしょうか。

僕は [@nanasess さんが作ったEmacsアイコン](https://www.slideshare.net/slideshow/emacs-5282932/5282932)に大変愛着があるので、`--with-modern-pen-icon`を指定しています。

```
brew remove emacs-plus@30; brew install emacs-plus@30 --with-imagemagick --with-native-comp --with-modern-pen-icon --with-xwidgets
```

大変美しいEmacsランタイムを作れて非常に便利なのですが… 残念なお知らせがあります。

## 悲報: Sequoiaにインストールできない

2024年9月にリリースされたmacOS Sequoiaですが… 残念ながらいくつかの問題があります。

これは権限の問題なので設定すれば治る…らしいのですが…

https://github.com/d12frosted/homebrew-emacs-plus/issues/742

インストールが失敗します。

https://github.com/d12frosted/homebrew-emacs-plus/issues/720

早くどうにかしたいが… 残念ながらまだ解決できていません。

:::note warn
macOSをアップデートしてない人は、どうかそのままでEmacs Plusを使ってね！
:::
Advent of code 2024 Day 1 Part 1 & Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 Day 1 の Part 1 と Part 2 を解きます

問題文はこちら

https://adventofcode.com/2024/day/1

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

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2024/2024_day1_part1.livemd

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2024/2024_day1_part2.livemd

## セットアップ

Kino AOC をインストールします

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

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 1 の入力を取得します

![スクリーンショット 2024-12-02 0.16.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/175318f8-f4ea-be1a-96ac-287f74d4e621.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

### Part 1

<details><summary>回答</summary>

まず入力を読み込みます

`[[a1, b1], [a2, b2], [a3, b3]]` というような形になっているのを `[{a1, b1}, {a2, b2}, {a3, b3}]` に変換してから `Enum.unzip` により `{[a1, a2, a3], [b1, b2, b3]}` という形に変換しました

```elixir
{left_list, right_list} =
  puzzle_input
  |> String.split("\n")
  |> Enum.map(fn row ->
    row
    |> String.split(" ")
    |> Enum.filter(&(&1 != ""))
    |> Enum.map(&String.to_integer(&1))
  end)
  |> Enum.map(fn [a, b] -> {a, b} end)
  |> Enum.unzip()
```

これを両者昇順に並び替え、 `Enum.zip` で `[{a1, b1}, {a2, b2}, {a3, b3}]` という形に戻します

両者の差を `abs` で絶対値に変換してから合計しました

```elixir
Enum.zip(Enum.sort(left_list), Enum.sort(right_list))
|> Enum.map(fn {left, right} -> abs(left - right) end)
|> Enum.sum()
```

</details>

### Part 2

<details><summary>回答</summary>

問題文の通り、そのままの計算を実施しました

`Enum.count` で条件に一致する件数を取得しています

```elixir
left_list
|> Enum.map(fn left ->
  left * Enum.count(right_list, fn right -> left == right end)
end)
|> Enum.sum()
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![aoc2024_day1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d4aea90c-f368-a87a-0a96-fa1b212828d9.jpeg)

Day 1 なので非常に簡単でした
TiDBの簡単なイントロとそのニーズについて

今年もAdvent Calendarの季節がやってきました。
TiDBのAdvent Calendarは今年で2回目になります。昨年に比べると少しはTiDBを知ってもらえる機会が増えたようなきがしています。

初日の記事として、TiDBとはなにか、そして最近の事例から、TiDBが必要とされる背景について考えてみました。

## TiDBとは

TiDBは、端的に言ってしまえば「キーバリューストアをラップしてRDBのように見せてる分散データベース」です。
アーキテクチャの詳細などはPingCAP ソリューションアーキテクトの小板橋さんがZennに書いているのでそちらを参照ください。

https://zenn.dev/koiping/articles/fc54076d2e6845


ここでは、このアーキテクチャがもたらすTiDB機能的な特徴について書きます。

* トランザクション処理やSQLなどで従来のRDBMS相当の機能を持つ
* スケールアウトによる性能増強が可能
* 複数のノードから構成されており、障害時のフェイルオーバーや、データの偏りのリバランスを自動化

というものです。もう一つ大きな特徴として、内部的には小板橋さんの記事にあるように複数のコンポーネントによる依存関係がありますが、**ユーザーからみたときは一つの大きなDBとして利用できる**という点です。Read/Writeともにスケールアウトによる能力増強が実現でき、かつ一つの大きなDBとして利用できます。
アプリケーションがDBの物理的な構成（Read / Writeエンドポイントやシャーディングといったもの）を扱わなくても良いのはメリットです。

## ユーザーニーズ

さて、TiDBを広めていく中で、TiDBを求めるユーザーニーズも明確になってきました。。

TiDBのようなNewSQLデータベースは、一般には大規模なDBや膨大なアクセスをさばくために必要なものとみなされています。しかし、意外なことに、実際のTiDBの利用は、そのようなユースケースだけではなく、もっと様々なニーズを汲み取っていることがわかりました。

そのようなニーズの中で代表的なものを列挙します。恐らくいくつかは読者の皆さんがDBを利用している中でも遭遇しているものではないでしょうか

### ワークロードの柔軟性

スケールアウト性も重要ですが、単なる増強ではなくて柔軟にデータベースのサイズを増減させることが求められています。ECなどのユーザーの多くはピークとそうでない時との差が激しく、通常時にオーバースペックで運用することに対して無駄を感じています。

### サービスの継続性

DBやインフラ更新をサービスを継続させたまま行いたいというものです。アプリケーションがデプロイ方法を工夫してこれらを提供するようになりつつありますが、DBも含めたシステム全体としてサービスの継続性が求められるようになってきています。

### マイクロサービス、マルチテナントでの運用性

マイクロサービスでは、サービス単位でDBないしテーブルを分割するパターンを採用されることが多いです。それらを複数面持つマルチテナントのサービスも多く出てきています。イメージとしてはマルチテナントはマイクロサービスをテナントごとにインスタンス化するようなものです。マルチテナントでの論理的なDBやテーブルの総数はかなりの数に上り、これらの運用改善に対する期待があります。

### 学習効率の良さ

DBの運用やモニタリングはそれだけで一大テーマです。現在のDBが性能や拡張性に難があるとしても、これらの運用ノウハウの学習や、仕組みの構築に多大なコストがかかるため移行に二の足を踏むケースは多いです。学習のしやすさ、親しみやすさというのは導入に際してかなり重要なポイントです。

これらのユーザーニーズは相互に関係しており、トレードオフを生じさせることもあります。
TiDBは決して完璧なDBではありません。性能だけで言えばより優れたDBのアーキテクチャもあります。その中でTiDBが注目されてきたのは、汎用性が高く、運用・学習が容易な点によるものと思います。

## まとめ

この記事ではTiDBの簡単な紹介と、実際にTiDBの利用事例から見えてきたニーズについて記載しました。
実際のところ現代のデータベースの利用法や性能要求は非常に幅が広く、従来の3層アーキテクチャのときのRDBのような位置づけの、「クラウド時代の汎用性の高いDB」が求められており、そこにうまくフィットしているのかなと思います。

私の次の記事ではここ1年のTiDBの更新から、こういったニーズへ対応する機能の強化の過程と事例をみていきたいと思います。

引き続きアドベントカレンダーをお楽しみください！
Claudeは画像生成できないけど、画像生成生成してもらう（？）

# Claudeとは

本人に聞いてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/440d61fb-9690-a687-b99c-6349bcb43ea3.png)

あ、すみません。
ピーマン星人になっちゃってますが、とにかく何でも出来るぞと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/e5308ad5-90cb-fab0-76ec-1be9d15c51ce.png)

※使い方知りたい、コード生成したい人向け

https://qiita.com/Jasmine_teeeeee/items/c10f6f5a1fe80d5b8738

※ピーマン星人にしたい人向け

https://qiita.com/Jasmine_teeeeee/items/5a21d3935b389a00e2aa

と言うことで画像もお願いしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/58b5687a-bb86-2970-089a-2d49c8514154.png)

ん？？
カカポどころか、鳥なのかすら怪しい。。
某カレーのパンのヒーローのようだ、、

## 公式ドキュメント確認

https://support.anthropic.com/ja/articles/9002504-claude%E3%81%AF%E7%94%BB%E5%83%8F%E3%82%92%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B#

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/99440861-e4cb-29c6-e9da-819ec94865d8.png)

あ、できないのか。
出来ないけど頑張ってsvgで作ってくれたのか。。

可愛い！！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/fc755df1-8a81-262a-a958-6793f12e68ba.png)

## svgで出来るだけ要望通りの出力ができるようにならないか

出来ないのに一生懸命考えてくれなのか。。可愛いなおい。
ということで、どうにかsvgで可愛い出力をしたい。

まず一般的に概念が広まっている猫で再検証すると、
こちらはカカポよりぱっと見で猫のようなイラストが出力できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/cb2dd5d6-c1a0-fa99-be14-986f0b9ddad8.png)

次に鳥にしてみます。これにカカポの特徴を組み合わせてキメラを生成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/5e1d8a3f-f704-3638-8c27-56dc66d43628.png)

具体的な見た目を言語化します。今回はfeloで出力させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/c5acdc17-5854-3ff4-c21f-7399596ad0d5.png)

最初より近づいたように思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/a195a25c-2f2d-c4d1-d191-ee9a19e58ab0.png)

※もう少し調整してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/fd892d17-c3f8-4174-a9af-0ae8532d1a0c.png)


# まとめ

生成AIには、〇〇型といったそれぞれの得意不得意があります。

本来それ専用のAIを選定することが推奨されますが、
必ずしもそのモデルが使用できる環境にない（セキュリティとかで）とか、まだ実装されていないようなことを行いたいとかあるかと思います。
その場合は、複数モデルを組み合わせることによって、自分の意図した作業を実現できるかもしれません。

生成AIはあいまいなイメージを、より具体的に言語化したり、背景を膨らませることが得意です。
今回のようにテキスト型と、それ以外を組み合わせることによって、可能性は無限大となります。

みなさんもおすすめのモデルの組み合わせを教えてください。

# ぼやき

svgってもっと細かくできそうだけど、現時点ではわざわざClaude使う必要はないな。

↓これとか
https://www.majesticons.com/
コンテキストメニュー ～ MATLAB のグラフや表に独自メニューを追加する

[<B>MATLAB/Simulink Advent Calendar 2024</B>](https://qiita.com/advent-calendar/2024/matlab)に参加しました。

カレンダー1の12/2分として追加しました。

・使用ツール
<dt>　MATLAB</dt>
<br>

<H4><a href="https://note.com/leftbank/n/nf39a7f7fee96"</a> [<B>note</B>]にUpしました。</H4>
WinActorでPythonライブラリを使う方法


本記事は、RPA Advent Calendar 2024の12/2分の記事になります。

こんばんは、かーでぃです。
随分前にQiitaアカウントは作ったのですが、記事を書くのは初めてだったりします。
（普段は、noteで記事書いてます💦）

さて本記事は、WinActor ver 7.5から使えるようになりました、WinActor上でPythonを使う話になります。

元ネタはこちら

https://note.com/kerdy/n/n191a885f0e8e

https://note.com/kerdy/n/nc03bcbaaf929

## 結論から言うと
WinActor標準で内包されているPython環境では、外部ライブラリが使えませんでした。
ところが、WinActorとは別にPythonをインストールしてあげると、外部ライブラリが使えるようになりました。

ここでいう外部ライブラリとは、openpyxlやpandas、Scikit-learnなどがあります。
全部が使えるか、まだ試していませんが、少なくともopenpyxlは動きました！

## サンプルコード
こちらが、WinActorのPythonノードで動かした、openpyxlライブラリを使ったサンプルコードです。
winactorクラスが光ってますね:heart_eyes:

何をするコードかと言うと、セルA1に記入されている値を読み取り、WinActorの変数a1に読み取った値をセットするものです。
``` 
from openpyxl import load_workbook

# Excelファイルを開く
file_path = r"C:\Uers\***\Python\GPTtest.xlsx"  # Excelファイルのパスを指定
workbook = load_workbook(file_path)

# "Sheet1"シートを指定
sheet = workbook["Sheet1"]

# A1セルの内容を取得
a1_value = sheet["A1"].value

#WinActorの変数a1に、a1_valueの値を渡す
winactor.set_variable("a1",a1_value)
``` 
セルA1には、下記のように"Python"と記入されています。この値が、WinActorの変数a1に返ってくれば、成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952925/73d0ce26-7b6d-3197-d4f5-40c1df10618c.png)

## 実行結果
動かしたシナリオは以下になります。
グレーアウトしているノードは、実行しないノードですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952925/4b066928-fe37-09ed-cb65-3ac1c89dc775.png)
👇実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952925/3fecebf2-654c-44bc-dd23-2fe3a84ab1c3.png)

このように、正しく値が取得できました。
WinActor内でPythonを扱えるのは、非常に便利だと感じました。
ネットワーク・インターネット・Webは何が違うのか？

# はじめに

日常でよく使うITに関わる用語についておさらいをしてみたいと思います。

# ネットワークとは

コンピューターやスマートフォンなどのような情報機器をケーブルや無線などを使ってつなぎ、お互いに情報をやり取りできるようにした**仕組み**のことを言います。

# インターネットとは

インターネットのことを「ネット、ネット」とよく言ったりしますが、インターネットというのは何を意味しているのでしょうか。

インターネットとは世界中の規模で繋がっているネットワークの**名前**です

インターネットは英語にすると「Internet」です。「Inter」は「～の間、～の中で、相互に」、「net」は「網、ネット」です。つまり、「net」は「network」です。

そのまま繋げると「相互にネットワーク」となるので、語源的には**ネットワークを相互につないだもの**と言い表すことができます。

# Webとは

インターネットやネットワークと一緒によく使われる言葉としてWebという言葉がありますね

Web とはインターネット上でテキスト、画像、動画等の閲覧を可能にするシステムのことを言います。

つまりは、Web はインターネットの機能の一つということです。

また、World Wide Web の略称で、直訳すると「世界規模のくもの巣」になります。

個人的にはなんかインターネットっぽいなあと思ってしまったのですが、インターネット上に張り巡らされた各 Web ページが巣の結び目と捉えると理解しやすいのかなと思いました。

# インターネットとネットワークの違い

上記ですでに説明していてもわかるかもしれませんが、

ネットワークは**仕組み**を表しており、インターネットは**名前**を表しています。

つまりは、インターネットもネットワークです。

ネットワークというカテゴリの中に「インターネット」という名前のネットワークがあるということです。

# 日常のものに例えてみる

よくある例で恐縮ですが、以下のように例えることができます。

- ネットワーク：道路
- インターネット：世界中の道路をすべて繋げたもの
- Web：車

ネットワークは**仕組み**を表すので道路そのものと表せます

また、インターネットは**名前**を表すので道路という仕組みを使って、世界中の道路を全て繋げたものと言い表せることができます（良い名前は思いつきませんでした、、、）

そして、Web はインターネット上の情報にアクセス・情報を共有するための仕組みなので、車と言い表せると思います。

その車を使って、ユーザーは道路沿いのお店 = Web コンテンツに迅速にアクセスできるという見方ができるのではないかと思います。

# まとめ

小学生でもわかるように日常のものに例えてみるというのは自分自身の理解の上でとても大切だなということを学ぶことができました。

簡単な内容ではあったかもしれませんが、最後まで読んでいただきありがとうございました。

# 参考文献

https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/basic/service/01/#:~:text=%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AF%E3%80%81%E4%B8%96%E7%95%8C%E4%B8%AD%E3%81%AE,%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%EF%BC%89%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

https://flets-w.com/chienetta/lifestyle/cb_internet19.html

https://wa3.i-3-i.info/diff661network.html

https://contents.digitallab.jp/19707.html

https://ds-b.jp/dsmagazine/what-is-web/
モチベーション3.0ってなんだっけ

## はじめに
別の記事で技術合宿について書いた際に、
結構昔に聞いた講演の話を思い出したので、振り返りついでに記事にしました。

## Agile Japan 2012
私が転職し、現在の会社に入った2011年というタイミングは、
福岡をスタートアップシティにしていく！という機運が高まった時期でもありました。
明星和楽といった大型イベントや、各種テック系イベントがあり、
興味があるものはとりあえず参加していました。

その中でも、現在も仕事のベースとしているものが、
Agile Japan 2012福岡のサテライトで講演を聞いた、
Jonathan Rasmusson の「アジャイル・サムライ」になります。

## アジャイル・サムライ
ざっくりまとめると、
- 従来のマネジメントの特徴
- ソフトウエア製造での従来のマネジメントの限界
- MITの実験(インセンティブテスト)
- インセンティブテストとアジャイル
についてお話されていました(とメモが残っている)。

### インセンティブテスト
特に印象に残り、現在も意識し続けているのが、
仕事で成果を上げるために必要な、以下の3要素です。
- 自立
- 熟達
- 目的

#### 自立
エンジニアは自立を好む、といわれるように、
仕事の進め方は百者百様なわけでして、
ちゃんとゴールにたどり着けるなら、その方法、過程は問う必要がないと考えています。

上記MITのインセンティブテストでは、
クリエイティブな作業は、報酬より自立性を保証した方が生産性が高かった、という結果です。
これは非常に共感できる内容でしたので、
現在も仕事をお願いする際には、ゴールの明確化と自立性の尊重を最優先に、依頼と管理をしています。
もちろん、ゴールにたどり着いても品質に問題があるようであれば、
その解決の為に一緒に考えて、改善を行っていくことになります。

#### 熟達
これは仕事というか、趣味の話にもなっちゃいそうな気がしますが、
「なぜ、人は週末に楽器を弾くのか」っていう話ですね。
何かを行う以上、昨日よりは今日、今日よりは明日、よりよい結果を出すために、
特に理由はないけれど、練習してしまう、ということだと思います。

Linux、wikipedia、Apacheはどれも熟達のためのチャレンジが結果として世界的に広まったもの。
っていうところが、スゲーなって思うと同時に、なるほどなーと思えるわけです。

#### 目的
多くの組織、企業が、利益ではない、優れた目的を持ってきている、という話でした。
逆に言うと、利益は目的によって支えられている、とのこと。

優れた目的ってなんだろう、と思いますが、
例として挙がったのが、
skypeの創業者「我々の目的は破壊だ。しかしそれは世界をよりよくするためのものだ」
スティーブ・ジョブズ「僕の奏でる鐘の音を世界中に響かせたいんだ」
って感じで、目的というよりは、使命や生き様にも思えますが、
イノベーション企業に限らず、どんな仕事をしたいかって意味では考えないといけないですね。

### まとめ
ここまで書いてきて、ダニエルピンクもモチベーション3.0も登場しないじゃん
って思いましたが、モチベーション3.0とアジャイル・サムライは近しい内容ですし、
アジャイル・サムライの最後にも登場する(らしい)ので、ご容赦ください。

講演でいろいろ良い言葉が聞けましたが、
エンジニアは自立を好むのに、なんでそうならないの？という問いに対する答えが、
仕事の本質は変わってきているのに、組織が変わらないから。というのが響きました。

働きやすい組織を作るために、自分も努力していかないとですし、
会社にも積極的に提案し、より働きやすい、エンジニアファーストな環境を、
継続して作っていきたいです。
プログラミング言語Kokaとは

# プログラミング言語「Koka」
プログラミング言語[Koka](https://koka-lang.github.io/koka/doc/book.html)とは、Microsoft Research の Daan Leijen 氏らが開発するプログラミング言語で、algebraic effectを扱えることを特徴とします。
まだ開発中の言語ではありますが、動く状態になっており、VSCode拡張やLanguage Server Protocol (LSP) 実装もあり、遊んでみる分には十分そうです。

また、[ベンチマーク](https://github.com/koka-lang/koka/blob/85ecfc7c6095e698e2cd3f9fa5695c39fd3ec901/readme.md#benchmarks) 結果としても、C++とそれほど遜色なく、他の言語と比べても高速なようです。

[ドキュメント](https://koka-lang.github.io/koka/doc/book.html#why-effects) に記述されているように、

```javascript
fun sqr    : (intstd/core/types/int: V) -> total int       // total: mathematical total function    
fun divide : (int,int) -> exn int     // exn: may raise an exception (partial)  
fun turing : (tape) -> div int        // div: may not terminate (diverge)  
fun print  : (string) -> console ()   // console: may write to the console  
fun rand   : () -> ndet int           // ndet: non-deterministic  
```

関数型に効果(effect)を付加することができ、また、[こちらのドキュメント](https://koka-lang.github.io/koka/doc/book.html#why-handlers)にあるように、関数の呼び出し元で、effect handlerを作ることで、効果を取り扱うことができます。

```javascript
fun traverse( xs : list<int> ) : yield () 
  match xs 
    Cons(x,xx) -> if yield(x) then traverse(xx) else ()
    Nil        -> ()


fun print-elems() : console () 
  with ctl yield(i)
    println("yielded " ++ i.show)
    resume(i<=2)
  traverse([1,2,3,4])
```

# algebraic effectについて
こちらの記事が参考になりました。

https://zenn.dev/catminusminus/articles/5e3f266c9e4ae4

# アドベントカレンダー、こんなはずでは。。。
アドベントカレンダー駆動学習をしようと、[Koka言語のアドベントカレンダー](https://qiita.com/advent-calendar/2024/koka)を作ったのですが、あまり学習が進んでいません。

初日はもっとまともな記事を書こうと思っていたのですが、結局かけないまま、12/2になってしまっています。
さすがにこんなはずではないので、他にも記事を書くつもりではいます。

このように、カレンダー作成者も不勉強な状態なので、「これ見て今からKoka始めました」って方は、カレンダーを埋めるのを手伝っていただければと思います。
Amazon ECS でコンテナインスタンスを任意のタイミングで起動する方法

### はじめに

ECSを使用する際、通常、ECSクラスターを作成すると自動的にEC2インスタンスが起動され、これをコンテナインスタンスとして利用します。これらのコンテナインスタンスは、ECSクラスターと連動しており、クラスターを削除することでインスタンスも同時に削除されます。しかし、都度クラスターを作成するのは手間がかかります。

そこで、クラスター作成後に簡単にコンテナインスタンスを起動・削除する方法を見つけたため、その手順を共有します。

### やり方

1. ECSクラスターを作成
2. Amazon EC2コンソールに移動
3. 左側のタブから`Auto Scaling グループ`をクリック
4. ECSクラスター作成時に自動で作成されるAuto Scaling グループの名前をクリック（例: `Infra-ECS-Cluster-<ECSクラスター名>-ECSAutoScalingGroup-xxxxxxxxxx`）
5. `キャパシティの概要`セクションにある`編集`をクリック
6. `希望するキャパシティ`を`0`に設定し、`スケーリング制限`の`最小希望容量`も`0`に設定し、`更新`をクリック
7. ECSコンソールに戻り、数分待った後、`コンテナインスタンス`欄が`0 EC2`と表示されていることを確認できれは、コンテナインスタンスは削除できている

再起動したい場合は、`希望するキャパシティ`を`1`、`スケーリング制限`の`最小希望容量`を`1`に設定し、しばらく待てばインスタンスが起動します。ECSクラスターの再作成は必要ありません。

### 終わりに

AWS Fargateを使用すれば、コンテナインスタンスの管理が不要になりますが、GPUインスタンスなどFargate非対応のインスタンスを使用する場合、この方法が重宝すると思います。
[番外編 #7] 「5GHz」と「2.4GHz」どちらにしましょうか

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
:desktop:皆様お疲れ様です。
今回の **「番外編」** ではWi-Fiに関しまして<font color="c00000"> **「5GHz」「2.4GHz」** </font>ついて見ていきたいと思います。常日頃WiFiを使用しているからこそ、この特徴は入れておきたいため作成しました。

### 【結論】特徴を理解して使い分けをしていきましょう
:upside_down: Wi-Fiの周波数の2.4GHzと5GHzはそれぞれに特徴があります。（勿論メリット、デメリットも）周波数の違いを知って上手ーく使い分けることでより快適な通信ができます。

## 5GHz
特徴は下記の通りです
**「電波干渉の心配が少ない」**
![bangai0704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/b1ea46c1-eb0f-2c6e-66b9-b22e9fe9d969.png)
周りに家電があり2.4GHzでの通信が不安なときは「5GHz」に切り替えるのが有効です。

**通信速度が速い**
![スクリーンショット 2024-12-01 213721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/a8dc218a-5b91-d784-cf59-530940a70b2b.png)
![bangai0705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/4b2a68ac-5da6-f93e-7286-21c737fba71b.png)


一方でこんなデメリットが...
![bangai0706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/6e418662-a69b-4769-0336-1b7b8d885ef0.png)
従って2階などのWi-Fiルーターから離れた場所で5GHzを利用すると接続状況が不安定になりやすいことがあります。

:::note info
利用できる範囲は2.4GHzより狭いが、 <font color="c00000">**通信速度は速い**</font>のが特徴である
:::

## 2.4GHz
**「電波が遠くまで届く」**

![bangai0701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/c54eb881-bba2-eb7a-8615-eca001df5eb5.png)
**「障害物の影響を受けにくい」**
![bangai0702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/dcd6c7cf-b359-5c4a-0347-6b4d075cf994.png)

**2.4GHzのデメリット**
![bangai0703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/d73b7e6a-15f8-201f-0492-33a3f91b14e5.png)

:::note info
通信速度は5GHzより遅いが、 <font color="c00000">**利用できる範囲は広い**</font>
:::
## おわりに
ちょっとしたまとめになります。

:::note info
5GHzは**電波干渉は起きにくく回線が速い**が、 <font color="c00000">**壁などの障害物に弱い特徴がある**</font>
:::
:::note info
2.4GHzは**障害物に強く電波を飛ばせる距離が長い**が、 <font color="c00000">**電波干渉が起きやすい**</font>特徴がある
:::
普段利用しているWi-Fiについて改めて理解することができました。最後まで読んで頂きありがとうございました！
> 参考元

 https://flets-w.com/chienetta/pc_mobile/cb_other59.html

[Youtube【Wi-Fiルーターの周波数】2.4GHzと5GHzはどっちを使えばいい？](https://x.gd/4ET4M)

>>過去の番外編はこちら

https://qiita.com/aoiku/items/bebee0d898a4971a3146

https://qiita.com/aoiku/items/19cf51605f80c60d4004

https://qiita.com/aoiku/items/c500c4cb65499d11027a

https://qiita.com/aoiku/items/24a63ba63349c07a235c

https://qiita.com/aoiku/items/586f74ac39e1c9e3f816

https://qiita.com/aoiku/items/06059f13aa6782cb7ab8

https://qiita.com/aoiku/items/02b1e4ba816e4910d488
数量化理論Ⅳ類を理解する

自分は自己研鑽で受けもしないのに資格の勉強をするのですが、QC検定という品質保証の資格試験で統計学や機械学習が出ているらしいです。
そこで数量化理論Ⅳ類というものがあって質的変数のクラスタリングとありました。
というわけで、プログラム作って理解しようと思います。
# 階層型クラスタリング
```Python3
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

df = pd.read_csv("golf.csv", encoding="shift-jis")
df = df.drop(["気温", "湿度"], axis=1)
df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/288687f4-8cff-0f76-a014-32595e31ab81.png)


使用するのはゴルフデータです。少ないデータセットですがこれを使って理解しようと思います。
これから使用できるデータにしようと思います(駄洒落じゃないです)。
```Python3
df = pd.get_dummies(df)
df = df.drop(["天気_雨", "風_弱", "ゴルフ_しない"], axis=1)
df = df.replace(True, 1)
df = df.replace(False, 0)
df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/f02128a7-caba-b3ed-2fa6-b7dc8f9aa0ec.png)

これで使用できるデータになりました。
ではここから予測してみようと思います。
```Python3
Z = linkage(df, method="average", metric="euclidean")
dendrogram(Z)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/0548d735-5340-e0fc-f008-53a5a9068c8d.png)

# K-means法
だいたいクラスタは2つか3つであることが分かります。
では3つで考えてk-means法でクラスタリングをしてみましょう。
```Python3
from sklearn.cluster import KMeans

model = KMeans(n_clusters=2)
model.fit(df)
y_pred = model.predict(df)
df_ctr2 = pd.DataFrame(model.cluster_centers_).T
df_ctr2.index = df.columns
df_ctr2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/1b96484b-3035-eca1-4638-bd74e6a70840.png)
これがクラスタを2つにした時の重心になります。
```Python3
from sklearn.cluster import KMeans

model = KMeans(n_clusters=3)
model.fit(df)
y_pred = model.predict(df)
df_ctr3 = pd.DataFrame(model.cluster_centers_).T
df_ctr3.index = df.columns
df_ctr3
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/1d4c2b59-adf0-c183-807c-5fa971142d07.png)
クラスタの0と2がきれいになったことが分かります。
Neovimで雪を降らせてクリスマスを楽しもう！

## 農工大アドカレ2日目!

黒い画面は夜を連想させますよね？クリスマスの夜といえばやっぱり雪が欲しい！というわけでテキストエディタでも雪を降らせました！

# 作ったもの

**snowfall.nvim** という Neovim プラグインを作りました。実はプラグイン開発は人生初です！

https://github.com/OJII3/snowfall.nvim

`Lazy.nvim` 等のプラグインマネージャーを用いてインストールできます。

```lua
{ 
  "ojii3/snowfall.nvim",
  dependencies = { "3rd/image.nvim" },
  config = true,
}
```

デフォルトでこんな感じの見た目になります！

<iframe width="560" height="315" src="https://www.youtube.com/embed/7Qinep7lNno?si=OfJRUFFj4Nh53Gr3" 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>


しとしと雪が降っている感じですね！(ちょっと量が少ないかも？)

ちなみにデフォルトで降ってきてる雪の結晶はこちら↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637844/27813438-ae17-153f-69fc-c4f87a721cc6.png)

なんだかどこかで見たことある気がします！

## カスタマイズ要素

まだ出来立てホヤホヤのプラグインで大した機能はありませんが、ある程度のカスタマイズができます。

```lua
{
  "ojii3/snowfall.nvim",
  dependencies = { "3rd/image.nvim" },
  opts = {
    snowflake = {
        path = "/path_to_image",
        x = 10,
        y = 10,
    },
    count = 50,
  }
}
```

![20241201_23h15m12s_grim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637844/7efc919f-50c3-001c-718c-bbe9c2652ec5.png)



こんな感じで好みな雪(?)に変えることができます！

## 注意

画像を表示する都合で、正しく動作するターミナルが限られます。私の把握している限りだと、**Kitty** のみです！

そして **Kitty** の対応 OS は Linux と Mac のみ。あぁ残念！Windows の皆さん！あなたのところでは雪は降りません！

それから、これは雪の結晶程度の小さい画像だから軽く動作しているのであって、画像と量が増えるとものすごくおも〜くなります！気をつけてね！

## まとめ

Neovim のプラグインは、`.lua` ファイル一枚でも成立します。いつも通り設定ファイルをいじって、うまく動きそうならプラグインの形式にする、という流れで開発できるのでハードルが低くなっています。ぜひ挑戦してみてはいかがでしょうか！

(実際、アドカレ１日目に記事を公開して、続く２日目が早速空き枠だったので、空きを埋めるべく頑張って一日でプラグインを作って記事を書きました！)
【Ruby】宇宙船演算子

`<=>` 演算子は、2つの値を比較し、以下のような結果を返します：
- 左側の値が右側の値より小さい場合は `-1`
- 左側の値が右側の値と等しい場合は `0`
- 左側の値が右側の値より大きい場合は `1`
- 比較できない場合は `nil`

```ruby
a = 5
b = 3
puts a <=> b  # => 1

a = 5
b = 5
puts a <=> b  # => 0

a = 3
b = 5
puts a <=> b  # => -1

a = 3
b = '5'
puts a <=> b  # => nil
```
VoIPとSIPを通じてRustを勉強する：u-law/a-law作成編

# はじめに
本記事は自分のためでしかないアドベントカレンダー2024の記事です。
記事は２５記事書くと思いますが期待はせずにお願いします

# Rustでu-lawとa-lawの圧縮伸長プログラム作成
前記事で解説したu-law/a-lawの圧縮伸長プログラムを作ってみました。

~~~lib.rs
fn alaw_compress(lseg: i32, linbuf: &mut [i16], logbuf: &mut [i16]) {
    let mut ix: i16;
    let mut iexp: i16;

    for n in 0..(lseg as usize) {
        ix = if linbuf[n] < 0 {
            (!linbuf[n]) >> 4
        } else {
            (linbuf[n]) >> 4
        };

        if ix > 15 {
            iexp = 1;
            while ix > 16 + 15 {
                ix >>= 1;
                iexp += 1;
            }
            ix -= 16;

            ix += iexp << 4;
        }
        if linbuf[n as usize] >= 0 {
            ix |= 0x0080;
        }

        logbuf[n as usize] = ix ^ (0x0055);
    }
}

fn alaw_expand(lseg: i32, logbuf: &mut [i16], linbuf: &mut [i16]) {
    let mut ix: i16;
    let mut mant: i16;
    let mut iexp: i16;

    for n in 0..lseg {
        ix = logbuf[n as usize] ^ (0x0055);

        ix &= 0x007F;
        iexp = ix >> 4;
        mant = ix & (0x000F);
        if iexp > 0 {
            mant = mant + 16;
        }

        mant = (mant << 4) + (0x0008);

        if iexp > 1 {
            mant = mant << (iexp - 1);
        }

        linbuf[n as usize] = if logbuf[n as usize] > 127 {
            mant
        } else {
            !mant
        }
    }
}

fn ulaw_compress(lseg: i32, linbuf: &mut [i16], logbuf: &mut [i16]) {
    let mut i: i16;
    let mut absno: i16;
    let mut segno: i16;
    let mut low_nibble: i16;
    let mut high_nibble: i16;

    for n in 0..lseg {
        absno = if linbuf[n as usize] < 0 {
            ((!linbuf[n as usize]) >> 2) + 33
        } else {
            (linbuf[n as usize] >> 2) + 33
        };

        if absno > 0x1FFF {
            absno = 0x1FFF;
        }
        i = absno >> 6;
        segno = 1;
        while i != 0 {
            segno += 1;
            i >>= 1;
        }

        high_nibble = 0x0008 - segno;

        low_nibble = (absno >> segno) & 0x000F;
        low_nibble = 0x000F - low_nibble;

        logbuf[n as usize] = (high_nibble << 4) | low_nibble;

        if linbuf[n as usize] >= 0 {
            logbuf[n as usize] = logbuf[n as usize] | 0x0080;
        }
    }
}

fn ulaw_expand(lseg: u32, logbuf: &mut [i16], linbuf: &mut [i16]) {
    let mut segment: i16;
    let mut mantissa: i16;
    let mut exponent: i16;
    let mut sign: i16;
    let mut step: i16;

    for n in 0..lseg {
        sign = if logbuf[n as usize] > 0x0080 { -1 } else { 1 };
        mantissa = !logbuf[n as usize];
        exponent = (mantissa >> 4) & 0x0007;
        segment = exponent + 1;
        mantissa = mantissa & 0x000F;

        step = 4 << segment;

        linbuf[n as usize] = sign * ((0x0080 << exponent) + step * mantissa + step / 2 - 4 * 33)
    }
}

~~~
初めてデータベーススペシャリスト試験を受けてきた 午前試験のまとめ

## はじめに

今日はハーフマラソンに初挑戦し、2時間1分3秒で完走しました！:v: サブ2を達成できず、悔しいです :sob:
アドベンドカレンダーも完走できるように頑張ります！ :santa:

技術とは関係のない話から始まりましたが、今日からアドベントカレンダー2024が始まります。秋に受けたデータベーススペシャリスト試験のまとめと受験までに勉強した内容を25日間でまとめながら共有していきたいと思います。

## 本文

### 午前試験のまとめ

初日の今日は、午前試験のまとめをします。ちなみに、合否の発表は2024年12月26日ですが、自己採点の結果、不合格が確定していますw 来年またチャレンジします！:muscle:

- **試験情報**
    - **実施日**: 2024年10月13日
    - **問題**: [IPA公式サイト](https://www.ipa.go.jp/shiken/mondai-kaiotu/2024r06.html)

### 午前Ⅱ試験の傾向

午前Ⅱ試験は、過去問やその応用が出題されていました。25問中18問が「データベース」に関する問題で、その中でも「データベース設計」、「データ操作」、「トランザクション処理」が約7割を占めていました。

### 間違えた問題とその分析

私が間違えたのは問題番号7から11までの5問で、すべて「データ操作」に関する問題です。

1. **問題7**: AVG集合関数で平均金額を算出する問題。**見落とし**: WHERE句の条件「商品ランク='A'」を見落としていました
2. **問題8**: 隣接リストからSQLでリーフノードを取得する問題。**理解不足**: リーフノードの定義と集合演算子（EXCEPT、INTERSECT、UNION、UNION ALL）の違い
3. **問題9**: 表の等結合に関する問題。**理解不足**: 等結合と自然結合の違いを混同していました
4. **問題10**: SQL文の副問い合わせに関する問題。**理解不足**: GROUP BY句とサブクエリの関係性
5. **問題11**: 集合演算に関する問題。**理解不足**: 和両立の条件と集合演算の特性

### 詳細な分析

- **問題7**
    - **誤答原因**: WHERE句の「商品ランク='A'」を見落とし、LEFT OUTER JOINで一致したすべての商品の平均を算出してしまいました
    - **対策**: SQL文を解く際には、条件文を丁寧に確認する
- **問題8**
    - **誤答原因**: リーフノードの定義と集合演算子の違いを正確に理解していませんでした
    - **リーフノード**: ツリー構造で子を持たないノード
    - **集合演算子の違い**:
        - **EXCEPT句**: 最初のSELECT結果から2つ目のSELECT結果を差し引く
        - **INTERSECT句**: 両方のSELECT結果の共通部分を返す
        - **UNION句**: 両方のSELECT結果の和集合を返し、重複は一つにまとめる
        - **UNION ALL句**: 重複も含めてすべての結果を返す
    - **対策**: 各集合演算子の機能と用途を明確に理解する
- **問題9**
    - **誤答原因**: 等結合と自然結合の定義を混同していました
    - **等結合**: '='演算子で結合し、結合キーが両方のテーブルに表示される
        - **例**:
            ```sql
            SELECT * FROM 商品表 INNER JOIN 納品表 ON 商品表.商品番号 = 納品表.商品番号;
            ```
    - **自然結合**: 同名の列で結合し、重複する列は一つにまとめる
    - **対策**: 結合方法の違いと特徴を整理して覚える
- **問題10**
    - **誤答原因**: GROUP BY句を使用したサブクエリの結果が各行に適用されると誤解していました
    - **ポイント**: サブクエリはメインクエリごとに実行されるため、`S1.性別 = S2.性別`を使って各行と比較する必要があります
    - **対策**: サブクエリとメインクエリの実行関係を理解し、適切な条件設定を行う
- **問題11**
    - **誤答原因**: 和両立の条件と集合演算の特性を正確に理解していませんでした
    - **和両立の条件**
        - 列数が同じであること
        - 対応する列のデータ型が同じであること
    - **集合演算と和両立**
        - **必要**: UNION、INTERSECT、EXCEPT
        - **不要**: 直積（CROSS JOIN）
    - **ポイント**: 必要な演算では共通項を見つけるために条件が揃っている必要があります
    - **対策**: 和両立が必要な演算とその理由を理解する

### 来年に向けて

過去問題が多く出題されているので、時間をかけて徹底的に解くことが必要になると思います。加えて、セキュリティなどのデータベースに関する知識以外も理解しておく必要があります。

## まとめ

今回の振り返りで、自分の理解不足な点が明確になりました。特に、SQLの基本的な概念や集合演算子の機能を再確認する必要があります。来年の試験に向けて、これらの弱点を克服し、より深い理解を目指して学習を進めていきます。
kaggle titanicコンペ


アベンドカレンダーでkaggle初心者に向けて記事を書いて行きます。

kaggleはtutorialが充実しており、これを理解するとData Scienceのスキルとして一定のレベルに達することができるようになっています。残念ながら英語であること、いくつかのステップが省略されていることがネックとなり多くの方がtutorialの途中で脱落しております。残念なことなので一念発起してはtutorialを改めて解いてみた私のメモを載せています。


カレンダー１日目の投稿ですが、最初にアベンドカレンダーの対象者を明確にしておきます。
kaggleに登録してみた人
tutorialで詰まっている人
とりあえずtutorialが一通りすんだけど理解が不十分な気がする人
が対象です。
python初学者やkaggle中級者はこの記事の対象外となります。
tutorialの記事を全て解説する時間的余裕もないですしtutorialそのものを読めばわかる部分・流石に前提として知っておく部分も飛ばして行きます。機械翻訳で原文を読むとことをお勧めしています。

また、コードを読んで実際に手を動かすことが良いでしょう。現在のAIの性能は、kaggleで戦うことに十分ではありません。

titanic コンペについて

https://www.kaggle.com/code/alexisbcook/titanic-tutorial

これより前にpython,pandas,visualizationに関するtutorialを終わらせておく必要があります。このアベンドカレンダーでは取り扱いません。pythonそのものを学習する際、英語では

https://www.codecademy.com/catalog/language/python

日本語で書かれたものでは

https://www.python.jp/train/index.html

を読むほうがkaggleでpythonを学ぶよりスムーズでしょう。
pandas部分についてはアベンドカレンダーで余裕があれば記事を書こうと思います。


titanic tutorialについては多くの先達の記事がありますが、このコンペを通してデータの提出についてのやり方をマスターしましょう。

https://www.kaggle.com/code/hatokgl/titanic-japanese

で先達が日本語化してくれています。
残念ながら、titanic tutorialはrandom forestとパーセプトロン以外の手法については取り扱っていません。訓練するデータの数が少ないためではないかと思いますので、次のより多くのデータを取り扱うチュートリアルで多くの機械学習の手法に慣れていきましょう。

困りやすい点
pd.get_dummies()関数が出てきますが特に説明がなさそうです。
これはカテゴリデータ（例：sexやPclass）を
ダミー変数（二値変数）に変換するための関数です。
あるデータ
```
    Sex
0   Male
1   Female
2   Male
3   Female
4   Male
```
を変換して
```
    Sex_Female  Sex_Male
0   0          1
1   1          0
2   0          1
3   1          0
4   0          1
```
のような形に書き換えてくれます。

列の数が増えすぎる可能性を考える方がおられますが、心配しないでください。
HaystackEditorさわってみた

エンジニアの風速です。今回はxで見かけたHaystackEditorというエディターをさわってみようと思います。
# HaystackEditorとは
vscodeがベースになっているのでVS Codeでサポートされている言語はサポートされています。基本的にvscodeで使用できる拡張機能も利用できると思います。
対応OSはmac os, windows, linuxでVS Codeが利用できる環境ならば利用できると思います。
ワークスペースのファイルは上下左右に移動できます。
![スクリーンショット 2024-12-01 19.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/e395d76e-670b-6434-9250-4ff0544717fd.png)

# VS Codeからの移行
すでにvscodeを使用している場合は、設定をインポートできます。mac osだとcmd + shift + Pでコマンドパレットを開き、`Import VS Code Settings and Extentions`というのがあるので、それを実行すれば適用できます。
![スクリーンショット 2024-12-01 19.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/a3f6a7d5-5e47-14db-86e4-83091b2280fc.png)

# まとめ
基本的にVS Codeの使用感と変わらないので、以降は簡単だと思います。
現状アップデートするには再度ダウンロードしないといけないみたいなどありますが、いままでのエディターにはないようなビューで、メソッドなどのつながりが視覚的に見やすくて、自分の思い通りにファイルの配置を変えられるので、大きなモニターを使用している人などはかなり良いのではないのかなと個人的に思います。

以上、風速でした。

# 参考
https://haystackeditor.com/