OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者#1】ターミナル環境構築(2025)

10年ぶりのPC買い替えに伴い、MacOS Sequoia 15.4でターミナルの環境設定を実施した手順をまとめました。手順をすっかり忘れていたので、調べながらやった結果、結構時間がかかってしまいました…
忘備録も兼ね、各種サイトのリンクとともに置いておきます。

まずは、最低限の準備からやっていきます。
※細かい設定は追々の記事で書いていきたいと思います。

# 0. はじめに
本記事では、以下の前提で、環境を構築していきます。

**OS：Mac OS Sequoia 15.4
パッケージ管理システム：Homebrew
エディター：emacs**

# 1. PC初期設定(最低限。セキュリティ大事！)
ファイアウォールの設定→ONにします。
不正アクセスを防止し外部脅威からPCを守るらしいです。ONにしておくのが無難でしょう。
▶︎ Apple公式：https://support.apple.com/ja-jp/guide/mac-help/mh11783/mac

# 2. ターミナルの設定ファイルの確認
デフォルトシェルを確認する。このデフォルトシェルですが、まずはざっくり、ターミナル起動時に実行される設定ファイルのようなものという理解をしておけば問題ないかと思います。
```
% echo $SHELL
/bin/zsh
```
echoコマンドを打って、上記のように返ってきたら、zshがデフォルトシェルだということがわかります。

ちなみに、macOS 10.15 Catalinaから、デフォルトシェルがbashrcからzshに変わったようです。筆者はこれに気づかず、ずっとbashrcの方をいじっていて内容が反映されず、スタックしてしまっていました。
▶︎Apple公式：https://support.apple.com/ja-jp/102360

さて、ホームディレクトリに置いてある.zshrcファイルを編集していきます。※.zshrcとはなんぞや、という話はまた別途。

一応、.zshrcファイルがホームディレクトリ直下にあるかどうかを確認しておきましょう。以下のコマンドを打つと、現在のディレクトリ直下にあるファイルの一覧が表示されます。
```
% ls -a
```
もし.zshrcというファイルが存在しない場合は、touchコマンドで.zshrcファイルを作成。
```
% touch .zshrc
```
この.zshrcファイルは、必要に応じて追々カスタマイズしていけば良いので、ここでは一旦簡単なエイリアスを設定して、設定が正常に読み込まれるかどうかを確認していきたいと思います。

# 3.テキストエディタのインストール
準備として、シェルスクリプト(.zshrc)の編集に使うテキストエディタをインストールしていきます。このテキストエディタは、後々のコーディングにも使います。テキストエディタはいくつか種類がありますが、ここでは一般的、かつ、何かと便利な(※筆者の主観込み)emacsを使う方法で進めます。手順は以下の2ステップです。

### ① Mac OS(Linux)用パッケージマネージャであるHomebrewをインストールする。
Homebrewは以下のサイトのインストールできます。
▶︎Homebrew公式：https://brew.sh/ja/

きちんとインストールされたかどうか、以下のコマンドで確認しましょう。
例では、バージョン4.4.29のHomebrewがインストールされていることがわかります。
```
% brew --version
Homebrew 4.4.29
```

### ② Homebrewを使って、emacsをインストールする
brew installのコマンドを使って、emacsをインストールします。
```
% brew install emacs
```
こちらも、きちんとインストールされたかどうか、以下のコマンドで確認します。例では、バージョン29.1のemacsがインストールされていることがわかります。
```
% emacs --version
GNU Emacs 29.1
Copyright (C) 2023 Free Software Foundation, Inc.
```

ここまでで、.zshrcファイルを編集するための下準備が完了しました。

# 4. .zshrcの設定を編集する
以下のコマンドで、emacsを起動し、.zshrcを編集します。
```
% emacs .zshrc
```
上のコマンドだとGUIバージョンのemacsが起動しますが、もし、CUIバージョンで開きたいときは、以下のオプション(-nw)を追加して起動します。
```
% emacs -nw .zshrc
```

さっそく、簡単な設定を.zshrcに追加してみましょう！
ここでは、例として、Finderを起動するコマンドをエイリアスとして設定する方法を挙げておきます。エイリアスとは、複雑なコマンドを短縮した別名のようなもの。これを設定することで長ったらしいコマンドを打たずにすむようになります。手順は以下の3ステップです。

### ① .zshrcの中で、エイリアスを記述する
`finder`というコマンドの代わりとして、`open .`を使えるようにします。
```
alias finder='open .'
```
emacsファイルを上書き保存(Ctrl+x Ctrl+s)して、終了(Ctrl+x Ctrl+c)。

### ② ターミナルを再起動する
※一度再起動をしないと、.zshrcの設定が読み込まれません。

### ③エイリアス設定したコマンドを実行する
```
% open .
```
GUI上で、Finderが起動すれば、大成功です！

あとは.zshrcをいじって、好みで色々カスタムしていく感じかなと思います。
次の記事では、開発にあたって必須のソースコードのバージョン管理システム、Gitを導入していきます。
📢✨Python初心者さんも必見！ ＼AI時代のスキルを今こそ習得しよう／


みなさん、こんにちは！　韓国在住のsanaです！


【ChatGPT × Python 実践講座】を紹介します！


この講座はこんな方におすすめ👇
🐣「ChatGPTって話題だけど、実際どう使うの？」
🐍「Pythonを実務で活かしたい！」
🎯「AIアプリやツールを自分でも作ってみたい！」


✅ 実際の活用例をベースに、手を動かしながら学べる！
✅ 難しい理論より、”今すぐ使える”コードが中心！
✅ Pythonの基本がわかっていれば大丈夫👌


📚ちょっとずつ試しながら、AI活用の一歩を踏み出せる講座です！

気になる方は今すぐチェックしてみてください！

https://u.inf.run/4k2VRYx


それではアンニョン！
boto3 + .env で安全に S3 にファイルをアップロードするまでのメモ

はじめに

Python を使って AWS S3 にファイルをアップロードしてみたいと思い、
boto3 ライブラリと .env ファイルを活用して安全にアクセスキーを管理しながら、
最小構成でアップロードスクリプトを作成してみました。

🎯 やりたいこと
	•	Python スクリプトから S3 にファイルをアップロード
	•	.env ファイルでキー管理を行い、セキュリティを確保
	•	S3 バケットに公開アクセスを許可し、アップロード後の URL を取得

🛠️ 使用技術
	•	macOS（Apple M1）
	•	Python 3.10
	•	boto3
	•	python-dotenv
	•	AWS IAMユーザー（アクセスキー管理用）
	•	S3（公開バケット）

📦 成果物の構成
aws-s3-practice/
├── .env
├── upload_to_s3.py
└── cat.jpg（アップロード対象ファイル）


✅ 実装コード
```upload_to_s3.py
import os
import boto3
from dotenv import load_dotenv

# .envファイルを読み込む
load_dotenv()

# 環境変数からAWSキー情報を取得
ACCESS_KEY = os.getenv("AWS_ACCESS_KEY_ID")
SECRET_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
REGION = os.getenv("AWS_REGION")
BUCKET = os.getenv("S3_BUCKET_NAME")

# boto3クライアント作成
s3 = boto3.client(
    "s3",
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
    region_name=REGION
)

# アップロード関数
def upload_file(file_path, s3_key):
    try:
        s3.upload_file(
            Filename=file_path,
            Bucket=BUCKET,
            Key=s3_key
        )
        print("✅ アップロード成功！")
        print(f"🌐 URL: https://{BUCKET}.s3.amazonaws.com/{s3_key}")
    except Exception as e:
        print("❌ アップロード失敗:", e)

# 実行：ローカルのcat.jpgをアップロード
upload_file("cat.jpg", "cat.jpg")
```

🧠 注意点
| 問題                      | 原因                          | 解決策                                     |
|---------------------------|-------------------------------|--------------------------------------------|
| `No such file or directory` | 対象ファイルが存在しない        | `cat.jpg` を同じフォルダに置く             |
| セキュリティリスク           | Root Access Key を使っていた   | IAM ユーザーを作成してアクセスキーを再発行 |

🔐 セキュリティのポイント
	•	Root Key は絶対使わない
	•	.env を .gitignore に入れる
	•	公開アクセスは「バケットポリシー」で設定する（ACL不要）

✍️ まとめ

AWS S3 の操作は GUI で簡単にできる一方で、コードから安全に操作しようとすると、意外と細かい設定や構成理解が必要になります。

boto3 を使うことで、クラウド操作をスクリプト化・自動化できるようになるのはとても大きなメリットだと感じました。

🔗 参考リンク
- [boto3 S3 ドキュメント](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html)
- [S3 のバケットポリシージェネレータ](https://awspolicygen.s3.amazonaws.com/policygen.html)
- [python-dotenv GitHub](https://github.com/theskumar/python-dotenv)
Oracle Databaseでテーブルをデータごとコピーする

Oracle Databaseでテーブルをデータごとコピーする方法を紹介します。

# SQL*Plus

`CREATE TABLE ~ AS SELECT`を利用します。

```sql
CREATE TABLE EMPLOYEES_COPIED AS SELECT * FROM EMPLOYEES
```

この方法はインデックスや制約、コメントなどはコピーされないことに注意しましょう。

# SQLDeveloper

対象のテーブルを右クリック > 表(C) > コピー(B)を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/936facf8-5074-a7ff-dd5e-34e06db11090.png)

必要な値を入力し、「適用(A)」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/984d1043-1919-219b-1c6f-82350b42d20b.png)

この方法はデータだけでなく、制約やインデックス、コメントもコピー可能です。

# PL/SQL

すべてのテーブルにタイムスタンプをつけて、コピーするプロシージャです。開発中・検証中によく使うのでおまけとして紹介します。


```sql
SET SERVEROUTPUT ON;
DECLARE
  yyyymmdd VARCHAR2(1000);
  stmt VARCHAR2(1000); 
BEGIN
  yyyymmdd := TO_CHAR(SYSDATE, 'YYYYMMDD');
  FOR cur IN (SELECT * FROM USER_TABLES) LOOP
    stmt := 'CREATE TABLE ' || cur.TABLE_NAME || '_' || yyyymmdd || ' AS SELECT * FROM ' || cur.TABLE_NAME;
    DBMS_OUTPUT.PUT_LINE('EXECUTE => ' || stmt);
    EXECUTE IMMEDIATE stmt;
  END LOOP;
END;
/
```

コピー対象を絞りたい場合は、`SELECT * FROM USER_TABLES`に適切なWHERE節を追加してください。

## 利用例

以下のとおりにテーブルがあるとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/c821a2ee-aa19-3553-b561-98b7387003c4.png)

この状態で、上記のプロシージャを実行すると、以下のようなログがコンソールに表示されます。

```
EXECUTE => CREATE TABLE REGIONS_20240525 AS SELECT * FROM REGIONS
EXECUTE => CREATE TABLE COUNTRIES_20240525 AS SELECT * FROM COUNTRIES
EXECUTE => CREATE TABLE LOCATIONS_20240525 AS SELECT * FROM LOCATIONS
EXECUTE => CREATE TABLE DEPARTMENTS_20240525 AS SELECT * FROM DEPARTMENTS
EXECUTE => CREATE TABLE JOBS_20240525 AS SELECT * FROM JOBS
EXECUTE => CREATE TABLE EMPLOYEES_20240525 AS SELECT * FROM EMPLOYEES
EXECUTE => CREATE TABLE JOB_HISTORY_20240525 AS SELECT * FROM JOB_HISTORY


PL/SQLプロシージャが正常に完了しました。
```

実行結果は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/e59ba309-bf91-bed9-ee37-ec8d1163bdbb.png)

# 環境情報

```
SELECT * FROM v$version;
```

|BANNER|BANNER_FULL|BANNER_LEGACY|CON_ID|
|:---|:---|:---|---:|
|Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production|Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production<br>Version 21.3.0.0.0|Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production|0|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/e7099132-166d-c727-9694-7cd4876592a2.png)
ソフトウェアテストについて

# ソフトウェアテストとは
簡単に説明すると、作ったソフトウェアが期待通りに正しく動作するかを確かめる事です。
これは、お客様が実現したい動作が実行されているかの確認の他に、想定外の操作でソフトウェアが壊れないか、入力ミスをしてもエラーを出して、ユーザに正しい動作をさせるように誘導できているかという確認も含まれます。
ソフトウェアテストの種類は、色々ありますが、今回は、比較的技術よりのテストである、単体テストと結合テストについて紹介していきます。

# 単体テストと結合テストの定義
### 単体テスト
ソフトウェアの最小単位（関数やメソッド、クラスなど）の部品単体で、詳細設計書通りに正しく動作しているかどうかを確認するテストです。入力値と期待結果を定義しておき、正しい結果が返ってくるか、期待した通りの正常系な結果又は異常系な結果になっているかを確認します。

### 結合テスト
前述したプログラムの部品を組み合わせた時に、正しく連携出来るかを確認するテストです。単体テストで問題が無くても、組み合わせたら問題を発生することがあるので、大事な確認になります。ちなみにインプットは基本設計書となります。

# テスト技法
### 同値分割
テスト対象の入力をグループ分けして洗い出すテスト技法です。
この手法で、OK部分（又はNG部分）を定義することで、反対のNG部分（又はOK部分）の領域を把握することができます。

例：「0〜120歳まではOK」「それ以外はNG」みたいにグループを分ける。

### 境界値分析
入力の「境目」（ギリギリの値）を重点的にテストする技法です。
これにより、有効ではない値を一つに絞ってテストすることで、テスト工数の削減につながります。

例：年齢の入力で「0歳〜120歳が有効」なら、テストすべきなのは「-1」「0」「120」「121」。

### ディシジョンテーブル
条件と結果を表にまとめて、パターン漏れを防ぐ方法です。
これにより複雑な条件と期待値の関係を表形式で整理することで、視覚的な観点から理解しやすくなり、網羅性の向上が期待できます。
基本的に単体テストは、このディシジョンテーブルを作れないかどうかを最初に精査します。

![マトリクス2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3962435/e11c4035-7729-4e18-a529-2f4d33dd1de7.png)


### インタフェーステスト
モジュール同士のデータのやり取り（インターフェース）が正しくできているかを確認する結合テストです。

例：登録画面Aで登録したデータが参照画面Bで欠損無く表示されている等

### 画面の手動確認とテスト自動化について
最近は、主に単体テストで、JUnitやXUnitのようなテストコードで、単体テストの自動化を実現している企業やプロジェクトが多いと思います。
単体テストとは、前述した通りソフトウェアの最小単位（関数やメソッド、クラスなど）をテストする工程です。しかし、テストコードが誕生する前は、画面やコンソールに出てくる実行結果をシステムを動かして人間の目で確認することが多かったです。そのため、バグが発見しづらく、テストの工数も膨れ上がっていきがちでした。その問題を解決するために作られたのがテストコードです。画面を起動しなくても、テスト対象の関数やメソッドだけを実行して、その合否すらもプログラムで判断するようになりました。また、ボタン一つでテストを実行できるため、テストに対する労力が手動確認に比べてかなり軽くなりました。結合テストを自動化するためのSelenium(WebDriver)などもありますが、ここでは割愛します。

#### テストコードによるテスト自動化のメリットまとめ
・テスト対象のプログラムだけをピンポイントで単体テストできるため独立性を担保できる。
・フロントエンド(画面の見た目や画面項目の制御)の実装が終わっていなくても先立って単体テストができる。
・システムを手動で動かす時と比べてテストの実行時間がとても短い
・プログラムが結果を判断することで、バグを確実に発見できる。

### まとめ
ソフトウェアテストの最終的な目的は、お客様との信頼を守るためだったり、後の修正コストの爆発を抑えるためだったりするので欠かせない工程です。しかし、テストにも専門的な知識や技術、工程によっては、技術者目線ではなくお客様目線で考えてテストをするスキルが必要なので、プログラミングやその他開発技術の学習と同じ又はそれ以上に学習が必要です。テストの学習は後回しにされがちですが、エンジニアとして一人前になるためには、テストについてもしっかり学習していく姿勢が重要になっていくと思います。
web製作者のためのcss設計の教科書1章・2章を読んだ感想・学習メモ

# web製作者のためのcss設計の教科書1章・2章を読んだ感想・学習メモ

## 1. 現状
・サイトコーディングについて学習中
・いくつかのデザイン案をもとにしてWEBサイトを作成してみた。
・htmlとcssに関しては入門者。

## 2. cssを実装するときの詳細度について

cssのスタイル適用に関しては優先順位があることは知っていたが、改めてセレクタの詳細度について学習することで、今までよりも的確なスタイルの適用と無意味なスタイルの適用を減らすことができそうだと感じた。

## 3. 学習目的でのcssコードのリファクタリングについて
最初からより良い設計のcssを作成できれば良いが、最初のうちはうまくできないことの方が多いと思う。htmlの構造にできるだけ依存しないcssを設計できるように、今までに作成したWebサイトのcss設計について改めて確認し、リファクタリングをしてみようと思った。
bolt.newの試行

## 最初に（編集後記）
bolt.newすげー、と思って数ヶ月前に以下を書いていましたが、やはりソースのバージョン管理・共同開発のためにはひと手間必要で、それは今も変わっていない認識。
その間、Lovableすげーとなり、途中トラブルにもぶつかったりしている間に時が経ってしまいました。
下記で作ろうとしているアプリは、Lovableで開発して、いい感じで進んでいます。
https://giji-search-spark.lovable.app/index

そちらの感動も記事にしておこうと想いますが、下記ももったいないので、この時点で、公開しておこうと思います。
下記で考えていたのは、ローカル開発環境とうまく組み合わせられないか、ということでした。


＜以下、ちょっと前の考察＞

## なぜbolt.newか
画面デザインセンスが壊滅的にないので、自動生成してほしいな。
[Create](https://www.create.xyz/) の生成結果も素晴らしかったですが、Nuxtのほうが馴染みがあるので嬉しいなと。
そこで見つけたのがbolt.newでした。
作成中のアプリでSupabaseを使っていたので、その連携が楽そうなのもポイントです。

## やりたいこと
一般的な使い方は色々情報があると思いますが、自分としてやりたいこと、難しそうだと思ったのは下記でした。

- 全てをAIに頼るのではなく、細かい調整は自分でもやりたい
- プロジェクト名などは自分で意図した名前にしたい
- ソースのバージョン管理をしたい

以下、これらを意識した試行の記録です。

## スタート
最初の画面で、いきなりやりたいことを書く方法とは別に、好きなスタックでブランクアプリを作れるというのが、特徴のように思います。
[bolt.new](https://bolt.new/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/36ad1a03-4cc1-da8d-cae4-b772e5cd2e11.png)


ただ、スタックを指定すればそれで作ってくれるので、
こんな粗いプロンプトで、かなりのところまでやってくれるのは脅威です。
```
Nuxt3スタックでスタンプラリーアプリを作りたいです。
利用者向けの機能と管理機能の両方を一つのアプリで作りたいです。
```
ただ、今回はいきなりSupabase接続型で作って、接続情報がないというエラーになってしまったので、それはやりすぎな気もします。（まずは直書きサンプルデータで作ってくれる場合もある）

なので、今回は、ブランクアプリから始めます。
下のアイコンクリックで基本を作って、Nuxtのスタートページ表示まで自動でやってくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/53f4d5ab-76e9-cec0-b899-c4c469cd0417.png)

すごいとしか言いようがありません。

これに対して実際のアプリの仕様を加えていきます。
上と同じようにやってみます。
（スタンプラリーはちょっとうまくいかなかったので違うアプリで）
```
各省庁から提供されている議事録を横断検索するシステムを作りたいです。
議事録データ、省庁マスタ、発言者マスタなどはSupabaseで管理します。
```
すると、こんな感じで作ってくれました。完璧。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/413d248f-5b5f-2a7a-d9c8-0addd756e881.png)

検索ボタンで一覧表示する動きまで作ってくれていますが、まだ、Supabaseには接続しておらず、サンプルデータをアプリ内で定義してくれています。


## Supabase接続
これをSupabaseに連携していきます。

SupabaseのOrganizationは作成済みとします。
先にSupabaseプロジェクトを作っておいたほうが色々制御が効くかなとも思いましたが、
Project name は後から変更できますし、bolt.newの機能で接続して良いかなと思いました。
Connect to Supabase で接続します。
Prijectは勝手に作られます。.envも作成されました。（中身は***で作られたと思ったら、クリックしたらちゃんと設定されていました）

ただ、APIで接続するつもりのようなので、まだテーブル等は作られていません。
なので、指示してみます。

```
議事録情報は、API経由で取得するのではなく、Supabase内に保持します。
省庁マスタもSupabase内に作成します。
```



## StackBiltz経由でGitHubへ
bold.newの特徴の一つとして、StackBiltzとの連携が用意されている、ということもあります。
生成したソースをオンライン開発環境で編集して、その状態であれば、またbolt.newに戻ることもできる、という感じです。
そして、StackBiltzではGithHubへの連携が用意されています。これを使って、ソース管理を開始します。


ところで、これができると、

https://bolt.new/~/github.com/JQinglong/GijiLinkB

これで読み込んでくれるので、これに対して処理してくれる

ここから直接pushはできないが、再度StackBlitzで開いて、githubに接続すれば良い・・・と思ったらGithubから開いてしまうよう

それならばダウンロードのほうが良いかも
StackBlitzもけして早くはないので


トークン上限も厳しいので、いざというときに頼る感じか

最終的な形は、
ローカル環境で開発
AIに頼りたい場合は、一旦pushして、これをbolt.newで開く
修正されたものはローカルにダウンロードして、ローカルで開発継続
という感じだと思います。
AI生成イラストを自動で検出するDiscord botを作った話

# 前書き
ネット上の友人間で、Twitterで流れてきた素敵なイラストを共有する(キモい)Discordサーバーがあるんですが、これAIイラストじゃね・・・？っていちいち疑ってかかるのがとても馬鹿らしいんですよね。嫌な世の中になりました。なので、自動で検知してくれるbotを作ってみました。
結果的に誤検知が多く、実用的ではないと判断したので運用を止めてしまいましたが、備忘録として書いておきます。

# botの作成
Discordのbot自体は簡単に作成できました。
こちらの方が記事にしている内容をそのまま真似して、雛形をJavaScriptで書き換えるだけです。
https://note.com/exteoi/n/n00342a623c93

Glitch上のプログラムに対して、Google App Scriptから1分置きにチクチク通信してスリープしないように維持させる仕組みなので、サーバーの知識がいらないのはありがたかった。

# 仕様
discord.jsを使えば簡単にサーバー内のチャットに反応して、それに応じたプログラムを実行することができます。
Twitter上のイラストを自動で取得したいので、チャットに"fixupx.com"が含まれる場合に推論を実行するようにしました。

"fixupx.com"は、Embedが表示されない"x.com"を修正するためのリンクです。

https://github.com/FxEmbed/FxEmbed
https://note.com/kinoko1216/n/n0c103a86ce00

また、複数の画像を一枚に結合して表示する機能もあるので、サーバー内ではこちらを主に使っています。

AIイラストの推論には、sightengineのAPIを利用しています。
sightengineは画像や動画等に対して暴力的か、ヌードが含まれているか、AI生成か、など様々な分析を提供するサービスです。今回はこのAI生成かどうかを判断するAPIを使っています。
毎日トークンは回復するので、複数のサーバーで動かさない限りは無料で運用可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779219/4bd8df1d-bb4e-481c-a0a5-66cc5cb348bb.png)

https://sightengine.com/

# テスト

ひとまず、画像の直リンクからAPIが実際に利用可能か確かめました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779219/798c928e-5825-4ba5-9970-f37d40e4b0bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779219/837b1597-49e3-4541-9862-00b94712bc91.png)

いくつか試してきちんと動いたので、Twitterのリンク(fixupx.com)から画像を抽出するプログラムを作成して動作させてみました。

ついでに"fixupx.com"に反応して推論を実行し、確率が90%を超えた場合にチャットで指摘するように実装しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779219/d0f07c91-7a64-47bd-8a78-8ed37233c916.png)

# 結果
ここまで順調に進んだんですが、実際に運用してみると誤検知が多くて普通に邪魔になっちゃったんですよね。昔から活動してるイラストレーターの絵も検出したり、そら100%判別できるわけがないので仕方ないんですが、AIイラストじゃね・・・？っていう疑いよりも煩わしく感じたのでbotは一時的に停止しました。
次の日にもう少しだけいじろうとしたら、twitter側の仕様変更か、リンクから画像の取得するプログラムが動かなくなってしまったので、モチベーション的にこの試みは1日で終わりを迎えました。ﾁｬﾝﾁｬﾝ
【小ネタ】PostgreSQLで特定のカラムにユニーク制約を貼りたい！だが、論理削除したデータは除外したい

# はじめに

例えば以下のようなadministrators(管理者)テーブルがあるとします。
また、`username`と`password`はログインに利用します。
そして管理者の削除は、物理削除ではなく、論理削除で行います。


| カラム名 | 型 | NOT NULL |
|:-----------|:------------|:------------|
| id | integer | YES |
| username | varchar(255) | YES |
| password | varchar(255) | YES |
| deleted_at | timestamp |  |

この場合、`username`はログインIDの役割を果たすのでにユニーク制約を貼ることになるかと思いますが、
以下のように張った場合、問題が発生します。
```sql
CREATE UNIQUE INDEX
  administrators_username_unique ON
  administrators (username);
```

管理者Aとして以下のデータを登録した後に、
| カラム名 | 値 | 
|:-----------|:------------|
| id | 1 |
| username | adminA |
| deleted_at | NULL |

管理者Bとして以下のデータを登録しようとするとエラーになるには当たり前ですが、
| カラム名 | 値 | 
|:-----------|:------------|
| id | 2 |
| username | adminA |
| deleted_at | NULL |


管理者Aを以下のように論理削除したとしても、管理者Bの登録はエラーになってしまいます。
これだと、削除の意味がありませんね:cry:

| カラム名 | 値 | 
|:-----------|:------------|
| id | 1 |
| username | adminA |
| deleted_at | 2025-05-02 12:00:00 |

# じゃあ、複合ユニークにすればいいのでは？
論理削除データは除外したいんなら、`deleted_at`カラムも見るように複合カラムでユニークキーを貼ればいいのでは？と思ったりもするかと思います。

```
CREATE UNIQUE INDEX
  administrators_username_unique ON
  administrators (username, deleted_at);
```

しかし実は、UNIQUE INDEXは、デフォルトではNULLを区別しないため、今度は同じ`username`の管理者データが複数登録できてしまいます。


# NULLS NOT DISTINCTの登場

そこで、PostgreSQL15から使えるようになった`NULLS NOT DISTINCT`の出番です。
以下のように制約を貼ることで、`usernameの重複は許さない、かつ、論理削除されたデータは除外`ということが出来るのです！！！

```sql
CREATE UNIQUE INDEX
  administrators_username_unique ON
  administrators (username, deleted_at) NULLS NOT DISTINCT;
```

ちなみに、エラーとしてはこんな感じです。
```
ERROR:  duplicate key value violates unique constraint "administrators_username_unique"
DETAIL:  Key (username, deleted_at)=(adminA, null) already exists.
```
🌿 ラズパイを活用した『社内環境（温湿度）見える化システム』番外編【祝日取得のAPI連携】

## はじめに

こんにちは、piyovateです🐣✨

今回は番外編として、これまで手動で管理していたホームページ上の「休日（休業日）」を、自動的に祝日APIと連携して更新する仕組みを作りました！祝日が毎年自動更新されるので、手間を省き運用が楽になりますよ✨

---

## 🎯 今回の目標

- 国民の祝日を外部APIから自動取得
- 手動で臨時休業日を追加可能な仕組みを維持

---

## 🌐 使用するAPI

今回使用したAPIはこちらです：

[https://api.national-holidays.jp/](https://api.national-holidays.jp/)

このAPIを利用することで、常に最新の祝日情報が自動で反映されます。

> ⚠️ ご利用の際は必ず[利用規約](https://national-holidays.jp/terms.html)をご確認ください。

---

## ⚙️ Step1：設定ファイルの修正

祝日APIのURLを設定します。年が変わっても自動で取得されるよう、JavaScriptで年を自動取得しています。

```js
// raspi-config.js
const ENV_CONFIG = {
    national_holidays_apiUrl: `https://api.national-holidays.jp/${new Date().getFullYear()}`,
    holidays: [
        '2021-07-21', // 例:創業日などの臨時休業日をここに追加
    ]
};
```

---

## 🔄 Step2：API連携処理の追加

以下のように、祝日を取得する関数を追加しました。

```js
// env-status.js
async function fetchHolidays() {
    const response = await fetch(ENV_CONFIG.national_holidays_apiUrl);
    if (!response.ok) throw new Error('祝日データ取得失敗');
    const holidays = await response.json();
    return holidays.map(day => day.date);
}

(async function initializeHolidays() {
    try {
        const apiHolidays = await fetchHolidays();

        // 手動設定日とAPI取得日のマージ
        ENV_CONFIG.holidays = Array.from(new Set([...ENV_CONFIG.holidays, ...apiHolidays]));
        console.log('祝日取得成功:', ENV_CONFIG.holidays);
    } catch (err) {
        console.error('祝日取得エラー:', err);
    }
    await updateComfortStatus();
})();
```

---

## 🚩 動作確認

これにより、

- 毎年の国民の祝日が自動で更新
- 手動指定した臨時休業日（創業日など）も設定可能

となります。

表示例:

```
休業日
```

これで管理も楽になりましたね！✨

---

## 📌 休日（休業日）の追加手順

ホームページ上に表示される「休業日」を追加する場合は、以下のファイルを修正します。

### 設定ファイルの場所
```
assets/js/raspi-config.js
```

### 変更方法

```js
holidays: [
    '2021-07-21', // 例:創業日と同様の形式で休業日を入力してください
    // 臨時休業日をここに追加
]
```

- 国民の祝日はAPIにより自動取得のため対応は不要です。

---

## 🎉 完成！

今回は番外編として、自動化による効率化を実現しました。  
次回もお楽しみに🐣✨
Pythonのスタティックメソッドについて勉強してみた

# 概要
Java, Python等のオブジェクト指向言語を扱っていると避けて通れないのがクラスという概念  
今回はスタティックメソッドについてまとめていこうと思います  

前回はクラスメソッドについてまとめてました↓
[クラスメソッドについてまとめ](https://qiita.com/maru3745/items/098572f3ff5bc4ea876b)

# そもそもスタティックメソッドとは?
- インスタンス化せずに呼び出しが可能
- 継承後も動作を変更しない場合に使用する: 汎用的な機能に使用する

Pythonでは以下のように実装される  
```
class Sample:
    word = "word"

    @staticmethod # デコレートする
    def say_word() -> None: # 第一引数には何も指定しない
        print(Sample.word)
        return
    
# スタティックメソッドの呼び出し
Sample.say_word()
```
# スタティックメソッドとの違いは?
| 項目名 | スタティックメソッド | クラスメソッド |
| :-- | :-- | :-- |
| 呼び出し方 | クラス名.メソッド名 | クラス名.メソッド名 |
| 第一引数 | なし | cls(クラス自身) |
| 参照できるもの | クラス変数 | クラス変数 |
  
違いは第一引数ぐらいしかなさそうです  
では、どのような使い分けができるをユースケースで確認したいと思います  

## 使い分け
どの情報にアクセスするか/使用するかで分けた方が良さそう  
```
import uuid

class Student:
    type: str = "生徒"
    
    def __init__(self, school_name: str, name: str):
        self.__school_name = school_name
        self.__name = name
        self.__id = uuid.uuid4()

    # インスタンス個数の情報にアクセスするためインスタンスメソッド
    def say_id(self):
        print(f'{self.__id}')
        return

    # サブクラスでも同様の処理なのでスタティックメソッド
    @staticmethod
    def say_height(height: int) -> None:
        print(f'私の身長は{height}です')
        return

    # クラス変数にアクセスするのでクラスメソッド
    @classmethod
    def say_class_type(cls) -> None:
        print(cls.type)
        return

if __name__ == '__main__':
    john = Student('hoge', 'John')
    tom = Student('huga', 'Tom')

    tom.say_id()
    john.say_id()

    tom.say_class_type()
    john.say_class_type()

    tom.say_height(168)
    john.say_height(199)
```
  ![実行結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1952885/1f01c2a5-5227-84f0-0a42-01fb84a2424b.png)

# 参考サイト
- [Python_デコレーター_staticmethodとclassmethodの違い](https://note.com/ym202110/n/n91e054e57ce4)
#0117（2025/05/02）cronとは

# cronとは？

cron（クロン）は、Unix系OS（Linux、macOSなど）で使われる**タスクスケジューラ**です。特定のコマンドやスクリプトを、指定した日時や間隔で**自動実行**するための仕組みです。繰り返し行いたい作業（バックアップ、ログ整理、定期的な通知など）を自動化できます。

## cronでできること（例）

| 用途      | 例                |
| ------- | ---------------- |
| バックアップ  | 毎日深夜にデータを保存      |
| ログ整理    | 毎週日曜に古いログを削除     |
| 通知の送信   | 毎朝8時にリマインドメールを送信 |
| APIの実行  | 毎分APIを呼び出してデータ取得 |
| 定期バッチ処理 | 定時にスクリプトで画像変換など  |

## cronの書式（crontab）

cronの設定は `crontab` というファイルに書きます。基本の書式は以下の通りです：

```
* * * * * コマンド
│ │ │ │ │
│ │ │ │ └─ 曜日（0=日〜6=土）
│ │ │ └─── 月（1〜12）
│ │ └───── 日（1〜31）
│ └─────── 時（0〜23）
└───────── 分（0〜59）
```

### 例：

```
0 7 * * * /Users/aaaa/myscript.sh
```

→ 毎日朝7時に `/Users/aaaa/myscript.sh` を実行する

## macOSでcronジョブを設定する手順（テスト例）

以下は、1分ごとに「Hello from cron!」というメッセージをログファイルに出力する例です。

### 1. スクリプトを作成

```bash
nano ~/cron_test.sh
```

以下の内容を貼り付け：

```bash
#!/bin/bash
echo "Hello from cron! $(date)" >> ~/cron_output.log
```

保存して終了後、実行権限を付与：

```bash
chmod +x ~/cron_test.sh
```

### 2. crontabを編集

```bash
crontab -e
```

次の行を追加：

```bash
* * * * * /Users/aaaa/cron_test.sh
```

### 3. 動作確認

1分待ってから、以下のログを確認：

```bash
cat ~/cron_output.log
```

"Hello from cron!" のメッセージが出力されていれば成功です。

```bash
~ ❯❯❯ cat ~/cron_output.log
Hello from cron! Fri May  2 15:20:01 JST 2025
Hello from cron! Fri May  2 15:21:00 JST 2025
Hello from cron! Fri May  2 15:22:00 JST 2025
Hello from cron! Fri May  2 15:23:00 JST 2025
Hello from cron! Fri May  2 15:24:00 JST 2025
```

## 補足：Macでの注意点

* MacのcronはGUIログインセッションとは環境変数（`PATH`など）が異なるため、スクリプト内で明示的に `PATH` を設定するのが安全です。

```bash
export PATH=/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin
```

## まとめ

cronは、繰り返し実行したい作業を自動化する便利なツールです。スクリプトと組み合わせれば、ログ収集、通知、定期処理など、幅広い業務を効率化できます。macOSでも簡単に利用できるので、ぜひ活用してみてください。
JavaScriptを使って入力データに変更があった際に確認ダイアログを表示させる

# はじめに

EclipseでJava + SpringBoot + Thymeleafを使ったアプリ開発をしています。
将来の自分へ且つ、お困りの方に向けてメモ程度ですが残しておきたいと思います。
本記事は、CRUDのうちのU (Update)に関する内容になります。
今回、ユーザーがパスワード変更する際に以下のような挙動をJavaScriptで実装します。

1. 編集して値に変更がある状態で戻るボタンを押下すると確認ダイアログが表示される
2. 値に変更がなければ前のページに戻る
3. 値に変更がない状態で更新アクションを起こした際はアラートを表示し、パスワードを変更するよう促す

SpringBootのEntity、Repository、Serviceについては割愛します。
ビューのテンプレートエンジンにThymeleafを使用しています。
id属性、name属性はご自身のプロジェクトに合わせて適宜修正お願いします。

# 実際のコード

```html:edit.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>パスワードの変更</title>
</head>
<body>
    <h1>パスワードの変更</h1>
    
    <!-- 省略 -->

	<script th:inline="javascript">
		/*
            ※「はじめに」の1, 2に該当
			戻るボタン押下時に入力内容に変更があれば確認ダイアログを出す処理：backConfirm()
			・変更がある場合
				→ ダイアログ「変更を破棄して戻りますか？」を表示
				→「OK」選択で戻る
				→「キャンセル」選択で戻らない
			・変更がない場合
                → 前のページへ戻る
		*/
		function backConfirm() {
			// input要素のhidden属性（id属性がuserPassword）の値(パラメータ)を取得
			const oldPasswordValue = document.getElementById("userPassword").value;

			// input要素（id属性がcurrentPassword）の入力値を取得
			const currentPasswordValue = document.getElementById("currentPassword").value;

			// 型まで含めて同じ値か判定 (falseなら確認ダイアログを表示せずに戻る)
			if (oldPasswordValue !== currentPasswordValue) {

				// 値が違っていた場合に確認ダイアログを表示
				if (window.confirm("変更を破棄して戻りますか？")) {
					return true;	// 「OK」なら戻る
				} else {
					return false;	// 「キャンセル」なら戻らない
				}
			}
		}

		/*
             ※「はじめに」の3に該当
			更新ボタン押下時に入力内容が入力前と重複していればアラートを出す処理：duplicateCheck()
			・重複している場合
				→アラート「以前のパスワードと重複しています。」を表示
			・重複していない場合
				→更新する
		*/
		function duplicateCheck() {
			// input要素のhidden属性（id属性がuserPassword）の値(パラメータ)を取得
			const oldPasswordValue = document.getElementById("userPassword").value;

			// input要素（id属性がcurrentPassword）の入力値を取得
			const currentPasswordValue = document.getElementById("currentPassword").value;
			
			// 入力した値が入力前と同じだった場合にアラートを表示
			if (oldPasswordValue === currentPasswordValue) {
				window.alert("パスワードを変更してください。");
				return false;
			}
		}
	</script>

	<!-- パスワード変更フォーム -->
	<form th:action="@{/edit}" method="post">
		<th:block th:each="u : ${editUser}">
			<table border="1">
				<tr>
					<th>ユーザー名</th>
					<td th:text="${u.userName}"></td>
				</tr>
				<tr>
					<th>パスワード</th>
					<td><input type="text" name="currentPassword" id="currentPassword" th:value="${u.userPassword}"
							placeholder="ここにパスワードを入力" required></td>
				</tr>
			</table>
			<input type="submit" name="back" onclick="return backConfirm()" value="戻る">
			<input type="submit" name="update" onclick="return duplicateCheck()" value="更新">

            <input type="hidden" name="userName" th:value="${param.userName}">
			<input type="hidden" name="userPassword" id="userPassword" th:value="${param.userPassword}">
		</th:block>
	</form>
</body>
</html>
```
VS Codeの拡張機能 GitHub Copilot Chat にVS Codeのショートカットを奪われた

## 行の途中で改行するショートカットとGitHub Copilot Chat のショートカットが競合する問題を解決しただけの話

GitHub Copilot Chatをインストールしたら、Ctrl + Enter のショートカットの機能が変わってしまったので、ChatGPTに質問しました。

### プロンプトと回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/cea856d4-ef27-41aa-812b-e5abaf498aab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/8315cc5a-8440-4cc5-a484-b777151b024d.png)


### キーボードで、Ctrl を押しながら、K → S を押したところの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/bb534fff-e722-4394-bc1b-773a24dd890c.png)

### 変更箇所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/e1596c12-5dee-450b-9b8d-20abba994296.png)

### 変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/16c2b83d-0efd-446c-86db-13cae76b4078.png)
VSCodeを使ったリベース

## 環境

* Visual Studio Code(VSCode): v1.99.3
* GitLens(VSCode拡張プラグイン): v17.0.3

## 設定

### 強制プッシュ

1. サイドバー左下の歯車ボタンをクリックして、`設定` を選択
2. `拡張機能` を展開して `Git` をクリック
3. `Allow Force Push` をチェック

## ブランチのバックアップ作成

1. `ソース管理` 画面の`グラフ` から一番上のコミットメッセージを右クリック
2. `ブランチの作成...` をクリックして、ブランチ名を入力

::: note
リベースに失敗して、元に戻したいときは
1. <kbd><kbd>Ctl</kbd>+<kbd>Alt</kbd>+<kbd>P</kbd></kbd> -> `Git: ブランチの削除...`を選択
2. 失敗したブランチを選択
3. <kbd><kbd>Ctl</kbd>+<kbd>Alt</kbd>+<kbd>P</kbd></kbd> -> `Git: ブランチ名の変更...`を選択
4. 失敗したブランチ名を入力
:::
## コミットの修正

1. <kbd><kbd>Ctl</kbd>+<kbd>Alt</kbd>+<kbd>P</kbd></kbd> -> `GitLens: Git Rebase...` を選択
2. 変更したいブランチを選択
3. 変更したいコミットの1つ下を選択
4. `Interactive Rebase --interractive` をクリック

::: note
最初のコミットから修正する場合は、以下を実行
```bash
git rebase -i --root
```
:::

### コミットをまとめる

1. まとめたいコメントで `Squash` を選択

   ::: note
   コメントは1つ下と同じで良いなら `Fixup`を選択
   :::

2. `Squash` の場合はエディタ画面で、メッセージ変更後保存して閉じる

### コメントの変更

1. 変更したいコミットで `Reword` を選択
2. `START REBASE`をクリック
3. エディタ画面でメッセージ変更後、保存して閉じる

### コミットを分ける

1. 変更したいコミットで `Edit` を選択
2. `START REBASE`をクリック
3. <kbd><kbd>Ctl</kbd>+<kbd>Alt</kbd>+<kbd>P</kbd></kbd> -> `Git: Undo Last Commit` を選択
4. `ソース管理` 画面で必要なファイルをステージングして、ターミナルからコミットを繰り返す
5. 最後に `続行` をクリック
### コミットを削除
1. 削除したいコミットで`Drop` を選択
2. `START REBASE`をクリック
## 確認

1. サイドメニュの `ソース管理`を選択
2. `ソース管理グラフ`から変更されていることを確認

## 強制プッシュ

1. `ソース管理` 横の `...`(その他の操作)から `プル、プッシュ`->`プッシュ（強制）`をクリック
VSCodeを使った行単位でのコミット


## 環境

* Visual Studio Code(VSCode): v1.99.3
* GitLens(VSCode拡張プラグイン): v17.0.3

## 手順

1. `ソース管理` 画面の対象ファイルをクリック
2. 表示されたファイルの右側で該当する部分を右クリック
3. `選択する範囲をステージする`をクリック
4. メッセージを入力してコミット
Webの基礎用語7選!

## ステートフル・リクエスト・クッキー...などの用語について解説

Webアプリやネットワークの話になると、よく出てくる「ステートレス」「リクエスト」「クッキー」などの用語。

今回は、そんなWebの基礎用語を解説してみました。

### 1. 🧠 ステートフルとは？
 **「状態を覚えている通信」** のことをステートフルといいます。

たとえば、ログイン後に「この人はログイン中」とサーバー側が覚えてくれている状態。
これがステートフルです。チャットアプリやゲームなど、状態を継続的に管理する場面でよく使われます。

### 2. 🧼 ステートレスとは？
**「状態を一切覚えない通信」** のこと。HTTP（Webページをやりとりするプロトコル）は基本的にステートレスです。

つまり、サーバーは「この人がさっき何をしたか」を覚えていません。
そのため、毎回ログイン情報などを送る必要があります。


### 3. 📩 リクエスト（Request）
ユーザー（ブラウザなど）がサーバーに「この情報をください！」とお願いすること。

### 4. 📦レスポンス（Response）
サーバーが送られてきたリクエストに対して返す答え。HTMLファイルや画像、JSONなどが送られます。


webの通信は📩 リクエストと📦レスポンスという2つのやりとりが基本となっています。

### 5.🍪 クッキー（Cookie）とは？
クッキーは、サーバーがユーザーのブラウザに渡す小さな情報のメモ帳。

ログイン状態を保持したり

買い物カゴの中身を記録したり

ユーザーの行動を追跡したり

といった用途に使われます。クッキーのおかげで次回の訪問時にログイン情報やカートの中身などの状態を復元できます。﻿

### 6. 🌐 プロトコル（Protocol）とは？
通信のルール・お約束ごとのことです。

よく使われるプロトコルには：

HTTP：Webページの通信

HTTPS：HTTPの暗号化版

FTP：ファイルのやり取り

SMTP：メールの送信

などがあります。相手と正しく通信するには、同じプロトコルを使う必要があります。

### 7.🔢 ポート番号って何？
 **サーバーの中で動くアプリを区別するための「番号」**  です。

たとえば：

80番 → HTTP（Webサイト）

443番 → HTTPS（暗号化Web）

22番 → SSH（リモート接続）

といったように、どのサービスに話しかけたいかをポート番号で指定します。

### 🧩 まとめ

一言で説明すると、、、

ステートフル→状態を覚える通信（ログイン中など）
ステートレス→	状態を覚えない通信（毎回初対面）
リクエスト→	ブラウザからのお願い
レスポンス→	サーバーからの返事
クッキー→	小さな情報のメモ帳
プロトコル→	通信のお約束ごと
ポート番号→	サーバー内のアプリ識別番号
【用語解説】Reverse Shellについてざっくりまとめる。

### 概要
**ずばり・・・**
侵害したシステムから攻撃者に対し接続を行うシェルを用いた接続方法。
普通、SSHはユーザーから該当PCに通信を行うが、その逆で該当PCにあるシステムからユーザー（この場合は攻撃者に）に通信を行う。

C2サーバーなどに通信を要求する際に使う。ファイアーウォールやネットワークの境界を実質無視することが出来る。



### 参考文献（参照日2025年5月2日）

https://www.sompocybersecurity.com/column/glossary/reverse-shell
C++

El ORIGEN de C++
https://www.youtube.com/watch?v=iaxpH37EakA






# Ref
## linuxChad
C
https://qiita.com/kaizen_nagoya/items/3f341d5f69098092aad0

linux
https://qiita.com/kaizen_nagoya/items/e6b2ea3e8dd6eecaea5a

## self ref

C# to C++
https://qiita.com/kaizen_nagoya/items/ce454384f09c8f51831f



はじめてのC/C++ gccでbuild & go
https://qiita.com/kaizen_nagoya/items/9524adda90fd6fe21332
# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
Laravelリクエストパラメータについて

## リクエストパラメータについて
下記リクエストの受け取り方を確認してみる。
```php
[
    'name' => '山田太郎',
    'age' => 25,
    'job' => 'student',
]
```


## リクエストを1つずつ受け取る
inputを使用すると、リクエストパラメータを1つずつ取得できる。
```php
public function getUserInfo(Request $request){
    // ユーザー情報を取得する処理
   $name = $request->input('name'); //山田太郎
   $age = $Request->input('age'; //25
   $job = $request->input('job'); //student
}
```
LaravelのIlluminate\Http\Requestクラスでは、リクエストパラメータにアクセスする際、動的プロパティ（例：$request->name）を使用すると、次の優先順位で値が取得される。

### 1. クエリパラメータ（GET）やPOSTデータ（フォーム送信）
### 2. ルートパラメータ（ルーティングで定義されたパラメータ）
同じ名前の値が両方に存在する場合は、リクエスト（GET/POST）側が優先される。

例：以下のようなルートがあるとする

```php
Route::get('/user/{name}', [UserController::class, 'getRequestDemo']);
```
URLが
```php
/user/花子?name=太郎&age=20&job=student
//このとき、$request->name は「花子」ではなく「太郎」を返す
//（クエリの name=太郎 が優先されるため）
```



## 明示的に値を取得したい場合

クエリパラメータだけ取得したい
```php
$name = $request->query('name');
```

POSTデータだけ取得したい
```php
$name = $request->post('name');
```

ルートパラメータだけ取得したい
```php
$name = $request->route('name');
```

## リクエストをまとめて受け取る
受け取りたいパラメータを指定して、連想配列で受け取る場合はonlyを使用する。
```php
public function getUserInfo(Request $request){
    // ユーザー情報を取得する処理
 $userIufo =$request->only('name','age','job');
   //[
    'name' => '山田太郎',
    'age' => 25,
    'job' => 'student',]
}

```
受け取りたくないパラメータを指定して連想配列で受け取る場合は、exceptを使用する。

```php
public function getUserInfo(Request $request){
    // ユーザー情報を取得する処理
 $userIufo =$request->expect(['name']);
   //['age', 'job'];
}
```

全てまとめてリクエストパラメータを受け取る場合は、allを使用する。
ですが、$request->all() を使うと、全ての入力データ（クエリパラメータ、POSTデータなど）を無条件で受け取るため、意図しない値や不要な値まで取り込んでしまうリスクがあるので明示的に必要なデータだけを受け取る方法が望ましい。

```php
public function getUserInfo(Request $request){
    // ユーザー情報を取得する処理
 $userIufo =$request->all();
   //[
    'name' => '山田太郎',
    'age' => 25,
    'job' => 'student',
}
```
知らなきゃ損！システムマニュアルの重要性

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/ebf7cf95f7f577845d9a&utm_content=link-top&f000099824=https://qiita.com/SPIRAL_internship/items/ebf7cf95f7f577845d9a

## はじめに
こんにちは、スパイラル株式会社のインターン生です！
今回は、「システムマニュアルの重要性」について紹介していきます。
最近、生活で**マニュアル**に触れることが多いので、この記事を書こうと思いました。

## システムマニュアルって何？
マニュアルとは、あることがらの手順や方法をまとめた手引書を意味します。
その一つである**システムマニュアル**とは、システムを使用する際の手順やルールについてまとめたものです。

## システムマニュアルの主な役割
1. **知識の共有**
システムの基本的な内容を理解することで、作業の停滞やミスを未然に防ぐことができます。
1. **効率的な運用**
操作手順が分かれば、作業効率が上がり、トラブルが発生した際にも迅速に対応できます。
1. **新人研修や業務の引継ぎ**
新しくシステムを利用する社員にも、マニュアルがあれば簡単に教えることができます。

## どんな人にとってマニュアルが必要？
- 新入社員
- 非IT部門
- 業務を引き継ぐ人
---
▼お試しはこちら

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/ebf7cf95f7f577845d9a&utm_content=link-middle&f000099824=https://qiita.com/SPIRAL_internship/items/ebf7cf95f7f577845d9a

---
## マニュアルがない時に起きる問題
1. **ミスやトラブルが多発**
システムの知識や操作方法がわからないと、ミスが多発し、取り返しのつかない事態になることもあります。
1. **作業の停滞**
エラーが発生した際、原因究明や問い合わせに時間がかかり、業務に遅れが生じます。
1. **サポート担当者への負担**
利用者から同じような問い合わせが発生し、システムのサポート担当者が対応に追われてしまいます。対応が遅れると、利用者の作業も停滞してしまいます。

マニュアルがないと、以上のような問題が発生してしまいます。
むしろマニュアルさえあれば、こういったトラブルを未然に防ぐことができます。

## ダメなマニュアルの特徴
以下は、私がインターンや実生活を通して実際に感じた、**ダメなマニュアル**の特徴です。
1. **手順の記載が雑**
例えば「〇〇を変更してください」といった案内だけでは、どこをどうクリックして進めばいいかわかりません。丁寧な案内がないと混乱してしまいます。
1. **専門用語が多い**
専門用語が頻出すると、読み手は読む気を失せてしまいます。
1. **情報が古い**
画面デザインや手順が変更され、マニュアルと異なる場合、「そんなボタンある？」「全然違う画面に飛んだよ！」などの不安を招きます。

## マニュアルに求められること
これまでの内容を踏まえて、マニュアル作成では以下のことが求められると考えました。
- 具体的な手順の記載
- 初心者でも理解できるやさしい表現
- システムの変更に応じて常にマニュアルを更新
- よくある質問（FAQ）やエラー対応の記載

これらにより、利用者の業務効率化やサポートの負担軽減なども期待できます。

## まとめ
システムマニュアルは利用者に向けた操作手順の手引書です。
マニュアルがない、またはマニュアルが分かりにくい場合、トラブルやサポートに余計な時間がかかってしまいます。
だからこそ、分かりやすく、最新の内容が反映されている**マニュアル**が重要なのです。
この記事で、少しでもマニュアルのありがたみを理解していただけると幸いです！

## 参考
- [Wikipedia（マニュアル）](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB)
- [円滑な業務運用に不可欠な「システムマニュアル」とは](https://tepss.com/column/2017/10/03/124/)
- [システムマニュアルに記載すべき内容・注意点をおさえて作成しよう！](https://tepss.com/column/2020/03/06/855/)

--- 
 
私がインターンしているスパイラル株式会社は、ローコードプラットフォーム、SPIRAL ver.1のトライアルアカウントを無償提供しています。このアカウントの記事でも紹介するように、たくさんの機能があります。  
▶︎ フォーム   
▶︎ 認証エリア   
▶︎ ログイン   
▶︎ メール送信   
▶︎ カスタムプログラム   
  
などが作成できますので、ぜひ試してみてください!!  

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/SPIRAL_internship/items/ebf7cf95f7f577845d9a&utm_content=link-bottom&f000099824=https://qiita.com/SPIRAL_internship/items/ebf7cf95f7f577845d9a

そして、今チームでトライアル登録者向けに、オンボーディングコンテンツを作成しています。SPIRAL ver.1にご興味のある方、ぜひこちらもご覧ください👇  

https://knowledge.spirers.jp/special/detail/11680

---
C 

El ORIGEN de C
https://www.youtube.com/watch?v=5o6LPhLCjGY


# El espíritu de C
Cの精神

Don’t prevent the programmer from doing what needs to be done.
No impida que el programador haga lo que debe hacer.
プログラマが必要なことをするのを妨げないでください。

Keep the language small and simple.
Mantenga el lenguaje pequeño y simple.
 言語を小さく単純にしてください。

Provide only one way to do an operation.
Proporcionar sólo una forma de realizar una operación.
 一つの操作を実行する方法は１つだけにしてください。

Make it fast, even if it is not guaranteed to be portable.
Hazlo rápido, aunque no haya garantía de que sea portátil.
可搬性を保証できなくても、高速にしてください。


# Ref.

Cの精神とCの原則：C言語がわかるとは
https://qiita.com/kaizen_nagoya/items/d2a24a41f00c939c5e70

「本物のC」は「Cの精神」と 「freestanding と hosted」と「未定義、未規定、処理系定義」
https://qiita.com/kaizen_nagoya/items/11d66a02479239bf80dd

C言語(C++)が必要な人と必要ない人
https://qiita.com/kaizen_nagoya/items/2afe9e846b55b24cb6f1

C言語を習得する３つの方法
https://qiita.com/kaizen_nagoya/items/84cab0888c193bba429b

３つの記事が理解できたらCプログラマと名乗っていいってことで
https://qiita.com/kaizen_nagoya/items/f4cb11ead27733f37610

# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
[AWS #41] AWS Migration Hub

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
皆様お疲れ様です。:computer:
今回はAWSの移行分野にある<font color="c00000">**「AWS Migration Hub」**</font>について見ていきたいと思います。

:upside_down: AWSへの **「移行を楽にする」** 主要サービスを見ていきたいと思います。

## AWS Migration Hub
Migration Hubは、**マイグレーション（移行）を可視化する**ダッシュボードサービスになります。検出、評価や戦略、移行などそれぞれのフェーズにおいて、収集した**情報、状況、推奨事項を確認する**ことができます。
![AWS41_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/988dc389-457e-459b-9a69-c908851d72c2.png)

## おわりに
今回のちょっとしたまとめになります。

:::note info
**Migration Hub**は<font color="c00000">**移行を可視化する**</font>ダッシュボード
:::

最後までお読みいただきありがとうございました！
>>**日頃より活用している参考書です。**
>> **「参考書」**
[**AWS認定クラウドプラクティショナー改定第3版（AWS Migration Hubは360ページ）**](https://x.gd/19i6N)
>

> **「AWS公式サイト」**
[**AWS Migration Hub**](https://aws.amazon.com/jp/migration-hub/)

> **「Youtube」**
[**第十八回 ちょっぴりDD - AWS への移行ステータスを一元管理。AWS Migration Hub のご紹介**](https://www.youtube.com/watch?v=KonZEchQXvg)
>
セルフホスト可能なAIアプリ開発の調査（備忘メモ）

以前にXserverでDifyをホスティングしてみましたが、
他にも、クラウドサーバー上で自前のAIアプリケーションを作成できないかと思い、まずはリサーチから。

オープンソースでセルフホスティング可能な注目のツールをまとめました。


> ※この記事の内容は、筆者が軽く調べてみた範囲でまとめたものです。難易度や制約、詳細な技術要件などは今後さらに検証が必要ですので、その点をご理解いただければと思います。
> 
筆者自身はコーディング初心者のため、まずはノーコードやローコードで扱えるツールを探している。という前提です。

---

## 1. Dify.AI
- **URL**: [https://dify.ai/](https://dify.ai/)
- **概要**: ノーコードでAIアプリケーションを開発可能なオープンソースプラットフォーム。
- **特徴**:
  - ドラッグ&ドロップ式の直感的UI
  - Dockerでの簡単なセルフホスティング
  - OpenAI、Anthropic、Llama などの各種LLMと統合

## 2. LangChain
- **URL**: [https://www.langchain.com/](https://www.langchain.com/)
- **概要**: LLMアプリケーション構築のための本格的なフレームワーク。
- **特徴**:
  - Python/JSで開発可能なモジュール式構造
  - 自前サーバーでのホスティングに対応
  - 外部ツールとの統合が柔軟

## 3. LlamaIndex（旧GPT Index）
- **URL**: [https://docs.llamaindex.ai/en/stable/](https://docs.llamaindex.ai/en/stable/)
- **概要**: データソースをナレッジベースとしてLLMに活用するためのフレームワーク。
- **特徴**:
  - PDFやDBなど多様なデータとの接続に対応
  - LangChainなど他ツールと組み合わせて使用可能
  - 自前インフラでの運用にも対応

## 4. Flowise
- **URL**: [https://flowiseai.com/](https://flowiseai.com/)
- **概要**: LangChainベースのフロービルダー。
- **特徴**:
  - ノーコード感覚でLLMワークフローを構築
  - UIからコンポーネント接続して設計可能
  - Dockerによるデプロイに対応

## 5. LocalAI
- **URL**: [https://localai.io/](https://localai.io/)
- **概要**: ローカルでOpenAI互換のAPIを実現するエンジン。
- **特徴**:
  - Llama、Stable Diffusion等に対応
  - OpenAI APIと互換性があるため既存アプリの移植が容易
  - 軽量で自前GPUで動作可能

## 6. Haystack by Deepset
- **URL**: [https://haystack.deepset.ai/](https://haystack.deepset.ai/)
- **概要**: 検索・質問応答システム構築に特化したLLMフレームワーク。
- **特徴**:
  - RAG（検索+生成）ベースの構成が可能
  - Web UIやFastAPIベースのAPIを提供
  - セルフホスト構成に対応

## 7. LangFlow
- **URL**: [https://www.langflow.org/](https://www.langflow.org/)
- **概要**: LangChainのノードベースUI。
- **特徴**:
  - フロー形式でLLMアプリを視覚的に構築
  - Dockerによるローカルデプロイに対応
  - 軽量で試作に最適

## 8. Rasa Open Source（旧Bothub.ai）
- **URL**: [https://opensource.rasa.com/](https://opensource.rasa.com/)
- **概要**: オープンソースの会話AI開発プラットフォーム。
- **特徴**:
  - 独自サーバー上でのホスティングに対応
  - 高度なNLUとコンテキスト処理
  - チャットボット構築に特化

---

## 🔚 まとめ

- **簡単に使いたい** → Dify.AI、Flowise
- **高度にカスタマイズしたい** → LangChain、LlamaIndex
- **ナレッジ検索やQAに特化** → Haystack
- **ローカル実行重視** → LocalAI
- **UIで視覚的に設計したい** → LangFlow
- **チャットボット開発に強い** → Rasa

視覚的にできるのは、LangFlowだからまずはこのあたりをみてみようかな。
TeX, LaTeX

El ORIGEN de (La)TeX
https://www.youtube.com/watch?v=qT-3QFYsHB8

TE ENSEÑO a USAR LaTeX [EN 15 MINUTOS⏰]
https://www.youtube.com/watch?v=5X07G5edHIE

##  Donald Knuth

## LaTeX

# TeX

Una vez asistí a un curso de TeX impartido por Toshiharu Ohno de ASCII.
ASCII社のToshiharu OhnoさんのTeXの講習を受けに行ったことがあります。



# ref

LaTeX(3) 2ε美文書作成入門 奥村 晴彦
https://qiita.com/kaizen_nagoya/items/8d10a18bb5c8cf2f5530

LaTeX(0) 一覧
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

macOSにLaTeX(8) ７つの利点と導入方法。This file needs format `pLaTeX2e' but this is `LaTeX2e'. error(62)
https://qiita.com/kaizen_nagoya/items/75be26d34a7432d5700b


[Researchmap][TeX]入力するときの効率的な手順案（４つの関門）LaTeX(1)
https://qiita.com/kaizen_nagoya/items/babf5a1d86e53e2db719

IEEE LaTeX(2)
https://qiita.com/kaizen_nagoya/items/08da7965276f53553afb

LaTeX(4) IEEEに投稿する準備
https://qiita.com/kaizen_nagoya/items/cd371a58b833bd7b8788

Missing $ inserted. error(75) 今日LaTeX(7)で調べたこと。
https://qiita.com/kaizen_nagoya/items/31edf224942eb8a692a9

確率論及統計論(伏見康司)の数式をTeX/LaTeX(12)入力するための13の技法 統計と確率(20)
https://qiita.com/kaizen_nagoya/items/9c692c4d3546ffbb70b4

データ形式の昨日、今日、明日。統計(37) LaTeX(16)
https://qiita.com/kaizen_nagoya/items/15a77a879dcd34c458f3

File Ended while scanning use of :解決, 今日のLaTeX(6) error(74)
https://qiita.com/kaizen_nagoya/items/ec6ea027c99ced27ba2b


人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e
環境構築（asdf）で~./asdf.shが見当たらない

## WSL2(Ubuntu)環境で「~./asdf.shが見当たらない」旨のエラー

しかし実際に作業を進めるにあたって影響が出ていなかったためそのまま環境構築作業を進めた
が、結局関連っぽいエラーが出てきたのでエラー原因を取り除く

### 試したこと
1\. 「~./asdf.shが見当たらない」と出ているので該当フォルダを確認するも、homebrew経由でインストールしたはずのasdf.shが見当たらない

2\. homebrew経由ではなくgitclone経由でインストール（同じWindows環境で先輩が既に実施した）

### 解決方法
結論としてはasdfをgitclone経由で再インストールにて上記エラーメッセージは発生しなくなった

### 推定原因
brew経由でasdfインストールを行った
→homebrewのメインユーザはMacが多いため環境差異で上記エラーが出た？
環境構築にあたって、複数のインストールやファイルの書き換えを行ったタイミングで該当箇所を弄った
→chatgptを使用して重要箇所（？）のファイル書き換えを行った


### 改善点
ファイル構成等を理解していない状態で、環境構築を行うのは危険

構築前に以下の点には気を付ける
・ファイル構成
・実行するコマンドの意味（何をしようとしているか）
RUST

El ORIGEN de RUST
https://www.youtube.com/watch?v=ooKSBrM1g-E

Uno de mis sueños es reescribir LINUX usando RUST.
RUSTでLINUXを書き直すのが一つの夢です。

Personalmente, quería reescribir Linux en C++.
個人的にはC++でLinuxを書き換えたいと思っていました。

AUTOSAR ha elegido RUST como su lenguaje de programación, después de C y C++.
AUTOSARで、C,C++に続いてRUSTを記述言語に選んでいます。

Estoy trabajando duro todos los días para escribir algo en RUST.
RUSTで何か書こうと精進の日々です。

# ref.
Rust calendar 2024 を開設しました。
https://qiita.com/kaizen_nagoya/items/0d990c0eec0d665def65

2022年に流行らせようと思っている技術「2022年に流行る技術予想」参加記事 Ethernet(78）Rust(29) 
https://qiita.com/kaizen_nagoya/items/b58f568365d2abec968c

Rust(5) LT＆パネルを企画するにあたって https://qiita.com/kaizen_nagoya/items/dca0e71fddc189ad622f


「Rust(6) Calendar 2021」集計してみる
https://qiita.com/kaizen_nagoya/items/f6431cec90a49879dcd8

AUTOSARのRust(25)の取り組み
https://qiita.com/kaizen_nagoya/items/6669aa552b6150d85350

Explanation of ARA Applications in Rust(48), AUTOSAR 1079, R24-11, AP
https://qiita.com/kaizen_nagoya/items/2d661baf41478f4b281f

Rust(0) 一覧 
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

Rust(1)入門 
https://qiita.com/kaizen_nagoya/items/b3a42bf5a849dabe52c5

はじめてのRUST(2) 
https://qiita.com/kaizen_nagoya/items/dd8f5e3b218d48fb79e1

dockerでRUST(3) 
https://qiita.com/kaizen_nagoya/items/c07350f6ab6ec656c42c

# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
FPGA内部の短いトリガをLEDで目視できるように引き延ばすRTL

# 概要
FPGA内部のOneShotトリガの発生状況をLEDで目視したい場合、トリガ信号をLED出力ピンに接続したとしてもパルス幅が短すぎてLEDの発光を目視確認できません。

入力パルスを規定幅以上に引き延ばすモジュールを作っておいて、このモジュールを通してLED出力に接続することで目視確認しやすくなります。

# 注意事項
本モジュールはFPGA内部にあるクロック同期しているトリガを入力することを前提としています。
ピンから直接入ってくる(同期化していない)パルス入力信号を引き延ばしたい場合は、本モジュールの前段で同期化してエッジ検出する必要があります。

# 動作概要
* 入力がアサートされると指定カウントをロード
* カウンタはダウンカウント動作で、ゼロ到達でホールド
* 出力パルスはダウンカント中アサートする
* ダウンカウント中に入力が再アサートされた場合も指定カウントをロード（出力は途切れずに延長させる）

# ポイント
引き延ばすクロックサイクル数の指定カウントをパラメータ化しています。
論理合成時は500msなど実際に目視できる長さにしますが、シミュレーションの500msは長すぎるのでシミュレーション時のみ10サイクルとか適当な長さにすることができます。

# VHDLソース
```vhdl
------------------------------------------------------------------
--入力パルスを規定幅以上に引き延ばすモジュール
------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity PULSE_EXTENDER is
    generic(
    EXTEND_CYCLE    :integer := 50000000--引き延ばすクロックサイクル数(50MHzで0.5s)
    );    
    port (
    i_CLK           :in  std_logic;--クロック入力
    i_RST_p         :in  std_logic;
    i_SOURCE_PULSE_p:in  std_logic;--元のパルス
    o_EXTEND_PULSE_p:out std_logic--引き延ばしたパルス
    );
end entity;

architecture RTL of PULSE_EXTENDER is
    signal pulse_count  :integer range 0 to EXTEND_CYCLE-1;
    signal pulse_ext    :std_logic;
begin

process(i_CLK,i_RST_p)begin
    if(i_RST_p='1')then
        pulse_count <= 0;
        pulse_ext   <= '0';
    elsif(rising_edge(i_CLK))then
        if(i_SOURCE_PULSE_p='1')then
            pulse_count <= EXTEND_CYCLE-1;--カウントをロード
            pulse_ext   <= '1';
        else
            --ダウンカウントさせて０まで到達したら止める
            if(pulse_count = 0)then
                pulse_count <= 0;
                pulse_ext   <='0';
            else
                pulse_count <= pulse_count - 1;
                pulse_ext   <='1';
            end if;
        end if;
    end if;
end process;

o_EXTEND_PULSE_p <= pulse_ext;--出力パルス

end architecture;
```

# テストベンチ

```verilog
`timescale 1ns / 1ps
module PULSE_EXTENDER_tb();

reg  i_CLK           =0;
reg  i_RST_p         =1;
reg  i_SOURCE_PULSE_p=0;
wire o_EXTEND_PULSE_p;

PULSE_EXTENDER #(
    .EXTEND_CYCLE(20) // 新しいクロックサイクル数を指定
) PULSE_EXTENDER (
.i_CLK           (i_CLK           ),
.i_RST_p         (i_RST_p         ),
.i_SOURCE_PULSE_p(i_SOURCE_PULSE_p),
.o_EXTEND_PULSE_p(o_EXTEND_PULSE_p)
);
//パルス入力
task TASK_TRIGGER;
  begin
    @(posedge i_CLK);
    i_SOURCE_PULSE_p = 1;
    @(posedge i_CLK);
    i_SOURCE_PULSE_p = 0;
  end
endtask
//クロック50MHz
always #20 i_CLK = ~i_CLK;

initial begin
    #200;
    i_RST_p = 0;//リセット解除
    #500;
    TASK_TRIGGER();
    #1200;
    //アサート中に入力させる
    TASK_TRIGGER();
    #400;
    TASK_TRIGGER();
    #500;
    TASK_TRIGGER();
end

endmodule
```


# シミュレーション
シミュレーションでは延長設定を20サイクル
に短縮しています。
１発目の入力は20サイクル(カウント19~0)に引き延ばされ、２～４発目ぱ延長した動作になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/355ffcaf-2823-46ed-85f5-661a00e27d3b.png)

# その他応用
パルスの発生状況をレジスタリードでモニタしたい場合にも応用できます。
リード周期より長めに引き延ばしておけばパルスが来ているか否かをモニタしやすくなります。
COBOL

COBOL es INMORTAL
https://www.youtube.com/watch?v=5B5tKi8uNPo


El primer programa que escribí fue en ensamblador.
最初にプログラムを組んだのはアセンブラです。

Estudié COBOL, FORTAN y BASIC aproximadamente al mismo tiempo.
COBOL, FORTANとBASICは、ほぼ同時に勉強しました。

Para el ensamblador, adapté el editor VZ.
アセンブラではVZエディタの移植をしました。

En BASIC, adapté un emulador de comunicaciones que había estado usando en la universidad.
BASICでは、大学で利用していた通信エミュレータの移植をしました。

Mi mayor contribución a FORTRQN es una biblioteca de aproximaciones de Pade para ecuaciones diferenciales simultáneas necesarias en la teoría de control automático.
私のFORTRQNで書いた最大の貢献は自動制御理論に必要な連立微分方程式のPade近似のライブラリです。

No hay ninguna contribución práctica en COBOL.
COBOLでは実用的な貢献はありません。

Si puede leer y escribir en inglés, podrá utilizar programas COBOL con poco o ningún entrenamiento.
COBOLプログラムは英語が読み書きできれば、ほとんど教育せずに実用的に使えます。

# ref
COBOLは知らなくてもCOBOLの保守はできる？品質(27)
https://qiita.com/kaizen_nagoya/items/ca27bace6e9cf0cead0e

docker(194)でcobol。
https://qiita.com/kaizen_nagoya/items/d91aa6370f377ab676ff

COBOLを40年ぶりにうごかしてみた:dockerでcobol。docker(81)プログラムちょい替え（4）
https://qiita.com/kaizen_nagoya/items/9d9a216ce1b7b05dbb43

QiitaでもCOBOL
https://qiita.com/kaizen_nagoya/items/60596bad631956127cf8

# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
MacにAzure Power Shellを入れる

# 概要
タイトル通りですが、Mac（MacBook Air）からPower Shellを使ってAzureを操作する方法の備忘録

# 環境
MacBook Air M2, 2022

# 手順
Microsoft Learnに記載の[手順](https://learn.microsoft.com/ja-jp/powershell/azure/install-azps-macos?view=azps-13.4.0&viewFallbackFrom=azps-11.3.0)に沿って作業を進めます。

### Power Shellをインストールする

Microsoft Learnの[macOS への PowerShell のインストール](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.5)に手順が記載されています。

いろいろな手順がありますが、直接ダウンロードしてインストールする方法を取りました。
→[こちら](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.5#installation-via-direct-download)

私が使っているのはMacBook AirでApple M2搭載なので、Armのパッケージをダウンロードしました。
ダウンロード後、Finderでパッケージファイルをcontrolキーを押しながらクリックし、コンテキストメニューから「開く」を選択します。

以下のような画面が表示されるので、「開く」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/fb4e7ce0-31d4-4b0b-bc0b-11d9224ab868.png)

インストーラーが起動してきます。指示に従ってインストールを進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/9cd01e91-6059-472b-a64a-dc3caf8198d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/6109f20e-3cb6-41f0-85a2-fd742a9cbce5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/daf8e162-a9c2-4544-9a52-2bc5f3d309c6.png)

### Azure PowerShell モジュールのインストール
Power Shellを起動します。
Launchpadから、Power Shellのアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/2d0507bc-145b-485f-b43d-e82cf816590f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/eb7929c5-078d-4ae1-8008-4ab9c9e9eee7.png)


以下のコマンドを実行します。
```
> Install-Module -Name Az -Repository PSGallery -Force
```

### Azureにログインしてみる
以下のコマンドを実行します。
```
> Connect-AzAccount
```

ブラウザが起動するので、Azureのログインを行なってください。
ログインが完了すると、以下のような表示になるので、ブラウザを閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/a2648eb6-9aa7-47ff-90c5-6ef72e062433.png)

Power Shellに戻ると、以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ddfb57d0-f2d6-4cf8-8ecc-1f1b69b61729.png)