OmniAICreator/Qiita-1.07M huggingface dataset:
rex0220 印刷屋プラグイン ボタン表示制御

[rex0220 印刷屋プラグイン](https://qiita.com/rex0220/items/9be2d9b20a3a1f016c76)で、見積書発行のボタンに表示条件を設定します。

# 概要

印刷屋プラグインでは、帳票ごとにボタン表示条件を設定できます。

下記の例は、見積ファイルにファイルが無ければ、「見積書」ボタンを表示します。
見積書発行で見積ファイルに PDF が保存されると、それ以降は「見積書」ボタンを表示しません。
一覧画面で一括処理する場合もボタン表示の対象外のレコードは、見積書の処理対象外になります。

![2025-03-04_09h44_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f0eb5ca1-43cd-4706-9f64-b283461f5f11.png)

![2025-03-04_09h46_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c893a5af-7697-4cfd-8741-72dd2d9c8646.png)

![2025-03-04_09h47_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c7cc599d-9062-44d5-b7e2-dfe4843671ee.png)


# 印刷屋プラグイン設定

ファイルに「見積ファイル」を指定することで、見積書発行時にレコードへ PDF を保存します。
ボタン表示条件に「NOT(見積ファイル)」を設定することで、ファイルの添付状態をチェックします。

![2025-03-04_09h37_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/313e9bf8-d968-441d-b917-005469afea2a.png)

![2025-03-04_09h38_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/110466a9-7b03-4f67-8877-56636a730a5f.png)
Databricks にて Iceberg 参照する際の Byte-buffer read unsupported by com.databricks.common.filesystem.LokiAbfsInputStream への対応方法

### 概要

Databricks Runtime 14.3上で Apache iceberg 形式のデータからデータフレームを作成する際の下記エラーへの対応方法を共有します。下記エラーは Databricks 仕様により発生するため、Databricks Runtime 16.0 以降のクラスターで実行すれば動作するようです。対応方法を共有します。

> UnsupportedOperationException: Byte-buffer read unsupported by com.databricks.common.filesystem.LokiAbfsInputStream
> org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 3) (10.139.64.13 executor driver): java.lang.UnsupportedOperationException: Byte-buffer read unsupported by com.databricks.common.filesystem.LokiAbfsInputStream

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b4b4f7e8-f8ba-4252-a049-8c82cbf718ae.png)

対応方法については、 Apache Iceberg の下記の Issue にて言及されておりました。

- [Byte-buffer read unsupported by org.apache.hadoop.fs.BufferedFSInputStream across multiple iceberg versions on 14.3 LTS databricks, Spark 3.5 Scala 2.12 · Issue #10808 · apache/iceberg](https://github.com/apache/iceberg/issues/10808)

## 事前準備

下記記事の事前準備と同様の手順を実施してください。

- [Databricks にて Apache Iceberg のテーブルディレクトリからデータを取得する方法の検証 #Spark - Qiita](https://qiita.com/manabian/items/24114e65a10696d71dd9)

## エラーの再現方法

```python
df = spark.read.format("org.apache.iceberg.spark.source.IcebergSource").load(table_dir)
df.printSchema()
df.display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b4b4f7e8-f8ba-4252-a049-8c82cbf718ae.png)

## 対応方法

### 1. Databricks Runtime 16.0 以降のクラスターを作成

Databricks Runtime 16.X のクラスターを、アクセスモードを`分離なし共有`に、 Spark 3.5 の Apache Iceberg 関連のライブラリをインストールに、それぞれ設定して作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bf901882-dbb7-440a-8daf-40d2ed882086.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ff36c88f-f6e4-4a64-829c-77573b5051cf.png)

### 2. コードが正常に動作することを確認

```python
df = spark.read.format("org.apache.iceberg.spark.source.IcebergSource").load(table_dir)
df.printSchema()
df.display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9456fdc6-594f-47d9-b174-bf7c86efbede.png)
[記録][Ubuntu]FileMaker Server で、PHP を FastCGI 版に変更

 ちょっと、作業自体、現時点のものではないのですが、記録として投稿します。

 [XServer VPS](https://vps.xserver.ne.jp) の Ubuntu 22.04 イメージを使って、FileMaker Server をインストールして使っています。しかし、Ubuntu 22.04 イメージ では、FastCGI 版が有効にないので変更しました。その時の記録です。

## PHP を FastCGI 版へ変更
```
sudo apt-get --purge remove php8*
sudo apt install php-fpm
```

## Ubuntu 版 FileMaker Server で、PHP 有効化

 Mac 版は Apache ですが、Ubuntu 版は nginx になっています。

 default をバックアップして、内容を書き換えます。
```
cd /etc/nginx/sites-available/
sudo cp default default_backup
sudo vi default
```

 以下の部分を書き換えました。
```
#location ~ \.php$ {
        #include snippets/fastcgi-php.conf;
location ~ \.php$ {
        include snippets/fastcgi-php.conf;

    （〜 略 〜）

        #      fastcgi_pass unix:/run/php/php7.4-fpm.sock;
               fastcgi_pass unix:/run/php/php8.1-fpm.sock;

    （〜 略 〜）

        }
```

 fms_nginx.conf というファイルがあるので、バックアップして書き換えます。

```
cd /opt/FileMaker/FileMaker\ Server/NginxServer/conf/
cp fms_nginx.conf fms_nginx.conf_default
vi fms_nginx.conf
```

```
#index index.html index.htm index.nginx-debian.html;
index index.php index.html index.htm index.nginx-debian.html;
```

## 再起動
`sudo systemctl restart nginx` より、VPS 自体を再起動することをお勧めします。

 再起動後、FileMaker Server で PHP が使えるようになります。
[Poke-Pro]PC-G850(ポケコン)で関数グラフ描画

# [新企画]Poke-Pro
今回、新たに開始する企画`Poke-Pro`では、ポケコンで作成したプログラムを投稿していく企画です。シリーズとなります。BASIC言語に軸を置き、気まぐれでC言語にも触れていきます。

## はじめに
こんにちは、bockringです。シリーズ投稿の1本目は、**関数グラフの描画**です。

## 描画する関数
今回は、$y=f(x)=ln(x)$のグラフを描画します。これを[GeoGebra](https://www.geogebra.org/calculator)に描画させると以下の様になります。
![IMG_0358.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/dff0750c-684f-4af7-ba6e-39b604d80b7e.jpeg)

当たり前ですが綺麗に描画できています。

今回はこれをポケコンのフルグラフィック液晶に描画させていきます。

そのために少しずつ式は変更しています。

## 目標と妥協点
まず目標です。以下の点を実装します。
- X軸とY軸の軸線の描画
- 軸線の端(画面端)に`X`,`Y`ラベルを表示
- 1pxの移動でXは0.1変化

逆に妥協点は、
- 描画速度(機械語での描画はしません)
- 座標の表示
- 点と点の間の線
- 表示範囲の自動調整

などです。これらを踏まえて実装します。

## 実装
BASICで実装します。ポケコンの液晶は点灯/無点灯の2レベルですから、明暗度と色の設定は不要です。`PSET (X,Y)`で点を打てます。

```basic:GRAPHln.TXT
10 CLS :PRINT "Y":PRINT "":PRINT "                       X"
20 LINE (0,23)-(143,23)
30 LINE (6,0)-(6,47)
40 FOR X=0.1 TO 14.3 STEP 0.1
50 Y=47-8*( LN X)
60 PSET (10*X+6,Y-23)
70 NEXT X
80 PRINT "":PRINT ""
```

これがコードです。スマートでないことは重々承知なのですが、自動調整というのは難しすぎて追加できませんでした。

このコードを実行すると以下の様になります。
![IMG_0357.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/a41b3538-b868-44c6-90d3-8ccc25fe642e.jpeg)

そこそこ綺麗に自然対数のグラフが描けているんじゃないかなと思います。

## 改善点
- 軸線の端に端の地点の座標の表示
- 画面の空きスペースに表示している関数を表示

といったところです。

## おわりに
前回のレビュー記事とは逆に短めの記事をシリーズとして投稿していきます。

今後も短時間で読める記事をこのシリーズで投稿していく予定です。

---

シリーズ記事の一覧

https://qiita.com/bockring/private/0cc7d2fbbdad53b25c1b

---
ポジティブ/ネガティブフラグを作成する(SPSS Modeler データ加工逆引き13-10)

# ポジティブ/ネガティブフラグを作成する

![スクリーンショット 2025-02-24 11.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f2d1729e-45b4-43d8-9c3f-46b9ab2489af.png)

この記事はSPSS Modeler Premium Ver18.6から追加された日本語テキスト機能を利用して書いています。SPSS Modeler Professionalをお使いの方はアップグレードするかPython連携を用いて実現します。

Python連携を紹介する記事はこちら

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

## 1.想定される利用目的

・文章に含まれるポジティブ/ネガティブの要素をフラグにして集計可能にする。

## 2.ストリームとデータのダウンロード

ストリーム

https://github.com/yoichiro0903n/blue/raw/refs/heads/main/emotional.str

## 3.サンプルストリームの説明

![スクリーンショット 2025-02-24 11.50.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9090f462-23b0-4be3-8255-1002b9a04f9c.png)

a.入力データは以下の通りです。

![スクリーンショット 2025-02-24 11.52.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/40c96506-b7c3-41da-a989-e0075568b379.png)

b.[テキストマイニング]ノードを編集します。[IDフィールド]と[テキストフィールド]を以下の通り選択します。

![スクリーンショット 2025-02-24 11.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f98790bb-c67d-46a9-8f48-2e90288976ef.png)

[モデル]タブを編集します。[抽出結果を利用して...]を選択します。感情を識別するために[リソーステンプレート]を[読み込み]ボタンを押して[Opinions(Japanese)]を選択します。

![スクリーンショット 2025-02-24 11.52.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7fd1a1a6-a07e-477b-bbdf-b09aa37d4fef.png)

[実行]します。抽出したコンセプトの３つの[Negative]タイプを指定して[カテゴリーに追加]ボタンを押します。
![スクリーンショット 2025-02-24 11.54.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fd316c7f-2269-4076-aa89-689580e3dfeb.png)

[カテゴリーを新規作成]で[OK]します。
![スクリーンショット 2025-02-24 11.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/caa00d88-abea-46f7-81c1-2b9edcb99f93.png)

[カテゴリー名を変更]し[ネガティブ]にします。
![スクリーンショット 2025-02-24 11.56.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5a9f7ea4-8674-4b99-b055-6664ccf26e2d.png)

同じようにポジティブを作成します。[ほしい]は[wish]と分類されていますが含めます。

![スクリーンショット 2025-02-24 11.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b93b1e18-0c37-4c9b-93a5-0b96204bea3c.png)

ネガティブとポジティブのカテゴリにそれぞれ３つのコンセプトが登録されました。[モデルを作成]ボタンを押します。cが作成されます。

![スクリーンショット 2025-02-24 11.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0fa04a13-9736-4970-baf4-3225f383aa10.png)

c.[テキストマイニング]ナゲットを編集します。[設定タブ]で真偽をT/Fから1/0へ[フィールド名拡張子]をブランクにします。

![スクリーンショット 2025-02-24 11.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a075eadd-c39d-4b68-9b55-90141b9ec9f0.png)



#### 注意事項

ネガティブが機能、サービス、価格の何を対象にした評価なのかを階層化して持たせるとより情報量が上がります。

## 4.参考情報

#### Python連携によるテキストマイニング

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008
[Python / numpy] AttributeError: module 'numpy' has no attribute 'long' の対策

`AttributeError: module 'numpy' has no attribute 'long'` というエラーが発生したので対処した。

# 1. 前提 / 環境情報

以下の環境で発生

item|version
--|--
Ubuntu|20.04.6 LTS
Python|3.8.20
mmdet3d (mmdetection3d)|0.17.2
numba|0.48.0
numpy|1.24.4


# 2. エラー発生状況

```bash
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/work_dir/MapTR/projects/mmdet3d_plugin/__init__.py", line 5, in <module>
    from .datasets.pipelines import (
  File "/work_dir/MapTR/projects/mmdet3d_plugin/datasets/__init__.py", line 1, in <module>
    from .nuscenes_dataset import CustomNuScenesDataset
  File "/work_dir/MapTR/projects/mmdet3d_plugin/datasets/nuscenes_dataset.py", line 5, in <module>
    from mmdet3d.datasets import NuScenesDataset
  File "/work_dir/MapTR/mmdetection3d/mmdet3d/datasets/__init__.py", line 4, in <module>
    from .custom_3d import Custom3DDataset
  File "/work_dir/MapTR/mmdetection3d/mmdet3d/datasets/custom_3d.py", line 10, in <module>
    from ..core.bbox import get_box_type
  File "/work_dir/MapTR/mmdetection3d/mmdet3d/core/__init__.py", line 4, in <module>
    from .evaluation import *  # noqa: F401, F403
  File "/work_dir/MapTR/mmdetection3d/mmdet3d/core/evaluation/__init__.py", line 3, in <module>
    from .kitti_utils import kitti_eval, kitti_eval_coco_style
  File "/work_dir/MapTR/mmdetection3d/mmdet3d/core/evaluation/kitti_utils/__init__.py", line 2, in <module>
    from .eval import kitti_eval, kitti_eval_coco_style
  File "/work_dir/MapTR/mmdetection3d/mmdet3d/core/evaluation/kitti_utils/eval.py", line 4, in <module>
    import numba
  File "/usr/local/lib/python3.8/site-packages/numba/__init__.py", line 15, in <module>
    from . import config, errors, _runtests as runtests, types
  File "/usr/local/lib/python3.8/site-packages/numba/types/__init__.py", line 110, in <module>
    long_ = _make_signed(np.long)
  File "/usr/local/lib/python3.8/site-packages/numpy/__init__.py", line 320, in __getattr__
    raise AttributeError("module {!r} has no attribute "
AttributeError: module 'numpy' has no attribute 'long'
```

# 3. 解決策

```bash
pip install numpy==1.23.0
```

https://stackoverflow.com/a/77858628/8674852

どうやら、 numpy が新しすぎたため、古いライブラリが依存している `long` という属性が使えなくてエラーが出ていたらしい。
【Flutter】photo_viewer を使ってSNS系のアプリをよりいいものにする

![スクリーンショット 2025-03-04 8.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/cb7d3905-8351-4e5b-b6e4-65f78989330c.png)

# はじめに
これから紹介するPackagesを使うことで自分の作成しているアプリである「FoodGram」というフードシェアアプリにおいて、とても効果的かつ、よりいいアプリになると確信できたため、採用し、実装を進めました。

# Packagesについて

僕の知り合いの方が2025/03/01に公開して、その内容を「Flutter Tokyo #5」 で登壇されていたようです。（僕は別件で参加できませんでした🥲）

https://pub.dev/packages/photo_viewer

https://x.com/kumamo_tone/status/1895807703873986582


# 実装したい内容
- タップすると画像を詳しく見るようにしたい

## すでに実装している内容　
- 画像をダブルタップすると、いいねをする
- 画面遷移のアニメーションに`Heroine`という画面遷移のアニメーションを採用する


# 実装してみた
- 実装にあたって開発者であるくまもんさんがリプをしていただき、アドバイスをしてくれました。既存の実装にある`GestureDetector`を`PhotoViewerImage`でも使っている点や`Heroine`と`DragDismissable`が競合しているかもしれなかったので、実装に工夫が必要そうでした。


## 実装前

```dart
GestureDetector(
  // いいねをする処理
  onDoubleTap: handleHeart,
  child: DragDismissable(
    // 画像を右or左スワイプをすると閉じる処理
    onDismiss: () => context.pop(),
    //HeroineというPackagesを使用（画面遷移のアニメーション）
    child: Heroine(
      tag: 'image-${posts.id}',
      child: Container(
        width: deviceWidth,
        height: deviceWidth,
        color: Colors.white,
        child: CachedNetworkImage(
          imageUrl: supabase.storage
              .from('food')
              .getPublicUrl(posts.foodImage),
          fit: BoxFit.cover,
        ),
      ),
    ),
  ),
),

```

## 実装後
アドバイスをいただきながら開発できました。ありがとうございます🙇

```dart
DragDismissable(
  onDismiss: () => context.pop(),
  child: GestureDetector(
    onTap: () {
      showPhotoViewer(
        context: context,
        heroTagBuilder: (context) => 'image-${posts.id}',
        builder: (context) => Container(
          width: deviceWidth,
          height: deviceWidth,
          color: Colors.white,
          child: CachedNetworkImage(
            imageUrl: supabase.storage
                .from('food')
                .getPublicUrl(posts.foodImage)
            fit: BoxFit.cover,
          ),
        ),
      );
    },
    onDoubleTap: handleHeart,
    child: Heroine(
      tag: 'image-${posts.id}',
      child: Container(
        width: deviceWidth,
        height: deviceWidth,
        color: Colors.white,
        child: CachedNetworkImage(
          imageUrl: supabase.storage
              .from('food')
              .getPublicUrl(posts.foodImage),
          fit: BoxFit.cover,
        ),
      ),
    ),
  ),

```


# 完成したアプリの動画


https://x.com/isekiryu/status/1896706477806776737


# 最後に
アプリを個人で開発しています･:*+.\(( °ω° ))/.:+

![Group 93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/318bb611-4e87-6c02-6a2c-2c5bb93c392a.png)


### ダウンロードリンク

https://apps.apple.com/jp/app/foodgram/id6474065183

https://play.google.com/store/apps/details?id=com.food_gram_app.com.com.com


- 「FoodGram」は、フードシェアアプリとなっており、あなたの好きなレストランの食事をぜひこのアプリで共有していただけると嬉しいです!!

<b>このアプリのセールスポイント
- このアプリだけのレストランマップをユーザー全員で作成できる⭐️



ぜひダウンロードして使ってくれると嬉しいです🙇
Streamlitの使い方（超入門）

# Webブラウザを利用したファイル選択ダイアログボックスの作り方

PythonのStreamlitというパッケージを用いて，Webブラウザでファイル選択するダイアログボックスを作成する例を示します．


```Select_File.py
import streamlit as st
import pandas as pd

st.title("Excel File Uploader")

# ファイルアップローダーでExcelファイルを選択
uploaded_files = st.file_uploader("Choose Excel files", accept_multiple_files=True, type="xlsx")

if uploaded_files:
    file_names = [file.name for file in uploaded_files]
    
    # プルダウンメニューでファイル名を選択
    selected_file_name = st.selectbox("Select a file", file_names)
    
    # 選択したファイルを読み込む
    for file in uploaded_files:
        if file.name == selected_file_name:
            df = pd.read_excel(file)
            st.write("File name:", selected_file_name)
            st.dataframe(df)
```

## このPythonスクリプトの実行方法
１．コマンドプロンプトを管理者で実行
２．以下のプロンプトを入力してリターンキーを押す
　　　　streamlit run Select_file.py
すると規定のブラウザが立ち上がる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/f8b5ca8c-27e4-44c8-85c6-fe6176b3860a.png)

ブラウザ上で，ファイル選択のダイアログボックスGUIが出来上がる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/a2c0967e-258e-4f76-a5c7-12fc8809d234.png)
家計簿アプリを作る＃６

![スクリーンショット 2025-03-04 083710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/3c55f62d-3b79-45ff-bd91-32c0158c891a.png)

HomeとReportを両方ともApp.tsxでインポートします。

![スクリーンショット 2025-03-04 083902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/e9085c22-c472-44b3-87d0-831bea3ec226.png)
Homeと表示されています。

![スクリーンショット 2025-03-04 084001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/63bce47c-d883-423a-878a-07c1d325a1eb.png)
URLに/Reportとすると、Reportが表示されます。

![スクリーンショット 2025-03-04 084154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/336a232d-1d65-459a-b4e5-d099af99d953.png)
URLがHomeとReport以外の時の設定として、pathを＊にして、elementをNomath /として、設定します。
40過ぎたおじさんが、JAWS DAYSにボランティアスタッフとして参加して

# はじめに
2025/3/1に開催されたJAWS DAYS 2025にボランティアスタッフとして参加しました。
経験したこと、感じたこと、今後の所信表明も含めて、自分自身があとで振り返れるように残しておきます。
技術的なお話はありません。ご了承ください。

# JAWS DAYSとは
公式サイトには、以下のように記載されています。

>JAWS-UG（AWS User Group – Japan）は、日本全国に60以上の支部を持つ Amazon Web Services（以下AWS）のユーザーグループです。全国の各支部では、AWSに関する技術交流や人材交流が毎週のように行われ、AWSユーザーの技術力向上およびビジネスの拡大に寄与しています。
>
>JAWS DAYSは主催JAWS-UG、後援アマゾン ウェブ サービス ジャパン合同会社で行われるJAWS-UG最大のイベントです。全国のJAWS-UGメンバーが中心となってイベントの企画、準備を行い、最新技術からビジネス、ライフスタイルなどAWSに関わる幅広いテーマでセッションが予定されています。
>
>AWS初心者から上級者までのエンジニア、経営者や人事、マーケティング、エンタープライズからスタートアップ、中小企業など職種や業態・会社規模を問わず、たくさんの方に参加いただけるイベントです。

https://jawsdays2025.jaws-ug.jp/

AWSに興味を持ったら、まず参加してみることを推奨します。
私は昨年のJAWS DAYS 2024に、ぼっちで初めて参加しました。そして今回、2回目の参加です。
そう、たった2回しか参加していませんが、偉そうに推奨してます。

# ボランティアスタッフに申し込んだ経緯
　[昨年12月のJAWS-UGのAdvent Calender](https://qiita.com/sh_fk2/items/77e9c82363abefc46abf)に書いていましたが、ここ2年ほど、コミュニティに色々参加して来ましたが、Takeの立場が大多数でした。昨年12月ごろからLT登壇のチャンスをいただき、ようやくGiveの立場を少しずつ経験できるようになってきました。自分自身に次の変化を起こしたいな、いつもと違う立場でJAWS-UGのイベントに参加したいなと思い、ボランティアに申し込みました。

　ちなみに、初回参加の昨年は周りをみる余裕もなく舞い上がっていたので、ボランティアの方が当日、どういったことをされているのかまったく把握できていませんでした。ただ、絶対楽しいだろうなと勝手に想像して申し込みました。

　その後、JAWS-UG他のイベント、忘年会などに参加した際に、他の参加者の方々とお話をしている中で、他にもボランティアスタッフに申し込んだという方が多数いらっしゃって安心しました。

# 事前準備
　ボランティアスタッフ向けの事前説明会もオンラインで開催されて、当日の流れや注意事項などを実行委員の方から直接お聞きすることができました。また、担当ごとにマニュアルも準備されていて、それに対する経験者の方からのナレッジの共有もあったりと、参加前からみなさんのイベントに対する熱量を感じることができました。

# 当日の担務　セッション担当（タイムキーパー）
　今回、私が担当したのはセッションのタイムキーパーでした。登壇されている方に、残り時間をカンペを使ってお伝えしつつ、残り1分でベルを鳴らすお仕事です（カンペを見て、頷いていただいた心優しい登壇者の方、気を使わせてしまってすみません）。

　今回のお仕事ですが、控えめに言って、最高でした。

 「個人サポーター」という最前列で聴講する権利を持った方々と同じ並び（つまり最前列）で、お仕事しながら聴講できるという環境でした（動き回っていた実行委員、ボランティアスタッフのみなさま、大変申し訳ありません）。発表内容が面白いので、話に熱中しすぎて時間を伝えるのを忘れないようにと、腕時計とタブレットとスマホの3つのタイマーを駆使しながら働きました。そして、あっという間に担当の半日が終わりました。
 
# 今回のJAWS DAYSを振り返ってみて
　当日は8:15にボランティアスタッフとして集合して、実行委員の方から説明を聞いた後、チームに分かれて顔合わせや準備をしたりして、すぐに10:00の基調講演が始まりました。その後は同時並行で開催される魅力的なセッションの数々。身体1つでは足りません。
　スポンサーブースもたくさん回りたかったのですが、現在使っているサービスの企業の方にフィードバックをお伝えしつつ、今月ハンズオンに参加するサービスの企業の方にお話を伺ったりしていたら、あっという間に時間が来てしまいました。
 
 そういえばお祭りセッションで開催されていた JAWS DAYS 2025 生成AI 絵画展に応募していたのですが、参加賞を受け取りに行くのを後回しにしていたら失念していました（今、書いていて思い出した）。
　聞けなかった多数のセッションはアーカイブ配信されるそうですので、配信されたらチェックします。そういった点で考えると、「現地でしか体験できないことを優先する」という判断基準はre:Inventと同じですね。

　ぼっちで、ドキドキしながらJAWS DAYSに参加して、結果、楽しくて舞い上がってから1年。JAWS-UGのイベントでLT登壇を経験させてもらい、いろいろな勉強会に参加する中で知り合いができました。その後、JAWS DAYSのボランティアに申し込んで、今年は最初から知っている方がいて、朝からみんなで盛り上がって、最高の1日でした。来年は個人サポーターにも申し込みます！

　ぼっちで参加していた方、周りとうまく溶け込めなかった方、いらっしゃると思います。中にはイベントの存在を知りつつも、参加を見送った方もいるかもしれません。大丈夫です。最初から最後まで、無理して全部参加する必要はないと考えています。聞きたいところだけでも、参加できる範囲だけでも参加して、疲れたら途中抜けしても良いと私は思っています。（JAWS-UGは、敷居の低いコミュニティでありつづけて欲しい）

　ぼっちで参加したおじさんでも、1年で大きく変わりました。もっと楽しみたいなと思った方、Connpassですぐに次のJAWS-UGの勉強会に申し込みましょう。毎週のように開催されています。一歩踏み出せば、動き出します。オフラインイベントが怖かったら、オンラインイベントからで良いと思います。私もオンラインからスタートでした。思い立ったらすぐに行動した方が良いです。

# 次の一歩
　ちょうどJAWS DAYSの前に支部運営にも関わるきっかけをいただけました。最初の一歩を踏み出して、募集をしてくれた方に感謝です。ただ、何から始めればいいのか、私自身、さっぱりわかっていません。せっかくきっかけをいただいたのに力になれないのは悔しいので、近郊の地域支部に参加して、運営の方々にお話を聞いて周りたいなと考えています。

　40過ぎてから、新たにやりたいこと、学びたいことが溢れてきて、社外の方とこんなに繋がれるようにまでなるとは、数年前まで想像していませんでした。
 チャンスを与えてくれた全ての人、きっかけに感謝。

さて、まずは次のアウトプットに取り掛かるとします！
Share your lessons.
【初心者向け】人間中心設計（HCD）とは？ユーザビリティを向上させる10の原則

# 【初心者向け】人間中心設計（HCD）とは？ ユーザビリティを向上させる10の原則

## はじめに

「ユーザーが使いづらい…」「せっかく開発した機能があまり使われない…」

そんな悩みを抱えていませんか？  
それを解決する鍵となるのが **人間中心設計（HCD：Human-Centered Design）** です。  

HCDを取り入れることで、ユーザーにとって本当に価値のあるプロダクトを作ることができます。  
とはいえ、何から始めればよいかわからない方も多いでしょう。  

### **まずやるべきことはシンプルです。**
1. **ユーザーの状況を理解する**  
   - どんな場面で、どのようにこの機能が使われるのか？  
   - ユーザーの環境や行動を整理する。  
2. **ユーザビリティの課題を見つける**  
   - ニールセンの「ヒューリスティックスの10原則」を参考に改善点を探す。  

この流れを意識するだけで、プロダクトの使いやすさは格段に向上します。  
それでは、HCDとは何か、どのように活用すればよいのかを詳しく見ていきましょう。

---

## 人間中心設計（HCD）とは？

HCDとは、**ユーザーの視点を最優先にした設計手法** です。

### **HCDの基本プロセス**
1. **ユーザーの理解**（ペルソナ作成、ユーザーリサーチ）  
2. **課題の明確化**（ジャーニーマップ、ユーザーストーリー）  
3. **プロトタイプ作成**（ワイヤーフレーム、MVP開発）  
4. **評価と改善**（ユーザーテスト、A/Bテスト）  

このプロセスを繰り返すことで、**ユーザーが直感的に使えるプロダクト** を作ることができます。  

---

## ヒューリスティックスの10原則

HCDを実践する上で役立つのが、ヤコブ・ニールセンが提唱した **「ヒューリスティックスの10原則」** です。  
これは、ユーザビリティを向上させるための指針となるものです。  

### **📝 ユーザビリティ改善のための10原則**

1. **システム状態の可視化**  
   - **例:** 写真アップロード時に「〇％完了」の表示があると、進捗がわかり安心できる。

2. **実世界との一致**  
   - **例:** カートに商品を入れるとアイコンの数字が増えるのは、実際の買い物カゴと同じで直感的。

3. **ユーザーの制御と自由**  
   - **例:** SNSの投稿に「編集」「削除」機能があると、間違えてもすぐに修正できる。

4. **一貫性と標準化**  
   - **例:** 「×」ボタンで閉じる、「三本線のメニューアイコン」でメニューが開く、というルールが統一されていると迷わない。

5. **エラー防止**  
   - **例:** パスワード設定時に「8文字以上、数字と記号を含める」といった条件をクリアしないと次に進めない仕様にする。

6. **認識の方が記憶より優先**  
   - **例:** 過去に検索した商品を履歴として表示すると、ユーザーが覚えていなくても見つけやすい。

7. **柔軟性と効率性**  
   - **例:** メッセージアプリで長押し操作を用意し、返信やコピーを素早くできるようにする。

8. **美的で最小限のデザイン**  
   - **例:** 天気アプリで、気温や降水確率だけを大きく表示し、余計な情報を削減する。

9. **エラーの認識・診断・回復**  
   - **例:** パスワード間違い時に「パスワードが間違っています」ではなく、「大文字と小文字を区別します」と具体的に伝える。

10. **ヘルプとドキュメント**  
   - **例:** スマート家電アプリで「Wi-Fiに接続する方法」を検索すると、画像付きの説明が表示される。

---

## HCDを活かした設計のポイント

では、実際にHCDをどう活用すればよいのでしょうか？  
まずは、以下のポイントを意識してみましょう。

### **🎯 HCDの実践ステップ**
✅ **ユーザーの状況を理解する**  
   - 「どのような環境やタイミングで使うのか？」を把握する。  
   - 「誰のための機能か？」を明確にする。  

✅ **課題を整理する（ジャーニーマップを作成）**  
   - ユーザーがどのようにアプリを利用するかを可視化し、課題を見つける。  

✅ **ヒューリスティックスの10原則を活用する**  
   - 上記の10原則に照らし合わせ、改善点を見つける。  

✅ **UIの一貫性を保つ**  
   - ユーザーが迷わず操作できるデザインを心がける。  

✅ **エラーメッセージを分かりやすくする**  
   - 「何が原因なのか？」を具体的に伝えるメッセージを表示する。  

---

## まとめ

HCDを取り入れることで、**ユーザーにとって直感的で使いやすいプロダクト** を作ることができます。  
特に **「ヒューリスティックスの10原則」** を活用することで、ユーザビリティの向上が期待できます。  

「HCDって難しそう…」と感じていた方も、**まずはユーザーの状況を理解し、エラー防止や一貫性を意識するところから始めてみましょう！**  

あなたのプロダクトが、よりユーザーに優しいものになることを願っています！
mpvで最後まで再生したファイルを移動

## 動機

- ラジオ番組を録音したオーディオファイルなどは、最後まで再生した後は移動して、二度聴きを防止したい。
- 最後まで再生していないファイルは再度再生したい。
- 音楽ファイルなどはラジオ録音ファイルと異なり、何度も再生したい。
- 安全のため、ある程度メジャーなプレーヤ(オープンソース、いろんなOSで動く等)で実現したい。

## 解決策

オープンソースのmpvプレーヤを、jsでカスタマイズする。

```js:~/.config/mpv/scripts/my.js
var curPath = null;
// ファイルパスの先頭が一致した場合のみ、移動する。
function mvfile(prefix, to) {
  if (curPath.indexOf(prefix) === 0) {
    mp.utils.subprocess({args: ["mv", curPath, to], playback_only: false});
    // mp.utils.subprocess({args: ["cmd", "/C", "move", curPath, to], playback_only: false}); // for Windows
  }
}
// ファイル読み込み後に呼び出されるイベント。
// end-fileイベント内で取得できないため、ファイルパスをこのタイミングで取得する。
mp.register_event("file-loaded", function() {
  curPath = mp.get_property_native("path");
});
// ファイルクローズ時に呼び出されるイベント、先頭パターンと移動先を複数指定している。
mp.register_event("end-file", function(event) {
  if (event.reason == "eof") { // 最後まで再生された場合
    mvfile("sd/radio/", "sd/backup/mvfiles/"); // 引数は例
    mvfile("r/", "r/mvfiles/"); // 引数は例
  }
});
```
sourceコマンドに知ったこと~SSHにsourceコマンドは不要~

## source コマンドとは
- シェルスクリプトや環境設定ファイルを現在のシェル環境に読み込むコマンド
- 別名: `.`（ドット）コマンド
- 使い方
  ```bash
  source ~/.bashrc
  # または
  . ~/.bashrc
  ```
`.`だけで使えるんですね．初めて知りました

## どんなときに使うの？
**ずばり，.bashrcや.zshrcを変更した時です！**
シェル環境を変更したときに，それを適応させるイメージですね

1. シェルの環境変数を設定する場合
   ```bash
   # 環境変数の設定
   export PATH=$PATH:/new/path
   ```

2. シェル関数を定義する場合
   ```bash
   # 関数定義
   function hello() {
       echo "Hello World"
   }
   ```

3. エイリアスを設定する場合
   ```bash
   # エイリアス設定
   alias ll='ls -la'
   ```

## SSH設定に source が不要
sourceコマンドは先ほど伝えましたが，シェル環境の変更を読み込むためのコマンドです．
SSHは自動で更新されますし，環境を変えた時点でそれが反映されています．

わたしは，そこを理解していなく，gitのssh設定しているときにsourceコマンドを使って，なんでエラーなるんだ？？と焦っていました💦
平方根を求めて遊ぶ。(ほぼニュートン法) (0x5f3759df)


参考
----

![o_coq829.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/43f480f5-654a-4d03-83a9-c030ba9afb7a.jpeg)


https://qiita.com/metaphysical_bard/items/e04378b16d6173127435

注意
----

- 過去ログをみよ!!!
- M5NanoC6での予定は、未定
- 非営利、研究調査で引用しました。


プログラム
----

オンラインコンパイラ paiza

```c++


//https://en.wikipedia.org/wiki/Fast_inverse_square_root
float q_rsqrt(float number)
{
  long i;
  float x2, y;
  const float threehalfs = 1.5F;

  x2 = number * 0.5F;
  y  = number;
  i  = * ( long * ) &y;                       // evil floating point bit level hacking
  i  = 0x5f3759df - ( i >> 1 );               // what the fuck?
  y  = * ( float * ) &i;
  y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
  // y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

  return y;
}


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    float in;
    float f;
    
    in = 2.0;
    
    f = q_rsqrt(in); //逆平方根
    
    f = in * f;
    
    printf("%f\n",f);
    
}



```


```

1.413860

```
2025/3/4主にITとかセキュリティの記事

Android TV危機！約160万台が感染した「Vo1d」マルウェアの脅威と対策(3/2)
https://innovatopia.jp/cyber-security/cyber-security-news/48569/

北朝鮮がBybitから盗んだ仮想通貨2200億円、超速で世界に散る(3/1)
https://news.livedoor.com/article/detail/28255859/

[レポート]【C-4】 AWSアカウントのセキュリティ自動化、どこまで進める？最適な設計と実践ポイント - JAWS DAYS 2025(3/1)
https://dev.classmethod.jp/articles/jawsdays2025-c4-report/

来るべきAI戦争に備えて米国防総省がホワイトハッカーチームを設立(3/1)
https://karapaia.com/archives/491261.html

RTX1300が高いのでopenWRTで10Gbps用ルータを自作した(3/2)
https://qiita.com/applesorce/items/b16b9344a41619943c28

“生成AIのデータ漏えい”はこうして起こる　よくある6つの事例(3/1)
https://news.yahoo.co.jp/articles/3f87d81833597c4fd248926d694d1c5a5d5a7e7b

車両欠陥隠蔽防止へ OTA規制を強化 ― 当局新指針(3/1)
https://mobyinfo.com/intelligence/strengthened-ota-regulations-against-vehicle-defect-concealment/

Generative AI Use Cases JP (略称:GenU) のシンプルにインストールしてみた(3/2)
https://dev.classmethod.jp/articles/generative-ai-use-cases-jp-genu-installation-guide/

[レポート] 【B-8】 JAWS DAYS 2025 「AIエージェント時代のエンジニアになろう： Agentic Workflows から環境に溶けこむ Ambient Agents まで基礎と実践を50分で身につける」(3/1)
https://dev.classmethod.jp/articles/jaws-days-2025-b-8-ai-agentic-workflows-ambient-agents/

ハッカーがGithubを使って暗号を盗む—オープンソースに隠されたマルウェア(3/1)
https://news.bitcoin.com/ja/hakka-ga-github-wo-tsukatte-anko-wo-toumu-opensource-ni-kakusareta-malware/

ラマダン中にオンラインで買い物をするための安全なヒント:取引中に個人データを保護する(3/1)
https://voi.id/ja/lifestyle/464599

サイバー犯罪対策に意識高めよう　サイバーセキュリティフェス　京都市南区(3/1)
https://www.kbs-kyoto.co.jp/news/2025/03/n20250301_138937.htm

内閣府 人工知能関連技術の研究開発及び活用の推進に関する法律案(3/2)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/03/post-23e311.html

パソコン画面に警告画面 「ウイルス感染し個人情報流出」 電子マネー計２４万円だまし取られる 愛媛県警が架空請求詐欺とみて捜査(3/1)
https://topics.smt.docomo.ne.jp/article/itv6/region/itv6-1761304
競プロ日記#25/03/03

# アルゴ式-[回文を作る](https://algo-method.com/tasks/2dabe99175a7215b)
- 再帰関数でサンドすることを考える
- その時に再帰を切り上げる条件としてif(N == 0)にする
- 真ん中は常にN - 1
```
string func(string S,int N){
    int i = 0;
    if (N == 0){
        return "";
    }
    int indexCenter = N - 1;
    return func(S,N - 1) +  S.at(indexCenter) + func(S,N - 1);
}
```

# アルゴ式-[部下の人数](https://algo-method.com/tasks/87baad02dd468b8c)
- 再帰関数の定義が難しかった。（要復習）。
おそらく（直属の部下 + その人自身）というのを再帰関数で表現している。そのためにXの直属の部下の人数分だけ範囲for文で回している
```
int num_of_staffs(int X, vector<vector<int>> &staffs) {
    int result = 0;
    for (int staff: staffs[X]) {
        // (社員 staff の部下の人数) + 1(社員 staff) 
        result += num_of_staffs(staff, staffs) + 1;
    }
    return result;
}
```
AIエージェントとは何か？ビジネスへの影響と未来予測【初心者向け解説】

# はじめに
ChatGPTの登場（2022年）以降、企業でのAI活用が本格化し、その次のトレンドとして高い自律性を持つ「AIエージェント」に注目が集まっています。OpenAIのCEOサム・アルトマン氏も2025年初頭に「今年中にもAIエージェントが企業の労働力に加わり、生産性を大きく変革する可能性がある」と述べるなど、ビジネス界でも大きな期待が寄せられています。ではAIエージェントとは何か、そしてどんな用途があり今後どう発展していくのか、初心者にもわかりやすく解説します。

https://openai.com/index/introducing-operator/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770170/af5d16c3-0b33-496b-ac5c-a07c65c7bf4f.png)


# AIエージェントとは？その定義と特徴
AIエージェントとは、複数のAI技術や外部システムを連携させ、高い自律性で目標達成までタスクを遂行するAIシステムのことです。ユーザーは「達成したいゴール」を設定するだけで、エージェントが必要な情報収集からタスクの実行・結果報告までを自律的に連続して行います。例えばユーザーがある目標を指示すると、AIエージェントが自ら必要なデータを集め、調査結果に基づいてやるべきタスクを決め、目標に向けて順次実行していきます。人間が逐一細かな指示を出さなくても、エージェント自身が「何をすべきか」を判断しゴールまで動いてくれる点がポイントです。


従来のAIアシスタント（例：SiriやChatGPT）のように対話対応やコンテンツ生成が中心のものとは異なり、AIエージェントは複数ステップにわたる業務プロセスを自動化できる点が大きな特徴です。生成AIがテキストや画像など「何かを作り出す」ことに特化しているのに対し、AIエージェントは生成AIの出力を活用して次のアクションまで実行できるところが異なります。また、AIエージェントは一度プログラムされた固定の反応をするだけではありません。タスクを実行した結果や取得した最新データをもとに自律的に学習し、パフォーマンスを向上させていく能力があります。そのため使えば使うほどユーザーの好みや業務パターンを学習し、より適切な提案や作業を行えるようになるのです。

# 現在の主な用途と活用事例
AIエージェントは2023年以降、様々な分野で実用化が進み始めています。以下は代表的な用途とその具体例です：

- カスタマーサポート – 問い合わせ内容に応じて外部の在庫管理システムや受注システムと連携し、在庫確認や注文処理まで自動化して対応できます。
- マーケティングリサーチ – 競合調査や市場分析を自律的に行い、必要なレポートを自動生成します。
- 経理・レポーティング – 社内データや外部APIからの情報収集を自動化してレポートを作成します。

この他にも、人事分野で候補者の選考や面接調整を代行する採用エージェント、製造業で設備の異常検知から対策立案まで行うエージェント、スマート家電を自動制御するパーソナルアシスタントなど、用途は多岐にわたります。

# AIエージェントの発展可能性と今後の展望
今後、AIエージェントはビジネスや日常にどのような変革をもたらすのでしょうか。

ある調査では2024年から2030年にかけて世界のAIエージェント市場が9倍以上に拡大するとされ、わずか10年で数十倍規模に成長するとの予測もあります。マイクロソフト創業者のビル・ゲイツ氏は「今後5年以内に、一人ひとりが自分専用のAIエージェントを持つようになる」と予測しています。

技術的な進歩も目覚ましく、AIエージェント同士が連携・協調して動く「Agent to Agent（A2A）」というコンセプトも現実味を帯びています。AIエージェントは業務の効率化や人手不足解消にとどまらず、仕事の進め方そのものを変革し、新たなビジネスモデルを創出するポテンシャルを秘めています。

# 参考情報

- OpenAI CEO サム・アルトマンの発言: openai.com

- マイクロソフト創業者 ビル・ゲイツの予測: gatesnotes.com

- 2024年〜2030年のAIエージェント市場規模予測: statista.com

- OpenAIの「Operator」: openai.com/operator

- Salesforceの「Agentforce」: salesforce.com

- LinkedInの採用エージェント: business.linkedin.com/talent-solutions

- ソフトバンクの「satto」: softbank.jp

- 富士通の「Kozuchi AI Agent」: fujitsu.com

- 国内スタートアップの建設業向けエージェント「光(Hikari)」: hikari-ai.jp
Pythonモジュールについて

今回は、モジュールについて学習したので、ここに記す。

# モジュールとは

Pythoにおけるモジュールとは、実行可能なPythonコードをまとめた**ファイル（拡張子 .py）**のことを指す。

基本的には、スクリプトの最初にimport文を表記して、モジュールを利用する。

# モジュールの基本

モジュールは以下のような形で利用する。

```Python:import文
import lesson_packege.utils

from lesson_packege.tools import utils

from lesson_packege.utils import say_twice

```
上記三つの書き方が存在しする。

まず一つ目の書き方の実行順序として、同じディレクトリにあるlesson_packegeというフォルダを探し、その中のutilsというスクリプトをimportしてutilsに記されている関数などを使うことができる。

二つ目の書き方は、同じディレクトリ内にあるlesson_packegeというフォルダにアクセスし、その中のtoolsというフォルダの中のutilsというスクリプトにアクセスし、インポートする。
この書き方の利点はアクセスする経路をすべて記述されているので、インポートしたものが、どこからきているか一目でわかる。

三つ目の書き方は、utils内にある関数のみを呼びだしている。

基本的には、わかりやすいように二つ目の書き方が推奨されている。
```Python:追記
from .. tools import utils
```
上記の書き方もあり、...の数に応じて、フォルダの階層を上げていく処理を行うが、わかりにくいので、基本的には使わない。

# インポートエラーについて

Pythonのバージョンによって、使う予定のライブラリを使用できない場合がある。
その時にエラーを起こさないために、tryを使って未然に防ぐことができる。

``` Python:import Error
try:
    from lesson_packege import utils
except ImportError:
    from lesson_packege.tools import utils
```
※事前にutilsを別の階層に入れてます。

上記の処理としては、同じディレクトリ内にあるlesson_packegeを探し、utilsをインポートしますが、utilsを別の階層に移動させたため見つからず、exceptの処理に回される。Import Error関数を使うことで、Import Errorが起きた時に処理をされ、toolsの中のutilsを探し、問題なくutilsをインポートできる。

ただし、Import Error以外のエラーが出た時には対応できない。

このように、パッケージをインポートするときに、tryを使って古いバージョンのパッケージをインポートして、もし失敗しても、exceptを使って新しいパッケージを書いておけば正常にプログラムを動かすことができる。
# サードパーティーライブラリ

Pythonのサードパーティーライブラリとは、Python標準ライブラリ以外の外部で作られたモジュールのこと。
これを使用する場合は、pipを使ってインストールする。
ライブラリの詳細はPyPIで調べることができる。

注意点として

・標準ライブラリとサードバーティーのライブラリimport文の間には改行を入れる。

・基本的にimport文は上から標準ライブラリ、サードパーティー、自分たちのプロジェクトライブラリの順にimport文を書いていく。

ちなみに、pipなどでインストールされたものがどこに存在するのか、以下のコードを実行すれば見れる。
```Python:
print(termcolor.__file__)
```
ライブラリ名.__file__
【実験】古いAndroidスマホにDjango開発環境を作ってみました！②

# はじめに
はじめまして。
工科系の学部4年の学生が引っ越し前に自宅で見つけた9年前のAndroidスマホに、思い付きでDjango開発環境を作ってみた話を
* TermuxとPython環境の構築
* Djangonのインストールと動作テスト(**本記事**)

の2回に分けてご紹介したいと思います。

:::note warn
注意
* 専門外の学生による実験的な試みです。
* 本記事では**セキュリティ面や実運用を考慮していません**。学習目的の環境構築としてご活用ください。
:::

### 前回の記事
前回は古いAndroidスマホにTermuxとPythonの環境を構築しました。

https://qiita.com/Datwi/items/1a88d3a45ba0710c841f

### Djangoのインストール
Djangoは `pip` を使ってインストールします。
```terminal
pip install django
```
インストールが完了したら、バージョンを確認しましょう。
```terminal
django-admin --version
```
出力例：
```terminal
4.2.6
```
このようにバージョンが表示されたら正しくインストールされています。

### Djangoプロジェクトの作成
前回の作業に引き続き、Djangoのプロジェクトを作成していきたいと思います。
Djangoの開発かんきょうの準備ができたので、新しいプロジェクトを作成します。[公式のチュートリアル](https://docs.djangoproject.com/ja/5.1/intro/tutorial01/)を参考に、作成していきます。

https://docs.djangoproject.com/ja/5.1/intro/tutorial01/

プロジェクト名を `djangotutorial` として新しいプロジェクトを以下のコマンドで作成します
```terminal
django-admin startproject djangotutorial
```
作成が完了すると、以下のようなディレクトリ構成になります。
```markdown
djangotutorial/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
```
`djangotutorial` フォルダの中に、Djangoの設定ファイルやアプリケーションのコードが格納されています。

### 開発サーバの起動
Djangoが正常に動作するか確認するため、開発サーバーを起動してみましょう。

まず初めに使用しているスマホのIPアドレスを以下のコマンドで確認します。
```terminal
ipconfig
```
また、Androidの「設定」 > 「Wifi」 > 「接続しているネットワークの詳細」からもIPアドレスを確認することができます。
ここで表示されたIPアドレスはあとで使用するので、メモしておきましょう。

続いて、Djangoプロジェクトのフォルダに移動します。
```terminal
cd djangotutorial
```
次に、以下のコマンドを実行して開発サーバを起動します。
```terminal
python manage.py runserver 0.0.0.0:8000
```
:::note warn
注意
今回は、別の端末からサーバの動作確認を行いたかったため、IPアドレスをあえて `0.0.0.0` にしています。
Djangonの開発サーバがローカルネットワーク内のすべてのデバイスからアクセス可能になる状態で、開発中には便利ですが、**不用意に外部に公開すると重大なセキュリティリスク**につながるので注意してください。
:::


正常に起動すると、以下のようなメッセージが表示されます。
```terminal
Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

3月 02, 2025 - 15:50:53
Django version 5.1, using settings 'mysite.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
```

### ブラウザで確認
開発サーバが起動したら、Webブラウザで以下のアドレスにアクセスしてみましょう。
```terminal
http://127.0.0.1:8000/
```
Djangoのデフォルトのロケットが離陸しているページが表示されれば、成功です！

### 開発サーバの停止
開発サーバを終了するには、**Termuxのターミナルで**`CTRL + C` を押します。
また、仮想環境を終了する場合は以下のコマンドを実行してください。
```terminal
deactivate
```

# まとめ
これで、古いAndroidスマホ上にDjangoの開発環境を構築し、実際に動作させることができました。
今後は、Djangoアプリケーションを作成し、データベースを使ったWebサービスを開発することも可能です。

次のステップとして、SSHの導入や、実際のwebアプリの開発に移っていけたらなと思っています。
【Go入門】Golang基礎入門＋αの備忘録#4

[【Go入門】Golang基礎入門＋αの備忘録#3（ポインタ）](https://qiita.com/sabotenten/items/db8f706d05dac59f487d/ "")の続き。
この記事は以下のUdemyコースの学習記録です。

https://www.udemy.com/course/golang-webgosql/?couponCode=KEEPLEARNING

重要だと思った部分や感想、復習用に何を学んだかを書いていきます。
## セクション11：構造体
### struct
− User型の構造体があったとしたとき、以下のように記述することでUser型の構造体をポインタ型で初期化できる。
```go:
user1 := new(User)
```
明示的にポインタ型として宣言する場合は以下の様に記述するのが主流。
```go:
user1 := &User{}
```

### structメソッド
メソッドの呼びだし型
```go:
構造体名.メソッド名(引数)
```

ポインタ型のReceiverを使うことで、構造体のフィールドを更新できる。
```go:
func (Receiver名 *型) 任意のメソッド名(フィールド名 型) {構造体のフィールドを更新する処理}
```
メソッドを呼び出す側は引数はポインタ型にしなくて良い。
```go:
func (u *User) setName(name string) {
  u.Name = name
}

func main() {
  user1 := User{Name: "user1"}
  user1.SetName("user2") // メソッドを呼び出す側は引数はポインタ型にしなくて良い。
}
```

### struct埋め込み
- 構造体のフィールドに構造体を埋め込むことができる。構造体が埋め込まれたフィールドは型を省略できる。省略した場合に限り、埋め込まれた構造体のフィールドを直接参照できる。

### コンストラクタ関数
- Goではコンストラクタ関数は構造体のポインタを返す形式で実装するのが一般的。
- 構造体を返すコンストラクタ関数を使って、構造体のポインタを生成することができる。またコンストラクタ関数の引数は、構造体のフィールドに適した型の値を渡す。
```go:
構造体のインスタンス名 := コンストラクタ関数(コンストラクタ関数内で返されている構造体のフィールドに適した型の値を引数として渡す)
```

### struct slice
- ポインタの構造体のスライス型を学んだ。
- ポインタの構造体のスライスの中身を取り出すには、範囲式for文でスライス内の各構造体のアドレスを取得する（デリファレンス）。
- make関数で構造体のスライスを生成できる。
```go:
type SampleStruct struct {
	field1 string
	field2 int
}
type SampleStructs []*SampleStruct

func main() {
	struct1 := SampleStruct{field1: "a", field2: 1}
	struct2 := SampleStruct{field1: "b", field2: 2}

	sl := make([]*SampleStruct, 0)
	sl = append(sl, &struct1, &struct2)

	for _, s := range sl {
		fmt.Println(*s)
	}
}
```

### struct map
- mapのキーと値両方に構造体をもたせることができる。

### struct 独自型
- あるデータの型を厳しくしたい時、独自型を使うことで他のデータ型と計算をできないようにできる。
- int型のsample型(`sample型とint型同士の演算はコンパイルエラーになる`)
```go:
type sample int
```

## セクション12：interface
主に、型アサーション、ダックタイピング、独自のエラーをカスタムエラーとして定義する、表示形式のカスタマイズに用いられる。

## セクション13:パブリックとプライベートと分割
- Goは基本的に関数や変数をパッケージ毎に分割してそれを組み合わせて開発していく。
- パッケージ間でのデータのやり取り
- 慣習として、Go Modulesを使って、フルパスでパッケージを指定する。
- パッケージのインポート順は可読性の観点から、アルファベットが推奨。
- 標準パッケージ、独自パッケージ、サードパーティパッケージは分けて並べた方が良い。
- インポートしたパッケージが使わないとコンパイルエラーになる。
- Goのスコープの大小関係はパッケージ→ファイル→関数→ブロック→制御構文
- パッケージ間でデータを参照するにはデータをエクスポートする必要がある。
- 1文字目を大文字にすることでエクスポートできる。
- パッケージ名+ドット+変数名（例）で参照可能
- 複数パッケージインポートした時、識別子の重複によるエラーを防ぐ必要があるため、パッケージ名の省略は推奨されていない。

## セクション14：テスト
- テスト用の関数名は先頭にTestをつける。
- テストをしたいファイルと同じ階層にテスト用のファイルを作る。
- Goのテストのルールとしてパッケージ名_test.goというファイル名でテストファイルを作る。
【React Hook Timer】ポモドーロタイマーを作った時、onExpireで死ぬほどハマった話

# はじめに
よくあるカウントダウンタイマーをReact Hook Timerを使って
作ってみた時に、onExpireでハマりました

# 問題
ドキュメントによるとonExpireはコールバック関数
つまり、カウントダウンが終わった後に呼び出される関数ということらしい

ポモドーロタイマーなので、`Time`が終わった後、`breakTime`が自動で再生されるように、
下記のように書いたところ、
```typescript
  const { seconds, minutes, hours, isRunning, start, pause, resume, restart } = useTimer({
    expiryTimestamp: getExpiryTimestamp(getDuration()),
    autoStart: false,
    onExpire: () => {
      if (mode === "work") {
        setMode("break");
        restart(getExpiryTimestamp(breakTime), true);
      } else {
        setMode("work");
        restart(getExpiryTimestamp(time), true);
      }
    },
  });
```
死ぬほどバグる、、、
何でやねん、、、
バグらなかった状況としてはユーザー側が、休憩のスタートボタンを押下するなどのアクションを追加した時だけでした。
ただ、これだと要件が合わないので、一旦無視してuseEffectでやることにしました

# 解決方法
実際のコードはこちら
```typescript
  const { seconds, minutes, hours, isRunning, start, pause, resume, restart } = useTimer({
    expiryTimestamp: getExpiryTimestamp(getDuration()),
    autoStart: false,
    onExpire: () => {
      if (mode === "work") {
        setMode("break");
      } else {
        setMode("work");
      }
    },
  });

  useEffect(() => {
    if (firstRender) {
      setFirstRender(false);
      return;
    }
    if (mode === "work") {
      restart(getExpiryTimestamp(time), true);
      console.log(mode);
    } else {
      restart(getExpiryTimestamp(breakTime), true);
      setStop(true);
      console.log(mode);
    }
  }, [mode]);
```

ただ、`useEffect`を使用すると`onExpire`が原因で、`mode`が切り替わりまくって、
レンダリングが繰り返されてしまうので、`firstRender`をつけます
最初のレンダリング時には何もしないでただ`return`するっていう条件をつけてあげるだけのフラグです


# おわりに
作るものが特殊なせいなのかreact-hook-timerはめちゃめちゃ使いづらかった
多分、ポモドーロタイマーには合わないんだろうなと思ったので、
どこかで自作のタイマーを作った方が早そうな気がしました。
現状は困っていないのでリファクタリングしながらやってみます
【ノウハウ】Outlookの対面イベント設定とTeamsの使い分け

## はじめに

Outlookで会議の予定を組むとき、対面イベント設定を使うとタイトルに自動で「**In-Person**」が付く機能をご存知でしょうか？
この機能は、会議が対面での出席を前提としていることを直感的に伝えるために設計されています。
一方、Teamsでは同様の自動表示機能がなく、対面での参加を促すためには手動で情報を追加する必要があります。
ここでは、Outlookの機能とTeamsとの違いについて、具体的な動作やメリットを交えながら解説していきます。

## Outlookの対面イベント設定とは？

**Outlook（およびOutlook on the web）** では、会議作成時に場所入力欄の横にあるスイッチを使って対面イベントをオンにすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33479/ff660bb5-add0-403e-9a1d-7708e0e9537c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33479/929f7dba-7d86-4533-8147-2d6c43f486ba.png)

この設定を有効にすると、以下のような効果が得られる。

- **In-Person表示の自動付加：** 
    - 会議出席依頼のメールやカレンダーイベントのタイトルに、In-Personが自動的に追加される
    - 参加者はその会議が対面出席を前提としていることを瞬時に認識できる
- **会議室などのリソース管理との連携：**
    - 対面参加が前提となるため、参加者の空き時間だけでなく、会議室やその他のリソースの予約状況も考慮して、最適な会議時間が提案される

こうした機能により、対面会議の予定調整や会議室の利用がよりスムーズに進められるメリットがある。

## Teamsとの違い

**Teams** では、 **Outlookのような専用の対面イベント設定は提供されていません。** 
そのため、対面での参加を促したい場合は以下のような工夫が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33479/1b7f75f4-d1e8-40e7-8a11-cd6104e500ce.png)


- **自動表示機能の不在：**
    - Teamsで会議を作成すると、会議のタイトルに自動でI n-Personのような表示されない
    - すべて手動で情報を入力する必要がある
- **会議詳細への記載：**
    - 対面参加を推奨する場合、会議の詳細欄に「対面推奨」や「オフィスでの参加希望」などの文言を明記して、参加者に意図を伝える工夫が必要

この違いは、各ツールが想定する **利用シーンの違い** によるもので、 **Outlookは従来の対面会議を前提** に、 **Teamsはオンラインでのコラボレーションを主眼** に置いているためと言える。

## まとめ

Outlookの対面イベント設定は、会議が対面での出席を前提としていることを明確に伝えるための便利な機能です。
自動的にタイトルにI n-Personが追加されることで、参加者は会議の形式を瞬時に把握でき、予定調整やリソース管理が効率化されます。
一方、Teamsでは自動表示機能がないため、対面参加を促すためには会議詳細への明記など、利用者側での工夫が必要です。
各ツールの特性を理解し、状況に合わせた適切な設定や表現を行うことで、より円滑な会議運営を実現できます。
AWSのFan-out / Fan-inについて調べてみた

デベロッパーアソシエイトの勉強をしていたところ、試験ガイドに「ファンアウト」と記載されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120542/719472ba-d0c9-4877-a7db-dd33f6d49628.png)

ファンアウトってなんぞ...？と思ったので、詳しく調べてみました。
（AWS公式の資料にも説明がなく、日本語のドキュメントがほとんどなかったので、主に英語ドキュメントからの引用です）

# ファンアウト（Fan-out）とは
ファンアウトは、大きなタスクを小さなサブタスクに分割することです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120542/00889668-ccd8-41af-9b91-27a87e487ea4.png)
複数のタスクに分割することで並行処理できるようになり、プロセス全体を迅速かつパフォーマンスの高い方法で処理できるようになります。

# ファンイン（Fan-in）とは
ファンインは、ファンアウトされたサブタスクから結果を収集する場合に利用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120542/385842de-4470-4bd4-bd19-d35fa1e2650a.png)
例えば、アプリケーションがすべてのサブタスクが完了するのを待ってから、プロセス全体を進める場合にも役立ちます。

# AWSサービスとの関係
ファンアウトは、例えばSNSから複数のLambdaを起動させるようなアーキテクチャに用いられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120542/82dfb550-0372-4e3a-ac19-04ee7182d72d.png)

一方、ファンインは分散処理した結果を一か所のデータレイクやデータウェアハウスへ格納する場合に用いられるアーキテクチャです。格納先にはDynamoDBやS3などが挙げられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120542/86cbba38-1bcf-4b1f-8a06-49a8c319528f.png)


（参考）
https://dev.to/byrro/crash-course-on-fan-out-fan-in-with-aws-lambda-47g0
https://theburningmonk.com/2018/04/how-to-do-fan-out-and-fan-in-with-aws-lambda/
Gitが学べるゲームやアプリ

バージョン管理ツールとして広く使われている「Git」は、開発者にとって必須のスキルとなっていますが、初心者にとっては概念を理解するのが難しいことがあります。「コミット」「ブランチ」「マージ」「リベース」といった抽象的な概念が多く、コマンドラインでの操作も慣れないうちは混乱しがちです。

そこで本記事では、ゲーム形式でGitを学べるツールを紹介します。視覚的な要素と対話型の学習を通じて、Gitの基本概念を楽しく効率的に身につけることができます。「百聞は一見にしかず」という言葉通り、実際に操作して結果を目で見ることで、Gitの仕組みをより深く理解できるでしょう。

## おすすめのGit学習ゲーム

### 1. Learn Git Branching


[Learn Git Branching](https://learngitbranching.js.org/)は、ブラウザで動作するインタラクティブなGit学習ツールです。コミットやブランチの操作を視覚的に表現し、段階的に学習を進めることができます。

**特徴:**
- ブラウザで動作するため、インストール不要
- ステップバイステップの課題で基本から応用まで学べる
- コマンドラインを実際に使いながら学習できる
- 視覚的にコミット履歴とブランチを表示
- 世界中で広く使われている定番の学習ツール

**学習できる内容:**
- 基本的なブランチの作成と管理
- マージとリベース
- デタッチドHEADの状態
- コミット履歴の修正
- リモートリポジトリとの連携

### 2. Oh My Git!

[Oh My Git!](https://ohmygit.org/)は、Gitの内部構造をリアルタイムで可視化するオープンソースのゲームです。カード形式のインターフェースを採用しており、初心者にも分かりやすく設計されています。

**特徴:**
- Windows、macOS、Linuxで動作するデスクトップアプリケーション
- カード形式のインターフェースで直感的に操作
- 実際のGitを内部に統合し、全機能を試せる
- リモートリポジトリとの連携や複数リポジトリでの作業フローに重点
- 高度なユーザー向けに統合ターミナルも提供

**学習できる内容:**
- Gitの内部構造と仕組み
- 基本的なGitコマンド
- リモートリポジトリとの連携方法
- チーム開発におけるワークフロー

### 3. Githug

[Githug](https://github.com/Gazler/githug)は、ターミナルで動作するGit学習ゲームです。実際のGitコマンドを使いながら、様々な課題に挑戦していきます。

**特徴:**
- ターミナルで動作するため、実際の開発環境に近い形で学習できる
- 50以上のレベルを用意
- RubyGemsでインストール可能
- 実践的な課題を通じてGitの様々な機能を学べる

**学習できる内容:**
- 基本的なGitコマンド
- 一般的なGitのワークフロー
- トラブルシューティング
- 高度なGit操作

### 4. Git-it

[Git-it](https://github.com/jlord/git-it-electron)は、Electronで作られたデスクトップアプリケーションで、ゲームではありませんがGitとGitHubの基本を学べるチュートリアルです。

**特徴:**
- デスクトップアプリケーションとして動作
- GitHubとの連携方法も学べる
- 実際のリポジトリを操作しながら学習
- 多言語対応

**学習できる内容:**
- Gitのインストールと設定
- リポジトリの作成
- コミットの作成と履歴の確認
- ブランチとマージ
- GitHubとの連携

## まとめ

Gitは開発者にとって欠かせないツールですが、その概念を理解するのは簡単ではありません。本記事で紹介したようなゲーム形式の学習ツールを活用することで、視覚的かつ体験的にGitの仕組みを理解することができます。

特に初心者の方は、まずLearn Git BranchingやOh My Git!などのツールで基本概念を学び、徐々に実際のプロジェクトでの活用に移行していくことをおすすめします。Gitを使いこなせるようになれば、開発効率が大きく向上し、チームでの協業もスムーズになるでしょう！
Cline + claude 3.7 sonnet を使って M5 CoreInk に天気予報を表示させる

前回、M5 CoreInk で Hello World した続きです。

https://qiita.com/bonjiri/items/a4f915ad96077f2ea0ea

## せっかくなのでAI開発

せっかくなので昨今話題の Cline と、claude 3.7 sonnet を使って開発してみます。

### claude 3.7 sonnet の API key を準備

まずは Anthropic API に課金します。
手順は下記を参考にさせていただきました。
とりあえず$5だけ購入しました。

https://note.com/noa813/n/n307d62b5820b

手順を参考に、API keyを発行しておきます。

### Cline の準備

VS Code で Cline を使えるようにします。
拡張機能から Cline を検索、インストール。
インストール出来たら先程の API key を設定します。

詳しい手順は[こちらの記事](https://www.ai-souken.com/article/what-is-cline)などを参考にさせていただきました。

## Cline に M5 CoreInk へ天気予報を表示するように開発を指示

### とりあえず作ってもらう

はじめに下記のようにタスクを実行して、開発してもらいました。
「M5 CoreInkで開発を行っています。天気予報を表示させるようにしたいです。」

途中、API は気象庁のものを使ってもらうように指示したり、更新間隔を3時間毎に指定しながら「Task Completed」となるまで繰り返しました。
そして5分程で完成。
完成したプログラムをデバックしたところ、なんと一発で通って、かつ書き込みも成功しました…すごい。

しかし、文字が豆腐になってしまっていたり、画面内に収まっていないため微調整しました。

### 微調整

豆腐の回避ですが、日本語で表示するとハマりそうだったので全て英語にしました。

画面内に収める調整が言葉だけでは難しく、写真を撮影して Cline に読み込ませて調整を試みました。
ハードを扱う開発では実機を確認しながらでないとデバックが難しいところは Cline も同じみたいです。

## 完成品

結果、完成したものが下記となります。
ちょっと表示が崩れていたり、?表記があったりと御愛嬌な部分がありますが、短時間でそこそこ動くものができまし

![IMG_1886.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378664/2c018812-dda5-4dbe-8caa-516cd7d3461b.jpeg)

また、Cline READMEを書いてもらったので、冒頭部分を貼っておきます。

```
# M5 CoreInk 天気予報アプリケーション

このアプリケーションは、M5 CoreInkデバイスに京都府の天気予報を表示します。気象庁のAPIからデータを取得し、3日間の予報と気温、降水確率を表示します。

## 機能

- 京都府の天気予報を表示
- 3日間（今日、明日、明後日）の予報を表示
- 気温と降水確率を含む
- 3時間ごとに自動更新
- ボタン押下による手動更新
- M5 CoreInkの画面に最適化されたレイアウト
```

## コストと時間

添付画像の完成品を作るまでに要したAPIの料金ですが、$1.7922でした。
ジュース1.5本くらいの値段です。

準備から完成までに要した時間は1時間くらいです。
Cline に作業したもらったのは30分程度でした。

## 感想

今回、あえての組み込み開発をしてもらいましたが、短時間で動くものができたのは驚きでした。
指示がイケてなかったので表示もイケてないですが、より丁寧に要件定義や設計をすることで、より高品質なものが作れそうです。
ただ正直、実用に耐えうるのかというと怪しいレベルでした。
ここはプロンプトの調整でいけるのか、Cline 然り Sonnet の限界なのかはもう少し触ってみる必要がありそうです。

次回、実用に耐えうるレベルにまで作り込みます。
【Mac】コマンドでJPEGを圧縮する方法

jpegoptimを使用するとJPEGを圧縮できます。

## インストール

以下のコマンドでインストールできます。

```terminal
brew install jpegoptim
```

## 使い方

JPEG画像を最適化し、関連するデータをすべて保持します。

```terminal
jpegoptim image1.jpeg image2.jpeg imageN.jpeg
```

JPEG画像を最適化し、不要なデータをすべて削除します。

```terminal
jpegoptim --strip-all image1.jpeg image2.jpeg imageN.jpeg
```

出力画像の最大ファイルサイズを固定に強制します。

```terminal
jpegoptim --size=250k image1.jpeg image2.jpeg imageN.jpeg
```
駆け出しクラウドエンジニア応援！IaaSの基本と活用事例をわかりやすく解説【前編】

**はじめに**
---
前回の記事では、クラウドの基本とメリット、クラウドの種別をご紹介しました。

前回の記事はこちら⇓
[Gmail、Netflixもクラウド！身近なサービスから学ぶクラウドの基本とメリット](https://qiita.com/oshima_kangen/items/9a917263d312e9bf2d6e)

クラウドの種別は IaaS、PaaS、SaaS の大きく3つに分けられます。

今回は、IaaSについて前編、後編の2回に分けてご紹介します。

前編では、IaaSのサービス内容と、それを利用する際に知っておくべきメリット・デメリットをわかりやすく説明します。


**IaaSとは？**
---
IaaS（Infrastructure as a Service）は、サーバー、ストレージ、ネットワークなどのITインフラを、インターネット経由で利用できるクラウドサービスです。
ユーザーはOSやミドルウェア、アプリケーションなどを自由に構成できます。

 * **仮想サーバーの構築:**
  物理サーバーを購入することなく、仮想サーバーを自由に作成・管理できます。
 * **ストレージの利用:** 
 大容量のデータを安全に保管・管理できます。
 * **ネットワークの構築:**
  仮想ネットワークを構築し、セキュリティの高い通信環境を構築できます。
 * **開発環境の構築:** 
 アプリケーション開発に必要な環境を迅速に構築できます。
 * **ビッグデータ解析:**
  大量のデータを処理するための環境を構築できます。

  **代表的なIaaSサービス**
  ---
 * **Amazon Web Services (AWS)**
   * 世界で最も普及しているクラウドプラットフォームの一つです。
   * EC2（仮想サーバー）、S3（ストレージ）、VPC（仮想ネットワーク）など、幅広いIaaSサービスを提供しています。
   * スタートアップから大企業まで、様々な規模の企業が利用しています。
 * **Microsoft Azure**
   * マイクロソフトが提供するクラウドプラットフォームです。
   * Virtual Machines（仮想サーバー）、Azure Storage（ストレージ）、Azure Virtual Network（仮想ネットワーク）など、IaaSサービスを提供しています。
   * Windows環境との親和性が高く、エンタープライズ企業での利用が多いです。
 * **Google Cloud Platform (GCP)**
   * Googleが提供するクラウドプラットフォームです。
   * Compute Engine（仮想サーバー）、Cloud Storage（ストレージ）、Virtual Private Cloud（仮想ネットワーク）など、IaaSサービスを提供しています。
   * ビッグデータ解析や機械学習分野に強みを持っています。
* **Oracle Cloud Infrastructure (OCI)**
  * オラクル社が提供するエンタープライズ向けのクラウドプラットフォームです。
  * Compute（仮想サーバー）、Storage（ストレージ）、Networking（仮想ネットワーク）などのIaaSサービスに加え、Oracle Databaseを中心としたPaaSサービスも提供しています。
  * 特に、データベースやエンタープライズアプリケーションのクラウド移行を検討している大企業での利用が多いです。

  
**IaaSのメリット**
---
 * **コスト削減:**
  必要な時に必要な分だけリソースを利用できるため、初期費用や運用コストを削減できます。
 * **柔軟性:**
  リソースの追加や削除が容易なため、ビジネスの変化に柔軟に対応できます。
 * **拡張性:**
  ビジネスの成長に合わせて、リソースを容易に拡張できます。
 * **可用性:**
  高い可用性を実現するための機能が提供されており、システムの安定稼働に貢献します。
 * **セキュリティ:**
  安全なシステム運用を支える充実したセキュリティ対策が提供されています。クラウド事業者が強固なインフラを構築し、利用者も責任範囲に応じた対策を行うことで、セキュリティレベルを向上させることが可能です。

  **IaaSのデメリット**
  ---
 * **運用管理の必要性:**
  仮想サーバーやネットワークの運用管理は、利用者自身で行う必要があります。
 * **セキュリティ対策:**
  クラウド事業者だけでなく、利用者側でもセキュリティ対策を行う必要があります。
 * **ベンダーロックイン:**
  特定のクラウド事業者に依存してしまう可能性があります。

  
**まとめ**
---
IaaSは、ITインフラをクラウド上で利用できる便利なサービスです。
コスト削減、柔軟性、拡張性など、多くのメリットがありますが、運用管理やセキュリティ対策など、注意すべき点もあります。
自社のニーズに合わせて、最適なIaaSサービスを選択することが重要です。

後編では、IaaSの活用例と、自社に合ったサービスを見つけるためのポイントを解説します。

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