OmniAICreator/Qiita-1.07M huggingface dataset:
アクセス集中に耐えうる共通基盤をつくろう

# はじめに
複数のサービスを立ち上げて、運用している企業の中で、実際には一人のユーザーに対して、ユーザー情報が複数できてしまって、広告効率や運用効率が下がってしまっているようなお悩みを聞くことがあります。とはいえ、会員の属性の管理や、どのシステムを誰が使ってよいのか？という認可の部分も多く相談を受けます。オンラインでのアクション(例えば、ECサイトでの購入やシリアルナンバーの入力)からすぐさまコンテンツを確認できるような仕組みや、サービスの利用開始になる仕組みを構築することが増えてきました。その中でお話できることを書いてみます。

:::note
共通基盤と呼んだり、認証基盤・会員基盤などと呼ばれるケースがありますが、今回は"共通基盤"と呼ぶことにします。
:::

# 解決したいこと
1. 各サービスで同一のユーザーを1アカウントとして扱いたい 一元管理
1. 必要な情報だけ共有できる形で、疎結合な状態にしたい
1. どのシステムで誰が何を利用できるのかを管理したい

# 考えたこと
1. 認証システムはSaasのシステムを利用する
1. Client Credentials Flowを使って、各サービスが参照できる内容などを定義する
1. 認証システム側に購入履歴などを持たせて、ライセンスの管理をしたところで、認証システムへの負荷が上がって、アクセスできない状態がうまれては元も子もない
1. 一つのサービスが落ちることよりも、全体のサービスが継続稼働することを優先した。各サービス側で最適なリソースや負荷対策をすることで解消できるようにする
1. ライセンスの付与・削除および有効期限を正しく管理することで、情報を「配信」して、各サービスに保存する形で運用することが最もAPI実行数を節約できる

# 実行したこと
1. Barista(https://prismatix.jp/authenticate/)を採用して、利用者と認証の負荷に関する対応はお任せした
1. 各サービスごとにClientを発行。情報の使える範囲を限定し、会員情報の矢印を一方通行にした
1. 認証システムには会員情報の基本的な内容以外持たせないことにした。iOSアプリでの会員登録をすることも想定し、個人情報も最小限にした
1. AWSのSQSとSESを使い、ライセンス情報に動きがあれば情報を発行。各サービスへ、情報取得のアクションと取得後の消し込みを各サービス主体で行うことで、確実に受け取ったことを実現

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49177/b8c707bf-ed46-47ea-18e5-41918f916b5f.png)

# 実際にやってみて
各システム側の構築のコストとして、認証基盤とのつなぎこみとライセンス情報の保存の部分は、負担が一部上がる結果にはなったが、どこかのシステムに大量のアクセスや負荷があったとしても、完全に切り離すことができた。
どの情報をどこに持つか、という設計で、インフラや実装方法ではなく、データ管理の方針でも負荷対策として正しい対策となりうる。設計時にどのくらいのアクセスや利用があるか想定できていないと、このような解消は実現できなかったと思う。
SSOで多くのシステムを連携して〜とか、ポイント管理を複数サービスで共通にして〜などの話はあるが、ノウハウがないと正しい設計はできず、それぞれをただ利用しているシステムが出来上がり、あとになって相談に来るケースがある。最初にどの程度のサービスの伸びを考えるか、将来を見越した設計をするのか、直近のコストを優先するか。
プロジェクトの状況において様々あるが、何を重視するか、を正しく議論して設計に望んでほしい
Excelに画像を自動で貼り付ける(php)


## はじめに

テスト時の作業としてプログラム実行前と実行後のスクリーンショットを貼り付けてエビデンス資料を作成する作業をしていたことがあります。

作業時はスクリーンショットを都度撮り、あとでスクリーンショットを１枚ずつExcelの挿入機能で貼り付けるといった流れで行っていました。

手作業で漏れが発生したり、単純に量が多いと時間がかかるので、これを自動化するpowershellスクリプトを作成していました。

今回はphpの勉強も兼ねて、powershellでなくphpでExcelに画像フォルダ内の画像を順番に貼り付けるプログラムを組んでみました。

## プログラムの概要
PhpSpreadsheetという、PhpExcelライブラリの後継となるものを使用してエクセルの操作を行います。
・フォルダに格納された画像を読み込み、サイズを取得して貼り付け
・次の貼り付けセルを設定（前の貼り付けた画像のサイズから計算）
・全て貼り付けたらエクセルを保存

## 事前準備
composerのインストール(macOS)
```
brew install composer
```

phpspreadsheetのインストール
```
composer require phpoffice/phpspreadsheet
```

GDとZip拡張のインストール
```
brew install php@8.2-gd php@8.2-zip
```

貼り付ける画像フォルダを準備
貼り付け先エクセルを準備（中身は空）

## ソースコード

```php
<?php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;

// 貼り付ける画像フォルダのフルパスを指定
$folderPath = "/images";
// 貼り付けるExcelのフルパスを指定
$outputFilePath = "/エビデンス.xlsx";

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$images = glob($folderPath . "/*.{jpg,jpeg,png,gif}", GLOB_BRACE);

$row = 1;

foreach ($images as $imagePath) {
    list($width, $height) = getimagesize($imagePath);  

    $drawing = new Drawing();
    $drawing->setName('Image');
    $drawing->setDescription('Image inserted from ' . $imagePath);
    $drawing->setPath($imagePath);
    $drawing->setHeight($height);
    $drawing->setWidth($width);
    $drawing->setCoordinates('A' . $row);
    $drawing->setWorksheet($sheet);

    // 次の画像を貼り付ける行を取得
    $row += ceil($height / 20) + 1; 
}

$writer = new Xlsx($spreadsheet);
$writer->save($outputFilePath);

echo "Excelに画像を貼り付けました: $outputFilePath\n";

```

## まとめ
単純なプログラムではありますが、PhpSpreadsheetを使ったエクセルの操作に一通り触れることができました。

画像サイズに応じて次の画像の貼り付け位置を変えるようにしていますが、画像サイズがバラバラのときエビデンスとしては見にくい資料となってしまうので、リサイズ等の処理を入れるなど改善してみたいなと思います。


## 参考
[PhpSpreadsheet](https://github.com/PHPOffice/PhpSpreadsheet)
[PhpSpreadsheetでExcelを読み書きしてExcelとしてダウンロードする](https://qiita.com/haruna-nagayoshi/items/bccc4b844e909608f514)
[PhpSpreadsheetのTIPSあれこれ](https://qiita.com/BRSF/items/ed32311d48161be7c719)
WebページにPC-98エミュレータを埋め込む

先日、 [VZ Editor for Web](https://vzeditor.surge.sh) というWebページを公開しました。ページ内でPC-98エミュレータが起動して[VZ Editor](https://github.com/vcraftjp/VZEditor)を試せるというものです。

https://x.com/irori___/status/1861675151018041386

このページのHTMLソースを見てみると、PC-98エミュレータを埋め込んでいる部分は次のたった2行であることがわかります。

```html
  <script src="https://unpkg.com/np2-wasm@0.3.1/dist/elements.js" type="module"></script>
  <PC-9801 cpu-clock="15MHz" memory="2MB" fdd1="fd98_2hd.img" fdd2="VZ_98.XDF" no-mouse></PC-9801>
```

`<PC-9801>` という見慣れないタグがあります。これは一体なんでしょうか。

最近のブラウザには[カスタム要素](https://developer.mozilla.org/ja/docs/Web/API/Web_components/Using_custom_elements)と呼ばれる、JavaScriptから新しいHTMLタグを定義する機能があります。上のコードでは、`<script>`タグで読み込まれるスクリプトが`<PC-9801>`タグを定義しています[^1]。このスクリプトは拙作の [np2-wasm](https://github.com/irori/np2-wasm) ライブラリで、[Neko Project II](http://www.yui.ne.jp/np2/) のWebAssembly移植を`<PC-9801>`タグの内側で動かします。

[^1]: ちなみにどんな名前のタグでも定義できるわけではなく、名前にハイフン (`-`) が含まれる必要があります。確かに "PC-9801" にはハイフンが入っていますね

エミュレータの設定は `<PC-9801>` タグの属性で指定します。上のコードはCPUクロックが15MHz、メモリが2MBのエミュレータを作成し、２台のフロッピーディスクドライブに `fd98_2hd.img`[^2]と`VZ_98.XDF`[^3]をそれぞれセットして起動する、という意味になります。`fdd1` と `fdd2` に指定するのはディスクイメージのURLですが、[同一生成元ポリシー](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy)が適用されるため別のサイトにあるディスクイメージを直接読み込むことはできません。

[^2]: [FreeDOS(98)](https://github.com/lpproj/fdkernel)のディスクイメージにVZ Editor起動用の`AUTOEXEC.BAT`を追加したもの
[^3]: VZ Editorのディスクイメージ

利用可能な属性の一覧などは np2-wasm の[ドキュメント](https://github.com/irori/np2-wasm/blob/main/README_ja.md)を参照してください。JavaScript APIもあって、そちらを使うとエミュレータの挙動をより細かく制御できます。

このようにディスクイメージさえ用意すれば、PC-98エミュレータをWebページに簡単に埋め込むことができます。PC-98時代の資産をお持ちの著作権者の皆様は、Web上で動く形で共有してみてはいかがでしょうか。
cscの作法 その542

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
iconを使え。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/26e8bc8e-ae89-56ba-a9e9-9f53a4a33893.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	form1() {
		Text = "icon";
		ClientSize = new Size(200, 200);
		Button btn1 = new Button();
		btn1.Location = new Point(50, 50);
		btn1.Text = "test";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
		this.Icon = new Icon("dolphin.ico");
	}
	void btn1_Click(object sender, System.EventArgs e) {
		MessageBox.Show("Hello World", "こんちは");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}



```

以上
C++でDelegate作ってみた



---

# はじめに

C# から C++ に移行した際、C# の `Delegate` が C++ には存在しないことを知り、  
自作で `Delegate` を実装してみました。  
C++ 初心者なので間違いがあればごめんなさい。

---

# 実装内容

以下が実際に作った `Delegate` クラスのコードです。

### **Delegate.h**
```cpp
#pragma once
#include <vector>
#include <functional>

class Delegate
{
public:
    // 関数を登録
    void Add(std::function<void()> func);

    // 関数を削除
    void Remove(std::function<void()> funcToRemove);

    // 登録した関数をすべて呼び出し
    void Invoke();

    // 登録した関数をすべて削除
    void Clear();

private:
    std::vector<std::function<void()>> delegates;
};
```

### **Delegate.cpp**
```cpp
#include "Delegate.h"
#include <algorithm>

// 関数を登録
void Delegate::Add(std::function<void()> func)
{
    delegates.push_back(func);
}

// 関数を削除
void Delegate::Remove(std::function<void()> funcToRemove)
{
    auto it = std::find_if(delegates.begin(), delegates.end(),
        [&funcToRemove](const std::function<void()>& func)
        {
            return func.target<void()>() == funcToRemove.target<void()>();
        });

    if (it != delegates.end())
    {
        delegates.erase(it);
    }
}

// 登録した関数を呼び出し
void Delegate::Invoke()
{
    for (auto& delegate : delegates)
    {
        delegate();
    }
}

// 登録した関数をすべて削除
void Delegate::Clear()
{
    delegates.clear();
}
```

---

# 使い方

以下は、`Delegate` クラスを使った具体的な例です。

```cpp
#include "Delegate.h"
#include <iostream>

void Log()
{
    std::cout << "ハロー！\n";
}

int main()
{
    Delegate* delegate = new Delegate();

    // 関数を登録
    delegate->Add(Log);

    // 登録した関数をすべて実行
    delegate->Invoke();

    // 後処理（メモリ解放）
    delete delegate;
    return 0;
}
```

### 実行結果
```
ハロー！
```

---

# 解説

C++ の `std::function` と `std::vector` を使い、複数の関数を動的に登録・削除・実行する仕組みを実現しました。

- **`Add`**  
  新しい関数をリストに追加します。
  
- **`Remove`**  
  登録した関数を削除します。関数ポインタを比較するために、`std::function::target` を使っています。

- **`Invoke`**  
  登録した関数をすべて呼び出します。

- **`Clear`**  
  全登録を削除してリセットします。

---

# まとめ

C# の `Delegate` に近い動作を C++ で実現できるようになりました！  
この仕組みを活用して、Unity の Input System のようなシステムを作れたらと思います。

C++ でもう少し簡潔に書ける方法や改善点があればぜひ教えてください！
OMCB030E(1487)

https://onlinemathcontest.com/contests/omcb030/tasks/9540

(別解を写経しました。自分の理解用です。)

![OMCB030E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543462/ac34384a-991a-9501-f9a1-cf3719d85be5.png)

$DH=x$と置いたとき、$△BDH∽△ADC$であるので、以下の式が成立します。
$3:x=4+x:4$
これを解くと$x=-6,2$となり、$x>0$なので、$x=2$が求まります。

ここからは座標で考えます。
$D$を$(0,0)$と置き、$E$の座標を求めます。
$E$は$BE$と$AC$の交点なので、
$y=-\frac{3}{2}x+6$
$y=\frac{2}{3}x+2$
の解が交点の座標になります。

これを解くと、$(\frac{24}{13},\frac{42}{13})$となります。
$DE$の長さは
$\frac{\sqrt{24^2+42^2}}{13}$
$=\frac{6×\sqrt{4^2+7^2}}{13}$
$=\frac{6\sqrt{65}}{13}$。

したがって、解は$6+65+13=84$。
WindowsServerのNIC側で帯域制限をかける方法

## はじめに
- データのバックアップやコピー、負荷試験など、本番環境と同じネットワークに置いているサーバで帯域制限をかけたい場面が出てくるかと思います
- WindowsServerのQoS機能を使ってもいいですが、宛先/送信元IPアドレス、宛先/送信元ポートなど考えることが多くて面倒くさい場合は、NICで帯域をかけちゃいましょう、って魂胆です

## 方法
- [コントロールパネル] -> [ネットワークと共有センター] -> [アダプターの設定の変更] -> 対象のNICを右クリック -> [プロパティ]を開く
- [接続の方法：]の箇所にNICのアダプターが表示されるので、[構成]をクリック
- ドライバーのプロパティが開くので、[詳細設定]タブから[速度とデュプレックス]を選択し、値をオートネゴシエーションから任意の値に変更する。

- 注意：
    - **設定適用後、NICのリセットがかかるようで接続が数秒切れることに注意**
    - 対向のスイッチがきちんとオートネゴシエーションであることを確認しましょう
【Minecraft】PortSentryを用いたポートスキャン対策

Minecraftのマルチプレイサーバーを運用するには、ポートを解放しておく必要があります。ポートを開放していると、ポートスキャンをされたときにそのポートがバレます。Minecraftサーバはたいてい25565番ポートを使っているので、それがバレると全世界から愉快なマインクラフターたちが入ってくるようになります。
弊サークルのサーバではホワイトリストを運用していないので、ポートスキャン対策の必要性を感じました。

# インストール
deb系の場合です。
```bash
sudo apt update
sudo apt install portsentry
```
# 設定
設定ファイルは`/etc/portsentry/portsentry.conf`です。
```conf:portsentry.conf
# 解放しているポート番号の最大値を指定 Java版はTCP,統合版はUDP
ADVANCED_PORTS_TCP="25565"
ADVANCED_PORTS_UDP="19132"

# 攻撃者に対してのDNSルックアップを有効化
RESOLVE_HOST = "1"

# スキャンをブロック
BLOCK_TCP="1"
BLOCK_UDP="1"

# 攻撃してきたIPアドレスをブロック
KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"
```

`/etc/portsentry/portsentry.ignore.static`に書いたIPアドレスはブロック対象から除外されます。
```conf:portsentry.ignore.static
127.0.0.1/32
0.0.0.0
```

設定後、PortSentryの再起動を行います。
```bash
sudo systemctl restart portsentry
```

試しにポートスキャンしてみるとブロックされることが確認できると思いますが、この設定だとその後接続できなくなってしまうので`/etc/portsentry/portsentry.ignore.static`に攻撃を試すホストのIPアドレスを書いてから試すなどしてください。

# 参考
1. [【セキュリティ入門】PortSentryでポートスキャンを遮断する](https://qiita.com/kk0128/items/af870594331319418197)
1. [[Guide] Advanced INTERNAL Server Protection (Stop Brute Force, Port Scans...) [Linux]](https://www.spigotmc.org/threads/guide-advanced-internal-server-protection-stop-brute-force-port-scans-linux.309907/)
AI駆動型コードマージツールによる「作りたいアプリ」自動生成への挑戦

### はじめに

「こんなアプリ作ってみたいけど、どうやってコード書けばいいかわからない…」

プログラミング初心者や、新しい分野に挑戦したい開発者にとって、最初のコードを書き始めるハードルは意外と高いものです。そこで、AIを活用してこの課題を解決するツール「AI-Powered Code Merger Tool」を開発しました。この記事では、このツールがどのようにアイデアを形に変えていくのか、その開発過程と可能性について紹介します。

### 開発の背景

このツール開発のきっかけは、以下の課題感でした。

*   **プログラミングのハードルの高さ**: 新しい技術を学ぶ際、環境構築や初期コードの準備に手間がかかる。
*   **AIの可能性**: AIがコード生成や、より高度な自動化を支援できるのではないか。
*   **既存ツールの限界**: 既存のコードマージツールは、複雑なコードやコンフリクトの解決に手間がかかる。

これらの課題を解決するために、私たちはAIを活用したコードマージツールを開発し、最終的に「作りたいアプリを言えば、自動的にコードが生成される」という未来を目指すことにしました。

### 「AI-Powered Code Merger Tool」とは？

このツールは、以下の機能を備えたPython製のコードマージツールです。

1.  **コード解析と競合検出**: `CodeAnalyzer` クラスが、既存コードと新しいコードの差分を検出し、競合を特定します。
2.  **AIによる競合解決**: `AIService` クラスが、Googleの Gemini Pro モデルを活用し、コードの競合を解決します。
3.  **自動テスト生成**: AIが、コードに対応したテストコードを自動生成します。
4.  **柔軟なコードマージ**: 検出された競合を元に、既存のコードと新しいコードを統合します。
5.  **APIインターフェース**: `app.py` でFlask APIを提供し、`client.py` でAPIを使用します。
6.  **承認ワークフロー**: 生成されたコードの承認フローを追加
7.  **ファイル構造**
    *   `src` ディレクトリ：ソースコード
        *   `core`:  `code_merger.py` など、コア機能を提供するモジュールを格納
        *   `services`: `ai_service.py`, `proposal_receiver.py` など、サービス層のモジュールを格納
        *   `api`: `app.py` など、API関連のモジュールを格納
    *   `proposals` ディレクトリ：コード提案を格納
    *   `outputs` ディレクトリ：マージされたコード、テスト、ログなどの出力を格納
    *   `tests` ディレクトリ：テストコードを格納
    *   `scripts` ディレクトリ：ユーティリティスクリプトを格納

### 開発プロセス

1.  **基本機能の実装**: `CodeAnalyzer`, `AIService` クラスを実装し、コードの解析とAIによるマージ機能を実装しました。
2.  **APIエンドポイントの作成**: Flaskを使用してAPIエンドポイントを作成し、コードマージの機能を公開しました。
3.  **クライアントスクリプトの実装**: APIを使用するクライアントスクリプトを作成し、コードマージを試しました。
4.  **自動テストの導入**: AIによるテストコードの自動生成を実装し、コード品質を向上させました。
5.  **テストコード実行機能**:  テストコードの実行と結果の評価機能を追加しました。
6.  **フォルダ構造とモジュール化**: 複雑なシステムに対応するために、ファイル構造とモジュール化を実施しました。
7.  **環境変数対応**: 機密情報を安全に管理するために、`.env` ファイルを利用した環境変数対応を行いました。
8.  **ワークフロー管理システム**: コードマージのプロセスを管理する `workflow_manager.py` を実装しました。
9.  **承認システム**: コード変更内容を確認し、承認する仕組みを追加しました。
10. **対話型インターフェース**: アプリケーションの要件をAIに尋ねる対話型インターフェースを追加しました。

### 開発の過程での挑戦

*   **AIの回答の不安定性**: AIの回答は常に期待通りとは限らず、エラーや不適切なコードを生成することがありました。
*   **テストの自動化**: 生成されたテストコードが、必ずしも正確に動作しないことがありました。
*   **セキュリティ**: コード実行機能において、セキュリティリスクを考慮する必要がありました。
*   **複雑な要件**: より複雑なコードや、複数のファイルを扱う際の課題がありました。
*  **Windows環境との相性**:  `mkdir -p` や `Move-Item` などのコマンドが、Windows の PowerShell 環境では利用できないなど、OS依存の問題がありました。
*  **エンコーディング**:  文字コードの違いによって、ファイル読み書き時にエラーが発生しました。

これらの課題を一つずつ解決することで、ツールは着実に進化してきました。

### 今後の展望

現在のシステムは、完全自動的にソフトウェアを完成させるところまでは至っていません。しかし、ユーザーとの対話を通じて要件を明確化し、AIがコード生成を支援し、人がコードの内容を承認する、という未来に一歩近づきました。

今後は以下の機能強化を目指します。

*   **AIによる詳細な要件定義**: ユーザーのアイデアを元に、より詳細な要件定義をAIが自動生成
*   **AIによるコード設計**:  AIが複数のファイルにまたがるアプリケーションの設計を支援
*   **テストコードの充実**: AIによるテストケースの網羅性を向上
*   **GitHub連携**: Pull Requestを自動で作成し、変更履歴を管理
*   **UIの提供**: コマンドラインだけでなく、GUIでも操作できるようにする

### まとめ

「AI-Powered Code Merger Tool」は、AIを活用して開発を効率化するためのツールです。このツールはまだ開発途上ですが、プログラミングのハードルを下げ、誰もが「作りたいアプリ」を実現できる未来を目指しています。

この記事を読んで、AIによる開発の可能性に興味を持っていただけたら幸いです。

### 付録：開発で利用した技術

*   **プログラミング言語**: Python
*   **フレームワーク**: Flask
*   **AIモデル**: Google Gemini Pro (Experimental)
*   **ライブラリ**: `google-generativeai`, `requests`, `python-dotenv`

### ソースコード

準備中
TCPタイマー管理

>TCPは（少なくとも概念的には)複数のタイマーを使って動作しているが、最も重要なタイマーは再送タイマー(retransmission timer)である。

### セグメントを再送するタイマー
>再送タイマー切れをRTO(Retransmission Time Out)と呼ぶ。セグメントが送信されると、再送タイマーもスタートする。タイマーが切れる前にそのセグメントの確認通知がやってくれば、タイマーは停止するが、そうでない場合はセグメントの再送が行われ、再びタイマーがスタートする。ここで、タイムアウトの間隔はどれくらいにすべきなのかという疑問が起こる。

>データ・リンク・プロトコルの場合、遅延はマイクロ秒で測定され、かなり正確に予測できる。

>TCPの確認通知がやって来る時間の確率密度は、図6-42(b)のようになる。宛先までの往復時間を決定するのは難しいし、それが与えられたとしても、タイムアウト時間を設定することもまた簡単ではない。

>図6−42(b)のT1のようにタイムアウトを短くすると、不必要な再送を起こってしまい、インターネットを余分なパケットで溢れさせてしまう。しかし、T2のように長くしすぎると、パケット・ロスが起こった時再送遅延が大きなものになり、性能が悪化させる。

### ウィンドウ幅を調べるタイマー
>二つ目のタイマーは永続タイマー(persistence timer)と呼ばれ、以下で述べるデッドロックを回避するために用いられる。受信者がウインドウ幅０の確認通知を送り、送信者に待ってほしいと通知する。その後受信者はウインドウを更新するものの、その更新パケットがロスしたとする。すると、送信者、受信者とも相手が何かするのを待つことになる。永続タイマーが切れると、送信者は受信者に調査(probe)パケットを送る。受信者は調査パケットに対して、ウインドウ幅を返す。0のままであれば永続タイマーはもう一度設定され、もう一度今のサイクルを繰り返す。ウインドウ幅が０でなければ、再びデータを送ることができる。

### コネクションを終了するタイマー
>三つ目のタイマーは、一部の実装で利用されているキープアライブ・タイマー(keepalive timer)である。コネクションが`長い時間アイドルの時、キープアライブ・タイマーは切れ、相手がまだ存在するかを検査する。応答がない場合、コネクションは終了`する。この機能はオーバーヘッドを増やし、一時的なネットワーク途切れに対して正常なコネクションを終了してしまう可能性があることから、議論の的になっている

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
Elixir タプルとは？

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はタプルとは何かについて学んだことをまとめます。

# 目的
タプルとは何かについて理解する

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0

# タプルとは
複数の値を保持するデータ構造。`{}`で囲みます。
メモリ内に連続して格納されるため、リストと比較してはタプルの長さや値の取得を高速で取得できます。[^1]

https://elixir-lang.jp/getting-started/basic-types.html#%E3%82%BF%E3%83%97%E3%83%AB

# タプルの使いどころ
上記の定義から、タプルは要素の読み取りには向きますが、要素の追加や変更には不向きです。

https://hexdocs.pm/elixir/Tuple.html

# タプルのパターンマッチ
```diff_elixir:iex
tuple = {:ok, :example} # タプルの作成
{:ok, atom} = tuple # タプルのパターンマッチ。変数atomに:exampleをバインドする
```
```
{:ok, :example}
```

## タプルの要素の追加／変更をしたい場合
タプルの要素の追加／変更をしたい場合、既存のタプルに変更を加えるのではなく新しくタプルを作成します

### 良い例
```diff_elixir:iex
result = {:ok, atom, %{}} # 上記のパターンマッチの結果を引き継いで新しいタプルを作成
```
```
{:ok, :example, %{}}
```

### 悪い例
```diff_elixir:iex
result = Tuple.insert_at(tuple, 2, %{}) # 既存のタプルに変更を加える
```
```
{:ok, :example, %{}}
```

# タプルのパターンマッチ+後続のデータ処理
実行結果に`{:ok, 結果}`あるいは`{:error, エラーの理由}`のタプルが来る関数は、タプルのパターンマッチを利用して要素を取り出し、後続のデータ処理につなげられます。
タプルの使い方としては頻出です。

## 例
"Hello, World!"を大文字にして"hoge.txt"を更新し、それを読み取ります。

### "hoge.txt"の作成+更新前のデータ確認
実行結果が`{:ok, 結果}`の形をしているのでタプルのパターンマッチを使うことを考えます。

```diff_elixir:iex
 defmodule Fililr do
  def make_a_file do
    body = "Hello, World!"
    File.write("hoge.txt", body)
    File.read("hoge.txt")
  end
 end

Fililr.make_a_file()
```
```
{:ok, "Hello, World!"}
```

### タプルのパターンマッチ
`"Hello, World!"`を変数`txt`にバインドします。
```diff_elixir:iex
{:ok, txt} = Fililr.make_a_file()
```
```
{:ok, "Hello, World!"}
```

### タプルから取り出した要素を後続のデータ処理に渡す
```diff_elixir:iex
txt 
|> String.upcase()
|> then(fn x -> File.write("hoge.txt", x) end)
```
```
:ok
```

### 更新後のデータ確認
"Hello, World!"が大文字になっていることが確認できます。
```diff_elixir:iex
File.read("hoge.txt")
```
```
{:ok, "HELLO, WORLD!"}
```





# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

[^1]: [『Elixir実践入門』](https://gihyo.jp/book/2024/978-4-297-14014-4)P47,48

[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！
WindowsServer2022におけるWindowsDefender無効化方法

## はじめに
- 某●ybereasonや世間を騒がせた某●loudStrikeなど、いわゆるウイルス対策ソフトをWindowsServerOSにインストールする際、WindowsServer純正のウイルス対策ソフトである**WindowsDefenderと競合するため、通常はこれを無効化する運用**だと思います
    - **某●loudStrikeに悲しい過去が...あれは悲しい事件だった...**
- が、これを無効化するのはちょっと面倒で、WindowsServer2019まではGUI上で無効化出来たましたが、**WindowsServedr2022からはGUIでの無効化は一時的で、完全に無効化するにはレジストリを変更する or グループポリシーを変更必要がある仕様**になりました。Microsoftの執念も若干感じるわけですが、手順を記載します

## 参考
https://www.onamae.com/business/article/18736/
- 上記を参考にすると、以下記載がありました。
>Windows2022からはGUIでの無効化は一時的で、完全に無効化するにはレジストリ～(略)

## 対応手順
- 以下コマンドをPowershellで実行して無効化します
```
New-Item "HKCU:\SOFTWARE\Policies\Microsoft\Windows Defender"
New-ItemProperty "HKCU:\SOFTWARE\Policies\Microsoft\Windows Defender" -name "DisableAntiSpyware" -PropertyType "DWord" -Value 1
```
- これらを1台1台設定するか、グループポリシーでまとめて流せば完了！

## まとめ
- WindowsDefenderごり押しというか執念を感じます。


## 余談(除外フォルダについて)
- WindowsDefenderは**既定で自動除外機能を持っている**ため、Cドライブについては基本的に除外設定不要
(なんかいい感じに色々考えてやってくれている)

https://docs.microsoft.com/ja-jp/windows/security/threat-protection/windows-defender-antivirus/configure-server-exclusions-windows-defender-antivirus
AkamaiのオリジンサーバーをS3にする

## はじめに

私の担当しているプロダクトの画像配信システムは「Akamai + CloudFront + S3」の構成で運用しています。

この構成の理由は、CloudFrontの[Origin Access Identity](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)を使用し、S3バケットに対してダイレクトURLでアクセスできないようにするためです。

しかし、Akamaiにはオリジン認証が存在し、AWSもサポートされています。

https://techdocs.akamai.com/cloud-access-mgr/docs/cloud-origin-auth

本記事では、AkamaiにS3をオリジンサーバーとして安全に設定する方法について解説します。

## IAMユーザーを作成

オリジンサーバーに設定するS3バケットに対する、GetObject権限が付与されたIAMユーザーを作成します。

```json:
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"s3:GetObject"
			],
			"Effect": "Allow",
			"Resource": [
				"arn:aws:s3:::ymktmk-images/*"
			]
		}
	]
}
```

## Cloud Access Managerでアクセスキーを作成

発行したIAMユーザーのアクセスキーとシークレットキーを用いて、Cloud Access Managerにてキーを作成します。

![スクリーンショット 2024-12-09 15.55.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/6f21ce71-fcfc-5eb4-aa17-e73b90e9a071.png)

https://techdocs.akamai.com/cloud-access-mgr/docs/welcome-cloud-access-mgr

## オリジン認証の設定

Authentication Methodに「Amazon Web Services」を選択して、Access KeyにはCloud Access Managerにて作成したアクセスキーを選択してください。

![スクリーンショット 2024-12-16 13.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/7fa1972b-7fb4-20ae-f051-c274ca4567e3.png)

## オリジンサーバーの設定

Origin Server HostnameにS3のホスト名を入力します。

![スクリーンショット 2024-12-16 12.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/9755e280-339f-c033-34e5-51534f0f8f60.png)

## おわりに

CloudFrontのOrigin Access IdentityでS3を保護せずとも、Cloud Access ManagerとCloud Origin Authenticationを使うことでセキュアにAkamaiのオリジンサーバーをS3にできます。
プロジェクト アジャイル開発の流れ（PMO）

こんにちは、小磯と申します。
プロジェクトにはウォーターフォール開発とアジャイル開発の2種類があります。
今回はアジャイル開発について纏めようと思います。
初めて業務を行うPM(PMO)の方へ参考になればと思います。

### アジャイル開発
アジャイル（Agile）とは、「素早い」「機敏な」「頭の回転が速い」という意味を表します。
大きな単位でシステムを区切ることなく、小単位で実装とテストを繰り返して開発を進めていく手法です。

### 1.アジャイル開発工程の流れ
機能単位で要件定義・設計・開発・テスト・リリースのサイクルを反復して、システムやサービス全体を作り上げていきます。
従来主流であったウォーターフォール開発よりも開発期間を短縮できることが特長です。


### 2.リリース計画
ソフトウェアの計画段階で厳密な仕様を決めずに大体の仕様と要求のみを決定します。
大まかな計画のみでは、その後の実装フェーズで問題が起こるリスクもあります。
仕様が決まっていないため、途中で変更があっても臨機応変な対応が可能です。
リリース計画を立てる際には、以下の要素を最低限決めておきます。
　ⅰ.プロジェクトで実現したいこと（目標やゴール）
　ⅱ.イテレーション（単位）の長さ
　ⅲ.ベロシティ（作業量）の算出
　ⅳ.ユーザーストーリーの優先順位や工数


### 3.開発チームの結成
開発チームの結成において、各メンバーの役割と責任を明確化することがポイントです。
各メンバーが担う役割や責任を明確にしておくことによって、コミュニケーションが活性化するだけでなく自身が行うべきタスクがわかりやすくなります。
　ⅰ.開発するプロダクト（アプリケーションやシステム）の方向性を決定する「プロダクトオーナー」
　ⅱ.開発作業がスムーズに進むようにスケジュール管理やチーム内の調整をする「スクラムマスター」
　ⅲ.開発作業を行う「開発者」


### 4.全体スケジュールをリスト化
全体スケジュールをリスト化します。
短い反復期間のスケジュールで実施できる範囲に、プロジェクトを細かく切り分けてリスト化します。
反復期間は固定して行う傾向にあり、1週間～4週間程度です。


### 5.イテレーション
全体スケジュールのリスト化が完了したら、イテレーションと呼ばれるサイクルを繰り返して開発を進めます。
「反復」という意味を表し小さな単位に分けられた開発を「計画」→「設計」→「実装」→「テスト」の順に行いながら機能のリリースを繰り返します。
イテレーションは1週間～2週間ごとが一般的で、イテレーションごとに毎回機能をリリースします。


### まとめ
アジャイル開発は、仕様の変更が発生しやすいWebサービスや、近年増加しているWebアプリ、スマートフォンアプリの開発に適しているため、現代に適した開発手法だと思います。
アジャイル開発とウォーターフォール開発、両方のメリットを活かして組み合わせるというのも1つの方法です。
プロジェクトに合わせて最適な開発手法を検討してみてはいかがでしょうか。

他にもプロジェクトに関する記事を投稿しておりますのでお役に立てればと思います。
[プロジェクト ウォーターフォールとアジャイルの違い](https://qiita.com/pesysyon/items/e77b869b5c90b667680b)

[初めてプロジェクトに参画する方へプロジェクトとタスクの意味について](https://qiita.com/pesysyon/items/a7da021a7d596df5e5fd)

[初めて参画するプロジェクトPM(PMO) 要件定義の工程](https://qiita.com/pesysyon/items/cf40037f484b99e16621)

[初めて参画するプロジェクトPM(PMO) 基本設計の工程](https://qiita.com/pesysyon/items/c0b936f325244be7688d)

以上、小磯でした。
nvidia/cuda + Python >= 3.11 な Dockerfile を作る

:::note
本記事は [ZOZO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/zozo) シリーズ 2 の 16 日目の記事です。
:::

# 動機
[nvidia/cuda](https://hub.docker.com/r/nvidia/cuda/tags)をベースイメージとして使いつつ  Python 3.11.x が動く環境を作りたい人生でした。

上記をベースイメージとしてデフォルトでインストールされる Python は 3.10.x なため、これを Python 3.11.x にするための試行錯誤の過程を遺しておきます。

# 結論
動くものはできたんですが Python 3.11.x をインストールする手続きが長い & ビルドに要する時間も長くなるため、「無理に 3.11.x にせず 3.10.x に留めておくのがよい」という判断をしています。

```Dockerfile
FROM nvidia/cuda:12.6.3-base-ubuntu22.04 as builder

ENV DEBIAN_FRONTEND=noninteractive \
    VIRTUAL_ENV=/app/.venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

# パッケージ管理には poetry を使用
ENV POETRY_VERSION=1.8.5 \
    POETRY_VIRTUALENVS_IN_PROJECT=true

RUN apt-get update && \
    apt-get install -y \
    build-essential \
    libssl-dev \
    libffi-dev \
    libbz2-dev \
    zlib1g-dev \
    libopencv-dev \
    libcurl4-openssl-dev \
    libssl-dev \
    wget

RUN wget https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tar.xz && \
    tar xJf Python-3.11.10.tar.xz && \
    cd Python-3.11.10 && \
    ./configure && make && make install

RUN python3 -m venv $VIRTUAL_ENV &&  \
    alias python=$VIRTUAL_ENV/bin/python3 &&  \
    alias pip=$VIRTUAL_ENV/bin/pip3

RUN pip install --upgrade pip

WORKDIR /app

COPY . .
RUN pip install poetry==$POETRY_VERSION && \
    poetry install


FROM nvidia/cuda:12.6.3-base-ubuntu22.04 as app

WORKDIR /app
ENV APP_HOME=/app
ENV VIRTUAL_ENV=$APP_HOME/.venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN alias python=$VIRTUAL_ENV/bin/python3

COPY --from=builder /usr/local/bin/python3 /usr/local/bin/python3
COPY --from=builder /usr/local/lib/python3.11 /usr/local/lib/python3.11
COPY --from=builder $VIRTUAL_ENV $VIRTUAL_ENV
```

Python をソースからビルドしているので時間がかかるのは当たり前ですね。もっとスマートにやる方法もあると思いますが、備忘録として書きました。
【初学者】シェルスクリプトでEC2インスタンスの情報を取得してみた

# はじめに

<!-- 発端や概要を記載 -->
初めまして、セゾンテクノロジーの村上と申します:grinning:
本記事では題名にもありますが、EC2インスタンスの情報を取得するためのスクリプト作成について共有したいと思います。

私は2023年10月より異業種から転職し、現在エンジニア歴1年強の新米エンジニアです。技術的な面において間違っている点やご指摘等あるかもしれませんが、何卒ご容赦ください:bow_tone1:
（経歴の詳細は、今後改めて記事にしてみようとも考えております！）

# 概要

今回、処理を実行するためにシェルスクリプトを2つ作成し、別途パラメータファイルを用意しました。
パラメータファイルには、各環境のインスタンス名とリージョンの情報を記載しています。

# シェルスクリプト①

このシェルスクリプトでは、「指定したEC2インスタンスに対して、情報取得処理を実行するために必要な要素を渡し、リモート上で実行する」機能を実装しました。流れは以下の通りです。

**１．引数の取得**
　スクリプトを実行する際、下記のように確認したい環境の「パラメータファイル」と「EC2インスタンス名」を引数として取得するように設定しています。
 
```
 FILE="$1"
 NAME="$2"
```
※変数名は適当なものに変換しております。

**２．ファイル転送**
　指定した「パラメータファイル」と「シェルスクリプト②」をscpコマンドを用いて、引数で指定したEC2インスタンスに転送します。
 ```
scp シェルスクリプト② "$FILE" "$NAME":/転送したいディレクトリ/
```
 

**３．リモート実行**
　転送した「シェルスクリプト②」を実行させます。その際に、⑴で取得した引数も渡します。

# シェルスクリプト②

このシェルスクリプトは、「AWS EC2インスタンスの情報を取得し、該当するデータを表示させる」機能を実装しました。こちらも流れは以下の通りです。

**１．引数の検証**
　前のスクリプトで渡された引数が不足していないかをチェックし、不足している場合はエラーメッセージを表示します。

**２．AWS CLI実行**
　パラメータファイルから各環境の情報を取得し、インスタンスの詳細情報を収集します。

**３．結果の出力**
　取得した情報をコンソールに出力表示し、同時にテキストファイルに保存します。

# まとめ

以上簡単なものではありますが、紹介させていただきました。
複数のインスタンス情報を一括で取得できるので、効率よく確認作業を進められるようになりました。

これから、さらに深い内容を投稿できるように精進してまいります:muscle:
アリババクラウドのスマートIoTソリューションで、世界をもっとスマートにする

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/alibaba-clouds-smart-iot-solutions-for-a-smarter-world_601850?spm=a2c65.11461433.0.0.4ee35355ZBZhi2)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# IoT時代のゲームチェンジャー：アリババクラウドのIoTソリューション

正直に言って、最近のインターネット・オブ・シングス（IoT）の爆発的な成長とそれに伴う魅力的な約束の中で、信頼性が高く、価格が合理的で、一貫性のあるクラウドソリューションの提供者が必要性がますます高まっています。スマートテクノロジーのプロバイダーたちは、プラットフォームを改善し、デバイス間でのデータの収集、処理、分析、そしてアクションをより効果的かつ効率的にすることに重点を置いています。この分野で、アリババクラウドのIoTソリューションはまさにゲームチェンジャーであり、企業がIoTの利点を完全に享受できるようにしています。それでは、なぜ彼らは熱望するクラウドとの調和を取ることができるのか、以下で説明します。

## 物理製品と操作への知性の導入！

<a href=https://www.alibabacloud.com/solutions/IoT target=_blank>IoT</a>は、数十億のデバイスが互いとインターネットと接続することで、人間とオブジェクトがあらゆる意味で知能を持つウェブを形成するという夢のようなものとなりました。IoTプラットフォームは、リアルタイムの操作とデータ処理に必要な基本的なインフラ、サーバー、ストレージを提供するIoTデバイスとアプリケーションを動作させる広範なネットワークです。アリババクラウドは、その革新的なIoTソリューションを通じてIoTの進歩を加速しており、信頼性、拡張性、可用性といったプラットフォームの機能により、アプリケーション開発者や技術サプライヤーがIoTソリューションの活用を強化し、新しい領域へのユースケースの拡大を可能にしています。これにより、ユーザーは接続された世界の力を活用して、滑らかで経済的で信頼性の高い体験を提供することができます。

## IoTを超えたクラウドサービス：IoTの促進者

アリババクラウドのIoTソリューションは単なるクラウドサービス以上のものです。それはIoT自体を可能にするもので、イノベーションプロジェクトを実現したい人々にとって、アリババクラウドが提供する解決策が存在します。それは、どこからでも作成できる包括的なIoTソリューションであり、シンプルなダッシュボードからデバイスを制御し、作品を公开して他者が閲覧できるようになります。

## デジタル変革を加速する

人工知能のための堅牢なレコード基礎を築き、ITとオペレーションテクノロジー(OT)の協力を促進し、ソリューションの相互運用性と拡張性を確保することで、デジタル変革を加速します。保護と分析ツールを備えた包括的なサービスのスイートを活用し、数十億のデバイスを接続・セキュリティ保護しながら、有益な洞察を得ることができます。これらのサービスは、企業がIoTプラットフォームアプリケーションを構築、展開、管理するために活用できます。

## 主要なメリット

<a href=https://www.alibabacloud.com/solutions/IoT target=_blank>アリババクラウドのIoTソリューション</a>を使用することで、ビジネスの持続可能性目標を簡単に達成し、接続性を大幅に向上させ、市場投入までの時間を短縮するためのデバイスへの従業員アクセス管理などが可能です。アリババクラウドは、特にリソースが限られている企業向けに、IoTデバイスとアプリケーションを動作させるために必要なインフラストラクチャーやサービスを効率的、柔軟、かつスケーラブルなモデルで提供します。Click2Cloudでは、お客様がアリババクラウドのIoTプラットフォームの全ポテンシャルを解錠し、接続されたIoTデバイスから生成されるリアルタイムデータを収集、処理、分析する高度でイノベーティブなIoTアプリケーションを作成できるよう支援しています。当社の包括的なBVAとバリューリアル化フレームワークにより、顧客はインフラ管理の手間なく、洞察を得ることと新規能力の開発に集中できます。

## 終わりに

<a href=https://www.alibabacloud.com/solutions/IoT target=_blank>アリババクラウドのIoTソリューション</a>は、単なるクラウドキャリアではなく、IoTイノベーションの駆動力となっています。その効果的な能力を発見し、あなたのIoT生態系を情報駆動型の知性のハブに再構築しましょう。アリババクラウドのスマートテクノロジーを強化し、進化するIoTの風景において先頭を走りましょう。

**免責事項:** 本稿で述べられた見解は参考としてのみであり、必ずしもアリババクラウドの公式見解を代表するものではありません。
終わらないと思ったら意外と終わるトランプゲーム

この記事は[クソアプリ Advent Calendar 2024 - シリーズ2](https://qiita.com/advent-calendar/2024/kuso-app)の16日目の記事です。

* * *

フロントエンドエンジニアのざらきー([zaraky_sasa](https://x.com/zaraky_sasa))と申します！
今年からElectron + Next.jsを使ってゲームを開発し、Steamで販売をはじめました。

参加している友人に影響を受けて今年クソアプリアドベントカレンダーに初参加します！
まだゲーム開発は初心者なので簡単なゲームを作ってみようと思い、「トランプを題材にしたクソゲー」を制作することにしました。

# 1000プレイしたら決着が着くかも！？「無限トランプ」
2人のプレイヤーがランダムに1枚ずつカードを出して大きかった方が勝ち。勝った人は負けた人に場のカードを押し付けます。
先にカードが無くなった人が勝ちです。

このゲームのクソなところは、確率的に勝率が50%になるのでなかなか終わらないところです。
だるいので1試合0.1秒で、自動で終わるまで見ていられるようにしました。
だいたい1000回以内には終わりますが、意外と速く終わることもあります :innocent:
勝利のポイントはいかに相手にエースを押し付けるかです。引き分けた場合は次の試合で負けた方にカードが2試合分行くのでエース同士の引き分けを狙わなければいけません。




# 作ったもの
開発にはNext.jsを使用し、完成したゲームはVercelでデプロイしました。
Vercelはデプロイの手軽さが魅力で、開発者にとって非常に便利ですね！

https://infinite-playing-cards.vercel.app/

# 工夫した点
ブラウザで制作したのですが、自動進行が別タブに行っていても止まらないように気を付けました。


# プレイの様子
![InfinitePlayingCard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927565/7f135c58-cec3-a466-037a-56ca4994d99b.gif)







# 反省点

題材のアイデア出しで時間を使ってしまったので、すでに使える技術の範囲内で締め切りに間に合うようにまとめてしまいました。もっと技術的な挑戦をしてもよかったです。

アイデア面で面白くするのは苦手と痛感したので、来年挑戦するときは、3Dのゲームなど技術的な挑戦をしようと思います。


# おわりに
最後までお読みいただきありがとうございました。
気軽に作ったクソアプリですが、もし興味を持っていただけたらぜひ遊んでみてください！
エンジニアとして働く私が実施しているポモドーロテクニックの魅力と効果

#### 1. はじめに

エンジニアとして働いていると、タスクが山積みで「どこから手を付ければいいのか分からない」と感じたり、長時間の作業で集中力が切れてしまったりすることがよくあります。。。
こうした問題を解決する方法の一つが、**ポモドーロテクニック**です。

ポモドーロテクニックは、短時間の集中と定期的な休憩を繰り返すことで効率的に作業を進められるタイムマネジメント法です。
本記事では、ポモドーロテクニックを実践して得たメリットや効果、具体的な方法について詳しくご紹介します。

---

#### 2. ポモドーロテクニックとは？

ポモドーロテクニックは1980年代にフランチェスコ・シリロ氏が考案したタイムマネジメント法です。
その基本的なルールは以下の通りです：

1. 作業を25分間行う（これを1ポモドーロと呼ぶ）。
2. 25分間の作業が終わったら、5分間の休憩を取る。
3. 4ポモドーロごとに、15–30分程度の長めの休憩を取る。

このシンプルな仕組みが、集中力の維持や効率的な作業に大きな効果をもたらします。タスクを細分化して進めるため、達成感を得やすく、時間の使い方も明確になります。

---

#### 3. 私がポモドーロテクニックを取り入れた理由

私は日々の仕事の中で、次のような課題に直面していました。

- **集中力の持続が難しい**：複数のタスクが重なり、どれから手を付ければよいか分からず効率が下がっていました。
- **タスク管理が曖昧**：やるべきことの優先順位をうまく付けられず、時間を無駄にすることがありました。
- **疲労感が蓄積**：長時間作業を続けることで精神的にも肉体的にも疲れてしまうことが多かったです。

これらの課題を解消するために試してみたのがポモドーロテクニックでした。
短い時間で区切られた集中作業と休憩のリズムが、エンジニアとしての作業スタイルにぴったりだったのです。

---

#### 4. ポモドーロテクニックの具体的な実践方法

私がポモドーロテクニックをどのように取り入れているのか、具体的なステップを紹介します。

1. **タスクをリストアップする**  
   朝の始業前に、その日にやるべきタスクをリストに書き出します。
   次に、それぞれのタスクに必要なポモドーロの数（25分単位）を見積もります。

   - 例：コードレビュー（2ポモドーロ）、機能追加の実装（3ポモドーロ）など。

2. **ツールを活用する**  
   タイマーを使うことで時間をしっかり管理できます。私が使っているおすすめのツールは以下の通りです：

   - **TomatoTimer**（ブラウザで使えるシンプルなタイマー）
   - **Toggl Track**（タスク管理と連携可能）
   - **Focus Booster**（ポモドーロ専用アプリ）
   - **クロック**（Windowsのアプリでフォーカスセッションでできます）
   

3. **25分間、全力で作業に集中する**  
   ポモドーロ中は通知をオフにし、雑念を排除します。小さなタスクであれば、この時間内で完了するよう集中力を高めます。

4. **休憩時間をしっかり取る**  
   作業が終わったら、5分間はリラックスすることを徹底します。
   私は目を休めたり、軽いストレッチをすることで次の作業への集中力を高めています。

5. **長時間作業には長めの休憩を**  
   4ポモドーロが終わったら、15–30分の休憩を取ります。この間に軽い散歩をしたり、水分補給をすることで疲労を回復します。

---

#### 5. ポモドーロテクニックのメリットと効果

実際にポモドーロテクニックを取り入れたことで、次のような効果を感じています。

1. **集中力の向上**  
   時間を区切ることで「あと25分だけ頑張ろう」というモチベーションが生まれ、だらけずに作業を続けられます。

2. **効率的なタスク管理**  
   作業を細分化することで、1つずつタスクを完了させる達成感を味わえます。また、進捗状況も把握しやすくなりました。

3. **疲労感の軽減**  
   定期的な休憩のおかげで、長時間作業しても疲れにくくなりました。特に目の疲れや肩こりの軽減を実感しています。

4. **バーンアウトの防止**  
   適度な休憩を取ることで、作業を続けやすいペースを維持できます。結果として、モチベーションが下がることなくプロジェクトに取り組めています。

5. **休憩による業務への俯瞰**
客観的に休み時間の中で業務を俯瞰して見れることがあるため、時折、この業務を改善したらよりいいんじゃないかと気づけるときがあります。

---

#### 6. ポモドーロテクニックを実践する上での注意点

ポモドーロテクニックを効果的に活用するためには、いくつか注意すべき点があります。

1. **中断される場合の対策**  
   作業中に同僚やクライアントから話しかけられることがあります。
   その場合は、タイマーを一時停止してメモを取り、再開する際に何をしていたか思い出せるようにしています。

2. **柔軟なスケジュールの設定**  
   クリエイティブな作業や問題解決に時間がかかる場合、ポモドーロの時間を30–40分に調整することもあります。
   自分の作業スタイルに合った時間設定を見つけることが大切です。

3. **慣れるまでの継続が必要**  
   初めのうちは「25分は短すぎる」と感じることもあるかもしれませんが、続けることで徐々にリズムが身につきます。無理なく始めることがポイントです。

---

#### 7. 結論

ポモドーロテクニックは、エンジニアとしての仕事において非常に有効なタイムマネジメント法です。この方法を取り入れることで、集中力を維持しながら効率的にタスクを進めることができました。

特に、作業の合間に定期的な休憩を挟むことで、疲労感を軽減し、モチベーションを持続させる効果を感じています。

---

#### 8. 参考リンクやリソース

- [TomatoTimer](https://tomatotimer.com)
- [Toggl Track](https://toggl.com/track/)
- [Focus Booster](https://www.focusboosterapp.com)
アリババクラウド：製造業の卓越性を促進する触媒

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/alibaba-cloud-the-catalyst-for-manufacturing-excellence_601849?spm=a2c65.11461433.0.0.4ee35355ZBZhi2)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# 現代市場での競争に勝つためのクラウド技術活用：製造業の視点から

現代の厳しい市場で競争するためには、製造業者は生産速度の向上とサイクルタイムの短縮が必要であり、同時に規制適合性も満たさなければならないが、製造業界はコスト増加、エネルギー不足、物流の混乱、予算制約、サプライチェーンのハードウェア制約、セキュリティ、時代遅れのレガシーシステムなど、様々な課題に直面しています。これらは企業にとって経営と財務面での制約となっています。製造業者は、中断無く需要の変動を管理する方法を見つけることが重要です。より柔軟性を持たせるために、多くの企業はクラウドテクノロジーに移行し、現在と未来の市場で競争力を高めています。

## なぜ製造業にはクラウドが必要か？

クラウドテクノロジーは製造業において、製品ライフサイクル管理、生産メンテナンス、サプライチェーン管理など、さまざまな分野を合理化します。人工知能、機械学習、クラウドソリューションなどの高度な技術を活用することで、生産性と運営効率を向上させ、コスト削減、市場投入までの時間を短縮し、競争激化した市場で繁栄することができます。クラウドテクノロジーにより、製造企業はオンプレミスインフラに依存せずに、生産過程に関連するデータやアプリケーションを格納、管理、アクセスできる計算リソース（ストレージやソフトウェア）を利用できます。近乎リアルタイムで世界中のどこからでも、製造の全資産を簡単に特定、評価できます。

## 効果的なビジネス戦略の実現に向けて

有効なビジネス戦略を実施するためには、優れたクラウドプロバイダーを選択することが不可欠です。Click2Cloudでは、お客様が<a href=https://www.alibabacloud.com/jp/solutions/manufacturing target=_blank>アリババクラウドの製造業向けソリューション</a>を始めやすく支援しています。アリババクラウドは、AIと分析機能を活用して、全体的なバリューチェーンで業務を現代化し、製造革新を加速し、市場投入までの時間を短縮し、生産最適化、新たな収益源の創出を支援します。

## アリババクラウドで製造業の産業エッジを獲得

アリババクラウドのベストプラクティスは、自動化を強化したデータモデル拡張を提供し、製造プロセスを効率化することで、顧客にとって革新的なメリットをもたらします。サービス自動化を高速化し、顧客サポートを向上させます。現代的な産業データ戦略により、あなたの運営データの価値を解き放ち、データを資産として活用できるようになり、拡張性と統合性のあるメカニズムが可能になります。アリババクラウドの最も安全で包括的な目的別ソリューションと産業運営の専門知識を組み合わせて、あらゆる作業においてイノベーションを実現しましょう。また、仮想デスクトップ、コンピュートプラットフォーム、次世代AIサービスを使用して、製造ワークロードの時間短縮、運営コスト削減、崭新の製品設計の創造も可能です。

## 現代的製造業データ戦略による生産性向上

Gen AI、機械学習、IoTなどの目的別サービスにより、製造業におけるデジタルトランスフォーメーションを加速させます。世界中の製品を最も柔軟で安全なクラウド環境で安全かつリモートで管理し、顧客体験を向上させ、収益源を拡大することが可能です。

## 結論

<a href=https://www.alibabacloud.com/jp/solutions/manufacturing target=_blank>アリババクラウドの製造業向けソリューション</a>は、予測分析、品質検査、プロセス最適化など、様々な機能を提供します。IoT、AI、ロボティクス、スマートファクトリー応用などの先進技術に対してリアルタイムデータ処理を可能にし、安全性を高めます。サプライチェーン機能の最適化、多様なビジネス操作と統合されたクラウド中心のERPシステムの導入、製品ライフサイクルの効率的な管理、クラウド中心の品質管理システムによる製品・サービス品質の確認も可能です。

**免責事項:** 本稿で述べられた見解は参考のために提示されており、必ずしもアリババクラウドの公式見解を代表するものではありません。
【新卒エンジニア】学生時代の活動について

## はじめに

この記事は [DeNA25新卒 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/dena-25-newgrad) 18日目の記事です。他の方々の記事も是非見てみてください。

この記事では、学生時代に取り組んだことやその振り返りをまとめました。同じような道を歩んでいる方やこれから進路を考える方にとって、何か参考になれば嬉しいです。

## 概要

この記事では以下の内容についてお話しします。

- 学生時代にやったこと
- やっておけばよかったと感じたこと
- お世話になったもの


## やったこと

### 競技プログラミング

私がプログラミングに本格的に興味を持つようになったきっかけは競技プログラミングです。高校2年生の時にその存在を知り、浪人期間中に本格的に取り組むようになりました。

主に **AtCoder** のコンテストに参加していました。1時間程度で一区切りがつくことから、大学1、2回生の比較的忙しい時期でも取り組みやすいと思います。また、コンテストへの参加と並行して、過去問を **AtCoder Problems** を活用して解いていました。色（レート）は大きなモチベーションとなり、目標だった「入水（レーティング1200）」も無事達成しました。

また、大学生競技プログラマー向けの国際大会である **ICPC** にも参加しました。ただし、ICPCには同じ大学から3人でチームを組み、コーチや監督を見つける必要があります。私は大学のサークルを活用してメンバーを集めました。学生プログラマーにとって一つの目標にすると良いと思います。

(関連サイト)
- [AtCoder](https://atcoder.jp/)
- [AtCoder Problems](https://kenkoooo.com/atcoder/)
- [ICPC](https://icpc.iisf.or.jp/)


### 電子工作

私はCS系ではなく電気工学科に所属していたため、ハードウェアに関する内容に親しみを感じやすい環境にありました。電子工作を本格的に始めるきっかけとなったのが『**CPUの創り方**』([参考](https://book.mynavi.jp/ec/products/detail/id=22065))という本です。

この本では汎用ロジックIC10個を使って4ビットCPUを作る方法が紹介されています。私はこれを基に **Autodesk社のEagle** を使って回路を設計し、基板図面を作成しました。その後、基板を製作し、はんだ付けまで行いました。手を動かすことで得られる学びはとても大きかったです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630329/87af85de-5465-2f49-0df2-159d1948c4e0.jpeg" width=50%>

その後は、いくつか基板を作成したり、さらに3Dプリンター用のモデルも作成したりしていました。RaspberryPiであれば簡単な工程で電子工作を体験できるのでおすすめです。(今はM5Stackなども流行りですね)

### Webアプリケーション開発など

多趣味な性格から、様々な技術に取り組んできました。最初は **LINE Bot** の作成から始まり、Webアプリケーションや個人サイトの開発も行いました。

三日坊主の欠点を補うため、進める中でやったことを記録し、同じ作業を繰り返さないよう注意しました。ただやはり、複数の技術に手を出しすぎると時間が足りなくなるため、ある程度テーマを絞るのが良いと思います。

## やっておけばよかったこと

### ハッカソンへの参加

就職活動のインターンでいくつかハッカソンを経験しましたが、もっと早くから取り組んでいれば良かったと思いました。ハッカソンは他のエンジニアとの交流から新しい学びや刺激を得られる貴重な機会です。また、プロダクトを完成させるまでの見通しを立てられるようになるというのも大きいと感じます。

### 開発系アルバイト/インターン

サークルや個人開発では得られない **実務経験** を積めます。私は経験しませんでしたが、多くの人からその重要性を聞きました。早いうちに挑戦することをおすすめします。

### Kaggle(に限らず)

「いつかやろう」と思いながら結局取り組めなかったものの一つがKaggleです。これはKaggleに限った話ではないですが、在学中は比較的時間に余裕があるため、興味のある分野があればぜひ積極的に挑戦すべきだと思います。学生時代は新しいことに触れるチャンスです。

## お世話になったもの

### サークルの先輩・OB

「何事にも先達はあらまほしき事なり」私の好きな言葉です。新しいことに挑戦するうえで、一人で手探りに進めていく力も重要ですが、詳しい人に教えを請うことで随分とショートカットができます。
DeNAに入社を決めたきっかけもサークルOBなので、人とのつながりは非常に重要だと感じています。

### 学割サービス

学生はさまざまな学割を活用できます。以下は私が実際に使って良かったものです。

- **GitHub Education**  
  GitHub Copilotには特にお世話になりました。他にも様々なツールが無料または割引で使えます。 

- **Autodesk**  
  電子設計や3Dモデリングなどのソフトが無料で利用可能です。 

- **Notion**  
  アップグレードされたプランが使えます。チームでのプロジェクト管理に役立ちました。 

---

この記事が少しでも参考になれば幸いです！
保守・運用を経験してみてわかったこと

:::note info
この記事は アイスタイル Advent Calendar 2024 シリーズ1 19日目 の記事です。
:::

はじめまして！アイスタイル新卒1年目の山田卓和です。
普段はWebアプリケーションエンジニアとして働いています。
今回は「保守・運用」という業務について入社前後のギャップや実際に経験してわかったことを話そうと思います。


## 入社前のエンジニアのイメージ
とにかくコードを書いて動くものを作っているイメージでした。
自分の中でエンジニアの仕事は新規のサービスを作成することが主な仕事であると考えており、プロダクトを運用していくための知識や技術、そして意識がすっぽり抜けている状態でした。

## 入社後のギャップ
入社前のイメージと真逆でした。もちろん開発の業務はありますが、同時に保守・運用作業が考えていたよりも重要度が高く、このギャップに大変驚きました。
保守・運用はネガティブな文脈と捉えられることもあると思います。
初めは僕もそんな感じのイメージでしたが、既存のコードを読み、各種ツールやログを頼りにした問題点・課題の調査が非常に難しく、コードを書く以上にコードを読み・理解すること、調査のためにツールを使いこなすことがエンジニアとしてより重要なスキルであるとわかりました。

## 保守運用を行なって理解できたこと３選
### 1. テストコードの重要性
保守・運用の一環でテストコードの追加なども行いました。
テストコードについて概念でしか知らなかったのですが、業務を経験していく中でテストコードで網羅できる幅が非常に広く、今までのとりあえず動かしてみるといった内容では網羅できない幅まで確信が持てるとわかったことが一番の収穫でした。
一方、テストコードを詳細に書きすぎると偽陽性が増えてしまったりなどなど、
トレードオフもあり気をつけなければいけないとも感じました。

ちなみに、テストについてもっと詳しく知りたい方はこちらの記事などおすすめです！

https://qiita.com/muratak-dev/items/a89968fdab43f7d2589a

### 2. 良いコードとは何か
よく技術書などで取り上げられているもので下記の点があると思います。

```
・ 命名が適切にされており関わる機能や役割が想像しやすい
・ 関数やクラス、モジュール単位で責務が分けられており、それぞれの結合度が低い
```

正直なところ就職前は「へ〜」ぐらいの感覚であまりピンと来ていなかったのですが、
業務を行う中で重要度を改めて理解できました。
例えばサービスの終了や変更があった際は、コード内でそのサービスに関わる箇所を把握する必要があるのですが、命名が適当だと検索に引っ掛からず、そして処理を追わないと内容がわからないといった厳しい状態に陥ることがわかりました。

また、関数やクラスなどが適切な責務で分けられておらず、密結合の場合、修正箇所や修正の影響範囲がどこまで及ぶのかなどの把握が難しく、テストに関してもどう書いていいのかわからないといった状況に陥ることがわかりました。

### 3. 幅広い技術に触れることができた
開発だけではそのシステムの機能に関わる技術のみに触れることが多いですが、
様々なサービスを運用していく中で、各サービス内の技術や管理ツールを深く理解しなければ対応できない場合が多く、そういった意味で技術の幅がぐっと広がった気がします。


## 保守・運用は新規開発の糧になるかも??
改めて感じたのが、ソフトウェア設計や世の中で話されている技術的な内容は長期期間のシステムの運用を目的としていることが多く、保守運用を経験しないとしっかりとは理解しきれないのではないかという仮説が自分の中で大きくなってきている今日このごろです。
今後新規開発をガツガツ行なっていく場合も、より技術を理解できた状態で望めるのではないかと思います。


## 最後に
保守・運用は会社によって内容が変わると思うのでここに書いた内容が必ずしも当てはまらないかもなのですが、今後もし保守・運用作業を任された際は、「保守・運用」という名前だけで拒絶反応を示さずこの記事を思い出していただけると嬉しいです。
最後まで読んでいただきありがとうございました。
飼い猫のLINEbotを作ったらめっちゃ簡単で楽しかった

## はじめに
こんにちは。学校法人角川ドワンゴ学園でプログラミング講師をしているhokopiです。
家庭内での色々を記録する備忘録としてLINEbotを作り、ついでにアイコンを飼い猫にしたらめっちゃ楽しかったのでここに記します。
今回はLINE公式アカウントの機能の他に、googleスプレッドシート、gasを使っています。

## LINEbotを作る
botの作成自体はめちゃめちゃ簡単です。
[ここ](https://entry.line.biz/start/jp/)からLINEビジネスIDのアカウント登録をするだけで、自動的にLINE公式アカウントが開設されます。初期設定の時点で友達追加時のメッセージや自動返信メッセージが設定されているので、この時点でbot自体は完成です。
こんな感じで管理画面が出ます。
画像では隠してしまいましたが、うちの猫は「なつめ」という名前なので、なつめbotという名前にしています。

![スクリーンショット 2024-12-16 7.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634352/4f74086b-e85b-7455-8c23-42836be12206.png)

あとはアイコンを設定したり、チャットタブで各友達に個別にメッセージを送ったり、応答メッセージ設定で自動返信するメッセージの設定をしたりすることで、ノーコードでも十分機能する公式アカウントが作れます。

## ログ機能を作る
今回はLINEbotを備忘録的に使いたいという目的があるので、まずはLINEbotに送った内容をスプレッドシートに書き出してログとして保存しておくということをします。

ログ機能として書いたコードは以下の通り

```
function doPost(e) {
  let spreadsheetId = 'スプレッドシートID'
  let spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  let sheet = spreadsheet.getSheetByName('log'); // シート名を指定
  let row = sheet.getLastRow() + 1;
  let lineToken = 'LINEbotのチャネルアクセストークン'
  
  //メッセージを取得
  let eventData = JSON.parse(e.postData.contents).events[0];
  let msg = eventData.message.text;
  
  //出力
  sheet.getRange(row, 1).setValue(new Date()); // 日時も記録
  sheet.getRange(row, 3).setValue(msg); //　改行区切りされたメッセージを列を分けて出力
```

これをgasで書いてデプロイしてからbotにメッセージを送ると………
![スクリーンショット 2024-12-16 11.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634352/772ca78c-0f66-7e86-e819-6cec10ec9af8.png)

こんな感じでbotに送った内容がスプレッドシートに反映されます。


## 自動返信機能を作る
このままだと飼い猫のアイコンをつけただけのログ出力botなので、もう少し遊んでみようということで、ここからは自動返信機能をつけていきます。

猫の名前は「なつめ」ですが、「夏目」とか「ナツメ」とか、「猫」とか「ねこちゃん」とか、表記揺れにも対応させようと思います。

```
  //返信に使用するテキスト
  let replyText = ['にゃー','にゃ','にゃっ','ｺﾞﾛｺﾞﾛ……','みゃ〜','ｱｵｰ','にゃ〜ん','にゃにゃ','うにゃ〜','にゃう','ｱｵ〜〜ｵ〜〜ｱｵｩ〜〜〜','ｱｵｵｵｵｵ',"zzz……","ペロッティ","ﾍﾟﾛﾃｨ"];
  let rareText = ['うまいにゃんジャンボ','ちょっと高級なごはんにしたいニャ'];

  if(msg.match('なつめ') != null || msg.match('夏目') != null || msg.match('ナツメ') != null || msg.match('猫') != null || msg.match('ねこ') != null || msg.match('ネコ') != null || msg.match('ﾈｺ') != null){//なつめ、ナツメ、猫、ネコ、ねこなどが入っていれば返信する
  
  //返信に使うメッセージをランダムで決める
  let replyIndex = Math.floor(Math.random() * replyText.length);
  let rareIndex = Math.floor(Math.random() * rareText.length);
  let rareReplyJudgement = Math.floor(Math.random() * 100); // 100分の1でレアメッセージが送信される
  
  //メッセージを送信
  if(rareReplyJudgement === 0){
    sendMessage(replyToken,lineToken,rareText[rareIndex]);
  } else {
    sendMessage(replyToken,lineToken,replyText[replyIndex]);
  }
  
  }
}
```

上記のような感じで返信用のテキストを15種類ほど用意し、ランダムで返信を決めています。
また、100分の1の確率でレアメッセージが返信されるという仕様にしてみました。
返信メッセージに猫の鳴き声ではないものが混ざっているのは、家庭内の内輪ネタです。


## 現在の姿
現在、LINEの画面はこのようになっています
<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634352/087d71cf-d9e8-e401-d692-dc32a761597f.png">

という感じでLINEbotができました。飼い猫が返信してくれるのが楽しくて、ログのほとんどが内容のないやりとりになってしまっていますが、まぁよいでしょう。

今後はリマインダー機能なども追加してさらに高機能にしていこうと思います。

みなさんもぜひLINEbot作ってみてくださいね。
エンジニアとして働く私が実施している眠気対策：生産性を上げる工夫とは？

エンジニアの仕事は長時間にわたる集中力を必要とする一方で、座りっぱなしのデスクワークや単調な作業が眠気を誘発しやすい環境でもあります。
そのため、日中の眠気をどう対策するかが、生産性や集中力の維持において重要な課題となります。
本記事では、エンジニアである私が実際に行っている眠気対策を紹介します。これらの方法は即効性のあるものから、根本的な体質改善を目指すものまで幅広く含まれています。ぜひ参考にしてみてください。

---

### 1. 睡眠の質を改善する基本対策

眠気の原因の大部分は、日常の睡眠不足や質の低下にあると思います（とはいっても、夜更かししちゃうんですけどね･･･）
そのため、眠気を根本から防ぐためには、睡眠の質を高めることが重要です！

#### **早寝早起きのルーチンを作る**

仕事や趣味で夜更かしをしがちなエンジニアにとって、規則正しい睡眠スケジュールを作るのは簡単ではありません。
しかし、一定の時間に寝て一定の時間に起きることで、体内時計が整い、日中の眠気が軽減されます。

- **就寝前のルール**
  - 就寝1時間前にはスマホやPCの使用を避け、ブルーライトをカットする。
  - 温かい飲み物（ハーブティーなど）を飲む。
  - 軽いストレッチや深呼吸で体をリラックスさせる。

#### **快適な睡眠環境の整備**

睡眠の質を高めるためには、寝室環境を見直すことも大切です。

- **枕やマットレスの選び方**
  - 自分の体型や寝姿勢に合った硬さのマットレスを選ぶ。
  - 枕は頭と首をしっかり支えるものが理想。
- **部屋の温度と照明**
  - 寝室の温度は18-22℃が適切。
  - 完全に暗い環境を作るため、遮光カーテンやアイマスクを活用する。

---

### 2. 作業中に即効性のある眠気対策

どうしても眠気が襲ってくる場合に、即効性のある対策を取ることが重要です。

#### **1. カフェインの上手な活用**

カフェインは眠気対策の定番ですが、摂取タイミングと量を工夫することで効果を最大化できます。

- **ベストなタイミング**
  - 昼食後や午後の作業開始時に摂取。
  - 夜遅くの摂取は避ける（睡眠の質を下げる可能性がある）。
- **適切な量**
  - 1回あたりコーヒー1杯（約100mgのカフェイン）が目安。
  - 過剰摂取は逆に集中力を乱す原因になるため注意。

#### **2. 短時間の仮眠（パワーナップ）**

短時間の仮眠は、眠気を解消しながら作業効率を高める効果があります。

- **理想の時間**
  - 10–20分程度の仮眠が最適。
  - 30分以上の仮眠は、深い睡眠に入りすぎて逆にだるさを感じる原因になる。
- **仮眠時の工夫**
  - 仮眠後に目覚めやすいように、仮眠前に少量のカフェインを摂取する。
  - 静かな場所やアイマスクを使って快適な仮眠環境を作る。

#### **3. 身体を動かすミニエクササイズ**

座りっぱなしの状態を続けると、血流が悪くなり眠気が増します。定期的に身体を動かすことで、眠気を解消しましょう。

- **簡単にできる動作**
  - 立ち上がって伸びをする。
  - オフィス内を軽く歩く。
  - 首や肩を回してストレッチする。
- **タイマー活用**
  - 25分作業して5分休むポモドーロテクニックを利用し、リズムを作る。

---

### 3. 眠気を防ぐための食生活の工夫

食生活の改善も、眠気対策には大きな影響を与えます。

#### **エネルギーを補給する軽いスナック**

エネルギーが不足すると眠気が増しますが、血糖値を急激に上げない軽食が最適です。

- **おすすめの軽食**
  - ナッツやアーモンド：健康的な脂質とタンパク質が含まれている。
  - フルーツ（バナナ、リンゴなど）：自然な糖分でエネルギー補給。
  - プロテインバーやヨーグルト。
- **避けるべき食べ物**
  - 高糖質のお菓子や揚げ物は、一時的に血糖値を上げるものの、その後急降下して眠気を引き起こす可能性があります。

#### **水分補給の重要性**

脱水状態になると集中力が低下し、眠気が増します。

- **こまめに水分補給**
  - 朝起きてから1杯の水を飲む習慣。
  - 作業中も30分—1時間ごとに少量の水を飲む。
- **水以外の選択肢**
  - ノンカフェインのハーブティーや炭酸水なども効果的。

---

### 4. マインド面のアプローチ

眠気は身体的な要因だけでなく、心理的な要因によっても引き起こされます。

#### **モチベーションを保つためのタスク管理術**

作業に対する興味や集中力が低下すると、眠気が増します。タスク管理を工夫することで、この問題を解決できます。

- **ポモドーロテクニック**
  - 25分作業＋5分休憩のサイクルで、リズムを作りながら作業を進める。
- **優先順位を意識**
  - 重要なタスクを午前中に集中して行い、午後は軽い作業にシフト。

#### **リラックスと集中のバランス**

長時間の緊張状態は疲労感を高めます。適度にリラックスを取り入れることで、眠気を予防できます。

- **瞑想や深呼吸**
  - 目を閉じて1分間の深呼吸を行う。
  - 瞑想アプリを活用して短時間でも心を落ち着ける。
- **心理的な疲労を軽減**
  - 作業環境を整え、快適な空間で作業する。

---

### 5. おわりに

眠気を防ぐための対策はさまざまありますが、最も重要なのは自分に合った方法を見つけて継続することです。
私自身、これらの対策を実践することで、作業効率や集中力の向上を実感しています。

エンジニアという職業は、頭を使い続けるハードな仕事ですが、適切な工夫をすることで眠気に打ち勝つことができます。
本記事を参考に、ぜひ自分に合った眠気対策を取り入れてみてください！

----------------------------------------------------------------------------------------
本記事ですが、Chat GPTを使って書いてみました。
5分ほどで書けましたが、内容はまとまっているものの、少し硬い印象･･･。
でもうまく付き合えばやっぱりいい味方になってくれそうだなと感じました！
SwiftPackageからSchemeを取得する

## はじめに
ビルド環境の切り替えにSchemeを利用しているプロジェクトは結構あると思います。
接続先の変更やMockへの差し替えなど行うのに便利です。

私のプロジェクトでは環境ごとにSchemeを分けており、SwiftPackageを用いたマルチモジュール化を行っていました。

その中でSwiftPackageからSchemeを取得することができずに困ったので、対応法を共有しておきます。

## 概要
マルチモジュール化の中でInfra層をSwift Packageに切り分けていました。

Infra層でAPIの接続先を切り替えたかったのですが、Active Compilation Conditionsで指定している値(DEBUG/STG/RELEASE)などをSwift Packageから取得することができませんでした。

## スキームを取得するためのSwiftPackageの作成
結論から言うと、スキームの情報を取得するために新規でSwiftPackageを作成しました。

SwiftPackage側からアプリモジュールの情報を直接参照することはできないので、起動時などに参照したいSwiftPackage側に渡してあげる必要があります。

例で言うとInfra層に直接情報を渡してあげても良いのですが、マルチモジュール化を進めていく中で他のモジュールでも必要になる可能性が高いため、今回は独立したSwiftPackageを作成して他モジュールから参照する形にしました。

## Configurationの定義
作成したSwiftPackageに以下を記述します。
まずスキームごとにenumのcaseで下記のように定義しておきます。
```swift
public enum SchemeConfiguration {
    case debug
    case staging
    case release
}
```

## Schemeを渡す
利用する側で下記のProviderを用いてスキームにアクセスできるように定義します。

```swift
public struct SchemeConfigurationProvider {
    // 内部で保持する変数
    private static var _config: SchemeConfiguration?

    /// 初期化用
    public static func initialize(config: SchemeConfiguration) {
        self._config = config
    }

    /// スキーム情報を取得するプロパティ
    public static var config: SchemeConfiguration {
        guard let config = _config else {
            fatalError("SchemeConfigurationProvider not initialized.")
        }
        return config
    }
}
```

## AppDelegateでの初期化処理
上記でSwiftPackage側の定義は完了ですが、そのままでは使えません。
SchemeConfigurationProviderの初期化処理でアプリ側からActive Compilation Conditionsなどで定義している値を利用してスキームを渡してあげる必要があります。

```swift
/// Schemeに応じたConfiguraionを渡す
func setupSchemeConfiguration() {
    var config: SchemeConfiguration {
        #if DEBUG
        return .debug
        #elseif STG
        return .staging
        #elseif RELEASE
        return .release
        #else
        fatalError("Unknown configuration")
        #endif
    }
    SchemeConfigurationProvider.initialize(config: config)
}
```
起動時に渡したいので、AppDelegateの`didFinishLaunchingWithOptions`で呼んであげればOKです。あとは利用箇所でSwiftPackageをimportして下記のようにアクセスすれば問題なくスキームごとの値を取得することができるようになりました。
```swift
import SchemeConfig

enum APIConfig {
    static let hostURL: String = {
        switch SchemeConfigurationProvider.environment {
        case .debug:
            return "https://hogehoge-debug.com/"
        case .staging:
            return "https://hogehoge-stg.com/"
        case .release:
            return "https://hogehoge.com/"
        }
    }()
}
```

## 最後に
SwiftPackage側から取得する方法が何かしらあるはずと思って探していて詰まったのですが、シンプルにApp側から渡してあげればいいだけでした。

SwiftPackageとSchemeを利用しているプロジェクトがあれば参考にしてみてください！