OmniAICreator/Qiita-1.07M huggingface dataset:
Azureハンズオン学習（無料枠範囲内・EntraID特化）

# Azureハンズオン学習
Azureを実務になった際に少しでも使えるようにするためAzure無料枠を使い学習していく。他社のドメイン確保など他社が絡むものは作業を行なったものとして進めていく

またAzureドメインは無料で簡単に作成できるため割愛

## 1.新しいユーザーの作成
ユーザー→「新しいユーザー」→情報入力

## 2.グループの作成
グループ→「新しいグループ」→情報入力しユーザーを割り当て

## 3.アプリケーションの登録
アプリの登録から「新規登録」
外部アプリケーションやサービスがAzureEntraIDを使って認証認可を行えるようにするための機能。
細かく見ていく、数個は下記に別途記載

**①認証と認可の管理**
OAuth2.0やOIDなどの認証プロトコルを使用して安全にアクセスを制御できる
**②APIの保護とアクセス制御**
必要に応じてアプリケーション専用のスコープやロールを定義し、どのユーザーやアプリがどのリソースにアクセス可能かを細かく管理できる
**③アプリケーション固有の設定**
アプリケーションとEntraIDのセキュアな連携
**④SSOの実現**
**⑤マルチテナント対応アプリケーションの開発**
マルチテナント設定を有効にすると他のEntraID（顧客や他社）からのユーザーもアプリケーションを使用可能になる
**⑥トークンベースのアクセス管理**
トークンを発行しアプリケーションに必要な情報を取得

## 4.SSO（シグナルサインオン）の設定
EntraIDに移動→アプリの登録→入力→登録
（リダイレクトURLはローカル環境の場合`http://localist`を設定）
その後、アプリの設定ページへ→認証メニューで設定
EntraIDトップページへ戻りエンタープライズアプリケーション→作成したSSOをクリック→ユーザーとグループ→割り当て→表示されたページにある「+ユーザーまたはグループの追加」→割り当てて保存
※Azure無料版ではグループ割り当てはできない


## 5.MFA（多要素認証）
設定したいユーザーを登録する→セキュリティ→表示された認証方法
ポリシー画面でポリシーやユーザーを設定
次回ログイン時から多要素認証が適用される、EntraID→監視（下の方）→サインインログで適用されているか確認
※Azure無料範囲内ではセキュリティから多要素認証を設定したが有料版になると詳細設定ができる、その際に今回使わなかった「多要素認証タブ」を使用する

## 6.グループベースのアクセス制御
（2でグループを作成しておく）
エンタープライズアプリケーション→対象のアプリを選択→ユーザーとグループの割り当て
※Azure無料版ではグループ割り当てはできない（やり方は上記で以上）

## 7.サインインと監査ログの確認
サインインログの確認はEntraID→サインインログ
※特定のユーザーやアプリケーションのログを確認
監査ログの確認はEntraID→監査ログ
※変更履歴（ユーザーの作成やロール割り当てなど）を確認

## 8.カスタムドメインの追加
ドメインの追加
EntraID→カスタムドメイン名→「+カスタムドメインの追加」→カスタムドメイン名を入力
ドメインの所有権を検証
カスタムドメイン名を追加した際にレコードタイプや名前、値、TTLの一覧が出てくる。それらをコピーしておく→ドメインを購入したプロバイダーの管理画面にアクセスしDNS設定をする
Azureポータルで検証
DNS設定が完了したらEntraID→カスタムドメイン名→追加したドメインを選択→確認ボタンを押す
※今回はハンズオンのためプロバイダー設定はできないためドメイン名確認できず。本番環境でもDNSが全世界に反映されるまで15分〜1時間掛かる

## 9.セキュリティ機能の確認
リスクのあるサインイン確認
EntraID→セキュリティ→レポート→危険なサインイン
※不審なサインインが記録されている場合に通知を確認
ユーザーリスク確認
EntraID→セキュリティ→レポート→危険なユーザー
※不正利用の可能性があるアカウントを確認

## 10.AzureリソースへのRBACを構成
Azureリソースに対してアクセス権を設定
RBACとはAzureなどのシステムでリソースへのアクセスを「ロール（役割）」に基づいて管理するアクセス制御の仕組み
リソースグループの作成
Azureポータル最初の画面でリソースグループ→新しいリソースグループ→名前とリージョンを指定して作成
RBACの設定
設定したいリソースグループを選択→アクセス制御（IAM）→ロールの割り当て追加→ユーザーまたはグループを選択→レビューと割り当て

## 配布される約3万円以内でできる事
・ユーザー管理とアクセス制御でAzure Entra ID P1プランを1〜2ヶ月利用
（1500〜3000円/月×必要ユーザー分）

・SSOや多要素認証、条件付きアクセスの有料枠を使うためプレミアムP1/P2プラン利用
（1500〜2300円/月）
学習済みのYoloをcoreML変換すると推定がうまく機能しなくなる場合の対処法

## 発生している問題
公式のYOLO(person,laptopとかを認識できるやつ)を変換すると正しく物体を検知できるが、学習させると検知した物体の座標等が正しく機能しない

## 上記の問題が発生する条件について
実機のiosのバージョンが17以降であり、pythonコードにてptファイルを指定してcoreMLに変換している場合


## 修正方法
**ターミナル**にて以下のコードを実行してくだい
※pythonにて import yoloやultralytics が使えるなら実行できると思います
```
yolo export model=best.pt format=mlmodel nms=True
```


## pythonでのcoreML変換と上記のコードによるyoloの微妙な違い
・変換後には、mlpackageではなくmlmodelとして変換される
(xcode上では微妙に違うがどちらもcoreMLの一種だと認識されているっぽい)
This content is blocked. Contact the site owner to fix the issue.



+ [This content is blocked. Contact the site owner to fix the issue.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000NOVO0A4)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/46d35121-08e8-43b4-8cac-f93b740fbc9b.png)

:::note
Could you please check the following:

-- Click on the browser 3 dotted menu on the top right

-- Settings

-- Privacy and security

-- Cookies and other site data

— Select “Allow all cookies”

— Disable all your browser extensions.

-- Clear the cookies, cache for "All time"

-- Make sure the browser is updated with the latest version.

-- Restart your browser

Still, if the issue persists kindly check the internet connection and connect to a different network and try opening in a different browser like incognito / Edge / Safari's latest version and then try again.  Thanks!

NOTE: Make sure to use the personal laptop and VPN is disconnected.
:::

# This content is blocked. Contact the site owner to fix the issue.

+ [Create PDF button on quotes giving an error](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000G5gfC)

:::note
Please register this URL as trusted.

Manage CSP Trusted Sites
https://help.salesforce.com/s/articleView?id=sf.csp_trusted_sites.htm&type=5
:::

[Having issues in the Playground Starter app. Says "content in blocked" and I can't install the Dreamhouse package.
](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erty1SAA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7dfbe9d2-3ba2-88fe-5601-255d2c3b68dd.png)

:::note
送っていただいたリンクが役に立ちました。モジュールとまったく同じではありませんが、開発環境にパッケージをインストールすることができました。スクリーンショット (「Dreamhouse」と「DreamHouse」) に基づいて若干異なるバージョンだったかもしれませんが、必要に応じてモジュールを完成させることができました。

04tB00000009UeXを使う
:::
rex0220 一括更新プラグインと計算式プラグインの連携 テーブル行の自動追加・更新

一括更新プラグインと計算式プラグインを連携して、テーブル行の自動追加・更新を行ってみます。

# 概要

[rex0220 計算式プラグイン テーブル行の自動追加・更新](https://qiita.com/rex0220/items/6b4fe34d184010c6697b) で作成したしくみを一括更新プラグインに連携させてみます。

一覧画面でレコードを選択して一括更新で日付と出欠を指定すると、計算式プラグインと連携してテーブル行の自動追加・更新を行います。


- 出席を指定するレコードを選択して、「出欠更新」をクリック
- 「出欠更新」のダイアログで、日付と出欠を指定して更新
- 一覧画面

![2025-01-16_08h29_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6defb614-e1af-733b-3fb4-c10bf2c21885.png)

![2025-01-16_08h35_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d885edbc-7700-6ee4-00dd-d9304a5e1be2.png)

![2025-01-16_08h48_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6875a963-409b-b57f-35cd-c220c0125cb6.png)

![2025-01-16_08h32_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8762663e-aabd-00f9-4762-5943c20c4463.png)

# 操作例

![2025-01-16_08h30_35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1378709c-bacd-602d-1e45-f857351d6a5d.gif)

# 一括更新プラグイン設定

「レコード選択」をチェックすると、一覧画面表示時に「選択したレコードのみ一括処理」がチェックされます。

![2025-01-16_08h42_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e2046c2b-856e-fc1d-9c88-2ec000f11329.png)

「計算式プラグイン連携」をチェックすると、一括更新で項目変更後に計算式プラグインが動作します。

- 日付：計算式
    - TODAY() ： ダイアログに当日日付を初期表示
- 出欠：計算式
    - "出席"　：　ダイアログに"出席"を初期表示

![2025-01-16_08h42_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9fc01931-df05-7f5a-33ad-d0d5e62f37ba.png)

# 計算式プラグイン設定

[rex0220 計算式プラグイン テーブル行の自動追加・更新](https://qiita.com/rex0220/items/6b4fe34d184010c6697b) の設定と同じ

![2025-01-15_12h23_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/34084045-a410-34b8-ead5-b0012d270236.png)

```.js
OPTION: 循環参照を許可

// 出欠一覧 SUBTABLE (editable)
TABLE_SORT(出欠一覧,
  TPFILTER(日付_一覧),
  TPSORT(日付_一覧)
)

// 計算処理用 SINGLE_LINE_TEXT (hide)
IF(日付,
  LET(
    rno, FIRSTIF(日付_一覧==日付,ROWNO(出欠一覧)),
    IF(rno === "",
      LET(
        row, JSON_S(ARRAY(DIC(
          "日付_一覧",DATE_FORMAT(日付),
          "出欠_一覧",出欠
        ))),
        FSET_TADD(出欠一覧, row)
      ),
      FSET(出欠_一覧, 出欠, rno)
    )
  )
)
```
EasyEDA Pro を使ってみよう！ 記事 index

JLCPCB に発注する時に便利なPCB CAD である EasyEDA。

ここではその中の Pro 版について、 ノウハウも溜まってきたので記事の一覧を作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e402eb18-3943-fc0a-a878-c5790fa1d2eb.png)


- 「EasyEDA Pro Online 版を使う その1 Schematic」
  - https://qiita.com/nanbuwks/items/106caabb9dc36f09fa5d
- 「EasyEDA Pro Online 版を使う その2 パーツを選ぶ」
  - https://qiita.com/nanbuwks/items/903c52cf4a56160e2930
- 「EasyEDA Pro Online 版を使う その3 デバイスライブラリを作成する」
  - https://qiita.com/nanbuwks/items/96ba4c0b57bd644b6989
- 「EasyEDA Pro Online 版を使う その4 PCBを作成する」
  - https://qiita.com/nanbuwks/items/7897a852287b81f15ee1
- 「EasyEDA Pro Online 版を使う その5 ネジ穴やロゴをパーツとして追加する」
  - https://qiita.com/nanbuwks/items/78856d1e734471064e18
- 「EasyEDA Pro Online 版を使う その6 JLCPCB に発注する」
  - https://qiita.com/nanbuwks/items/71e9da3c648eb09f2ad1
- 「EasyEDA Pro Online 版を使う その7 プロジェクトを共有する」
  - https://qiita.com/nanbuwks/items/0d17a69c4ba77cef2cd8
- 「STEP to STEP テキスト： JLCPCB で NFC 名刺を PCBA」
  - https://qiita.com/nanbuwks/items/83ca803efb51f5b11f91
- 「JLCPCB にパーツを送る」
  - https://qiita.com/nanbuwks/items/032e059757847cf40f5a 
- 「EasyEDA Pro を使ってカンタンにカラー PCB を作成する」
  - https://qiita.com/nanbuwks/items/6de35da934399483b66b
Flutterでファイルを読み込む時にエラー

コード上で```final String rankJson = await rootBundle.loadString("assets/json/ranking.json");```
で以下のエラーが発生

```
Unable to load asset ~ The asset does not exist or has empty data (even though the file is there)
```

原因はpubspeck.yamlにassetsを指定していなかったことだった
  assets:
    - assets/
    - assets/json/　　　　←　追加
個人的な備忘録：環境変数とPATH設定をわかりやすく解説し、実際にMacBookでPATHを通してみた

## はじめに

コンピュータを操作していると、「環境変数」や「PATHを通す」という言葉を耳にすることがあります。***これらは、プログラムやシステムの動作に欠かせない基本的な概念です。***

:::note
**本記事では、それぞれの意味と、実際にPATHを通す方法について解説します。**
:::

***後半では、私のMacBookを使ってPATHを通す手順を具体的にご紹介しますので、ぜひ最後まで読んでみてください。***

## 書こうと思ったきっかけ
「環境変数」や「PATHを通す」について、誰かに説明しようとした際、うまく言語化できないことに気づきました。

:::note warn
***これらの概念は、なんとなく理解しているつもりでも、「細かい要件に沿ってPATHを通してください」と求められると、すぐに対応できず、少し時間がかかってしまうのが正直なところです。***
:::

そこで今回、自分の理解を振り返りつつ整理するために、記事としてアウトプットすることにしました。**この内容が、同じような悩みを持つ方の参考になれば幸いです。**

## 環境変数とは？
環境変数とは、オペレーティングシステムやプログラムに特定の情報を提供するための仕組みです。

***簡単に言えば、「名前」と「値」のペアで構成された設定情報のことです。***

### 代表的な環境変数の例

- **PATH**  
  コマンドやプログラムを探すディレクトリを指定します。
- **HOME**  
  ユーザーのホームディレクトリを表します。
- **LANG**  
  システムの言語設定を表します。

### 環境変数の確認例

以下のコマンドを使用して、環境変数の値を確認できます：

```bash
# 環境変数の確認例
$ echo $HOME
/home/username
```

:::note warn
***プログラムはこの情報を利用して適切に動作します。***
:::

### PATHを通すとは？
PATH は環境変数の一種で、コマンドやプログラムがどのディレクトリにあるかをシステムが探すための「検索パス」を示します。

**例えば、次のようにPATHが設定されているとします：**

```bash
/usr/local/bin:/usr/bin:/bin
```

この場合、コマンドを実行すると、システムは `/usr/local/bin`、`/usr/bin`、`/bin` の順番でコマンドを探します。

#### PATHを通す目的

特定のプログラムやコマンドが特定のディレクトリにインストールされている場合、そのディレクトリをPATHに追加することで、どこからでも簡単に実行できるようになります。

**例：PATHを通す前後の比較**

- **PATHを通す前**

```bash
$ /opt/myprogram/bin/mycommand
```

- **PATHを通した後**

```bash
$ mycommand
```

## 実際にPATHを通してみた

### 現在のPATHを確認
まず、現在のPATH環境変数の内容を確認します。

```bash
$ echo $PATH
/usr/local/bin:/usr/bin:/bin
```

ここでは、`/usr/local/bin`、`/usr/bin`、`/bin` が現在PATHに設定されていることが分かります。

### 一時的にPATHを追加
次に、`/home/user/scripts` ディレクトリを現在のセッションでのみ有効な方法でPATHに追加します。

```bash
$ export PATH=$PATH:/home/user/scripts
```

これで、`/home/user/scripts` 内のプログラムがコマンドとして実行可能になりました。

例として、`/home/user/scripts` 内にある `myscript.sh` を実行してみます。

```bash
$ myscript.sh
Hello, this is my script!
```

一時的にPATHを通す方法では、シェルセッション（ターミナルを開いている間）でのみ有効です。ターミナルを閉じるとこの設定はリセットされます。

### 永続的にPATHを追加
ターミナルを閉じても設定がリセットされないようにするには、シェルの設定ファイルに追記します。

Bash を使用している場合は、`~/.bashrc` を開きます。

```bash
$ vim ~/.bashrc
```

ファイル末尾に以下を追加します。

```bash
export PATH=$PATH:/home/user/scripts
```

設定をすぐに反映させるには、以下を実行します。

```bash
$ source ~/.bashrc
```

### 確認
PATHに `/home/user/scripts` が正しく追加されたか確認します。

```bash
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/home/user/scripts
```

これで、毎回ターミナルを開いた際に `/home/user/scripts` 内のプログラムが実行可能になっています。

例として、ターミナルを再起動後に再び `myscript.sh` を実行できます。

```bash
$ myscript.sh
Hello, this is my script!
```

:::note info
***同様の手順を応用すれば、他のディレクトリにあるプログラムも簡単に実行可能になります。***
:::

## まとめ
環境変数は、システムの設定やプログラムの動作を支える重要な仕組みです。特に、PATHはコマンドをスムーズに実行するために欠かせない存在です。

:::note warn
**今回ご紹介した手順を使えば、特定のディレクトリにインストールされたプログラムを、どこからでも簡単に利用できるようになります。**
:::

***今後も、こうした基礎的な内容を積極的にアウトプットしながら、自分の知識を整理し、振り返るきっかけを作っていきたいと思います。***
paizaラーニングレベルアップ問題集の「1行の出力」をやってみた。

paizaラーニングレベルアップ問題集の[1行の出力](https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__stdout_3)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/d_rank_level_up_problems/d_rank_level_up_problems__stdout_3
- - -
###### C
```c
#include <stdio.h>

int main() {
	printf("%d\n", 813);
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	cout << 813 << endl;
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		Console.WriteLine(813);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	fmt.Println(813)
}
```
- - -
###### Java
```java
public class Main {
	public static void main(String[] args) {
		System.out.println(813);
	}
}
```
- - -
###### JavaScript
```js
console.log(813);
```
- - -
###### Kotlin
```kotlin
fun main() {
	println(813)
}
```
- - -
###### PHP
```php
<?php
	echo 813 . PHP_EOL;
?>
```
- - -
###### Perl
```pl
print 813 . $/;
```
- - -
###### Python3
```py
print(813)
```
- - -
###### Ruby
```rb
p 813
```
- - -
###### Scala
```scala
object Main extends App{
	println(813)
}
```
- - -
###### Swift
```swift
print(813)
```
正しく分割された2byteをshort (16bit)に戻して遊ぶ。(教科書的な内容)


x M5NanoC6での予定は、未定


オンラインコンパイラ paiza


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    short a;
    
    a = 0x04 * 256 + 0xD2; //1234
    
    printf("%d\n",a);
}


```

```

1234


```


・



・



おまけ(いろいろ説明すると長くなるが、なぜか上手くいく)
----


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    short a;
    
    a = 0xff * 256 + 0xff; //1234
    
    printf("%d\n",a);
}


```


```

-1

```
FlexGrid のセルを選択したときに行全体を強調表示する方法

**FlexGrid のセルを選択したときに行全体を強調表示する方法**はいくつかあります。代表的なアプローチを順番にご紹介します。

---

## 1. `SelectionMode` を利用する方法

FlexGrid のプロパティ `selectionMode` を「行選択」に指定すると、セルをクリック（選択）した際に、その行がまるごと強調されるようになります。  
たとえば、以下のように設定します。

```html
<wj-flex-grid
  items-source="yourData"
  selection-mode="Row">
</wj-flex-grid>
```

これだけで、セルを選択しても行全体が選択状態となり、Wijmo 標準のスタイルでハイライトされます。

---

## 2. CSS によるカスタマイズ

Wijmo FlexGrid は「選択状態」に対して、`wj-state-selected` という CSS クラスを付与します。  
そのため、選択時の色を独自に変更したい場合は、以下のように CSS を上書き（オーバーライド）します。

```css
/* 選択状態のセル全てに対して色を変更 */
.wj-flexgrid .wj-state-selected {
  background-color: #B6CDFF; /* お好みの色に変更 */
  color: #000;              /* 文字色の指定など */
}
```

ただしこの場合、セル単位で選択していると行全体ではなく「選択セルのみ」が着色されます。  
行全体を常に強調したい場合は、先述の `selectionMode="Row"` を使うか、下記のように JavaScript／TypeScript で明示的に行全体にスタイルを適用する実装を行う必要があります。

---

## 3. `itemFormatter` で強調表示する方法

`itemFormatter`（または `cellStyleFunction`）を使って、選択中の行だけ背景色を塗る方法です。  
行全体を強調表示したい場合は、以下のように実装します。

```js
// FlexGrid のインスタンスを生成
const grid = new wijmo.grid.FlexGrid('#theGrid', {
  itemsSource: yourData,
  // ...
  itemFormatter: (panel, r, c, cell) => {
    // セルがデータの表示領域 (CellType.Cell) の場合のみ
    if (panel.cellType === wijmo.grid.CellType.Cell) {
      // 現在選択されている行かどうかをチェック
      if (r === grid.selection.row) {
        cell.style.backgroundColor = '#B6CDFF'; // お好みの色
      } else {
        cell.style.backgroundColor = '';
      }
    }
  }
});
```

この場合、個々のセル描画時に「このセルが選択中の行に属するか？」をチェックし、該当する場合は背景色をセットしています。  
`selectionMode` が「Cell」や「CellRange」でも、上記のように書くことで “選択されたセルが属している行” を強調可能です。

---

## まとめ

1. **行全体を簡単に強調表示**したいのであれば、  
   \- **`selectionMode="Row"`** を設定すると、標準のハイライトが行単位で適用されます。

2. **デフォルトの強調色を変更したい**場合は、  
   \- **CSS で `.wj-state-selected`** を上書きするか、  
   \- **`itemFormatter`** を使って手動で色を指定します。

3. **セル選択(セル単位)でも “選択中の行” を強調したい**場合は、  
   \- **`itemFormatter`** を使って `if (r === grid.selection.row) { ... }` のように行ごとに色を塗り替えます。

これらの方法を組み合わせることで、FlexGrid の行強調をより柔軟にカスタマイズできます。ご要望に合わせて使い分けてみてください。
負の数の算術左シフトで遊ぶ。(教科書的な内容)


x M5NanoC6での予定は、未定

目的
教科書的に
正しく2倍になる事を確認する



オンラインコンパイラ paiza


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    int a;
    
    a = -32 << 1;
    
    printf("%d\n",a);
}


```


```

-64


```
正の数の算術左シフトで遊ぶ。(教科書的な内容)


x M5NanoC6での予定は、未定

目的
教科書的に
正しく2倍になる事を確認する



オンラインコンパイラ paiza


```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    int a;
    
    a = 32 << 1;
    
    printf("%d\n",a);
}


```


```


64


```
【C】文字を書き換えするときにエラーと対処法

なんか地味なエラーが出てきました.
```
test.c: In function 関数名:
test.c:49:48: error: assignment to 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
   49 |             assembly_buf[strlen(assembly_buf)] = "\0";
```
該当箇所
```c:test.c
char buf[1024];
Read_Line(path,buf,search(path,div_buf,max),1024);
//\n消去
assembly_buf[strlen(assembly_buf)-1] = "\0";
```
`char*`が`char`に入っている的なエラーです。

エラーを治したプログラム
```c:test.c
char buf[1024];
Read_Line(path,buf,search(path,div_buf,max),1024);
//\n消去
buf[strlen(buf)-1] = '\0';
```
これは
```c
buf[strlen(buf)-1] = '\0';
```
の部分の`'\0'`が`"\0"`から`'\0'`に代わっています。
どうやら`'\0'`は文字のリストではなく文字単体で
`"\0"`は文字のリストで文字単体ではないようです.

`python`では同じだったのでこんなエラーは意外でした
Dockerがmalware扱いされて起動できなくなる事象の解決方法

ある日、Dockerを起動しようとすると
Dockerがマルウェア扱いされて、延々とエラーアラートが表示される地獄状態に！😭
［2025/01/14時点］

色々調べていると１月８日以降に発生した事象らしい😔
一応、解決できたので、解決手順を以下にメモしておきます✍️

まずcheck.shという空のファイルを作成し
ファイル管理者権限を変更　[参考](https://do-zan.com/mac-terminal-chmod/)

```
Air:Docker root# chmod 755 check.sh
```

そして以下のスクリプトをcheck.shにペースト

```
#!/bin/bash

# Stop the docker services
echo "Stopping Docker..."
sudo pkill '[dD]ocker'

# Stop the vmnetd service
echo "Stopping com.docker.vmnetd service..."
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.vmnetd.plist

# Stop the socket service
echo "Stopping com.docker.socket service..."
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.socket.plist

# Remove vmnetd binary
echo "Removing com.docker.vmnetd binary..."
sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd

# Remove socket binary
echo "Removing com.docker.socket binary..."
sudo rm -f /Library/PrivilegedHelperTools/com.docker.socket

# Install new binaries
echo "Install new binaries..."
sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/PrivilegedHelperTools/
sudo cp /Applications/Docker.app/Contents/MacOS/com.docker.socket /Library/PrivilegedHelperTools/
```

そしてcheck.shを実行
```
Air Docker % ./check.sh 
Stopping Docker...
Password:
Stopping com.docker.vmnetd service...
Stopping com.docker.socket service...
Removing com.docker.vmnetd binary...
Removing com.docker.socket binary...
Install new binaries...
cp: /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd: No such file or directory
cp: /Applications/Docker.app/Contents/MacOS/com.docker.socket: No such file or directory
```

これでエラーアラートウィンドウは表示されなくなり
Dockerも正常に戻りました🤗

以上です🙇‍♂️

[解決法の記事：acassioaraujo様](https://github.com/docker/for-mac/issues/7520)
Macbookでsuのpasswdを設定した

Dockerのバグ対処のため
Terminalでsuになる必要があったのですがSorryと言われてしまう😳

```
Air Docker % su -
Password:
su: Sorry
```

なんで？🤔

どうやら私の購入したMacOSでは
デフォルトでrootのパスワードが設定されてないらしいです😔

というわけでrootのpasswdを設定🖋
```
Air Docker % sudo passwd root
Password:
Changing password for root.
New password:
Retype new password:
```

```
Air Docker % su -
Password:
Air:~ root# 
```

オッケー❗️🤗

[参考にさせていただいた、いづ様のエントリー](https://izumii19.hatenablog.com/entry/2018/11/27/171545)
Xcodeでのプレビュー表示エラーの対処をしました

Xcodeでアプリ開発を行なっている際に
ディレクトリの削除手順に失敗し
アプリプレビューの表示ができなくなり
アプリ本体の開発に手が回らなかったです。

まず、「build error」になったので
/Users/(UserName)/Library/Developer/Xcode/DerivedData
で、該当のアプリのディレクトリを削除しました。

Xcodeを再起動したら時間はかかりましたが
Build Errorはちゃんと治りました。


また後日
XcodeのSwiftUIファイルで
「Cannot preview in this file」というエラーが表示されるようになり
またもやプレビューが表示されなくなりました。

こちらは
Xcodeのキャッシュが原因でプレビューが正しく動作しなくなる事象らしいです。

解決方法としては
前回と同じく
Finderで以下のパスに移動し
~/Library/Developer/Xcode/DerivedData/

該当プロジェクトのフォルダを削除します。

Xcodeを再起動し、正常にプレビューが表示されることを確認しました。

以上です。
個人的な備忘録：ViとVimの違いについて考え、自分なりに深掘りしながら記事としてまとめてみた

## はじめに
Viはシンプルで軽量な基本的テキストエディタで、古い環境や最低限の編集作業に適しています。***一方、Vimは拡張性が高く、現代の開発者やシステム管理者にとって非常に便利なツールです。***

:::note
**実は私は「Vimmer（※）」と思われがちですが、実際のところ、ViとVSCodeだけでこれまでやってきた人間です。**
:::

※Vimmerとは、テキストエディタ「Vim」を使用する人のことを指します。

***この記事は個人レベルの備忘録としてまとめたものですが、どなたかの技術の支えになれば幸いです。***

## 書こうと思ったきっかけ
最近、MacBookなどで他の人がどのようなエディタを使っているのか気になり、いろいろと質問する機会がありました。

:::note warn
***その中で、以前から「Vimが便利」という話を聞いてはいたものの、実際に操作画面を目にすると、その拡張性の高さとスピーディーなコマンド操作に感動しました。***
:::

この体験を通じて、「**Viエディタを使っていた自分**」に対して、Vimの魅力を再認識させたいと思い、この記事をまとめることにしました。

## 私がViを使っていた理由
では、なぜ私が今までViエディタを使っていたのかというと、多くのサーバーを管理していた経験があったからです。

***Viエディタは多くの環境で標準インストールされており、追加の作業をせずにそのままファイルを編集することができます。***

一方で、Vimエディタは標準でインストールされていない場合があり、その場合は手動でインストールする必要があります。

:::note alert
**しかし、この「インストール」という作業自体がシステムの変更作業に該当します。そのため、Vimをインストールした後に何らかの不具合が発生すると、システム障害に繋がるリスクがあります。**
:::

このような背景から、私は無意識のうちにViばかりを使うようになり、その延長でMacBookでもViエディタを使い続けていた、という経緯があります。

## そもそも、Vi と Vim とは？

### Vi (Visual Editor)

#### 特徴
- **軽量で高速**: シンプルな設計で、システムリソースをほとんど消費しません。
- **基本的な機能のみ**: テキスト編集に必要最低限の機能を提供します。
- **UNIXの標準**: ほとんどのUNIXシステムで利用可能。

#### メリット
- ほとんどのUNIXベースのシステムで利用可能（互換性が高い）。
- 必要最低限の機能で軽量。

#### デメリット
- 拡張性がなく、現代的な機能（コード補完、シンタックスハイライトなど）がない。

### Vim (Vi Improved)

#### 特徴
- **シンタックスハイライト**: コードを見やすく色分け。
- **コード補完**: プログラムを書く際に自動補完が可能。
- **プラグイン対応**: 様々な機能を追加できる。
- **多言語サポート**: メニューやメッセージが多言語対応。
- **多彩な操作性**: 履歴、複数バッファ、検索と置換の拡張機能など。

#### メリット
- Viよりも高機能で柔軟。
- 開発者やシステム管理者に人気。
- プラグインを使ってさらに拡張可能。

#### デメリット
- 初心者には設定や操作が少し難しい。
- Viに比べて若干重い（ただし、近代的な環境ではほとんど問題にならない）。

## **主な違いのまとめ**

ここまでの内容を、簡単に表形式でまとめましたので参考にしてください。

| **項目**       | **Vi**                                    | **Vim**                                                           |
|----------------|-------------------------------------------|--------------------------------------------------------------------|
| **登場時期**   | 1976年                                    | 1988年                                                            |
| **開発者**     | Bill Joy                                  | Bram Moolenaar                                                    |
| **機能**       | 基本的なテキスト編集機能のみ              | 拡張された編集機能、シンタックスハイライト、プラグインなど          |
| **拡張性**     | なし                                      | 高い                                                              |
| **動作速度**   | 非常に軽量                                | Viよりやや重い（現代環境では問題なし）                              |
| **主な用途**   | 基本的なシステム管理や設定ファイルの編集  | プログラミングや大規模なテキスト編集                                |

## まとめ
ここまでお読みいただき、ありがとうございました。

:::note info
**普段使いでは Vim を選ぶのがおすすめですが、Vi は標準でインストールされている環境が多いため、基本的な操作を覚えておくと非常に役立ちます。**
:::

***今後も基礎的な内容を積極的にアウトプットしながら、自分の知識を整理し、振り返りのきっかけを作っていきたいと思います。***
Docker環境でMySQLに接続しようとしたら「Public Key Retrieval is not allowed」と出力された


## はじめに
Docker環境でMavenコンテナからMySQLコンテナに対して、JDBCを使用して接続しようとした際、以下のエラーに直面したので備忘として残したいと思います。

```
Failed to initialize pool: Public Key Retrieval is not allowed
```

## 結論
`allowPublicKeyRetrieval=true`というオプションを追加することで解決できました。

## 実行環境
私が試した環境は以下の通りです：

- **Docker**: コンテナ環境で実行
- **MySQL**: 8.x系
- **JDBCドライバ**: 最新バージョンを使用
- **設定ファイル**: `docker-compose.yml`内で接続URLを記述
  ```yaml
  services:
    app:
      image: your-app-image
      environment:
        DB_URL: jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true
        DB_USER: root
        DB_PASSWORD: password
  ```

## エラーの原因
エラーの原因を調べてみたところ、この問題はMySQL 8.x系の認証方式が影響していることが分かりました。  
MySQL 8.xでは、デフォルトで`caching_sha2_password`という認証方式が採用されています。この認証方式では接続時にサーバーの公開鍵を取得する必要がありますが、JDBCの接続設定で公開鍵取得が許可されていないと接続が失敗してしまいます。

このエラーに対応するためには、JDBC接続URLに「公開鍵の取得を許可する設定」を追加する必要があるようでした。

## 解決方法
試行錯誤の末、`allowPublicKeyRetrieval=true`というオプションをJDBC接続URLに追加することで解決しました。

### 修正前の接続URL（docker-compose.yml）
```yaml
environment:
  DB_URL: jdbc:mysql://<mysql-host>:<port>/<database>?useSSL=false
```

### 修正後の接続URL（docker-compose.yml）
```yaml
environment:
  DB_URL: jdbc:mysql://<mysql-host>:<port>/<database>?useSSL=false&allowPublicKeyRetrieval=true
``` 

## まとめ
「`Public Key Retrieval is not allowed`」というエラーが出たときは、そこまで複雑な構成にしていないDocker環境でなぜ…と戸惑いましたが、`allowPublicKeyRetrieval=true`をJDBC接続URLに追加するだけで簡単に解決できました。  
同じエラーに直面した方の助けになれば幸いです！

## 参考

https://dev.mysql.com/doc/connector-j/en/

https://stackoverflow.com/questions/50379839/connection-spring-boot-mysql-public-key-retrieval-is-not-allowed

https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html
WSL2でKHR-3HVを接続する方法

本記事では**WSL2**上で近藤科学様のヒューマノイドロボット「**KHR-3HV Ver.2**」を**接続する方法**を説明します。

拙い知識での説明になりますこと、ご了承ください。

#### 前座
どうも、iiTAiです。

受講している講義で、KHR-3HV Ver.2を使った演習を行うことになりました。
以下のライブラリを使って、ロボット制御用のUIを作成するそうです。

https://github.com/nake90/librcb4

どうやらこのライブラリはLinux向けに開発されたもののようです。
私はLinuxの環境を持ち合わせていないので、WSL2で取り組もうと考えました。
しかしWSL2は標準でUSBデバイスを認識できないようです。また、ロボットの方も接続に設定が求められます。

接続できないか試したところ、なんとか成功したため、その手順をここに記します。

## 参考記事

https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb

https://qiita.com/KMNMKT/items/ae0e76a3e420b3ca16e6

https://qiita.com/ryoma-jp/items/9db6cca5ed10f1aed7ff

https://kondo-robot.com/faq/usb_adapter_for_linux_2024

https://another.maple4ever.net/archives/3221/

↓WSL2未導入の方向け(多分これみればなんとかなります)

https://qiita.com/SAITO_Keita/items/148f794a5b358e5cb87b

## 環境
- Windows11
- WSL 2.3.26.0 (Ubuntu 22.04)

## usbipdのインストール
**PowerShell**にて以下のコマンドを実行してください。

```PowerShell
winget install --interactive --exact dorssel.usbipd-win
```

インストールが完了したら`usbipd`コマンドをPowerShell上で使えるようになります。使えなければPowerShellやOSの再起動を試してください。

:::note
従来のusbipdでは、WSL上でlinux-toolsをインストールする必要がありましたが、usbipd 4.0以降ではその手順が不要になったそうです。

また、当バージョンでは後述のコマンドの記述も従来と異なります。
:::

## 接続
WSL上でロボットのUSBを認識し、アクセスできる状態にします。

### usbipdによるデバイスのattach
まずはKHR‐3HV Ver.2のUSBをパソコンに挿入してください。
挿入後、PowerShellを**管理者として実行**し、以下のコマンドを実行してください。

```PowerShell
usbipd list
```

これによりWindows上で接続されたデバイスの一覧を取得できます（おそらくどれがロボットの情報なのかは見ればわかると思います）。
ここで、ロボットのBUSID（1-1とか書いてあるやつ）を覚えてください。

次にUSB機器のバインドを行います。以下のコマンドを実行してください。

```PowerShell
usbipd bind --busid 1-1
```

BUSID`1-1`の部分は、先に覚えたBUSIDを入力してください。

バインドした後、アタッチを行います。

```PowerShell
usbipd attach --wsl --busid 1-1
```

こちらもBUSID`1-1`の部分は、先に覚えたBUSIDを入力してください。

### FTDIカーネルへの関連づけ

:::note warn
`modprobe ftdi-sio`の実行時、ftdi-sioが見つからない旨のエラーが確認されました。

WSL2のカーネルの更新により解決できる場合があります。その場合、PowerShell上で`wsl --update`の実行をお試しください。その後、`sudo su`から再度実行してください。
:::

次に、ロボット接続用のUSBデバイスをFTDIのカーネルに関連付けます。
**WSL**で以下のコマンドを実行してください。

```WSL
sudo su
modprobe ftdi-sio
echo 165C 0008 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
exit
```

なお、プロダクトID`0008`の部分は使用しているデバイスごとで異なります。

ベンダID | プロダクトID | デバイス名
--- | --- | --- 
165C | 0006 | ICS USB ADAPTER HS 	
165C | 0008 | Dual USB ADAPTER HS
165C | 0009 | RS485 USB/SERIAL CONVERTER
165C | 000A | RS485 USB ADAPTER HS

以上で接続は完了です。おつかれさまでした。

## アクセスできることの確認
正常に認識されていることを確認します。

**WSL**で以下のコマンドを実行して、`ttyUSB0`などに接続されていることが示されたら成功です。

```WSL
dmesg | grep tty
```

なにも出力されずに命令が終了した場合、`lsusb`コマンドを実行し、ロボットのUSBがattachされていることを確認してください。

デバイスの一覧にロボットの情報があれば、おそらくWSL側の設定に問題があります。ロボットの情報がなければusbipdのattachに失敗しています。それぞれ必要な手順をやり直してください。

また、必要に応じてライブラリ記載のサンプルコードを動かしてみてください。

## さいごに
usbipdのバージョン違いやDual USB ADAPTER HSの接続設定のせいで何度かつまづきました。この記事などを参考にし、これ以上苦しむ人が増えないことを願います。

（こんなことする人そもそもそんなにいない気がするけど）
Laravel・PHPでのデバック方法について(備考録)

# Laravel(PHP)でのデバック方法についての備考録
Laravelでのデバッグ方法がたくさんあることを知ったので、学習時の備考録として記事を作成しました。

- 以下のデバック方法について
    - dump()
    - var_dump()
    - dd()
    - ddd()

他にもあるかも知れませんが、私が知っている方法は上記なので、この４つの方法について調べてみました。

## dump()
Laravelのヘルパー(helper)関数。
※ヘルパー関数とは、Laravelで準備されている独自の関数のこと。ヘルパー関数を使用することで、その関数内で色々と複雑な処理を実行していくれている。

**デバック時に、処理を止めずに指定した変数内のデバックを行う関数。**

[Readoubleリンク](https://readouble.com/laravel/11.x/ja/helpers.html#method-dump)

![スクリーンショット 2025-01-15 23.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478262/b5e6a371-b0a5-04bf-5573-020d76c424d8.png)

## var_dump()
PHPの関数。

**デバック内容のデータの情報の詳細を確認することができる。(型情報・配列の詳細情報など)**

[公式リンク](https://www.php.net/manual/ja/function.var-dump.php)

![スクリーンショット 2025-01-15 23.44.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478262/fb2e3597-4eea-cf60-e293-3a1703599caf.png)

## dd()
Laravelの機能として提供されている「Symfomy」のヘルパー関数。

【メモ】
下記リンクにて、dump()についても記載があったので、dd()と同様、dump()もSymfpnyのヘルパー関数なのか、関連があるのか。

[Symfonyリンク](https://symfony.com/doc/current/components/var_dumper.html)

## ddd()
spatieライブラリの機能。
※spatieは「Laravelの便利機能を提供してるライブラリ」

**一番色々な情報の詳細情報をブラウザ上に表示してくれる。(リクエストヘッダ・ボディの情報やルーティングの詳細情報なども表示)**

・注意点は、開発環境によってはspatieライブラリを使用していないと関数を指定しても使用できない。


[laravel-newsリンク](https://laravel-news.com/ddd-helper)


## 最後に
Qiitaの投稿に慣れていない・プログラミング学習の備考録として記載をしているので、もし間違いがあった際にはご指摘いただけると幸いです。

### 参考文献
調査していた際に、以下のサイトを参考にさせていただきました。
[dddについて](https://zenn.dev/yskn_sid25/articles/94ddaebe84bb71)
RailsでStimulus-Sortableを使ってページの入れ替え機能をドラックアンドドロップで実装した

## 読んで欲しい人
- ドラックアンドドロップで良い感じの実装方法ないかな〜と思っている人
- Stimulus-Sortableを軽ーく知りたい人
- 過去の自分

## 環境
- Rails8
- Ruby 3.3.6

## 書こうと思った理由

[acts_as_list](https://github.com/brendon/acts_as_list)というgemを利用して、Bookモデルに紐づく`pages`を入れ替える実装をしていました
しかしフロントがだいぶイケてない仕様になってしまったので、ドラックアンドドロップで良い感じにできる方法ないかなと困っていました

先輩に相談をすると[Sortable](https://www.stimulus-components.com/docs/stimulus-sortable)が良さげということなので、実際に使ってみました。
その時の備忘録です

## インストール

何はともあれインストールから

```
$ yarn add @stimulus-components/sortable sortablejs @rails/request.js
```

## コントローラの登録

`app/javascript/controllers/index.js`に下記を記述して、コントローラを登録します

```js
import { Application } from '@hotwired/stimulus'
import Sortable from '@stimulus-components/sortable'

const application = Application.start()
application.register('sortable', Sortable)
```

- `import Sortable from '@stimulus-components/sortable'`

`Sortable`コンポーネントをインポートします
これが並び替えを可能にしてくれるコンポーネントです

- `const application = Application.start()`

Stimulusアプリケーションを開始して、そのインスタンスをapplicationに格納

- `application.register('sortable', Sortable)`

`sortable`という名前でコンポーネントを登録

## ビューに`sortable`属性を追加する

仮に下記のようなリストを用意したとします

```erb
<ul class="list-group" data-controller="sortable" data-sortable-animation-value="150">
  <% @pages.each do |page| %>
    <li class="list-group-item d-flex" data-sortable-update-url="<%= page_position_path(page) %>">
    </li>
  <% end %>
</ul>
```

- `data-controller="sortable"`

sortable-controllerと紐付けます

- `data-sortable-update-url`

ページを入れ替えて、完了したタイミングで更新される並び順を送信する先のURLを指定します

この時点でページの移動自体は、ドラックアンドドロップできると思います

## ページ数のカラムを更新する

今回はBookが複数のPageを保持できる関係だと仮定します

```page.rb
class Page < ApplicationRecord
  acts_as_list scope: :book
end
```

```pages/positions_controller.rb
class Pages::positionsController < ApplicationController
  def update
    @page.insert_at!(params[:position].to_i)
  end
end
```

`acts_as_list`の`insert_at!`を使用して、例外エラーでページ移動ができなかった場合にも対処します


## 感想

- 意外と簡単に実装できた。JSの仕組みがあやふやなのはなんとかしたい

## 参考

https://www.stimulus-components.com/docs/stimulus-sortable
【Rails】seeds.rbでFakerを使用してランダムなデータを生成する方法

## Fakerをインストールする

`Gemfile`に以下の行を追加します。

```ruby:Gemfile
  gem 'faker'
```

ターミナルで以下のコマンドを実行して、Gemをインストールします。

```terminal
bundle install
```

https://github.com/faker-ruby/faker

## `seeds.rb`の編集

`db/seeds.rb`ファイルを開き、以下のコードを追加します。

```ruby:seeds.rb
20.times do
  password = Faker::Alphanumeric.alphanumeric(number: 10)  # 10桁の英数字

  User.create!(
    name: Faker::Name.name,  # ユーザー名
    email: Faker::Internet.unique.email,  # 一意のメールアドレス
    password: password,
    password_confirmation: password,
    bio: Faker::Lorem.paragraph(sentence_count: 10),  # 10行の文章
  )
end

```

## データの生成

以下のコマンドを実行してデータを生成します。

```bash
rails db:seed
```

これで、Fakerを使用して生成したデータがデータベースに追加されます。
本来の目的　自分管理

ど素人の制作
「頼むから　間違えないでよ」

こんにちは！　SM業に勤めています　はちわれといいます。
今回　自分自身の目的でもある「自分で作った勤務時間を間違える癖を治す」制作を　行いました

ただ　ど素人がアナログ世代から:eyes::zzz:現代のデジタル世代に入りにくい私にとって最初の壁でした　勤めているからには　自分の給与は自分で管理していかないといけないです

そんな時　自分の管理が疎かになり　勤務時間をちょくちょく間違えていました【自分の管理】ができない上司にはなってはいけないと　考えました
今回≪作りたい自分の勤務時間≫を　いつも見ている:eyes:スマホにお知らせしてくれるLINEbotを作成することに　決めました:muscle:

使ったツール
MAKE
LINEBOT
Google　Spread Sheet
HTTP（今回うまく起動させてあげれてない）

MAKE作成時の構図
![スクリーンショット 2025-01-15 222801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/06158530-4282-c2de-872a-43420617bbf2.png)
そもそも　LINEBOT自体:sweat_smile:なんのことやら　授業受けても？？？？？状態でなんと計６時間後　最初の土台ができました

途中何度も何度もエラーになり　とてつもなくどん底:fearful:に落ちまくり　自分の管理もデジタル化にできないのか:eyes:　やはりダメ人間なのか:confounded:　これ以上自分自身管理ができなきゃ進まない　必死で次の試行に移りました

Google　Spread Sheetの起動
![スクリーンショット 2025-01-20 200317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/6b45a6f5-9c73-1793-276a-9a28f3c1591a.png)

この勤怠管理　作成も２時間:sweat_smile:でものちに自分自身の事を思ってやるんだから　へこんでいる場合ではない:raised_hand:　この応用編のヒント2つ頂いたのですが　今は自分の時間とイベントをいれてみました

ボタン押すまでは　半信半疑でしたが

![スクリーンショット 2025-01-15 231827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/2b0e7289-8432-be2c-e409-88778a9598c3.png)
やはり失敗でした　この時間自分解決できずお助け隊に　３０分ぐらい知恵を借りました　ここは他人のお力が必要でした「ありがたかった:relaxed:」

もう一度ボタン押します　半信半疑でしたが
![Screenshot_20250120_202150_LINE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972925/0217889f-fbde-ea9c-44bc-685d743fb1e1.jpeg)

https://x.com/i/status/1880993781539094602

返信大成功:postal_horn::volleyball:この達成感人一倍でした
今回　もう一つHTTPを使い　この時間と天気がうまく入れば　理想でした
でも　色んなツールを活用してこのようなものが作成できた自分に　称えます

応用は　まだまだ実践あるのみですので　活用はしていきます
思考を深めるための「図」

## 本の情報
**タイトル**
武器としての図で考える習慣―「抽象化思考」のレッスン

**著者**
平井孝志

**内容**
図で考えることで、物事を深く考えることができる。
その理由としては、以下が挙げられる。
1. 情報の渦に溺れることがなくなる
記載できる情報量が限られるため、大事な情報だけが現れることになる。
1. 思考が見える化される
思考の漏れや矛盾が明らかになるほか、記録として残すことになりいつでも続きを考えられる。更に、ものごとの関係性も明らかにすることができる。
1. ビッグ・ピクチャーが捉えられる
今考えることに対して影響を及ぼすすべての要素を、視野を広げて捉えることにつながる。

図で考えるための基本的な「型」としては、以下の4つがある。
1. ピラミッド
1. 田の字
1. 矢バネ
1. ループ

## 印象に残った箇所
### 「記録として残す」の考え方
図により思考が見える化することの解説の中で、「記録として残す」ことができるメリットがあると述べられていた。
→そこまでに考えていたことが消えなくなるほか、いつでも続きから考えることができる。
また、閃きを得られる場として知られる「三上」でも考えることができるという話が、実際にそういった空間で何かを思いついた実体験もあり、印象に残った。
私はその時頭で考えるだけ ということが多いので、この記録に残す考え方は大事な考え方と感じた。

:::note info
三上とは
馬上・枕上(寝床)・厠上(お手洗い)の三箇所。
中国の政治家などとして知られる欧陽脩が記した文章に記載されていた言葉。
:::

### 強制的に思考を広げる
図で考える際は思考の幅を広げられると良い・図に枠を追加することで強制的に思考の幅を広げることができる といった記述があった。
図は「今の状況を整理するもの」という認識が強かったので、図を強制的に広げることで何とか新しい視点・アイデアを捻り出す という考え方は新鮮だった。
アイデアや視点が足りておらず全体像が見えない といった傾向があるため、この強制的に思考を広げる考え方は取り入れていきたいと感じた。

## 最後に
「図を書けるようになりたい」と考えていたので、そのきっかけになる本だと感じた。
役に立つ図の型に加え、図をどのように使っていくかの解説もあり、理論と実践の両方を学べた点が良かった。
まずは印象に残った点を活かし、図に残す・思考を広げる ことを行っていきたい。
型スイッチ【Go】

## Goの型スイッチ

caseに型を指定して分岐する。
評価する式はインタフェース型変数の元の型。

```Go
package main

import "fmt"

func do(i interface{}) {
	switch v := i.(type) {
	case int:
		fmt.Printf("Twice %v is %v\n", v, v*2)
	case string:
		fmt.Printf("%q is %v bytes long\n", v, len(v))
	default:
		fmt.Printf("I don't know about type %T!\n", v)
	}
}

func main() {
	do(21)
	do("hello")
	do(true)
}
```
WSLの場所替え

# 緒言
Cドライブ容量が小さすぎるがDドライブがバカでかいとき、WSLの場所をDドライブにしたいなと思った。
以下のようにすればよい。
術式，不義遊戯!!!

# 方法
PowerShellを管理者として実行する
1. 以下を実行してWSLをエクスポート。ディストリビューション名は自分のものに適宜変えること.
    ```powershell
    wsl --export Ubuntu-xx.xx D:\WSL\Ubuntu-xx.xx.tar
    ```
1. 「この操作を正しく終了しました」と出るので、一旦シャットダウン
    ```powershell
    wsl --shutdown
    ```
    
1. いったん登録も解除しておく
     ```powershell
     wsl --unregister Ubuntu-xx.xx
     ```
     
1. WSLをインポートする。
    ```powershell
    wsl --import Ubuntu-xx.xx D:\WSL\Ubuntu D:\WSL\Ubuntu-xx.xx.tar
    ```
    
1. 「この操作を正しく終了しました」と出たらOK。

1. `ext4.vhdx`ファイルが`D:\WSL\Ubuntu`内にあれば成功である。

1. 以下のコマンドを実行し、`/dev/sdc`が示すものがWSLの使える領域（容量）である。
    ```bash
    df -h
    ```

そして晴れてUbuntu-xx.xxを起動すると...
なぜか`root`権限でのログインがデフォルトになっている模様...
そこで以下を実行
```bash
nano /etc/wsl.conf
```
で編集する。以下を入力。
```bash
[user]
default=myuser
```
`myuser`はユーザ名なので適宜変更すること。
Firebase環境構築（共有用メモ）

## 前提
エミュレータを動作させるためには**node**,**jdk**が必要です

:::note warn
エミュレータが原因不明のエラーで動作しない場合大体nodeのバージョンが対応していない(経験談)
起動コマンドは通ったのにhostingにアクセスしてみると画面真っ白、、、という経験がありましたので同様の症状の方は参考までに
:::

[公式ドキュメント](https://firebase.google.com/docs/cli?hl=ja)

## 環境構築

### CLIをインストール
ターミナルに以下のコマンドをたたく
グローバルにインストールしているのでどのディレクトリでも大丈夫

```
npm install -g firebase-tools
```

### ログイン
firebaseプロジェクトを作成する（作成した）googleアカウントにログイン

```
firebase login
```
入力するとURLが出力されるので開いてログイン

### プロジェクトの初期化
ログインが完了したら以下のコマンドでプロジェクトを初期化

```
firebase init
```

入力すると以下のような出力がされるので必要な項目まで**↑↓**キーで移動して**スペース**で確定
(`Emulators: Set up local emulators for Firebase products`を選択するとローカルエミュレータが使えるよ)

```
? Which Firebase features do you want to set up for this directory? Press Space to select 
features, then Enter to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to 
invert selection, and <enter> to proceed)
❯◯ Data Connect: Set up a Firebase Data Connect service
 ◯ Firestore: Configure security rules and indexes files for Firestore
 ◯ Genkit: Setup a new Genkit project with Firebase
 ◯ Functions: Configure a Cloud Functions directory and its files
 ◯ App Hosting: Configure an apphosting.yaml file for App Hosting
 ◯ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ◯ Storage: Configure a security rules file for Cloud Storage
(Move up and down to reveal more choices)
```

どのプロジェクトを使用するか聞かれるので選択
下二つはあまり使わないかも、、、？

ちなみに上二つは
- 既存のプロジェクトを使用
- 新たなプロジェクトを作成
```
? Please select an option: (Use arrow keys)
❯ Use an existing project 
  Create a new project 
  Add Firebase to an existing Google Cloud Platform project 
  Don't set up a default project 
```

使用するプロジェクトを選択すると選択した項目の初期化が始まるので基本的にはそのままEnterでOK

## エミュレータ起動
初期化したディレクトリないで以下のコマンドを叩くと起動できます

```
firebase emulators:start
```

onlyオプションを使用して単体起動

例 : hostingのみ
```
firebase emulators:start --only hosting
```
#0015（2024/01/15）カスタマーエンドポイントとゲートウェイエンドポイント

# AWSのカスタマーエンドポイントとゲートウェイエンドポイント

AWSでは、**VPC:Virtual Private Cloud**内からAWSサービスにアクセスするためにエンドポイントを設定します。エンドポイントには主に以下の2種類があります。

- **カスタマーエンドポイント（Interface Endpoint）**
- **ゲートウェイエンドポイント（Gateway Endpoint）**

---

## **1. カスタマーエンドポイント（Interface Endpoint）**

### **概要**
- **VPCエンドポイントとしてElastic Network Interface（ENI）を使用**し、AWSサービスやカスタムサービスに接続するエンドポイントです。
- AWS PrivateLinkを基盤として動作します。

### **特徴**
- **対応サービス**:
  - AWSの多くのサービス（例: CloudWatch、SNS、Secrets Managerなど）
  - カスタムサービス（AWS PrivateLinkを利用）
- **構成方法**:
  - ENIがVPC内に作成され、サービスとのプライベート接続を実現。
- **コスト**:
  - 利用料金が発生（時間単位とデータ処理量）。
- **セキュリティ**:
  - セキュリティグループでトラフィック制御が可能。

### **ユースケース**
1. CloudWatch LogsやSNSなどのAWSサービスへのプライベート接続。
2. AWS PrivateLinkを活用したカスタムサービスの公開・利用。
3. 複数のVPC間でのプライベート通信。

---

## **2. ゲートウェイエンドポイント（Gateway Endpoint）**

### **概要**
- **VPC内のリソースが、特定のAWSサービス（S3、DynamoDB）にアクセスするために使用**するエンドポイントです。
- ゲートウェイ型で、VPCのルートテーブルを通じてトラフィックを管理します。

### **特徴**
- **対応サービス**:
  - S3
  - DynamoDB
- **構成方法**:
  - ルートテーブルにエントリを追加し、特定のトラフィックをゲートウェイエンドポイント経由で送信。
- **コスト**:
  - 無料（対象サービスの通常利用料金のみ）。
- **セキュリティ**:
  - エンドポイントポリシーでアクセス制御が可能。

### **ユースケース**
1. S3バケットへのプライベートアクセス（インターネットを介さずに通信）。
2. DynamoDBをVPC内で利用する際のセキュリティ強化。
3. コストを抑えたネットワーク構成。

---

## **3. カスタマーエンドポイントとゲートウェイエンドポイントの比較**

| **特徴**               | **カスタマーエンドポイント**                           | **ゲートウェイエンドポイント**                     |
|------------------------|------------------------------------------------------|--------------------------------------------------|
| **対応サービス**        | 多くのAWSサービス、カスタムサービス                   | S3、DynamoDB                                     |
| **接続方法**           | ENIを使用したインターフェイス型                      | ルートテーブルを使用したゲートウェイ型            |
| **料金**               | 有料（時間単位 + データ処理料金）                     | 無料（サービスの通常料金のみ）                    |
| **ネットワーク構成**    | 複数のENIを作成するため柔軟だがやや複雑              | シンプル（ルートテーブルのみ設定）                |
| **セキュリティ制御**    | セキュリティグループで制御                            | エンドポイントポリシーで制御                      |
| **ユースケース**        | CloudWatch、SNS、カスタムサービスへの接続            | S3やDynamoDBへのプライベートアクセス              |

---

## **4. どちらを選ぶべきか？**

### **カスタマーエンドポイントが適している場合**
- AWSサービス全般（例: SNS、Secrets Manager、CloudWatch Logs）やカスタムサービスをプライベート接続で利用したい場合。
- セキュリティグループで細かいアクセス制御を行いたい場合。

### **ゲートウェイエンドポイントが適している場合**
- S3やDynamoDBへのアクセスをセキュアかつ低コストで構成したい場合。
- ネットワーク設計をシンプルにしたい場合。

---

## **5. まとめ**
- **カスタマーエンドポイント**は、幅広いAWSサービスやカスタムサービスに対応し、柔軟性のある接続方法を提供しますが、料金が発生します。
- **ゲートウェイエンドポイント**は、S3やDynamoDBへの通信をインターネットを介さずに低コストで実現します。

# 参考
- chatgptの回答
日本語プログラミング言語Mindのバージョン９βでTcl乱数関数の定義を試みる２

# はじめに
日本語プログラミング言語Mindの開発元@killyさんの御厚意により日本語プログラミング言語Mindのバージョン９βをご提供いただいたので、[前回の記事](https://qiita.com/mylifewithviolin/items/dc4f24de6e949725204e)では９βの言語拡張機能「評価」でTcl乱数関数を定義してみましたところ@killyさんからよりMind9らしい書き方をご教授いただいたので本記事でそれを試してみました。本記事はマニュアル未記載な内容でMind９の本来のサポートレベルを超えた内容です。

# 前提条件
Windows11 Pro 22H2 22621.4169
mind version9-BETA-6　

# ９βの言語拡張機能「評価」とは
[前回の記事](https://qiita.com/mylifewithviolin/items/dc4f24de6e949725204e)への@killyさんのコメントからの引用です。

>guilibに「評価」「評価した値」は定義されています。マニュアル非公開なのですが
>
>　　＜Tcl/Tkスクリプト＞を　評価する　→　・
>
>　　＜Tcl/Tkスクリプト＞を　評価した値　→　値（文字列）
>
>というスタック仕様です。お試しください。

そして、前回記事ではMind7の記法を倣って書いていたのですが、Mind9ではこう書いてくださいというサジェストをいただきました。

>実験していただいたソースでは動的に文字列実体変数を獲得するとかされておられ、確かにMind7ではそのようにしている箇所が多かったのですが、Mind9では次の便利な単語群が定義されているのでご利用ください。（動的確保ではないので、2048桁を超える長さのスクリプトは扱えません）

```mind:
　　「command」を　コマンドラインにトークンを設定し
　　「abc」を　コマンドラインに空白とトークンを追加し
　　「def ghi」を　コマンドラインに空白と囲みトークンを追加し
　　123を　コマンドラインに空白と数値トークンを追加し
　　コマンドラインを　評価する

　　生成されるコマンドライン
　　→ command abc {def ghi} 123
  ```

  今回はこちらの記法で書いてみます。また、テスト用のコードとソースコードファイルを分離します。

# お題のソースコード
## ライブラリ
```mind:randomtcl.src
疑似乱数とは　関数　小数出力 （・ → 小数）
    ※ 0.0以上～1.0未満 の 乱数を戻す

    「expr { rand() }」を　コマンドラインにトークンを設定し
    　コマンドラインを　評価した値を　数値変換・小数として
     捨てる。

種子指定の疑似乱数とは　関数　整数入力　小数出力 （変数 → 小数）
    ※ シード値指定の0.0以上～1.0未満 の 乱数を戻す  
        種子は　変数

    種子に　入れ
    「expr { srand(」を　コマンドラインにトークンを設定し
    種子を  文字列変換し　コマンドラインにトークンを追加し
    「)}」を　コマンドラインにトークンを追加し
    　コマンドラインを　評価した値を　数値変換・小数として
    捨てる。

```

## テスト用コード
```mind:randomtcl2.src
"randomtcl.src"を　コンパイルする。

キャンバスは　ＩＤ。
キャンパス幅は　定数　８００。
キャンパス高は　定数　４００。

簡易小数表示とは　（小数、変数　→　・）

        ＿テキストＩＤは	図形ＩＤ
        明朝１０は　　文字列定数　「{ＭＳＰ 明朝} 10」
        数字文字は　文字列
        Y座標は　変数
    
    Y座標に　入れ    
    ５桁と　４桁で　文字列変換・小数形式し　数字文字に　入れ
    キャンバスと　数字文字を　300 Y座標で　図形としてテキストのＩＤを取得し	＿テキストＩＤに　入れ
	赤色を		＿テキストＩＤに　文字色を設定し
	明朝１０を	＿テキストＩＤに　フォントを設定し
    ＿テキストＩＤを　描画すること。

    ※ テスト用
メインとは
    メインウィンドウと　キャンパス幅と　キャンパス高と　白色で
    　　　　　　　　　　　　　　キャンバスを立て　キャンバスに　入れ

    疑似乱数()を 10で　簡易小数表示し
    疑似乱数()を　20で　簡易小数表示し
    種子指定の疑似乱数(１０)を　30で 簡易小数表示し
    種子指定の疑似乱数(１０)を　40で 簡易小数表示し
    種子指定の疑似乱数(３０)を　50で 簡易小数表示すること。
```
# お題のソースコードのMind9βでのビルド

```cmd:
C:\developments\vscode\mind9>mind randomtcl2 guilib

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9-beta\mind9-beta\bin\mindexw.exe --> randomtcl2.exe
```

# お題のMind9βでの実行の様子
無事に動作しました。なんどか繰り返すと異なる値となることがわかります。
３行目と４行目は同じシード値による乱数です。

![mind9tcl3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118036/516ef954-4355-cfbe-db1d-6da33f94b8f6.png)


本件引き続き深堀して参ります。こちらに記載の

https://blog.it-see.net/it-dokata/tcl-tk/mathematical-function/#toc8

[使用例2]に対応した関数を用意したいと考えております。

```tcl:
% expr rand() * 100          ---(1)
75.90084829176816

% expr rand() * (5-2)+2      ---(2)
2.5687755898427103

% set x [expr rand() * 100]　---(3)
28.997123674022557
```

# おわりに
いかがでしたでしょうか？なにかの参考になれば幸いです。まだほんのさわりの部分ですが、今年で生誕４０周年を迎える日本語プログラミング言語Mind、ついに新バージョンがベールをぬぎはじめます！

# 参考
Tclのexprの下記の表記は下記のリンク先の情報からこのようにしております。

```tcl:
expr { rand() }
```

https://wiki.tcl-lang.org/page/rand

https://wiki.tcl-lang.org/page/srand
RPG製作の計画

# 製作計画

1. メイン画面の作成　（2025/1/19完成）
https://qiita.com/akeyi2018/items/f9fa9b22a9a9ad8dc24f
1. セーブ/ロード(2025/1/22完成）
https://qiita.com/akeyi2018/items/84e6cecdb2fdc27b0b06
1. 町人との会話(2025/1/23完成)
https://qiita.com/akeyi2018/items/34158bf6303233a67eed
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/fb9a050b-9ebf-a305-6e88-15811fa71651.png)
1. 主人公のステータスを常時表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/a4197c62-cc63-c364-f645-1b17dee2a9b6.png)
1. 魔法をLVごとに動的に表示できるように変更（道具を使う時にも応用できる）
1. 道具を拾う
1. 道具を使う
1. 買い物システムの構築
1. 罠を作ってみる
1. 装備品
1. 装備の装着
1. ネタ探し
ST( Simple Terminal )を使った感想とか

# 概要
Ubuntu 24.04.1 LTSとManjaro Linuxでstを使ってみた。
インストール方法と感想が書いてあります。
# モチベーション
Ubuntu標準のターミナルの起動が遅くて不満だった。そんなおり、Simple Terminalなるものが存在することを教えてもらった。もう名前がいい。はやそうだし。使ってみるしかない。
ついでにManjaroにも入れてみた。

# インストール
 ## Ubuntu
 apt,sanpにはなかった。よってソースからビルドする。
  https://st.suckless.org からダウンロードする。
.tar.gzなので
```
tar -zxvf hogehoge.tar.gz
```
と解凍する。READMEをよく読んでからmakeする。

 ## Manjaro
 AURにあった。
 ```
 yay -S st
 ```
 でできた。らくちんでよい。

 # 使用感
 ## はやい?
 Ubuntu標準のものよりずっとはやい。
 でもXTermとそんなかわらないかと。
 
 ## 便利？
 履歴さかのぼれないのが不便。
 タブ機能がないっぽい。(XTermもない)
 
 ## その他
 w3mで画像表示できなかった。(XTermはできる。Ubuntu標準はできない。)

 ## 全体の感想
 ほんのちょっと触っただけだが、今のところXTermの下位互換に感じる。

 # 参考

 https://st.suckless.org

https://wiki.archlinux.jp/index.php/St
【Astro】インポート宣言が、'hoge' のローカル宣言と競合しています。の解決方法

# はじめに
`Astro`でファイルを作成した際に発生したエラーについて、解決方法を共有します。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# 問題
`pages`配下の`about.astro`で、`components`配下の`About.astro`をインポートしようとした際にエラーが発生しました。以下がディレクトリ構造です：

ディレクトリ構造
```
src/
├── components/
│   └── About.astro
├── pages/
│   └── about.astro
```
修正前コード

```js 
---
import About from '../components/About.astro';
import Layout from '../layouts/Layout.astro';
---

<Layout>
	<About />
</Layout>

```

# 解決方法
インポート名を変更することで、エラーを回避できました。
以下が修正後のコードです。

```js 
---
import AboutComponent from '../components/About.astro';
import Layout from '../layouts/Layout.astro';
---

<Layout>
	<AboutComponent />
</Layout>

```

ファイル名の大文字と小文字の違い (`About` vs `about`) が原因で、`Astro`やファイルシステムが異なるファイルとして認識しつつも、`mac`などでは競合が発生してしまし正しくファイルを認識しないことがあるようです。

https://zenn.dev/unsoluble_sugar/articles/978015611f482f

# 終わりに
今回のエラーはAstro特有の問題ではなく、ファイル名の大文字小文字の扱いに起因するものです。他の言語や環境でも同様の問題が発生する可能性があるため、ファイル名には注意して設計したいと思います。特に似たような名前のファイルを避けることが重要だと感じました。

# 参考
『大文字・小文字が引き起こすパス問題: Next.jsプロジェクトにおけるMacとWindowsの違い』Zenn

https://zenn.dev/unsoluble_sugar/articles/978015611f482f
毎朝の日課をまとめて！～天気＆ニュースのチェックをLINE Botとリッチメニューで♪～

# 毎朝の日課だからこそ！
みなさんこんにちは！
社会人１０年目のきんたです！
現在は、小売の会社で人事の採用業務に携わっています！

ところでみなさん、突然です毎朝のルーティーンってありますか？
私は毎朝うがいをした後、コップ一杯の水を飲むことがルーティーンです！（笑）

加えて、毎朝**LINEの確認**(特に連絡はきませんが（泣笑）)とその日の**天気**と**ニュース**は必ずチェックするようにしています。

そこで今回は、日々の連絡ツールとしてよく使っているLINEを活用し、
**指定した都市**の**リアルタイムの天気**を教えてくれる**LINE Bot**を作ってみました！

# 使用したツール
[■make](https://eu2.make.com/organization/2690304/dashboard)
[■OpenWeatherAPI](https://home.openweathermap.org/users/sign_in)
[■LINE Developers](https://developers.line.biz/ja/)


これらのツールを使って、私の**毎朝の習慣にアプローチ**してみます！


# 早速ですがLINE Botを動かしてみた！

https://x.com/kinta5960/status/1879489867383742534?s=51

**都市名**を送信するとその都市の**リアルタイムの天気**が送信されます。

採用という業務柄、定期的に色々な地域に出向いたり、
採用業務以外にも、GWやお盆・年末年始などの繁忙期や、
節分やクリスマスなどのイベントのタイミングでは各エリアの店舗の応援に出向いたりと、
**指定した都市の天気を教えてくれる**というのが大事なポイントでした。

# makeのモジュール構造はこんな感じ
![make.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959920/444fa93c-d078-bcc9-c414-a7eebe5eee13.png)

# まずは、天気を調べられるように設定

使ったモジュールは、**LINE**と**HTTP**、**JSON**です。
**OpenWeatherの天気予報API**を使用し、都市が指定できるようにHTTPのURLにメッセージテキストを入れ、OpenWeatherで発行した**APIキー**を入れました。
↓
実はここが一番よくわからなくなってしまったポイントでした。。
初めは、自由に指定した都市を呼び出せず苦戦していたのですが、下記のようにURLの都市の部分を　**{{1.events[}}**　**{{]:message.text}}**　にしたことで、**指定した都市の天気**を送信してくれるようになりました。

![スクリーンショット (75).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959920/ba82ab10-0928-ba1d-7472-854949b525cb.png)


LINEモジュールのTextもテコ入れをし、**必要な情報だけ**見やすく簡潔に届くように！
※毎朝16分くらいの道なりを歩いて通勤をしている私にとって、その日の気温や天候はかなり大事なんですよね。（夏は暑いし冬は寒い、、、当たり前ですね）

![スクリーンショット (81).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959920/33d06726-2ded-afc5-be0b-26dcc71539bd.png)

# LINEのリッチメニューも活用！

天気以外にも、毎朝その日のニュースをなるべく確認するようにしていて、
テレビは基本見ないので、もっぱらXやネットニュースの情報を確認することが多いです。

なので、**LINEのリッチメニュー**に「Ｘ」と「Yahooニュース」を設定し、まとめて確認できるようにしました。

毎朝の習慣にほん～の少しのスパイスを加えた感じです。

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959920/3a155b93-4a13-89c6-c5e2-774c247cfee4.jpeg)



# 最後に

私自身、初心者も初心者で、
今回初めて**make**を使って**LINE Bot**を作ってみましたが、
なかなか思い通りに進まず四苦八苦でした。

ただ、触っているうちに少しずつではありますが
仕組みや構造などが分かるようになっている自分もいて、
作業をしている時は、時間があっという間に過ぎていきました。

正直、もっとこうしたいなと思う点は正直いっぱいあります。。。
- 降水確率も知りたいな　
- リアルタイムだけではなく、１日の予報や週間の予報が知りたいな
- Googleカレンダーと連携して、その日のスケジュールも送る仕組みをつくりたいな
などなど



今回初めてLINE Botを作ってみましたが、
天気予報ひとつとっても、いろいろな情報と絡めて自分流にカスタムできたら、
**ツールを使う意味**が出てくると思うので、
これからいろいろ勉強し知識をつけることで、自分自身もカスタムできたらいいなと思います！
【学習】Rubyの順列操作！permutationメソッド

### はじめに

配列操作はプログラミングで頻繁に登場する基本的なスキルですが少し複雑。ですが、Rubyの`permutation`というメソッドを使えば、驚くほど簡単に順列を生成することができることを知りました。

本記事では、Rubyの`permutation`メソッドの使い方を具体例とともに分かりやすく解説したいと思います。「全順列を取得する方法」や「部分的な順列の生成」、さらには`Enumerator`を活用した使い方も挙げたいと思います！

---
### **`permutation`メソッドとは？**
`permutation`は、Rubyの配列クラスに定義されている便利なメソッドになります。
このメソッドを使うことで、配列内の要素を並べ替えたすべての順列を簡単に生成できます。

---
### **使い方と具体例**
1. **基本的な使い方**
    ますは、配列のすべての要素を使った順列を生成する基本的な例になります
    ```ruby
    arr = [1, 2, 3]
    
    arr.permutation do |perm|
      p perm
    end
    ```
    
    出力例：
    ```ruby
    [1, 2, 3]
    [1, 3, 2]
    [2, 1, 3]
    [2, 3, 1]
    [3, 1, 2]
    [3, 2, 1]
    ```
    <br>
2. **部分的な順列を生成**
    引数を指定することで、部分的な順列を生成できます
    ```ruby
    arr = [1, 2, 3]
    
    arr.permutation(2) do |perm|
      p perm
    end
    ```
    
    出力例：
    
    ```ruby
    [1, 2]
    [1, 3]
    [2, 1]
    [2, 3]
    [3, 1]
    [3, 2]
    ```
    <br>
3. **Enumeratorを活用**
    ブロックを使わずに`Enumerator`を返して操作する方法
    ```ruby
    arr = [1, 2, 3]
    
    perms = arr.permutation(2) # permutation(2) は Enumerator を返す
    p perms.to_a # Enumerator の中身を配列に変換して出力
    ```
    出力例：
    ```ruby
    [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
    ```
### **Enumerator とは何か？**
Enumerator は「中身を順番に取り出せる仕組み」を持つオブジェクトです。
- 上記例では、`arr.permutation(2)` が返す **`perms`** が Enumerator
---

### **注意点**

- **要素数が多い場合の計算量**
    
    配列の要素数が多いと、順列の数は**階乗（n!）**で増加します。
    
    例えば、10要素の配列では、10! = 3,628,800通りもの順列が生成されます。
    
- **引数が要素数より大きい場合**
    
    空の配列が返されます。
    
    ```ruby
    p [1, 2, 3].permutation(5).to_a
    # => []
    ```
    

---

### まとめ
Rubyの`permutation`メソッドを活用することで、配列の並べ替えを簡単に実現できることを知ることができました。今回の記事が何か参考になれば幸いです。