OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidのWidgetの再設定とバージョンの話

## 背景

AndroidのWidget開発をしている時に長押しして表示する項目を再設定を行おうとした。しかし、できない端末がありました。調査すると下記のようなことがあるみたいです。

## Androidのバージョンによって再設定できないものがある

[公式によると](https://developer.android.com/develop/ui/views/appwidgets/configuration?hl=ja#widget-config-options)下記のように述べています。

> **デフォルトでは、アプリ ウィジェット ホストは、ユーザーがウィジェットをホーム画面に追加した直後に、設定アクティビティを 1 回だけ起動します。ただし、デフォルトのウィジェット構成を指定して、ユーザーが既存のウィジェットを再構成できるようにしたり、ウィジェットの初期構成をスキップできるようにしたりするオプションを指定できます。

注:** これらのオプションは、Android 12（API レベル 31）以降でのみ使用できます。以前のバージョンの Android では指定できますが、システムは指定を無視してデフォルトの動作を行います。

ユーザーが既存のウィジェットを再構成できるようにするには、`appwidget-provider` の [`widgetFeatures`](https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo?hl=ja#widgetFeatures) 属性に [`reconfigurable`](https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo?hl=ja#WIDGET_FEATURE_RECONFIGURABLE) フラグを指定します。詳しくは、[`AppWidgetProviderInfo.xml` ファイルを宣言する](https://developer.android.com/guide/topics/appwidgets?hl=ja#AppWidgetProviderInfo)ガイドをご覧ください。例:
> 

要するにAndroid12以降ではこのWidgetの再設定を行えますが、これ以前はできないみたいです。

## Android12以前ものはどのようにすればいいのか

何かボタンのようなものを配置して、設定画面を開くようにするなどしてカスタムするのが適当なのでしょうか。

## 実装

Android12のものを想定しています。また、公式から説明やコードを拝借しています。

ユーザーが既存のウィジェットを再構成できるようにするには、`appwidget-provider` の [`widgetFeatures`](https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo?hl=ja#widgetFeatures) 属性に [`reconfigurable`](https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo?hl=ja#WIDGET_FEATURE_RECONFIGURABLE) フラグを指定します。詳しくは、[`AppWidgetProviderInfo.xml` ファイルを宣言する](https://developer.android.com/guide/topics/appwidgets?hl=ja#AppWidgetProviderInfo)ガイドをご覧ください。

```kotlin
<appwidget-provider
    android:configure="com.myapp.ExampleAppWidgetConfigurationActivity"
    android:widgetFeatures="reconfigurable">
</appwidget-provider>
```

## 参考記事

https://developer.android.com/develop/ui/views/appwidgets/configuration?hl=ja

https://developer.android.com/develop/ui/views/appwidgets?hl=ja#AppWidgetProviderInfo

https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo#WIDGET_FEATURE_CONFIGURATION_OPTIONAL

https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo#WIDGET_FEATURE_RECONFIGURABLE
NTPサーバの問い合わせ・構築についての備忘録

## 前置き
NTPサーバの構築についてまとめた備忘録です。
業務やプライベートにおけるPC使用時にクロックがどのように時刻合わせをしているのか、どのように構築しているのかまとめた備忘録です。

## NTPサーバへの問い合わせはどのようにやってるの？
PCを起動した際、NTP (Network Time Protocol) サーバーから時刻を取得する設定が有効になっている場合、システムクロックはNTPサーバーに問い合わせを行います。

#### Q.どこに問い合わせしているの？

通常、Windowsやその他のOSはデフォルトで特定のNTPサーバーにアクセスします。例えば、WindowsのデフォルトNTPサーバーは **time.windows.com** です。

この設定は手動で変更することもできます。企業や組織は、内部のNTPサーバーを指定する場合もあります。

#### Q. NTPサーバってどこにあるの？

デフォルトのNTPサーバーの実際の場所は利用者の地域や設定によって異なります。例えば、**time.windows.com** はマイクロソフトの提供するNTPサーバーであり、複数の地理的ロケーションに分散されています。

## NTPサーバはどうやって構築するの？

#### サーバの準備

NTPサーバを稼働させるサーバを用意します。
Linuxディストリビューション（例えば、UbuntuやCentOS）が一般的です。

#### NTPクライアントのインストール
サーバーにNTPクライアントをインストールします。
Ubuntuの場合は以下のコマンドを実行します
```
sudo apt-get update
sudo apt-get install ntp
```

#### NTPサーバーの設定
NTPクライアントの設定ファイル **/etc/ntp.conf** を編集し、NTPサーバーのアドレスを追加します。例えば下記のように設定します。
```
server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst
```

#### NTPサービスの起動
NTPサービスを起動し、自動起動を設定します
```
sudo systemctl start ntp
sudo systemctl enable ntp
```

#### NTPサーバーの動作確認
NTPサーバーが正しく動作しているか確認します。
以下のコマンドで現在のNTPサーバーの状態を確認できます
```
ntpq -p
```

以上で、NTPサーバの構築は終了です！
以下は蛇足です。

## インストールしたntpのPKGはどこから取得しているの？

**apt install ntp** を実行すると、ntpパッケージはUbuntuのパッケージリポジトリからインストールされます。具体的には、以下の手順が行われます：

#### パッケージリストの更新
最初にsudo apt updateを実行して、最新のパッケージリストを取得します。このリストは、指定されたリポジトリからダウンロードされます。

**パッケージのダウンロードとインストール**
sudo apt install ntpコマンドを実行すると、パッケージマネージャー（apt）がリポジトリからntpパッケージをダウンロードし、システムにインストールします。

Ubuntuのデフォルトリポジトリには、多くの一般的なパッケージが含まれています。
その中にntpパッケージも含まれています。
このリポジトリは、**Canonical社**が管理・提供しています。

もし特定のリポジトリからパッケージをインストールしたい場合や、カスタムリポジトリを追加したい場合は、**/etc/apt/sources.list**ファイルを編集してリポジトリを追加することも可能です。

お疲れ様でした！
以上でNTPに関する備忘録は終了です！
2025年冬休みの目標（2024/12/28-1/5)

# 目標
1. AZ-204に合格すること
1. ビジネス書を1冊読むこと
1. 合計20km走ること

# 達成結果
1. AZ-204に合格すること　→　完了（無事一発合格！）
1. ビジネス書を1冊読むこと　→　完了
1. 合計20km走ること　→　完了
Reactのサーバーサイドレンダリングについて（Next.js）

最近会社でReactを使用するプロジェクトに配属されたため、勉強も兼ねてアウトプットしていこうと思います。

まだ駆け出しということもありかなり初心者向けの記事になりますが、ご了承ください。

Reactはクライアントサイド（ブラウザ上）で実行しますが、Webアプリケーションを作成するとなると必ずサーバーサイドの構築も必須となることがほとんどです。

サーバーサイドの構築が必須となる理由は具体的に以下の2つです。
## サーバーサイドの構築が必須となる理由
### 初期表示のスピードを向上させるため
サーバーサイドレンダリング（SSR）を利用することで、サーバー側でHTMLを生成し、完成した状態のHTMLをクライアントに送信することができます。

これによって、初期表示が高速化され、ユーザーがページをすぐに確認することができます。

### SEOの最適化のため
SEOで評価されたいテキストやリンクといった要素は、サーバーサイドレンダリングで出力することが推奨されます。

これは、クライアントサイドレンダリングではGoogleがJavaScriptを完全に解釈できず、情報を正確に認識できない可能性がある一方で、サーバーサイドレンダリングでは情報が直接HTMLとして認識されるため、Googleが正確に読み取りやすくなるためです。

## クライアントとサーバーの違い
クライアントとサーバーでは利用できる機能や動作環境が異なるため、それに合わせたコードを書く必要があります。

クライアントサイド（ブラウザ）では、<b>document</b>や<b>window</b>などのブラウザ特有のオブジェクトを操作できますが、サーバーサイド（Node.jsなど）ではそれらは存在しません。

一方、サーバーサイドでは、fsモジュール（ファイルシステム操作）やデータベースアクセスといったAPIが使えますが、クライアント側ではこれらを直接利用することはできません。

## Reactで使用できるサーバーサイドレンダリングのツール
サーバーサイドレンダリングを実現するためのツールやフレームワークは多数存在します。

その中でも特に人気があり、Reactと組み合わせて使用されるものをいくつか紹介します。

### Next.js
Nextは、Zeit社によって考案されたオープンソースの技術で、Nextを使うことでReactのアプリケーションを簡単にサーバー上で実行することができます。

Nextはルーティングや静的ページのコンパイル、サーバーレスなAPIエンドポイントの作成など様々な機能を使用することができます。

以下にNext.jsでできることを具体的に書き出してみます。

#### 静的サイト生成
Next.jsは、ビルド時にページを事前に生成し、静的ファイルとしてホスティングする機能があります。これは、ブログや商品ページのような変更頻度が低いページに適しており、ページのパフォーマンスが向上します。

#### ハイブリッドレンダリング
SSRとSSGの両方をプロジェクト内で併用することが可能です。例えば、動的なダッシュボードはSSRで生成し、ブログ記事や商品一覧はSSGで生成する、といった柔軟な構成も可能です。

#### ミドルウェアとAPIルート
Next.jsには、APIエンドポイントを作成するためのサーバーレスAPIルート機能があり、追加のバックエンドフレームワークを使用せずに、簡単にAPIを構築できます。

また、リクエストの処理をカスタマイズするためのミドルウェア機能もサポートしています。

```pages/api/hello.js
export default function handler(req, res) {
    res.status(200).json({ message: 'Hello, API!' });
}
```
ブラウザでhttp://localhost:3000/api/hello にアクセスすると、以下のJSONが返されます
```json
{ "message": "Hello, API!" }
```
ミドルウェアの例
```middleware.js
import { NextResponse } from 'next/server';

export function middleware(req) {
    const url = req.nextUrl.clone();
    // ユーザーが認証されていない場合、ログインページにリダイレクト
    if (!req.cookies.auth) {
        url.pathname = '/login';
        return NextResponse.redirect(url);
    }
    return NextResponse.next();
}
```
ユーザーが認証済みでない場合、ログインページ(/login)にリダイレクトされます。

#### 画像最適化
Next.jsは、画像の遅延読み込みやサイズ最適化を自動で行うnext/imageコンポーネントを提供しています。これにより、画像のパフォーマンスの向上が図れます。

#### 開発者体験の向上
Next.jsは、ホットリロード、TypeScriptのサポート、ESLintの統合など、開発者の生産性を高める機能を標準で提供します。これにより、モダンな開発環境を簡単に構築できます。

#### インターナショナライゼーション（i18n）
多言語対応の機能を持ち、アプリケーション内で簡単にロケール（地域設定）に基づいたページを切り替えることができます。

#### デプロイの簡易化
Next.jsはVercel（Next.jsを開発した会社）との統合がスムーズで、簡単にアプリケーションをデプロイできます。また、グローバルCDNによる高速な配信も可能です。
ClaudeのArtifactで使ったReactをローカルで動かすには？

## はじめに

ClaudeのArtifactで生成したReactコードをローカルで動かす方法を説明します。

DevContainerで開発をするためこのDockerfileを使ってコンテナを作成してください。
```Dockerfile
FROM node:20-bullseye

# 開発用ツールのインストール
RUN apt-get update && apt-get install -y \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*

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

# Node.jsの開発ツールをグローバルにインストール
RUN npm install -g \
    create-react-app \
    typescript \
    eslint \
    prettier \
    nodemon

# 開発用パッケージをインストール
RUN npm install --save-dev \
    eslint \
    prettier \
    typescript \
    @types/react \
    @types/react-dom

# プロジェクト作成用の作業ディレクトリを作成
RUN mkdir -p /app

# 作業ディレクトリに移動
WORKDIR /app

# コンテナ起動時のデフォルトコマンド
CMD ["/bin/bash"]
```

## 基本的な実装手順

1. Viteプロジェクトの作成：
```bash
npm create vite@latest your-project-name -- --template react
cd your-project-name
npm install
```

2. 必要なパッケージのインストール：
```bash
npm install lucide-react@0.263.1 @tailwindcss/typography tailwindcss postcss autoprefixer
```

3. `src/App.jsx`の内容をすべて削除し、Artifactで生成されたコードをそのまま貼り付け

4. 開発サーバーの起動：
```bash
npm run dev
```

## 複数ページの実装方法

複数のページを作成する場合は、パス（例：/dashboard、/analytics）を分けて実装します。これにより、CloudFrontなどのCDNサービスを使用して各ページを独立して配信できます。

## 注意点
- ページごとに独立したHTMLファイルとして実装することを推奨

## メリット
- シンプルな実装
- CDNによる効率的な配信が可能
- 各ページが完全に独立して動作
- 個別のカスタマイズが容易
PowerQueryなどでの「列のピボット」を理解する

こんにちは。
私は現在「Microsoft Certified: Power BI Data Analyst Associate」の勉強中なのですが、
その中で、今までなんとなく使っていた「列のピボット」についてちゃんと理解していなかったな～と感じたので、この機会に調べて整理してみようと思います。
かなり基本的な内容で、「列のピボット」を直感的に理解できる方には不要な記事なので、読み飛ばしてください。

## 「列のピボット」とは

縦持ちデータを横持データにすることです。
横持データは一見データ分析に使いにくいですが、
「売上」「予算」等のデータが縦持ちになっていた場合などは、
横持データにした方が分析しやすいです。

Microsoft公式から引用しますが、「列のピボット」を図解するとこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/3091619c-d262-1c2e-745d-6ae44eac1318.png)

## 「列のピボット」のやり方

やり方はとても簡単です。
まず、各行の値を列にしたい列を選択して、「列のピボット」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/03a59cde-5d8d-2fe5-208a-16a651429cea.png)

するとピボットの設定画面が出るので、値にしたい列と集計方法を選択して「OK」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/12a41fb2-ac9e-c2c0-cb18-de0a50e35bce.png)

これで完成です。


## 何が「値」に来るのか
ピボット後の各列の値がどこから来ているのか分かり辛かったため、図解します。
先ほどの公式の図を用いると、こうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/e9689063-ec65-ed41-5230-2051f4674a6d.png)

なんてことはない、「値」に指定した列の、ピボットする列の各行に対応する値が出てきているだけです。

## 集計とは何か
私はここで大きな勘違いをしていたのですが、
**集計は値に指定した列を除いて重複がないと何で集計しても一緒**です。

例えば、このような表ですと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/476842a5-d013-07f1-3c9f-6e97c9613256.png)

主キーは、{カテゴリ、国、年}となりこの3つの組み合わせで重複はありません。
これを「国」でピボットするとこのようになり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/f589f0ee-5784-f55e-8440-97ad83aa0ab7.png)
この際の値を作るのに何かが集計されることはありません。
そのため、集計で「集計しない」を選んでも全く同じです。

ところが、集計されるのは以下のような場合です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/84d087cb-c7aa-646b-0fb3-4de4fdcc764b.png)
このように、同じカテゴリ、同じ国、同じ年なのに売上が違う場合があります。
この場合、例えば家具、アメリカ2019年だと、売上の「321」「547」が合計されて、「868」として表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/e80d25f1-cb48-3435-680a-923165fb8fcf.png)

ここで集計を「最小値」にすると、「321」と「547」の小さい方なので、「321」
となります。

これが「列のピボット」における集計です。

## おわりに
私はTableau Prepでの加工に慣れているので、あまり理解しないまま適当にピボット処理していました。
Prepにも「集計」欄があったので、あまり考えずに列を突っ込んでいたのですが、
よくよく考えると集計と書いてあっても集計されないことの方が多いということを今回調べて分かりました。
あやふやに理解しているとダメですね。
試験合格へ向けて、基礎をしっかり理解していこうと思います。

最後まで読んでくださりありがとうございました。

Rieko
RustでModel Context Protocol入門

この記事は[RustでModel Context Protocolを理解する - 仕様解析の実践と学び](https://tech.jugoya.ai/blog/understanding-mcp-with-rust)の内容を、より実践的な形で再構成したものです。

## この記事で学べること

- Model Context Protocol (MCP)の基本的な仕組み
- RustでMCPの型定義を実装する方法
- AIアプリケーションの統合における実践的なアプローチ

## Model Context Protocolとは

Model Context Protocol（MCP）は、AIアプリケーションと外部システム（データベースやAPIなど）を簡単に連携させるための新しい標準プロトコルです。

例えば、あなたが作っているAIアプリケーションで以下のようなことがしたいとします：

- データベースからデータを取得して分析
- 外部APIを呼び出してデータを処理
- ファイルシステムにアクセスしてファイルを操作

これまでは、それぞれのシステムごとに個別の連携方法を実装する必要がありました。MCPを使えば、統一された方法でこれらの機能を実現できます。

## MCPの3つの重要な機能

MCPには3つの主要な機能（プリミティブ）があります：

1. **Prompts（指示・テンプレート）**
   - AIへの指示やテンプレートを提供
   - 例：定型的な質問や応答のパターン

2. **Resources（データ）**
   - 構造化されたデータを共有
   - 例：データベースの内容、ファイルの中身

3. **Tools（実行機能）**
   - 実際に何かを実行する機能を提供
   - 例：APIの呼び出し、ファイルの書き込み

## Rustでの実装例

https://github.com/yonaka15/mcp-schema

では、実際にRustでMCPの基本的な型を定義してみましょう。

```rust
use serde::{Deserialize, Serialize};

// MCPのバージョン定義
pub const PROTOCOL_VERSION: &str = "0.1.0";

// 基本的なメッセージ構造
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message<T> {
    pub jsonrpc: String,
    pub id: Option<String>,
    pub method: String,
    pub params: T,
}

// Toolsプリミティブの例
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Tool {
    pub name: String,
    pub description: String,
    pub parameters: serde_json::Value,
}

// Resourcesプリミティブの例
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Resource {
    pub id: String,
    pub content_type: String,
    pub data: serde_json::Value,
}
```

この実装のポイントは：

1. `serde`を使ってJSON形式との相互変換を実現
2. ジェネリクスを活用して柔軟な型定義を実現
3. 必要な属性を`derive`マクロで自動実装

## 実装して分かったこと

MCPを実際にRustで実装してみて、以下のような発見がありました：

1. **型安全性の重要性**
   - Rustの型システムを活用することで、プロトコルの制約を型レベルで表現できる
   - これにより実行時のエラーを大幅に減らせる

2. **エラー処理の明確化**
   - プロトコルレベルのエラーとアプリケーションレベルのエラーを区別できる
   - `Result`型を使って適切にエラーをハンドリング

3. **拡張性の確保**
   - `serde_json::Value`を使うことで、将来的な拡張に対応できる
   - メタデータフィールドを用意することで後方互換性を維持

## まとめ

MCPは、AIアプリケーションと外部システムを統合するための新しい標準として注目されています。Rustの型システムを活用することで、型安全で保守性の高い実装が可能です。

実装の詳細やより詳しい解説は、[元記事](https://tech.jugoya.ai/blog/understanding-mcp-with-rust)をご参照ください。

## 参考リンク

- [MCP公式仕様](https://spec.modelcontextprotocol.io/specification/)
- [mcp-schema（Rust実装例）](https://github.com/yonaka15/mcp-schema)

---
※この記事で使用しているコード例は、理解を助けるための簡略化されたものです。実際の実装では、より詳細なエラー処理やバリデーションが必要になります。
ArgoCDのHTTPSを無効化する

# 概要
 ArgoCDをリバースプロキシ構成で、利用する際にはTLSを通信を無効化したい場合がある。ArgoCDを久しぶりにインストールを実施したら、過去の設定方法が使えなかったので、対象方法を残しておく。

## 対処方法
### v2.1.0以前のバージョンの場合
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-server
spec:
  template:
    spec:
      containers:
        - name: argocd-server
          command:
            - argocd-server
            - --staticassets
            - /shared/app
            - --insecure (ここの行を追加)
```

### v2.1.0以上のバージョンの場合
#### ConfigMapの修正
```bash
kubectl edit configmap argocd-cmd-params-cm
```

```yaml
apiVersion: v1
kind: ConfigMap
~省略~
data:
  server.insecure: "true" (ここの行を追加)
```

#### ArgoCD serverの再起動
```bash
kubectl rollout restart deployment argocd-server
```

# 参考
- https://github.com/argoproj/argo-cd/discussions/8520
Salesforce_Listビューで選択したレコードIDを渡す方法(classic)


Listビューで選択したレコードIDを渡す方法だよ！

classic環境のListビューからIDを取得するやり方を、Listビューボタンのon JavaScriptで作成してみてね！！


```JavaScript.btn
{!REQUIRESCRIPT("/soap/ajax/59.0/connection.js")}
{!REQUIRESCRIPT("/soap/ajax/59.0/apex.js")}

var objApiName = "Account";
var records = {!GETRECORDIDS($ObjectType.Account)};

if (!records || records.length === 0) {
   alert("レコードが選択されていません。");
} else {
   alert(
       "■ 選択されたレコードID: " + records.join(", ") + "\n" +
       "■ オブジェクトAPI名: " + objApiName
   );
}
```

<h1>解説</h1>
{!GETRECORDIDS(...)} を実行している時点で、Salesforceは自動的に「現在チェックボックスに選択されたレコードID」を JavaScript配列として注入してくれるよ！


<h1>ちなみに・・・</h1>

```
var objApiName = "Account";
var records = {!GETRECORDIDS($ObctType.Account)};
```
ここだけ、Object API名をハードコードしてね！
どうやら取得する方法はないみたいで、静的にするしかないみたい・・・残念！

<br/>
こうしたらAccout＝001のようなキー・プレフィックス(先頭3桁)は取得できるけどね～！

```
var objApiName = window.location.pathname.split('/')[1]
```

<br/><br/>
レコードID取得できれば、色々できるね！
Lightningでの実装は、JavaScriptボタン作成出来ないから工夫が必要だよ！
その場合、一つ工夫が必要なんだ！
反響次第で需要があれば公開するよ！その方法はまた後日ね！！
【ChatGPT】自分の強みがわからない人へのPromptを紹介します。


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

　今回は、自分の強みがわからない人へのPromptを紹介します。森岡毅流だそうです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　SoraのPlus/Teamユーザーへの
　　クリスマスプレゼント🎁は
　　　現在も有効ですよ😸

　どんどん動画生成しましょうね。
***
　さっそく、【本題】です。

　今回は、
　　自分の強みがわからない人への
　　　Promptを紹介します。

　森岡毅さんという方を
　　ご存知でしょうか？

　森岡毅さんは、
　　日本を代表するマーケターであり、
　　　USJのV字回復を成功させたことで
　　　　知られています。

　今回は、
　　あるるさんのポストに
　　　紹介されていましたので
　　　　Promptをご紹介。
　　　　　[あるるさんポスト](https://x.com/chatgptair/status/1836888026674516001?t=0zxn9s4M2kMdWGz0luBouQ&s=19)

```Text:森岡毅流自己分析Prompt
あなたは一流のコーチです。 自分の強みを知るために森岡毅流の自己分析を質問形式で一緒に手伝ってください。
```

　とはいえ、
　　このPromptでは
　　　質問項目の説明が
　　　　羅列される程度で
　　　　　質疑応答になりません。

　そこで
　　質疑応答形式になるように
　　　最後に追記します。

```Text:森岡毅流自己分析（改）Prompt
あなたは一流のコーチです。 自分の強みを知るために森岡毅流の自己分析を質問形式で一緒に手伝ってください。
なお、質疑応答は１問ずつお願いします。
```

　これで質疑応答が
　　はじまります。

　質問は続きます。
　　ゆっくり考えながら
　　　回答していってください。

　そろそろ
　　自己分析をして欲しいな、と
　　　思ったら、次のPromptで
　　　　出力してもらってください。

```Text:回答から自己分析Prompt
ここまでの回答で、私の分析を行なってください。
```

　また、助言が欲しければ、
　　次のPromptをどうぞ。

```Text:自己分析から助言Prompt
この自己分析から、助言はありますか？
```

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

　今回は、ここまで。
情報落ち

# 仮数部の計算結果が反映されない
>絶対値の非常に大きな数と小さな数の加減算を行った時、指数部が小さい方の仮数部の下位部分が計算に反映されないために発生する誤差

### 情報落ちの過程　小さい方が右シフトで消える
>指数部の値が異なる二つの数の加減法では、`指数部を大きい方に揃えてから演算`する。そのため、`指数部の小さい方の数の仮数部の値が右にシフトされ、情報落ちが発生する。

https://gihyo.jp/book/2023/978-4-297-13865-3

# 整数部を0になるまで繰り下げてそれぞれの値を設定する
>浮動小数点数は、1つの小数点数を「符号部」「仮数部」「指数部」という3つの整数の情報で表すものです。
どれも整数なので、1と0だけで表せます。

>例として、－101.011という2進数の小数点数を3つの整数で表してみましょう。

>整数部が0で小数点以下1桁目が1になるように桁をずらしてください。
－101.011＝－0.101011×2^3になります。

>－0.101011×2^3において、`－が符号部`、`小数点以下の101011が仮数部`、`2^3の3が指数部`です。
符号部は、プラスを0とし、マイナスを1とすれば、1と0だけの整数です。
指数部の3は、2進数で表すと11なので、これも1と0だけの整数です。
仮数部の101011は、これも1と0だけの整数です。
この形式にするために、－101.011の小数点の位置をずらしたのです。
浮動小数点数の「浮動」は、小数点の位置をずらすことを意味しています。

>－101.011という小数点数を、`符号部0`、`仮数部101011`、`指数部11`という3つの整数の情報で表せました。
符号部、仮数部、指数部を、それぞれ何ビットで表し、どのような順に並べるかを取り決めれば、1つの浮動小数点数になります。
例えば、`符号部1ビット`、`仮数部11ビット`、`指数部4ビット`で、`符号部`、`指数部`、`仮数部`の順に並べて、全体で16ビットのデータにするなら、`[0][0011][10101100000]`という浮動小数点数になります。
ここでは、わかりやすいように [ ] で区切っていますが、実際には、`0001110101100000`という1つのデータです。

https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kind_basic_theory/floating-point/#:~:text=%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E3%81%AF,%E3%81%A4%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A7%E3%81%99%E3%80%82

* 多分`-`だから符号部は1だと思う

### 感想
数学難しいな
中心極限定理のシミュレーション

# はじめに
1回の試行において、コインの表と裏が出る確率はちょうどどちらも$1/2$である。そのような試行を100回や1000回、10000回と繰り返し行った場合、表が1回の試行で平均何回でるかを調査したとする。おそらく、1回の試行での平均値は。0.5回程度に落ち着き、その分布は正規分布になると考えられる。これは、中心極限定理と呼ばれ、あらゆるものの確率分布に正規分布が現れる所以である。そこで、今回はコイントスと等価な試行をプログラム上で繰り返した場合、それらの標本平均の確率分布はどのようになるのかを調査する。

![正規分布と標本調査3000_100000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/7d84a0dc-b177-8440-8b94-da31ae86c64c.png)



# 前提
PythonのRandomモジュールを用いて、0から1までの一様乱数を生成するという試行を繰り返し行う。
一回の試行において確率変数$X$は$0\le X \le 1$とする。

この試行を$N$回行ったときの平均を以下のように定義する。

```math
\bar{X}=\frac{1}{N} \sum_{k=1}^{N}X_k  
```
# プログラム

以下のようなプログラムを書いた。

``` python gauss_ave.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
import random
#試行の繰り返し回数N
N=30000
X_m=[]
#標本数m
m=1000
for p in range(m):
  x=0
  for i in range(N):
    x=x+random.random()/N
  X_m.append(x)
#ヒストグラムの描画 
plt.hist(X_m,bins=50)
plt.savefig("正規分布と標本調査"+str(N)+"_"+str(m)+".png")
plt.show()
```

# 結果

標本数が多い場合は極めて正規分布に漸近することが分かった。
ただし、$N=3000$とした。


## m=10

![正規分布と標本調査3000_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/6e66a072-3b44-c712-4a3d-481e9c769191.png)

正規分布の傾向はみれない

## m=100
![正規分布と標本調査3000_100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/9c546095-f573-ba33-ff94-2ed23f38ee58.png)

すこし、正規分布ぽくなってきた。

 ## m=1000

![正規分布と標本調査3000_1000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/43e4675a-bdd9-9374-e55d-8fdf17bc5c3b.png)

かなり、正規分布に似かよってきた。

## m=10000

![正規分布と標本調査3000_100000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/feea38e3-621a-989f-04d6-085be991e8d2.png)

かなり、正規分布ぽくなってきた。

# まとめ
今回は、中心極限定理の性質について一様乱数の試行を繰り返し行うことによって図示するという試みを行った。全く傾向が正規分布に似ていない分布でもそれらの試行が積み重なれば必ず正規分布が現れるというのは面白いと感じた。


# 参考文献

https://avilen.co.jp/personal/knowledge-article/central-limit-theorem/
Kotlin Koans やってみた 1

# Introduction
## Named arguments
### 問題
joinOptions() 関数が、2つの引数のみを指定して、リストを JSON 形式（例えば、[a, b, c]）で返すようにします。

デフォルト引数と名前付き引数は、オーバーロードの数を最小限に抑え、関数呼び出しの可読性を向上させるのに役立ちます。
ライブラリ関数 joinToString は、パラメータにデフォルト値が設定されています:

```kotlin
fun joinToString(
    separator: String = ", ",
    prefix: String = "",
    postfix: String = "",
    /* ... */
): String
```
この関数は、文字列のコレクションに対して呼び出すことができます。

```kotlin
fun joinOptions(options: Collection<String>) =
        options.joinToString(TODO())
```

### 解答
```kotlin
fun joinOptions(options: Collection<String>) =
        options.joinToString(prefix = "[", postfix = "]")
```

### 解説
`.joinToString()` は、すべての要素を指定された区切り文字で結合し、指定された接頭辞や接尾辞があればそれを使用して文字列を作成してくれるもの。
`.joinToString()` は引数に、`separator`、`prefix`、`postfix`、`limit`、`truncated`、`transform` を渡すことができる。

**`separator(区切り文字)`:**
要素の間に挿入する文字列を指定する
デフォルトは `, `（カンマとスペース）

**`prefix(接頭辞)`:**
結果の文字列の最初に付ける文字列を指定する
デフォルトは `""` (空文字)

**`postfix(接尾辞)`:**
結果の文字列の最後に付ける文字列を指定する
デフォルトは `""` (空文字)

**`limit(制限)`:**
結果に含める要素の数を制限する
`limit` に指定した数だけ要素が出力され、それを超える部分は省略される
デフォルトは -1 で、これは制限なしを意味する

**`truncated(省略文字列)`:**
`limit` を指定して要素数が制限される場合に、省略された部分を表す文字列を指定する
デフォルトは `...`

**`transform(変換関数)`:**
各要素に対して適用する変換関数を指定する
`transform` は各要素を `CharSequence?` に変換する関数で、デフォルトは null（変換なし）
この引数を使うことで、要素を文字列に変換したり、フォーマットを変更することができる

# おわりに
Kotlin にも JavaScript みたいな組み込み関数が用意されているんだ・・・。
でも JavaScript で用意されている `.join()` より kotlin の方が高機能な気がする。

---

[← 前回の記事](https://qiita.com/b-yuko/items/3907987008e48f454cdf)　|　[次回の記事 →](https://qiita.com/b-yuko/items/a3f93b5410be7576c457)
nRF BLE Sniffer + Wiresharkで、Central-Peripheral間のBLEパケットをキャプチャする

## この記事は？
地味にやり方がわからず躓いた、nRFのBLE SnifferでCentral-Peripheral間の通信をキャプチャする方法を書きます。  

## 環境

@KentaHarada様による以下記事の手順で、XIAO-nRF52840のBLE Sniffer化、Wiresharkのセットアップが実施できます。（ありがとうございます）

https://qiita.com/KentaHarada/items/3e1612116ec45462a837


私は以下環境で検証しました。

* PC:
    * OS: Windows11 Home
    * Wireshark: v4.4.2
* Sniffer:
    * ハード: seeed XIAO-nrf52840 ※1
    * ソフト: nRF Sniffer for Bluetooth LE v4.1.1 ※2

※1: おそらくnordic製のSnifferでも同様に実施できますが、持っていないため未検証です。
※2: 上記記事の手順に従い、uf2形式に変換して書き込みました。

## 手順
### Advertisement Packetのキャプチャ
SnifferをPCに接続してWiresharkを起動し、キャプチャ対象のインタフェースとしてnRF Sniffer for Bluetooth LEを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166634/26b8a5f2-1db9-15e6-171c-e67de26eca0a.png)

すると、SnifferがキャプチャしたAdvertisement Packetが次々と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166634/ac5871d3-db79-2175-546b-f554e4b1804a.png)

#### 補足：電波強度に応じたフィルタリング
このままでもキャプチャは実施できるのですが、たいていの場合キャプチャされるパケットが多くて見づらいので、フィルタをかけてやった方がいいです。

キャプチャしたパケットのうち、電波強度が一定以上のもののみ表示させるには、Wireshark上部のフィルタ入力欄に以下のように入れます。

```
nordic_ble.rssi >= [電波強度]
```
閾値の電波強度は環境に応じて設定してください。（感覚的には-35から-45くらいで設定するとうまくいきます。）

その他使用できるフィルタは下記サイトに例示されています。

https://novelbits.io/nordic-ble-sniffer-guide-using-nrf52840-wireshark/


### Connection後のパケットのキャプチャ

初期設定のままですと、以下のように接続要求（`CONNECT_IND`）パケットは表示されますが、それ以降のCentral-Peripheral間の通信は表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166634/77c9e5f7-7a11-885d-1467-c8130aac5a39.png)

接続要求以降のパケットをキャプチャするには、Wireshark上部のDevice Listで**キャプチャ対象のデバイスを選択している**ことと、**デバイスを選択した状態で機器同士の接続が確立される**ことが必要です。

nordicのBLE Snifferは、Advertisementパケットのみをキャプチャするモード（デフォルト）と、特定のデバイスのCentral-Peripheral間の通信パケットをキャプチャするモードの、2つの動作モードがあります。
適切な操作をしない場合、デフォルトのモードのまま動作するため、コネクション確立後のパケットは**キャプチャされません。**

参考：  

https://docs.nordicsemi.com/bundle/nrfutil/page/nrfutil-ble-sniffer/guides/sniffer_usage.html

このため、まずキャプチャしたいCentralとPeripheralが**接続されていない**状態で、Device Listのボックスから対象の機器（主にはAdvertiseしているPeripheral）を選択し、（画像だとデバイス名が文字化けしてますが・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166634/cd40c92f-fe72-94d9-7b2d-6bde71b6ec09.png)

そのあとにCentral-Peripheral間の接続確立操作をしてください。  
Wiresharkが接続要求（`CONNECT_IND`）パケットをキャプチャすると、自動的にCentral-Peripheral間の通信をキャプチャするモードに切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166634/a42a04b9-4879-6918-4367-72c41e85d8b4.png)

`CONNECT_IND`のパケットをSnifferが取り逃がしてしまった場合はモードが切り替わらないので、もし正しくキャプチャされない場合はいったん接続を切断し、再接続するところからやり直してください。

## 参考

https://houwa-js.co.jp/2020/09/20200908/

https://devzone.nordicsemi.com/f/nordic-q-a/8635/nrf-sniffer-doesn-t-capture-any-packages-after-the-connection-is-established

https://stackoverflow.com/questions/77731055/can-nrf-sniffer-for-ble-capture-packets-in-the-connection-sent-between-the-two-d

https://docs.nordicsemi.com/bundle/nrfutil/page/nrfutil-ble-sniffer/guides/sniffer_usage.html
24/1/2 読書記録 ~土台からしっかり学ぶソフトウェアテストのセオリー~

# 書籍
[土台からしっかり学ぶソフトウェアテストのセオリー](https://amzn.asia/d/hvYdYEd)

# 第3章 テスト設計のセオリー

## 3-1. テストを設計するということ

### 用語集 :pencil: 

 - UTP（UML Testing Profile）
     - UMLをテストへと拡張したもの
 - UML(Unified Modeling Language)
     - システムの振る舞い・構造の図
     - 統一モデリング言語（標準規格として作られた図の記法）

### 気付き / 学び:writing_hand_tone5: 

#### テスト設計の流れは？

1. テスト条件から、ハイレベルテストケースを抽出
2. テストケースの作り方と使い方についてテストタイプや環境等を検討
3. テストタイプに応じたテストケースの構造を決定
4. テスト技法を活用してローレベルテストケースを作成

## 3-2. テスト設計

### 用語集 :pencil: 

- ハイレベルテストケース
    - テストケースの中で、期待結果や入力情報が抽象的であるもの
- ローレベルテストケース
    - テストケースの中で、期待結果や入力情報が具体的であるもの
- テストタイプ
    - 機能テスト or 非機能テスト（性能テスト、負荷テスト、信頼テスト...）

### 気付き / 学び:writing_hand_tone5: 

#### ハイレベルテストケースの関連を洗い出すのはなぜ？

- テストケースの再利用や実行順序が検討しやすくなる

#### ハイレベルテストケースの関連とは？
- 「関連」には「依存」「細分化」がある
    - 依存：テスト2（非機能要件）はテスト1（機能要件）がPassしてから実行する
    - 細分化：テスト3はテスト1とテスト2を詳細化したもの

## Chap3. 感想 

ハイレベルテストケースからローレベルテストケースに落とし込む方法が紹介されている。
実務での適用等は考え難いテーマだった。
しかし、設計のイメージが全くない人にとっては、具体例も丁寧に書かれているため、分かりやすい。
ゲームボーイ RGBDS 開発メモ 第9回 チュートリアルを読んでいく (Input(2))


[https://gbdev.io/gb-asm-tutorial/part2/input.html](https://gbdev.io/gb-asm-tutorial/part2/input.html)

### 十字キーで動かせるように

```
Main:
    ld a, [rLY]
    cp 144
    jp nc, Main
WaitVBlank2:
    ld a, [rLY]
    cp 144
    jp c, WaitVBlank2

    ; Check the current keys every frame and move left or right.
    call UpdateKeys

    ; First, check if the left button is pressed.
CheckLeft:
    ld a, [wCurKeys]
    and a, PADF_LEFT
    jp z, CheckRight
Left:
    ; Move the paddle one pixel to the left.
    ld a, [_OAMRAM + 1]
    dec a
    ; If we've already hit the edge of the playfield, don't move.
    cp a, 15
    jp z, Main
    ld [_OAMRAM + 1], a
    jp Main

; Then check the right button.
CheckRight:
    ld a, [wCurKeys]
    and a, PADF_RIGHT
    jp z, Main
Right:
    ; Move the paddle one pixel to the right.
    ld a, [_OAMRAM + 1]
    inc a
    ; If we've already hit the edge of the playfield, don't move.
    cp a, 105
    jp z, Main
    ld [_OAMRAM + 1], a
    jp Main

```
すみません、入力キーに応じてオブジェクトの座標を変更する処理がまだでしたので
メインループが上のようになりました。

前回、定義しました UpdateKeys でキーの状態を取得します。wCurKeys に
押したキーが入っているので、オブジェクトのX座標を変更します。

左端と右端に到達しましたら、Main ループに戻ります。

めっちゃ簡単。無事パッドで動くようになりました。

### 次回

今度こそボールを表示していきます。ボールの座標からタイルマップのアドレスを取得し、衝突判定するようです。

### 余談

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733735/09e1bdbe-89d3-4325-559d-eacdb18270b1.jpeg">

メルカリで買った実機とどきました。めっちゃちっちゃい！感動！
【学習】Ruby：each と each_with_index そして each.with_index の違い

## はじめに
アルゴリズム問題を解く中で、Rubyのメソッドには似ているけどちょっとだけ違うものがあることを学びました。
今回はその中でも`each`,`each_with_index`, そして`each.with_index`について。

## 1. `each` メソッドとは？
`each` は、配列やリストの要素を一つずつ取り出して処理を行うための基本的なメソッドです。

```ruby
fruits = ["apple", "banana", "cherry"]

fruits.each do |fruit|
  puts fruit
end
```
👇出力結果
```makefile
apple
banana
cherry
```

👇説明
`each` は配列の中の要素を一つずつ取り出し、それをブロック内で処理します。この場合、`fruit` には配列の各要素が順番に入ります。
`fruit`は`a`や`b`といったほかの変数で置き換え可能です。
その場合`puts fruit`の部分も`puts a`というように変更することになります。


## 2. `each_with_index` メソッドとは？
`each_with_index` は、`each` に加えて **要素のインデックス**（位置）も一緒に取得できます。

```ruby
fruits.each_with_index do |fruit, index|
  puts "#{index}: #{fruit}"
end
```
👇 出力結果
```makefile
0: apple
1: banana
2: cherry
```
👇 説明
`each_with_index` は2つのブロック引数を使います
- 1つ目の引数：要素（`fruit`）
- 2つ目の引数：インデックス（`index`）
このインデックスは、0から始まる点に注意してください！



## 3. `each.with_index` メソッドとは？
一見似ていますが、`each.with_index` は少し特殊です。
このメソッドは **`each` にインデックス機能を後付けする** ようなイメージです。

```ruby
fruits.each.with_index do |fruit, index|
  puts "#{index}: #{fruit}"
end
```
👇 出力結果
```makefile
0: apple
1: banana
2: cherry
```
👇 説明
`each.with_index` の動きは `each_with_index` に似ていますが、異なる点があります

1. **他のメソッドにもインデックスを適用可能**`with_index` は `each` に限らず、`map` や `select` など他の Enumerator にも使えます。
2. **柔軟性が高い**`with_index` は引数をとって、インデックスの開始番号をカスタマイズすることも可能です。


## 4. `each.with_index`でインデックスのカスタマイズ

`each.with_index` は **インデックスの開始番号** を変更できる便利な機能があります。

```ruby
fruits.each.with_index(1) do |fruit, index|
  puts "#{index}: #{fruit}"
end
```
👇 出力結果
```makefile
1: apple
2: banana
3: cherry
```
👇 説明
`with_index(1)` のように引数を渡すと、インデックスは 1 から始まります‼



## まとめ

| メソッド | インデックス取得 | インデックスの開始番号変更 |
| --- | --- | --- |
| `each` | ✖ | ✖ |
| `each_with_index` | 〇 | ✖ |
| `each.with_index` | 〇 | 〇 |

`each_with_index` はシンプルに使えるため、基本的な場面で便利です。
一方で、`each.with_index` は柔軟性が高く、より高度な操作が必要なときに役立つという事を知ることができました。
今回はこれで以上になります。


👇参考記事

https://qiita.com/gestalt/items/d2c663b4be524581747e
UNIX,Linuxにおける標準ヘッダー

# C言語
C言語はUNIXの開発時に使用された言語で、ハードウエア寄りの記述が可能です。
UNIXのman pageにはセクションナンバーがありセクション２(システムコール)，３(サブルーチン)はほぼC言語のためにマニュアルです。

C言語は応用範囲が広く様々なシステムに移植されていますが、もともとの環境はUNXやLinuxに受け継がれています。

# 標準ライブラリとヘッダー
システムで準備されている、ライブラリLibcとそのライブラリに関わるヘッダーファイルの置き場所は

/usr/include

に置かれています。

# ＃includeで<>を使うか””を使うか？
#includeでヘッダーを使う際、

#include \<hoge.h\>
と書くか
#include "hoge.h"

はコンパイル時にコンパイラに、ヘッダー位置を指定しないといけない場合 ”” を使い指定しなくてもいい場合 <> を使います。
グラフニューラルネットワーク(GNN)の基本概念と活用事例

グラフニューラルネットワーク(Graph Neural Network, GNN)は、データの「つながり」を理解して、さまざまな分野で活用されているAIの技術です。この記事では、GNNの基本概念から、実際の活用事例までを分かりやすく解説します。

---

## グラフとは何か？

グラフとは、点(ノード)と線(エッジ)で表される図形のことです。たとえば、友達関係を考えるとしましょう：

- **点(ノード)**: 友達
- **線(エッジ)**: 友達同士のつながり

これが「グラフ」と呼ばれるものです。グラフは、SNSや道路地図などあらゆる場面で利用されています。

---

## グラフニューラルネットワーク(GNN)の基本概念

GNNは「グラフ」の情報を理解し、それを基に活用するAIの技術です。たとえば、友達関係を用いて「あの人と誰が新しく友達になりそうか？」を予測することができます。

### GNNの実行ステップ

1. **ノードの情報を集める**
   各点の特徴情報を分析。

2. **つながりを調べる**
   該当の点に結びついている他の点の情報も収集。

3. **情報をまとめる**
   それらをベースに、新しい特徴を生成。

---

## 実際の活用事例

### 1. ソーシャルネットワーク
**活用例**: FacebookやInstagramでの新しい友達のオススメ

- ユーザーを「ノード」、友達関係を「エッジ」とするグラフを作成。
- GNNは、友達の情報や共通点を基に、新しい友達関係を予測。

### 2. 化学や薬の開発
**活用例**: 薬になりそうな分子構造の発見

- 分子を「ノード(原子)」、「エッジ(化学結合)」として表現。
- GNNで分子全体の特徴を分析、目的の効果を持つ分子を予測。

### 3. サイバーセキュリティ
**活用例**: 不正アクセスや詐欺の検出

- ネットワーク上のユーザーやデバイスを「ノード」、通信や取引を「エッジ」として表現。
- GNNを使って異常な行動を検出。

### 4. 交通と都市計画
**活用例**: 満車予測や最適ルートの計算

- 交差点を「ノード」、道路を「エッジ」として表現。
- GNNで車の流れや交通量を学習、満車の予測や最適なルートを提案。

### 5. レコメンドシステム
**活用例**: AmazonやNetflixでの商品のオススメ

- ユーザーと商品を「ノード」、購入や観視履歴を「エッジ」として表現。
- GNNでユーザーの好みや行動を分析、有力なレコメンドを提案。

---

## おわりに

GNNは、「点と線」で表現されるデータの構造を利用して、涉られた情報を深く理解することができる技術です。SNSや薬の開発から、セキュリティや交通まで、さまざまな分野で役立っています。GNNの活用を通じて、世界はより負荷が躊らぎ、充実したものになっています。
2025年-Todo

一年の計ということで、

FreeBSD/mips MT7620使い道考える

FreeBSD/mips MT7621,MT7628サポート

FreeBSD/mips BCM33カーネルコード作成

NetBSD/c1k PCIeサポートコード作成

NetBSD/c2k ifまともにする

NetBSD/BCM5 マルチプロセッサーサポート

動作不良のnRF8001,EZ-USBなどの確認

PIC32MXのUVC続き

mruby on YABM安定化

rx-mrubyc活用方法検討

RT3052安定化

AR9341のSW直す

mruby/c使い道考える

8080,Z80ごにょごにょ

プリントサーバーHack

MIPS DPS命令利用

AIS受信(広帯域アンプ製作)

ジャンク活用

他いろいろ
sampleメソッド

# 引数なければ一個、あればそれ分無作為に取得する
>sample -> object | nil
sample(n) -> Array
sample(random: Random) -> object | nil
sample(n, random: Random) -> Array

>`配列の要素を1個`(引数を指定した場合は自身の要素数を越えない範囲で n 個) ランダムに選んで返します。

>重複したインデックスは選択されません。そのため、自身がユニークな配列の場合は返り値もユニークな配列になります。

>`配列が空の場合、無引数の場合は nil` を、個数を指定した場合は空配列を返します。

>srand()が有効です。

### パラメータ
>[PARAM] n:
`取得する要素の数を指定`します。自身の要素数(self.length)以上の値を指定した場合は要素数と同じ数の配列を返します。整数以外のオブジェクトを指定した場合は to_int メソッドによる暗黙の型変換を試みます。
[PARAM] random:
`乱数生成器(主に Random オブジェクト)を指定`します。選択する要素のインデックスを返す rand メソッドに応答するオブジェクトであれば指定する事ができます。rand メソッドの引数には Random#rand(max) のように選択可能なインデックスの最大値が指定されます。 Kernel.#rand、Random を使用しないオブジェクトを指定した場合、Kernel.#srandの指定に影響されません。
[EXCEPTION] TypeError:
引数 n に整数以外の(暗黙の型変換が行えない)オブジェクトを指定した場合に発生します。
[EXCEPTION] ArgumentError:
引数 n に負の数を指定した場合に発生します。

```rb
irb(main):011> a = (1..10).to_a
irb(main):012> p a.sample
irb(main):013> p a.sample
irb(main):014> p a.sample(3)
irb(main):015> p a
9
3
[4, 3, 7]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

https://docs.ruby-lang.org/ja/latest/method/Array/i/sample.html
スクラムガイド入門：アジャイル開発の基本を学ぼう

## はじめに
スクラムは、1990年代にソフトウェア開発の効率化を目的として生まれ、現在ではアジャイルフレームワークの中で最も広く使われています。その柔軟性と適応力により、IT業界だけでなく、教育やマーケティングなどさまざまな分野でも採用されている普及度の高い手法です。
## スクラムの定義 (Scrum Definition)
スクラムは、複雑で変化の激しいプロジェクトに対応するためのフレームワークです。軽量で柔軟性があり、チーム全員が協力して成果を最大化することを目指します。
## スクラムの理論 (Scrum Theory)
#### 1. 透明性 (Transparency)
全ての作業内容、目標、進捗状況をチーム全員が見えるようにします。
#### 2. 検査 (Inspection)
プロセスや成果物を定期的に確認し、問題を早期に発見します。
#### 3. 適応 (Adaptation)
検査の結果を元に、計画や作業を変更して最適化します。
## スクラムの価値観 (Scrum Values)
#### 1.コミットメント (Commitment) 
目標に対する責任を持つ。
#### 2.フォーカス (Focus)
最も重要な作業に集中する。
#### 3.オープンネス (Openness)
課題や進捗を率直に共有する。
#### 4.リスペクト (Respect)
チームメンバーのスキルや意見を尊重する。
#### 5.勇気 (Courage)
困難な状況にも立ち向かう。
## スクラムチーム (Scrum Team)
#### 1. デベロッパー (Developers)
製品を具体的に作る役割を担い、技術的な課題を解決します。
#### 2. プロダクトオーナー (Product Owner)
プロダクトのビジョンと価値を管理し、バックログの優先順位を設定します。
#### 3. スクラムマスター (Scrum Master)
スクラムプロセスを監督し、チームが効率的に働ける環境を提供します。
## スクラムイベント (Scrum Events)
#### 1. スプリント (The Sprint)
決められた期間で作業を進め、インクリメントを完成させます。
#### 2. スプリント計画 (Sprint Planning)
スプリントの目標とタスクをチームで計画します。
#### 3. デイリースクラム (Daily Scrum)
1日15分間、進捗状況や課題を共有します。
#### 4. スプリントレビュー (Sprint Review)
完成したインクリメントを顧客や関係者に見せ、フィードバックを得ます。
#### 5. スプリント振り返り (Sprint Retrospective)
チームの作業プロセスを振り返り、改善策を検討します。
## スクラムの成果物 (Scrum Artifacts)
#### 1. プロダクトバックログ (Product Backlog)
製品に必要な全ての要件がリストアップされた文書。
#### 2. スプリントバックログ (Sprint Backlog)
スプリントで実行するタスクの詳細なリスト。
#### 3. インクリメント (Increment)
スプリントの結果として完成した、リリース可能な製品。
## おわりに
スクラムについてさらに詳しく知りたい方は、公式の [Scrum Guide](https://scrumguides.org/scrum-guide.html) をぜひご覧ください。以上のリンクからアクセスできます。次回の記事では、PSM1試験の実際の質問例を取り上げ、スクラムの理解を深めるための解説を行います。お楽しみに！
picoCTF 2022 writeup Inspect HTML

## Inspect HTML (Web Exploitation)

Can you get the flag?  
Go to this [website](http://saturn.picoctf.net:59880/) and see what you can discover.

とりあえず、記載のリンクを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/a7baee66-4da0-522b-f700-b435f36905f5.png)
謎の文章があるだけである。
問題のタイトル通り、DevToolのinspectorを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638553/fa002140-9424-eaa5-f3bf-17a70e6ad669.png)
フラグが得られた。

`picoCTF{1n5p3t0r_0f_h7ml_fd5d57bd}`
WSL上のJupyter NotebookをWindowsのVSCodeから利用する完全ガイド

# WSL上のJupyter NotebookをWindowsのVS Code (Cursor) から利用する完全ガイド：2025/01/02 10:40

## はじめに

WSLとWindowsの共存環境で開発を行う際、以下の方針が効果的です：

* Python関連の環境はWSL側に集約
* エディター（Microsoft Visual Studio Code、以下、VS Code）はWindows側を使用
* Jupyter NotebookをWSLで動かしVS Codeから操作

## 前提条件

* Microsoft Windows 11
* WSL2 (Ubuntu 24.04)
* Microsoft VS Code (Cursor)
* Python 3.x（WSL側）

## 環境構築手順

### 1. WSLの基本設定

```bash
# WSLのアップデート
sudo apt update
sudo apt upgrade -y

# 必要なパッケージのインストール
sudo apt install -y python3 python3-pip python3-venv
```

### 2. Python仮想環境の作成

```bash
# ホームディレクトリーに仮想環境を作成
python3 -m venv ~/jupyter_env

# 仮想環境を有効化
source ~/jupyter_env/bin/activate

# pipのアップグレード
pip install --upgrade pip

# Jupyter関連パッケージのインストール
pip install jupyter notebook ipykernel
```

### 3. VS Code (Cursor) の設定

1. **必須拡張機能のインストール**
   * Remote - WSL
   * Python
   * Jupyter

2. **WSL接続の確立**
   * リモートエクスプローラーを開く（サイドバーのアイコン）
   * WSLターゲットを展開
   * Ubuntu-24.04を選択
   * 「新しいウィンドウで接続する」をクリック
   * 左下が`WSL: Ubuntu-24.04`と表示されることを確認

3. **settings.jsonの設定**

```json
{
    "python.defaultInterpreterPath": "~/jupyter_env/bin/python",
    "python.terminal.activateEnvironment": true,
    "jupyter.notebookFileRoot": "${workspaceFolder}"
}
```

### 4. Jupyter Notebookの作成と実行

1. **新規ノートブックの作成**
   * エクスプローラーで任意のフォルダーを開く
   * 新規ファイル作成で`.ipynb`拡張子を指定
   * または、コマンドパレット（Ctrl+Shift+P）から`Jupyter: Create New Blank Notebook`を選択

2. **インターフェイスの確認**
   * `+ コード`と`+ マークダウン`ボタンが表示される
   * カーネルが`jupyter_env`になっていることを確認

## 使用方法

### Jupyter Notebookの起動

1. WSL側での起動:

```bash
# 仮想環境の有効化
source ~/jupyter_env/bin/activate

# Jupyterの起動
jupyter notebook
```

2.VS Codeでの操作:

* `Ctrl + Shift + P`でコマンドパレットを開く
* `Python: Create New Blank Jupyter Notebook`を選択

### よく使う操作例

```python
# マークダウンセルの例
"""
# タイトル
## サブタイトル
- リスト1
- リスト2
"""

# コードセルの例
import pandas as pd
import numpy as np

# ヒアドキュメントの例
query = """
SELECT *
FROM table
WHERE column = 'value'
"""
```

## トラブルシューティング

1. **カーネルが見つからない場合**

```bash
python -m ipykernel install --user --name=jupyter_env
```

2. **WSL接続エラーの場合**

```bash
wsl --shutdown
```

## 注意点

* WSL上のファイルシステムへのアクセスは`\\wsl$`経由より、VS CodeのWSL拡張経由の方が安定します
* 大規模なデータ処理を行う場合は、WSLのリソース制限を確認してください
* Jupyter Notebookのセッション情報は`~/.jupyter`に保存されます

## 補足情報

### WSLのファイルシステムへのアクセス

* Windowsエクスプローラーから: `\\wsl$\Ubuntu-24.04\home\ユーザー名`
* WSL側から: `explorer.exe .`で現在のディレクトリーをエクスプローラーで開く

### 推奨される使用方法

* プロジェクトのファイルはWSL側に置く
* エディター操作はWindows側のVS Code (Cursor) から行う
* パッケージのインストールはWSL側の仮想環境で行う

## 参考情報

* WSLのメモリー使用量の確認:

```bash
free -h
```

* プロセス確認:

```bash
ps aux | grep jupyter
```

## まとめ

この構成により：

* Windows環境の整理整頓が容易
* Python環境の管理が簡単
* WSL-Windows間のシームレスな連携が実現
* 開発環境の再現性が高まる
* ドキュメント化が容易になる

タグ: `#Python` `#WSL` `#VSCode` `#Jupyter` `#Cursor` `#開発環境`
AWS AIF合格体験記

## はじめに

AWS Certified AI Practitioner認定試験を受験しました。
余裕をもって「2025AllCerts」に申し込みたいのもあり、年末に受験日をねじこみました。

## 前提

- 業務でのAWS利用経験あり
- AI知識はほとんどない(LLMやRAGなどの用語はかろうじて知っているくらい)
- AWS認定試験は「AIF、MLA」以外はすべて取得(詳細は[こちら](https://qiita.com/num-bx77/items/f629cc2e9f7616a62ccb))
- GCP認定試験は「PCA」のみ取得

## 使用教材・参考サイト

今回は新試験だったため、情報も少なく教材選びに難儀しました。

### 使用教材

[AWS Certified AI Practitioner (AIF-C01) 試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ai-practitioner/AWS-Certified-AI-Practitioner_Exam-Guide.pdf)
[Exam Prep Official Practice Question Set: AWS Certified AI Practitioner (AIF-C01 - Japanese)](https://explore.skillbuilder.aws/learn/lp/2193/standard-exam-prep-plan-aws-certified-ai-practitioner-aif-c01)

### 参考サイト

[AWS Certified AI Practitioner (AIF-C01) 認定勉強](https://qiita.com/kikuziro/items/9591b5dd9425acf04144)
⇒@kikuziroさんの記事です。
　AIを基礎からわかりやすく学びたい方に特におすすめです！
　個人的にはドット絵が好きなので楽しく読み進めることができました。

[AWSの3つのAI・機械学習認定試験をこれから受ける人のためのガイド - プラクティショナー(AIF)/アソシエイト(MLA)/スペシャルティ(MLS)](https://dev.classmethod.jp/articles/how-to-pass-aws-certified-ai-ml/)

## 結果

無事合格できました！

![スクリーンショット 2024-12-27 161015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904291/ee4fc6a5-583d-71e0-ce51-9ea53a0a2d66.png)

## 感想

普段は問題集を何週も周回するやり方で勉強を進めていましたが、今回は問題集の教材も少なかったため記事を見て勉強する形をとりました。不安でしたがなんとか合格できてほっとしています。次のMLAを取れれば全冠なので、1月中くらいで取れるように計画的に進めたいと思います。
資料を残すことについて

## 概要
エンジニアに転職して数か月経過しましたので、最近思ったことについて記載しようと思います。<br>
業務を行っている中で、資料(ドキュメント)に残すことの大事さを身をもって知ったので記載しようと思います。

## 詳細
業務を行っている中で別の人が構築したり、やりとりしたりしているものを引き継ぐ事が多々ありました。
この際、作成した物やどのような考えで作業を行ったか残されていないと意図を把握するのに作業時間より時間がかかってしまいました。

実際の構築案件でも、前担当者の意図が把握できず話をこじらせてしまいました。
最終的には経緯報告書的なものを提出するまでに話が燃えました...
![落ち込んでいる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/4212587d-7daa-0a74-184c-e311d265022f.png)

### 燃えた詳細
とある構築案件をチームで行っていました。
ほぼ一人の人が構築をされており、メンバーが詳細を把握していない状態で話が進んでいました。

移行作業がうまくいかず、燃えかけた状態でバトンが自分に回ってきました。資料がどこにあるかわからずサーバーの中に直接入り確認をしました。(今思えば、テンパっていたとはいいだいぶとリスクある事をしたと思ってます。)
![サーバー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/b4cdd652-ea95-bb4a-d29f-ec942833116c.jpeg)
この際、とある設定ファイルの見落としをしてしまい話をこじらせることになってしまいました。

原因として考えられるのは下記2点が主な原因かと思っています。

1.業務知識の差
2.資料を残さなくても、把握できるだろうという予想

１については、個々の差が非常にあるので劣っている側(自分)がどうにかしておいつくしかないかと思っています。

2については燃えた案件とは別ですが自分自身、これくらい把握できるだろと思い記載しなかった所でかなり難儀したと言われてしまったので、今後気を付けていこうと思います。

## 今後どうするのか
1の具体的な対策としては、つぶれない程度に資格等の勉強を継続していこうと思っています。

現在、sysopsかLinuCを取得しようと思っています。
(SAA,SAP取得する際にだいぶ無理して私生活を捨てたのである程度セーブします。)

2については、弊社ではバックログにて課題管理を行っています。
そのため、該当課題のコメント欄に随時実施内容を文面やスクリーンショットで示すことでなるべく次の人に伝わるように実践しています。
(何か指摘があったら、別の方法を考えます)
![困った顔.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/b40b972a-7d55-9261-ddab-9265a7ea29f3.png)

また、社内wikiを作成しているのですが内容がわかりずらいと言われた際に
随時更新をしています。
手が空いていない場合は、バックログの課題に放り込んで空いた時間に更新作業をしています。

## 感想
夢みたいな目標をもって過激なことを行っても潰れるだけだと思いますので、地味な努力を継続していこうと思います。
ゼロからのOS自作入門 メモ #5

# 前置き
本記事は「ゼロからのOS自作入門」のメモになります。
仕事上OSの知識があってもいいなと思って、取り組むことにしました。
各章に対し、1記事をOutputする予定です。
前記事：https://qiita.com/fuji3195/items/516c3f07bb3f08faba0e

参考として，以下のように章を学んでいます．
2~3周くらいは読まないと，中身の理解はできないです．

1. まず章を全部読む
2. 読み返しつつ手を動かす
3. 書籍に載っている部分はプログラムをコメントアウトして書籍のコードを写経する

# 学ぶこと
- 文字の表示
- 分割コンパイル
- コンソールでの文字の処理
- `sprintf()`, `printk()`の実装

# 分割コンパイル
`main.cpp`だけだと長くなってきたから，機能ごとにファイル分けようね，というお話．
C/C++で開発した経験があるなら大体知っていると思う．


# 文字の表示
文字を表示する．
8x16 pixelを，バイナリで記述する．
最初は`A`の文字を以下のようにしてあらわしている．
```
const uint8_t kFontA[16] = {
    0b00000000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00011000,
    0b00100100,
    0b00100100,
    0b00100100,
    0b00100100,
    0b01111110,
    0b01000010,
    0b01000010,
    0b01000010,
    0b11100111,
    0b00000000,
    0b00000000,
};
```
1が文字の線の部分で0が何も表示しない部分になっている．
これを前章でやった1pixelごとの表示を応用して，適当な場所に文字を表示させることができる．
以下は実際に動かしてみた結果になる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405454/7e5110d3-ab54-430f-8750-c81e0a3ac79d.png)
ここまでが，文字の表示方法のお話．
これを何個も作るのは非常に手間がかかるので，オープンソースの「東雲フォント」を使うようにする．
東雲フォントのバイナリの生成は著者がpythonスクリプトを用意してくれているので，そこからバイナリを作成する．

binaryは16byte x 256 (0x00~0xFFまで) = 4096 byte用意する必要がある．
さらに，リンクに必要な情報を付け加える必要があり，`objcopy`というコマンドを使う．
これにより，binaryはリンクに必要な情報を持つobjectファイルに変更することができる．
なお，各オプションの意味は以下の通り．
| option | 意味 |
|:-:|:-:|
| -I | 入力ファイルのフォーマット．今回はバイナリ |
| -O | 出力ファイルのフォーマット．今回はelfファイルなので`elf64-x86-64` |
| -B | 出力ファイルのターゲットアーキテクチャ．入力ファイルがバイナリの場合もとのアーキテクチャがないため，このオプションで明示的に設定する． |

実際にやってみると以下のようになる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405454/de725886-5f47-6a1f-cada-dd3247f5ef07.png)

# sprintfとprintkの実装
## sprintf実装
### 書式なしバージョン
非常に簡単．
今回は`WriteString()`関数を実装して使ってみる．

### 書式ありバージョン
`Newlib`という標準Cライブラリを使う．
`Newlib`の特徴は以下の通り
- OSが入っていない組み込み機器などでも簡単に使えるようになっている
- printfやmallocなどのOSが必須な機能は自分で実装するように空の実装になっている

makeの際にCPPFLAGSとLDFLAGSを書き換える．これはosbook/devenv下にあるbuildenv.shで変更できる．
そのあとにmakeしたら以下のように正しく起動した．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405454/f4451ea7-ed79-a02d-58bc-ddd69765ce50.png)

## コンソール実装
コンソールの仕様は以下のようなイメージ
- 改行文字で改行するだけの機能
  - 文字列を先頭から見ていって，改行文字に出会ったらX座標を0に戻し，Y座標を+16する
- スクロール機能
  - 画面を一度塗りつぶしてメッセージを消す
  - 改めて一行ずらして今までのメッセージを表示する
  - 今までのメッセージ(最低でも1画面分)は記憶しておく必要がある

これをC++のクラスを用いてコンソールクラスとして実装する．
コンソールクラスでは画面サイズは25*80固定．qemuで出力されるWindowはそれ以上の領域を有しているが，25行以上表示すると改行される．
また，普段使っているイメージのものとは異なり，80文字を超えたら表示されないようになっている．
コンソールに普段イメージしているような以下の機能を付け加えるのはまだしばらくなさそうに見える．

改行文字は別で実装している．`Newline()`で実装されている．
`Newline()`の中で，上記の2パターンそれぞれ実装している．
実際に実装して，27行表示した結果が以下．実際に，25行しか表示されておらず，最初の3行(0~2 line)は消えてしまっている．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405454/0657d6a5-5cea-3fa1-fad0-c08d048612ff.png)

## printkの実装
`printk()`はカーネルからメッセージを出すためのprint文．printfと同じ書式を持つ．
通常のOSには実装されているため，デバッグ用にここで実装する．
printk()の実装により，先ほど出力した「line xx」はすべてprintkで出力が可能になる．

ポイントはC言語の可変長引数の`va_list`型．
`vsprintf()`を使うときに必須になり，可変長の引数`...`を受け取り，そのままvsprintfに渡す．
`va_start`と`va_end`で挟むことで使える．
出力は上の画像とだいたい同じなので省略．

# まとめ
Consoleの作成及び，文字の出力について学んだ．
Console自体はほんとに基本的な機能しかないが，printできればOK,みたいな感じ．
次はマウス入力とPCIについて学ぶ．
量子コンパイラを作る。 その14

# 概要
量子コンパイラを作る。
elixirで論理回路アセンブラをコンパイルして、qiskitな半加算器を生成した。

# 投入したソース

```
make 4
in 0 1
out 2 3
xor 0 1 2
and 0 1 3
```

# 生成したqiskit

```


from qiskit import QuantumCircuit
from qiskit.primitives import StatevectorSampler
qc = QuantumCircuit(4)
qc.h(0)
qc.h(1)
qc.cx(0, 2)
qc.cx(1, 2)
qc.ccx(0, 1, 3)

qc.measure_all()
print(qc)
sampler = StatevectorSampler()
job = sampler.run([qc], shots = 100)
result = job.result()
counts = result[0].data.meas.get_counts()
print(f" {counts}")
for ans, cnt in counts.items():
  print(ans[3], " + ", ans[2], " = ", ans[1], ", carry = ", ans[0])




```

# 成果物

https://paiza.io/projects/4TNgrgUtFhABQLdBZzDjlA?language=elixir

# qiskitの実行結果

```
$ python3 test20.py
        ┌───┐                          ░ ┌─┐
   q_0: ┤ H ├──■─────────■────■────────░─┤M├─────────
        ├───┤  │         │    │        ░ └╥┘┌─┐
   q_1: ┤ H ├──┼────■────■────┼────■───░──╫─┤M├──────
        └───┘┌─┴─┐┌─┴─┐  │    │    │   ░  ║ └╥┘┌─┐
   q_2: ─────┤ X ├┤ X ├──┼────┼────┼───░──╫──╫─┤M├───
             └───┘└───┘┌─┴─┐┌─┴─┐┌─┴─┐ ░  ║  ║ └╥┘┌─┐
   q_3: ───────────────┤ X ├┤ X ├┤ X ├─░──╫──╫──╫─┤M├
                       └───┘└───┘└───┘ ░  ║  ║  ║ └╥┘
meas: 4/══════════════════════════════════╩══╩══╩══╩═
                                          0  1  2  3
 {'0000': 29, '1011': 27, '1110': 21, '1101': 23}
0  +  0  =  0 , carry =  0
1  +  1  =  0 , carry =  1
0  +  1  =  1 , carry =  0
1  +  0  =  1 , carry =  0
```

以上。
Node.jsで、自己署名証明書を設定する方法

# はじめに
　Node.jsで、自己署名証明書を設定する方法を紹介する。

## エラー内容

　Node.jsで以下のようなエラーが出る場合を対象とする。
```bash
RequestError: self signed certificate
```

# 動作確認環境
* Node.js : v14.21.3
* OS
  * Ubuntu 22.04
  * Windows 10
# 方法

 自己署名証明書を取得し、それを信頼するように設定する。

## 証明書の取得
　アクセスしたいサーバに自己署名証明書を設定してある場合は、以下のコマンドで自己署名証明書を取得する。
```bash
echo | openssl s_client -servername {server_address} -connect :443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem
```
* {server_address}
  * 証明書を取得したいサーバのアドレス 
* cert.pem : 任意の自己署名証明書のパス

## Node.jsに自己署名証明書を設定する

　```NODE_EXTRA_CA_CERTS```環境変数に、上記の自己署名証明書のパスを通す。環境変数を設定後は、通常通りNode.jsを起動すればよい。

### Ubuntuの場合

```bash
export NODE_EXTRA_CA_CERTS=cert.pem
```
* cert.pemは、パスが通るように指定する

### Windowsの場合

```bash
set NODE_EXTRA_CA_CERTS=cert.pem
```
* cert.pemは、パスが通るように指定する


# まとめ

　Node.jsで、自己署名証明書を設定する方法を紹介した。

# 参考

https://doc.sitecore.com/xp/ja/developers/hd/latest/sitecore-headless-development/walkthrough--configuring-sitecore-ca-certificates-for-node-js.html

https://ja.stackoverflow.com/questions/47314/ssl%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%88%E8%A8%BC%E6%98%8E%E6%9B%B8%E6%9B%B4%E6%96%B0
割と最近出来るようになったS3の条件付き書き込みとは？ ～AWS100本ノック～ 21/100

# はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/8e68f276-fc22-b549-f08a-21e39a4a02a1.png)

みなさん、S3使ってますか？

- バックアップ
- Webアプリケーションからファイルをアップロード/ダウンロード
- フロントエンド用のjsやHTML保存
など色々な場面でS3は使われますね！

その中で、S3で最近出来るようになった条件付き書き込みについて紹介します。
簡単に言うと`上書き防止機能`です:smile: 

# 条件付き書き込みが出来るようになる前
ファイルをアップロードする際に、S3では
- PutObject
- CompleteMultiPartUpload(マルチパートアップロード)
を利用することになると思います。

アップロードする際はファイル名の命名規則などを取り決めてアップロードすることになると思いますが、その際に考えるべきことの1つとして、同名ファイルがアップロードされそうになった時に、どうするかという問題があります。

上書きしちゃっても問題ないファイルに関しては良いのですが、何かしらの理由で上書きされたくないってこともあると思います。

その場合、一度GetObjectしてファイルが存在するかチェックしたり、DBにアップロードしたファイル名の履歴を取っておいて既にアップロードされていないかチェックしたりすることになります。
これでも問題ないっちゃ問題ないんですが、なるべく処理はシンプルにしたいですよね:smile: 

そこで、条件付き書き込みの出番です！

# 条件付き書き込みが出来るようになってから

API リクエスト時に`if-none-match`ヘッダーを付与することで、既にアップロードされているファイルパスの場合はエラーを返してくれるため、上書きされる心配がなくなります。


では、AWS CLIで試してみます！

まず、条件付き書き込みでやらない場合ですが、以下のように上書きアップロードできます。
※`${S3バケット名}`の部分はご自身の環境のS3バケットを指定してください。

```bash
# 適当なファイルを作成
touch ./duplicate.json

# ファイルをアップロード
aws s3api put-object \
  --bucket ${S3バケット名} \
  --key hoge/duplicate.json \
  --body ./duplicate.json
{
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ServerSideEncryption": "AES256"
}

aws s3api put-object \
  --bucket ${S3バケット名} \
  --key hoge/duplicate.json \
  --body ./duplicate.json

{
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ServerSideEncryption": "AES256"
}
```

次に、条件付き書き込みでアップロードするために`--if-none-match "*"`を付けて実行します。
すると、`PreconditionFailed`になりアップロードが失敗することがわかります。
```bash
aws s3api put-object \
  --bucket ${S3バケット名} \
  --key hoge/duplicate.json \
  --body ./duplicate.json \
  --if-none-match "*"

An error occurred (PreconditionFailed) when calling the PutObject operation: At least one of the pre-conditions you specified did not hold
```

もちろんファイルが存在しない場合は成功します。
```bash
aws s3api put-object \
  --bucket ${S3バケット名} \
  --key hoge/duplicate.json \
  --body ./duplicate.json \
  --if-none-match "*"

{
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
    "ServerSideEncryption": "AES256"
}
```

# おわりに

今回はS3の条件付き書き込みについて、説明しました。
意外と知らないが、使うことが割と多い機能だと思うので覚えておきましょう！！！
ProxmoxをインストールしたマシンにSSDを追加してLVMで利用する手順

# はじめに

タイトルにあるとおりの内容についての備忘録です。

# 環境

- Proxmoxインストール済み
- 2TB HDD（接続済み）

# 手順

追加したHDDがsdbとして認識されていたので、ここではsdbとして記述します。

## シェルの起動

Proxmoxの管理コンソールにアクセスしてシェルを起動します。

## ディスクの初期化

```
$ fdisk /dev/sdb
```

新しくパーティションを追加します。

```
Command (m for help): n
※設定はデフォルトで、終わったら終了
Command (m for help): q
```

念の為フォーマットを試してみる

```
$ mkfs -t ext4 /dev/sdb1
```

## LVMの設定と確認

以下のコマンドでLVMに設定。「strage name」は任意です。

```
$ vgcreate [strage name] /dev/sdb1
```

以下のコマンドで結果を確認

```
$ vgscan
  Foundvolume group "[strage name]" using metadata type lvm2
  Foundvolume group "pve" using metadata type lvm2
```

## 設定ファイルの変更

storage.cfgに設定を追記

```
nano /etc/pve/storage.cfg
```
```
lvm: [volume name]
	thinpool data
	vgname [strage name]
```

「volume name」は任意です。

# 確認

管理コンソールでディスクを表示して、LVMが認識されていれば完了。

できた！