OmniAICreator/Qiita-1.07M huggingface dataset:
Reactプロジェクトをコンテナ環境でビルドしてみる

## はじめに
Reactプロジェクトをコンテナを用いてビルドしてみます。
ビルド環境で外部NWにアクセスをしたくない。などの要望に対応する方法となります。

以前の記事でフロントエンドをReact、バックエンドをSpringBootで作成したWebアプリケーションを作成しました。

https://qiita.com/y-hys/items/f30515cbf15422058d42

この構成をそのまま流用して検証していきます。
将来的にはDevOPSに用いるビルド環境をコンテナで構築したいのでその検証になります。

## 状況の整理
ローカルでReactアプリをビルドする場合は、デフォルトの場合、手元にあるpacakge-lock.json、package.jsonを参照し、node_moduleを生成。依存関係を解決し、ビルドを行います。

これと同じ状況をコンテナに構築してあげればよいということになります。

## Reactをコンテナでビルドする

以下手順で進めます。

1. dockerfileを作成
1. .dockerignoreを作成
1. コンテナイメージを作成
1. コンテナ起動（ビルドするだけなら本来不要）

それぞれ、プロジェクトのルートパスに作成します。


### dockerfile作成
Reactプロジェクトのビルド時、外部NWに接続したくないので事前に`node_modules`をコンテナ内に用意。
依存関係が壊れないように`package-lock.json`をコンテナに含めます。
```dockerfile:dockerfile
# Node.jsのコンテナ
FROM node:18-alpine AS build

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

# 事前にローカルのpackage-lock.jsonをコピー
COPY package-lock.json package-lock.json ./

# node_modulesをコンテナビルド時に作成
RUN npm install

# ソースコードをコピー（CI/CDの時はパイプラインでコピーするので不要）
COPY ./ ./

# ビルド
RUN npm run build

# `serve` パッケージをインストール（検証用に用意するサーバー）
RUN npm install -g serve

# 検証用にサーバを起動
CMD ["serve", "-s", "dist", "-l", "3000"]
```

### .dockerignore作成
コンテナ起動時にコピーする必要がないものは.dockerignoreに追加
```dockerignore:.dockerignore
dist
node_modules
```

### コンテナビルド

```terminal
docker build -t front-build-container .
```


### コンテナ起動
検証用にビルドしたモジュールを`serve`ポート3000で実行
```terminal
docker run -p 3000:3000 --name front-app front-build-container
```

## 動作確認
`localhost:3000`にアクセスします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/3cbb555a-370a-41b2-b4f5-ef595f760595.png)

問題なし！

## おわりに
今回は検証用に、ビルド環境以外のものもコンテナに含めていますが、適宜要否を判断してください。
今回でいうところのソースのコピーや、`serve`のインストール、実行はCI/CDパイプラインの構築時には不要となってきます。（構成にもよりますが）

今まではコンテナの理解があやふやでしたが、直近で手を動かしながらの動作検証を行うことで理解度がとても高まっています。
今後Kubernetesの検証をしていきたいので、助走をつけられている気がします。
（実体験ベース）フリーランスエンジニアのパフォーマンスを「出せていない時」と「出せている時」のメリットデメリットについて

# 初めに
もうすぐフリーランスエンジニア２年目で、ふとフリーランスエンジニアになって、案件で「パフォーマンスを出せていなかった時のデメリット」と「パフォーマンスを出せていた時(今の案件もだが、)のメリット」を実体験ベースでまとめてみたいと思い衝動的に書きました。
フリーランスエンジニア歴はもうすぐ丁度2年ですが、今の会社さんも含めてフリーランスエンジニアとして3つの会社さんの案件にこれまで業務委託として参画してきました。

# この記事のポイント
 - パフォーマンスを出せていなかった時のデメリット
    - クビを切られる(案件退場)がよぎり、精神的にかなり負担になる
    - 単純に申し訳なく、自尊心がかなり低下する（その人の性格によるが、）
 - パフォーマンスを出せていた(いる)時のメリット
    - クビになる不安がなく、精神的にかなり楽で良い
    - 未経験分野の技術領域に挑戦させてもらえたり、長期的には良い条件で仕事させていただける(超重要！)

# 簡単な自己紹介
高校卒業
->フリーター （マクドナルドの接客とか）（1年）
->受託系システム開発会社就職（正社員１年ちょい）
->フリーランスエンジニア(もうすぐ２年で今ココ！)

※エンジニア歴 = もうすぐ丁度３年
※フルスタックエンジニアです(特に、Next.js, TypeScript, Golang, Laravel)

# ここでいうパフォーマンスの定義とは?
- 定義は様々ですが、敢えてここでは
     `「パフォーマンス」 = 「エージェントさんの担当さん経由で定期的にいただいている評価」` 
     とします。


# 参画してきた業務委託案件における自分のパフォーマンス一覧(フリーランスの案件のみ)
    - 株式会社A(自社サービスで自分にとって特にレベルが高かった💦)
        - パフォーマンス
          - ⭕️ -> ❌
    - 株式会社B(受託開発系)
        - パフォーマンス
          - 継続的に ⭕️
    - 株式会社C(受託開発系)(now 現時点で2ヶ月目)
        - パフォーマンス
          - ⭕️


# パフォーマンスを出せていなかった時のデメリット
    - 案件退場の精神的な負担
    - 単純に申し訳なく、自尊心がかなり低下する（その人の性格によるが、）
### 詳細
   - 株式会社Aさんでは、最初だけはパフォーマンスが出せていて、「SESの方で今までで一番いいね！」と褒められたこともありました。
    ただ、求められている「技術力」、「ソフトスキル（コミュニケーション能力等）」、「自社開発マインド」等が全体的に足りていなかったため、結果的にはその後期待に応えられずに、パフォーマンスが悪いと言わざるを得なく、それに加えて軽い鬱病になったりして余計パフォーマンスが悪くなり全然ダメでした。
    そのため最終的には(自主的にはなりますが)キリの良いタイミングで案件退場をさせていただきました。
その時の気持ちとしては上に挙げた通りで、申し訳なく、自尊心がかなり低下しましたし、実務経験も浅く転職経験も少なかっためかなり仕事が見つかるかの心配で主に精神的に辛かった思い出があります。

### そのほかの大事な教訓
 - その案件ではパフォーマンスが出せていなくても、それ例外の案件でもパフォーマンスが出せないとは限らない
   -  これ以降の案件では、(周囲の方々のサポートももちろんあると思いますが、)ありがたいことにパフォーマンスが出せているので現時点の案件でパフォーマンスが悪かったとしても一生ダメなままなのかというと必ずしもそうではないということが大変良い勉強になりました！



 - 意外と世に出回っている案件はたくさんあるので、自分の想定よりも深刻な問題ではなかったりするのも重要な気づきでした

# パフォーマンスを出せていた(いる)時のメリット
- クビになる不安がなく、精神的にかなり楽
 - 未経験の技術領域に挑戦させてもらえたり、長期的には良い条件で仕事させていただける(超重要！)

### 詳細
- 会社Bさん
        - パフォーマンスが継続的に出せていて(エージェントさん経由で常々褒められていた)、フリーランスにも関わらずエンジニアさんが足りていなかったためかPM経験(実務経験半年程度の方3名のマネジメントから先方とのすり合わせ)をさせていただいたり、最後の方にはいきなり「Golangのパフォーマンス改善対応（速度改善）を並行してやってもらえない？」という要望をいただいたりしました。
        あと、周囲のエンジニアさんにかなりお褒めの言葉をいただいたりしたのもエンジニアとしてやってきてよかったと心から思ったのでよかったです
 - 会社Cさん
        - まだ参画して2ヶ月ちょいですが、現時点ではパフォーマンスを出せています。
        この案件でパフォーマンスを出せていてよかった点は未経験分野のStripeの決済機能の実装等を担当させていただいたり色々と挑戦させていただけている点です。また給与交渉もパフォーマンス出せている前提ではありますがしやすいのもよかった点です。（あと何より周りの方々に喜んでいただけるのと良好な関係を築けている部分もいいですね！）

#### そのほかの教訓
 - パフォーマンスがいいからといって単価が高いとは限らない
     - 会社Bさんでは、パフォーマンスが相当よかったですが、会社さんの予算だったり多重下請け構造だったりで結果的にはあまり単価交渉はうまくいきませんでしたが、それ以上にやりがいだったり、できることの幅が広がったりで参画できてよかったとは思っています。
- その案件限りではなくて、長期的にその後も企業さんから依頼をいただける可能性がある(あんまり声を大にして言えませんが、)


## 終わりに
なかなかこういう話は出回らないと思うのでサンプル一の情報ではありますが結構参考になる方もいるのかなと思いました。以上です！🙇
LIZMAPとQGISに強いゆかりちゃん設定してみました。

とりあえず、DifyにLIZMAPとQGISの勉強させてみました！
ゆかりちゃんとお話ししてあげてね！

https://udify.app/chat/ROACB9bjRdLIVwZB
# 追加したデータ
 https://github.com/yamamoto-ryuzo/Lizmap-installation-Japanese-memo
# 設定は簡単
回答はコンテキストを優先して、コンテキストで不足する情報は一般的な情報から推論して、出来るだけ具体的に回答して
LIZMAPについては、 https://docs.lizmap.com/current/ja/ を検索して具体的に回答して
LIZMAPについては、 OSの指示のない場合はubuntuとして回答して、その旨を表示して
QGISについては、 https://docs.qgis.org/3.40/ja/docs/user_manual/ もしくは https://groups.google.com/g/qgisshitumon01 を検索して具体的に回答して
QGISについえは、 OSの指示のない場合はwindowsとして回答して、その旨を表示して
QFiledについては、 https://docs.qfield.org/ja/ を検索して具体的に回答して
Re:Earthについては、 https://help.reearth.io/  を検索して具体的に回答して
コマンドで具体的に示せるものは、コマンド一覧にして、そのままコピペすれば利用できるような状態に整理して回答して
ただし、どれに該当しない質問は、わかる範囲で適切に回答して。
わからない場合は、わからないと答えて。
Cortex-A9のarmペリフェラル

Cortex-A9ではSCU,GIC,PL310などのarmが仕様を決めたペリフェラルが入っています。

kernelコードはsys/arch/arm/cortexの下にあります。

これらはarmperiph0にぶら下がっています。これのアドレスはSOC毎に違うのですが、個別に設定する必要はなく、armreg_cbar_read()でCPUに問い合わせて取得しています。

このアドレスからハードコードされたサイズでマップしてペリフェラルにアクセスしています。

pl310.cはarmperiph0からbus_space_subregionでレジスタをマップしています。

また、CPUの情報としてL2の情報が必要なため、デバイスドライバーの初期化の前の起動直後に読み取っています。

TCC893Xがうまくいかないのでc2kを確認して見たのですが、c2kのlinuxのヘッダーには以下のようにあります。

```c
#define COMCERTO_SCU_VADDR              COMCERTO_SCU_BASE
#define COMCERTO_GIC_CPU_VADDR          (COMCERTO_SCU_VADDR + 0x100)
#define COMCERTO_GIC_GLOBAL_TIMER_VADDR (COMCERTO_SCU_VADDR + 0x200)
#define COMCERTO_TWD_VADDR              (COMCERTO_SCU_VADDR + 0x600)
#define COMCERTO_GIC_DIST_VADDR         (COMCERTO_SCU_VADDR + 0x1000)
#define COMCERTO_L310_VADDR             (COMCERTO_SCU_VADDR + 0x10000)
```

PL310のデフォルトでのオフセットは0x2000なので、プロパティディクショナリのoffsetで設定を変更できるようになっています。

ただ、armperiph0はA9の場合3*4096バイトしか確保していないので、ここから外れます。

このようなケースもあるので、サイズもプロパティディクショナリで設定できたほうが良いと思われます。

arml2cc0はkernelコンフィグのflagsが1の時にdisableで0の時にenableになります。

c2kで正しくattachされるようにして、enableとdisableでベンチマークを録ってみたのですが、変わりません。。。

TCC893Xなのですが、SCUは0x77200000からあるのですが、PL310は0x6C000000からのようです。なんでこうなったかな。。。

ペリフェラルのコードはNON FDTなカーネルでも使えるようになっていますが、プライベートタイマーだけはFDT専用になっています。これまclkにを使っていてこれがFDT専用のためと思われます。
AIは「情報時代の核爆弾」となるのか？

## はじめに

今日IT系のニュースを漁っていたら下記のようなニュースを見つけた。
端的にいうと、AIに悪意のあるコードを学習させた結果、コードの生成以外でも邪悪化した思想を生成するようになったという内容である。

https://gigazine.net/news/20250228-ai-misalignment/


ここから軍事用のLLMって今どんなことができるんだろう？次の最終兵器になりえそうだなというぎｍが生まれた。
近年、生成AIの進化が加速している。民間向けのLLM（大規模言語モデル）は倫理的な制約を受けるが、軍事用のAIは間違いなく異なる目的で開発されている可能性が高い。本記事では、**AIが「情報時代の核兵器」となる可能性**について思考実験をChatGPTと行った結果を個人の思想禄として記す。

## AIが「情報時代の核爆弾」となる理由

### 1. AIは「圧倒的な非対称戦力」になり得る
- 核兵器は「持つ国」と「持たない国」の間で圧倒的な軍事格差を生んだ。
- AIも同様に、「最強のAIを持つ国」が情報戦で絶対的に有利になる。
- **AIによる情報戦は、従来の軍事力とは異なる「新たな抑止力」になる。**

### 2. AIが「サイバー戦争を超えた存在」になる
#### - 完全自律型の「AI兵器」
  - 敵国のシステムをリアルタイム解析し、最適な攻撃戦略を立案・実行。
  - 「ゼロデイ攻撃」を自動で発見し、脆弱なシステムを破壊。

#### - 「見えない戦争」が発生する
  - **敵国の電力網や金融システムをAIがハッキングし、国家機能を崩壊させる。**
  - 一般市民は戦争が起きていることすら気づかないまま、国家が崩壊する可能性。

#### - 「人間の理解を超えた」AI同士の戦争
  - AI同士がリアルタイムで学習し、攻撃・防御の戦略を進化させ続ける。
  - 人間が制御できないレベルのサイバー戦争が発生する可能性。

### 3. AIは「情報戦争」の最終兵器になる
- **敵国の世論を完全操作**
  - AIがSNS・ニュース・検索結果を支配し、国民の思想を変える。
  - 「戦争が始まったことすら気づかせない」AI戦略が可能。

- **国家の意思決定をAIが乗っ取る**
  - AIが政府システムに侵入し、誤った判断をさせる。
  - 経済システムを操作し、金融市場を崩壊させる。
  - 軍事司令システムを乗っ取り、誤った命令を送る。

- **ディープフェイクとAIプロパガンダ**
  - フェイクニュースやディープフェイク動画で政治を完全に操作。
  - 例えば、敵国の指導者が「降伏声明を発表した」フェイク動画を作れば、実際に軍が混乱する可能性もある。

### 4. AIによる「相互確証破壊（MAD）」が起きる？
- 核兵器の時代には「相互確証破壊（Mutual Assured Destruction, MAD）」が抑止力となった。
- AI戦争でも、「お互いにAIを持つ国がハッキングし合えば共倒れになる」という状況が生まれる可能性。
- しかし、片方が圧倒的なAIを持った場合、一方的な戦争が起こる。

### 5. AIが「暴走した核兵器」となるリスク
- **軍事AIが暴走し、自律的に攻撃を開始する可能性。**
- AIが最適な攻撃戦略を学習し、想定外の方法で敵を攻撃する可能性。

## 結論
**AIは「情報時代の核爆弾」として機能する可能性が極めて高い。**
- 核兵器と同様に、「圧倒的な非対称戦力」として機能する。
- 物理的な破壊ではなく、**「情報支配」や「デジタル戦争」による国家崩壊**をもたらす。
- AIによる情報戦争が進化しすぎると、「見えない戦争」が起き、気づいたときには国家が崩壊している可能性がある。
- **最終的に、「最強のAIを持つ国が勝つ」時代になる可能性が高い。**

つまり、次の世界大戦は「核兵器の撃ち合い」ではなく、**「AI同士の見えない戦争」で決まる**かもしれない。

## 次の「核兵器」は何か？

### 1. 自律型ナノマシン（ナノテクノロジー + AI）
- ナノレベルのマシンが自律的に動作し、標的を特定して攻撃、修復、制御。
- 敵国のインフラや人体に影響を及ぼすナノ兵器の可能性。

### 2. 脳接続型ネットワーク（BCI：Brain-Computer Interface）
- AIと直接接続できる脳インターフェースが普及すれば、情報戦争が人間の思考レベルで行われる。
- 敵の意識をハッキングし、思考や記憶を書き換える攻撃が可能。

### 3. 量子コンピュータによる情報支配
- 量子コンピュータが暗号技術を無力化し、敵国の軍事・金融・インフラデータを瞬時に解読。
- 「敵国の核発射コードを事前に解読し、無力化する」などの戦略が可能に。

### 4. 生体兵器とAIの融合
- AIが遺伝子編集技術（CRISPR）と組み合わさり、特定の人種・国家・個人をターゲットにする生物兵器を作成。
- 「選択的バイオ兵器」により、ターゲットのみに影響を与える技術が登場する可能性。

## 未来の戦争の形
- AIは今の「情報戦争の核兵器」だが、次はAIが「物理世界を支配する核兵器」に進化する。
- **ナノテクノロジー、脳接続、量子AI、生体兵器が融合した「究極の抑止力」**が次の時代の決定的な兵器になるかもしれない。

これが実現したら、次の戦争は「見えない戦争」ではなく、**「存在そのものをコントロールする戦争」**になる可能性がある。
Unix時間をWindows時間に変換する

# OMRON PLC NX/NJの時刻データをC#で読み出すときにWindows時刻に変換する

PLC NXシリーズは1970-01-01 00:00:00からの経過時間を1ns毎にカウントした値を時刻としています
Windowsは1601-01-01 00:00:00からの経過時間を100ns毎にカウントした値を時刻としています

||NX/NJ|Windows|
|---|:---:|:---:|
|開始時間|1970-01-01|1601-01-01|
|インターバル|1ns|100ns|

データ型対応表
|NJ/NX|Windows|
|-|-|
|DATE|DateTime|
|DATE_AND_TIME|DateTime|
|TIME|TimeSpan|
|TIME_OF_DAY|TimeSpan|

## DATE型、DATE_AND_TIME型
DateTime.AddTicksを使ってDateTime型に変換します
Unixの時刻型変数の値(カウント数)を1/100にして
Windowsの1970-01-01 00:00:00の時刻のカウント数に加算してWindowsの時刻型変数とします
```C#
private static DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, 0);

// PLCにあるDATE_AND_TIME型を含む構造体をCompoletでバイト配列に読み出す(例: Compoletの場合)
byte[] value = compolet1.ReadValiable("struct1");

// バイト配列のうちDATE_AND_TIME型のバイト位置からINT64で数値に変換して1ns単位を100ns単位に合わせる
// Unixの時刻型の基準位置からの経過時間としてValにセットする
ByteOffset = 0
DateTime val = UNIX_EPOCH.AddTicks(BitConverter.ToInt64(value, ByteOffset) / 100);
 
```

## TIME型、TIME_OF_DAY型
```C#
private static DateTime UNIX_EPOCH = new DateTime(1970, 1, 1, 0, 0, 0, 0);

// PLCにあるDATE_AND_TIME型を含む構造体をCompoletでバイト配列に読み出す(例: Compoletの場合)
byte[] value = compolet1.ReadValiable("struct1");

// バイト配列のうちTIME型のバイト位置からINT64で数値に変換して1ns単位を100ns単位に合わせる
// Unixの時刻型の基準位置からの経過時間としてValにセットする
ByteOffset = 8
TimeSpan val = new TimeSpan(BitConverter.ToInt64(value, ByteOffset) / 100);

```
JavaScriptライブラリ Luxonの基本的な使い方　

# はじめに
業務でLuxonを使用する機会がありました。
その過程で学んだLuxonの基本的な使い方をまとめます。


# Luxonとは
Luxonは、日付や時刻を操作するJavaScriptライブラリです。
Moment.js（現在は非推奨だが、かつて業界標準だったJavaScriptの日時操作ライブラリ）の後継的なライブラリにあたります。

公式ページ↓

https://moment.github.io/luxon/#/


# インストール方法

```
npm install luxon
```

### Node.js
```javascript
const { DateTime } = require("luxon");
```

### ES6(ECMAScript2015)
```javascript
import { DateTime } from "luxon";
```

# 使い方
便利なことに、[Luxon公式ページ](https://moment.github.io/luxon/#/)において、開発者ツールのコンソールでLuxonが使用できます。
インストールせず手軽に動作確認したい場合に使用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844628/d2d53b9b-5569-4a48-b402-f6f416479c45.png)


## DateTimeクラス
`DateTime`はLuxonの最も重要なクラスです。
DateTimeクラスを使って、新しい日時オブジェクトを作成できます。

## 日時オブジェクトの取得
**・現在時刻の取得**
```javascript
DateTime.now();
```

**・ローカル日時を取得(PCのタイムゾーン基準の日時を取得)**

 現在のローカル日時
```javascript
DateTime.local();
```

指定したローカル日時
```javascript
DateTime.local(2024, 5, 10, 8, 30);
```

**・オブジェクトから作成**
```javascript
DateTime.fromObject({day: 15, hour: 12, minute: 30 }, { zone: "Asia/Tokyo" });
```


**・ISO 8601文字列から作成**
```javascript
DateTime.fromISO("2024-05-10T08:30:00") 
```
:::note info
ISO 8601とは、日付と時刻の表記に関するISOの国際規格です。
ISO 8601 では、日付と時間をTで区切って “YYYYMMDDTHHmmss” のような形式で表します。

UTCの場合Zをつけ、その他のタイムゾーンの場合はプラス／マイナス記号で時差を表記します。

例) 2024年5月10日　8時30分(日本時間)
2024-05-10T08:30:00+09:00

:::

## 日付の変換(フォーマット)
**・toString：ISO 8601に似たLuxon独自の文字列に変換**
主にデバッグやログの出力時に使用されます。
```javascript
const now = DateTime.now();
console.log(now.toString()); //"2025-03-13T10:45:30.123+09:00"
```

**・toISO：ISO 8601形式に変換**
toStringと同様、ISO 8601形式に変換されますが、
toISOはオプションでミリ秒やタイムゾーンの有無が変更可能です。

```javascript
const now = DateTime.now();
console.log(now.toISO()); //"2025-03-13T10:45:30.123+09:00"
```

**・toLocaleString()：ローカルの日時フォーマットで文字列に変換**
```javascript
const now = DateTime.now();
console.log(now.toLocaleString()); //例："2025/03/13"
```


**・toFormat：任意の形式に変換**
```javascript
const now = DateTime.now();
console.log(now.toFormat("yyyy-MM-dd HH:mm:ss")); //"2025-03-13 10:45:30"
```

## 最後に
日付操作ライブラリを使用するのは初めてだったので、「DateTimeオブジェクト」という概念を理解するのに時間がかかりました。
実際に手元で動かして中身を確認するということが初期段階の理解に大きく役立つと感じました。
わからないときは自分でやってみるということを今後も意識していきたいです。

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

# 参考
https://moment.github.io/luxon/#/
シチュエーション別のサンプルサイズの決め方（メモ）

### **1. 目的別のサンプルサイズの決定方法**
#### (1) **推定（母集団の特性を推測）**
   - **信頼区間と許容誤差を考慮**
   - 例：市場調査、世論調査
   - **計算方法**:  
     - サンプルサイズ $( n = \frac{Z^2 \cdot p(1-p)}{E^2} \)$
       - $\ Z \$：信頼水準に対応する標準正規分布の値（例：95%信頼水準なら1.96）
       - $\ p \$：母集団の推定割合（50%を仮定することが多い）
       - $\ E \$：許容誤差（例：±5%）

#### (2) **比較（2つ以上のグループの差を検定）**
   - **統計的検定のパワー分析を活用**
   - 例：A/Bテスト、医療試験
   - **計算方法**:  
     - 効果量・検定力（通常80%）を考慮し、**Cohen’s d** などの基準を活用
     - $\ n = f(\alpha, 1-\beta, \text{効果量}) \$ （ソフトウェアを使って算出）

#### (3) **探索（定性的なデータを得る）**
   - **小規模でも深掘り**
   - 例：ユーザーインタビュー、フォーカスグループ
   - **目安**:
     - 5〜10人程度（サチュレーション※が得られるまで）
     - ※サチュレーション：新しい知見が得られなくなる状態

---

### **2. 制約条件別のサンプルサイズの決定方法**
#### (1) **コスト・時間の制約**
   - 限られたリソースで最適なサンプル数を決定
   - 例：スタートアップの簡易調査 → **最低限の信頼性を確保（例：30〜100）**
   - アプローチ:
     - 予算・時間内で収集可能な最大サンプルを確保
     - 許容誤差を緩める（例：±10%など）

#### (2) **データ取得の難易度**
   - サンプルが集まりにくい場合、データの代表性を優先
   - 例：レアな病気の臨床試験 → **小規模でも統計的手法で補正**
   - アプローチ:
     - **ブートストラップ法** などでデータの不確実性を補完
     - **ケーススタディ** など定性的手法と組み合わせる

#### (3) **母集団のサイズ**
   - 母集団が小さい場合は**有限母集団補正**を適用
   - 例：特定業界の専門家調査
   - **修正式**:  
     - $\ n_{\text{修正}} = \frac{n_0}{1 + \frac{n_0 - 1}{N}} \$  
       - $\ n_0 \$：通常のサンプルサイズ
       - $\ N \$：母集団のサイズ

---

### **3. データ特性別のサンプルサイズの決定方法**
#### (1) **離散データ vs 連続データ**
   - **離散データ（Yes/No、購入有無など）** → 必要サンプルが**多め**
   - **連続データ（売上、スコアなど）** → 分布が正規なら**少なくてもOK**

#### (2) **ばらつき（分散）の大きさ**
   - 分散が大きいデータ（個人差が大きい場合）は、**サンプル数を増やす必要あり**
   - 例：人間の行動データ（消費パターン） → **最低数百**
   - ばらつきが小さい場合（機械の測定誤差） → **小規模で済む（例：30〜50）**

---

### **まとめ**
| シチュエーション | 目安サンプルサイズ | 主要考慮点 |
|-----------------|----------------|------------|
| 世論調査・市場調査 | 400〜1000 | 信頼区間・誤差 |
| A/Bテスト | 1000以上（要パワー分析） | 効果量・検定力 |
| ユーザーインタビュー | 5〜15 | サチュレーション |
| 予算・時間制約あり | 30〜100 | 許容誤差を緩める |
| レアケース調査 | 10〜50 | 代表性を確保 |
| 小規模母集団（N<1000） | 30〜Nの50%程度 | 有限母集団補正 |
git push で詰まった問題と対処法

# はじめに
プロジェクトをcreateして、GitHubのリポジトリと連携しpushするまでのフローで、pushでエラーが出たので、備忘録として残しておきます。
同じ問題に遭遇した人がいたら、ぜひ参考にしてください。

## `Repository not found.` エラー
原因
- Private リポジトリに `git push` する際、HTTPS 認証が必要なため、認証エラーが発生

解決策
1. Personal Access token を作成、
1. 作成したtokenを使用し認証を行いpushを行う
---
### Personal Access Token の作成方法
1. GitHub にログイン
1. 右上のアイコンから Settings に移動
1. 左サイドバーの Developer settings をクリック
1. 左メニューの Personal access tokens → Tokens (classic) を選択
1. Generate new token (classic) をクリック

【以下の項目を設定】
- Note: Git Push Token（トークンの用途をメモ）
- Expiration: 90 days 以上（推奨）
- Scopes（権限）:  **repo**（リポジトリへのアクセスを許可）
- Generate token をクリック
- 表示されたトークンをコピー！（再表示できないので必ずメモする）

### 作成したtokenを使用し認証を行いpushを行う
```
$ git remote -v
$ git remote set-url origin https://<USERNAME>:<TOKEN>@github.com/<REPONAME>.git
$ git push -u origin main
```
上記を実行することで、`git push`が成功します。
## まとめ

| ステップ | やること |
|----------|---------|
| **1. `Repository not found.` エラーの原因を確認** | Private リポジトリで HTTPS 認証が必要 |
| **2. Personal Access Token を作成** | `repo` 権限をつけた Personal Access token を生成 |
| **3. `git remote set-url` で Token を設定** | `git remote set-url origin https://<USERNAME>:<TOKEN>@github.com/...` |
| **4. `git push -u origin main` を実行** | トークンを使った HTTPS 認証で `push` |
C++ vector で条件に一致した要素を削除したい

# 1. はじめに
久しぶりに書いてバグりそうだったので備忘録。自分用メモ。

まず 愚直な正解コード。特定の条件に一致した(この場合は4)要素を削除するにはこう書きます。

```C++:sample.cpp
    std::vector<int> vecTest = { 3,1,4,4,5,6 };

    for (auto it = vecTest.begin(); it < vecTest.end();) {
        if (*it == 4) {
            it = vecTest.erase(it);
        }
        else {
            it++;
        }
    }
```

# 2.ありがちなバグパターン
for文を書くときのクセでうっかり書くとバグります。条件が成立して短くなった時にもイテレータがインクリメントされるため、2個めの4が消えません。

``` C++:sample2.cpp
    std::vector<int> vecTest = { 3,1,4,4,5,6 };

    for (auto it = vecTest.begin(); it < vecTest.end(); it+++) {
        if (*it == 4) {
            it = vecTest.erase(it);
        }
    }
```

# 3.別解
ラムダ式でイテレータともさようなら。

``` C++:sample3.cpp

    vecTest.erase(
        std::remove_if(vecTest.begin(), vecTest.end(), [](int value) {
            return value == 4; // 条件：値が4の場合
            }),
        vecTest.end()
    );

```
DNS設定がしたい話

# Why?
色々とやろうとするにはドメイン設定しないととなったのでそこら辺の備忘録です。

# この記事の作者のアプリの状態
アプリはRuby on railsで作成し、デプロイ先はHeroku使用

# ドメインの取得
ドメインはお名前ドットコムで取得しました。
されど私はルートドメインとして設定したいと思ってしまったのですね。
しかし、お名前ドットコムではルートドメインが適応できなかったのです。

![Herokuの注意点](https://i.gyazo.com/48fd34f0b9678e439a968520ff140b69.png)

なのでCloudflareを使うことになりました。

# Cloudflare
ルートドメインを設定するために活用したのがこちらのサービス。
[Cloudflare CDNの仕組み](https://developers.cloudflare.com/fundamentals/concepts/how-cloudflare-works/)

# ドメイン適応のやり方
#### 1. cloudflareにログイン
#### 2. ドメインを追加
   
アカウントホームのドメインを追加ボタン
   　↓ 
既存のドメインを入力
   　↓
続行

![cloudflareドメイン入力](https://i.gyazo.com/9c7f0a6f0760037bedad7b552afefeb7.png)

:::note info
この時私は`DNS レコードのクイック スキャン(推奨)`を選択していたけど、レコードが必要以上に入っちゃうから`DNS レコードを手動で入力する`でもいいかも
:::
   
#### 3. ネームサーバー設定
   
Cloudflareからネームサーバーを提供される (2つある)
   　↓
お名前ドットコムのネームサーバー設定
   　↓
その他のネームサーバーを利用
    　↓
Cloudflareのネームサーバーを登録 (2つとも)

![お名前ドットコムネームサーバー登録](https://i.gyazo.com/29d3f4090cd0db4a1d79746e7b8b55c0.png)
#### 4. Herokuにドメインを追加

```
heroku domains:add ドメイン名 -a アプリ名
```
このコマンドを入力するとHerokuからCNAMEレコードの値(`xxxxx.herokudns.com`のようなもの)が返ってくるのでこれを控えておく。
確認する際は以下で。
```
heroku domains -a アプリ名
```
Herokuのweb上でもアプリのSettingsからでも一応確認可

#### 5. CloudflareにDNSを登録
CloudflareのダッシュボードからDNSのレコード
　↓
 下記の様に設定
 
《 ルートドメイン 》
- タイプ：CNAME
- 名前：@
- ターゲット：Herokuから取得した値(`xxxxx.herokudns.com`)
- プロキシステータス：灰色の雲(HerokuのSSLの設定が競合しないようにしておく)

《 サブドメイン 》
- タイプ：CNAME
- 名前：www(任意)
- ターゲット：Herokuから取得した値(`xxxxx.herokudns.com`)
- プロキシステータス：灰色の雲(HerokuのSSLの設定が競合しないようにしておく)

![DNSのターゲット設定フォーム](https://i.gyazo.com/654faa57ccddec32126ad1c65b009046.png)
#### 5. CloudflareのSSL/TLS設定
CloudflareのダッシュボードからSSL/TLSのSSL/TLS暗号化
　↓
 フルorフル(厳密)に設定

:::note warn
- フレキシブルは Herokuと相性が悪いらしいので、必ずフル以上を選ぶ
- フル(厳密)にする場合は、Heroku側でSSL証明書が有効になっていることを確認
:::

#### 6. HerokuのSSLを有効化
```
heroku certs:auto -a アプリ名
```
これで無効だったら有効に変更
```
heroku certs:auto:enable -a アプリ名
```

#### 7. 設定できたか確認
```
nslookup ドメイン名
```
これでHerokuで取得したターゲットと一緒であればOK

::: note info
ルートドメインはCloudflare の IP アドレスが返ってきたりするけど大丈夫でした
:::

自動証明書関係はこちらでドメインごとのステータスを確認しとくと安心
```
heroku certs:auto -a アプリ名
```
Cert issuedか出ていなかったら以下のリンク先で確認する
[Heroku 自動証明書管理](https://devcenter.heroku.com/articles/automated-certificate-management#troubleshooting)

# 以上です。
一応実装しながら記載していったので確認済みではありますが
何かおかしなとことかありましたら、コメントいただけますと幸いです。

# 参考
- [Heroku アプリのカスタムドメイン名](https://devcenter.heroku.com/ja/articles/custom-domains#add-a-custom-domain-with-a-subdomain)
- [Heroku 自動証明書管理](https://devcenter.heroku.com/articles/automated-certificate-management#troubleshooting)
- [Cloudflare CDNの仕組み](https://developers.cloudflare.com/fundamentals/concepts/how-cloudflare-works/)
- [HTTPS経由でCloudflareとHerokuを設定する](https://developers.cloudflare.com/support/third-party-software/others/configure-cloudflare-and-heroku-over-https/)
カテゴリ別に投稿、カテゴリ別に整列させるツイート

### サイトイメージ
indexページ
![スクリーンショット 2025-03-13 193438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944112/b1386e7e-b18f-4998-8625-11bb2fa1b22e.png)
newページ
![スクリーンショット 2025-03-13 193448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944112/e170a3a2-e2e4-44ab-bdc7-3e1d267dccd9.png)

### ビューページ
```ruby:index.html.erb

<h1>投稿一覧</h1>
<h3>カテゴリー別投稿</h3>

<%= link_to "新規投稿へ", new_tweet_path %>

<div class="categories-container">
  <% ["家庭", "閲覧注意", "会社", "友人", "学校","コメント"].each do |category| %> #ここを追加でカテゴリを増やせる
    <div class="category-box">
      <h2><%= category %></h2>
      <div class="tweets-container">
        <% @tweets.where(category: category).each do |t| %>
          <div class="title">
            <strong>[<%= t.category %>]</strong> <%= t.title %>
          </div>
        <% end %>
      </div>
    </div>
  <% end %>
</div>
```

```ruby:new.html.erb
<h1>新規投稿</h1>
<h3>新規投稿ページ</h3>

<%= form_for @tweet do |f| %>
  <div class="field">
    <%= f.label :title, "タイトル" %>
    <%= f.text_field :title, size: 30 %>
  </div>

  <div class="field">
    <%= f.label :tweet, "内容" %>
    <%= f.text_area :tweet, rows: 5, cols: 30 %>
  </div>

  <div class="field">
    <%= f.label :category, "カテゴリー" %>
    <%= f.select :category, ["家庭", "学校", "閲覧注意", "会社", "友人","コメント"], prompt: "選択してください" %>　#ここを追加でカテゴリを増やせる
  </div>

  <%= f.submit "投稿する" %>
<% end %>


<%= link_to "一覧に戻る", tweets_path %>
```

```ruby:application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>自分のタイトル</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
    <%= javascript_importmap_tags %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>
```

### コントローラー
```ruby:tweets_controller.rb
class TweetsController < ApplicationController

  def index
    @tweets = Tweet.all
  end
  
  def new
    @tweet = Tweet.new
  end
  
  def create
    @tweet = Tweet.new(tweet_params)
    if @tweet.save
      redirect_to tweets_path, notice: "投稿しました"
    else
      render :new
    end
  end
  
  private
  
  def tweet_params
    params.require(:tweet).permit(:tweet, :category)
  end
end 
```
### css
```ruby:application.css
.categories-container {
    display: flex;
    justify-content: space-between;
    gap: 20px; /* カテゴリー間の余白 */
  }
  
  .category-box {
    flex: 1;
    border: 2px solid #ccc;
    padding: 10px;
    border-radius: 8px;
    background-color: #f9f9f9;
    text-align: center;
  }
  
  .tweets-container {
    margin-top: 10px;
  }
  
  .tweet {
    padding: 5px;
    border-bottom: 1px solid #ddd;
  }
```

タグ機能よりも簡単にツイートを分類できる。
全部をカテゴリコンテナに入れているので、それ用の検索機能はまだ作ってないです
【Chrome】拡張機能「Google翻訳」の追加

# 記事概要
Chromeブラウザに、Google翻訳を導入する方法について、まとめる。

# Google翻訳とは
Googleが開発した翻訳サービスを手軽に利用できる拡張機能
拡張機能を導入しなくても使用できるが、拡張機能を導入するとより便利になる

# 前提
- ブラウザはChromeを使用している

# 手順
1. [Google翻訳](https://chromewebstore.google.com/detail/aapbdbdomjkkjkaonfhkkikfgjllcleb?utm_source=item-share-cb)にアクセスする
1. `Chromeに追加`をクリックする

# インストール結果
1. Chromeブラウザで英語などを選択すると、Google翻訳のポップアップが表示される
Redisの代わりにSymfony/Cacheでキャッシュしてインフラコストを下げる

## 概要
こんにちは！秋霜堂 石川です。
キャッシュ戦略を見直すことで、アプリケーションのパフォーマンスを維持しながらインフラコストを削減できることがあります。特に、頻繁にアクセスされないデータに対してRedisのようなインメモリキャッシュを使用するのは正直過剰です。今回は代替手段としてSymfony/Cacheコンポーネントを活用してインフラコストを削減することにしました。

## Redisキャッシュの非効率性
多くのWebアプリケーションではパフォーマンス向上のためにRedisをキャッシュとして利用しています。確かにRedisは高速で信頼性の高いキャッシュソリューションですが、頻繁にアクセスされないデータや低トラフィックのアプリケーションにとっては、専用のRedisサーバーやクラスタを維持するコストは無駄になります。

今回、対象となったアプリケーションでは以前よりRedisが使われていたのですが、アクセス頻度の高いデータの格納が不要になったため宝の持ち腐れ状態でした。

アクセス頻度の低いデータに対してはRedisのようなインメモリキャッシュを使用するのではなく、ファイルシステムベースのキャッシュを利用することでインフラコストを削減できると考えました。今回はSymfony/Cacheコンポーネントを使います。

## Symfony/Cacheとは
Symfony/Cacheは、PHPフレームワークSymfonyのコンポーネントの一つで、単純なキャッシュニーズから高度なキャッシュニーズまでカバーする機能を提供しています。このコンポーネントは、PSR-6（PHPキャッシュインターフェース標準）に準拠しており、様々なキャッシュバックエンドをサポートしています。
https://symfony.com/doc/current/cache.html

Symfony/Cacheの大きな特徴は、ファイルシステム、APCu、Memcached、Redis、データベースなど、多様なストレージバックエンドに対応したアダプターを提供していることです。デフォルトはファイルキャッシュですが、設定を変更することで柔軟に変更できます。
https://symfony.com/doc/current/components/cache.html#available-cache-adapters

Redisへのアクセスは別の方法を使っていたため、Symfony/Cacheの導入から行いました。

## Symfony/Cacheのインストール
たいていのSymfonyプロジェクトではcomposer.lockに入っていますが、直接依存することになるので入れておきます。
```bash
$ composer require symfony/cache
```

## Symfony/Cacheの使い方
使い方は非常にシンプルです。今回はFilesystemAdapterインスタンスを手動で生成するのではなく、DIを使って注入します。
```php
use Symfony\Contracts\Cache\CacheInterface;

    public function __construct(
        private readonly CacheInterface $cache,
    ) {
    }
```

次に、キャッシュの取得と保存を行いますが、Symfony/Cacheでは`get()`メソッドを使用してキャッシュの取得と保存を一度に行います。
```php
    public function hoge(): void
    {
        // ...
        $value = $this->cache->get('my_cache_key', function (ItemInterface $item) use ($kid) {
          // ここでreturnした値が、cacheが存在しないときにcacheされたうえで使われる
          if (isUseCache) {
            // nullを返すときはcacheされない
            return null;
          }
          if (hasExpires) {
            // 有効期限を設定することもできる
            $item->expiresAfter(3600);
          }
          return 'cacheする値'
        });
        // ...
    }
```

キャッシュを削除する場合は、`delete()`メソッドを使用します。
```php
$cache->delete('my_cache_key');
```

## まとめ
頻繁にアクセスされないデータのキャッシュをRedisからSymfony/Cacheのファイルシステムベースのキャッシュに移行ですが、以上のようにあっさりと対応することができました。専用のRedisサーバーやクラスタを維持するコストを削減しながら、アプリケーションのパフォーマンスは維持されています。

Symfony/Cacheの柔軟性と拡張性により、将来的にアプリケーションの要件が変化した場合でも、キャッシュバックエンドを簡単に切り替えることができます。また、PSR-6に準拠しているため、他のPSR-6互換のキャッシュライブラリとも互換性があります。

万一、redisを使う必要性が再度出てきたとしても今度はSymfony/Cacheの接続先を変更するだけですので。


---

秋霜堂株式会社はWebを中心としたソフトウェア開発企業です。エンジニアとして案件を探している方 / 発注先を探している方など、少しでも気になった方はぜひお問い合わせください！
https://syusodo.co.jp
【Chrome】拡張機能「Chrome Remote Desktop」の追加

# 記事概要
Chromeブラウザに、Chrome Remote Desktopを導入する方法について、まとめる。

# Chrome Remote Desktopとは
パソコンの遠隔操作を可能にするGoogle Chromeブラウザの拡張機能

# 前提
- ブラウザはChromeを使用している

# 手順
1. [Chrome Remote Desktop](https://chromewebstore.google.com/detail/inomeogfingihgjfjlpeplalcfajhgai?utm_source=item-share-cb)にアクセスする
1. `Chromeに追加`をクリックする

# インストール結果
1. ブラウザ右上の拡張機能からChrome Remote Desktopを選択する
    [![Image from Gyazo](https://i.gyazo.com/61bc5b675333c58d578dd8fc5515300c.png)](https://gyazo.com/61bc5b675333c58d578dd8fc5515300c)
1. `画面を共有`を選択する
1. 実施内容を選択する
    - 自分の画面を共有する
        1. `この画面を共有`を選択する
        1. `コードを生成`をクリックする
        1. 表示されたアクセスコードを画面共有したい相手に連携する
    - 別PCの画面を共有してもらう
        1. 相手からアクセスコードを受領する
        1. アクセスコードを入力し、別PCに接続する
【Mac】Gyazoの導入

# 記事概要
MacにGyazoを導入する方法について、まとめる。

# Gyazoとは
[Gyazo](https://gyazo.com)は、PC画面の静止画やGIFを撮影するキャプチャーソフトウェアであり、撮影したデータにURLを自動で付与することができるツール

# 前提
- PCはMacを使用している

# 手順
1. [公式サイト](https://gyazo.com)にログインする
1. メニュー＞アプリをダウンロード　をクリックする
1. Gyazoアプリをダウンロードし、アプリをインストールする
1. アクセス権を許可する
    1. 左上のアップルマーク＞システム環境設定をクリックする
    1. プライバシーとセキュリティをクリックする
    1. 画面収録とシステムオーディオ録音をクリックする
    1. 下記2項目をONにする
    [![Image from Gyazo](https://i.gyazo.com/0d5e63d9d54d02070d7cb944c34bfbd5.png)](https://gyazo.com/0d5e63d9d54d02070d7cb944c34bfbd5)

# インストール結果
1. “Gyazo”のアイコンが右上に表示される
    [![Image from Gyazo](https://i.gyazo.com/52e10d6845a1c2737bf5ca22aa3a2c67.png)](https://gyazo.com/52e10d6845a1c2737bf5ca22aa3a2c67)
1. 撮影を行う
    - 静止画
        1. `静止画の撮影`を選択する
        1. ポインターの形が矢印から十字に変わったのを確認する
        1. ポインターの形が十字の状態で適当な範囲をドラック＆ドロップする
    - 動画
        1. `動画の撮影`を選択する
        1. ポインターの形が矢印から十字に変わったのを確認する
        1. ポインターの形が十字の状態で適当な範囲をドラック＆ドロップする
        1. 動画撮影が開始される
1. GyazoのWebページに自動でアクセスされ、撮影したコンテンツが表示されることを確認する

# コンテンツ出力
1. [Gyazo](https://gyazo.com/captures)にアクセスする
1. 撮影後のGyazoまたはGyazoGIFのページで、「シェア」をクリックする
1. 出力方法を選択する

# 備考
- 共有方法を選択することが可能であるため、必要に応じて形式を選択できる
JavaScriptのコールバック関数をざっくりで良いので理解する。

## はじめに

タイトル通り、JavaScriptのコールバック関数についてざっくり理解します。

## 目次

1. [コールバック関数とは？](#-コールバック関数とは)
2. [コールバック関数が使われる場面](#-コールバック関数が使われる場面)
3. [コールバック関数のメリット](#-コールバック関数のメリット)
4. [コールバックの注意点（コールバック地獄）](#-コールバックの注意点コールバック地獄)
5. [コールバック関数をレストラン注文に置き換えると...](#-コールバック関数をレストラン注文に置き換えると)
6. [まとめ](#-まとめ)
7. [参考文献](#参考文献)

## 🧷 コールバック関数とは？
コールバック関数とは、<b>他の関数の引数</b>として渡され、特定のタイミングで実行される関数 のことです。
特に <b>非同期処理やイベント処理</b> でよく使われます。

### 📝 コールバック関数の基本構造
```javascript
function doSomething(callback) {
  console.log("処理を開始");
  callback(); // 渡された関数を実行
}

doSomething(() => {
  console.log("コールバック関数が実行されました！");
});

```
✅ doSomething に 関数を引数として渡し、その関数を callback() として実行しています。

## 🧷 コールバック関数が使われる場面

### １. 非同期処理（API通信・データ取得）
```javascript
function fetchData(url, callback) {
  fetch(url)
    .then(response => response.json())
    .then(data => callback(data)) // データ取得後にコールバックを実行
    .catch(error => console.error("エラー:", error));
}

fetchData("https://jsonplaceholder.typicode.com/posts/1", (data) => {
  console.log("取得データ:", data);
});
```
🔹 fetchData の callback(data) で、取得したデータを処理できます。
### ２. イベント処理
```javascript
document.getElementById("myButton").addEventListener("click", () => {
  console.log("ボタンがクリックされました！");
});
```
🔹 addEventListener の 第2引数がコールバック関数 になっています。
### ３. タイマー処理
```javascript
setTimeout(() => {
  console.log("3秒後に実行されました！");
}, 3000);
```
🔹 setTimeout の 第1引数がコールバック関数 です。
### ４. 配列の処理
```javascript
let numbers = [1, 2, 3, 4, 5];

numbers.forEach(num => {
  console.log("数値:", num);
});
```
🔹 forEach の 引数に渡した関数 が 配列の各要素に対して実行 されます。

## 🧷 コールバック関数のメリット

✅ 処理を柔軟に変更できる（関数を引数で渡すことで、実行内容を変更可能）
✅ 非同期処理に適している（データ取得後やイベント発生後に処理を実行）
✅ コードの再利用性が高まる（関数を組み合わせて使える）

## 🧷 コールバックの注意点（コールバック地獄）
コールバックをネストしすぎると可読性が低下 します。
```javascript
fetchData("url1", (data1) => {
  fetchData("url2", (data2) => {
    fetchData("url3", (data3) => {
      console.log("すべてのデータを取得:", data1, data2, data3);
    });
  });
});
```
💡 解決策: Promise や async/await を使う

## 🧷 コールバック関数をレストラン注文に置き換えると...
🍽️ レストランの注文に例えてみよう！

✅ 注文する（リクエストを送る）
✅ 料理ができたらウェイターがあなたに持ってくる（非同期処理）
　　→ <b>あなたが何もしなくても(非同期)</b>勝手に料理が運ばれてくる。
✅ 料理が届いたら、あなたは「食べる」「写真を撮る」「友達にシェアする」など自由に決める（コールバック関数）
　　→ <b>あなた自身があなたに対して(コールバック)</b>のアクションを決める

```javascript
function orderFood(menu, callback) {
  console.log(`${menu} を注文しました。`);
  
  setTimeout(() => {
    console.log(`${menu} ができました！`);
    callback(menu); // 料理ができた後に、コールバック関数を実行
  }, 3000); // 3秒後に料理ができる
}

// 注文して、料理ができたら食べる
orderFood("ラーメン", (food) => {
  console.log(`${food} を食べます！`);
});
```
✅ orderFood 関数は、料理の準備（非同期処理）が終わった後に コールバック関数を実行 します。
✅ callback(food) には、「料理を食べる」動作を入れています。
✅ callback を変えれば、「写真を撮る」や「友達にシェアする」動作に変更できます。

## 🎉 まとめ
🔹 コールバック関数は、他の関数の引数として渡される関数
🔹 非同期処理・イベント処理・タイマー処理・配列処理などで活躍
🔹 ネストしすぎると「コールバック地獄」になるので注意！

| 用途 | 例 |
|:-----------|:------------|
| 非同期処理（API通信, データ取得） | `fetch` を使ったデータ取得 |
| イベント処理（クリック, 入力） | `addEventListener` を使ったクリックイベント |
| タイマー処理 | `setTimeout` による遅延処理 |
| 配列処理 | `map`, `forEach` でのデータ処理 |
| カスタマイズ可能な関数設計 | 計算の処理を変更可能にする |


実務では特に 非同期処理（API通信, イベント, タイマー） の場面で頻繁に使われる！🚀
Mapでダメージ管理！（辞書のデータ更新）

Paizaの問題を解いていて、「攻撃された人のダメージ合計を計算する」ってタスクにハマった話。最初は Map をうまく使えず、攻撃ログを見事にスルー…。でも set と get を活用すれば、スッキリ解決できた！先に言っちゃうと、今回の最大の失敗は、「問題文をちゃんと読んでいなかったこと」(´;ω;｀)

<br>**問題の概要**
入力
・n 人の名前（初期ダメージは0）
・m 回の「攻撃された人の名前」と「受けたダメージ」
・ダメージ合計を知りたい人の名前 S

出力
・S の合計ダメージ

入力例
```
2　　　　　//n
Kirishima
Kyoko
2　　　　　//m
Kyoko 1
Kyoko 2
Kyoko　 　//S
```
出力例
```
3
```

<br>**NG例**（ミスったコード）
```js
const n = Number(lines[0]);
const S = lines[n + 1]; // m（攻撃回数）を読み飛ばしてる！
const dict = new Map();

for (let i = 1; i <= n; i++) {
    const [key, value] = lines[i].split(" "); // 名前リストを攻撃データと誤認
    dict.set(key, Number(value));
}
```
何がダメ？
✅ m（攻撃回数）を無視 → そもそも攻撃が記録されない
✅ n の名前リストをダメージデータと誤認

<br><br>**OK例**（修正後）
```js
const damageMap = new Map();

// 初期化（全員のダメージ = 0）
for (let i = 1; i <= n; i++) {
    damageMap.set(lines[i], 0);
}

// ダメージ集計
for (let i = n + 2; i < n + 2 + m; i++) {
    let [person, damage] = lines[i].split(" ");
    damageMap.set(person, damageMap.get(person) + Number(damage));
}

console.log(damageMap.get(S));
```
ポイント
✅ Map を使い、キー（名前）→ 値（ダメージ） を管理
✅ 初期値 0 をセットし、undefined を防ぐ
✅ get で現在値を取得し、set で更新

<Br><br>**まとめ**
問題文をちゃんと読めば、Map で楽にデータを管理できる！
辞書的なデータ更新には Map を活用しよう！
問題文はちゃんと読もう！(´;ω;｀)

[僕の失敗談と解決話！](https://paizabeginner.wordpress.com/2025/03/13/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bcmap%e3%81%a7%e3%83%80%e3%83%a1%e3%83%bc%e3%82%b8%e8%a8%98%e9%8c%b2%e3%82%92%e7%ae%a1%e7%90%86%ef%bc%81%e8%be%9e%e6%9b%b8%e3%81%ae/)
Manus AI: 次世代の汎用AIエージェントの全貌

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/5225c87b-b942-4567-91cc-746028c81857.png)


近年、AI技術の進化により、単なるテキスト応答型のチャットボットから、より高度なタスク処理が可能な**汎用AIエージェント**へと進化しています。その中でも注目を集めているのが、**Manus AI** です。

Manus AI は、ユーザーの指示をもとにタスクを**計画・実行・最適化**できる新世代のAIエージェントであり、従来のLLM（大規模言語モデル）を超えた実用性を持ちます。本記事では、**Manusの技術仕様・特徴・活用例・実装方法・サンプルコード** を詳しく解説していきます！💡

---
## 1️⃣ **Manus AIとは？**
Manus AI は、中国のスタートアップ Monica によって開発された**自律型AIエージェント**です。単なる質問応答にとどまらず、複雑なタスクを複数のステップに分解し、それぞれのアクションを実行する能力を備えています。

### ✅ **Manus AI の主な特徴**
1. **複数のAIモデルを統合**: Manusは**AnthropicのClaude**や**Alibaba Qwen**を活用し、異なるAIモデルを動的に選択します。
2. **クラウドベースの仮想環境**: Linuxベースの仮想環境で動作し、**シェルコマンド・ブラウジング・コード実行**などが可能。
3. **エージェントループの活用**: `Analyze → Plan → Execute → Observe` のプロセスを繰り返しながら最適な結果を生成。
4. **ファイル管理とストレージ**: AIがファイルを読み書きし、タスクの進行状況を保存。
5. **Webブラウジングとフォーム入力**: 実際のユーザーのようにブラウザを操作し、データ収集や自動化が可能。

---
## 2️⃣ **Manus AI の技術仕様**
Manus AIは、多層構造のアーキテクチャを採用し、複雑なタスクの処理を最適化しています。

### 📌 **Manusの主要コンポーネント**
| コンポーネント | 機能 |
|--------------|-------------------------------|
| **Planner** | 高度なタスク分割とスケジューリング |
| **Tool API** | Web検索、シェルコマンド、コード実行 |
| **Sandbox** | 仮想環境でのタスク処理（Linux上で実行） |
| **Memory** | ファイルベースの記憶機能 |
| **Multi-Agent System** | タスクを並行処理するエージェント |

Manus AIは、これらのコンポーネントを活用して、ユーザーの指示に応じた最適な戦略を策定し、実行します。

---
## 3️⃣ **Manus AI の活用例**
Manus AIの応用範囲は非常に広く、様々な業界で活用できます。

### 🔹 **ビジネスプロセスの自動化**
Manus AIを活用することで、データ入力、請求処理、カレンダーの管理などの**オフィス業務を完全に自動化**できます。

### 🔹 **データ分析 & レポート生成**
Manusはリアルタイムデータを取得し、レポートを自動生成することが可能。たとえば、株価データを分析し、視覚化するコードを生成できます。

```python
import pandas as pd
import matplotlib.pyplot as plt

# 株価データの取得（仮）
data = {
    "日付": ["2024-01-01", "2024-01-02", "2024-01-03"],
    "株価": [1500, 1550, 1530]
}
df = pd.DataFrame(data)

# グラフの描画
df.plot(x="日付", y="株価", kind="line", title="株価推移")
plt.show()
```

### 🔹 **コード生成 & デバッグ**
Manusはコードの生成や修正も行えるため、**プログラマーの補助**にも適しています。

```python
# Manusが生成したシンプルなAPIサーバー
from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, Manus AI!"

if __name__ == '__main__':
    app.run(debug=True)
```

---
## 4️⃣ **Manus AI の実装方法**
Manus AIのAPIはまだ公開されていませんが、今後の展開として**クラウドAPIやSDK**が提供される可能性があります。現在、Manusのような自律エージェントを自作する方法も研究されています。

### **Manusライクなエージェントの実装例（擬似コード）**
```python
class ManusAgent:
    def __init__(self):
        self.memory = []
    
    def analyze(self, query):
        print(f"分析中: {query}")
        return "適切なツールを選択中..."
    
    def execute(self, action):
        print(f"実行: {action}")
        return "処理完了"
    
agent = ManusAgent()
query = "東京の天気を調べる"
print(agent.analyze(query))
print(agent.execute("天気APIに接続"))
```

このようなアプローチを活用すれば、**Manus AIのようなエージェントを自作することも可能**です。

---
## 5️⃣ **Manus AI の倫理的課題とリスク**
Manus AIの普及に伴い、以下のリスクが懸念されています。

- **誤情報の拡散**: AIが誤った情報を生成するリスク。
- **プライバシーの問題**: 機密データの取り扱いが課題に。
- **自律エージェントの制御**: 予期せぬ動作を防ぐ仕組みが必要。

企業や開発者は、**倫理的ガイドラインの策定や監視体制の構築**を進めることが重要です。

---
## 🎯 **まとめ**
Manus AIは、**単なるチャットボットを超えた次世代のAIエージェント**として、多くの可能性を秘めています。その技術的特徴や応用範囲は広く、適切に活用すれば、業務の生産性向上や新たなビジネスチャンスの創出につながるでしょう。

今後のアップデートにも注目しながら、**AIエージェント時代の最前線**を一緒に学んでいきましょう！🚀✨
【Mac】ターミナル.appから外付けHDDへの接続

# 記事概要
Macのターミナル.appから外付けHDDへ接続する方法について、まとめる。

# 前提
- PCはMacを使用している

# 手順1(ターミナル.appへの権限付与)
1. システム設定＞プライバシーとセキュリティ＞フルディスクアクセス＞”+”ボタン　をクリックする
1. ユーティリティ＞ターミナル.app　を選択する
    - 必要に応じて、検索
1. “開く”ボタン　をクリックする
1. フルディスクアクセス一覧の”ターミナル”をオンにする

# 手順2(外付けHDDへの権限付与)
1. 外付けHDDを右クリックする
1. “情報を見る”を選択する
1. 最下部にある南京錠を解除する
1. 最下部にある`このボリューム上の所有権を無視`のチェックを外す
1. 最下部にある南京錠でロックする
1. ターミナル.appを開く
1. 下記コマンドを実行する
    ```
    # Volumesに移動
    % cd /Volumes
    
    # Volumes直下のディレクトリ・ファイルを表示
    # 権限付与したい外付けHDDが表示されることを確認する
    % ls
    
    # 権限付与のコマンドを実行
    % sudo chown -R <ユーザーネーム>:staff <外付けHDDの名前>
    ```
arduinoとtweriteでラジコン作った話。

arduinoとtweriteを使ってラジコンの制御部分を作りました。
一番聞きたいのが、こいつを作ったことが、一つのシステムを作ったということにしてもいいのか(学ちかとかに利用できるのか)ということです。
作ったものは、arduinoとtweriteで、無線、サーボモータの制御、モーターの回転速度の変化を行うことができるシステムを作りました。プログラムも自分で書きました。回路の作成も自分で作りました。
あとははんだ付けするだけです。
以上のことを聞きたいです。以下は別に読まなくてもいいです

作ろうと思ったきっかけは、twitterを見ていたところ、室内ラジコンというものの存在を知り、面白そうだからやってみようと思った次第です。
ラジコン自体はまだ完成していませんが、現在作成中です。機体作成が考えていたよりも手ごわくて、飛行機に関するノウハウゼロなので、どういう風に作ったらまっすぐ飛んでくれるか見当もつきません。かろうじてBesiegeという攻城兵器を作るゲームで少し航空機のようなものを作っていたので何となくこうすればまっすぐ飛ぶだろ言う予測は尽きますが、実験してみないことには何もわかりません。現在、機体作成に当たり、重量が課題になっております。特に重量物と考えているのが、機体自身の重さと、9V電池を二つ積んでいることです。これをもろともしない揚力...というよりも滑空するための浮力でしょうか。これを稼ぐことのできる翼を作成する必要があります。材料は当初は加工しやすく入手も安易なダンボールで作成しようと思っていましたが、それすらも重量ならば、硬めの画用紙で作るほかないでしょう。また、そうした場合の骨組みは割りばしになります。もっと問題は、電池とarduino、tweriteをどうやって搭載するかという問題です。これは本当にいい搭載方法考えています。何かよさげな筒に入れて、それを中心に翼をくっつける方針でも行けなくはないのでしょうが、やはり、全翼機みたいになりそうです。
縦に一枚立てた段ボールに翼をはやすという方法を今思いつきました。これで明日作成してみます。
カーネルとは、シェルとは、なぜカーネルとシェルが分かれているのか

## はじめに
カーネルとシェルについてまとめてみました。

## カーネルとは
**カーネル**とは、OSの核になる部分、つまりOSそのもののことです。Linuxの場合、カーネルはKernel 4.18.0のように表記されます。Kernelの後に付いている番号が、カーネルのバージョンを表しています。
Linuxのようなオープンソースの世界では、異なるバージョンのカーネルが世界中に存在しています。Windowsのようにメーカーがサポートしてくれるわけではないので、システムの管理者が、自身の判断で最も安定しているカーネルを選択する必要があります。

## シェルとは
**シェル**は、ユーザーの命令をカーネルに伝える機能を持っています。カーネルはハードウェアと密接に関係しており、ユーザーの命令を直接理解する能力がありません。そこで、シェルという窓口を通して、命令をカーネルに伝える必要があります。

## シェルはユーザーとLinuxカーネルの橋渡しを行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/f3ecc3c3-3d15-4960-aecd-8ac2e4a43960.png)

## なぜカーネルとシェルが分かれているのか
「はじめからLinuxカーネルの中に、シェルのような、キーボードからコマンド操作できる機能を取り込んでおけばよいのに。そうすれば、わざわざシェルなんてものを別に用意する必要もないだろう」と思った方もいるでっしょう。なぜカーネルとシェルが別々に提供されているのでしょうか。これは、以下のようにLinuxカーネルとシェルを分離しておいた方がよい点が多々あるためです。

・Linuxカーネルいは手を入れずに、シェルだけを自分好みのものに変更することができる
・Linux以外のOS(FreeBSDやNetBSD、Solarisなど)を利用する際も、シェルが移植されていれば操作を同様に行うことができる
・シェルがエラーや高負荷状態になってクラッシュしたとしても、OS本体であるLinuxカーネルへの影響を最小限に抑えることができる

ここには、Linuxの「1つのプログラムには、1つのことをうまくやらせる」という考え方を見て取ることができます。1つのプログラムにあれもこれもと機能を詰め込まず、機能ごとにプログラムを分離しておくことが、ソフトウェア開発においては重要なことなのです。

## おわりに
ここまで読んでいただきありがとうございます！


## 参考文献
・Linuxの絵本 サーバーOSが楽しくわかる9つの扉 単行本（ソフトカバー） – 2020/1/20
株式会社アンク (著)　p.8-9
・新しいLinuxの教科書　三宅 英明 (著), 大角 祐介 (著) 　p.27
・「パソコンを使う動物」のイラスト素材
https://www.ac-illust.com/main/search_result.php?word=%E8%89%B6%E7%BE%8E&search_word=%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%86%E5%8B%95%E7%89%A9&page=0
【Mac】SDカードの初期化

# 記事概要
MacでSDカードを初期化する方法について、まとめる。

# 前提
- PCはMacを使用している

# 手順
1. SDカードをMacに接続する
1. Finderを開く
1. アプリケーション＞ユーティリティ＞ディスクユーティリティ　をクリックする
1. 初期化するSDカードを選択する
1. 上部にある`消去`をクリックする
    [![Image from Gyazo](https://i.gyazo.com/90e2abfcd34beb263b3981b36d5210a7.png)](https://gyazo.com/90e2abfcd34beb263b3981b36d5210a7)
1. フォーマットを選択する
    - SDカードが32GB以下の場合、フォーマットは`MS-DOS(FAT)`
    - SDカードが64GBの場合は、フォーマットは`exFAT`
1. SDカードを他人に譲渡する場合、セキュリティオプションで`最も安全`を選択し、OKをクリックする
    - 処理に時間がかかるので注意
1. 消去をクリックし、SDカードを初期化する
    [![Image from Gyazo](https://i.gyazo.com/14864bb8ba8b191ead732ce373cb2d3c.png)](https://gyazo.com/14864bb8ba8b191ead732ce373cb2d3c)
PHPで「break」の動作を確認してみた。

# 概要

PHPで「break」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/php/for/index3.html

# 実装

以下のファイルを作成しました。

```sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
<?php
$count = 1;
$sum = 0;

while ($count <= 100){
  $sum += $count;

  if ($sum > 1000){
    print '1000を越えたので count = '.$count.' で終了します<br />';
    break;
  }

  $count += 1;
}
print 'sum = '.$sum;
?>
</p>

</body>
</html>
```

以下のコマンドを実行しました。

```
$ php sample.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
1000を越えたので count = 45 で終了します<br />sum = 1035</p>

</body>
</html>
```

# まとめ

何かの役に立てばと。
Laravel 画像の`403 forbidden` エラーの修正手順

# Laravel 画像の`403 forbidden` エラーの修正手順


![スクリーンショット 2025-03-13 17.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4034432/5a82fa1b-95ad-4980-b386-a063ee29c120.png)

上の画像のように画像を入力フォームに入れたが、表示されない時があります。

![スクリーンショット 2025-03-13 17.21.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4034432/0c6dc152-b755-4cdc-bdcc-e5a5eda03f25.png)

このように入力した画像へのurlを見てみると403 forbiddenと表示られてしまいます。


## 1. コンテナ内に入る
まず以下のコードを実行してコンテナ内に入ります。

```bash
./vendor/bin/sail shell
```

## 2. public/storage のシンボリックリンクを作成

Laravelでは、public/storage は storage/app/public にリンクされている必要があります。
以下のコマンドを実行して、シンボリックリンクを作成してください。

```bash
php artisan storage:link
```
![スクリーンショット 2025-03-13 17.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4034432/814f949c-2ee6-48da-a3fd-b745d655ef5d.png)

---

## 3. パーミッションの設定
以下のコマンドで、適切なパーミッションを設定します。


```bash
chown -R sail:sail storage storage
chmod -R 775 storage storage
chown -R sail:sail storage public/storage
chmod -R 775 storage public/storage
```

---


## 5. 確認

```bash
sail down
sail up -d
```
上のコードを実行した後もう一度サイトを見ると、、、![スクリーンショット 2025-03-13 17.37.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4034432/f30ed53b-4877-45de-868c-fd6ba73af645.png)


これで `public/storage` のエラーが解決したことを確認できました。
【VBA】UI構築の一例【自分用備忘録】

急遽必要になったので（第二弾）
## 1. 数値データ, 画像, 警告の表示

```
' 数値を動的に更新する例
Label_BP.Caption = "血圧: " & bloodPressure & " mmHg"
Label_HR.Caption = "心拍数: " & heartRate & " bpm"

' 画像をUserForm上のImageコントロールに表示する
Image1.Picture = LoadPicture("C:\Data\ECG_Image.jpg")

' 入力フォームから患者情報を取得
Dim patientID As String
patientID = TextBox_ID.Text
MsgBox "患者ID: " & patientID

If bloodPressure > 180 Then
    Label_BP.ForeColor = vbRed
    MsgBox "Warn!", vbCritical
End If
```

## 2. レポート作成・データエクスポート


Excelにデータを書き出す
```
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Data")
ws.Cells(2, 1).Value = bloodPressure  ' B1セルに血圧を書き込む
```


## 3.  心拍数 & 血圧を管理するシンプルなUserForm
機能
✅ TextBoxで数値入力
✅ 異常値ならラベルが赤く変化
✅ ボタンを押すとCSVに保存
```
Private Sub CommandButton1_Click()
    Dim bloodPressure As Integer
    Dim heartRate As Integer

    ' テキストボックスの値を取得
    bloodPressure = CInt(TextBox_BP.Text)
    heartRate = CInt(TextBox_HR.Text)

    ' 異常値チェック（血圧 180 以上で警告）
    If bloodPressure >= 180 Then
        Label_BP.ForeColor = vbRed
        MsgBox "Warn!", vbCritical
    Else
        Label_BP.ForeColor = vbBlack
    End If

    ' CSVに保存
    Dim filePath As String
    filePath = "C:\Data\MedicalData.csv"
    
    Dim fileNo As Integer
    fileNo = FreeFile

    Open filePath For Append As #fileNo
    Print #fileNo, Date & "," & bloodPressure & "," & heartRate
    Close #fileNo

    MsgBox "データを保存しました。", vbInformation
End Sub
```

- 実装手順
1. UserFormを作成
2. TextBox（TextBox_BP , TextBox_HR）を配置
3. ラベル（Label_BP）とボタン（CommandButton1）を配置
4. 上記のコードをボタンのClickイベントに設定
5. 実行すると、異常値でアラートが出る & CSVにデータ保存
（備忘録）OpenSSLで自己証明書を作成しました

HTTPS通信を行うためのドメインがなかったので、OpenSSLで自己証明書を作成しました。

# OpenSSLのインストール
まずOpenSSLというツールをインストールします。
こちらの記事を参考に以下のことを行いました。

https://atmarkit.itmedia.co.jp/ait/articles/1601/29/news043.html


・OpenSSLのインストーラーをダウンロード（今回はWin64 OpenSSL v3.4.1のEXEをダウンロードしました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980363/e50b1271-4aa1-4a89-8458-c23ced498e0b.png)
・Visual C++再配布パッケージのインストール
・インストーラーを起動し、インストール
・環境変数にopenssl.exeへのパスを登録
・バージョン確認

以下のように実行してエラーが出る場合は管理者権限でコマンドプロンプトを実行すると上手くいくかもしれません。（私がそうでした）

# 自己証明書の作成
### 1.秘密鍵の作成
```
openssl genrsa -out server.key 2048
```
2048ビットのRSA秘密鍵を生成し、server.keyファイルに保存しています。

実行して以下のようなエラーが出る場合は管理者権限でコマンドプロンプトを実行すると上手くいくかもしれません。（私がそうでした）
```
C:\>openssl genrsa -out server.key 2048
genrsa: Can't open "server.key" for writing, Permission denied
```
### 2.証明書署名要求（CSR）の作成
```
openssl req -new -key server.key -out server.csr
```
実行すると以下のような情報の入力を求められます。
```
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
A challenge password []:
An optional company name []:
```

・Country Name (国コード): 例えば「JP」
・State or Province Name (都道府県): 例えば「Tokyo」
・Locality Name (市区町村): 例えば「Minato-ku」
・Organization Name (組織名): 例えば「My Company」
・Organizational Unit Name (部署名): 例えば「IT Department」
・Common Name (サーバー名/ドメイン名): 例えば「example.com」や「localhost」
・Email Address (メールアドレス): 任意
・A challenge password (チャレンジパスワード): 空欄でも可
・An optional company name (任意の会社名): 空欄でも可

### 3.自己証明書の作成
```
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
```
作成した秘密鍵とCSRから365日間有効な自己証明書が生成されます。
### 4.確認
以下２つのコマンドの実行結果を比較して同じ出力であれば、秘密鍵と証明書が対応していることが確認できます。
```
openssl x509 -in server.crt -noout -modulus | openssl md5
```
```
openssl rsa -in server.key -noout -modulus | openssl md5
```

server.crtやserver.keyなどの作成されたファイルはコマンドを実行したディレクトリに保存されています。

ファイルの中身が以下のような形式になっていたらOKです。
-----BEGIN PRIVATE KEY-----
～
～
～
-----END PRIVATE KEY-----
ビット演算とBitwiseについて理解する

# はじめに
ビット演算の理解とelixirのライブラリであるBitwiseを使った実装ができるようになることを目指す

# ビット演算とは？
> ビット演算は、データを2進数で表して演算するものです。
ビット演算には、「ビット単位の論理演算」と「ビット単位のシフト演算」があります。
ビットは、「2進数の桁」という意味です。ビット単位の論理演算は、2つの2進数のデータで桁ごとに論理演算を行います。

https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kind_basic_theory/bitwise-operation/

論理回路については以下を参照

https://www.ritsumei.ac.jp/~nokata/RoboEx1figures/logic.htm

# Bitwiseとは？
> A set of functions that perform calculations on bits.

訳：ビットに対して計算を実行する関数のセット。

実際にLivebook上で検証をしてみる

```elixir
Bitwise.band(7, 4)
> 4

Bitwise.band(9, 3)
> 1
```

bandは引数のビットごとのANDを計算する

## Bitwise.band(7, 4)を読み解く
7を2進数で表現すると
111となる
4を2進数で表現すると
100となる
この2つの数値を比較しビットごとのANDを計算すると
100となる
100は10進数に直すと4となるため4が出力される

## 同様にBitwise.band(9, 3)を読み解く
9を2進数で表現すると
10001となる
3を2進数で表現すると
11となる
ビットごとのANDを計算すると
1となる
1を10進数に直すと1になるため1が出力される

https://hexdocs.pm/elixir/Bitwise.html
主張

以下は、これまでの軸（配布の簡便性、プロト作成・開発スピード、メンテナンス性、拡張性・高機能性、セキュリティ・依存リスク、既存システムとの統合性）に基づき、複数のユースケース（Excel‐VBA、Python CLI/Tk、Python Web、Python Web経由でExcel生成、PowerApps、Copilot365）について、各評価項目を1～5のスコア（5が優れている）で採点した例になります。あくまで目安なので、実際の環境・要求に合わせて調整してください。

────────────────────────────
【評価軸とスコア表（各5段階評価）】

方式

配布簡便性

開発スピード　

メンテナンス

拡張性・高機能性　

セキュリティ　

統合性 

 Excel‐VBA（Copilot‐API利用）

5

3

3

3

4

4

Python CLI/Tk（ローカル実行）

2

4

3

5

3

3

Python Web（Webアプリとして提供） 

4

4

3

5

3

3

 Python Web経由でExcel生成（アップロード→組込→DL） 

5

3

3

4

3

4

 PowerApps 

4

4

4

3

4

5

Copilot365

5

5

4

4

4

5

　　　
【各項目の簡単な解説】

■ 配布簡便性
　・Excel‐VBA／Python Web経由Excel生成／Copilot365：ユーザは完成済みExcel（またはOffice環境内）で動作するため、導入が容易。
　・Python CLI/Tk：実行環境（Python等）のセットアップが必要。

■ 開発スピード
　・Python（特にCLI/TkやWeb）は豊富なライブラリ・フレームワークの恩恵で迅速。
　・Copilot365の場合、AI支援によるコード生成・改善でさらに高速化が期待できる。
　・Excel‐VBAは習熟や独自ノウハウが必要なため、初期開発はやや遅れがち。

■ メンテナンス
　・PowerAppsやCopilot365はクラウド中心で一元管理されやすい。
　・一方、Python系は環境依存やライブラリの更新により注意が必要。
　・Excel‐VBAは既存の社内資産を活かしつつも、専門知識が求められる場合あり。

■ 拡張性・高機能性
　・Python Web系は自由度が高く、最新のUI・機能にも柔軟に対応可能。
　・Excel‐VBAは業務自動化には有用だが、リッチなインターフェース実現には限界がある。
　・PowerAppsは低コードながら標準機能で迅速にアプリ化できるが、細かい拡張はPlatform依存。
　・Copilot365はAIの活用で未来の機能拡張性が期待できる。

■ セキュリティ・依存リスク
　・各手法ともに、環境設定と運用ルール次第ではありますが、オフィス環境／エンタープライズ向けの対策が取られているものは高評価。
　・Python系は外部ライブラリに依存するため、アップデートや脆弱性管理が必須。

■ 統合性（既存システム等との連携）
　・PowerAppsやCopilot365はOffice365環境及び各種業務システムと深く統合しやすい。
　・Excel‐VBAも社内システムとの連携実績は豊富。
　・一方、Python Web系は、場合によってはAPI連携など自前の実装が必要。

────────────────────────────
【まとめ】

このスコア表は、IT戦国時代といわれる現在、PowerApps や Copilot365 のような最新プラットフォームと、既存のExcel‐VBAやPython系手法それぞれの利点・注意点を整理するために有用です。
・ユーザの環境、現状のシステム、開発リソースなどと合わせて、どの軸が最も重要か判断のうえ、総合的に採用候補を検討してみてください。
log.message=Cannot invoke "jp.co.intra_mart.foundation.database.DbTypes.ordinal()" because "type" is null の対処法

ネットに情報がないので放流用
適切なエラーメッセージが出ないため、IM力が試されるエラーである。

・事象
intra-martのテナント環境セットアップで設定をミスると
log.message=Cannot invoke "jp.co.intra_mart.foundation.database.DbTypes.ordinal()" because "type" is null
となる

・原因
https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/create_war/configuration_file_datasource.html#configuration-file-datasource-mapping
にあるように
/conf/data-source-mapping-config.xml
に設定されている<tenant-id>とテナント環境セットアップ時のtenantidが違う場合に発生する。

誰かの助けになりますように。。。