OmniAICreator/Qiita-1.07M huggingface dataset:
【リーダブルコード】初心者エンジニアが読み解く「名前に情報を詰め込む」テクニック - 第2章

こんにちは！マル太です。

前回は、リーダブルコードの第1章「理解しやすいコード」についてまとめました。

今回は、第2章「名前に情報を詰め込む」の内容を、私なりに解釈し、まとめていきたいと思います。
<br>

# 名前に情報を詰め込むことの重要性
コードを書く上で、変数や関数に適切な名前をつけることは非常に重要です。

なぜなら、名前はコードの意図を伝えるための重要な要素だからです。

名前が分かり易いと、コードを読む人が変数や関数の役割を容易に理解することができます。

逆に、名前が分かりにくいと、コードの理解が困難になり、誤解やバグに繋がる可能性も高まります。また、読むのに時間もかかってしまいますね。
<br>


# 名前に情報を詰め込むための具体的なテクニック
2章では、名前に情報を詰め込むための具体的なテクニックとして、以下の点が挙げられています。
<br>
**明確な単語を選ぶ**
・変数名や関数名には、具体的な単語を使用しましょう。
・例えば、`get` や `set` などの汎用的な動詞よりも、 `fetch` や `download` のように、より具体的な動作を表す動詞を使う方が、コードの意図が明確になります。
<br>

**汎用的な名前を避ける**
・`tmp` や `retval` などの汎用的な名前は、具体的な情報を含んでいません。
・変数名や関数名には、その変数や関数がどのような値を格納しているのか、どのような処理を行うのかを明確に示す名前をつけましょう。
<br>

**抽象的な名前より具体的な名前を使う**
・抽象的な名前よりも、具体的な名前の方が、コードの意図を明確に伝えることができます。
・例えば、 `data` や `value` などの抽象的な名前よりも、 `user_data` や `product_value` のように、具体的な名前を使う方が、コードの理解が容易になります。
<br>

**接尾辞や接頭辞を使って情報を追加する**
・接尾辞や接頭辞を使って、変数や関数に追加情報を加えることができます。
・例えば、 `start_time` や `end_time` のように、 `~~_time` という接尾辞を使うことで、これらの変数が時間を表す変数であることが明確になります。
<br>

**名前の長さを考慮する**
・名前の長さは、短すぎても長すぎてもダメです。（難しい。。。）
・短すぎると情報が不足し、長すぎると読みにくくなります。
・適切な長さの名前をつけるように心がけましょう。
<br>

**名前のフォーマットで情報を伝える**
・名前のフォーマットを統一することで、コードの一貫性を保ち、読みやすくすることができます。
・例えば、 `CONSTANT_VALUE` のように、定数名は大文字にする、 `camelCase` や `snake_case` のように、変数名や関数名に一定の命名規則を適用するなど、プロジェクト全体で統一されたフォーマットを使用しましょう。
<br>

※命名規則って？
命名規則とは、名前の付け方のルール のことです。
例えば、
`camelCase` : 単語の先頭を大文字にする（例：`userName`）
`snake_case` : 単語をアンダースコアでつなげる（例：`user_name`）
など、様々な命名規則があります。

<br>

# まとめ
今回は、「リーダブルコード」第2章「名前に情報を詰め込む」の内容をまとめました。

変数名や関数名に適切な名前をつけることは、読みやすいコードを書くための基本ということが学べました。

2章で紹介されているテクニックを参考に、名前に情報を詰め込むことで、より理解しやすく、保守しやすいコードを目指していければなと思います。

そして、変数名や関数名は英語で書くため、英語力もあればより良いと実感しました。。。

次回は、第3章「誤解されない名前」についてまとめていきたいと思います。
[自分用メモ]

CloudformationテンプレートでMetricsFilterでメトリクスを作成し、そのメトリクスを使用してアラートを作成

1.MetricsFilter

```logs.yml
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  # CloudWatch Log Group for RDS logs
  RDSLogGroup:
    Type: "AWS::Logs::LogGroup"
    Properties:
      LogGroupName: "/aws/rds/instance-logs"
      RetentionInDays: 14  # Retain logs for 14 days

  # Metric Filter for RDS Instance ID and Swap Total
  MetricFilterInstanceIdAndSwapTotal:
    Type: "AWS::Logs::MetricFilter"
    Properties:
      LogGroupName: !Ref RDSLogGroup
      FilterPattern: "{ $.instanceId = *, $.swapTotal = * }"
      MetricTransformations:
        - MetricValue: "1"
          MetricNamespace: "RDSMetrics"
          MetricName: "RDSInstanceId"
        - MetricValue: "$.swapTotal"
          MetricNamespace: "RDSMetrics"
          MetricName: "SwapTotal"

  # Metric Filter for Swap Usage Amount
  MetricFilterSwapUsage:
    Type: "AWS::Logs::MetricFilter"
    Properties:
      LogGroupName: !Ref RDSLogGroup
      FilterPattern: "{ $.instanceId = *, $.swapUsed = * }"
      MetricTransformations:
        - MetricValue: "$.swapUsed"
          MetricNamespace: "RDSMetrics"
          MetricName: "SwapUsageAmount"

Outputs:
  RDSLogGroupName:
    Description: "Name of the CloudWatch Log Group for RDS logs."
    Value: !Ref RDSLogGroup
```

2.Alarm
```alarm.yml
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  # CloudWatch Alarm for MetricMath (Total - Used)
  MetricMathAlarm:
    Type: "AWS::CloudWatch::Alarm"
    Properties:
      AlarmName: "SwapTotalMinusUsed"
      AlarmDescription: "Alarm when the difference between swap total and used exceeds threshold."
      Namespace: "RDSMetrics"
      MetricName: "SwapTotalMinusUsed"
      ComparisonOperator: "GreaterThanThreshold"
      Threshold: 0
      EvaluationPeriods: 1
      DatapointsToAlarm: 1
      TreatMissingData: "missing"
      Metrics:
        - Id: "total"
          MetricStat:
            Metric:
              Namespace: "RDSMetrics"
              MetricName: "SwapTotal"
            Period: 300
            Stat: "Sum"
        - Id: "used"
          MetricStat:
            Metric:
              Namespace: "RDSMetrics"
              MetricName: "SwapUsageAmount"
            Period: 300
            Stat: "Sum"
        - Id: "mathExpression"
          Expression: "total - used"
          Label: "SwapTotalMinusUsed"
          ReturnData: true
```
Express＆React(vite)を使用したWebアプリ作成用の環境構築その３

## 続き
https://qiita.com/hidarikiki_toybox/items/b75f38f6e4877adff041

## eslintの設定をする
eslintがインストールされていない環境であれば下記をコマンド上で実行する
```
npm install -D eslin
```
インストール後は下記を実施する(※設定についての質問が環境にあわせて答える)
```
npx eslint --init
```

eslintのconfigファイルに下記を追加する
```
{rules: {"react/react-in-jsx-scope":"off"}}
```
eslintを実行する
```
npm run lint
```
下記のようなエラーがでる場合は、configに設定を追加する
```
Warning: React version not specified in eslint-plugin-react settings. See https://github.com/jsx-eslint/eslint-plugin-react#configuration .
```
先ほど記載したrulseの後ろに追記する
```
{rules: {"react/react-in-jsx-scope":"off"}, settings:{ react: { version: 'detect'}}}
```

## prettierの設定
prettierをインストールするため、下記コマンドを実行する
```
npm i -D prettier
```
VScodeのprettier拡張機能をインストールする
ルートフォルダに下記prettier.config.jsファイルを作成し、下記を記載する
```
/** @type {import("prettier").Config} */
const config = {
    semi: true,
    tabWidth: 2,
  };
  
  export default config;
```
VScode上で[ctrl]+[shift]+[p]を押下し、settingと記載し、下記設定ファイルを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931620/b169c0c5-e040-81f1-5262-bccf00a40328.png)
開いた設定ファイルに下記を追記する
```
"editor.formatOnSave": true
```
上記設定は保存時にフォーマット化される設定であるため、手動でフォーマットする場合のコマンドを登録する
package.jsonにコマンドを記載する
```
"format": "prettier . --write"
```
手動でフォーマットする場合のコマンド
```
npm run format
```
Community Labs Venture Studioの紹介 [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/13e52dff-6867-45b4-b5bb-c1e75a039596.png)

:::note info
本記事は下記の翻訳となります。
[『Introducing the Community Labs Venture Studio』](https://www.communitylabs.com/blog/introducing-the-community-labs-venture-studio)（by Community Labs）
:::

## Protocol Development Cycle

![](https://cdn.prod.website-files.com/66c607043f775347e75460f6/66c60b4e22d11a2cedbc8556_66c60b22d9e6b3aa76f02cd2_Y2zISIFLxsjqf4i0YdpHlWdzrwU.avif)

[Community Labs](https://communitylabs.com/) は、Arweave エコシステムの中心に位置し、開発者やユーザーの課題を解決する基盤となるツールとインフラストラクチャの構築を支援する独自の立場にあります。私たちのベンチャースタジオを通じて、Community Labs は、プロダクトのアイデアを見出し、構想から大規模な採用に至るまでプロダクトを創造、開発、育成する能力を持つと信じる創業者やファウンディングチームを発掘します。

エコシステムに対する私たちのビジョンに基づき、最近では開発者向けツール、コンシューマーのユースケース、公共財、大規模採用の核心を突くプロダクトとプロトコルの[アイデアロードマップ](https://twitter.com/CommunityLabs/status/1577347451136233477)を公開しました。私たちのビジョンとミッションに共感し、これらの基盤となる機会に興奮を覚える創業者の皆様を、Community Labs に招き、一緒に構築を始めることを呼びかけています！

スタジオは、以下のコアとなるオペレーティングシステムを通じてプロトコルを開発します：

1. エコシステムにおける重要なニーズと機会の特定と優先順位付け
2. 人材と資本によるプロジェクトの種まき
3. それらのニーズや機会に対応するプロジェクトの開発
4. 持続可能な組織へのプロジェクトの拡大
5. プロジェクトの独立への道筋の提供

## 私たちと一緒に構築しませんか？

プロトコルの創業者になることに興味がありますか？Community Labs のフェローとして参加し、既存のファウンディングチームやプロトコルと協力しながら、あなたの MVP を構築しましょう。私たちは、迅速かつスマートに構築することに情熱を持ち、指導を受け入れる姿勢があり、ゼロから何かを構築したいという強い意欲を持つフェローを探しています。その見返りとして、Community Labs は、運営面と技術面のリソース、そしてメンタリングとコーチングを通じて、プロダクトのライフサイクルを通じてファウンディングチームをサポートします。

私たちは、ビルダーやチームメイトが高いインパクトのある環境で、低い障壁で構築に集中できるようにサポートします。正当な理由があれば、必要なものは私たちが対応します。私たちはアクセラレーターでもインキュベーターでもありません。私たちは、受け入れたフェローと共に、そして彼らをサポートしながら構築を行う信頼できるパートナーです。企業は個々のニーズを持つ人々の総和であり、コミュニティだからこそ、あなたが必要とするものは何でも提供します。それが Community Labs です。

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
GitHubActionsで定期実行


Actionsタブのset up a workflow yourselfをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/3001fd4b-f973-a401-c91a-c109929f8fda.png)

```yml:.github/workflows/schedule.yml
name: Schedule abc.py

on:
  schedule:
    - cron: '15 1 * * *' # 毎日10:15にジョブを実行
  workflow_dispatch:

jobs:
  run-abc:
    runs-on: ubuntu-latest

    steps:
      # リポジトリをクローン
      - name: Checkout repository
        uses: actions/checkout@v3

      # Python環境をセットアップ
      - name: Set up Python environment
        uses: actions/setup-python@v4
        with:
          python-version: '3.12'

      # 依存関係をインストール
      - name: Install dependencies
        run: pip install -r requirements.txt

      # 必要な環境変数をセット
      - name: Set environment variables
        env:
          DEVELOPER_KEY: ${{ secrets.DEVELOPER_KEY }}
        run: echo "Environment variables set"

      # abc.pyを実行
      - name: Execute abc.py
        env:
         DEVELOPER_KEY: ${{ secrets.DEVELOPER_KEY }}
        run: python abc.py
```

環境変数はレポジトリのSettings＞Security＞Secrets and variables＞ActionsのSecretsに設定

Actions＞Schedule abc.pyのRun workflowから手動実行
これは今日起こったことです👇 [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/383bb251-1113-4bfb-b95e-2c7551a31917.png)

:::note info
本記事は下記の翻訳となります。
[『This happened today 👇』](https://www.communitylabs.com/blog/this-happened-today)（by Community Labs）
:::

Community Labs は、Arweave エコシステムに最初の 100 万人をオンボードするためのプラットフォームとプロトコルを構築するために、3000 万ドルの戦略的ラウンドを調達しました。この達成を可能にした方々にまず感謝を申し上げます。この戦略的ラウンドは、Lightspeed Venture Partners が主導し、Arweave、Bain Capital Crypto、Blockchain Capital、Distributed Global、Road Capital Management といったパートナーと共に実現しました。

## こんにちは、世界。

私たちは Community Labs、Arweave ネイティブのソフトウェア開発会社であり、分散型永続的データストレージの採用を加速するための開発者ツールやユースケースを推進するベンチャースタジオです。私たちがここにいる理由は、永続的なデータストレージが社会に対して最も影響力のある進歩のひとつであり、最も知られていない技術のひとつだと信じているからです。私たちは、次の 1000 人のアクティブな Arweave 開発者と創業者をオンボードするために、重要な開発者ツールと基盤となるエコシステムソリューションを開発・サポートし、この技術を活用して世界を変える新しい方法を模索していきます。

私たちは優れた技術を信じていますが、すべての製品、プロトコル、企業の中核は「人」であることを理解しています。Arweave コミュニティは、存在する中で最も活気に満ち、協力的なコミュニティの一つです。Dameon、Ros、そして DMac に感謝！

もしあなたが Arweave で何かを作りたいというビジョンを持つ創業者であれば、ぜひお話ししましょう。Community Labs は、素晴らしい人々と素晴らしい技術を結びつけ、パーマウェブの最前線で一緒に構築していくことを目指しています。

私たちはエンジニアからオペレーターまで広範囲にわたって採用中ですので、このミッションに参加したい方は、[Twitter](https://twitter.com/communitylabs1)でご連絡ください！

## さあ、ビルドを始めよう。

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
【TryHackMe】Windows Fundamentals 3：Walkthrough

# 概要

TryHackMe「Windows Fundamentals 3」のWalkthroughです。

https://tryhackme.com/r/room/windowsfundamentals3xzx

# Task2

## **Q1**.*There were two definition updates installed in the attached VM. On what date were these updates installed?*

`Settings`->`Windows Update`からWindowsアップデート画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/126dee6e-d414-0d85-80d8-ee65238944db.png)

`View update history`->`Definition Updates`を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/003ca9ad-3b14-74a1-dde7-5d830f65c308.png)

**A**.**5/3/2021**

# Task3

## **Q1**.*Checking the Security section on your VM, which area needs immediate attention?*

`Settings`->`Windows Security`を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/53359790-e1b8-1364-bef2-a2ab1faa57d5.png)

**A**.**Virus & threat protection**

# Task4

## **Q1**.*Specifically, what is turned off that Windows is notifying you to turn on?*

`Windows Security`->`Virus & threat protection settings`->`Manage settings`へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f01df8b1-a350-f309-699d-08a51ae2af09.png)

`Real-time protection`のアラートが付いていると分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/9f24aa53-9823-9dfb-7e2a-c4b98fe8a2aa.png)

**A**.**Real-time protection**

# Task5

## **Q1**.*If you were connected to airport Wi-Fi, what most likely will be the active firewall profile?*

**Hint**.*xyz network*

空港のWi-Fiは`Public network`に分類されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/68ae5b63-48e4-632c-7a69-8b7bef0b62b6.png)

**A**.**Public network**

# Task7

## **Q1**.*What is the TPM?*

**A**.**Trusted Platform Module**

# Task8

## **Q1**.*We should use a removable drive on systems without a TPM version 1.2 or later. What does this removable drive contain?*

**Hint**.*Refer to the Microsoft documentation on BitLocker.*

BitLockerの公式ドキュメントから確認できます。

https://learn.microsoft.com/en-us/windows/security/operating-system-security/data-protection/bitlocker/#system-requirements

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/fcca7eed-4a56-21b3-e61d-358236dc4e03.png)

**A**.**startup key**

# Task9

## **Q1**.*What is VSS?*

**A**.**Volume Shadow Copy Service**
2025年LLM（大型言語モデル）業界で起こりそうなことを3つ予測

## 起こりそうなこと

### 1. LLMサービスの価格競争

すでに始まったけど、DeepSeek-V3のようにGPT-4o並みの賢さで、10分の1の価格で提供し始めました。

![Screenshot from 2025-01-20 21-42-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/d3ff63d8-dd84-7b5b-7d0b-b1b1e197515c.png)

![Screenshot from 2025-01-20 21-43-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/9b520500-7d06-43e3-bc83-aece007bc00c.png)

ディスカウント期間が過ぎても、DeepSeekの方が圧倒的に安いです。

考えられる理由としては、AI訓練手法の進化で、同じ性能のモデルを訓練するための時間とコストがかなり減少しました。

直近だと、USD 450でo1-previewと同性能のモデルを訓練したという研究もありました。

https://x.com/reach_vb/status/1878135746013298697

2024年はOpenAI一強​の状態も維持できなくなってきたので、今年はさらに価格競争までありそうでしょう。もちろんLLMチャットのサービスだけではなくて、その周りの応用・SaaSも同じく低価なサービスがたくさん出てくるでしょう。

---

### 2. 多様なAIエージェント

これも少しずつ出てきているけど、特に最近プログラミング界隈で流行っているClineシリーズ・さらにGoogleのGoogle Agentspaceもあって、いろんな領域でタスク自動化のAIエージェントが今年からたくさん出てきそうですね。

https://github.com/topics/ai-agents

もちろんオープンソースの部分も注意しなくてはいけなくて、Difyもすごいけど、最近ai-agents関連のレポジトリが多く出てきて、RAG + マルチモデル + 音声・画像インプット対応 + PDF対応なども1個のアプリで完結できます。

---

### 3. 新アーキテクチャを用いるLLMモデルの台頭

GPT-4が出たほぼ2年経ったけど、そこまでGPT-3 -> GPT-4みたいな飛躍的な進化が見えてなくて、GPT-5もまだ紙上の空論みたいな状況になっています。

![Screenshot from 2025-01-20 22-16-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893830/1be82eeb-d926-7a69-2b1d-5acd01c49a4c.png)

最近のモデルを見た感じで、Transformerモデルはそろそろ限界に来ているかと思うかもしれないでしょうか。

実は研究領域でTransformerアーキテクチャ以外のモデルもかなり進んでいます。例えばState Space Modelsは、GPTらが苦手な数学もできます。

https://huggingface.co/blog/lbourdois/get-on-the-ssm-train

また、LLMと少し違う概念のLCM（Large Concept Models）、「言語」よりもっと抽象的な「概念」を推論するモデルについての論文も最近流行っています。

https://arxiv.org/abs/2412.08821

GPTみたいなビジネスでも応用できるレベルまではもう少し時間がかかりそうですが、多くのリソースと研究者が進んでいる中で、おそらく今年も台頭しそうな感じがあります。

---

## 起こらなさそうなこと

逆に敢えて起こらなさそうなことも予測しましょう。

### 1. o3の流行

OpenAIからの公式情報ではなくて、あくまでリーク情報だけど、高性能バーションのo3は1回の推論でUSD 1,000（150,000円）ぐらいです。

https://felloai.com/2024/12/can-openais-latest-1000-per-task-o3-ai-model-replace-you-at-work/

賢さはあるけど、そこまでコストをかかってo3を使うよりは、人を雇った方が安いでしょう。

補足：こちらで言いたいのは、o3だけが流行しないではなくて、いわゆるこのような大量のリソースを使っうreasoningモデルは、賢くても、コストが高すぎて、まだ実用的なものではないと予想します。

### 2. GPT-5の誕生

前にも述べたけど、Transformerモデルはそろそろ限界という憶測で、OpenAIがGPT-5を訓練するために多大なリソースを投入したけどそれでもまだできないというニュースも何回聞いたことがあります。

*OpenAIは次世代AIモデル「GPT-5」の開発で次々と問題に直面しておりコストが膨らんでいる*

https://gigazine.net/news/20241224-openai-gpt5-orion-delays/


ということで以上です。予測結果の答え合わせは来年にやりましょう。
OpenSSH バイナリインストール

### バイナリファイルをダウンロード
```
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.4p1.tar.gz
```

### ダウンロードしたファイルを展開
```
tar -xvf openssh-9.4p1.tar.gz
cd openssh-9.4p1

```

### ダウンロードしたファイルを展開
```
sudo mkdir -p /usr/local/openssh
sudo cp ssh /usr/local/openssh/
sudo cp scp /usr/local/openssh/
sudo cp sshd /usr/local/openssh/
```

### パスを通す
```
export PATH=$PATH:/usr/local/openssh
echo 'export PATH=$PATH:/usr/local/openssh' >> ~/.bashrc
```

### サービスとして設定
```
sudo cp ./sshd_config /etc/ssh/
```


### サービススクリプトを作成
```
sudo nano /etc/systemd/system/ssh.service
```


#### 内容
```
[Unit]
Description=OpenSSH Daemon
After=network.target

[Service]
ExecStart=/usr/local/openssh/sshd -D
Restart=always

[Install]
WantedBy=multi-user.target
```


### サービスを有効化・起動
```
sudo systemctl daemon-reload
sudo systemctl enable ssh
sudo systemctl start ssh
```

### 動作確認
```
sudo systemctl status ssh
```


### ファイアウォールの設定
```
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload
```
AOCREDをAOのClaimに変換する [Open Access Supercomputing Foundation]


:::note info
本記事は下記の翻訳となります。
[『Converting AOCRED to Claim AO』](https://mirror.xyz/0x1EE4bE8670E8Bd7E9E2E366F530467030BE4C840/ydfvlhml1NI9DdTps3nEX634AY5JaQD4WmFGtRBryzk)（by Open Access Supercomputing Foundation）
:::
**このプロセスは米国外在住の方のみが対象となります。申請者は米国に居住していないことを証明する必要があります。**

AO Testnet にご参加いただき、ありがとうございます！AOCRED トークンをお持ちの方は、これから 2 週間、1000 AOCRED を 1 AO の比率で AO トークンの請求権に変換することができます。AO トークンは事前採掘されていないため、これらのトークンは Forward Research の AR 保有分から生成されたトークンを AOCRED 保有者に提供する形となります。

請求権を得るためには、締切までに AOCRED を預け入れる必要があります：2024 年 6 月 27 日午前 11 時（米国東部時間）

このプロセスは米国外在住の方のみが対象となります。申請者は米国に居住していないことを証明する必要があります。

以下の 2 段階のプロセスに従って手続きを行ってください：

![](https://images.mirror-media.xyz/publication-images/wlbbnFCMcmGlsr8-6EoR-.jpeg)

1. AO トークンの請求権を確認するために、AO トークンミントサイト（ao.arweave.dev）の AOCRED タブを使用して、ウォレットから AOCRED を預け入れてください。

2. 2025 年 2 月 8 日以降に、ミントサイトにアクセスして Arweave ウォレットに AO トークンを請求してください。この手順は有効化から 1 年以内に実行する必要があります。

ウォレットに AO トークンを請求するためには、この第 2 段階が絶対に必要です。上記のステップ 1 のみを実行し、ステップ 2 を実行しない場合、請求権のある AO トークンを実際に受け取ることはできません。

AO トークンは、総供給量の約 15%（10 万回目の 5 分間報酬期間後）がミントされた後、つまり 2025 年 2 月 8 日頃から譲渡可能となります。

2026 年 2 月 8 日以降に請求されなかったトークンは失効します。

これ以上の AOCRED は作成されず、現時点で Open Access Supercomputing Foundation や Forward Research における AOCRED に関する新たな計画はありません。

AOCRED の発行は終了しますが、wrapped AR を使用した新しいクエストが近日追加される予定です。また、Arweave エコシステム内の他の多くのプロジェクトでも、すでにインセンティブ付きのクエストが実施されています。

詳細については、AO の Discord に参加してください：[https://discord.com/invite/M2FcKZRGrC](https://discord.com/invite/M2FcKZRGrC)

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
【自分ルール】ドキュメントを作成するとき

# はじめに

自分で決めたルールをあまりにも忘れてしまうので、書き留めておこうと思いました。
自分ルールを忘れてこれに立ち返ったとき、「うわめんどくせ…」とならないようできるだけシンプルなドキュメントを作成できるようにすることを目的としています。

## 想定する読者
未来の自分です。
もしくはドキュメント作成の際に自分の中に軸がなくて自信が持てない方に届けばうれしいです。

# 基本方針

- 図や文字の斜体、太字などは使いすぎず、極力箇条書きでまとめる努力をする
    - メンテナンス性の観点から。図とか毎回差し替えるの大変だよね
- できるだけフォーマットを作成して汎用性を持たせる
    - フォーマットを作れば一部だけフォントが違ったり色が違ったり、ミスや資料作成時のばらつきを可能な限りなくせるはず
- いいフォーマットやドキュメント作成時参考になる資料があればどんどん自分の中に取り込もう
    - 参考資料等にフォーマット、ドキュメント書き方指針等の出典もとを記載する
- 紙面に出力しても見づらくないかを確認する
    - わかりやすい資料は大体A4に出力しても簡潔にわかりやすくまとまっているため
    - Excelなどで大きな表なってしまった場合は、印刷レイアウトに特に注意が必要
    - わかりやすさ第一として、あまりにも大きな表なってしまう場合は表の分割も検討する
    - Wordであればページ区切りを適宜使用する
    - 地球に厳しくしないように、両面印刷して確認する
- 「外部に納品できる」レベルを目指す
    - 自分ルールだし目指す必要もないけど、品質を向上させたいので…
    - つまらんことだけどこういうところで風下に立ちたくないので…
- 自分ルールではあるので、表紙は基本作らない
    - メンテナンス性の観点から
- ドキュメントの作成目的はコミュニケーションであることを忘れない
    - コミュニケーションには必ず伝えたい相手がいるはず
    - 相手が見やすいか、見ていて労力がかからないかを考える
    - 言葉の言い回しなどは相手と互いに前提が共有できているか考える
    - 専門用語や複雑な図、手順などには凡例をつけるのもアリかも
- 相手と言葉を大切に
あいまいな言葉はできるだけ辞書を引く、意味を調べること

## フォント

資料作成時に使用するフォントは、Meiryo UIとする。

## ヘッダー・フッター
ヘッダーは使用しない。フッターはページ番号のみとする。（ページ番号は真ん中）
→右開き、左開きどちらでもページが見やすいように

## 色
統一性を持たせて、できるだけ少ない色での表現を心がける。



### 青

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/20d0613b-f6b5-eb84-19f1-4144a122221d.png)


### オレンジ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/4b5627f4-a43a-0a75-f6dc-4d19fc9acce8.png)


### ピンク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/72d50273-e42d-40b3-29e2-1f2ba440e305.png)


### 黄色

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/8110b598-9674-3cdb-68fe-e65c0d21659f.png)


### 黄緑？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/ea5959dd-3ee0-c29e-7378-613502c55e7d.png)


### グレーっぽい青

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/3973937a-a40c-62ba-6828-91d8fe768939.png)

## 画像

Word、Excelに画像を貼付する場合は、画像に黒線を設定する
フローチャートなど図形を複数使いたい場合は原則SmartArtを利用する

## 図形

図形の枠は2.5ptとする

### 各ツールの利用基準

#### Word
- 方針や自分ルール、手順など一度作成したら頻繁には更新しないものを作成するとき
- 外部に提出する目的で体裁・書式について配慮が必要であるとき
#### Excel
- 表をメインに説明したいとき
- データを一覧にしたいとき

#### PowerPoint
- 図や画像をメインに説明したいとき
    - できるだけ紙面出力時はノート形式で出力する(ノート部分に補足情報など書けるのが非常によい)
#### Markdown
- アイデアや設計書など、バーっと書きたいとき
- リリースノートなど、箇条書きでちょこちょこ書いて画像や図は多用しないとき
- 自分で作ったアプリとかでもファイル、内容を使いたいとき
- システムに食わせるのは基本テキストまたはCSVとする
- 文字コードは基本Shift-JISとする

### 各ツール利用方法TIPS

#### 既存の書式を自分ルール書式で上書きする方法
画像はWordだが、Excel、PowerPointでも同様に「書式のコピー/貼り付け」が可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/81afdf83-c2e3-688b-25b3-7210db1b6306.png)

#### ファイル新規作成時に、デフォルトのフォントを変更する方法


# 参考文献

https://www.bunka.go.jp/koho_hodo_oshirase/hodohappyo/93650001.html

https://dictionary.sanseido-publ.co.jp/dict/ssd13928

https://dictionary.sanseido-publ.co.jp/smk8/

https://www.uipath.com/ja/resources/automation-whitepapers/uipath-methodology

# 変更履歴

2025年1月21日_新規作成
JavaScriptでMapを使ったSwitchの代替方法

# はじめに
JavaScriptでは、`switch`文を使って複数の条件分岐を処理することが一般的ですが、`Map`を活用すると、コードをより簡潔で効率的に記述することができます。本記事では、`Map`を使った`switch`文の代替方法について解説します。

# `Map`を使った基本構造
`Map`を使用する場合、条件に応じた処理を関数として格納し、キーを使って対応する関数を呼び出す形で動作させます。以下は具体例です。
```javascript
const operations = new Map([
  ['add', (a, b) => a + b],
  ['subtract', (a, b) => a - b],
  ['multiply', (a, b) => a * b],
  ['divide', (a, b) => a / b]
]);

// 使用例
const operation = 'add'; // 実行したい操作
const a = 10, b = 5;

if (operations.has(operation)) {
  const result = operations.get(operation)(a, b);
  console.log(result); // 出力: 15
} else {
  console.log('無効な操作です');
}
```

# `Map`を使うメリット

1. **簡潔な記述**
   - `switch`文の冗長な記述を避け、コードをシンプルに保てます。

2. **柔軟なキー**
   - `Map`では文字列だけでなく、オブジェクトや関数、`NaN`などのキーも使用可能です。

3. **順序保持**
   - `Map`ではキーの挿入順が保持されるため、順序に依存するロジックも扱いやすくなります。

4. **パフォーマンス**
   - 条件が多い場合、大規模な`switch`文よりも高速に動作します。

5. **可読性の向上**
   - 各条件ごとの処理を独立した関数として定義することで、コードの見通しが良くなります。

# `switch`との比較

`switch`文を使用する場合のコードと`Map`を使用する場合のコードを比較してみましょう。

#### `switch`文の場合
```javascript
function calculate(operation, a, b) {
  switch (operation) {
    case 'add':
      return a + b;
    case 'subtract':
      return a - b;
    case 'multiply':
      return a * b;
    case 'divide':
      return a / b;
    default:
      throw new Error('無効な操作です');
  }
}

console.log(calculate('add', 10, 5)); // 出力: 15
```

#### `Map`を使用する場合
```javascript
const operations = new Map([
  ['add', (a, b) => a + b],
  ['subtract', (a, b) => a - b],
  ['multiply', (a, b) => a * b],
  ['divide', (a, b) => a / b]
]);

const operation = 'add';
const a = 10, b = 5;

console.log(operations.get(operation)(a, b)); // 出力: 15
```

# デフォルト処理の追加
`Map`でデフォルト処理を追加する方法も簡単です。例えば、以下のように実装できます。

```javascript
const operations = new Map([
  ['add', (a, b) => a + b],
  ['subtract', (a, b) => a - b],
  ['multiply', (a, b) => a * b],
  ['divide', (a, b) => a / b]
]);

const operation = 'modulo'; // サポートされていない操作
const a = 10, b = 5;

const result = operations.get(operation) || (() => '無効な操作です');
console.log(result(a, b)); // 出力: "無効な操作です"
```

# まとめ

`Map`を使った条件分岐は、`switch`文の代替として非常に有用です。特に以下のようなケースで効果を発揮します：

- 条件が多く、可読性を高めたい場合
- 動的に条件を変更する必要がある場合
- 高速な処理が求められる場合

ぜひ、`Map`を活用して効率的なコードを書いてみてください！
秘密鍵から公開鍵を導出する

![sh](https://blogger.googleusercontent.com/img/a/AVvXsEivRK21YiuJmlzrncuAxbo5YzTYbCwIa6d1Nm2ZUjcTkLJaU_v1THCYVRLgCL0ijXXlMm_N8nCZTp70WBYl-hnFkBKdkaF1XluN1q8DmviRlEdZHQAd8bn5qTSxPehMbLPuryQ9XJrv2FG--sfq9Nsy3Lu74b6P4UOavm96o2tt-1DOtGBaZDHd5TPJXdri)

ssh鍵を更新したあかつきにauthorized_keysファイルから旧公開鍵を削除したいんだが、ラベルがなくてどれやと途方に暮れたときに秘密鍵をソースに`ssh-keygen -y`で公開鍵を導出できる

```sh:sh
# 秘密鍵の公開鍵をプリント
ssh-keygen \
-y \ # 公開鍵の抽出オプション
-f path/to/private_key # 秘密鍵の指定オプション

> ssh-rsa XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...

# 上記の公開鍵を削除する
vi path/to/authorized_keys
```
phalcon - voltで変数の参照

![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-jNSDnPnDPT1CR-fGd1tIIhhscC1nreApcX-R2FB3H6poyVw89mgfLiymCInefjXkAXFMfmn7iPFSyXDfuOBG9pknKWGa5ewH9V06RhprrOJ9xF7Xwrkcq-VV9ZLzOt0x_Ue2lzM4VnMCZ5MjyeykCsuAtLi6OD2H5HXkZum-3n1oj7eXYPaxahu1fAOz/w103-h103/phalcon.png)


voltで定数やらグローバル変数を参照するために、php記述で妥協していたがvoltでいけるじゃないか。

クラス定数は

```php:php
<?= ClassName::constant_field_name ?>
```

<p>
contantメソッドで定数の値をとってこれる。
</p>

```php:volt
{{ constant('ClassName::constant_field_name') }}
```

<p>
global変数は
</p>

```php:php
<?php global $GLOBAL_VARIABLE_NAME; ?>
<?= $GLOBAL_VARIABLE_NAME ?>
```

GLOBALSディレクティブでとってこれる。


```php:volt
{{ GLOBALS['GLOBAL_VARIABLE_NAME'] }}
```
select【Go】

### select

複数のチャンネルを同時に監視し、どれか1つが準備できたときに処理を進める。
複数の case の準備ができている場合、case はランダムに選択される。

```Go
package main

import "fmt"

func fibonacci(c, quit chan int) {
	x, y := 0, 1
	for {
		select {
		case c <- x:
			x, y = y, x+y
		case <-quit:
			fmt.Println("quit")
			return
		}
	}
}

func main() {
	c := make(chan int)
	quit := make(chan int)
	go func() {
		for i := 0; i < 10; i++ {
			fmt.Println(<-c)
		}
		quit <- 0
	}()
	fibonacci(c, quit)
}
```
**fibonacci関数**
フィボナッチ数列を生成し、チャンネルcに送信。また、チャンネルquitを監視し、終了指示があれば処理を停止。

```case c <- x```: 現在のフィボナッチ数xをcに送信。次のフィボナッチ数を計算し、xとyを更新。
```case <-quit```: quitチャンネルから値を受け取った場合、"quit"と出力して関数を終了。


```Go
func fibonacci(c, quit chan int) {
	x, y := 0, 1
	for {
		select {
		case c <- x: 
			x, y = y, x+y
		case <-quit: 
			fmt.Println("quit")
			return
		}
	}
}
```

**main関数**



**cとquitチャンネルの作成**

```c```: フィボナッチ数列の値を送受信するためのチャンネル。
```quit```: 処理終了のシグナルを送るためのチャンネル。

```Go
c := make(chan int)
	quit := make(chan int)
```

**ゴルーチン起動**

forループで10回、チャンネルcからフィボナッチ数を受信し、それをfmt.Printlnで出力。
10回の出力後、チャンネルquitに0を送信してfibonacci関数の終了を指示。

```Go
go func() {
    for i := 0; i < 10; i++ {
        fmt.Println(<-c)
    }
    quit <- 0
}()
```

**fibonacci関数の呼び出し**

無限ループを開始し、ゴルーチンがquitに値を送るまで処理は継続。

```Go
fibonacci(c, quit)
```
永続データで開発するべき5つの理由 [Permanent Data Solutions, Inc]


:::note info
本記事は下記の翻訳となります。
[『5 Reasons to Develop with Permanent Data』](https://medium.com/ar-io/5-reasons-to-develop-with-permanent-data-3b7fa2fb4c6c)（by Permanent Data Solutions, Inc）
:::

[Arweave](https://arweave.org/)は、2018 年に最初の永続的データプロトコルとして発明されました。それ以来、[ar.io ゲートウェイ](https://ar.io/gateways/)のような多くの分散型インフラストラクチャプロジェクトが、永続的データの取り扱いを補完・強化するためにプロトコルの周りに構築されてきました。
Arweave の登場により、開発者たちはクラウドや中央集権型ストレージでは通常できない永続的データの新しい使い方を発見してきました。

![](https://miro.medium.com/v2/resize:fit:1400/1*1ge8Eb0sDpC_Db_4JzezmQ.jpeg)

Arweave で開発することで得られる 5 つの利点を紹介します：

## 1) オープンソース、パーミッションレス、そして組み合わせ可能

- インターネットの本来のビジョンの精神を取り戻す — オープンソースのデータを取得し、好きなように使用できる読み書き可能なサーバーに戻す。
- パーミッションレスで組み合わせ可能なデータは、次のプロジェクトを構築する際の出発点となります。

## 2) データのサイロ化なし

- サードパーティのアプリ上に構築し、その後条件が変更されたり、最悪の場合、予告なくアプリが閉鎖されるということはありません。
- サービスの API をコーディングし、それが変更されて動作しなくなった経験はありませんか？この予測可能な悪夢は、API が突然使えなくなることを意味します。しかし、純粋なデータを扱っている場合、これが起こる理由はありません。

## 3) エージェンシーの実現

- 自主的なデータアクセス！決して忘れることのない Arweave の永続的ハードドライブと ar.io ゲートウェイがあれば、フルノードに限りなく近づけます。このセットアップにより、気になるデータへの制限のないアクセスと、より多くのコントロールが可能になります。

## 4) データのアドレス可能性

- 既存のインターネットは全て場所に関するものです — 物理的なデータを取得したい場合、そこに存在している必要があり、そのアドレス指定の仕組み全体はあなたがコントロールできないものです。
- 永続的データでは、アドレス指定はコンテンツとメタデータに関するものです。

## 5) 新しいフロンティアの構築

- この新しく発展する環境には、学び、構築し、貢献すべきことが多くあります。これは私たちの時代の重要な技術開発の 1 つです — メインストリームに入る前に参加しましょう。
- オープンソースで、パーミッションレスで、組み合わせ可能なプロトコルにより、共に、より高みに到達できると確信しています。

## 始めるためのドキュメント

1. [Arweave Cookbook](https://cookbook.arweave.dev/)
2. [AR.IO Docs](https://docs.ar.io/)
3. [ArDrive Docs](https://docs.ardrive.io/)

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
matplotlibのerrorbarの凡例のアイコン表示でハマったこと

# まえがき
修論書くためmatplotlibで図表を作っていた時にハマったけど、検索してもあまり日本語の情報がなかったために、備忘録的に書いておきます。
# ハマったこと
横軸と縦軸の両方に誤差があるタイプの誤差付き散布図を作ろうとしていたときに、
凡例のアイコンの表示が上手くいかなかった。
```python:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines

labels=['tekitou1','tekitou2','tekitou3']
x=[1., 2., 3.]
y=[1., 2., 3.]
xerr=[0.5, 0.2, 0.6]
yerr=[0.5, 0.2, 0.4]

fig = plt.figure(figsize=(6,4))
ax = fig.add_subplot()

for i in np.arange(len(x)):
    ax.errorbar(x[i],y[i],yerr=yerr[i],xerr=xerr[i],
                label=labels[i], capsize=4, marker='o',
                ecolor='blue', color="red")
ax.legend(fontsize=18)

plt.show()
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990838/1f336619-b58e-e249-56a6-974cd6abb902.png)
横軸の誤差のキャップはなんか途中だし、色がおかしいと困っていた。
# 解決策
なぜかは分からないがerrorbarの引数の中に`ls=''`を追加すると直る。
```python:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines

labels=['tekitou1','tekitou2','tekitou3']
x=[1., 2., 3.]
y=[1., 2., 3.]
xerr=[0.5, 0.2, 0.6]
yerr=[0.5, 0.2, 0.4]

fig = plt.figure(figsize=(6,4))
ax = fig.add_subplot()

for i in np.arange(len(x)):
    ax.errorbar(x[i],y[i],yerr=yerr[i],xerr=xerr[i],
                label=labels[i], capsize=4, marker='o',
                ecolor='blue', color="red", ls='')
ax.legend(fontsize=18)

plt.show()
```
![Untitled2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990838/b1ea6688-6d4f-3fee-e729-a4e8bafd96c0.png)
【AWS】Lambda作成時のエラー「'layers' failed to satisfy constraint」の原因と解決方法

# 概要
Lambda関数をCloudformationで作成すると「`'layers' failed to satisfy constraint...`」のエラーメッセージに。解決できたので紹介します。

# 原因と解決方法

以下の内容で適用します。

```yaml
   SampleFunction:
     Type: AWS::Lambda::Function
       Properties:
       # 省略
         Layers:
           - !Sub 'arn:aws:lambda:ap-northeast-1:${AWS::AccountId}:layer:example-libs'
```

すると下記エラーになります。

> ' at 'layers' failed to satisfy constraint: Member must satisfy constraint: [Member must have length less than or equal to 2048, Member must have length greater than or equal to 1, Member must satisfy regular expression pattern: (arn:(aws[a-zA-Z-]*)?:lambda:[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\d{1}:\d{12}:layer:[a-zA-Z0-9-]+:[0-9]+)|(arn:[a-zA-Z0-9-]+:lambda:::awslayer:[a-zA-Z0-9-]+), Member must not be null]

「Layersプロパティに指定されたARNの形式が正しくない」とのことで、文字数などについて言及されていますが、問題なさそうです。

何が原因なのか...?

答えは、
「レイヤーにバージョン番号まで含めること」
でした。

レイヤーのバージョン番号は指定なしだと最新バージョンを取得してくれるかな？と思っていたんですが、ドキュメントを確認してみると`version`まで必要だとのこと。

> Layers
A list of function layers to add to the function's execution environment. Specify each layer by its ARN, including the version.
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html

ということで追加して実行。修正後は以下。


```yaml
      Layers:
        - !Sub 'arn:aws:lambda:ap-northeast-1:${AWS::AccountId}:layer:example-libs:1'
```

上記の`:1`のようにバージョン番号を指定すると無事に作成できました。
勝手に最新版を取得してくれるわｋないんですね。以上、解決！
aptが使える中華ゲーム機

2025/1/20現在。

中華ゲーム機用のアプリ開発において、aptが使えるかどうかで開発の容易さが随分と変わってくるので調べている。

| 機種 | WiFi | OS | uname -a | SDL version | 備考 |
|:--|:---:|:--:|:--:|:--:|:--:|
| RG35XX H | 内蔵 | StockOS (Official) | TBA | TBA | [SSH Enabler](https://github.com/exdial/anbernic-apps)が必要 |
| RG351P | ドングル | [ArkOS](https://github.com/christianhaitian/arkos/wiki#download-links) | TBA |
| RG351MP | ドングル | [ArkOS](https://github.com/christianhaitian/arkos/wiki#download-links) | Linux rg351mp 4.4.189 #3 SMP Wed Oct 13 23:24:26 EDT 2021 aarch64 aarch64 aarch64 GNU/Linux | 2.0.10
| ODROID Go Advance | 内蔵 | Ubuntu (Official) | TBA |
| ODROID Go Advance  | 内蔵  | [ArkOS 2.0](https://github.com/christianhaitian/arkos/wiki#download-links) | Linux rgb10 4.4.189 #2 SMP Fri Mar 26 12:36:38 EDT 2021 aarch64 aarch64 aarch64 GNU/Linux | 2.0.10 |
| ODROID Go Super | ドングル | Ubuntu (Official) | TBA |
| ODROID Go Ultra | 内蔵 | Ubuntu (Official) | TBA | 

### 注意 ###
[ArkOSのHP](https://github.com/christianhaitian/arkos/wiki)に書いてあるが、ArkOSを焼くときは[Balena Etcher](https://etcher.balena.io)を使うとエラーになることがあるので、[ApplePi-Baker](https://www.tweaking4all.com/hardware/raspberry-pi/applepi-baker-v2/#DownloadApplePiBaker)を使う。

## apt使えなかったOS ##
- EmuELEC
- AmberELEC
- muOS
【Bubble】Googleフォントの利用方法

# はじめに
BubbleではテキストのフォントにGoogleフォントを利用することが可能です。本記事では、BubbleでGoogleフォントを導入する方法をまとめます。

# Googleフォントの導入方法
以下にGoogleフォントをBubbleアプリに導入する方法を記載します。

## 前提
フォントが変わっていることを確認するために、以下のようなテキストを記載したページを作成しています。
![Screenshot 2025-01-14 at 22.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/1b6881d1-73b8-193f-9e44-8b968680fea2.png)


## ①利用したいフォントを決める
Googleフォントのサイトにアクセスして、アプリで利用するフォントを決めます。

https://fonts.google.com/

本記事では、以下の「Kosugi Maru Static」を利用します。
![Screenshot 2025-01-14 at 21.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/c9078a95-774e-dbda-69cd-dd00551973de.png)

## ②フォントのコードを取得する
画面内の「<> Get Embeded code」をクリックし、遷移先の画面で「Embed code in the <head> of your html」のコードをコピーします。
![Screenshot 2025-01-14 at 22.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/4bf53955-3683-dc7e-2705-72e6fc60c08e.png)
![Screenshot 2025-01-14 at 22.02.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/11e884ad-85a9-5cfe-b86e-d7822de204a0.png)

## ③コピーしたコードをBubbleアプリのヘッダーにペーストする
editor画面の左のツールバーから[Setting]を開き、[SEO / metatags]タブを開きます。[SEO / metatags]タブ内下部の[Script/meta tags in header]に、②でコピーしたコードをペーストします。
![Screenshot 2025-01-14 at 22.13.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/79adec11-7ae8-79b6-efb4-3d9bd9b1724b.png)

## ④デフォルトフォントにGoogleフォントを適用する
editor画面の左のツールバーから[Styles]を開き、[Style variables]タブを開きます。[Style variables]タブ上部にある[App Font - Applied to all elements using App Font as their font family in styles.]にて、①で選択したフォントを選びます。
※フォントの選択欄が複数ある場合は、その中でGoolgeフォントを適用したいもののみフォント選択を変更します
![Screenshot 2025-01-20 at 21.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/81715122-16c0-5073-3554-791f9fc3c7bd.png)

## 完成イメージ
以上の操作を完了しeditor画面でテキストを確認すると、以下のようにフォントが変更されていることが分かります。（以下の画像では、操作前と比較して文字が丸みを帯びていることが分かります）
![Screenshot 2025-01-20 at 21.29.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975001/fce297ce-321f-930b-6ca1-0f0bed50ed27.png)

# 終わりに
本記事に関して不明点やうまく設定できない箇所などありましたらコメントください。
同一ブラウザでAWSマネジメントコンソールを切り替えかつ混乱しにくくする方法

<h2>概要</h2>
<b>開発環境を複数に分けてAWSを使用されている際、環境の切り替えが面倒だと思っていた皆さまに朗報です。</b>


2025/01/10にAWSマネジメントコンソールで1つのウェブブラウザにつき、


最大5つの異なるID(IAMユーザ)で、同時にサインイン可能となるマルチセッションサポートが利用可能になりました。


そこで、
新機能として追加された<a href="https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/multisession.html">マルチセッションサポート</a>とchromeの拡張機能である <a href="https://chromewebstore.google.com/detail/customize-aws-console-hea/cjpikjjajakahcpglopbmobcoiibcpcd">Customize AWS Console Header</a>を組み合わせて使うとかなり便利です。

（拡張ツールに関しては記載以外のツールの他にも同様の拡張ツールがあるため、自身の好みで選び使われると良いかと思います）

今回のマルチセッションサポートのみを使用すると自分がどの開発環境を触っていたかわからなくなるため、それを環境ごとの<b>アカウントIDを読み取り画面ヘッダーを色づけて防ぐ拡張機能</b>の組み合わせをおすすめしています。


<h2>マルチセッションサポートの追加手順</h2>
1.まず、アカウントログイン後、マネジメントコンソール上の右上のアカウントメニューからマルチセッションサポートをオンにしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946734/ba51f4c3-2004-eb3a-554c-1be016006ed7.png)

2.次に出てきたポップアップで「マルチセッションサポートをオンにする」を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946734/80b7d046-856c-90ec-212d-0b6c234e47df.png)

3.ホーム画面に切り替わるのでもう一度マネジメントコンソール上の右上のアカウントメニューを開き、「セッションを追加」を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946734/ed5b57ff-547a-5940-0e78-d48a78a57cce.png)

4.いつものAWSログイン画面が出てきますので追加したいアカウントの情報を記入し、ログインしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946734/c76bab05-8ed8-0cdf-52ac-2231894dcb83.png)

5.うまくいけば画像のようにもう一つのセッションが追加されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946734/73d52164-a828-837e-a842-4ccd0088fc9c.png)

<h2>拡張機能の追加手順</h2>

1.<a href="https://chromewebstore.google.com/detail/customize-aws-console-hea/cjpikjjajakahcpglopbmobcoiibcpcd">Customize AWS Console Header</a>にて拡張機能をChromeに追加して下さい

2.追加した後にchromeブラウザ右上の拡張機能のアイコンをクリックし、画像のようにオプションを選択して下さい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946734/1ea60fbb-97d8-65ea-8830-d1312a87c7ce.png)

3.画像のようにラベル（環境名）とアカウント名（AWSアカウントのID）とリージョンとヘッダ色を指定できるので、必要情報を記載してください
※複数ある場合は画面右上の水色ボタン「ルール追加」を押せば記載する列が１つ増えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946734/9ecf52a5-5c7b-e301-679b-a1f5dd819d83.png)

4.最後に画面右上の紺色のボタン「保存」を押せば終了です

<hr>
以上、２つの手順を実行していただければ、
同一ブラウザでAWSマネジメントコンソールを切り替え＆混乱しにくくなります。


最後までご覧いただきありがとうございました。
WSL のコアファイルってどこに作られるの？と探した件

## 結論

`%USERPROFILE%` の `AppData\Local\Temp\wsl-crashes` にありました。

## 環境

```
wsl --version
WSL バージョン: 2.3.26.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5620
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26100.2605
```

```
>wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-24.04 (既定)
```

## コアファイルのパターンを調べた

```
$ cat /proc/sys/kernel/core_pattern
|/wsl-capture-crash %t %E %p %s
```

なんだ、これ。

## 見つけた参考文献

- [Problems generating corefiles with WSL2 · Issue #11997 · microsoft/WSL](https://github.com/microsoft/WSL/issues/11997)

[この辺り](https://github.com/microsoft/WSL/issues/11997#issuecomment-2351356656)に

> In wsl-2.3.17 core dumps are stored in \AppData\Local\Temp\wsl-crashes folder under your Windows home directory.

って書いてあって、その通りの場所に見つかりました。

`file` で確認したところ、形式はちゃんと `ELF 64-bit LSB core file` になってました。

## 結論

`%USERPROFILE%` の `AppData\Local\Temp\wsl-crashes` にありました。

気が向いたら、加筆修正します(｀･ω･´)ゞ
1/18 tecHub（IT交流会）を原宿で開催しました！

![image_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/3256e1d3-8329-66e7-9cbe-ffd8603a4e02.png)

2025年、1発目のtecHubは原宿で開催しました！
今回は原宿駅目の前のオシャレなコワーキングスペースでした。

**目次▼**
<INS>[一年の計は元旦にあり](#一年の計は元旦にあり)</INS>
<INS>[2025年1月のtecHubを開催しました！](#2025年1月のtechubを開催しました)</INS>
<INS>[tecHubは毎月イベント開催しています！](#techubは毎月イベント開催しています)</INS>
<INS>[参加者の声](#参加者の声)</INS>
<INS>[Discord（tecHubコミュニティ）を運営しています](#discordtechubコミュニティを運営しています)</INS>
<INS>[次回の開催](#次回の開催)</INS>

<h3>一年の計は元旦にあり</h3>

「一年の計は元旦にあり」とよく聞きます。
昔からのことわざです。
簡単に言うと、”今年の計画は元旦に立てると上手くいく”という意味です。

**今年の目標は、立てましたか？**
2025年は始まってまだ3週間です。

**今からでも間に合うので、今年の目標を計画しましょう！**

<h3>2025年1月のtecHubを開催しました！</h3>

![image_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/3fbf20a4-169d-5bf9-ba2c-46ddcb38a546.png)

1/18にtecHubを原宿で開催しました。
参加者は70名となり、大盛況でした。

日付：1/18(土)　14:00～16:30
場所：LIFORK原宿
参加者：70名
内容：IT交流会

LIFORK原宿は、原宿駅目の前のキレイなレンタルスペースです！

<iframe width="100%" height="400" src="https://www.youtube.com/embed/N4qoVLJ3zls" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


<h3>tecHubは毎月イベント開催しています！</h3>

毎月60〜80名ほどの方が参加している人気のイベントです。

3ヶ月に1度：LT（ライトニングトーク）と懇親会の2部構成イベント
その他：リアルでIT交流会イベント

LT＋懇親会では、前半は「働き方」をテーマにLT・プレゼンテーションを、後半は懇親会で自由に交流の時間を設けています。
LTでは、外部スピーカーをゲストに招くこともあります。

懇親会にはスピーカーも参加し、発表内容をさらに掘り下げてディスカッションすることも可能です！
色々な方が自由に意見・情報交換をできる場となっています。

<h3>参加者の声</h3>

![image_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670233/59832648-9afb-9f83-f7f8-1cecbff19bb3.png)


今回も幅広い分野のIT関係者が集まり、会社員からフリーランス、法人化まで様々なエンジニアが参加していました。

交流会では参加者一人一人の実体験から来る仕事の話で盛り上がり、参考になる話を聞ける時間でした。
「今後のキャリアをどうするか？」考えている話も多かったです。
幅広い分野と様々なキャリアの話は、異なる視点や考え方を知る機会になっているようでした。

参加者からは、
**「参加してよかった」
「転職やフリーランス転向などキャリアアップを考えるきっかけになった」
「自分にとって身近な体験談を聞くことができた」**
などの声をいただいています。

tecHubは、今後も毎月イベントを開催していきます。
<b>他にもITエンジニアがより活躍し、理想のキャリアを切り拓けるように、コミュニティを運営しています。</b>

<h3>Discord（tecHubコミュニティ）を運営しています</h3>

■キャリアアップ
・キャリア相談／キャリアプランサポート
・スキルシート査定／レビュー
・転職・フリーランス転向サポート

■システム開発
・開発案件への参画
・スペシャリストに技術相談
・もくもく会などサブイベントへの参加

ぜひぜひDiscordから一緒に参加しましょう。
<h3>次回の開催</h3>

次回の開催は、以下の日程を予定しております。
日時：2/15(土)　14:00～17:00
場所：TIME SHARING 水道橋
内容：LT＋懇親会

https://tecworks.connpass.com/event/341099/
日本のIT業界の給与水準はどうですか？ 他国の学士号は日本で認められるか？ また、リモートワークは日本で普及しているのでしょうか？

こんにちは、いくつか日本のIT業界に関する質問があり、すでに日本で働いている方や詳しい方にお聞きしたいです。

日本のIT業界の給与水準はどうですか？
日本のIT業界は成長している分野も多いと聞いていますが、実際に日本でIT関連の仕事をしている場合、給与はどれくらいが一般的でしょうか？具体的な金額や体験談をお聞きできると嬉しいです。

他国の学士号は日本で認められるのでしょうか？
私は中国の大学でコンピュータサイエンス（または関連分野）の学士号を取得しましたが、IT関連の仕事を探す際、日本ではその学位は認められるのでしょうか？もし何か認証や追加の手続きが必要であれば、どのようなことをすれば良いか教えてください。

リモートワークは日本で流行っていますか？
日本は伝統的にオフィス勤務が主流と聞いていますが、IT業界においてリモートワークはどの程度普及しているのでしょうか？特に外国人の場合、リモートで働けるチャンスは多いのでしょうか？日本のリモートワーク事情についても教えていただけると助かります。

皆さんのご回答お待ちしています。よろしくお願いします！
Reactの Fast Refresh 機能

# Fast Refresh 機能
Fast Refreshは、React開発中にコードを編集した際に、状態を保持しつつ画面を素早く更新する仕組みであり、開発体験を向上させるためのいくつかの利点がある。


### 利点1. リアルタイムでの即時更新
Fast Refreshを使うと、Reactコンポーネントのコードを編集するたびに、画面が即座に更新されます。これにより、以下が可能になります

- 素早いフィードバック
コードを保存した直後に、変更内容がブラウザ上で確認できます。

- リロード不要
ページ全体のリロードを必要とせず、変更箇所だけが更新されるため、開発効率が大幅に向上します。


### 利点2. コンポーネントの状態を保持
ページ全体のリロードではなく、コンポーネント単位で更新が行われるため、コンポーネントの状態が保持されます。

```tsx

// フォームに入力したデータや、チェックボックスの選択状態などが保存されたまま、
// スタイルやロジックの修正結果を確認できます。
function Counter() {
  const [count, setCount] = React.useState(0);
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}
```


# Fast Refresh 機能が正常に動作しないコードがある
特定の要件を満たさないコードでは動作しない場合があります。

### 要件1. コンポーネント以外のエクスポートがある
定数や関数が同じファイルでエクスポートされている。

### 要件2. エクスポートの形が複雑
デフォルトエクスポートや名前付きエクスポートが混在している場合。
```typescript
// このようなファイル構成が問題となる可能性があります

// 定数やユーティリティ関数をエクスポート
export const MY_CONSTANT = 42;

export function helperFunction() {
  return 'Hello';
}

// Reactコンポーネントをエクスポート
export default function MyComponent() {
  return <div>My Component</div>;
}
```

# Fast Refresh機能が正常に機能しないときに発生するワーニング
`Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components (react-refresh/only-export-components)`

> 直訳
高速リフレッシュは、ファイルがコンポーネントのみをエクスポートする場合にのみ機能します。コンポーネント間で定数または関数を共有するには、新しいファイルを使用します (react-refresh/only-export-components)

# 解決方法

### 方法 1: コンポーネントとその他のロジックを分ける
Reactコンポーネント以外のエクスポート（定数や関数など）は別のファイルに分けることで解決できます。

```typescript:helper.ts
export const MY_CONSTANT = 42;

export function helperFunction() {
    return 'Hello';
}
```

```ts:MyComponent.tsx

import { MY_CONSTANT, helperFunction } from './helpers';

export default function MyComponent() {
    console.log(MY_CONSTANT, helperFunction());
    return <div>My Component</div>;
}
```

### 方法 2: エクスポートを統一
同じファイル内にどうしてもコンポーネントとその他のロジックを含める場合は、すべてを名前付きエクスポートに統一します。

:::note warn
ただし、この方法はファイル分割に比べてFast Refreshの恩恵を受けにくい場合があります。
:::


```ts
export const MY_CONSTANT = 42;

export function helperFunction() {
    return 'Hello';
}

// Reactコンポーネントも名前付きエクスポート
export function MyComponent() {
    return <div>My Component</div>;
}
```
TaskFactory.StartNewをWaitする場合に、うっかりTask<Task>を待つとすぐ通過してしまうので注意（気付きづらいうっかりミスの紹介）

# 概要

タイトル通りうっかりミスでTaskの完了を待てていなかったという話なんですが、見た目に分かりづらくかなり恐ろしいなと思ったので、紹介します。皆さん同じ落とし穴に気をつけてください。

# 最初に結論まとめ

次のコード、じつは`await task;`でTaskの完了を待てていません。

```csharp
async Task ThreadFunc(){
  await Task.Delay(TimeSpan.FromSeconds(10));
}

var task = Task.Factory.StartNew(ThreadFunc);
await task;
```

完了を待つには、Unwrap()メソッドを入れて、こうする必要があります。

```csharp
var task = Task.Factory.StartNew(ThreadFunc).Unwrap();

```

# 説明

次のコード、一見何の変哲も無いTask完了待ちのコードです。※1のスレッドが完了すると、Waitが終わって※2が実行されます。・・・という風に、なると思いますか？

```csharp
async Task ThreadFunc(){
  await Task.Delay(TimeSpan.FromSeconds(10));
  //※1
}

var task = Task.Factory.StartNew(ThreadFunc);

await task;
//※2
```

これがぱっと見では気付きづらい罠にはまっていまして、※1のスレッド完了を待たずに、すぐ※2が実行されてしまいます。コーディングミスなのですが、型が上手いこと噛み合ってしまってコンパイルエラーにもなりません。

ThreadFuncがTask func()ではなく、次のようにvoid func()の場合は、問題ありません。

```csharp
void ThreadFunc(){
  Thread.Sleep(TimeSpan.FromSeconds(10));
}

var task = Task.Factory.StartNew(ThreadFunc);

await task;
```

何が悪いのか、見えてきたでしょうか？

コード上は全く同じに見える、Task.Factory.StartNewのオーバーロードが曲者です。

StartNewメソッドに`Func<Task>`を渡すと、戻り値に`Task<Task>`が返ってきます。これは、「ThreadFuncがTaskを返してくるのを待つTask」です。（[メソッド定義](https://learn.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.taskfactory.startnew?view=net-9.0#system-threading-tasks-taskfactory-startnew-1(system-func((-0)))))

このtaskをawaitすると・・・本来待ちたかったTaskが返ってきた時点で、すぐに処理を抜けてしまいます。上のコードだと、`await task;`で、実は`Task task2 = await task;`のように戻り値が返ってきています。これを捨てているので、狙ったとおりに処理を待てずに先に抜けてしまうというわけです。

このような場合、`Task<Task>`の中身をちゃんと待てるように、一工夫してやる必要があります。次のように、Unwrap()すればOKです。

```csharp
async Task ThreadFunc(){
  await Task.Delay(TimeSpan.FromSeconds(10));
  //※1
}

var task = Task.Factory.StartNew(ThreadFunc).Unwrap();

await task;
//※2
```

このようにすると、`await task;`が待つTaskは、ちゃんとThreadFuncが返してきたTaskとなります。これで解決です！

ちなみにこの問題、Task.Runメソッドを使う場合は起きません。このケースに対応するオーバーロードがあるようです。（[メソッド定義](https://learn.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task.run?view=net-9.0#system-threading-tasks-task-run(system-func((system-threading-tasks-task))))）
TaskCreationOptionsを使いたい、スケジューラを分けたいなど、TaskFactory.StartNewを使う必要がある場合に注意すれば大丈夫です。

# まとめ

ぱっと見では同じようなコードでTaskの完了を待っているはずなのに、オーバーロードの罠にはまって完了を待てない、というなかなか厄介なバグを紹介しました。知っていればメソッド呼び出しを1つ加えて解決ですが、コンパイルエラーにもならないし、なかなか気付きづらい罠だと思います。同じようなコードを書いた時は、罠にはまらないようにこの話を思い出してみてください。