OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptでデータ差分チェックを再帰的にやりたい

### やりたいこと
JSON or 配列データの更新リクエストがきたとき、前回と差異があるのかを判定したい。
差異がなければDB更新処理をやらない。（負荷軽減）


[main.ts]
```typescript
// JSONオブジェクト,配列の差分を比較する
function is_difference_data(source: any, target: any) {

  if (source instanceof Object) {
    if (!(target instanceof Object)) {
      return true;
    }
  }

  // arrayは並び順を併せる
  if (Array.isArray(source)) {
    if (!(Array.isArray(target))) {
      return true;
    }
      source.sort();
      target.sort();
  }

  for (const key in source) {
    const s_value = Object(source)[key];
    // targetにkeyが存在しない場合は差分があると判断
    if (!(key in target)) {
      return true;
    }
    const t_value = Object(target)[key];

    if (Array.isArray(s_value) || s_value instanceof Object) {
      // 再帰的に差分を比較
      if (is_difference_data(s_value, t_value)) {
        return true;
      }
      // 文字列、数値、真偽値の場合は比較
    } else {
      if (s_value != t_value) {
        return true;
      }
    }
  }
  return false;
}


// 動作確認
function test_is_difference_data() {

  // 差分無し
  const source = {
    id: 1,
    name: {
      firstname: "taro",
      lastname: "kimura",
    },
    address: ["address1", "address2"],
  };
  const target = {
    id: 1,
    name: {
      firstname: "taro",
      lastname: "kimura",
    },
    address: ["address2", "address1"],
  };
  const res1 = is_difference_data(source, target);
  console.log(res1); // false

  // 差分あり
  const source2 = {
    id: 1,
    name: {
      firstname: "taro",
      lastname: "kimura",
    },
    address: ["address1"],
  };
  const target2 = {
    id: 1,
    name: {
      firstname: "taro diff",
      lastname: "kimura",
    },
    address: ["address1"],
  };
  const res2 = is_difference_data(source2, target2);
  console.log(res2); // true

}

test_is_difference_data()
```


実行コマンド
```sh
node_modules/.bin/ts-node main.ts
```
一致するコンストラクターが型 xxxxxに見つかりません。この型は、引数または FactoryMethod ディレクティブを使用して構築できます。

このエラーが発生した際に、トラブルシューティングの手順を説明します。私も最初は相当間抜けな話だと思いましたが、実際にエラーの原因を追いかけてみると、結構単純な問題でした。

#### 原因
エラーの根本的な原因は、`xaml.cs`ファイル内で`InitializeComponent();`の呼び出しが抜けていたことでした。`InitializeComponent()`は、XAMLで定義されたUI要素を初期化するために必要なメソッドです。このメソッドを忘れてしまうと、XAMLとコードビハインドの間で適切なバインディングやコンストラクターの一致が取れず、エラーが発生することがあります。

#### 私の場合の経緯
新しいアプリを開発している際に、このエラーに直面しました。開発中のアプリでは、XAMLファイルにUIコンポーネントが定義されており、それを`xaml.cs`で操作する形でした。しかし、差分を確認していなかったため、`InitializeComponent();`を呼び出し忘れていたのです。

#### 解決方法
解決策は非常にシンプルで、`xaml.cs`のコンストラクターに`InitializeComponent();`を追加することです。このメソッドは、XAMLで定義されたUIコンポーネントの初期化を行うため、これを呼び出さなければUIが正しくセットアップされません。

```csharp
public MainWindow()
{
    InitializeComponent();  // 必要な初期化処理
}
```

#### 既存のXAMLの編集について
新規アプリを開発している場合、XAMLと`xaml.cs`間でどこが変更されたのか差分を確認しづらいことがありますが、既存のXAMLを編集している場合は、差分が明確なので、このようなミスが起こりにくいかと思います。
人を幸せにする方法を探す_備忘録_0

- パブロフの犬
首輪の音とご飯を連携させてご飯を食べさせることで、
犬は首輪の音だけで、犬はよだれを垂らすようになった。

つまり、日常的に嬉しいことを感じている時に使用しているものなどを、サービスなどに取り込むことで、心理学的に人を幸せにすることができるかも知れない。
帯域保証転送とは何か？

>サービス・クラス管理に関する少し精巧な方法は、帯域保証(Assured Forwarding)と呼ばれる。これはRFC2597で記述されている。帯域保証転送では4つの優先順位クラスがあり、各々が固有のリソースをもっている。

# 4つの優先順位クラス
>上位３つのクラスはゴールド、シルバー、ブロンズと呼ばれることがある。加えて、輻輳かでのパケット破棄クラス（破棄する量）を少ない、普通、多い、の３つのクラスで定義できる。これら２つのを組み合わせて同時に使用することで、合計十二個のサービス・クラスを定義している。

# 優先順位クラスに分類
>パケットを４つの優先順位クラスのうち一つに分類することである。先述の通り、このステップは送信元ホストで行われるか、あるいは入り口ルーターで行われる。

# 破棄クラスに分類
>それぞれのパケットに対し破棄クラスを決定する。これはトークン・バケツのようなトラフィック・ポリシング・メカニズムにパケットを通すことによって行う。このバケツはすべてのパケットを通過させるが、その際に小規模なバーストに収まるパケットは低破棄クラス、それを上回る中破棄クラス、大規模なバーストにも収まりきらないパケットを高破棄クラスに分類する。優先順位クラスと破棄クラスの組み合わせは各パケットの中に組み込まれる。

# REDで捨てられながら重み付き公平キューイングで転送される
>重み付き公平キューイングで、４つの優先度クラスに対して、優先度が高いほどお大きな重みを与え得る方法が一般的である。

>あるクラスの重みが一つ下のクラスの2倍であると、帯域も2倍得られることになる。

>同じ優先度クラスの中では、REDのようなアルゴリズムを実行することにより、高い破棄クラスのパケットが優先的に捨てられる。

>高破棄クラスのパケットを破棄しながらも、低破棄クラスのパケットを新たに受け入れるためのバッファ領域がまだ存在する。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
優先順位クラス、破棄クラスを用いて輻輳を起こさず、QoSも保証していく
rex0220 計算式プラグイン ユーザー選択の所属組織セット

計算式プラグインで、ユーザー選択の所属組織をセットします。

# 概要

ユーザー選択項目から所属組織を取得し組織選択項目にセットします。
OINFO の "setData" オプションで、組織選択項目へのセット用データを作成できます。
組織コードと組織名を設定するため、編集画面で指定ユーザー変更時にも組織名が組織選択項目に表示されます。

ex: OINFO("code1","setData") -> [{"code":"code1","name":"name1"}]
※計算式プラグイン Ver.83 以降

![2024-11-21_12h01_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7adf092f-0409-9c19-8d27-88e0ff0681ba.png)


# 操作例

![2024-11-21_12h04_29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/bb3a3b86-4911-10ca-4f23-21a1cbbbb566.gif)

# 計算式プラグイン設定

UINFO, OINFO, GINFO 関数を使用する場合は、「ユーザー情報」をチェックします。

- SEL_CODE(ユーザー選択,"array")
    - ユーザー選択項目からユーザーコードを取得
- UINFO(...,"orgs")
    - ユーザーコードから所属組織IDを取得
    - 優先する組織を取得する場合は、"primaryOrganization"
- OINFO(...,"setData")
    - 所属組織IDから組織選択項目へのセット用データを作成

![2024-11-21_12h05_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/110523fd-4cc1-ad70-a999-690da14dadc8.png)


```.js
OPTION: ユーザー情報

// 優先する組織 ORGANIZATION_SELECT
OINFO(
  UINFO(SEL_CODE(ユーザー選択,"array"),"primaryOrganization"),
"setData")

// 所属組織 ORGANIZATION_SELECT
OINFO(
  UINFO(SEL_CODE(ユーザー選択,"array"),"orgs"),
"setData")

// 所属グループ GROUP_SELECT
GINFO(
  UINFO(SEL_CODE(ユーザー選択,"array"),"groups"),
"setData")
```
カスタマーサポートにおけるKPI設定の失敗談

# はじめに
私は、カスタマーサポートとして弊社が開発している製品に関する問い合わせへの回答業務を管理しており、カスタマーサポートにおける顧客満足度のさらなる向上に向けて施策を検討、実施しています。

この記事では、顧客満足度向上施策においてKPIの設定に失敗したお話として、KPI設定の背景、達成に向けた取り組み、結果と反省点など、ご紹介させていただければと思います。

カスタマーサポートの概要は[より愛される製品を育むためのカスタマーサポート心得、あるいはレビュー基準](https://qiita.com/kou-iwamoto/items/74e41de54cbfcdceac59)の記事をご参照ください。

# 目標設定の背景
私の担当しているカスタマーサポートのシステムでは、お客様が回答を受領しチケットがクローズした際に対応が満足いくものだったかどうかのアンケート（満足度アンケート）をしています。回答項目は「満足度（満足／不満足の２択）と「自由記述」です。

過去の満足度アンケートの満足度と自由記述の関係を分析したところ、満足度の要因は「丁寧な対応」と「迅速な対応」の２つに大別されることがわかりました。

# 目標設定
まず注目したのは「迅速な対応」です。過去の満足度アンケートの分析から、初回質問からクローズまでの日数と満足度に相関が見られました。５営業日以内にクローズしているチケットの満足度が高かったことから「５営業日以内クローズ率」を指標としました。

「迅速な対応」だけに注力してしまうと「丁寧な対応」が疎かになってしまうことを懸念しました。そのため、「丁寧な対応」の指標として「満足度アンケートの満足率（無回答を除く） 」を指標としました。

目標値は過去の実績をもとに以下のように設定しました。

|観点      |KPI                                   |目標値|
|:-------:|:--------------------------------------|:----:|
|丁寧な対応|満足度アンケートの満足率（無回答を除く）  |96.0%|
|迅速な対応|５営業日以内クローズ率                   |64.0%|

# 目標達成に向けた取り組み
目標達成に向けた取り組みとして、回答作成時のレビュー基準と注意事項を策定しました。
「丁寧な対応」の目標達成に向けて、[より愛される製品を育むためのカスタマーサポート心得、あるいはレビュー基準](https://qiita.com/kou-iwamoto/items/74e41de54cbfcdceac59)の記事で紹介したレビュー基準を導入しました。

「迅速な対応」の目標達成に向けて、以下のようなクローズまでの日数短縮に向けた施策を回答作成時の注意事項に盛り込みました。

- 一定時間考えてもわからない場合は相談すること
- 問い合わせ内容に不明点がある場合は先方に確認すること
- 事象の再現に必要な情報が不足している場合は、調査をする前に、先方に情報提供を依頼すること

# 結果と反省点
結果は以下のとおりとなりました。

|観点      |KPI                                   |目標値|実績値|判定 |
|:-------:|:--------------------------------------|:----:|:---:|:----:|
|丁寧な対応|満足度アンケートの満足率（無回答を除く）  |96.0%|96.3%|達成  |
|迅速な対応|５営業日以内クローズ率                   |64.0%|61.1%|未達成|

「５営業日以内クローズ率」は未達となりました。

原因としては、問い合わせのクローズはお客様に依存するため、お客様にてすぐに回答の確認作業ができない場合や、確認できたとしてもすぐにクローズ操作がおこなわれない場合があることが挙げられます。お客様から連絡がなく放置されるチケットもあり、なかなか思うようにクローズ率を向上させることができませんでした。

# まとめ
今回のKPI設定は、大きく以下の面で失敗だったと考えています。

- 満足度アンケートの分析をそのままKPIにしてしまった
- 目指したもの（迅速な対応）を正確に計測できる指標ではなかった
- こちら側で取り組みができたかを評価できる指標ではなかった

顧客満足度の向上に向けてどんな取り組みをするかを考え、その取り組みができたかを評価できるものを指標とするべきだと思います。
現在は、満足度アンケートの満足率を指標としつつ、回答作成時の注意事項とレビュー基準をブラッシュアップ（事例の記載など）していくことで、顧客満足度のさらなる向上に向けた取り組みを進めています。

ここまでお読みいただき、誠にありがとうございました。
Customize a Dashboard with CRM Analytics Advanced Editor



https://trailhead.salesforce.com/ja/content/learn/projects/customize-a-dashboard-with-einstein-analytics-advanced-editor?trail_id=wave_analytics_enable_and_produce


一度途中までやっているけど、新しいプレイグランドで再チャレンジ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4e05fea1-8ff3-acd9-b17e-f4a424492ab0.png)

# Create a Templated Dashboard

Close Dateがないですね。

8. Under Choose a date, click Close Date from the dropdown menu. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/096973ac-7e6a-23b3-9eb8-d679c4d2ffcf.png)

+ [2番目のステップにて、テーブルを読み込んでも”Close Date”が出てきません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J5zfm0AB)


何か設定がおかしい？データセットにアクセスできない？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5da24f81-ce73-da4f-a9a5-29946754e0c6.png)


Analytics Studioからは消せましたね。

データセットを登録するときに項目の型がある？デフォルトはDimensionになっていた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f19091b8-448c-9daf-b1eb-25242287fa4b.png)


Close dateのフォーマットがExcel形式だったので、以下の数式を使って変換しました。

```
=TEXT(YEAR(H2),"0000") &"-" & TEXT(MONTH(H2),"00") & "-"& TEXT(DAY(H2),"00")
```

そうすると、date型として認識できていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/79e0ef24-886c-a55f-4866-37ba62b9175e.png)

変換中

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0fd0873c-dda1-990b-1486-8962e7cb31ef.png)

おお、今度はデータセットがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/75bb8c53-1644-dff6-ee19-7a959276691a.png)


もう一度csvをダウンロードして日付を見ると... ああちゃんと2021-01-14になっていますね。
Excelで開いたがために日付のフォーマットが変わっています。

```
#,Account Name,Account Owner,Account Type,Amount,Billing Country,Billing State/Province,Close Date,Closed,Created Date,Forecast Category,Industry,Opportunity Name,Opportunity Owner,Opportunity Source,Opportunity Type,Owner Role,Product Family,Product Name,Segment,Stage,Won
22,Banks163 Inc,Eric Gutierrez,Customer,117480,USA,TX,2021-01-14,TRUE,2015-07-25T00:00:00.000Z,Closed,Technology,Opportunity for Watson358,Harold Campbell,BDR,New Business,Sales EMEA,Digital Media,Books,SMB,08 - Closed Won,TRUE
```
■ 01.Quality Assurance（品質保証、QA）について

# ■ 01.Quality Assurance（品質保証、QA）エンジニアとは？

# <INS><font color="#00bfff">**「品質保証」を目的に、計画の立案や動作仕様の確認、品質管理を行います**</font></INS>
<br>

単に商品やサービスに欠陥がなく、仕様通りに動作するかといった確認に留まらず、
使う人のニーズを満たし、かつ高い満足感が得られる製品やサービスを生み出す業務全般を行う、お仕事です。


# ■ QAエンジニアの主な業務とは？

<br>

　-> <INS><font color="#66cdaa">品質基準の策定：</font></INS>
 　　開発チームやビジネスの目標に沿った品質基準を定め、
 　　その基準がプロジェクト内で維持されるよう、支援や調整を行います。
<br>
　-> <INS><font color="#66cdaa">テストの計画と実施：</font></INS>
 　　プロダクトのリリース前に、以下のテストを計画し、実施します。
 　　・機能テスト
 　　・パフォーマンステスト
 　　・ユーザビリティテスト
 　　・セキュリティテスト
<br>
　-> <INS><font color="#66cdaa">テストプロセスの最適化：</font></INS>
 　　効率的に品質を保証するために、
 　　テストプロセスを改善し、自動テストの導入などで工数を削減します。
<br>
　-> <INS><font color="#66cdaa">問題の検出と改善提案：</font></INS>
 　　テストの結果をもとに、バグや改善点を洗い出し、
 　　開発チームと連携して品質向上に役立つアドバイスを行います。
<br>
　-> <INS><font color="#66cdaa">ドキュメントの作成と管理：</font></INS>
 　　各種テストの結果や改善策などを記録しておき、
 　　プロジェクトの品質管理が体系的に行われていることを証明するための
 　　ドキュメントを整備します。
<br>
　-> <INS><font color="#66cdaa">プロセスの品質管理：</font></INS>
 　　製品やサービスだけでなく、
 　　開発プロセス自体が効率的かつ品質の高いものとなるように監視・改善します。

# ■ まとめ：QAエンジニアが担う意義

<br>

QAは、最終的にユーザーが満足する製品を提供するための
「品質の守護者」
としての役割を果たします。
<br>
QAがしっかりと機能することで、
・顧客満足度が向上し、
・企業の信頼性が高まるため、製品の継続的な改善に貢献します。
<br>
また、QAによって問題が事前に発見されることで、
・リリース後のバグ修正や顧客対応のコストが削減され、
・開発の効率化にもつながります。
<br>

<INS><font color="#00bfff">「■ 02.Quality Assurance（品質保証、QA）の考え方について」へ続く</font></INS>
https://qiita.com/aokimakiko/items/9b0966a2d6719a0cac96
MacOSで特定のウィンドウのレコーディングをする

## はじめに

ソフトウェアの動作状況を説明するために、コンピュータの画面のスクリーンショットや動画を撮影したいことはよくあります。Macでは、「Command + Shift + 5」でスクリーンショットが撮影できることが広く知られています。しかし、特定のWindowを指定して、動画のキャプチャ・レコーディングすることはできません。

## QuickRecorder

GitHubを検索していたところ、こちらのツールが2024年11月21日時点で☆4.4kと普及していそうだったので使ってみました。

https://github.com/lihaoyun6/QuickRecorder

Homebrewでインストールできますが、

```
brew install lihaoyun6/tap/quickrecorder
```

野良のアプリなので、右クリックから起動して、かつシステム設定から、プライバシーとセキュリティのタブを開き、アプリを許可する必要がありました。

画質や、カーソルの表示非表示、音声のオンオフ等を設定します。Macのウィンドウは角丸なので、四隅に背景が表示されますが、そこも単色にするかバックグラウンドを使うかなどを選ぶことができます。キャプチャするウィンドウを選択し、スタートします。撮影のストップはメニューバーから行います。撮影が終了すると、デスクトップに mp4 形式のファイルが作成されます。

### おまけ GIFアニメへの変換

撮影し終わったら、ffmpegコマンドで gif アニメなどに変換すると、掲示板などに貼り付けやすくなり、報告がはかどります。`-loop 0` をつけると、繰り返し再生するgifアニメになります。

```
ffmpeg -i record.mp4 -loop 0 record.gif
```


QuickRecorderに関する記事が少ないのでメモしました。

この記事は以上です。
Linux - How to Show Application Memory Usage?

```shell
johnny$ ps -eo size,pid,user,command --sort -size | \
    awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\
    cut -d "" -f2 | cut -d "-" -f1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150367/378d4764-dcdb-e8fe-d257-a61619bc0138.png)

# Reference
https://stackoverflow.com/questions/131303/how-can-i-measure-the-actual-memory-usage-of-an-application-or-process
優先転送とは何か？

>ごく限られたパケットは優先クラスとされる。優先パケットは他のパケットが存在しないかのようにネットワーク内を配送される。この方法では、ロス、遅延、不快感の少ないサービス、まさにVoIPのために必要とされるサービスが得られる。

# 帯域で分けているだけで物理的には１本
>この「２本のチューブ」システムは図5−34のように表現される。ここで、物理回線はただ一本しかないための帯域予約の方法を表しているに過ぎず、２本の物理回線を表しているわけでない。

# 利点
>送信元ホストでクラス分けを行う利点は、どのパケットがどのフローに属するかについての情報をより多く利用できる点だる。

### 利点を利用する例
>優先サービスをサポートする企業ネットワークやISPを通過する場合には、優先的な扱いを受ける。

# ルーターにはパケットのクラスごとにキューがある
>ルーターは、各出力リンクについて優先パケット用と通常パケット用の２つの出力キューを持ちうる。パケットがルーターへ到着すると、クラスに応じたキューに入れられる。

### 優先度スケジューラを用いて実現する
>例えば、優先度スケジューラを利用することにより、優先キューのパケットを通常キューより高い優先度で処理できる。このようにして、実際にはネットワークが通常トラフィックで高負荷になっている場合にも、優先パケットには低負荷なネットワークに見えるような仕組みを実現している。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
mongoDBよく使うコマンド集

## 概要
※随時更新
mongoDBの操作コマンドを忘れがちなので、ここに記録していきます。

## 接続

```linux:
# localhost(デフォルト27017ポート)接続
$ mongosh

# ポート指定
$ mongosh localhost:XXXX
$ mongosh --port XXXX

# ユーザ指定
$ mongosh --port XXXX -u XXXX -p XXXX
```

## ユーザ管理
```linux:
# 管理ユーザ作成
$ use admin
$ db.createUser({user:"XXXXX", pwd:"XXXXXX", roles:["root"]})

# ユーザ一覧表示
$ db.system.users.find()

# ユーザ認証
$ db.auth("XXXX","XXXXX")
```

## DB操作
```linux:
# レプリカセット状態表示
$ rs.status()

# レプリカセットのメンバー追加(プライマリー→セカンダリー)
$ rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "localhost:27017"},{_id: 1, host: "localhost:27018"},{_id: 2,host:"localhost:27019"}]})

# 読み取り設定
$ db.getMongo().setReadPref('XXXXX');

# 読み取り設定確認
$ db.getMongo().getReadPref()

# データベース一覧表示
$ show dbs

# コレクション一覧表示
$ show collections

# コレクション全件検索
$ db.<collections name>.find()

# データベース削除
$ use <database name>
$ db.dropDatabase();
```
【Ruby】こんな間違いをしてしまった(正規表現)

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回も正規表現に関する記事です。
私は「たのしいRuby」という教材を使用して勉強しているのですが、問題を間違えてしまいました。
そこで今回は、「初心者が陥りやすいミス」として記事にまとめることにしました。
初心者の方はこれを参考にしてミスを避けていただき、経験豊富なエンジニアの方には指導の際の参考にしていただければ幸いです。

# 間違えた内容
以下のような word_capitalize メソッドを定義する問題が出題されました。
正規表現を使って、以下のように考えました（誤りの例です）。
```ruby
def word_capitalize(word)
  word.gsub(/.+-/) do |matched|
    matched.capitalize
  end
end

p word_capitalize("in-n-out") # => "In-n-out"
```
`/.+-/` は、「任意の文字列を1回以上使用したものとハイフン」にマッチするつもりでしたが、期待通りには動作しませんでした。

# 間違えた原因
間違えた原因は次の通りです。
* `/.+-/` では、`in-n-out` のうち、`in-n-` しか取得できませんでした。
(追記)これは、量指定子`+`の「最長一致の原則」が聞いているため、可能な限り長い文字列をとっているからです。
* gsub のブロックはマッチした部分だけを処理するため、繰り返し処理を適切に組まないと、文字列全体を操作できない点に気づけませんでした。

# 解決策
### 解決策1: `\b` を利用する
```ruby
def word_capitalize(word)
  word.gsub(/\b[a-z]/) do |matched|
    matched.upcase
  end
end

p word_capitalize("in-n-out") # => "In-N-Out"
```
`\b` によって単語の境界を検出し、小文字アルファベットにマッチしています。
この例では i, n, o が検出され、それぞれが大文字に変換されます。

### 解決策2: `split`, `map`, `join` を利用する
```ruby
def word_capitalize(word)
  word.split("-").map{|i|i.capitalize}.join("-")
end

p word_capitalize("in-n-out")
# => "In-N-Out"
```
処理の手順は以下の通りです
* `split("-")` によりハイフンを取り除いて文字列を配列化（例: `["in", "n", "out"]`）。
* `map { |i| i.capitalize } `で各部分を大文字化（例: `["In", "N", "Out"]`）。
* 最後に `join("-")` で結合して元の形式に戻します。

# まとめ
今回は、正規表現と gsub を使う際に、繰り返し処理を正しく設計しなかったために誤りが生じました。
「間違えたシリーズ」を通じて、同じようなミスを減らし、業界全体の理解度向上に少しでも貢献できたら嬉しいです。
1/fのゆらぎと冪等性

**この記事は**[ファンタラクティブ2024年アドベントカレンダー](https://qiita.com/advent-calendar/2024/funteractive-inc)**12月2日の記事です。**
<hr>

```
寒い。すごく寒い...
そう、少し前に北海道へ移住したのだ。
```

```
ここの冬は過酷である。
大地は美しい銀世界を条件に、
身体の芯から体温を奪っていく。
```
<br>

```
寒い。すごく寒い...
そう、薪ストーブに火を灯そう。
```

```
薪は炎へ変わり、空気を振動しはじめる。
不規則な動きで瞳の奥を支配してくる。
どこか懐かしい。
DNAがそう思わせるのだろう。
```
<br>

```
暖かい。すごく暖かい...
そう、僕たちはプログラマーである。
```

```
関数型プログラミングという魔法を武器に、
何度実行しても同じ値を返す関数を実装する。
それは僕たちの美学である。
```

```
だが、こいつはそれに反する。
いつも予測不能な値を返す。
相反する立場でありながら、心の安らぎを与える。
```
<br>

```
暖かい。すごく暖かい...
そう、心と頭で感じていたのだろう。
```

```
真逆の入力から、至福な出力を得る。
僕たちが両者を支配したとき、
次のフェーズへシフトするのかもしれない。
```
<br>

```
茫然と雪降る景色を見た。
```
<hr>

**次回は、村上拓さんの記事になります！**
ilasmでstack machine その51

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
MessageBoxを使え。

# サンプルコード

```
.assembly extern mscorlib { }
.assembly extern System.Windows.Forms {
	.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
	.ver 4:0:0:0
}
.assembly ah { }
.method static void Main() cil managed {
	.entrypoint
	.maxstack 2
	ldstr 	"Hello!!"
	call 	valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
	pop
	ret
}

```

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b47d7020-e4dc-749d-f2b3-bee9b130217a.png)


以上。
ilasmでstack machine その50

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
readlineを使え。

# サンプルコード

```

.assembly extern mscorlib {
	.ver 4:0:0:0
	.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
.assembly 'Program' {
	.custom instance void class [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::'.ctor'(int32) =  (01 00 08 00 00 00 00 00)
	.custom instance void class [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::'.ctor'() =  (01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01)
	.custom instance void class [mscorlib]System.Diagnostics.DebuggableAttribute::'.ctor'(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) =  (01 00 07 01 00 00 00 00)
	.hash algorithm 0x00008004
	.ver  0:0:0:0
}
.namespace SBRL.Demo.Disassembly {
	.class private auto ansi beforefieldinit Program extends [mscorlib]System.Object {
		.method public static hidebysig default void Main (string[] args) cil managed {
			.entrypoint
			.maxstack 5
			.locals init (int32 V_0, int32 V_1)
			call 	string class [mscorlib]System.Console::ReadLine()
			call 	int32 int32::Parse(string)
			stloc.0
			ldc.i4.s 0x0a
			stloc.1
			ldstr 	"{0} + {1} = {2}"
			ldloc.0
			box 	[mscorlib]System.Int32
			ldloc.1
			box 	[mscorlib]System.Int32
			ldloc.0
			ldloc.1
			add
			box 	[mscorlib]System.Int32
			call 	void class [mscorlib]System.Console::WriteLine(string, object, object, object)
			ret
		} 
		.method public hidebysig specialname rtspecialname instance default void '.ctor' () cil managed {
			.maxstack 8
			ldarg.0
			call 	instance void object::'.ctor'()
			ret
		}
	}
}



```

# 実行結果

```
>pr0
12
12 + 10 = 22

```

以上。
【PHP】Switch内で変数の値を変更する

## より良く

短くするのがいいとかそういうわけではないけど

```php:元のコード
        $BASIC = 1;
        $ADVANCE = 2;
        $MASTER = 3;
        $PROFESSIONAL = 4;

        switch ($rank) {
            case $BASIC:
                {
                    $add_id_arr = [2,20,22];
                    break;
                }
            case $ADVANCE:
                {
                    $add_id_arr = [4,105];
                    break;
                }
            case $MASTER:
                {
                    $add_id_arr = [8];
                    break;
                }
            case $PROFESSIONAL:
                {
                    $add_id_arr = [10];
                    break;
                }
        }
```
```php:修正後
        $rank_to_ids = [
            $BASIC => [2, 20, 22],
            $ADVANCE => [4, 105],
            $MASTER => [8],
            $PROFESSIONAL => [10],
        ];
    
        $add_id_arr = $rank_to_ids[$rank] ?? [];
```

switchして変数の値を条件によって修正する程度で、その条件が固定値なのであれば、
今回のように$rankごとに配列マッピングして参照するほうが効率的
備忘録：Flaskで503ERROR対応策

## FlaskでWebからのアクセスはOKだが、クライアントスクリプトから実行すると503エラーが発生する場合の対処法

どうやっても、503が発生したため、調査対応をおこなった。

## 結論
python.exe自体が残っていたため、スクリプトの切断/再実行ではNGだった。

:::note warn
注意点
以下で誤ったプロセスを終了させると、システムが不安定になる可能性があります。 終了する前に、プロセスが何をしているのか必ず確認してください。

ポートの競合は、他の原因が考えられる場合もあります。上記の手順で解決しない場合は、以下の点を考慮してください。

ファイアウォール: ファイアウォール設定が原因で、クライアントスクリプトからのアクセスがブロックされている可能性があります。

ネットワーク設定: ネットワークの設定に問題がある可能性があります。

Flaskアプリケーションのコード: アプリケーションのコードに誤りがある可能性があります。
:::


### 原因の特定：ポートの競合
このエラーは、通常、Flaskアプリケーションが使用するポートが、他のプロセスによって既に占有されていることが原因です。

#### 解決手順
1. ポートの使用状況を確認する
コマンドプロンプトまたはPowerShellを開く
以下のコマンドを実行する

    netstat -aon | findstr :<ポート番号>

:::note info
<ポート番号> の部分を、Flaskアプリケーションが使用しているポート番号に置き換えてください。
例: Flaskが5000番ポートを使用している場合、netstat -aon | findstr :5000 となります。
:::

2. PID（プロセスID）を確認する
上記のコマンド実行結果の末尾に表示される数字がPIDです。
  TCP    0.0.0.0:54231         0.0.0.0:0              LISTENING       1234

このPID(上記例:1234)は、ポートを占有しているプロセスを一意に識別する番号です。


3. タスクマネージャでプロセスを確認、KILL

:::note info
ポートを占有しているプロセスが不要な場合、タスクマネージャからそのプロセスを終了するもしくは

taskkill /PID <PID> /F
2で確認したPIDに置き換えてください。
:::
【Flutter】 PopUntilした際に画面が真っ暗になった

## RouteSettingsを指定していなかったことが原因

```quiz_outline.dart
child: AppBar(
                automaticallyImplyLeading: false,
                backgroundColor: AppTheme.gameMainColor,
                iconTheme: const IconThemeData(color: AppTheme.subColor),
                elevation: 0,
                leading: IconButton(
                  icon: const Icon(Icons.arrow_back_ios),
                  onPressed: () {
                    Navigator.popUntil(context, ModalRoute.withName('/gametop'));
                  },
                ),
              ),
```
```top_page.dart
  openQuizPage(BuildContext context) {
    Navigator.of(context).push(MaterialPageRoute(
      settings: const RouteSettings(name: '/gametop'),
      builder: (context) => const GameTopPage()
    ));
  }
```

quiz_outline.dartでpopUntil()を使用し、正常にGameTopページに遷移するためには、
pushした際にしっかりと```settings: const RouteSettings(name: '/gametop'),```
でルートにRouteSettingを渡しておく必要がある。
これがないと、popUntil()で戻る際にページを見つけることができなくなり、真っ黒になっていた

https://aroundthedistance.hatenadiary.jp/entry/2020/12/15/165228

https://zenn.dev/katoshi119/articles/d7202d0d64697c
Slackアプリを作ったら？ チャネル追加の壁を闘魂で突破する方法

自作のSlackアプリをチャネルに追加する際に壁にぶつかったとき、その問題を乗り越える方法を解説します！この解決法を知ることで、開発者としての自由度と効率を格段に高められるはずです。

![DALL·E 2i.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/6f5392a9-57b5-600c-50ad-2ca89786939c.jpeg)

このイラストは、Slackアプリの開発者が壁を乗り越える姿を象徴しています。


# はじめに

自分で作ってインストールしたはずのSlackアプリをチャネルに追加できない！

https://qiita.com/lighlighlighlighlight/items/74b0b4940d49caff6bb8

「[インストールしたはずのSlack appがワークスペースに表示されなくて困った](https://qiita.com/lighlighlighlighlight/items/74b0b4940d49caff6bb8)」と同じ事象が私も起きましたので、記事をしたためて投稿（闘魂）しておきます。生成AIのモデルに学習してもらいます！

この記事ではSlackアプリの作り方は解説しません。
作ったSlackアプリをチャネルに追加する方法一点だけにしぼって解説します。

アプリの作成方法については[こちらの公式ドキュメント](https://tools.slack.dev/bolt-python/ja-jp/)をご参照ください。初心者でもわかりやすい解説が含まれています。

# 解説しないこと

「はじめに」にも書きました通り、Slackアプリの作り方は解説しません。
作ったSlackアプリをチャネルに追加する方法一点だけにしぼって解説します。

# Slackアプリの作り方を知りたい方へ

Slackアプリの作り方を知りたいかたは、[Bolt for Python](https://tools.slack.dev/bolt-python/ja-jp/)などの公式から発信されているドキュメントを確認するとよいでしょう。
公式ドキュメントには、Slackアプリの作成手順が詳細に解説されています。

# 前提

この記事の前提を書いておきます。
たとえば、先ほど紹介したドキュメントの中で以下の２つの手順を完了済である状態を前提とします。

[アプリを作成する](https://tools.slack.dev/bolt-python/ja-jp/getting-started#create-an-app)

もう少し具体的にいうと、

1. https://api.slack.com/apps?new_app=1 でアプリを作成する
1. 以下の手順を完了させる

![スクリーンショット 2024-11-21 8.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/bbf9aaa2-d22f-06b4-501b-cebf6394ad9e.png)


# 作ったSlackアプリをチャネルに追加する方法

いよいよ本題です。AIに学ばせるにはコンテキストが大事なのです。ですから前段はしっかり丁寧に書きました。本題のほうがあっさりするくらいです。

作ったSlackアプリをチャネルに追加する方法を解説します。

## 1. チャネルから直接追加する

通常こちらの手順でできるはずです。

- _1_. チャネルのチャネル名をクリックします (下図では **yamauchi3**)

![スクリーンショット 2024-11-21 8.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/cae4156e-8524-0d5d-362f-5d6cd4945dc5.png)


- _2_. ポップアップが表示されるので「インテグレーション」タブで、APP > 「アプリを追加する」です

![スクリーンショット 2024-11-21 8.22.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/f3c03919-39f6-e80e-521e-f4b5626e4734.png)


通常はこの操作でSlackアプリをチャネルに追加できるはずです。

ただし、この手順では、ワークスペースにインストールしたはずのSlackアプリが次の画面で候補に表示されない場合があります。その場合は次の手順をお試しください。


## 2. アプリから追加する

- _1_. Slackアプリの左側をよく見ると、Appというセクションにアプリが追加されているはずです。タイミングはインストールを承認したあとのタイミングです。

- _2_. Slackアプリを選びます。（図では、 **testApp2024-11-21**)

![スクリーンショット 2024-11-21 8.27.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/20a60c06-7f4e-dde7-31d7-f1e619e731ec.png)



- _3_. 上部のSlackアプリ名を押します。（図では、 **testApp2024-11-21**)


![スクリーンショット 2024-11-21 8.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/ae46b3ab-501b-416a-d9c5-8ba06238c8f5.png)



- _4_. ポップアップが表示されるので「チャネルにこのアプリを追加する」からチャネルを選択して追加できます

![スクリーンショット 2024-11-21 8.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/4627ec4f-a7ea-5e7a-57de-f28be3f954c9.png)


私は、

https://qiita.com/lighlighlighlighlight/items/74b0b4940d49caff6bb8

の記事に助けられました。
この場をお借りして御礼申し上げます。
あわせてお読みください。

---
# おわりに

自分で作ってインストールしたSlackアプリをチャネル追加する方法を解説しました。
自分好みのSlackアプリを制作して、あなたの開発という名の芸術活動をより豊かなものにしてください。

今日という一日を無駄にしないためにも、この記事をヒントに、Slackアプリをチャネルに追加してみてください。さあ、あなたの技術と闘魂で、新しいチャレンジの扉を開きましょう！

さあ、闘魂でチャレンジの扉を開きましょう！
Pandas 転置後のindex 備忘録

# 概要
転置(`.T`)後のindexについてハマったので残す。

- 実施期間: 2024年11月
- 環境：Windows11
- Python: GoogleColabo

# 1. 転置前
DataFrameを用意する。このDataFrameのindexにnameプロパティを設定しなければ本備忘録は無視してよい。

```python
import pandas as pd

# RangeIndex で名前が "index" の DataFrame を作成
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df.index.name = "Index"

print(f'columns.name: {df.columns.name}')
print(f'index.name: {df.index.name}')
print(df.info())
```

```terminal
columns.name: None
index.name: Index
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   A       3 non-null      int64
 1   B       3 non-null      int64
dtypes: int64(2)
memory usage: 176.0 bytes
None
```

![{656DA692-07AE-4359-A1BD-FD82B4330103}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/3971a319-e60f-564a-2df8-413105714569.png)

# 2. 転置後

```python
df_T = df.T
print(f'columns.name: {df_T.columns.name}')
print(f'index.name: {df_T.index.name}')
print(df_T.info())
```

```terminal
columns.name: Index
index.name: None
<class 'pandas.core.frame.DataFrame'>
Index: 2 entries, A to B
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   0       2 non-null      int64
 1   1       2 non-null      int64
 2   2       2 non-null      int64
dtypes: int64(3)
memory usage: 172.0+ bytes
None
```

![{E05D30D8-CBE8-48F5-9C74-CBAAB74E84BC}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/4d051d5e-8a73-46f8-16a6-5092eee7ebb7.png)

"Index"の文字の位置がいつもと違い「えっ？」となる。これは普段使わないcolmuns.nameというプロパティが置換前のindex.nameに置き換わったためでPandasの仕様である（らしいが公式Docには記載なし）。

# 3. nameプロパティの変更
気持ち悪いので明示的にnameを変更する。

```python
df_T.columns.name = None
df_T.index.name = 'Index'   # 何でもよい
print(f'columns.name: {df_T.columns.name}')
print(f'index.name: {df_T.index.name}')
print(df_T.info())
```

```terminal
columns.name: None
index.name: Index
<class 'pandas.core.frame.DataFrame'>
Index: 2 entries, A to B
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   0       2 non-null      int64
 1   1       2 non-null      int64
 2   2       2 non-null      int64
dtypes: int64(3)
memory usage: 172.0+ bytes
None
```

![{9D260909-C4BA-4A97-BAF5-A4F96242C16B}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/35230b09-d1fd-029a-2139-078bcfee67d1.png)

ちなみに`df_T.columns.name = None`をしなければ、次のようになる。

![{8C7172CE-A4DA-4F7E-A717-9AE7DEE9D348}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205257/b88b6a35-0fb1-d044-e893-8b919ae549e1.png)

以上
SparkのShuffle FetchFailedExceptionエラーによるジョブの失敗

[Job fails with Spark Shuffle FetchFailedException error \- Databricks](https://kb.databricks.com/en_US/jobs/job-fails-with-spark-shuffle-fetchfailedexception-error)の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

FetchFailedExceptionエラーのワークアラウンドとして、デフォルトのSparkシャッフルサービスを無効化しましょう。

# 問題

あなたのアプリケーションに、何かしらの集計処理やjoinステージが含まれているう場合、その実行にはSparkのシャッフルステージが必要となります。使用されている特定の設定によりますが、インタラクティブクラスターで複数のストリーミングクエリーを実行している際、シャッフルの`FetchFailedException`エラーに遭遇するかもしれません。

```
ShuffleMapStage has failed the maximum allowable number of times
DAGScheduler: ShuffleMapStage 499453 (start at command-39573728:13) failed in 468.820 s due to
org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 228703
org.apache.spark.shuffle.FetchFailedException: Connection reset by peer
at org.apache.spark.storage.ShuffleBlockFetcherIterator.throwFetchFailedException(ShuffleBlockFetcherIterator.scala:747)
Caused by: java.io.IOException: Connection reset by peer
```

# 原因

シャッフルフェッチの失敗は通常、クラスターのダウンスケーリングのイベント、エグゼキューターの喪失、ワーカーの停止のようなシナリオで発生します。特定のケースでは、エグゼキューターからのシャッフルファイルが失われます。後段のタスクはシャッフルファイルをフェッチしようとしますが失敗します。

Databricksではシャッフルサービスがデフォルトで有効化されています。このサービスは、エグゼキューターを安全に削除できるように、エグゼキューターによって書き込まれたファイルを保持する外部のシャッフルサービスを有効化します。

現状のシャッフルサービスの値を取得するために、PythonやScalaのノートブックセルで`spark.conf.get("spark.shuffle.service.enabled")`を実行します。

```py
spark.conf.get("spark.shuffle.service.enabled") 
```

# ソリューション

デフォルトのSparkシャッフルサービスを無効化します。

シャッフルサービスを無効化しても、シャッフルをとめるわけではありません。実行の方法を変更するだけです。サービスが無効化されると、シャッフルはエグゼキューターで実行されます。

クラスターの**Spark config**([AWS](https://docs.databricks.com/ja/clusters/configure.html#spark-configuration) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/compute/configure#spark-configuration) | [GCP](https://docs.gcp.databricks.com/ja/clusters/configure.html#spark-configuration))に`spark.shuffle.service.enabled false`を追加することで、シャッフルサービスを無効化する事ができます。

**Spark config**を更新した後でクラスターを再起動します。

:::note
**注意**
シャッフルサービスを無効にすると、パフォーマンスに若干のインパクトがあります。
:::


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
matplotlibで、使えるフォントの一覧と例を描画

# やりたいこと

システムにインストールされているフォント一覧を取得して、それぞれの見え方をプロットして確かめる。

![font_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817119/9ced6f66-a666-6f9a-d881-0359411f7446.png)

こんな感じ。

# コード

解説は省略。そのうち追加するかもなので、ご質問があればぜひ。

表示されるフォントが多すぎるときは、コメントにあるように絞り込んでください。

```python
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 文字化けがあるたびに警告が出るので、それを無視
import warnings
warnings.filterwarnings("ignore")

# フォントの一覧を取得
font_names = sorted(
    set([fm.FontProperties(fname=path).get_name() for path in fm.findSystemFonts()]),
    reverse=True,
)
# font_names = [
#     font_name for font_name in font_names
#     if font_name.lower().startswith("l")  # フォントの絞り込みに使える
# ]
num_fonts = len(font_names)
# 描画パラメータ
width_column = 15  # 1列の幅。座標上で1列がどれだけの幅を持つか。例文が長すぎて入らないときはここを大きく。
num_columns = 3  # 列数。何列に分割するか。フォントが小さすぎて見えないときは、これを小さくしてみる。
font_size = 60  # フォントサイズ
example_text = '光とカゲの街'
# 種々の調整
num_rows = -(-num_fonts // num_columns)
width = width_column * num_columns

# 描画
fig = plt.figure(figsize=(width, num_rows))  # これで 1inch = 座標上の1単位 になるはず。
ax = fig.add_subplot(
    111,
    ylim=[0, num_rows], xlim=[0, width],
    xticks=[width_column * i for i in range(num_columns)],
    yticks=[i + 1 for i in range(num_rows)],
    aspect=1, adjustable='box',  # アスペクト比を1:1に固定。
)
for i, font_name in enumerate(font_names):
    ax.text(
        (i % num_columns) * width_column, i // num_columns,
        f'{font_name}: {example_text}',
        fontdict={'family': font_name, 'fontsize': font_size},
    )
fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
ax.grid(True, which='both', axis='both', color="#aaaaaa", linestyle='--', linewidth=4)

fig.show()
```

# 余談

こういうコードを覚えておくの、面倒ですよね？
そんなときに使えるのが、VSCodeのこの拡張機能！

https://qiita.com/knttnk/items/c61e85c1b0d0337150c5

ぜひ使ってください。
Enterキーが遠すぎるから、ctrl+oに改行を割り当てて作業効率を爆上げする

# はじめに
**Enterキーって遠くないですか？**

Enterキーは主に文章やコードの改行を行い際に利用され、エンジニアにとっては利用頻度がかなり多いキーだと思います。ところが、キーボード上のEnterキーはホームポジションから遠く離れた位置に存在します

![キーボード copy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/e0677a46-8a6c-3a4f-63e6-987a67ab8d7b.jpeg)

そのため、私は以下のような課題を感じていました

- Enterキーを押す際に右手を全体的に右に移動させる必要がある
- Enterキーを押した際にホームポジションに戻すのに（わずかではあるが）時間がかかる
- Enterキーを押した後に小指が戻りきらず若干Enterキー寄りで迷子になることがあり、小指でタイピングする記号をよく押し間違える

なお、MacではEmacsキーバインドを使うことができ、改行に近い処理を行うキーバインドに `ctrl` + `o` が存在しますが、カーソル直後に行を追加（カーソルの場所で改行するが、カーソルは現在行のまま）という謎の仕様のためほぼ使っていませんでした

# 解決策
`ctrl` + `o`に改行（正確には、現在の行の次に行を追加してカーソルも移動）を割り当てました。

Visual Studio Code（以下、VSCode）は以下の操作で割り当てることができます！

1. コマンドパレットから Preferences: Open Kyeboard Shortcuts (JSON) （日本語では、 基本設定: キーボードショートカットを開く (JSON) ）を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/1b407fd9-174e-b765-1019-ed0c448a8c6d.png)

2. 下記内容を追記して保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678160/f9ceeb74-8028-7bc3-1dd9-e9b348b63e95.png)
```json:~/Library/Application Support/Code/User/keybindings.json
[
    // macの場合は既存の割り当てを削除する必要があります
    // windowsやlinuxではこの設定は不要です
    {
		"key": "ctrl+o",
		"command": "-lineBreakInsert",
		"when": "textInputFocus && !editorReadonly"
	},
    // ctrl+oに改行を割り当てます
	{
		"key": "ctrl+o",
		"command": "editor.action.insertLineAfter",
		"when": "editorTextFocus && !editorReadonly"
	},
]
```

# メリット
この設定を使ってみてのメリットは3点ありました

1. **右手の移動が少なくなり超快適**
   これは想定していたメリットですが、右手の移動が少ないのはマジで快適です！感じていた3つの課題も解決することができました
1. **行末以外でも改行できる**
   割り当てた改行は行の途中でも改行できるコマンドなため、`()`や`""`などのペアで入力される記号を閉じる前の位置で改行することができ、行末に移動してEnterを押す手間を省くことができました
   ```python
   print(f"{variable|}")
             　　  　^
        カーソルがこの位置でも改行できる！
   ```
1. **補完を無視して改行できる**
   VSCodeには、IntelliSenseというコード補完の機能があり、変数名や関数名を補完してくれます。基本的にはありがたい機能ですが、たまに不要な補完が表示され、一度消してからEnterで改行することがありましたが、 `ctrl` + `o` で補完を無視して改行することができました

※なお、VSCodeは設定したキーバインドと同様のキーバインドが元々 `Cmd` + `Enter` （windowsでは `Ctrl` + `Enter` ）に割り当てられているので、2,3はそちらでも恩恵を受けることが可能です。

# デメリット
なお、この設定にはデメリットも存在するため、これらを理解した上で利用することを推奨したいです
1. **他のエディタでも使ってしまう**
   本記事の設定はVSCode特有の設定のため、他のエディタでは利用することができません。Google docsや本Qiitaを書く際は引き続きEnterで改行する必要がありますが、ついつい`ctrl` + `o`を押してしまいます
1. **行の途中のその場での改行や日本語入力時は引き続きEnterキーを利用することが必要**
   行末以外において、カーソルの場所で改行するためには、引き続きEnterキーを利用することが必要です。また、日本語入力時の変換の決定にも引き続きEnterキーを利用することが必要です

このように、Enterキーから完全に卒業することはできませんが、作業効率が爆上がりしたのは間違いないので、ぜひ本記事の設定をお試しください
SQLパズル55 競走馬の入賞回数 の 解法3の学習メモ

# 概要
SQLパズル　p230 55 競走馬の入賞回数 の 解法3の学習メモです。

内容は、サブクエリ使っているだけですね。
理解しやすい解法でした。


# 要件
３つのカラムから集計値を求める。

今回の場合だと、3つのカラムwin_name,place_name,show_nameがある。
３つのカラムとも馬の名前が入っており　３つのカラムに対して馬の名前の集計値を取得したい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/df8d5323-3794-733b-5594-a9625ef601f2.png)



# SQL

## DDL
```sql
--  p228 55 競走馬の入賞回数
DROP TABLE IF EXISTS RacingResults;
CREATE TABLE RacingResults
(track_id CHAR(3) NOT NULL,
 race_date DATE NOT NULL,
 race_nbr INTEGER NOT NULL,
 win_name CHAR(30) NOT NULL,
 place_name CHAR(30) NOT NULL,
 show_name CHAR(30) NOT NULL,
    PRIMARY KEY (track_id, race_date, race_nbr));

DROP TABLE IF EXISTS HorseNames;
CREATE TABLE HorseNames
(horse CHAR(30) NOT NULL PRIMARY KEY);

INSERT INTO RacingResults VALUES(1, '2007-05-01', 1, 'A', 'B', 'C');
INSERT INTO RacingResults VALUES(1, '2007-05-01', 2, 'E', 'F', 'P');
INSERT INTO RacingResults VALUES(1, '2007-05-02', 1, 'B', 'C', 'A');
INSERT INTO RacingResults VALUES(2, '2007-05-02', 1, 'O', 'P', 'Q');
INSERT INTO RacingResults VALUES(2, '2007-05-02', 2, 'A', 'P', 'Q');

INSERT INTO HorseNames VALUES('A');
INSERT INTO HorseNames VALUES('B');
INSERT INTO HorseNames VALUES('C');
INSERT INTO HorseNames VALUES('D');
INSERT INTO HorseNames VALUES('E');
INSERT INTO HorseNames VALUES('F');
INSERT INTO HorseNames VALUES('O');
INSERT INTO HorseNames VALUES('P');
INSERT INTO HorseNames VALUES('Q');

```

## 答えのSQL

```sql
-- 55 競走馬の入賞回数　その３　p230
SELECT H1.horse,
        (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.win_name = H1.horse)
      + (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.place_name = H1.horse)
      + (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.show_name = H1.horse)
    FROM HOrseNames AS H1;

-- 途中式　各々の項目を表示するだけ
SELECT H1.horse,
        (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.win_name = H1.horse) as C1,
      (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.place_name = H1.horse) as C2,
       (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.show_name = H1.horse) as C3,
        (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.win_name = H1.horse)
      + (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.place_name = H1.horse)
      + (SELECT COUNT(*) 
           FROM RacingResults AS R1
              WHERE R1.show_name = H1.horse)
    FROM HOrseNames AS H1;

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/ff9d12d8-6516-2420-fcec-b2d23b09d794.png)


# 参考

SQLパズル　p230

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p55

達人に学ぶSQL徹底指南書第２版　該当する場所なし。

github差分
https://github.com/RYA234/SQL_Puzzle_Learning/commit/5e06eb1fcf0548c87e4560d340eddc7556ca136d
初めてDocker化してみたよ！！

# Dockerを使用したRailsアプリケーションの環境構築ガイド

この記事では、Dockerを使用してRailsアプリケーションとPostgreSQLデータベースをコンテナ化し、ローカル環境で簡単にセットアップする方法を詳しく解説します。本ガイドに従うことで、`http://localhost:3000` でRailsアプリケーションにアクセスできるようになります。

## 目次

1. [前提条件](#前提条件)
2. [リポジトリのクローン](#リポジトリのクローン)
3. [Dockerfileの設定](#dockerfileの設定)
4. [docker-compose.ymlの設定](#docker-composeymlの設定)
5. [コンテナのビルドと起動](#コンテナのビルドと起動)
6. [まとめ](#まとめ)

---

## 前提条件

以下のソフトウェアがインストールされていることを確認してください。

- **Git**: ソースコードをクローンするために必要です。
- **Docker**: コンテナを管理・実行するために必要です。
- **Docker Compose**: 複数のコンテナを一括で管理・起動するために必要です。
---
## リポジトリのクローン
まず、プロジェクトのリポジトリをローカルにクローンします。
git clone https://github.com/your-username/rails-docker.git

クローンが完了したら、プロジェクトディレクトリに移動します。
cd rails-docker

## Dockerfileの設定
プロジェクトのルートディレクトリにある Dockerfile を設定します。以下はその内容です。

```Dockerfile
# ベースイメージとして公式のRubyイメージを使用
FROM ruby:3.2.2

# 必要なパッケージをインストール
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

# 作業ディレクトリを設定
WORKDIR /myapp

# GemfileとGemfile.lockをコピー
COPY Gemfile Gemfile.lock ./

# Bundlerをインストール
RUN gem install bundler -v 2.4.10
RUN bundle install

# アプリケーションのソースコードをコピー
COPY . .

# 追加の設定（必要に応じて）
ENV RAILS_ENV=development
ENV RAILS_LOG_TO_STDOUT=true

# ポートを公開
EXPOSE 3000

# サーバーを起動
CMD ["bin/rails", "server", "-b", "0.0.0.0"]
```
### Point
・Rubyの公式イメージ ruby:3.2.2 を使用。
・Node.jsとPostgreSQLクライアントをインストール。
・Gemfile と Gemfile.lock を先にコピーし、依存関係をインストール。その後、アプリケーションのソースコードをコピー。
・環境変数 RAILS_ENV と RAILS_LOG_TO_STDOUT を設定。
・ポート 3000 を公開し、Railsサーバーを起動。

## docker-compose.ymlの設定
次に、docker-compose.yml ファイルを設定します。これにより、Webとデータベースのサービスを定義します。
```
version: "3.8"
services:
  db:
    image: postgres:12
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: myapp
      POSTGRES_PASSWORD: password
      POSTGRES_DB: myapp_development
    ports:
      - "5432:5432"

  # 今回はDB CREATEとMIGRATEを実装しているが本来は初回のみCREATEをするべきだ

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bin/rails db:migrate && bin/rails server -b 0.0.0.0 -p 3000"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      DATABASE_URL: postgres://myapp:password@db:5432/myapp_development?sslmode=disable
      RAILS_ENV: development
      RAILS_LOG_TO_STDOUT: "true"

volumes:
  db_data:
```
## コンテナのビルドおよび起動
設定が完了したら、Dockerコンテナをビルドし、起動します。
docker-compose up
その後ブラウザでhttp://localhost:3000 にアクセスします。

## まとめ
Dockerを使用することで、Ruby on RailsアプリケーションとPostgreSQLデータベースの開発環境を効率的に構築できます。本記事では、Dockerfile と docker-compose.yml を設定し、データベースの設定やコンテナのビルド・起動方法を解説しました。
浮動小数点の89.51を文字列に変換して遊ぶ。


参考

https://www.nminoru.jp/~nminoru/diary/2006/01.html


https://qiita.com/caa45040/items/47dabed83140c81ccdb9


https://note.cman.jp/convert/bit/


x 過去ログを見よ!!
x M5NanoC6での予定は、未定
x 浮動小数点の変換誤差あり

目的
加速度センサーのデータを変換する
軽量、高速化、見やすさ重視


オンラインコンパイラ

```c++

#include <iostream>
using namespace std;


void ch_conv(char *buf,float f){
    
    int n; //変換元
    int a; //一時変数
    
    n = (int)(f * 100);

    // 0123456
    // -12.34_

    buf[0]=' ';
    buf[3]='.';
    buf[6]=0;

    //符号を外す
    if(n < 0) {n = 0 - n;buf[0]='-';}

    a = (n * 52429) >> 19; // n / 10;
    buf[5] = '0' + n - (a * 10);
    n = a;

    a = (n * 52429) >> 19; // n / 10;
    buf[4] = '0' + n - (a * 10);
    n = a;

    a = (n * 52429) >> 19; // n / 10;
    buf[2] = '0' + n - (a * 10);
    n = a;

    a = (n * 52429) >> 19; // n / 10;
    buf[1] = '0' + n - (a * 10);
    //n = a;

}//ch_conv


int main(void){
    // Your code here!

    char str1[32];

    ch_conv(str1,89.51);
    
    printf("%s\n",str1);
    
}



```


```

 89.51

```
新規のC言語処理系を実装することによる組込みシステム研究にもたらす価値についての考察

現在，主流となっているGCCやClangとは異なるC言語処理系を，現代においてわざわざ新たに実装することが，今後の組込みシステム研究にもたらす価値は，少なくとも次のような研究の基礎を提供することであると考察した．

1. 組込みシステム向けのメモリ一貫性モデルと過剰なコード最適化の抑制 
2. 形式手法をCコードに適用する研究 
3. コード最適化の等価性保証の研究 
4. サイドチャネル攻撃耐性を備えたコード生成器の研究

今後，このような研究のインフラストラクチャとなることを意図したC言語処理系を独自に開発することを検討する．

## Abstract

The value brought to the research of embedded systems by implementing a brand new processing system for the C programming language instead of GCC and Clang, the current mainstream systems, 
is to provide the following research basis: 

1. a memory consistency model for embedded systems and suppression of excessive optimization; 
2. the research that formal methods apply C code; 
3. the research to ensure equivalency of code optimization; and 
4. the research of code generator that has immunity to side-channel channel attacks. 

In the future, we will consider developing such a system as the infrastructure for the research.

## キーワード

組込みシステム，プログラミング言語処理系，メモリ一貫性モデル，コード最適化，形式手法，サイドチャネル攻撃

## Keywords

Embedded systems, Programming language prosessor, Memory consistency model, Code optimization, Formal method, Side-channel attack.

## URL

https://researchmap.jp/zacky1972/misc/48296213

## スライド

<script defer class="speakerdeck-embed" data-id="1f7a4cd548da4edcacfde77b4c2ec056" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>
POJO(Plain Old JavaScript Object)の特徴

POJO (Plain Old JavaScript Object) は、JavaScriptにおけるシンプルなオブジェクトのことを指します。Javaや他の言語で使われるPOJOという用語から派生しており、特にフレームワークや特別な機能を持たない「純粋な」オブジェクトを指します。以下はその特徴です：

---

### 1. **シンプルなオブジェクトリテラルで記述される**

POJOは、JavaScriptのオブジェクトリテラル構文 `{}` を用いて作られます。特定のプロトタイプやクラスに依存せず、標準的なJavaScriptのオブジェクトとして扱われます。

```
const person = { name: "Alice", age: 30 };
```

---

### 2. **特別な機能やメソッドを持たない**

POJOは、追加の機能やメソッドを持たない単純なデータ構造です。通常はキーと値のペア（プロパティ）だけで構成されます。

---

### 3. **プロトタイプチェーンに依存しない**

POJOは、特定のカスタムプロトタイプ（例えば、クラスベースのオブジェクト）に依存しません。JavaScriptの標準的な `Object.prototype` を継承しています。

```
const obj = {}; // これはPOJO console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
```

### 4. **シリアライズしやすい**

POJOはJSON形式で簡単にシリアライズ（文字列化）できます。これにより、データを保存したり、APIを通じて送受信するのに適しています。

```javascript
const data = {
  id: 1,
  title: "Example"
};
const json = JSON.stringify(data);
console.log(json); // '{"id":1,"title":"Example"}'
```

---

### 5. **クラスや特殊な構文を使用しない**

クラスや関数コンストラクター、getter/setter、`Symbol` などの特殊な構文を使用しません。純粋にデータを保持する目的で使われます。

---

### 6. **動的に拡張可能**

POJOは動的にプロパティを追加したり変更したりできます。

```
const user = { name: "John" };
user.age = 25; // プロパティを追加
user.name = "Jane"; // プロパティを変更
console.log(user);
// { name: "Jane", age: 25 }
```

---

### 注意点

- **POJOではないオブジェクトの例**
  - クラスやコンストラクター関数を使って生成されたオブジェクト。
  - 特定のフレームワークで拡張されたオブジェクト（例えば、`Vue` のリアクティブオブジェクト）。
  - 特殊なビルトインオブジェクト（`Date` や `Map` など）。

---

POJOの利点は、そのシンプルさと柔軟性です。特定のライブラリやフレームワークに依存しないため、直感的に使いやすく、データの保存や操作が簡単です。
NGINXプロセスが落ちたときの自動再起動設定

NGINXプロセスが意図せず終了した場合、自動で再起動するには、**systemd**を活用するのが一般的です。以下に、その手順を説明します。

---

### 1. systemdサービスファイルの確認

通常、NGINXはsystemdによって管理されています。サービスファイルの場所は以下の通りです：

```
/etc/systemd/system/nginx.service
```

または

```
/lib/systemd/system/nginx.service
```

---

### 2. サービスファイルの編集

サービスファイルに自動再起動の設定を追加します。

#### 手順：

1. サービスファイルを開きます（ファイルの場所に応じて適切に変更）。
   ```
   sudo nano /lib/systemd/system/nginx.service
   ```
   ‌
2. `[Service]`セクションに以下を追加または編集します：
   ```
   [Service] Restart=always RestartSec=5s
   ```
   ‌
   - `Restart=always`: プロセスが停止した場合、常に再起動します。
   - `RestartSec=5s`: 再起動までの待機時間を5秒に設定します（必要に応じて調整可能）。

---

### 3. 設定のリロードと適用

設定を変更したら、systemdの設定をリロードして、NGINXサービスを再起動します。

#### コマンド：

```
sudo systemctl daemon-reload
sudo systemctl restart nginx
```

---

### 4. NGINXの自動起動設定の確認

NGINXがサーバー起動時に有効になるよう、サービスが有効になっているか確認します。

#### コマンド：

```
sudo systemctl enable nginx
```

---

### 5. 設定の確認

再起動設定が正しく反映されているか確認します。

#### コマンド：

```
systemctl show nginx | grep Restart
```

期待される出力：

```
Restart=always RestartSec=5s
```

---

### 6. 動作確認

NGINXプロセスを意図的に終了させて、再起動されるか確認します。

#### コマンド：

```
sudo pkill nginx
```

数秒後、再起動されたことを確認できます：

```
systemctl status nginx
```

---

### 補足

- `Restart`オプションには他にも以下の設定があります：
  - `no`: 再起動しない（デフォルト設定）。
  - `on-failure`: エラー終了時のみ再起動。
  - `always`: 常に再起動。
- NGINXの設定ファイル（`nginx.conf`）に問題がある場合、再起動が失敗する可能性があるため、事前に設定ファイルのテストを行うことが推奨されます。
  ```
  sudo nginx -t
  ```

この方法で、NGINXプロセスが意図せず終了した場合でも自動で再起動するように設定できます。
Detection of emotion by text analysis using machine learning　初AI論文メモ

## はじめに
この記事では
[Detection of emotion by text analysis using machine learning](https://www.frontiersin.org/journals/psychology/articles/10.3389/fpsyg.2023.1190326/full)
という感情分析に関する論文を自分なりにメモしてます。解説じゃなくてメモです！
勉強記録！！

JPHACKS2024で制作しようとしていた感情分析LINE botの参考にと思って読みました。

今回は本当にざっくりとしたメモの記録で、次回以降、実装してみます。


## 導入
### 1. 感情とは
感情分析および検出を行うにあたって、感情についての定義する必要
・「経験的、行動的、生理学的要素を含む複雑な反応パターン」と定義されることが多い。
・幸福、悲しみ、嫌悪、恐怖、驚き、怒りの６つと定義　by ポールエックマン

### 2. 感情検出のアプローチ
感情分析の分野では
（１）少数の基本的な感情が定義される基本モデル（カテゴリカルプローチ）
（２）次元感情モデル（次元アプローチ）
（３）評価の構成要素モデル
のようなアプローチがある

### 3. 今回の論文のアプローチ
1. 感情の定義は6つの感情
・喜び　joy
・悲しみ　sadness
・怒り　anger
・恐怖　fear
・愛　love
・驚き　surprise
2. 感情検出
カテゴリカルアプローチを採用した

## データの前処理
・データはsnsの会話内容からの感情を含むKaggleのテキストデータを使用
・データはトレーニングセット、テストセット、検証セットの3つに分割
・データセットの比率は全データが20,000件の投稿に対して、16,000/2000/2000

前処理はTensorFlow Keras の Tokenizer API を使用
パラメータ
・num_words (最も頻出する単語の最大数)
・filter (句読点のフィルタリング)
・lower (すべてのテキストを小文字に変換する)
・word_index (単語のインデックス作成)

・トークン化の他に全ての文を同じ長さにするためPaddingで前処理
Pad_sequensesには、「0」を代入して文を拡大するPaddingと最長文の長さを表すmaxlenの二つを引数に使用

・ディープラーニングでは単語をベクトル化

## 感情認識のアプローチ
### 語彙ベースによるアプローチ
感情クラスへの所属の数値度が注釈されてある単語の辞書を用意し、テキスト内に辞書内の単語がどれくらいあるかに基づいて分析する。

※今回は機械学習、ニューラルネットワークの学習を優先したいので、詳細は割愛します。

### 機械学習・ディープラーニングによるアプローチ
機械学習・ディープラーニングアプローチ
・SVM（サポートベクターマシン）
・NB（ナイーブベイズ）
・CNN
・RNN（LSTM）
・CNN + LSTM
を利用した

## 結果
・NBの方がSVMよりもパフォーマンスがよかった
・論文（Ghourabi et al. 2020）によれば、CNN + LSTMのパフォーマンスが一番高く、これは今回の研究とも一致した

以下の表はNB、SVM、CNN (Conv1D) + RNN (LSTM)を使用した感情の自動検出の精度測定値
|            | Naive Bayse |   SVM    | Conve1D + LSTM |
|:-----------|:-----------:|:--------:|:--------------:|
| Sadness    | 0.50        | 0.67     | 0.96           |
| Joy        | 0.83        | 0.67     | 0.93           |
| Anger      | 0.80        | 0.33     | 0.91           |
| Fear       | 0.33        | 0.10     | 0.88           |
| Love       | 0.40        | 0.52     | 0.81           |
| Surprise   | 0.50        | 0.50     | 0.74           |


## 次回・感想
実装編

正直、論文の読解記録としてはイマイチだと思うので#論文読みで他の論文解説記事も読み込んでいきたいです。
あと単純にLLM初心者すぎたので理解していない部分が多い

## 参考

https://www.frontiersin.org/journals/psychology/articles/10.3389/fpsyg.2023.1190326/full

https://www.mdpi.com/1999-5903/12/9/156
悔しかった話　もしくは記録して公開する意義について（ポエム）

# プロフィール
　某国立工業大学卒
 　元電子回路設計者
  　コンピュータアーキテクチャは、Z80をベースに理解
  （マルチパイプラインやSIMDなど追加されて今に至る？）
  　ソフトウェアは強くない
  　C言語はポインタ（*と＆）に悩まされて挫折
  　（一応、間接アドレッシングの概念は理解）
  　ＬＬＭは普通にChatGPTやCopilotを使う程度
資格など
　 5年前にIパス、基本情報、応用情報取得
　 （昔、第１種情報処理と初級シスアド持ってた）
　 危険物乙４、危険物乙６、電気工事士２種

# とあるオンライン講座に申しもうとしたときの話
「完全無料・完全ボーダレスなエンジニア教育プログラム」と聞いて応募した。
「応募多数の際は抽選」って言いながら、いろいろなことを聞かれた。

:::note info
これまでの仕事、授業、ハッカソン、プライベート等で経験したことがあるものを教えてください
企画
プロジェクトリーダー
実装
デザイン
映像制作
経験なし
その他:
:::

え？そんな経験ないんですけど？
仕事でVBAマクロ組んだり、
Pythonで簡単な自動化したり、
既存のコードの修正して遊んだ程度ですよ？
そもそも、そんな経験があれば自力で何でもできる人じゃん

:::note info
プログラミングの経験についてあてはまるものを選択してください。
プログラミング未経験
オンライン学習サービスやチュートリアル（ProgateやUdemy等）で独学した
大学・専門学校の授業やプログラミングスクールで学んだ
職場での実務経験がある（1年未満）
職場での実務経験がある（1年以上～3年未満）
職場での実務経験がある（3年以上）
その他:
:::
職業プログラマじゃないんで実務経験あり、とは言えない。
Udemyは完走できてないし。
派遣会社で組込み系の研修は受けたかな？
趣味の範囲で既存のコードを修正してコピペ連結ででっちあげるくらいしてる。

:::note info
あなたが保有している技術スキル、または活用しているツールを以下の中から選択してください。（複数回答可能）
なし
typescript/javascript/html/css
node.js/nginx等のWebサーバ実装
react/next.js等のWebアプリ開発フレームワーク
AWS/Azure/GCP等のクラウド環境の構築・運用
Git/SVN等のバージョン管理ツール
UnrealEngine
UnityやGodot等のUnrela Engine以外のゲームエンジン
生成AI：LLM、画像生成AI等のAPI利用、ローカル環境構築
その他:
:::

Htmlは昔サイトを作ったから知ってる。CSSは概念レベル。JavaScriptはコピペで少々。
生成AIは、非力なマシンでローカルLLMを試して絶望した。
（常時待機させたいから電気喰うマシンでは動かしたくない）

:::note info
共有可能な成果物（ウェブサイト、アプリケーションなど）またはポートフォリオをお持ちの方は、該当する成果物・ポートフォリオ・GitHub等のURL、または取り組みの内容を教えてください。
:::
何もない。
興味の赴くまま、
ジャンクPCにUbuntu環境を作ってみたり、
GitHubから引っ張ったコードを修正して遊んだり、
ArduinoでLチカしてみたり、
日曜大工的に自分の不便を解消するためのコードは書いてるけれど
対外的に公開できるプロジェクトは何もない。


# そして絶望した
自分の過去絶望した。表現力に絶望した。
何もアウトプットすることなく生きてきたことを後悔した。
いつかそのうち何かする……って思考を悔いた。

# 結論
興味をもったもの、手を付けたものは記録し公開する！
（来年があると信じて今からガンバル）