OmniAICreator/Qiita-1.07M huggingface dataset:
railsのcreateでPostman使ってみた

## はじめに
最近、PostmanというAPIの開発をサポートしてくれるツールを知ったので使ってみようと思います。

## Postmanとは
公式より
>Postman は、 API を構築および使用するためのAPI プラットフォームです。Postman は、API ライフサイクルの各>ステップを簡素化し、コラボレーションを効率化することで、より優れた API をより迅速に作成できるようにします。

公式に書いてある通り、PostmanはAPIの開発やテスト等をサポートするツールです。
実際にAPIにGETやPOSTを行い、リクエストやレスポンスを受け取ることができます。

## Postmanでrailsのcreateを行う
実際に、Postmanを使ってみようと思います。

### Postmanをダウンロード
まずはPostmanをダウンロードします。

https://www.postman.com/downloads/

### lightweight API clientで入る
lightweight API clientと表示されているところをクリックすると、アカウント作成なしでPostmanを使用できます。(アカウントなしの場合、一部機能が制限されています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/449f1e73-37b2-55a8-a252-40d16c644aca.png)

### railsでcreateメソッドを実装する
scaffoldでusersテーブルとcontroller, view等を実装します。
```sh
rails g scaffold User name:string email:string
```

users_controller.rbに以下のコードが生成されていると思います。
```rb:app > controllers > users_controller.rb
# POST /users or /users.json
def create
  @user = User.new(user_params)

  respond_to do |format|
    if @user.save
      format.html { redirect_to user_url(@user), notice: "User was successfully created." }
      format.json { render :show, status: :created, location: @user }
    else
      format.html { render :new, status: :unprocessable_entity }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end
```

外部でAPIをたたけるように、以下のコードを追加します。
これがないとCSRFトークンエラーでAPIを外部から実行できません。
```rb:app > controllers > users_controller.rb
class UsersController < ApplicationController
  before_action :set_user, only: %i[ show edit update destroy ]
+ protect_from_forgery with: :null_session, only: [:create]
```

### Postmanで設定を行う
以下のように、POSTで`http://localhost:3000/users`をたたいてuserをcreateします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/19a3c7f6-37b7-2d72-732b-f02eb9283c04.png)

Headersで`Content-Type: application/json`, `Accept: application/json`を設定し、JSONでリクエストとレスポンスをできるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/c103b1f1-02a1-a892-1675-279c41477f70.png)

Bodyでrawを選択し、JSON選びます。
そして、以下のコードを入力します。
```json
{
      "name": "山田太郎",
      "email": "sample@sample.com"
}

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/6f7f761f-dd5e-4d95-d124-38851baea3a4.png)


### Sendをクリックし、POSTを実行
Sendボタンをクリックすると、jsonがレスポンスで返ってきます。
リクエストのjsonのnameやemailを変更し、Sendするとレコードを作成してくれるので、テストデータを作成するときなどに便利そうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/88d671d8-2cfd-3d0a-29df-805ce289a78d.png)

### GETを実行する
GETで`http://localhost:3000/users`をたたくと、usersテーブルのレコードすべてが返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/850adc2f-b134-9699-a2c3-3974b9399386.png)

## 終わりに
Postmanを使用して、railsのcreateを実行してみました。
Postmanがどういうものか簡単ですが、分ったと思います。
変数設定やAPIのテストも行えるみたいなので、気になる方はやってみてください！

## 参考

https://www.ipride.co.jp/blog/8397

https://zenn.dev/nameless_sn/articles/postman_tutorial#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB
【Pybulletサンプル解説】デバッグスライダーに指定した位置/姿勢にロボットを設定【rollPitchYaw.py】

Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです（一覧は[こちら](https://qiita.com/akinami/items/7b433b60aeb5115ba4d7)）。

<br>

今回は、rollPitchYaw.pyを解説します。（コードのリンクは[こちら](https://github.com/bulletphysics/bullet3/blob/master/examples/pybullet/examples/rollPitchYaw.py)）

本コードを実行すると、ロボットをデバッグスライダーで指定した位置/姿勢に設定できます。

![rollPitchYaw.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2030125/f8989084-bb3a-7c5e-ad02-b83dfd504bf8.gif)


# 使用している機能
本コードは、以下の機能を使用して「ロボットをデバッグスライダーで指定した位置/姿勢に設定」することができます。

- デバッグスライダーの設定
- ロボットを指定した位置/姿勢に設定

## デバッグスライダーの設定
`addUserDebugParameter` 関数を使用することで、デバッグ用のスライダーを設定できます。

```python
debugSliderId = p.addUserDebugParameter(paramName, minVal, maxVal, initVal)
```
- `debugSliderId`：デバッグスライダーのID
- `paramName`：パラメータの名称
- `minVal`：パラメータの最小値
- `maxVal`：パラメータの最大値
- `initVal`：パラメータの初期値

<br>

今回は、ロボットの位置/姿勢を設定するために使用します。

```python
# ロボットの位置/姿勢を設定可能なデバッグ用のスライダーを定義
rollId = p.addUserDebugParameter("roll", -1.5, 1.5, 0)
pitchId = pybullet.addUserDebugParameter("pitch", -1.5, 1.5, 0)
yawId = p.addUserDebugParameter("yaw", -1.5, 1.5, 0)
fwdxId = p.addUserDebugParameter("fwd_x", -1, 1, 0)
fwdyId = p.addUserDebugParameter("fwd_y", -1, 1, 0)
fwdzId = p.addUserDebugParameter("fwd_z", -1, 1, 0)
```

## ロボットを指定した位置/姿勢に設定
`resetBasePositionAndOrientation` 関数を使用することで、指定したオブジェクトを指定した位置/姿勢に設定できます。

```python
 pybulllet.resetBasePositionAndOrientation(objectId, objectPosition, obJectPosture)
```
- `objectId`：位置/姿勢を設定するオブジェクトのID
- `objectPosition`：オブジェクトの位置（[x,y,z]）
- `objectPosture`：オブジェクトの姿勢（[qx, qy, qz, qw]）
   - クォータニオンで指定する必要があることに注意  

# コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります（もともとあった不要と思われるコメント等については削除しています）

```python
import pybullet as p
import time
import pybullet_data

# 共有メモリモードでPybulletに接続
cid = p.connect(p.SHARED_MEMORY)

# 接続が失敗したら、GUIモードで再接続
if (cid < 0):
  p.connect(p.GUI)

# Pybulletに関するデータパスを取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())

# 四足歩行ロボットをベースを固定した状態で生成
q = p.loadURDF("quadruped/quadruped.urdf", useFixedBase=True)

# ロボットの位置/姿勢を設定可能なデバッグ用のスライダーを定義
rollId = p.addUserDebugParameter("roll", -1.5, 1.5, 0)
pitchId = p.addUserDebugParameter("pitch", -1.5, 1.5, 0)
yawId = p.addUserDebugParameter("yaw", -1.5, 1.5, 0)
fwdxId = p.addUserDebugParameter("fwd_x", -1, 1, 0)
fwdyId = p.addUserDebugParameter("fwd_y", -1, 1, 0)
fwdzId = p.addUserDebugParameter("fwd_z", -1, 1, 0)

while True:
  # デバッグスライダーに設定された値を取得
  roll = p.readUserDebugParameter(rollId)
  pitch = p.readUserDebugParameter(pitchId)
  yaw = p.readUserDebugParameter(yawId)
  x = p.readUserDebugParameter(fwdxId)
  y = p.readUserDebugParameter(fwdyId)
  z = p.readUserDebugParameter(fwdzId)

  # オイラー角からクォータニオンを取得
  orn = p.getQuaternionFromEuler([roll, pitch, yaw])

  # 指定した「位置/姿勢」にロボットを設定
  p.resetBasePositionAndOrientation(q, [x, y, z], orn)
```
[Swift] 関数シグネチャを得る

# 関数シグネチャ

Swift言語における関数シグネチャは、独特な書き方をします。

例えば、次の関数の場合、

```swift
func session(
    _ session: MCSession,
    didReceiveCertificate certificate: [Any]?,
    fromPeer peerID: MCPeerID,
    certificateHandler: @escaping (Bool) -> Void
)
```

関数シグネチャは、次のように書きます。

```swift
session(_:didReceiveCertificate:fromPeer:certificateHandler:)
```

- ドキュメントページに出てきます

<img width="300" alt="man.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/591100eb-ef81-bcd3-561f-fc7f25a252b1.png" />

- 関数シグネチャ が そのまんま ドキュメントページのURLにも使われています
https://developer.apple.com/documentation/multipeerconnectivity/mcsessiondelegate/session(_:didreceivecertificate:frompeer:certificatehandler:)
<br>

- Xcodeのエディタでも 関数シグネチャが見えます。

![xcode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/0888d01c-a570-b74e-0228-70048c378aaf.png)


Apple が提供するライブラリのAPIは、ドキュメントページを見れば`関数シグネチャ`を得られますが、独自に実装した関数の`関数シグネチャ`は、当然、Appleのドキュメントページにはありません。
Xcodeでは見れるのですが、この文字列をコピーすることができません。

このままでは、独自に実装した関数の`関数シグネチャ`は、手作業で書くしかありません。

# 関数シグネチャを得る

Swift言語を使って、独自関数の`関数シグネチャ`を得る方法を調べましたが、見つけられませんでした。

独自クラス（class/struct）を、[`Mirror`](https://developer.apple.com/documentation/swift/mirror/)でリフレクションすれば下位構造で得られるかと 次のコードで試しましたが、

```swift
struct Point {
    let x: Int, y: Int
    func sub(other: Point) -> Point {
        let x = self.x - other.x
        let y = self.y - other.y
        return Point(x: x, y: y)
    }
}

let p1 = Point(x: 10, y: 10)
let M = Mirror(reflecting: p1)
for child in M.children {
    print(child)
}
//(label: Optional("x"), value: 10) 
//(label: Optional("y"), value: 10) 
```

変数(？)は得られますが、関数は何も得られませんでした。



# 手で書くしかない？

関数シグネチャ は 簡単に手で書けますが、機械的に得たいところです。

_`関数名（引数名を：でつなげる：）`と書く。
型に関する情報は一切無し。戻り値があっても、戻り値の型も書かない。_

引数の型を書かない、戻り値の型も分からない ので、これが`関数シグネチャ`かと思いますが、「関数名と引数名がすべてを物語る」Swift思想なのでしょうね。



---
 
~~もし、関数シグネチャ を 機械的に得られる方法をご存知の方がいらしたら ぜひ教えてください。~~

# #function 

_2024.7.11追記_

あ ありました。
何度も見ていたのですが、完全に忘れていました。

['#function'](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/expressions/#Literal-Expression)リテラルです。

```swift
class FunctionSignatureTest {
    func aFunction() -> String {
        return #function
    }

    func aFunction(parameter: Int) -> String {
        return #function
    }

    func aFunction(_ parameter: Int) -> String {
        return #function
    }

    func aFunction(_ parameter: Int, _ anotherParameter: Int) -> String {
        return #function
    }
}

let functionSignatureTest = FunctionSignatureTest()

print(functionSignatureTest.aFunction())
print(functionSignatureTest.aFunction(parameter: 1))
print(functionSignatureTest.aFunction(1))
print(functionSignatureTest.aFunction(1, 2))

//aFunction()
//aFunction(parameter:)
//aFunction(_:)
//aFunction(_:_:)
```

実行しないと、`関数シグネチャ`を得られませんが、実行コードを書くだけです。
svelte:elementのthisを安全にする

## 概要
見たらわかるのでコードを書きます。

### Element.svelte
```svelte
<script lang="ts">
	import type { SvelteHTMLElements } from 'svelte/elements';

	type OmitStringSignature<T> = {
		[K in keyof T as K extends string ? (string extends K ? never : K) : K]: T[K];
	};
	type As = keyof OmitStringSignature<SvelteHTMLElements>;

	let {
		as
	}: {
		as: As;
	} = $props();
</script>

<svelte:element this={as} />
```

### 使用する側
```svelte
<script lang="ts">
	import Element from './Element.svelte';
</script>

<Element as="a" />
<Element as="hoge" /> // error!
```

おわり。

`svelte:element`の`this`は実は`hoge`とかを型上渡せちゃうので縛りたいな〜とずっと思っていましたが、ふと思い立ってCopilotに聞いたら全部教えてくれました。

~~もう俺いらんわ…~~

<details><summary>ちなみに</summary>

:::note warn
```svelte
<svelte:element this={"hoge"}>
	{@render children()}
</svelte:element>
```
と書くと

```svelte
<hoge>テキスト</hoge>
```
と表示されます。
:::
</details>
Rustのスカラー型と複合データ型とその他の型

# Rustのスカラー型と複合データ型
Rustにはスカラー型と複合データ型とその他の3種類のデータ型が存在します。

## スカラー型

スカラー型は単一の値を持つ基本的なデータ型です。

### 整数型（Integers）

- 符号付き整数（`i8`, `i16`, `i32`, `i64`, `i128`, `isize`）
- 符号なし整数（`u8`, `u16`, `u32`, `u64`, `u128`, `usize`）
``` rust
let x: i32 = 42;
let y: u8 = 255;
```

### 浮動小数点型（Floating-Point Numbers）
- f32（単精度浮動小数点数）
- f64（倍精度浮動小数点数）
``` rust
let x: f32 = 3.14;
let y: f64 = 2.718281828459045;
```

### 論理型（Booleans）
bool（trueまたはfalseの値を取る）
``` rust
let is_active: bool = true;
let is_admin: bool = false;
```

### 文字型（Characters）
char（Unicodeのスカラ値を表す。1つの文字は4バイトで表現される）
``` rust
let letter: char = 'A';
let emoji: char = '😊';
```

## 複合データ型
複合データ型は複数の値をまとめて扱うデータ型です。

### タプル（Tuples）
異なる型の値をまとめて1つのグループとして扱う

``` rust
let tup: (i32, f64, char) = (500, 6.4, 'Z');
let (x, y, z) = tup;
println!("The value of y is: {}", y);
```

### 配列（Arrays）
同じ型の値を固定長でまとめて扱う
``` rust
let a: [i32; 3] = [1, 2, 3];
let first = a[0];
let second = a[1];
```

### ベクター（Vectors）
同じ型の値を可変長でまとめて扱う（標準ライブラリのVec型を使用）
``` rust
let mut v: Vec<i32> = Vec::new();
v.push(1);
v.push(2);
v.push(3);
println!("The second element is: {}", v[1]);
```

### 構造体（Structs）
複数の関連する値をひとつのグループにまとめて表現する
``` rust
struct Person {
    name: String,
    age: u8,
}
let person = Person {
    name: String::from("Alice"),
    age: 30,
};
println!("{} is {} years old", person.name, person.age);
```

### 列挙型（Enums）
特定の値の集合を定義し、それらの値を1つの型として表現する
``` rust
enum IpAddrKind {
    V4,
    V6,
}
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;
```

## その他のデータ型

その他の型は標準ライブラリで提供されるデータ型や、より複雑なデータ型を含みます。
### 文字列型（String Types）
Rustには主に2種類の文字列型があります。

文字列スライス（String Slices）: &str
``` rust
let s: &str = "Hello, world!";
```
String: 可変で所有権を持つ文字列型
``` rust
let mut s: String = String::from("Hello");
s.push_str(", world!");
```

### オプション型（Option Type）
オプション型は値が存在するかどうかを表現します。
値が存在する場合はSome、存在しない場合はNoneを使用します。
``` rust
let some_number: Option<i32> = Some(5);
let absent_number: Option<i32> = None;
```

### 結果型（Result Type）
結果型は操作が成功したか失敗したかを表現します。成功の場合はOk、失敗の場合はErrを使用します。
``` rust
use std::fs::File;
use std::io::ErrorKind;

fn main() {
    let f = File::open("hello.txt");

    let f = match f {
        Ok(file) => file,
        Err(error) => match error.kind() {
            ErrorKind::NotFound => match File::create("hello.txt") {
                Ok(fc) => fc,
                Err(e) => panic!("Problem creating the file: {:?}", e),
            },
            other_error => panic!("Problem opening the file: {:?}", other_error),
        },
    };
}
```

### 型エイリアス（Type Aliases）
型エイリアスは既存の型に別名を付けるための機能です。
``` rust
type Kilometers = i32;

let x: Kilometers = 5;
```

### ジェネリック（Generics）
ジェネリックは、具体的な型に依存しないコードを記述するための機能です。関数や構造体に対して使用できます。
``` rust
fn largest<T: PartialOrd>(list: &[T]) -> &T {
    let mut largest = &list[0];
    for item in list {
        if item > largest {
            largest = item;
        }
    }
    largest
}
```
Ubuntuで最も長いコマンドを探してみた

Qiitanのグッズが欲しいので誰得記事を投稿しています。

bashではbuilt-inの`compgen`というコマンドがあるそうで、コマンドのリストを返してくれます。

`compgen -c`: 実行できるコマンド
`compgen -a`: 実行できるエイリアス
`compgen -b`: 実行できるビルトイン
`compgen -k`: 実行できるキーワード

では、筆者のシステムで一番長いコマンドは何でしょうか。

```bash
$ compgen -abck | awk 'max<length($0){max=length($0);c=$0} END{print max, c}'
37 snap-store.ubuntu-software-local-file
```

`snap-store.ubuntu-software-local-file`が37文字でした。この他に37文字のコマンドはありません。snap-storeのソフトウェア管理のためのコマンドのようです。

```bash
$ compgen -abck | awk 'length($0)==37{print $0}'
snap-store.ubuntu-software-local-file
snap-store.ubuntu-software-local-file
```

ちなみに、2番目は`dbus-update-activation-environment`で35文字でした。
[Windows]PCでのルーティング設定

# 背景
WindowsPCをルータとして動作させ、有線接続した別のPCをインターネットに繋げたかったので備忘録かねて。

# やりたいこと
無線LANにつないだPC1からLANケーブルを伸ばしPC2と接続、PC2からインターネットへアクセスするために、PC1でルーティングさせたい。

### 環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/3a61d43e-5c6a-6e63-c6ac-0cae6f276788.png)

# PC1(Windows)側の設定
コントロールパネルから「ネットワークとインターネット」を開く
![スクリーンショット 2024-07-10 211714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/92af6869-c6e9-8caa-af38-23d6fa8bb861.png)

「ネットワークと共有センター」から使用しているWifiを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/1c58ddc5-2a20-152b-9c42-1c57256dcb39.png)

WiFiの「プロパティ」を選択して、「共有」タブの「ネットワークのほかのユーザーに、このコンピュータのインターネット接続をとおしての接続を許可する」にチェックを入れます。(管理者権限が必要になります。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/33cc5ad0-84a4-33b0-86eb-e8e3404930af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/2f1a672b-577a-75d5-4c8f-9a60c3e3f379.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/0774a1fd-ce92-2080-62a1-8a863aaced0e.png)

「OK」を押すと下記のようなホップアップが表示されます。これはPC1とPC2を接続している部分のIPアドレスが192.168.137.1になるということを表しています。(サブネットは/24)
なので、PC2側のNICにも192.168.137.0/24の範囲でアドレスを割り当てる必要があります。
またPC2側のNICのデフォルトゲートウェイは192.168.137.1になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/2fe6b476-c39b-1e7a-029a-61cb31a83ae8.png)

もう一つ、ウィンドウズキーとRを同時に押し、「services.msc」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/ea71b87c-b378-ad89-aaf8-d5227905c294.png)

サービスから「Routing and Remote Access」を選択し、サービスを開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/dec7fd22-ce7c-aea5-89ba-52f1dbf74ceb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2408438/040ebe01-f4f4-6572-ba89-2201162bef1b.png)

以上でPC1(Windows)側の設定は終了です。


# PC2(Linux)側の設定
PC2側では、NICに192.168.137.2を割り当て、デフォルトゲートウェイをPC1のIPに設定します。
```Linuxでのアドレス設定
sudo nmcli connection modify {コネクション名} ipv4.address "192.168.137.2"
sudo nmcli connection modify {コネクション名} ipv4.gateway "192.168.137.1"
sudo nmcli connection up {コネクション名}
```

以上でPC2(Linux)側の設定は終了です。
上記のように設定することでPC1でルーティングさせることができました。

# 参考資料
https://qiita.com/MakotoA67/items/936c551d90916775236a

https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/set-up-routing-remote-access-intranet
「今日はどこにする？」をなくしたい

## 「何食べる？」に前向きに返答したい

いつもお昼に繰り広げられる「何食べる？」「なんでもいい」の会話を前向きにしたい。むしろ、「パスタは？」「暑いし、中華もいいね」なんて、提案することができたら楽しいランチ時間になりそう…

そんな小さな悩みを解決する「今日のランチbot」を作りました。

## 実際のbot画面
https://x.com/magic___96/status/1811057110798717091


## 利用したアプリケーション
・LINEbot
・make（旧：intergtomat）
・Googleスプレッドシート

## 構成

### ①全体構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812441/28d3b1c8-3f9f-29e2-b3f7-18fbec9bd05e.png)

### ②LINEbotの設定
🔍[こちら](https://developers.line.biz/ja/docs/messaging-api/building-bot/#before-you-begin)の手順に沿って「Messaging APIチャネルの作成」「Webhook URLの発行」をします。

### ②Googleスプレッドシート

必要情報をGoogleスプレッドシートへ入力します。
🔍[丸の内エリアのレストラン・フードの紹介ページ](https://www.marunouchi.com/restaurants/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812441/d254532c-45a8-ef0f-5b97-e8c4e78c4ba4.png)

### ③条件
##### 1-1 LINEに食べたい種類を入力すると、登録されている店名・場所が返ってくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812441/7cd05481-abe6-91f1-a8e9-cda3b64f0f48.png)

##### 1-2 一覧に該当しない言葉を入力すると、「もう一度！」と返信がくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812441/af41530c-b7a6-ce44-8b28-ca8cfce4aded.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812441/e22884ea-2a45-abcb-1925-cae6e73f466e.png)

## 実際に使ってみた
実際に使ってみると、検索は種類の前に「さっぱり」のような、より曖昧な要素が必要だということがわったので、次はそこを改善したい🤔

## 今後改善したい点
・スプレッドシートではなく、GoogleMapのピン止めしたところから地域検索も含めてかえしたい。
・テキストだけでなくて位置情報も一緒に返したい
・可能であれば、ランダムにピックアップできるようにしたい

### さいごに
頭の中にアイデアはたくさんでるけど、手がついていかない・・・悔しい・・・
自身の今後の成長に期待だ！
A5:SQLを使って簡単にER図からテーブル定義書を作成する

# はじめに

今回は「A5:SQL Mk-2」でER図から簡単に以下のようなテーブル定義書を出力する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/7f98e49a-0911-ce37-97ac-5842b2a5d5dd.png)

:::note info
「A5:SQL Mk-2」のダウンロードページ
https://a5m2.mmatsubara.com/
:::


# 簡単にA5:SQLでのER図の書き方の手順を紹介

①上部メニューの「ファイル(F)」→「新規(N)」

![スクリーンショット 2024-07-09 232912.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/9cf847e9-726f-07cb-be41-5cba9773d647.png)

②「新規ドキュメント」のダイアログボックスから「ER図」を選択

![スクリーンショット 2024-07-09 233138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/2991f457-3029-bc82-7664-2229cbd2e7fc.png)


③「ER図プロパティ」のダイアログボックスに情報を入力して「✓OK」を選択

![スクリーンショット 2024-07-09 233648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/7c541863-fb60-6e13-7907-4208af869fb5.png)

④「エンティティの追加」を選択して、下の描画エリアの任意の場所でクリックすると図形が表示される

![スクリーンショット 2024-07-10 084753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/d56f3c12-caca-d781-32db-e71d193a41e5.png)

⑤表示された図形をダブルクリックすると、「プロパティ:」のダイアログボックスが表示される

![スクリーンショット 2024-07-10 230648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/b3513858-567a-7571-b04d-5d5802cda3a3.png)

⑥テーブル名やカラム名などの必要な情報を順次入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/00d74454-50cd-7aff-00bd-a5615c490f60.png)

.
.
.
.


上記の手順で作成したER図はこんな感じです。

![スクリーンショット 2024-07-09 231431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/2efb0479-4234-3718-edf2-1934f8aec464.png)

３つのテーブル定義とそのリレーションを記述しました。

リレーションは「リレーションシップの追加」をクリックして、「親エンティティ」→「子エンティティ」の順にクリックすることで追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/33bb3911-62ca-7598-c1b0-12e00ab0a81e.png)




# テーブル定義書の出力方法

ER図の作成が完了したら、上部メニューの「ER図(D)」→「エンティティ定義書を出力する(S)」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/0dd6f16f-bdce-0f8d-4f97-8fb3b7eb535f.png)


今回はExcelファイルで出力してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/25235961-b361-4f1c-7dc3-6b2a7661511b.png)



# 出力されたテーブル定義書

こちらが今回作成したER図から出力されたテーブル定義書です


#### サマリ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/229e115c-19b7-6d93-e56a-6bd525f4436a.png)

#### エンティティ一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/168cc68b-7880-49ae-402f-a0417dd4d277.png)

#### エンティティ情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509157/7f98e49a-0911-ce37-97ac-5842b2a5d5dd.png)

# おわりに

今回はA5:SQLを使って簡単にER図からテーブル定義書を作成する手順を紹介しました
ER図の作成さえしてしまえば、テーブル定義書を自動で作成できるので手間が省けてとても便利に感じます
A5:SQLは、ER図の作成以外にもGUIでSQL文を作成するなど様々なことができるツールなので今後も積極的に触れてみようと思います
ざっくりgRPCについて

# はじめに

こんにちは、モダンなマイクロサービスアーキテクチャで広く使用されている通信プロトコル、**gRPC**についてメモレベルになりますが書きます。

## gRPCとは？

gRPCは、HTTP/2をベースにしたオープンソースのRPCフレームワークです。以下の特徴があります。（***RPCは Remote Procedure callの略***）


- **高性能**: HTTP/2の特性を活かし、効率的な通信を実現。
- **多言語対応**: 多くのプログラミング言語をサポート。
- **プロトコルバッファ**: データのシリアライズにProtocol Buffers（protobuf）を使用。

## gRPCの特徴

### 高性能

gRPCは、HTTP/2の特性を活かして効率的な通信を実現します。HTTP/2のマルチプレキシング、ヘッダ圧縮、双方向ストリーミングなどの機能により、低レイテンシーで高スループットな通信が可能です。

### 多言語対応

gRPCは、多くのプログラミング言語をサポートしています。これにより、異なる言語で実装されたサービス間でもシームレスに通信することができます。公式にサポートされている言語には、C++, Java, Python, Go, Ruby, C#, Node.jsなどがあります。

### プロトコルバッファ

gRPCは、データのシリアライズにProtocol Buffers（protobuf）を使用します。protobufは、Googleが開発した効率的なシリアライズフォーマットで、データのサイズを小さくし、パース速度を高速化します。これにより、ネットワーク帯域の節約と処理速度の向上が期待できます。

## gRPCの基本構造

gRPCの基本的な構造は以下の通りです：

1. **サービス定義**: `.proto`ファイルでサービスとメッセージを定義。
2. **コード生成**: `protoc`コンパイラを使って、クライアントとサーバーのコードを生成。
3. **実装**: 生成されたコードを使って、クライアントとサーバーを実装。

### サービス定義

まず、gRPCサービスを定義するための`.proto`ファイルを作成します。`.proto`ファイルでは、サービスとそのメソッド、メッセージの構造を定義します。これにより、クライアントとサーバーがどのように通信するかを明確にします。

### コード生成

次に、`protoc`コンパイラを使って、クライアントとサーバーのコードを生成します。これにより、定義されたサービスとメッセージに基づいて、各言語に対応したコードが自動的に生成されます。

## まとめ

gRPCは、高性能で多言語対応のRPCフレームワークです。HTTP/2をベースにした効率的な通信、Protocol Buffersを使用したデータシリアライズ、多言語対応などの特徴を持っています。gRPCを使うことで、効率的なマイクロサービス間の通信を実現できます。これは面白い！！
Elixir Image で BlurHash による読込中用ぼかし画像を生成する

## はじめに

Elixir の Image モジュールで BlurHash によるぼかし画像を生成します

https://github.com/elixir-image/image

https://blurha.sh/

BlurHash の Web サイトより引用

> BlurHash is a compact representation of a placeholder for an image.

和訳

> BlurHashは、画像のプレースホルダーとして使われるコンパクトな表現方法です。

高画質画像の多い Web サイトを開いたとき、なかなか画像が読み込まれず、空っぽの枠だけが表示されることがあります

空っぽの状態というのがあまりカッコよくないため、低画質のサムネイルを先に読み込んでおくという手法もありますが、この場合、全画像のサムネイルをストレージに保存しなければなりません

そこで、 BlurHash では画像をぼかした低画質サムネイルを生成し、更にそれを短い文字列に変換してデータベース上に保存できるようにします

Webサイトに表示する際には文字列からサムネイルに変換して使用します

論より RUN なので、とにかく実行してみましょう

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/vix/blurhash.livemd

## セットアップ

必要なモジュールをインストールします

```elixir
Mix.install([
  {:image, "~> 0.52"},
  {:kino, "~> 0.13"}
])
```

- [Image](https://github.com/elixir-image/image): 画像処理
- [Kino](https://github.com/livebook-dev/kino): Livebook の UI/UX

## 画像の読み込み

任意の画像を読み込みます

BlurHash では不透明度（RGBA の A チャネル）を扱えないため、 RGB だけに分離します

```elixir
{puppies_img, _} =
  "/home/livebook/vix/puppies.png"
  |> Image.open!()
  |> Image.split_alpha()

puppies_img
```

![スクリーンショット 2024-07-08 23.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0982d827-241e-adf1-1c4d-d39d78e10ecb.png)

## BlurHash の文字列取得

`Image.Blurhash.encode` で画像を文字列化した値が取得できます

```elixir
{:ok, blurhash} = Image.Blurhash.encode(puppies_img)
```

実行結果

```elixir
{:ok, "LJGv9Eom_19J_IoNIUs=pV?Z9IoI"}
```

データベースにはこの文字列を保存しておきます

## BlurHash の画像取得

`Image.Blurhash.decode` で文字列を画像に変換します

第2引数は画像の幅、第3引数は画像の高さです

```elixir
{:ok, decoded} = Image.Blurhash.decode(blurhash, 400, 400)

decoded
```

実行結果

![スクリーンショット 2024-07-10 23.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f39a08cb-e9ce-3422-48a5-f5ad37782a93.png)

元画像と並べると、ぼかしていることが良くわかります

## ぼかし具合の制御

`Image.Blurhash.encode` のオプションでぼかし具合が制御できます

- x_components: 横方向のブロック数（1 〜 9）
- y_components: 縦方向のブロック数（1 〜 9）

ブロック数が小さいほどぼかしが強くなります

ぼかし具合がどれくらい変わるのか見てみましょう

:::note warn
1 * 1 を指定するとエラーになるので、 2 * 2 までを指定しています
:::

```elixir
9..2//-1
|> Enum.map(fn components ->
  puppies_img
  |> Image.Blurhash.encode(x_components: components, y_components: components)
  |> elem(1)
  |> Image.Blurhash.decode(400, 400)
  |> elem(1)
end)
|> then(&[puppies_img | &1])
|> Kino.Layout.grid(columns: 3)
```

![スクリーンショット 2024-07-11 0.00.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/43a326d2-0cb9-a59b-2871-d2f86c7fddc1.png)

左上は無加工の画像です

徐々にぼかしが強くなっているのが分かります

## まとめ

BlurHash を使うことで、画像を短い文字列に変換し、更にぼかし画像に変換できました

EC サイトのような画像が大量に並ぶケースで使えそうです
Sequence Makerで測定器とGPIB通信できない時はここをチェック！

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerはいろいろなインターフェイスに対応しているのですが、なかなかうまく測定器と通信できない時があります。この記事ではGPIB通信がうまくいかない時のチェック項目を解説していきます。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 接続ケーブルをチェック！
### ✅パソコンと測定器は正しく接続されていますか？
GPIB通信ではパソコンと測定器をGPIBケーブルで接続します。しかしPCにはGPIBのコネクターがないため、GPIB接続用の拡張ボードを増設するか、USB-GPIB変換器を使用する事になります。USB-GPIB変換器は直接測定器につないでも良いですし、複数台の測定器を接続する場合はGPIBケーブルを使用して数珠つなぎしてもOKです。GPIBコネクターには固定用のネジが付いていますので、コネクターが奥までしっかりと刺さっているか、ネジはしっかりリと締められているか確認しましょう。以下の記事も参考にしてください。

https://qiita.com/sequencemaker/items/08d1fb66d1ba284e00a4#gpib

## ドライバーをチェック！
### ✅ドライバーは正しく認識されていますか？
GPIBの増設ボードやUSB-GPIB変換器は専用のドライバーをインストールする必要があります。増設ボードや変換器のメーカーが提供しているハズなので、型名で検索するなどしてドライバーをダウンロート＆インストールしましょう。
例えばNATIONAL INSTRUMENTS社製の変換器を使用する場合は、「NI-488.2」というドライバーをインストールします。

https://www.ni.com/ja/support/downloads/drivers/download.ni-488-2.html#484357

また、CONTEC社製の変換器を使用する場合は、「ドライバライブラリ API-GPIB(WDM) for USB GPIB通信ドライバ 開発環境」というドライバーをインストールします。

https://www.contec.com/jp/download/contract/contract2/?itemid=5288f701-cd36-4bcc-971c-27668807eb78&downloaditemid=d2b18433-7360-4787-805f-7f529bbe110e

ドライバーがインストールできたら、デバイスマネージャーで正しく認識されているか確認しておきましょう。


## 通信設定をチェック！
### ✅測定器の通信設定はGPIBになっていますか？
測定器によってはGPIB以外にもRS-232CやLANなど他のインターフェイスを搭載しているものがあり、その場合どのインターフェイスを使用するか選択式の場合があります。測定器のマニュアルを参照し、使用するインターフェイスの設定が「GPIB」になっていることを確認しましょう。

### ✅測定器のGPIBアドレスはいくつになっていますか？
GPIB通信するためには、必ず測定器に重複しないユニークなGPIBアドレスを割り振る必要があります。測定器のGPIBアドレスが何になっているかを測定器のマニュアルを参照して確認しましょう。測定器の電源投入時に画面に表示される場合もあります。

### ✅Sequence Makerの「機器アドレス」設定は正しいですか？
機器アドレスは↑で確認した測定器のGPIBアドレスを選択します。Sequence Makerはこの機器アドレスが設定されている測定器に対して通信を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/806cb43c-7315-847d-845c-84761e050964.png)

### ✅「EOIを使用する」のチェックを入れてみる、または外してみる
測定器によっては、EOIを使用する製品と使用しない製品がありますので、試しに切り換えてみてください。


### ✅GPIBメーカーが提供しているテストアプリを使用してみる
多くのGPIBメーカーが動作確認用のテストアプリを提供していると思いますので、まずは*IDN?等を送ってみて、応答が正しく返ってくるか確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/adfa51ba-9896-65b4-f068-4661e2d1d326.png)

（上記はNATIONAL INSTRUMENTS社製のテストアプリです）


## まとめ
GPIBの通信はドライバーの認識とアドレス指定だけを注意すれば、比較的簡単に繋がる気がします。ただし、増設ボードや変換器はいいお値段がします。。。
ちなみにAmazonで検索すると比較的お安めな商品も見つかります。メルカリなんかでもたまに数千円程度で出品されている場合もあるので、定期的にチェックしてみてください。ちなみに筆者はAgilentの82357Bを所有して使っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/fd9919b4-1d23-6048-2186-f90d72776d71.png)
（https://www.amazon.co.jp/ より引用）

なお、82357Bを使用する場合はSequence Makerのインターフェイス設定で「VISA」を選択する必要があります。以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b#%E5%AE%9F%E9%9A%9B%E3%81%AB%E6%B8%AC%E5%AE%9A%E5%99%A8%E3%81%A8%E9%80%9A%E4%BF%A1%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
【GitHub】Issueテンプレートを作成する方法

## ファイルを作成する

以下のいずれかのファイルを作成します。

- `issue_template.md`
- `docs/issue_template.md`
- `.github/issue_template.md`
- `.github/ISSUE_TEMPLATE/issue_template.md`（ファイル名は任意）
- `docs/ISSUE_TEMPLATE/issue_template.md`（ファイル名は任意）

## 内容を記述する

```markdown:issue_template.md
---
name: Bug Report
about: Create a report to help us improve
title: '[BUG]: '
labels: bug
assignees: sample

---

## Summary
<!-- このIssueの目的と概要を簡潔に記述してください -->

## Details
<!-- 問題の詳細やIssueに対する具体的な要求を記述してください -->

## Steps to Reproduce
<!-- 問題の再現手順を記述してください -->
1. 
2. 
3. 

## Expected Behavior
<!-- 期待される挙動について記述してください -->

## Actual Behavior
<!-- 実際に発生した挙動について記述してください -->

## Screenshots
<!-- 問題を示すスクリーンショットがあれば添付してください -->

## Environment
<!-- 問題が発生した環境（OS、ブラウザ、バージョンなど）について記述してください -->

## Additional Context
<!-- その他、特記事項があれば記述してください -->

```

## 参考

https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/manually-creating-a-single-issue-template-for-your-repository
AtCoder 勉強記録[C++] その16

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## C - Switches
[C - Switches](https://atcoder.jp/contests/abc128/tasks/abc128_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, m, ss;
  cin >> n >> m;
  vec k(m);
  vector<vector<ll>> s(m, vector<ll> (0));
  for(int i = 0; i < m; i++){
    cin >> k[i];
    for(int j = 0; j < k[i]; j++){
      cin >> ss;
      ss--;
      s[i].push_back(ss);
    }
  }
  vec p(m);
  for(int i = 0;i < m; i++) cin >> p[i];
  vector<ll> jud(m);
  ll res = 0;
  for(int bit = 0; bit < (1 << n); bit++){
    bool jud = true;
    for(int i = 0; i < m; i++){
      ll sum = 0;
      for(int j = 0; j < k[i]; j++){
        if(bit&(1<<s[i][j])) sum++;
      }
      if(sum%2!=p[i]) jud = false;
    }
    if(jud) res++;
  }
  cout << res << endl;
}
```
### 解法
bit全探索を用いて解いていく。1から`N`のスイッチが`ON`かどうかで全探索を行う。
## C - Average Length
[C - Average Length](https://atcoder.jp/contests/abc145/tasks/abc145_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vec x(n), y(n);
  rep(i, n) cin >> x[i] >> y[i];
  vec o(n);
  rep(i, n) o[i] = i;
  double res = 0;
  ll cnt = 0;
  do{
    double dis = 0;
    for(int i = 0; i < n-1; i++){
      dis += sqrt((x[o[i]]-x[o[i+1]])*(x[o[i]]-x[o[i+1]]) + (y[o[i]]-y[o[i+1]])*(y[o[i]]-y[o[i+1]]));
    }
    res += dis;
    cnt++;
  } while(next_permutation(o.begin(), o.end()));
  res /= cnt;
  cout << fixed << setprecision(12);
  cout << res << endl;
}
```
### 解法
順列全探索を行い解いていく。すべての通り方において距離の計算を行い、平均値をとることで結果が求まる。
## C - Count Order
[C - Count Order](https://atcoder.jp/contests/abc150/tasks/abc150_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, a, b;
  cin >> n;
  vec p(n), q(n);
  rep(i, n) cin >> p[i];
  rep(i, n) cin >> q[i];
  vec order(n);
  rep(i, n) order[i] = i+1;
  ll cnt = 0;
  do{
    cnt++;
    bool pjud = true, qjud = true;
    for(int i = 0; i < n; i++){
      if(p[i] != order[i]) pjud = false;
      if(q[i] != order[i]) qjud = false;
    }
    if(pjud) a = cnt;
    if(qjud) b = cnt;
  } while (next_permutation(order.begin(), order.end()));
  cout << abs(a - b) << endl;
}
```
### 解法
順列全探索を用いて解いていく。`next_permutation`を使うと辞書順に順列の並び替えができるため、`P`、`Q`が1から`N`までの順列と一致する順番を調べることで結果が求まる。
Pythonでグラフ構造を扱えるNetworkXを試した

## NetworkX

NetworkXはネットワーク構造を扱うためのPythonパッケージです。

https://networkx.org/documentation/stable/index.html

#### グラフオブジェクトの作成

グラフ（ノードとエッジの集合）をGraphオブジェクトで定義できます。

```python
import networkx as nx
G = nx.Graph()
```

[Graph Generator](https://networkx.org/documentation/stable/reference/generators.html)をつかうことで、各種グラフを作ることができます。（Jupyter Notebookを使うと表示が簡単です）

```python
G = nx.balanced_tree(2, 4)
nx.draw(G)
```

<img width=500, alt=balanced_tree src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490241/cdf636e0-594b-c9f6-23da-ca299d23d2b2.png>

#### ノードの追加

グラフGにノードをつけることができます。

```python
# A. 数値1のノードを追加
G.add_node(1)
# B. 数値2, 3のノードを追加
G.add_nodes_from([2, 3])
# C. タプル(4, {"color": "red"}), (5, {"color": "green"})のノードを追加
G.add_nodes_from([(4, {"color": "red"}), (5, {"color": "green"})])
```

B, Cはエッジのない2点のノードになります。
<img width=300, alt=balanced_tree src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490241/8bdb16fa-5d05-ebaa-4350-dc3350b2f1f0.png>

#### エッジの追加

ノード間にエッジを追加することができます。

```python
G.add_edge(1, 2) # ノード間にエッジを追加
e = (2, 3)
G.add_edge(*e) # タプルで表されたノード間にエッジを追加
```

<img width=300, alt=balanced_tree src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490241/0ae1937b-6057-9f34-aef5-1505b582d47a.png>

#### ノード、エッジの削除

グラフのノードまたはエッジを削除できます。

```python
G.add_nodes_from([1, 2, 3, "a"])
G.remove_node(2)
list(G.nodes)  # [1, 3, 'a']
```

`remove_node(n)`, `remove_nodes_from([n,...])`, `remove_edge(n)`, `remove_edges_from([n,...])`などがあります。

#### グラフ構造を表現

グラフ表現のために決められたフォーマットから、グラフを作成できます。エッジリストや隣接ノードのディクショナリなどが使えます。

- エッジリスト

```python
edgelist = [(0, 1), (1, 2), (2, 3)]
H = nx.Graph(edgelist)  # create a graph from an edge list
list(H.edges()) # [(0, 1), (1, 2), (2, 3)]
```

- 隣接ノードのディクショナリ

```python
adjacency_dict = {0: (1, 2), 1: (0, 2), 2: (0, 1)}
H = nx.Graph(adjacency_dict)  # create a Graph dict mapping nodes to nbrs
list(H.edges()) # [(0, 1), (0, 2), (1, 2)]
```

#### エッジの重みを表現

エッジに重みをつけるには`add_weight_edges_from([...])`を使うことができます

```python
FG = nx.Graph()
FG.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
for n, nbrs in FG.adj.items():
   for nbr, eattr in nbrs.items():
       wt = eattr['weight']
       if wt < 0.5: print(f"({n}, {nbr}, {wt:.3})"
       
# (1, 2, 0.125)
# (2, 1, 0.125)
# (3, 4, 0.375)
# (4, 3, 0.375)
```

#### グラフの描画

グラフを描画するにはMatplotlibを使うことができます。

```python
import networkx as nx
import matplotlib.pyplot as plt

G = nx.petersen_graph()
subax1 = plt.subplot(121)
nx.draw(G, with_labels=True, font_weight='bold')
subax2 = plt.subplot(122)
nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='bold')
```

<img width=600, alt=balanced_tree src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490241/9dd11975-b2f4-cc70-3d5a-93f6b6a87c19.png>

Jupyter Notebookであれば`nx.draw(G,...)`だけで一つのグラフを描画できます。
Cookieの種類

## クッキーの種類

### ファーストパーティクッキー（First-Party Cookies）
アクセスしたウェブサイト自身が設定するクッキー

#### 用途
- セッション管理
- ユーザー設定の保存（言語設定、テーマ選択など）
- ショッピングカートの管理
- サイト分析（Google Analyticsなど）

## サードパーティクッキー（Third-Party Cookies）
アクセスしたサイトとは異なるドメインが設定するクッキー
SafariやFirefoxなど、多くのブラウザがサードパーティクッキーをデフォルトでブロックされるように変わってきている。

### 用途
- 広告ターゲティング
- リターゲティング
- ソーシャルメディアプラグイン
- 複数サイト間の行動追跡

### 比較

| 特徴              | ファーストパーティクッキー           | サードパーティクッキー               |
|-------------------|------------------------------------|-------------------------------------|
| 設定元            | 訪問したウェブサイト                    | 訪問サイトとは異なるドメイン              |
| 例                | "example.com"が発行するクッキー       | "ads.example.net"が発行するクッキー      |
| 主な用途          | セッション管理、設定保存、サイト分析       | 広告ターゲティング、行動追跡、SNSプラグイン  |
| セキュリティ       | 比較的高い                             | プライバシー懸念が高い                     |
| ブラウザでの扱い   | 一般的に許可される                      | 多くのブラウザでブロックされる傾向           |
npm ERR! code E401: GitHub Packagesへの認証エラーを解決

## はじめに
この記事では、npmでGitHub Packagesを利用しようとした際に発生するエラー npm ERR! code E401 と、その解決策について説明します。

## エラー内容
```
npm ERR! code E401
npm ERR! 401 Unauthorized - GET https://npm.pkg.github.com/download/@YOUR-USERNAME unauthenticated: User cannot be authenticated with the token provided.
```

このエラーは、npmがGitHub Packagesへの認証に失敗したことを示します。具体的には、以下の原因が考えられます。

・アクセス権限: あなたのアカウントに、プライベートレジストリのパッケージにアクセスする権限がない可能性があります。

・認証トークン: 使用している認証トークンが有効でない、または間違っている可能性があります。

## 解決策
```
$ npm login --scope=@NAMESPACE --auth-type=legacy --registry=https://npm.pkg.github.com

> Username: USERNAME
> Password: TOKEN
```

npm にログインして認証を行うには、npm login コマンドを使用します。USERNAME は GitHub ユーザー名に、TOKEN は personal access token (classic) に、PUBLIC-EMAIL-ADDRESS はメール アドレスに置き換えます。
【Typescript / nodejs】fsがエラーになる

# はじめに
未だに同じ問題で突っかかる自分への戒めの意味も込めてこの記事をしたためる。

# 再現
よし、nodejsでtypescriptのコードを書くぞー！
ファイルを操作するから `fs` を使おう！
はじめから使えるから`npm install`はいらないはず！

あとは`tsc`して……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1773132/65726e08-ac24-2706-cdc3-66b4ea2c5a29.png)

………:thinking:

# 原因
`fs`をはじめから使えるが、nodeが型を知らないのが原因だった。

# 解決
node用に型を`npm install` してやればいい。

```console
npm install --save-dev @types/node
```

これでOK:ok_hand:
sedで文字列抽出

`sed`コマンドを使用して、指定されたパターンに基づいて特定の文字列を抽出するには、次のようなコマンドを使用できます。

```bash
echo "aaa_bbb-ccc-dd1-ee2-ff3-123.456.789-auto202406202146" | sed 's/\(.*\)-[0-9]\+\.[0-9]\+\.[0-9]\+-.*$/\1/'
```

このコマンドの説明は以下の通りです：

1. `echo "aaa_bbb-ccc-dd1-ee2-ff3-123.456.789-auto202406202146"` は、サンプル文字列を出力します。
2. `sed 's/\(.*\)-[0-9]\+\.[0-9]\+\.[0-9]\+-.*$/\1/'` は、`sed`コマンドを使って文字列を変換します。
   - `\(.*\)` は、最初の部分をキャプチャします（`.*` は任意の文字列にマッチします）。
   - `-[0-9]\+\.[0-9]\+\.[0-9]\+-` は、`-数字.数字.数字-` のパターンにマッチします。
   - `.*$` は、文字列の残りの部分にマッチします。
   - `\1` は、キャプチャした最初の部分を参照します。

このコマンドを実行すると、指定された文字列から目的の部分が抽出されます。

指定されたパターンに基づいて特定の文字列（後半の部分）を抽出するためには、次のような`sed`コマンドを使用できます。

```bash
echo "aaa_bbb-ccc-dd1-ee2-ff3-123.456.789-auto202406202146" | sed 's/.*-\([0-9]\+\.[0-9]\+\.[0-9]\+-.*\)$/\1/'
```

このコマンドの説明は以下の通りです：

1. `echo "aaa_bbb-ccc-dd1-ee2-ff3-123.456.789-auto202406202146"` は、サンプル文字列を出力します。
2. `sed 's/.*-\([0-9]\+\.[0-9]\+\.[0-9]\+-.*\)$/\1/'` は、`sed`コマンドを使って文字列を変換します。
   - `.*-` は、文字列の最初の部分にマッチし、`-` で終わる部分までをキャプチャしません。
   - `\([0-9]\+\.[0-9]\+\.[0-9]\+-.*\)` は、`-数字.数字.数字-文字列` のパターンをキャプチャします。
   - `\1` は、キャプチャした部分を参照します。

このコマンドを実行すると、指定された文字列の後半部分が抽出されます。
Spring Boot + ThymeleafでWebjarsを使用

## pom設定
```pom.xml
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
	<version>5.0.2</version>
</dependency>
<dependency>
	<groupId>org.webjars</groupId>
	<artifactId>jquery</artifactId>
	<version>3.4.1</version>
</dependency>
```
* `version`には使用するBootstrap,jQueryのバージョンを指定

## Thymeleafでの設定
```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" th:href="@{/webjars/bootstrap/5.0.2/css/bootstrap.min.css}" />
</head>
<body>

<!-- jQuery -->
<script th:src="@{/webjars/jquery/3.4.1/jquery.min.js}"></script>
<!-- Bootstrap JS -->
<script th:src="@{/webjars/bootstrap/5.0.2/js/bootstrap.bundle.min.js}"></script></body>
</html>
```
* pomで指定したバージョンで`webjars`からインポートを行う
Go言語のstructを理解したい

## はじめに
こんにちは、皆さん！今回は、Go言語の重要なデータ構造である`struct`について学んでいきましょう。`struct`は、複数のフィールドを持つデータ型を定義するために使用されます。オブジェクト指向プログラミングのクラスに似ていますが、Go言語ではシンプルで効率的な方法でデータを扱うことができます。

## structの基本

まずは、`struct`の基本的な定義方法を見てみましょう。
```go:例
package main

import "fmt"

// Personという名前のstructを定義
type Person struct {
    Name string
    Age  int
}

func main() {
    // Person型の変数を作成
    p := Person{Name: "Alice", Age: 30}
    fmt.Println(p)
}
```
```:結果
{Alice 30}
```

この例では、`Person`という名前の`struct`を定義し、`Name`と`Age`という2つのフィールドを持っています。`main`関数内で`Person`型の変数`p`を作成し、フィールドに値を設定しています。

## フィールドへのアクセス

`struct`のフィールドにアクセスする方法を見てみましょう。


```go:例
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Alice", Age: 30}
    fmt.Println("Name:", p.Name)
    fmt.Println("Age:", p.Age)
}
```
```:結果
Name: Alice
Age: 30
```
この例では、`p.Name`と`p.Age`を使って`struct`のフィールドにアクセスしています。

## メソッドの定義

`struct`にメソッドを定義することもできます。以下の例を見てみましょう。


```go:例
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

// Person型に対するメソッドを定義
func (p Person) Greet() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    p := Person{Name: "Alice", Age: 30}
    p.Greet()
}
```
```:結果
Hello, my name is Alice and I am 30 years old.
```
この例では、`Person`型に対して`Greet`というメソッドを定義しています。`Greet`メソッドは、`Person`のフィールドを使って挨拶メッセージを表示します。

## ポインタレシーバ

メソッドを定義する際に、ポインタレシーバを使うこともできます。これにより、メソッド内で`struct`のフィールドを変更することができます。


```go:例
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

// ポインタレシーバを使ってメソッドを定義
func (p *Person) HaveBirthday() {
    p.Age++
}

func main() {
    p := Person{Name: "Alice", Age: 30}
    p.HaveBirthday()
    fmt.Println("After birthday:", p.Age)
}
```
```:結果
After birthday: 31
```

この例では、`HaveBirthday`メソッドがポインタレシーバを使って定義されています。メソッド内で`Age`フィールドをインクリメントすることで、`Person`の年齢を1歳増やしています。

## まとめ

Go言語の`struct`は、複数のフィールドを持つデータ型を定義するための強力なツールです。基本的な定義方法からフィールドへのアクセス、メソッドの定義、ポインタレシーバの使用方法までを学びました。これらの知識を活用して、より複雑なデータ構造を効率的に扱うことができるようになります。
kanikoとは

## Kanikoとは
Googleが開発したオープンソースのコンテナビルドツール。
Kubernetesが利用されるようになり、イメージのビルドもKubernetes上で行いたいという要望が増えたため作成されました。従来のDockerデーモンを利用した場合、特権権限の必要やセキュリティやキャッシュの問題が存在するため、kanikoが使用されます。

## kanikoの用途

- CI/CDパイプラインの構築
- Dockerコンテナのビルド
- Kubernetes
- AWSやなど


## 参考
https://qiita.com/Daniel_Nakano/items/4e4d33ed11b31616bc46
テキストファイルからpythonでエクセルの複数シートを作成する

改行したテキストファイルを元にエクセルのシートを作成する

***新規ブックから複数シートを一括作成する場合***

```python
import openpyxl

file_path = "test.txt"

with open(file_path) as f:
    sheetnames = f.read().splitlines()
        
wb = openpyxl.Workbook()  #新規ワークブックを作成
for sheet_name in sheetnames:  #シート名を取得
    wb.create_sheet(sheet_name)  #新規シートを作成

wb.remove_sheet(wb['Sheet'])  #元々ある不要なシートを削除

wb.save('ファイル名.xlsx')  #ファイル名をつけて保存
```

***既存ブックから複数シートを一括作成する場合***
```python
import openpyxl
from openpyxl import load_workbook

file_path = "test.txt" #テキストにシート名を登録しておく（シート名毎に改行）

with open(file_path) as f:
    sheetnames = f.read().splitlines()

wb = load_workbook('ファイル名.xlsx')  #既存のワークブックを開く
#wb = openpyxl.Workbook()  #新規ワークブックを作成

for sheet_name in sheetnames:  #シート名を取得
    wb.create_sheet(sheet_name)  #新規シートを作成

#wb.remove_sheet(wb['Sheet'])　#不要なシートを削除したい場合はコメントアウトを外してシート名を追記

wb.save('ファイル名.xlsx')  #ファイル名をつけて保存
```
ペットの情報が散乱してたのでLINEbot化してみた

こんにちは。
IT未経験のデジタル成長記録Vol.1です:fist_tone1:
今回は、**Make**を使って最近よく見る**LINEbot**作りをしてみました。

# １. LINEbot化をした経緯

私は実家で猫を飼っているのですが、家族全員で世話をしているため個々が持っている情報が散乱していました。
（母はエサ担当、私は保険担当…など）

そのため今回は、**ペット情報をまるっと網羅できるLINEbotづくり**に挑戦しました！

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">なんとか、、<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/fvMoQ73Aaj">pic.twitter.com/fvMoQ73Aaj</a></p>&mdash; れれ (@tezukar9) <a href="https://twitter.com/tezukar9/status/1811011585449808281?ref_src=twsrc%5Etfw">July 10, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# ２. 使用ツール
・Make
・LINE
・Google スプレッドシート
（・LINE official Account manager）

# ３. 導入したい機能
・保険情報のサイトへアクセス
・エサ購入サイトへアクセス
・天気予報（部屋の設定温度確認のため）
・猫の病状相談

# ４. 最終構造
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/36847fba-53d5-f59d-b6e8-3fe991021fbe.png)


# ５. 作成方法
## ① 天気情報のAPIキー取得
大人気の[**天気予報API**](https://weather.tsukumijima.net/)を使用しました。（場所は東京）

```ruby:URL
https://weather.tsukumijima.net/api/forecast/city/130010
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/fa9f2fe8-c020-dd37-ddb9-6a66b73b3c86.png)

## ② 猫の気になる症状まとめ（スプレッドシート作成）
下記サイトをもとに、Googleスプレッドシートを作成しました。

https://www.fpc-pet.co.jp/cat/disease

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/d92cd430-d312-7a5d-3a82-1a5e19260057.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/0e38c46b-d945-33d6-6b0b-984bdb5a1152.png)

### ③ LINEの返答作成
#### ・天気予報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/185bb91d-3e16-683d-a730-91892380c30c.png)

#### ・猫の症状検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/2812f0bb-fd2e-d83d-4b75-da41bf62d917.png)

### ④ LINE リッチメニューの作成
リッチメニューを作成することによって、保険サイトや餌の購入サイトへの直接のアクセスに加えて、botに聞く単語を決めることができます。
（人によって聞き方や打ち込む単語が違うことを想定して導入）

[**LINE official Account manager**](https://account.line.biz/login?![uploading...0]()redirectUri=https%3A%2F%2Fmanager.line.biz%2F
) にてリッチメニューを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/fdcbfb73-30a4-c4c1-d67b-afdaf304a5fe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/d06a4aef-f151-0325-1956-795eea46675c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/b569ba8e-daa6-74a2-dcac-5b78bf067869.png)

メニューの数、画像（デザイン）、公開期間などを設定します。

# ６. 完成ページ
![IMG_0888.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800463/611a8a17-6ad0-824e-da92-26eca0049272.jpeg)

# ７. 最後に
症状図鑑についてもリッチメニュー内に入れたかったのですが、現状のMakeでは`質問→回答→初めの工程に戻る`となってしまいます。
いずれは、「症状を調べたい」→「どんな症状ですか？」→「（症状詳細）」という流れで質問のやりとりができるように改良していきたいと思います。
投稿 10 Vite 2024/07/10

本日の勉強時間　2H

- **Vite「**次世代フロントエンドツール**」です。

すごく簡単にいうと、**フロントエンドの開発を行う上で必要な周辺環境を良い感じにまとめてくれているもの** です。

> フロントエンドの開発を行う上で必要な周辺環境
> 

具体的には以下のようなものが挙げられます。

- TypeScript, JSX, CSS, ...
- 開発サーバー
- HMR
- バンドラ
- プラグインシステム
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（58/100）

【58日目】
トピック 7：SAPS/4HANAにおける拡張計画（4/14）

≪問題58≫
MRP実行により、外部仕入先からフルパレットで供給された品目の不足が検出されました。確実にフルパレットを入庫するには、どうすればよいですか。
□発注点を使用する。
□固定ロットサイズ計算処理を使用する。
□最小発注数量を使用する。
□仕入先管理在庫に、MRPタイプを使用する。

≪解答≫
□発注点を使用する。
■固定ロットサイズ計算処理を使用する。
□最小発注数量を使用する。
□仕入先管理在庫に、MRPタイプを使用する。

≪解説≫
◆生産またはプロセス関連の制約により、パレットサイズやタンクの内容などが必要とされる場合には、固定ロットサイズを使用します。このロットサイズ計算処理において、入庫の調達数量は固定ロットサイズと等しくなる必要があります。未充足所要量を満たすためには、所要量に応じて、調達数量が固定ロットサイズと等しい入庫が少なくとも1つ登録される必要があります。
◆SAPS/4HANAにおいては、固定ロットサイズと等しくなるのは調達数量ではなく入庫の歩留まりです。そのため、組立不良が発生する場合、入庫の調達数量は固定ロットサイズよりも多くなります。
Amazon BedrockでClaude 3.5が使用不可になっている場合の対処方法

# 記事の内容
Claude 3.5が使えるようになったのでBedrockからアクセスしようとしたところ使用不可になっており、使えずに困ったの対処方法を記載します
![Claude3-5_使用不可.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476876/ba2a7821-a721-975d-bc13-f8895a38fe40.png)

# 対処方法
結論：AWSのサポートに問い合わせするしかありません

アカウントによっては使えない状態になっていることがあるとのことです
私の場合は以下のURLと一緒にサポートに問い合わせをしたところ、2営業日ほどで使えるようになりました

https://repost.aws/questions/QUDwW0HViRRUmyg4rduA6CpQ/bedrock-claude-3-5-not-available
Go言語の遅延実行（defer）を理解したい

## deferとは？
deferキーワードは、関数の終了時に実行される関数呼び出しを指定するために使用されます。deferを使うことで、リソースの解放やクリーンアップ処理を簡潔に記述することができます。
### 基本的な使い方
以下は、deferの基本的な使い方の例です。

```go:例
package main

import "fmt"

func main() {
    fmt.Println("start")
    defer fmt.Println("deferred")
    fmt.Println("end")
}
```
このプログラムの出力は以下のようになります。
```結果:結果
start
end
deferred
```
deferを使った関数呼び出しは、main関数の終了時に実行されるため、endの後にdeferredが出力されます。
## deferの利点
#### 1. リソースの解放
deferは、ファイルやデータベース接続などのリソースを確実に解放するために使用されます。以下は、ファイルを開いて読み取る例です。
```go:例
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("example.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close() // 関数終了時にファイルを閉じる

    // ファイルの読み取り処理
    // ...
}
```
この例では、defer file.Close()によって、関数が終了する際に必ずファイルが閉じられることが保証されます。
#### 2. 複数のdefer
複数のdeferを使用することも可能です。複数のdeferは、LIFO（Last In, First Out）順に実行されます。
```go:例
package main

import "fmt"

func main() {
    defer fmt.Println("first")
    defer fmt.Println("second")
    defer fmt.Println("third")
}
```
このプログラムの出力は以下のようになります。

```結果:結果
third
second
first
```
最後に指定されたdeferが最初に実行されるため、逆順に出力されます。
#### 3. エラーハンドリング
deferは、エラーハンドリングと組み合わせて使用することもできます。以下は、パニックが発生した場合にリカバリする例です。

```go:例
package main

import "fmt"

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from:", r)
        }
    }()

    fmt.Println("Starting the program")
    panic("Something went wrong!")
    fmt.Println("This line will not be executed")
}
```

このプログラムの出力は以下のようになります。
```結果:結果
Starting the program
Recovered from: Something went wrong!
```
deferを使ってリカバリ関数を指定することで、パニックが発生してもプログラムがクラッシュせずに処理を続行できます。
## deferの注意点
#### 1. 遅延実行のコスト
deferは便利ですが、頻繁に使用するとパフォーマンスに影響を与えることがあります。特に、ループ内で多用する場合は注意が必要です。
#### 2. 遅延実行のタイミング
deferは関数の終了時に実行されるため、関数の途中でリソースを解放したい場合には適していません。その場合は、明示的にリソースを解放する必要があります。
まとめ
deferは、Go言語における強力な機能の一つであり、リソースの解放やクリーンアップ処理を簡潔に記述するために非常に便利です。deferを適切に活用することで、コードの可読性と保守性を向上させることができます。
C_TS452_2021 - SAP Certified Application Associate - SAP S/4HANA Sourcing and Procurement対策（6/100）


【6日目】
トピック1：企業構造とマスタデータ（6/11）

≪問題6≫
打切品目の調達を避けるために使用できる項目はどれですか。
□管理コード
□権限グループ
□特殊調達タイプ
□品目ステータス

≪解答≫
□管理コード
□権限グループ
□特殊調達タイプ
■品目ステータス

≪解説≫
◆品目マスタレコードにおいて、品目ステータスを使用することで品目の調達をブロックすることができます。この設定は、クライアント全体に適用する（基本データビュー）ことも、プラント固有に適用する（購買またはMRPビュー）ことも可能です。