OmniAICreator/Qiita-1.07M huggingface dataset:
Mac mini での ローカルLLM で使ったモデルの一部を削除する（MLX LM、MLX-VLM で使ったもの）

## はじめに

ローカルLLM で使っている Mac mini のディスク容量が以下の状態になったため、空き容量を増やすために今回の記事に書いている対処を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1a2de9fc-d86d-4022-bc08-42b11f5c0006.png)


## 実施したこと

### ローカルLLM のモデルの保存先を探す

上記のディスク容量不足の原因になりそうなもので、思い当たるものに MLX LM、MLX-VLM を使ったローカルLLM があると思われました。それで、そのローカルLLM で使ったモデルの置き場を探し、そのフォルダのサイズを確認してみることにしました。


#### 保存先のパス

調べてみたところ、モデルの保存先のパスは以下となるようです。

```txt
~/.cache/huggingface/hub
```

このフォルダのサイズを確認してみると、以下のとおり 266GB超と、ディスク全体の容量の半分以上になっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a5d5d636-f627-42b6-b9fb-f223fd62732c.png)

#### 保存されていたモデル

具体的にこのフォルダ内を確認すると、以下の状態でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4a179463-21bf-43d4-8abc-702a39d1d3c1.png)


<details><summary>ダウンロード済みだったモデル（折りたたんだ中に書いています）</summary>

- models--mlx-community--DeepHermes-3-Llama-3-8B-Preview-4Bit
- models--mlx-community--DeepSeek-R1-Distill-Qwen-14B-6bit
- models--mlx-community--gemma-3-12b-it-8bit
- models--mlx-community--gemma-3-27b-it-qat-3bit
- models--mlx-community--Llama-3-ELYZA-JP-8B-8bit
- models--mlx-community--Llama-3.2-11B-Vision-Instruct-4bit
- models--mlx-community--llm-jp-3-13b-instruct-8bit
- models--mlx-community--Mistral-Small-24B-Instruct-2501-4bit
- models--mlx-community--nanoLLaVA-1.5-8bit
- models--mlx-community--phi-4-4bit
- models--mlx-community--phi-4-8bit
- models--mlx-community--phi-4-bf16
- models--mlx-community--Phi-4-reasoning-plus-8bit
- models--mlx-community--plamo-2-1b
- models--mlx-community--Qwen2-VL-2B-Instruct-4bit
- models--mlx-community--Qwen2.5-VL-3B-Instruct-bf16
- models--mlx-community--Qwen2.5-VL-7B-Instruct-8bit
- models--mlx-community--Qwen3-14B-8bit
- models--mlx-community--QwQ-32B-3bit
- models--mlx-community--Sky-T1-32B-Preview-4bit
- models--mlx-community--Swallow-13b-instruct-v0.1-8bit
- models--mlx-community--whisper-large-v3-mlx
- models--mlx-community--whisper-large-v3-turbo

</details>



### 一部のモデルを残して削除する

上記のモデルの中の一部を残して、他を削除しました。

削除後のフォルダ・ディスク内のサイズは以下となりました。


#### モデルが置かれているフォルダ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3c2d9289-699a-4e86-8c0e-65ea14df8572.png)


#### ディスク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ab3da5be-725a-409d-88e4-c5eae3fcd72b.png)


これで、とりあえずディスクの空きを確保できました。


## その他

ローカルLLM をいろいろ試した時、その一部は流れなどを記事にも書いていました。

### 記事の一部

以下は、その記事の一部です。

- [Mac mini で ローカルLLM： Qwen3（MLX版）を MLX LM ＋ Python で試した時のメモ - Qiita](https://qiita.com/youtoy/items/fcf775e3a1547979cc63)
- [Mac mini で ローカルLLM： Qwen3（MLX版 14B 8bit）を MLX LM で試した時のメモ - Qiita](https://qiita.com/youtoy/items/18a105e3925fc34cc624)
- [Mac mini で ローカルLLM： Google の Gemma 3（MLX版 12B 8bit）を MLX LM で試す - Qiita](https://qiita.com/youtoy/items/43e0c2a5c966963edcc5)
- [「Qwen2.5-VL」の量子化された MLX版のモデル（7B 8bit）と「MLX-VLM」を使ったローカルLLM（Image to Text、M4 Mac mini を利用） - Qiita](https://qiita.com/youtoy/items/98d8b6c8d74c291ba3ca)
- [M4 Mac mini で mlx-whisper を試す（pyenv・venv を使った環境準備も）【Python-4】 - Qiita](https://qiita.com/youtoy/items/c5b204c811f5d8b4e5fe)
Lambda関数から別のLambda関数を呼び出す（エイリアス指定付き）

AWS Lambda では、ある Lambda 関数から別の Lambda 関数をプログラム内で呼び出すことができます。本記事では、**エイリアスを明示的に指定**して別の Lambda 関数を呼び出す方法を紹介します。

## 🧩 背景

Lambda 関数にはエイリアス（`dev`、`staging`、`prod` など）を設定でき、環境ごとのバージョン管理やデプロイの切り替えが安全に行えます。

しかし、**コード中で別の関数を呼び出すときにエイリアスを付けないと、最新版 `$LATEST` に向いてしまう**ことがあります。これを防ぐため、ARN 形式で明示的にエイリアスを指定するのがベストプラクティスです。

---
## ✅ IAM 権限の設定
呼び出し元の Lambda には、対象の Lambda 関数に対する lambda:InvokeFunction 権限が必要です。

## ✅ 使用例

以下は、Node.js ランタイムで Lambda 関数を呼び出すサンプルです。

```javascript
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();

exports.handler = async (event) => {
  const params = {
    // 呼び出す Lambda 関数の ARN。末尾に :エイリアス を付けることで明示的にバージョン指定できる
    FunctionName: 'arn:aws:lambda:{リージョン}:{アカウントID}:function:{関数名}:{エイリアス}',
    InvocationType: 'Event', // 非同期呼び出し
    // 呼び出し先の Lambda に渡したいデータ。ここでは requests を渡している
    Payload: JSON.stringify({ email_requests: event.requests })
  };

  try {
    const result = await lambda.invoke(params).promise();
    console.log('呼び出し成功:', result.StatusCode);
  } catch (err) {
    console.error('呼び出しエラー:', err);
  }
};
【前編】Laravel×Docker×EC2 オリプロ初デプロイで地獄を見た話（概要＆準備編）

どうもこんにちは。この記事は、Laravel製SNS「Apprentory」のデプロイに苦しみまくった一人の開発者の、リアルな戦いの記録です。

このシリーズでは、以下の3部構成でお届けします。

- **前編**：構成概要・環境準備・事前に知っておけばよかったこと
- **中編**：Docker・Laravelの本番構成と落とし穴
- **後編**：HTTPS化・エラー修正・CloudWatchでの監視まで

---

## 🎯 どんなサービス？

教材やオリジナルプロダクトをシェアできるSNS「Apprentory」を、AWS EC2（Amazon Linux）上でDocker＋Laravelで動かしています。

- Laravel + MySQL + Apache
- Dockerコンテナで構築（MySQL含む）
- ACM + Route53 で HTTPS 対応（※ALBは使用せずEC2に直接対応）

## 🔥 地獄の始まり

開発はローカルで順調に動く。けど、いざ本番環境にデプロイしようとすると…

> Dockerコンテナ起動しない

> 本番だけLaravelの.envが読み込まれない

> CloudWatchが何も表示してくれない

何が起きてるのかすら分からない。とにかく辛い。何回コンテナ再起動したか覚えてない。SSHもタイムアウトして無言のエラー地獄。

ただ、あの地獄を超えたことで「本番環境の設計と向き合う力」がめちゃくちゃ鍛えられました。

---

## ☁️ 使ったAWS構成

| 項目 | 内容 |
|------|------|
| EC2 | Amazon Linux 2023 |
| Docker | Laravelアプリ、MySQL含めコンテナ構成（docker-compose使用）|
| Route53 | 独自ドメイン設定（apprentory.click）|
| ACM | HTTPS対応（証明書発行、ALBなし）|

## ⚙️ 前準備で絶対やっておくべきこと

### 1. `.env` をローカルと本番で分けろ！

本番で `.env` を読み込まない原因、だいたいこれ：

```sh
APP_ENV=production
```
が抜けてる、または `php artisan config:cache` してない。

```sh
php artisan config:clear
php artisan config:cache
```

この2行を本番環境で叩かないと、Laravelは.envの変更に気づいてくれません。

### 2. EC2のSSH接続、Elastic IP必須

再起動でIP変わる → VSCode繋がらない → 永遠の「初期化中」
→ **Elastic IPで固定するのマジ大事**

### 3. Docker内MySQLはIPで繋げ！

`localhost` にしてると繋がらない。`docker inspect` でIP調べてピンポイント指定が必要。
（本当は docker-compose のサービス名で解決するのが正道）

```sh
mysql -h 172.21.0.3 -u user -p
```

---

## 💡 今回のまとめ（前編）

- ローカルで動いてても、本番は別物と思え
- Elastic IPと.env構成は先にちゃんと設計しとこう
- SSHで毎回詰まって心折れそうになる
- でも、ちゃんと学びに変えればこの経験は一生モノ

次回は実際の **Docker構成やLaravelの設定** にどんなトラップが潜んでたか、中編でがっつり晒していきます！
AWS EC2にJenkinsをインストールしてCI/CD環境を構築する

AWSのEC2インスタンスにJenkinsを導入し、継続的インテグレーション／デリバリー（CI/CD）環境を構築する手順を分かりやすくまとめました。

### 前提条件

- AWSアカウントがあること
- SSH接続用のキーペアが作成済みであること

## 手順

### ① EC2インスタンスの作成

- インスタンスタイプ：t2.micro（無料利用枠）でも構築可能ですが、安定した運用にはt3.medium以上を推奨します。
- OS：Amazon Linux 2
- セキュリティグループ：以下のポートを許可
  - TCP 8080（Jenkins）
  - TCP 22（SSH）

### ② EC2インスタンスにSSH接続

```bash
ssh -i your-key.pem ec2-user@<EC2のパブリックIP>
```

### ③ Jenkinsおよび関連ソフトウェアのインストール

Javaをインストールします。

```bash
sudo yum update -y
sudo amazon-linux-extras install java-openjdk17 -y
```

Jenkinsリポジトリを追加してインストールします。

```bash
sudo wget -O /etc/yum.repos.d/jenkins.repo \
    https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

sudo yum install jenkins git -y
```

### ④ Jenkinsの起動

Jenkinsを起動し、自動起動を有効化します。

```bash
sudo systemctl start jenkins
sudo systemctl enable jenkins
```

起動を確認します。

```bash
sudo systemctl status jenkins
```

### ⑤ Jenkinsのポート変更（必要に応じて）

他のアプリケーションとポートが競合する場合は、ポートを変更できます。

```bash
sudo vi /etc/sysconfig/jenkins
```

変更例（8089に変更する場合）：

```
JENKINS_PORT="8089"
```

設定後にJenkinsを再起動します。

```bash
sudo systemctl restart jenkins
```

### ⑥ ブラウザからJenkinsにアクセス

ブラウザで以下にアクセスします。

```
http://<EC2のパブリックIP>:8080
```

初期パスワードを以下のコマンドで確認します。

```bash
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
```

表示されたパスワードを入力して、初期設定を完了してください。

## Jenkins管理画面の初期設定

- 「Install suggested plugins」（推奨プラグインをインストール）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067881/d217542e-6057-417e-851d-adeb11f93fb4.png)

- 初期管理者ユーザーを作成し、ログインします。

以上でAWS EC2上でのJenkins環境構築が完了しました。
DAS/NAS/SAN

## DAS（Direct Attached Storage）
直接接続型ストレージ。コンピューターやサーバーに直接接続されているストレージ装置。

### 接続方法
直接
- USB（個人向け外付けHDDなど）
- SATA（内蔵HDDやSSD）
- SAS（エンタープライズ向け高速HDD）

### 主な用途
- 小規模な環境
  - 小規模オフィスやSOHO（個人事業主）のシステム構成など
- 個人利用のストレージ
  - 個人のバックアップ用途（外付けHDDなど）


### メリット
- シンプルな接続のため、導入、運用が簡単
- コストが安い

### デメリット
- 接続しているサーバーしか使えない
- 接続台数に制限があり、大規模運用には不向き
- 複数台にDASを個別に付けると、ストレージ管理が複雑化
- ネットワーク経由のアクセスができないため、遠隔アクセス不可

## NAS（Network Attached Storage）
ネットワーク接続型ストレージ。LAN（ローカルエリアネットワーク）経由で複数のPCやデバイスからアクセスできるストレージシステム。

### 接続方法
LAN
- Ethernet（有線LAN）

### 主な用途
- データの共有
  - 家族で写真・動画を共有
- 保存
  - 防犯カメラや監視ログの保存先
- バックアップ
  - PCやスマートフォンのデータを定期的にバックアップする自宅用の簡易ストレージサーバー

### メリット
- 複数のパソコンでデータ共有可能
- ハードディスクの容量を複数人で共有可能
- 外部からのアクセス可能

### デメリット
- 導入時に手間やコストが必要
- 機器の故障によるデータ消失の可能性

## SAN（Storage Area Network）
ストレージ専用のネットワーク。複数のサーバーから高性能なストレージをブロック単位で共有できるシステム。

### 接続方法
専用ネットワーク
- Fibre Channel（FC）
- iSCSI（イーサネット経由のSCSI）
- FCoE（Fibre Channel over Ethernet）

### 主な用途
- 仮想化インフラのサポート
  - 仮想マシンが共通のストレージを使い、スムーズなデータ共有が可能
- データベースの一元管理
  - 複数のアプリケーションやサーバーが同じデータベースに高速アクセス
- バックアップと復元
  - 高速かつ信頼性の高いバックアップ、障害時の迅速な復元
- ハイパフォーマンスコンピューティング
  - 気象予測、遺伝子解析、AIのトレーニングなどの大量データを高速処理できる環境が必要な分野で活用
- メディアの配信（ストリーミング）
  - スポーツ中継、動画配信、ライブ配信など、高速かつ安定したストレージアクセスが重要

### メリット
- 高速なデータアクセスと低遅延
- 複数サーバーでストレージ共有可能
- 大規模な拡張が容易
- データの冗長性を確保できるため、障害に強い

### デメリット
- 高い導入、運用コスト
- 構築、運用が複雑
- 中小規模にはオーバースペック

## まとめ
DASは直接接続型で安価かつシンプルですが、スケーラビリティに欠けます。NASとSANはネットワーク経由で複数端末からアクセスでき、NASは小規模向け、SANは高性能かつ大規模向けで、構築や運用に手間とコストがかかります。
[Python] ローカルでは動作するのにAWS環境のLambdaでコードが動作しない問題

## 概要
- paramikoを使ってSFTP送信処理を実装
- ローカルでは問題なく動作していたが、AWSの開発環境にLambdaとレイヤーをデプロイするとライブラリが不足している旨のエラーが発生する

```terminal
Unable to import module 'sftp_file_uploader': libffi.so.6 cannnot open shared object file: No such file or directory.
```

## 環境
- Python（v3.13.1）
- paramiko（v3.5.1）
- Cloud9（Platform: Amazon Linux 2）
  - ここでGit環境のコードをLambdaをデプロイ
- Lambda（Runtime: Python 3.13）


## 原因
- Lambdaの実行環境（`Python3.13`）と、デプロイ時の環境（`Amazon Linux 2`）に差分があった
- エラー発生時は、Cloud9上のPlatformを `Amazon Linux 2` にして、ライブラリをビルドしたものをパッケージ化していたが、現在のLambdaのPython 3.13ランタイムは、 `Amazon Linux 2023（AL2023）` ベースに変わっている


:::note warn
`AL2023`環境では、`libffi` ライブラリのバージョンが上がり、`libffi.so.6` が廃止され、`libffi.so.8` になったため、古い `libffi.so.6` を必要とするパッケージが動かなくなっている
:::

:::note 
アップロードしたZIPやレイヤーに含まれているライブラリ（例：`paramiko`, `cffi`, `cryptography` など）は、古い`Amazon Linux 2（AL2）` ベース環境用にビルドされており、 `libffi.so.6` を参照しようとして失敗している
:::


## 解決方法
- ライブラリをビルドする環境をAL2023にする
- 作成したパッケージをレイヤーに追加（CloudFormationでテンプレート化されている場合は不要）


## 参考
https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html

https://chatgpt.com/
ブラウザからサーバにどうリクエストが流れるか

# そんなの今更どうした
若い子がいまいち理解してなかったので
良さげな記事探したけどなかったのでしょうがなく書いてます。ご理解ください。

# ざっくり流れ
[①ブラウザ] → [②DNS] → [③CDN] → [④WAF] → [⑤ロードバランサー] → [⑥Webアプリケーションサーバ] → [⑥DBサーバ]

# それぞれを細かく見ていこう
### ① ブラウザからURL入力
例: https://example.com
### ② DNS（Domain Name System）
ドメイン名（example.com）からIPアドレスを調べる
インターネット上の「住所録」
結果として「このサイトは 例：203.0.113.10 にあるよ」と返してくれる

### ③ CDN（Content Delivery Network）
世界中にあるキャッシュサーバーから画像・CSS・JSなど静的ファイルを高速配信
通常、ユーザーの最寄りの拠点から配信され、読み込みが早くなる
キャッシュヒットすれば以降の処理（アプリやDB）に行かず応答終了

### ④ WAF（Web Application Firewall）
アプリケーションに届く前に、不正アクセスを遮断（SQLインジェクション、XSSなど）
「正しいユーザーか？」を検査するセキュリティゲート

### ⑤ ロードバランサー（Load Balancer）
複数あるWebアプリケーションサーバへ、アクセスの負荷を分散
たとえば3台ある場合、空いているサーバーにリクエストを振り分ける
サーバ障害時はヘルスチェックにより自動で切り離す

### ⑥ Webアプリケーションサーバ
ビジネスロジック（ログイン、計算、投稿処理など）を実行
必要に応じて、データをDBに問い合わせる
処理結果からHTMLやJSONレスポンスを生成して返す

### ⑦ DBサーバ（データベースサーバ）
永続的なデータ（ユーザー情報、商品データ、投稿など）を保存
Webアプリからのクエリ（SQL）に応じて必要な情報を返す
データ整合性やバックアップ、リードレプリカによる読み込み分散も行う


# 最後に
もっとわかりやすく書いてる記事を知ってる方は教えて下さい
Databricks にて BigQuery から Spark コネクターにより Spark データフレームを作成する方法

## 概要

Databricks にて BigQuery から Spark コネクター により Spark データフレームを作成する方法を共有します。

本記事は下記シリーズの一部です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1bb4805e-9f67-49e9-8e72-36036bf4310c.png)

出所：[Databricks で BigQuery のデータを取得する方法の徹底ガイド - Qiita](https://qiita.com/manabian/items/7097a9c31de23752d58a)

## 事前準備

### BigQuery に対する認証情報を取得

下記の記事を参考に BigQuery に対する認証情報（キー）を取得してください。

- [BigQuery × Databricks ：サンドボックス環境と Databricks Community edition で始める無償で高速データ分析 #Python - Qiita](https://qiita.com/manabian/items/a1e9d2619c4afa221251)

## 手順

### 1-1. 認証情報を変数にセット

```python
json_str = b"""{json_key}"""
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/434e5e5e-23e6-4e1b-87cc-1bc0037ebcd7.png)

### 1-2. Google Cloud のプロジェクト ID を変数にセット

```python
# プロジェクト ID を設定
parent_project_id = "axial-triode-XXXX"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ca31d758-ebe7-4cbc-b41d-93f5757cd8b6.png)


### 1-2. Spark データフレームを作成

```python
import base64

encoded_string = base64.b64encode(json_str).decode('utf-8')

# データ取得元のテーブル名を設定
table_name = "bigquery-public-data.google_analytics_sample.ga_sessions_20170801"

df = (
    spark.read
    .format("bigquery")
    .option("parentProject", parent_project_id)
    .option("credentials", encoded_string)
    .option("table",table_name)
    .load()
)

df.limit(50).display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0fd824fc-a703-4d0a-93c8-b744d1b68255.png)
[プロジェクトマネジメントの基本が全部わかる本 ] #読書感想

# はじめに
プロジェクトマネジメントに興味を持ったことをきっかけに、こちちらの本を読んでみました。

https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%AC-%E4%BA%A4%E6%B8%89%E3%83%BB%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%83%BB%E8%A8%88%E7%94%BB%E7%AB%8B%E6%A1%88%E3%81%8B%E3%82%89%E8%A6%8B%E7%A9%8D%E3%82%8A%E3%83%BB%E5%A5%91%E7%B4%84%E3%83%BB%E8%A6%81%E4%BB%B6%E5%AE%9A%E7%BE%A9%E3%83%BB%E8%A8%AD%E8%A8%88%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88%E3%83%BB%E4%BF%9D%E5%AE%88%E6%94%B9%E5%96%84%E3%81%BE%E3%81%A7-%E6%A9%8B%E6%9C%AC-%E5%B0%86%E5%8A%9F/dp/4798177415/ref=tmm_pap_swatch_0?_encoding=UTF8&dib_tag=se&dib=eyJ2IjoiMSJ9.JCqkDshoUKZtu7Tq4upwTSAEZBDFH9uwuv-do1oM3flx3ZEZUyAEASPnT1DpSHX5Ob7VIO0JiC9keJYesY4jmUJR1l53c-zKSy7bsDLAczfM4pNo-sq1E2XvE4am4OCUHHUScdCZANa99rqBGXQx84zAt-EJ3Qek--WWnDHTfVC6VwxWHk4ChZke0t_lE1OUDtuXcZ7s2tnPniejodoz_8RmboTr6ZQq0WwSaNR4Wv4uTEDrDdQdHrqXCI1EvdjekUcs2ofS8-hfaU9VkNIA7Ky4_UO25sdB8xHn2FHDMck.QUopvakzn1piP5YZBNIoxpgip_MXxB9rM-6YRYp6nxc&qid=1746078222&sr=8-1

プロジェクトマネジメントに少なからず携わった人であれば分かる「あるある」なことがたくさん出てくるので、読んでいて学びがありました。
# 学び１
仲の良さと信頼関係を混同しない。

これを混同していた時もありましたし、混同していたPMのプロジェクトで仕事をしていたこともありました。
お昼を一緒に食べに行ったり飲み会をやったりしてお互いの理解を深めて仲良くなる。仲良くなることが悪いわけでは全くないけれど、それと信頼は別である。
仲が良すぎるとメンバー間で甘えが生まれて、頼みやすい人ばかりに仕事を頼んでしまいがちです。
お互いが、仕事に対してはプロフェッショナルな姿勢で挑める環境を作ることもPMの仕事です。

# 学び２
タスクの洗い出しは以下に注意する。
・タスク名は「○○を○○する」と記載する
・「いつまでに」の部分には期間ではなく工数を記載する
・抜け漏れなく行う

１つめのタスク名は「○○を○○する」と記載するについては、やりがちなのは「現状把握」とか「設計書確認」とかがあるかなと思います。
ただこれだと自分自身は分かりますが、他のチームメンバーが見たときに？？だと思います。
そうではなくて「ネットワークトラフィック量を把握する」とか「通信経路設計を確認する」などに変えるだけでイメージが湧きやすくなります。

２つめの「いつまでに」の部分には期間ではなく工数を記載するは、タスクの前後関係やその後追加されるタスクによって期間がずれるからです。
プロジェクトの変化を把握して計画を調整していく考え方がタスクマネジメントでは重要です。

３つめの抜け漏れなく行うは、例えば抜けていた重要なタスクが実は部署間の調整が必要で、調整に10営業日かかることが5日前に分かった。となった場合、調整でかなり慌ただしくなりかなりの労力を使ってしまいます。
そうならないためにもタスクの粒度は大きくても良いので抜け漏れなくタスクを洗い出しましょう。

# 学び３
プロジェクトが本当に目指す目的をよく確認すること。
これは難しいですね。顧客がいう事をそのまま受け取って開発すると、「やりたい事と違う」となります。
実現したい事の根底に何があるのかをしっかりと確認して、正しい解決策を提示することがプロジェクト成否に大きく影響します。
顧客の要望だけでは見えない部分をヒヤリングして想像して、リスクと優先度を想定して提案に結び付けることが大事です。

# 終わり
読んでいるとたくさんの「あるある」があって、「あ、あの時こうすれば良かったのか。」に気づきを得られるのでとても学びの多い本でした。
「プロジェクトマネジメントの本物の実力がつく本」というのも同じ著者から出ているので、そちらも読んでみようよ思います。
以上。
PlantUML でシーケンス図を作成してみよう！

PlantUMLの導入についてはこの記事を参考にしました
https://qiita.com/Charotarou/items/10bd47c68a1190061858

株式会社オフグリッドでは、主に未経験、または経験が浅い社員を対象に研修制度を設けています。
基本的な座学を一通り受講した後、実際にPython flaskを使ってログイン機能を持つダッシュボード画面を作成します。

今回はそのログイン処理をシーケンス図にしてみます。

処理の流れはこうです
1\.ユーザーがログイン画面に、データ（メールアドレスとパスワード）を入力する
2\.ログイン画面（フロントエンド）からバックエンドに入力情報を渡す
3\.バックエンドで、受け取った入力データのバリデーションチェックを行う
4\.バリデーションチェックで問題がなければ、ユーザー情報を管理しているデータベース上に、受信したユーザーデータが存在するか確認する
5\.登録済みユーザーと一致した場合はダッシュボード画面を表示、一致しない場合はエラーメッセージを表示する

うーん、文章だけだとよくわからないですね。
そこでシーケンス図で処理の流れを整理します。

![sequence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471195/4dfb8605-4c0c-41b9-be15-08dcff06319c.png)

文章だけよりはマシになったんじゃないでしょうか？
ただこれだけだとまだ寂しいですね


![sequence2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2471195/bd803632-ba29-4949-b711-5fdc6d983188.png)

各処理に番号を自動採番し、色を着けてみました。

ソースはこんな感じです
```login.pu
@startuml sequence
' シーケンスタイトル
title ダッシュボードログイン処理
' 番号の自動採番
autonumber 1

' 色設定
skinparam ParticipantBackgroundColor orange
skinparam SequenceLifeLineBackgroundColor lightBlue

' 登場人物
actor ユーザー as user
participant 画面表示 as fe
participant バックエンド as be
participant データベース as db

activate user
activate fe
activate be
group ログイン処理
    ' \nで改行できる！横に長くなりすぎたら、いいところで改行しましょう
    user -> fe :メールアドレス、パスワードを入力、\nログインボタンをクリックする

    fe -> be:入力データ送信
    be -> be:バリデーションチェック

    opt 入力値に異常な値があった場合
        be --> fe:エラーメッセージ：入力できない文字が含まれています
    end

    be -> db :メールアドレスとパスワードを暗号化した値でデータ取得要求
    activate db
    return データ取得応答
    
    alt データ取得件数０件の場合
        be --> fe:エラーメッセージ：\nメールアドレスが登録されていないか、パスワードが違います

    else データ取得件数１件の場合
        be --> fe :ダッシュボード画面を表示する
    end

end
deactivate fe
deactivate be
deactivate user
@enduml
```

いかがでしたか。
シーケンス図の作成方法として、今回紹介したPlantUMLのほかに、エクセルなどで図を組み合わせて作図する方法もありますが、なかなかきれいにできなかったり、あとで修正しようと思うと大変です。
手軽に始められるのでぜひ試してみてください。
ChatGPTと一緒にレシートからDB設計したよ

## はじめに
初心者だけど、データベーススペシャリスト試験を受けたくなってしまったために、データベース設計の練習をしてみようと思いました。身近にたくさん業務用データがあるわけではなくて練習のネタに困ったので、身近なもので練習してみたいと思います。

今回は、近所でお買い物をしたときのレシートから関係スキーマを書き起こそうと思いますよ（いわゆるボトムアップ設計というやつです）。

## レシートを観察する
今回使ったリサイクルショップのレシート。雑貨しか買わなかったのですが、服やブランドバッグ、家電などもあります（命名規則はわかりません）。

<img width="300px" alt="receipt" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469759/df21f7ef-6b24-49ee-bad7-9860b2208b05.jpeg">

## エンティティを見出す
Udemyの講座「[はじめてのテーブル設計・データベース設計【わかりやすい解説 + 身近なテーマでレッスン】](https://www.udemy.com/share/101zYY3@q1bWPLOQqC6FoJtbVAsrnrKnJQExRcYdonKHLX8B6t0FKHNCufBXrtC_KN-9i-rn/ "はじめてのテーブル設計・データベース設計【わかりやすい解説 + 身近なテーマでレッスン】")」では、5W1H（いつ、どこで、だれが、なにを、なぜ、どのように）を考えてエンティティを見出すといいと言われています。
* いつ　→　発行日
* どこで　→　店名
* 誰が　→　担当者
* 何を　→　商品（品名）
* どれだけ（購入された商品について）
→　数量、単価、金額
* どれだけ（レシート全体について
→　合計、お預り、お釣り

## 関係スキーマを考える
いったん紙に書き出してみます。

![trefac2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469759/2cf2d2fd-4cea-4ef6-bd2e-9874cca1ffeb.jpeg)

消えかけている部分は「商品情報（商品コード（PK）、品名、単価）」です。

今回のお店はチェーン店なので、おそらく一括管理するシステムがあると想定し、複数の店舗情報を管理するための「店舗情報テーブル」を定義しました。また、各店舗のレジ担当者名がレシートに印字されているので、おそらく照合するための「社員情報テーブル」が定義されてそうだと考えました。

「購入情報テーブル」は今回の買い物の情報を保存しておくためで、「商品情報テーブル」は大量にある商品を管理しているテーブルだと考えます。購入情報テーブルと商品情報テーブルは多対1の関係になると思うのですが…… 例えば「アディダスのTシャツ」は何度も別々のレシートで買われる可能性があるとChatGPTからヒントをもらったのですが、このへんで混乱してきました。

「領収書テーブル」は今回の購入時の状況を全てまとめて控え、印字したい情報を持っているテーブルになります。領収書テーブルと購入情報テーブルは1対多の関係です。購入番号1つに対して商品は買った個数だけありますからね。

## ChatGPTさんの意見
■ 良い点
5W1Hでの分解（いつ・どこで・だれが etc.） がとても良いアプローチ。情報を漏らさず、混乱も防げる。

正規化（第3正規形くらい）まで意識されてる構成になってる。

「領収書ID」 → 「購入情報（商品単位）」 の流れも自然。

■ 小さな改善提案（余力があれば）
「購入番号」は「領収書ID + 連番」などで構成して複合主キーにするか、逆に購入情報のIDを別で振ってもいい（正規化次第）。

「社員情報」が抜けているようなので、社員ID→領収書の関係も明示しておくとよいかも（FKだけ書いてあるね）。

商品単価は商品情報に一元化されてるけど、過去に価格が変わる可能性があるなら、購入情報に「単価」を残すのも検討価値あり。

## 複合主キーについて
ChatGPTさんに複合主キーをどういうときに使うのか聞いてみました。

ChatGPT『今回のレシート設計では、「購入情報」テーブルが複合主キーの良い適用例になっています。なぜか？

購入番号（レシートごとに発行される一意のID）

商品コード（商品を一意に識別するID）
→ この2つの組み合わせが「そのレシート内での購入記録」を一意に特定できるからです。

また、同じレシートで同じ商品を何回も登録する可能性があるか？ も考慮するポイントです。

「1レシートにつき、同じ商品は1回しか登場しない」 → 購入番号, 商品コード を複合主キーにする

「同じレシートで同じ商品が2回登場する可能性がある」 → purchase_detail_id のような別の主キーを作る』

今回は複数購入しても数量でまとめることができ、1レシートにつき同じ商品は1回しか登場しない（アディダスのTシャツを2枚購入するパターン）ので、購入情報テーブルの購入番号と商品コード を複合主キーにします。

## 答え合わせ
最終的に今回のレシートからデータベース設計をしたときの関係スキーマは以下の通りになりました。

店舗情報（店舗ID、登録番号、店名、場所、電話番号）
社員情報（社員ID、担当者名）
領収書（領収書ID、店舗情報ID、社員ID、購入番号、発行日、合計、お預り、お釣り）
購入情報（購入番号、商品コード、数量、金額）
商品情報（商品コード、品名、単価）

主キー：
店舗情報 → 店舗ID
社員情報 → 社員ID
領収書 → 領収書ID
購入情報 → 購入番号、商品コード（複合主キー）
商品情報 → 商品コード

外部キー：
領収書 → 店舗情報ID、社員ID、購入番号

## おわりに
データベース設計をここまできちんと考えて、かつアウトプットしたのは初めてです。間違っているところがあればどんどん教えてください！！励みになります。よろしくお願いします。

## 表記のしかた
関係スキーマはデータベーススペシャリスト試験の表記法に従っています。

![db_specialist2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469759/f81c414a-0fd9-48b6-a856-9bbeaa6098f5.jpeg)
🌿 ラズパイを活用した『社内環境（温湿度）見える化システム』をつくる⑨プロジェクト総まとめ

## はじめに

こんにちは、piyovateです🐣✨

このシリーズでは、未経験からエンジニアに転職した私が担当した『ラズパイを活用した社内環境見える化システム』の開発プロセスを紹介してきました。企画から実装・運用まで、一連の流れを体験し、多くのことを学ぶことができました。

今回は、このプロジェクト全体の振り返りを中心にまとめました！

---

## 🚩 プロジェクトの振り返り

### 📌 アイデア決定から運用までのステップ

このプロジェクトでは以下のステップを順に実施しました：

1. アイデア出し・システムの決定
2. 部品選定・購入
3. Raspberry Pi Pico WHのセットアップ
4. センサー（BME280）の半田付け・動作テスト
5. Webサーバーの構築・ローカル環境でのテスト
6. ホームページへの表示デザインの決定
7. ホームページ側のフロントエンド実装
8. ホームページとラズパイのAPI連携

### 🎯 成果

プロジェクトを通じて以下の成果を達成することができました。

- **リアルタイムな環境モニタリング**: 社内の温湿度をリアルタイムで可視化し、社員がいつでも簡単に環境情報を把握できるシステムを実現しました。（乾燥対策をしなきゃ💦）
- **実践的な技術体験**: 初めての半田付け作業を経験することができました。作業の際には、楽しみながら動画を撮影して盛り上がりました（笑）
- **業務への実践的な導入**: 完成したシステムを実際にホームページで公開し、オフィスのメンバーに紹介したところ、好評を得ることができました。（弊社HPはこちら→ [テクノスフィア公式サイト](https://technosphere.co.jp)）
- **クラウドとIoTの実践的連携**: クラウド環境とRaspberry Pi Pico WHをAPIで連携させ、安定的にデータを取得・更新できる実務的な仕組みを構築しました。

このように、本プロジェクトを通じて、多岐にわたる実践的な経験とスキルアップができました。

---

## 💡 開発を通して学んだこと

- **未経験でも実際のプロジェクトを通じて実践的な技術が身につく**ことを実感。
- **困った時に気軽に相談できる環境**が成長を促進すること。
- アイデアを現実化するプロセスの中で、問題解決能力や柔軟な思考が養われること。

---

## 🌱 最後に

シリーズ全体を通じて、ラズパイの面白さやエンジニアリングの魅力を伝えることができていれば嬉しいです！

入社して半年という短い期間にも関わらず、自分のアイデアを採用していただき、多くのことを任せていただき、本当に感謝しています。

テクノスフィアでは、今回のプロジェクトのように入社してすぐでも活躍できる環境が整っています。詳細や私たちのチームに興味がある方は、ぜひこちらの[採用ページ](https://en-gage.net/technosphere_saiyo/)をご覧ください✨

今後もこのようなプロジェクトにどんどん挑戦していきますので、次のシリーズもお楽しみに🐣✨

## 🔗 シリーズリンク

* 前回：[🌿 ラズパイを活用した『社内環境（温湿度）見える化システム』をつくる⑧【HPとラズパイのAPI連携（結合編）](https://qiita.com/Piyovate/items/124ceb1faaff5fef1210)
* 第１回：[🌿 ラズパイを活用した『社内環境（温湿度）見える化システム』をつくる①【アイデア決定編】](https://qiita.com/Piyovate/items/b0e5a4b2c4c1ed7a3bf8)

📚 シリーズ全記事はこちら：[Qiitaストックページ](https://qiita.com/Piyovate/stocks/657201b660bed4ebf50c)
Nmapってなに？

セキュリティ、システム勉強している方は、一度は見たことがあると思います。
Hack The boxを触る過程で勉強したのでおさらいで記したいと思ったので書いています。

# Nmapとは
ネットワークスキャンの一種です。
主にセキュリティ診断やネットワーク管理で使われています。
ネットワークやホストの状態を把握するためのツール

# 分かること
・アクティブなホスト
・開いているポート
・OSの推定(LinuxやWindowsなど)
・実行中のサービスとバージョン
・セキュリティの脆弱性を確認

# 注意点
・ポートスキャンは、ハッキング予備行為と勘違いされるので安易に使うツールではないです。
・高速、大量にスキャンするとシステムに負荷がかかる可能性ある。
・結果が100％正確とは限らないです。
・ファイヤーウォールやセキュリティ機器に検知される。

# Nmapの用途例
・セキュリティ診断
・不審なポートの検出
・サーバーやネットワークの管理・棚卸し
・ハッキング対策・攻撃面の可視化

# オプション機能
オプション機能とはスキャンの際に、使う命令やパラメータのことです。どのようにスキャンするか、何を表示するかなどを細かく制御する機能です。
コマンドの組み合わせで目的に応じたスキャンができます。

| Option | 名称 | 説明 |
|:-:|:-:|:-:|
| -sT  | TCP Connectスキャン  |  	通常のTCP接続を行う基本的なスキャン。特権が不要なため、誰でも使える。 |
|  	-sS | SYNスキャン（ステルススキャン）  | 完全な接続をせず、SYNパケットのみ送信。検知されにくく高速。  |
| -sU  |  UDPスキャン|  UDPポートをスキャン。TCPとは異なり応答がないことが多く、時間がかかる。 |
|  -sV |  バージョンスキャン | サービスの種類やバージョンを調査し、脆弱性特定の手がかりに。  |
|  -sn | Pingスキャン  |   ホストの稼働状況（生死）だけを確認。ポートスキャンは行わない　|

# まとめ
Nmapはハッキングの知識ではないですが、ハッキングにもよく使用されることが多いためセキュリティ分野では重要な初歩的なツールです。
日本語のNmapリファレンスガイドもあるので詳しくはそちらをご覧ください。(基本的に英語のガイドが多い中で日本語があるのはありがすぎる。)
最後まで見ていただきありがとうございました。

[Nmapリファレンスガイド](https://nmap.org/man/ja/index.html)
GrassGIS,QGISを使った水文解析 凹地の平滑化について

# はじめに
　以前書いた記事で、r.watershedの前処理として凹地の平滑化は不要と書いたのですが、平坦地の流路が無駄に蛇行しており、不要とも言い切れないかなと思うようになりました。平坦地の流路をほど良く直線化するために色々試しましたので、補足として書きます。

 https://qiita.com/mooya/items/6b802d585e5546a2e693

# 前処理の有無等による解析結果の比較
## Grass r.fill.dir
　前処理として、Grassのr.fill.dirを実行した場合の流路を示します。
　ベースのグレーは、nodataの孔を埋めたDEMの範囲で、黄色は平坦な場所（grassの別の水文解析の実装のr.terraflowの流向の出力のうち、流向なしの範囲）を示します。
　流路は緑が前処理なしでr.watershedを使って流路を作成した結果で、これが基準です。
　マゼンダがr.fill.dirの前処理をした結果です。
　この結果を見ると、r.fill.dirはしてもしなくても、あまり変わりません。いずれも、平坦地の複雑な蛇行が気になります。
![30Waterflow比較-filldir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/a40dbaca-223c-447f-80b1-9208fcb6806e.png)

## SagaGIS Fill sinks (wang & liu)
　sagaは独立したGISで、QGISに同梱されなくなりましたが、プラグインとsaga本体をインストールすることで利用可能です。
 
https://qiita.com/kntoshiya/items/e7462e6b9e2e20ee1231

　前処理として、Fill sinks (wang & liu)を実行した結果を茶色で示します。
　流向なしの平坦地の流路が大胆に直線化しています。

![31Waterflow比較-saga fillsink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/4ae4f1df-bb20-42d2-9c2f-c2bdf63dd07c.png)

## Grass r.terraflow
　r.terraflowの累積流量の出力から流路を抽出した結果を赤で示します。この解析にはr.watershedを使っていません。
　平坦地の流路がほど良く直線化されています。一方で、DEMのnodataの範囲に不規則な流路ができています。
![32Waterflow比較-teraflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/9824a080-e740-49e2-a0fc-15ed210dab0c.png)

## Grass r.terraflow Filled elevation
　r.terraflowは、凹地を埋めたラスタ（Filled elevation）も出力しますので、それを前処理として、r.watershedで流路を作成した結果をオレンジで示します。
 r.terraflowとは異なりますが、平坦地の流路がほど良く直線化されています。
 ![33Waterflow比較-filled_terraflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/158c08f1-a405-48de-9ce8-fd4f5ce4a46c.png)

## 比較の結論
　尾根・谷のはっきりした山地では、凹地の平滑化による流路の出力に違いはありませんが、平坦地では大きな違いがあります。平坦地の流路をDEMから特定するのは、そもそも無理な話なので、複雑に蛇行するよりは、直線的な出力の方が好ましいと思います。
　結論として、r.terraflow Filled elevationを前処理するのがベターと思います。

# r.terraflow Filled elevationの処理方法
　r.terraflowの入力を示します。入力ラスタは[nodata値の穴埋めをしたDEM](https://qiita.com/mooya/items/6b802d585e5546a2e693#nodata%E5%80%A4%E3%81%AE%E7%A9%B4%E5%9F%8B%E3%82%81)です。SFDは意味があるか分かりませんが、一応チェックしています。出力はFilled(flooded) elevationを使用し、r.watershedの入力とします。
![34terraflow処理.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259894/1783dd97-dd10-4ee1-a453-f84a89816a77.png)

# おわりに
　r.watershedの平坦地の蛇行が気になって、最初は何とかterraflowを使う方法を考えていましたが、DEMのnodata範囲の流路を削除する方法で行き詰りました（孔なしDEMの範囲でクリップすると、途中の細切れが残るので）。
　最終的に、r.terraflow Filled elevationを前処理として使う方法がベターと結論付けましたが、r.terraflowが処理的にr.watershedよりだいぶ重いのが難点です。
　最後まで、お読みいただきありがとうございました。
【ChatGPT＋4o Image Generation】で、切り抜き文字を描画します。


　どうも、カーブミラーです。

　今回は、4o Image Generationで、切り抜き文字を描画します。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はあります。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　まずは、【ニュース】です。

　OpenAI公式から
　　ポストがありました。
　　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1917411480548565332?t=wvtIw2bSWDt3zAoo-jyPZw&s=19)

***（ChatGPT翻訳）***
先週のGPT-4oアップデートでは、過度にお世辞的で迎合的な振る舞いが見られたため、ChatGPTでのアップデートをロールバックしました。現在は、よりバランスの取れた振る舞いを持つ以前のバージョンをご利用いただけます。

何が起きたのか、それがなぜ重要なのか、そして「へつらい」への対処についての詳細は以下をご覧ください：
***

　その詳細です。
　　[Sycophancy in GPT-4o: What happened and what we’re doing about it](https://openai.com/index/sycophancy-in-gpt-4o/)

　とにかく、
　　バージョンアップする前の状態に
　　　戻してくれたようです。

　それから
　　ユーザーが
　　　ChatGPTの性格や話し方を
　　　　もっと自由に調整できる機能を
　　　　　開発中だとか。

　　カスタム指示やPromptで
　　　ロール（役割）を
　　　　決める程度だと
　　　　　ありがたいですね😸
***
　次に

　ChatGPTから
　　GPT-4が退役しました。
　　　APIは、存続しますが。

　GPT-4の発表が
　　あったのは2023年3月14日。
　　　二年もそこにいたのですね。

　御苦労様でした。
***
　では、【本題】です。

　今回は、
　　4o Image Generationで、
　　　切り抜き文字を描画します。

　切り抜き文字とは、
　　具体的な例を出すと、
　　　ドラマなどで、誘拐犯が
　　　　金持ちに送る
　　　　　身代金要求の手紙のあれです｡

　切り出し文字とも
　　呼ばれます。
　　　タイポグラフィの一種ですね。

　今回使って生成したものがこちら。
![file_0000000088406230b9941513377cf852.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/c1bab244-d19a-421b-9e6c-6f19c41811f2.png)


　Promptがこちら。
```Text:誘拐犯の手紙風Prompt
正方形（1:1フォーマット）の2Dデジタルグラフィックデザインで、日本語のフレーズ「これはテストである」が誘拐犯の手紙風に配置されている。各文字は異なる雑誌や新聞から1文字ずつ切り抜かれたもので、フォント、サイズ、背景色（黒、赤、青、ベージュなど）にバラつきがある。文字は少しずつズレて貼られており、手作業で作られたコラージュのような質感がある。このスタイルは伝統的な「身代金要求の手紙」を模したもので、不規則性とコントラストを強調している。
```

　ごらんのように
　　実際の切り貼りのように
　　　厚みがないので、
　　　　イマイチですが😅

　あっ、もちろん、
　　昨日（2025/04/30）の
　　　文字化け対策をした上で
　　　　やりましょう。

　[【ChatGPT＋4o Image Generation】で、文字入れ画像生成する際、少しでも文字化けを防ぐ方法のご紹介です。](https://qiita.com/kabumira/items/551a533c699eb95b3d4a)

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
048 AI屋さんの　無料Gemini,NotebookLM　LLMにトークン全文入力




048 AI屋さんの　無料Gemini,NotebookLM　LLMにトークン全文入力

NotebookLMに日本語で要約した
音声合成も追加されました。
技術書や特許や論文や法律や取説など
アップロードするだけで、全文入力の要約をし
解説を読み上げてくれます。


https://notebooklm.google.com/notebook/119d79dd-a376-45d9-a069-f70afaa4bb57/audio



しかも、全文の概要説明の音声合成は、
ヒトっぽいトーンの二人の会話形式なので、
ビックリするくらい、聞きやすいです。

次に出る、Geminiの音声合成出力の　
露払いですかね。
音声合成の機械感はありません。
人が話してるようにしか　聞こえません。


ちなみに、GeminiアプリのカスタムGem
　「ずんだもん」口調の場合、
読み上げは、渋めボイス（？）で、
キャラ付け音声は選べないので
しばらくの間、オリジナル開発の　「ずんだもんボット」　は活けそうです。



![スクリーンショット 2025-05-01 13.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/78e09599-f7a2-456c-91ae-c4c71264230f.png)



![スクリーンショット 2025-05-01 13.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/aa52f9a2-386e-41fe-b5f4-89bc2bd4b903.png)








---




https://blog.google/intl/ja-jp/company-news/technology/notebooklm-50/



https://www.youtube.com/watch?v=VJg37fVPy9I


---


https://blog.google/intl/ja-jp/company-news/technology/gemini-canvas/




https://www.youtube.com/watch?v=4Leardp_AGc

---


前回のHTMLには、それっぽい画像も生成してから
画像を追加してホームページを再度生成してもらいました。


静的ホームページなので、クラウド・ストレージに保存したら
そのままで、インターネットへ公開デプロイできます。
固定のポータルサイトならば、ほぼゼロ円で完成です。


---


![スクリーンショット 2025-05-01 13.23.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/fae5cbe6-e0d9-49fa-8b33-5e8ee015e23c.png)

![スクリーンショット 2025-05-01 13.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/f48ff424-8b49-4bf4-a5ec-61e7170101f3.png)





![スクリーンショット 2025-05-01 13.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/c3947e5a-dcbd-4661-b074-97a815bf2130.png)


![スクリーンショット 2025-05-01 13.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/48c6f7cd-7898-4974-bd76-80b491cf8af1.png)












---

目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7



今回も無事に、無料全文入力、大規模言語モデル完成です。

　048 AI屋さんの　無料Gemini,NotebookLM　LLMにトークン全文入力

おめでとうございます。


ー以上ー
SalesforceのDataLoaderをProxy(Basic認証)環境下で利用する方法

# 前提条件
DataLoader ： v63.0
この記事は、2025/05頃に書かれています。

バージョンや時代によってはセキュリティの制限の掛かり方が変わる可能性があります。
公式ドキュメントに書かれていても良いような気がするものの、それっポイ情報が見当たらず、DataLoaderのJARファイルをデコンパイルとかして解決したので、同じハマり方をした人に届いたらいいな？と自分への備忘も兼ねて

# DataloaderのProxy関連の設定

DataloaderのHTTPクライアントは内部的に２系統利用されている。

+ 純粋なHTTPS通信
org.apache.http.impl.client.HttpClientBuilder
を使っている。

javaの起動オプションでProxy情報（Basic認証情報）を引数で渡す

+ Salesforceが提供するAPIをDataloderが実行する時
Saleforceが独自拡張したHTTPクライアント

GUIからProxyの設定が可能

# GUIからの設定
「メニュー」→「settings」→「settings」

をひらいて、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/c65cdf0b-e6c2-4928-aab6-20a7b4638c3d.png)

+ Proxy host:
+ Proxy port:
+ Proxy username:
+ Proxy password:

を設定して、「ＯＫ」ボタンを押下する。

「メニュー」→「File」→「Exit」
で、DataLoaderを、きちんと終了する。

※ 再度、dataloader.batを起動して、きちんと設定が保存されていること確認する。


# javaの起動引数の与え方

org.apache.http.impl.client.HttpClientBuilder
で動作しているHTTPクライアントには、Dataloader設定ファイルの内容は作用しないため、
dataloader_v63.0.0\util\util.bat
を直接編集します。

```bat
:runDataLoader
    CALL :checkJavaVersion
    java -cp "%~dp0..\*" com.salesforce.dataloader.process.DataLoaderRunner %*
    EXIT /b %ERRORLEVEL%
```

上記の、javaを起動している部分（java -cp ～）に引数を追加します。

+ -Djdk.http.auth.proxying.disabledSchemes=""
+ -Djdk.http.auth.tunneling.disabledSchemes=""
+ -Dhttp.proxyHost=Proxyホスト名
+ -Dhttp.proxyPort=Proxyポート番号
+ -Dhttp.proxyUser=ユーザ名
+ -Dhttp.proxyPassword=パスワード
+ -Dhttps.proxyHost=Proxyホスト名
+ -Dhttps.proxyPort=Proxyポート番号
+ -Dhttps.proxyUser=ユーザ名
+ -Dhttps.proxyPassword=パスワード

```bat
:runDataLoader
    CALL :checkJavaVersion
java  -Djdk.http.auth.proxying.disabledSchemes=""  -Djdk.http.auth.tunneling.disabledSchemes=""  -Dhttp.proxyHost=Proxyホスト名  -Dhttp.proxyPort=Proxyポート番号  -Dhttp.proxyUser=ユーザ名  -Dhttp.proxyPassword=パスワード  -Dhttps.proxyHost=Proxyホスト名  -Dhttps.proxyPort=Proxyポート番号  -Dhttps.proxyUser=ユーザ名  -Dhttps.proxyPassword=パスワード -cp "%~dp0..\*" com.salesforce.dataloader.process.DataLoaderRunner %*
    EXIT /b %ERRORLEVEL%
```

＜参考＞

https://zenn.dev/junkor/articles/f2cd0eb267db0c

https://qiita.com/OmeletteCurry19/items/f29e84f27273d1bea7f5


# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
kubebuilder initで個人的にいつも指定するやつ

Kubebuilderは、Kubernetes Custom Resource Definition（CRD）を作成するためのフレームワークです。プロジェクトを始めるときの`kubebuilder init`コマンドにはいくつかのオプションがありますが、私はいつもこんなかんじで指定してます。

```bash
kubebuilder init \
    --domain <ドメイン名> \
    --repo github.com/<ユーザー名>/<レポジトリ名> \
    --project-name <プロジェクト名> \
    --owner "<オーナー名>"

# 例
kubebuilder init \
    --domain dns.suin.jp \
    --repo github.com/suin/kubernetes-dns \
    --project-name suin-dns \
    --owner "Suin"
```

## 各オプションの意味と私の使い方

### --domain
自分の所有しているドメイン名を指定します。これはCRDのグループとして使われます。ドメインは会社やプロジェクトなどの組織で所有していることが普通ですが、ひとつの組織でひとつしかCRDグループを作らないことは長い目で見たらないと思うので、組織のトップレベルドメインじゃなく、サブドメインを指定するようにしています。

例: `--domain dns.suin.jp`

### --repo
GitHubのリポジトリ名を指定します。これはGoのモジュール名となります。

例: `--repo github.com/suin/kubernetes-dns`

### --project-name
プロジェクト名を指定します。Kustomize マニフェストの namePrefix / namespace に使用されます。指定しないとディレクトリ名が採用されますが、開発マシン上のディレクトリ名とプロジェクト名はいつも一致するわけじゃないので、明示的に指定するようにしています。「DNS」のような一般名詞の場合は、それでnamespaceが作られては良くないと思うので、組織名などを先頭につけて`suin-dns`のようにします。

例: `--project-name suin-dns`

### --owner
プロジェクトのオーナー名を指定します。著作権情報に使用されます。指定しないと空欄になっちゃうので必ず指定するようにしています。

例: `--owner "Suin"`

## まとめ

どれもやろうと思えば後で変更できますが、できるだけ後々の手間をかけないように最初から正しく設定しておくのがおすすめです。特に--domainはCRDのグループ名に影響するため、後から変更すると既存のCRDとの互換性に影響する可能性があります。

最後までお読みくださりありがとうございました。Kubebuilderを使ったKubernetes オペレータ開発で少しでもお役に立てば嬉しいです！
【Reactアプリ100本ノック】06 Profile

## はじめに
ゆかっしゅです。
2021年に事務職からデザイナー/コーダーにジョブチェンジをし、現在はフロントエンドエンジニアにスキルアップするべく、モダンフロントエンドを学習しています。

ReactやTypeScriptの基礎学習は終了したのに、なかなか0から自分だけでアプリを作れないので手を動かすべく「Reactアプリ100本ノック」 に挑戦してみようと思います。

https://qiita.com/Sicut_study/items/ccfc451360d3f22bde63

## Reactアプリ100本ノックルール
- 主要なライブラリやフレームワークはReactである必要がありますが、その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）を組み合わせて使用することは自由
- TypeScriptを利用する
- 要件をみたせばデザインなどは自由

## 06. Profile

![スクリーンショット 2025-05-01 131004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068307/93c30fc7-31e5-461c-adf2-ce2c7e1172e7.png)

## 問題
プロフィールカードを生成できるサービスを作成します

## 目的
入力フィールドの管理を行い、状態の更新と状態を使ったUIの更新を学びます

## 達成条件
機能的なプロフィールカード:
- ユーザーが名前、誕生日、電話番号を入力し、プロフィール写真をアップロードできる
- アップロードされた画像がプレビューとして表示される
- ユーザーが生成したプロフィールカードをPNG形式でダウンロードできる

## 実際に解いてみた

### 利用技術
React(19.0.0)
TypeScript(5.0)
Next.js(15.3.1)
Tailwindcss(4.0)
jotai(2.12.3)
Vercel
html2canvas(1.4.1)

解答時間:2時間

ボタンを押すとプロフィールCardの画像をダウンロードするところの実装がわかりませんでした。
`html2canvas`という`JavaScript`のライブラリを使用しました。
`html2canvas`を使用すれば`html`の要素をキャンバスに描画して、画像として保存ができます。
しかし`html2canvas`を扱う際、`Tailwindcss`を併用しているとエラーが出るので注意が必要です。
（後ほど詳しく記載します）

### リンク
https://react-app-100.vercel.app/

## html2canvasとTailwindcssの衝突エラー

![スクリーンショット 2025-05-01 133647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068307/74b9b02b-611f-4eaa-801b-4e4fa2ddb623.png)

`Error:Attempting to parse an unsupported color function "oklch"`

プロフィールカードの画像をダウンロードしようとボタンを押すとこのようなエラーが出ました。
`oklch`がサポートされてないって雰囲気だけどそもそも`oklch`ってなんぞ？？と思ったので調べてみました。

### oklch（オーケールチ）
2023年以降CSSに導入された新しい色指定方法の一つみたいです。
`rgb`とか`HSL`とかと同じやつですね。

`Tailwind CSS`ではv4.0から`rgb`ではなく、この`oklch`でカラー指定されているようです。
`html2canvas`はこの`oklch`のカラー指定には対応しておらずエラーが出てしまったみたいです。

`oklch`の詳細に関してはこちら
https://blog.nasbi.jp/programming/frontend/css/good-looking-color-oklch/



### エラー解決方法
画像で保存する部分の色指定に関しては`Tailwind CSS`ではなくインラインスタイル等ほかの方法でCSSを記載するとエラーが解消されました。
[備忘録] git revert -m 1/2どっちだ？

# はじめに
`git revert`するときに、`-m 1`なのか`-m 2`なのか分からなくなったので勉強し直したメモ。

:::note
[結論] 基本的に以下のコマンドでヨシ
`git revert -m 1 <merge commit id>`
:::

# 数字の意味とは
revertしたいときは、何かしら悪さをするコミットがあるとき。
件の悪さをするコミット（以下、邪魔コミット）の視点で考えるとイメージしやすい。

## `-m 1` のとき
邪魔コミットが自分から離れるイメージ。
作業中のメインストリームにて、自身由来の問題が発生したとき「あ、これ自分が邪魔してるな。離れよ」という感じ。
殆どのケースはこれ。

## `-m 2` のとき
邪魔コミットを突き放すイメージ。
作業中のメインストリームにて、自身由来の問題が発生したとき「大変だねアンタら。……え？私が追放されるんですか？」という感じ。
他ブランチを取り込んで何かしたときに邪魔になって/不要になって切り離したいときに使う。
レアケース。
【セルフホスティング可能】Notion代替オープンソース3選【2025年版】

# 【セルフホスティング可能】Notion代替オープンソース3選【2025年版】

近年、メモ・ドキュメント・データベース・タスク管理を統合したワークスペースツールとして**Notion**が広く普及しています。  
しかし、**オープンソース**かつ**セルフホスティング可能**な選択肢も増えてきており、

- セキュリティ・プライバシーを自前で管理したい
- クラウド依存を減らしたい
- 独自カスタマイズをしたい

といったニーズに応える流れが強まっています。

この記事では、2025年時点で勢いがあり、開発も活発な **「Notion代替OSS」** を3つ紹介します！

---

## 1. AppFlowy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/ac328f17-205a-4df4-96c9-fc945a45cf1a.png)
(GitHubより)


- **公式サイト**：[AppFlowy](https://www.appflowy.io/)
- **GitHub**：[appflowy/appflowy](https://github.com/AppFlowy-IO/AppFlowy)

### 概要

AppFlowyは、**Flutter**と**Rust**で開発されたモダンなオープンソースワークスペースです。  
開発は2021年に始まり、現在GitHubスター数も6万以上を超えるなど、注目を集めています。

「Notionのエクスペリエンスを、OSSとして、プライバシーファーストで」というコンセプトが特徴です。

### 特徴

- ブロックエディタによる柔軟なドキュメント作成
- カスタマイズ可能なタスク管理
- AIアシスタント（チャットボット・文書生成支援）
- オフラインモード対応（ローカルファースト設計）
- モバイル（iOS/Android）対応アプリあり

### セルフホスティング

Docker Composeファイルが提供されており、手軽にオンプレミス環境へデプロイ可能です。  
データベース・ファイルストレージ構成もシンプルなため、自前サーバー運用にも向いています。

---

## 2. AFFiNE

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/e3b66811-0eaf-4df4-b006-58bc7258fefc.png)
(公式サイトより)

- **公式サイト**：[AFFiNE](https://affine.pro/)
- **GitHub**：[toeverything/AFFiNE](https://github.com/toeverything/AFFiNE)

### 概要

AFFiNEは、「**Notion**と**Miro**を統合した次世代ナレッジベース」として登場したプロジェクトです。  
リッチテキストドキュメント・ホワイトボード・データベース機能をシームレスに統合し、  
柔軟なナレッジ管理・タスク管理を実現します。

ローカルファースト（先に手元保存→クラウド同期型）思想が貫かれており、**プライバシー重視派**にも人気です。

### 特徴

- 無限キャンバス上で文書・付箋・マインドマップを作成
- ブロック型エディタとビジュアルエディタを自由に切り替え
- AIアシスタントによる文書補助・マインドマップ自動生成
- 複数ユーザーによるリアルタイム共同編集
- オフラインでの完全動作に対応

### セルフホスティング

オフィシャルでDockerイメージが配布されており、簡単にセルフホスト可能です。  
また、MITライセンスでソースコードも公開されているため、自由にカスタマイズやフォークも可能です。

---

## 3. Outline

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671694/2ad4b1e7-85f4-47d8-bc5a-0c28a0687b21.png)
(GitHubより)

- **公式サイト**：[Outline](https://www.getoutline.com/)
- **GitHub**：[outline/outline](https://github.com/outline/outline)

### 概要

Outlineは、**チーム用Wiki**に特化した軽量なオープンソースソフトウェアです。  
「シンプル」「高速」「拡張性」を重視した設計が特徴で、社内ナレッジ管理に最適な選択肢の一つです。

Node.js＋Reactで開発されており、スピーディなレスポンスと安定性を兼ね備えています。

### 特徴

- マークダウンベースのリッチな文書作成
- タグ、カテゴリ管理、全文検索機能
- Slack連携・SSO認証など豊富な外部連携
- 共同編集・コメント機能によるチームコラボレーション
- ダークモード対応

### セルフホスティング

公式ドキュメントにDocker-Composeファイルが用意されており、  
GitHubリポジトリからすぐにセルフホスティング環境を立ち上げることができます。

また、プライベートネットワーク上のみで運用することも可能なため、  
情報漏洩リスクを最小限に抑える運用も容易です。

---

# まとめ

本記事では、**Notionの代替となり得るオープンソースプロジェクト**として、

- **AppFlowy**：ブロック型でAI支援も視野に入れたモダンOSS
- **AFFiNE**：ドキュメント＋ホワイトボード統合型でビジュアル操作も可能
- **Outline**：チーム用Wiki特化でシンプル・軽量な管理を実現

という3つのツールを紹介しました。

いずれも**セルフホスティング可能**であり、  
セキュリティ重視のプロジェクトやコスト削減を目指すチームに非常に有力な選択肢となります。

もし、  
- 「社内の情報共有にオープンソースツールを使いたい」
- 「データをクラウドに預けず、自社管理したい」
という方は、ぜひ一度試してみてください！

最近OSSにハマっていて色々と調べたり使ってみたりしているので、定期的にこういった記事を書こうと思っています！
開発経験の少ない学生5人でHack U Kosenに出場した話

高専本科4年の12月、友人からの誘いでLINE Yahoo主催のハッカソンHack U Kosen 2023に出場しました。
1年くらい経ちましたが、忘れてしまう前に備忘録として書き記しておきます。


# はじめてのハッカソン
就活が始まる前に、自分含めて5人で出場することにしました。
課題や研究室での活動である程度の技術力はあるはずなんですが、普段からハッカソンやコンテストに積極的に参加するタイプではなく、そもそもアプリ開発なんてほぼしたことがないような友人で集まったので正直不安でした。
開発期間は12/4~12/22までの18日間、アイデア出しから開発まで完成させなければならないです。
他のハッカソンに出たことがないので知りませんが、割と長めなのかな、優秀なチームはクオリティあげてきそうだな～とか考えてました。
正直最優秀賞が取れるほどの物は作れないと思ったので、とにかく期間内できちんと動くアプリを完成させようと思いました。

## メンバー
ぼく・・・Python、JSなどで簡単なアプリなら作れる程度。複数人での開発は5dayインターンでのWebサイト開発のみ。

開発系の研究室で頑張ってる友人A
開発経験は少ないが、成績優秀の友人B
機械学習を主に行う研究室でモデル学習の手伝いをしてる開発未経験友人C,D


以上5人

僕はアイデアやデザイン面ではからっきしなので、
友人Aがプロジェクトの全体を、開発面を僕が主導する形になりました。


# 開発テーマ

今回の開発テーマは「クリスマスをHackせよ！」でした。

正直頭の中は？？？でしたが、とにかくクリスマスに関連したアプリを作ればいいのかなって感じです。
発表会は12/23だしピッタリのテーマですね。

開発キックオフから数日はアイデア出しで消費してしまいました。

トナカイのレースゲームや、サンタクロース変身アプリとかいろいろな案を出した結果、加速度センサを利用してスマホを振ることで、みんなで音楽を演奏するパーティゲームのようなものに決定しました。

今振り返ると安易にゲームの開発に行くのはよっぽどクオリティが高くないと入賞は厳しいのかなと。



# 開発期間

試行錯誤しながら進めていきました

当初の予定では、
+ ジングルベルの音源を2~8人用にパートごとで分割し、全パターン用意する(パワープレイ)
+ クリスマスケーキを参加人数で分割し、サーバー側のPythonに画像を送信することで何等分か検出し、人数を取得(YoloX)
+ ブラウザを開き、参加者間で同期し、加速度センサの値によって動的に音量を変化させ曲を演奏する

っていう感じだったんですが、少ない開発期間で
+ 物体検出でケーキの分割数を検出できない
+ そもそもサーバーの知識が無く、システムが安定しない
+ 参加者間orサーバーと同期することができない

ことが判明したため、システムの構成を変更しました

+ サーバーをAzure web appへ変更
+ 人数の検出をTensorflow.jsを活用した集合写真での人物検出へ変更
+ 参加者間の同期を、時間での一括スタートへ変更(60秒ごとにスタートする方式)

![Slide3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779219/d0388087-e59a-49e0-b57a-cbd668049279.jpeg)

今でこそChatGPT等のAPIを活用すれば簡単にケーキの分割数を検出することはできそうですが、当時はLLMを使うのはハードルが高かったですし、
わざわざPythonに送信して推論を行うのは現実的でなかったので、Tensorflow.jsでcocoSSDというモデルを使用しました。
後付けの理由になりますが、高専生は写真を取らなすぎる問題があるので、フレームとロゴをつけて保存できるようにしました。これは我ながらいいアイデアだと思った

![Slide4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779219/c241d252-98b7-4896-89a1-03df5287e0cf.jpeg)

# 開発を担当した部分

以下の部分を担当しました
+ Azure web appの環境構築
+ HTML/CSS+PHPの実装
+ Tensorflow.jsによる物体検出
+ Howler.jsと加速度センサを組み合わせた音源再生の制御
+ 時間を取得して分ごとに指定したゲームページへ遷移
+ アップロードした画像にロゴをつけて表示+保存

Figmaやプレゼン資料などは他のメンバーに任せて開発の大部分を担当しました。
特に加速度センサの挙動に合わせて音源を制御するのにだいぶ苦労した覚えがあります。

# 学んだこと
とにかく要件定義の大切さを実感しました。
アイデア出しにたくさん時間をかけるのはいいんですが、
実際に自分たちの能力で実現可能かどうかまで話し合うべきでした。
知識も経験も足りない手探り状態での進行だったので仕方がないとは思いますが、詰めれるときに詰めといたほうが途中であたふたせずに済んだかなと思います。
結果的に入賞すらできずに惨敗しましたが、いい経験になりました。結構楽しかった。


成績を残したチームは明らかにクオリティが違っていてびっくりでした。
そもそもwebアプリよりもネイティブアプリを開発していたりデザインがキレイだったり・・・。
デザインの勉強もしないと良いものは作れないんだなあと感じました。
消費税の計算をPythonでまとめて簡単に実行する方法

![ChatGPT Image 2025年5月1日 13_27_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053067/baca949d-0a82-4d17-ad62-a5d27fd29604.png)

複数の商品を買った時のレシートが、商品毎に税抜で書かれているお店が結構あります。

家計簿を書く時に、１商品毎に電卓で8％とか10％とかを計算するのが面倒なので、
リストに税抜価格を書いていって、一度に消費税計算をしてリストで返す方法を使ったら電卓不要で簡単だったので、その方法をご紹介。

（8％と10％を混合で計算すると、構文がややこしくなるので8％だけで計算する方法にしています。10％の場合は`int(x * 1.08)`　を　`int(x * 1.10)`　に変えるだけ。）

Pythonの開発環境がない場合は、Google Colaboratory (Colab)がおすすめ。
詳しくは下記をご参照ください。
https://qiita.com/saki_bleue/items/ca29364f1f79cce5078f

# ラムダ式のmap関数
```.py
# 消費税8％のもの、少数以下切り捨てで計算。
# []の中の数字はサンプルです。
a = list(map(lambda x: int(x * 1.08), [348, 798, 448]))
print(a)

```
上記を実行すると　`[375, 861, 483]`　と税込価格がリストの形で結果として返ります。

`int(x * 1.08)` のところで、少数型を整数型へキャスト＝少数以下を切り捨てしています。

[]の中の数字のところを、サンプルと同じようにカンマ区切りで税抜価格を入れて実行してください。入れる数字は何個でも大丈夫。

何個の商品を計算したか知りたい場合は、 `print(len(a))` で[]の中にある値の数を返してくれます。

# 関数を定義する方法
関数を作る方法もありますが、行数が長くなるので上のパターンで充分かと思います。
一応載せておきますので参考にしてみてください。

```.py
def multiply_and_floor(lst):
    result = []
    for x in lst:
        val = int(x * 1.08)
        result.append(val)
    return result

nums = [348, 798, 448]
a = multiply_and_floor(nums)
print(a)
```
`nums = [348, 798, 448]` の[]の中はサンプルの価格です。
React + Rails初心者の歩み 〜初級編：超基礎アプリ開発①〜

# はじめに
今回は問題集：初心者編の「簡単なカウンターアプリ」をReactのみで作成していきます。

https://qiita.com/tukaji/items/649d7dc3e0d43d597250

# useStateの理解
useStateを理解する前にまず、Reactには状態（state）という概念があります。
これは例えるなら、ゲーム上で「現在のスコア」「残りHP」など、
今どうなっているかを状態（state）というようです。

## useStateは「状態を入れる箱」を作るもの
useStateを使うとそういった「状態をしまっておく箱」が作れるようになります。
例えば以下の様な感じ
```
const [count,setCount] = useState(0);
```
中身を解説するとこんな感じです。
<table>
    <tr>
        <th>言葉</th>
        <th>例え</th>
    </tr>
    <tr>
        <td>count</td>
        <td>今の中身の状態</td>
    </tr>
    <tr>
        <td>setCount</td>
        <td>箱の中身を変えるためのボタン</td>
    </tr>
    <tr>
        <td>useState(0)</td>
        <td>箱を作るときの初期値（例で言うと数字の0）</td>
    </tr>
</table>

これを使って数字を増減させるカウンターアプリを作っていきます。

# カウンターアプリについて
カウンターアプリの仕様としてはとてもシンプルです。
* 「+」をクリックすれば数字が増え
* 「-」をクリックすれば数字が減る



まずApp.jsxの書かれている元のコードを以下の様な形なる様に削除します。
```
function App() {
  return (
      
  )
}

export default App
```

useStateを使うにはファイルの一番上でuseStateをimportします。
```
import { useState } from 'react' //追加
import './App.css' //お好みでCSS調整してください

function App() {
  return (
      
  )
}

export default App
```
これだけでuseStateが使える様になります。
では、useStateを使って箱を作っていきます。
```
import { useState } from 'react'
import './App.css'

function App() {
  const [count,setCount] = useState(0); //追加
  return (
      
  )
}

export default App
```
先ほど例題に挙げたコードそのままなので解説は省きます。
useStateで箱を作ったので、これを使ってまずは数字を増やせる様にしていきます。

### カウンターの表示
まず、クリックするたびに数字を増やすカウンターの表示を作ります。
{count}がそれになります。
初期値は「0」にしているので、「0」が表示されます。
```
import { useState } from 'react'
import './App.css'

function App() {
  const [count,setCount] = useState(0);
  return (
    <>
      <div className="card">{count}</div> //追加
    </>
  )
}

export default App
```

### setCountを使った数値の増減
次にsetCountをクリックイベント（onClick）に組み込みます。
setCountの中で「現在の数値」+「1」を行なって、クリックするたびに+1されるようにします。
```
import { useState } from 'react'
import './App.css'

function App() {
  const [count,setCount] = useState(0);
  return (
    <>
      <div className="card">{count}</div>
      <button className="btn" onClick={()=>setCount(count + 1)}>+</button> //追加
    </>
  )
}

export default App
```

これだけでカウンターアプリは完成ですね。
ついでに数値を減らす仕組みも作ります。
とはいえお察しかと思いますが、「count + 1」を「count - 1」にするだけです。
```
import { useState } from 'react'
import './App.css'

function App() {
  const [count,setCount] = useState(0);
  return (
    <>
      <div className="card">{count}</div>
      <button className="btn" onClick={()=>setCount(count + 1)}>+</button>
      <button className="btn" onClick={()=>setCount(count - 1)}>-</button> //追加
    </>
  )
}

export default App
```

完成！！！

# まとめ
今までだったらコピペッで「はいおわりー」とかいって作った気になっていたんですが、
学習内容をしっかり理解して作ると「おぉーーー」ってなりました。
こういう学習は1つ1つ理解できるようになってくるとやっぱり楽しいですねー。

次回は、「フォームから名前を入力して表示するアプリ」です！
ではまた。

https://qiita.com/tukaji/items/649d7dc3e0d43d597250
Windows / Linux / Ubuntu / WSL のちがいを携帯電話に例えてみた。

# Windows / Linux / Ubuntu / WSL のちがいを解説する記事を探しても見つからなかったので作成してみた。

この記事ではパソコンの基本ソフト（OS）である **Windows** と **Linux**、その中でも初心者向けに使いやすくまとめた **Ubuntu**、そして Windows 上で Linux を動かせる **WSL** を、スマホ例を使ってシンプルにまとめました。

## 1. OS って何？

- **OS（オーエス）** は、スマホでいうところの **iOS** や **Android**。  
- アプリを起動したり、画面に文字を表示したりする「土台」です。
---

## 2. スマホ例で 4つを整理

| 名前       | スマホに例えると                 | どういうもの？                                  |
| ---------- | -------------------------------- | ----------------------------------------------- |
| **Windows**　　 | iPhone（iOS）                   | 最初から入っているOS。ゲームやOfficeが動きやすい |
| **Linux**   | Android                         | オープンソース。主に開発で使用       |
| **Ubuntu** 　 | GooglePixel     | Linuxを初心者向けにチューニングしたOS         |
| **WSL**     | iPhoneにインストールする「体験アプリ」| アプリを入れるだけで、Linuxが利用できる |

> **ポイント**  
> - Windows と Linux はどちらも「OS」という同じ土台  
> - Ubuntu は Linux の中の「公式＆初心者向けバージョン」  
> - WSL は「Windows にアプリを追加してLinux環境を手軽に体験」する仕組み

---

## 3. 目的別オススメ

| やりたいこと                       | オススメ          | 理由                                      |
| ---------------------------------- | ----------------- | ----------------------------------------- |
| Windows PC のままで Linux を試したい | **WSL + Ubuntu** | 数クリックで導入。再起動不要ですぐ学習OK    |
| 古いノートPC をサクサク動かしたい   | **Ubuntu**       | 軽量で無料。情報が豊富でトラブル対策が楽    |
| ゲームや動画編集をメインで使う     | **Windows**      | Windows対応ソフトがほとんど                |
| サーバ運用や組み込み開発を学びたい | **Ubuntu/Linux** | 本番の現場と同じ環境で勉強できる          |
電子ペーパーディスプレイDASUNG253について

https://sktgroup.co.jp/paperlike253/

中古で上のディスプレイを購入した。白黒のライトなしのもの。現在はカラーの方が出ているので一つ昔のタイプ。

texで文章を作成するときに電子ペーパーでモニタしながら作成できたらいいのではと考え、買ってみた。
あまりレビューがなかったので、触ってみて気づいたことをメモしていく。

自分はm1maxのmacbookを使用。


HDMIを引き抜いたらそのまま画面表示が残るかもと考えていたが、それはなかった。普通に写していた画面は消えてしまいます。電子ペーパーだからそのままだったらよかったのに。もしくは画面の一時停止ボタンがあればよかったのにと思った。

画面は結構暗いです。液晶のディスプレイとは違うので当然ですが。

お昼とかは光が十分あるので結構綺麗です。ディスプレイライトが必要かも。

画面は薄くて、大きい。A4のプリント3枚分を常にtexの出力として表示しているのでいい感じ。

普通のディスプレイみたいにwebのブラウザは自分的には厳しかった。
コードの表示も厳しい気がします。
GCCコンパイラ最適化　未使用変数が完全に消える​​

## 初めに

### C言語ソース
```unused_var.c
int main() {
    int used = 3;
    int unused = 10;  // 使用されない変数
    return used * 2;
}
```

### 最適化の設定

```
最適化なし (-O0)
gcc -S -O0 -masm=intel unused_var.c -o unused_varO0.s

最大最適化 (-O3)
gcc -S -O3 -masm=intel unused_var.c -o unused_varO3.s
```
### 最適化しない場合
<details>
<summary>unused_varO0.s のコード</summary>

```unused_varO0.s
	.file	"unused_var.c"
	.intel_syntax noprefix
	.def	___main;	.scl	2;	.type	32;	.endef
	.text
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
LFB0:
	.cfi_startproc
	push	ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	mov	ebp, esp
	.cfi_def_cfa_register 5
	and	esp, -16
	sub	esp, 16
	call	___main
	mov	DWORD PTR [esp+12], 3
	mov	DWORD PTR [esp+8], 10
	mov	eax, DWORD PTR [esp+12]
	add	eax, eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE0:
	.ident	"GCC: (MinGW.org GCC-6.3.0-1) 6.3.0"
```
</details>

### 最適化する場合
<details>
<summary>unused_varO3.s のコード</summary>

```unused_varO3.s
	.file	"unused_var.c"
	.intel_syntax noprefix
	.def	___main;	.scl	2;	.type	32;	.endef
	.section	.text.startup,"x"
	.p2align 4,,15
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
LFB0:
	.cfi_startproc
	push	ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	mov	ebp, esp
	.cfi_def_cfa_register 5
	and	esp, -16
	call	___main
	mov	eax, 6
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE0:
	.ident	"GCC: (MinGW.org GCC-6.3.0-1) 6.3.0"
```
</details>

## 分析
未使用変数が消えた。
スタックに詰めてから取り出す処理が無くなった。
used * 2の結果をそのまま返り値eaxレジスタに詰めている。
```
	mov	DWORD PTR [esp+12], 3
	mov	DWORD PTR [esp+8], 10
	mov	eax, DWORD PTR [esp+12]
	add	eax, eax
```
が1行に短縮される。
```
	mov	eax, 6
```
## 動作環境
windows7 Version6.1.7601
GCC-6.3.0-1
（帰省中につき一時的に昔のパソコンを使用している。windows7が懐かしい。。。）
URLが変更される

おはようございます。
Mac os 15.4.1 
safari
で

<form action=index.php method="POST">
 <input type=hidden name=user_id value=user1>
</form>

で送っているのに、
Not Found

The requested URL was not found on this server.

が出るので、
URLを見ると
https://url.com/intdex.php?user_id=user1
になっています。
この　intdex　の　t　はどうしてなのでしょう？

ちみに

intdex.php
というファイルを作って
<meta http-equiv="refresh"content="0;URL=intdex.php?user_id=user1"
を置いてみましたが
やはり、
intdex.php
に飛びます。

何が原因でしょうか？