OmniAICreator/Qiita-1.07M huggingface dataset:
Record Producer ２：Record Producerの開き方［ServiceNow］

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# Record Producerとは
- Service Catalog の一部であり、データを特定のテーブルに登録するためのフォーム
- Service Catalog は、ユーザーが必要なリクエスト（サービス、ハードウェア、ソフトウェア、人事申請など）を申請できるポータル


# Record Producerの開き方
- Filter navigatorでRecord Producerと検索すると出てくる
![reko.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/945f12ef-8187-48b8-bc0d-c369e46fc912.png)
個人的備忘録：ターミナルでCtrl + Uを使ってコマンドを一括削除する方法について、体系的にまとめてみた

## はじめに
ターミナルを使ってコマンドを入力しているとき、途中で間違えたり、修正したくなったりすることがあります。

:::note info
**そのたびに `Backspace` や `Delete` を連打するのは面倒ですよね。そんなときに便利なのがショートカットキー `Ctrl + U` です。**
:::

今回は、この `Ctrl + U` の使い方や実際の使用感について紹介します。

## 書こうと思ったきっかけ
普段から Linux や macOS のターミナルを使用しているのですが、長いコマンドを入力している途中で最初から書き直したくなることがよくあります。

:::note warn
***そのたびに手動で削除していましたが、ある日、`Ctrl + U` を使うと一瞬で削除できることを知りました。***
:::

この便利さを共有したいと思い、この記事を書くことにしました。

## `Ctrl + U` の使い方
`Ctrl + U` は、ターミナルのコマンドラインで **カーソルの左側にある文字をすべて削除** するショートカットキーです。

### 使い方
1. コマンドラインに何か入力する。
2. 途中で `Ctrl + U` を押す。
3. カーソルの左側の文字がすべて削除される。

### 具体例
```bash
$ echo Hello, World!
```
この状態で `Ctrl + U` を押すと、すべて削除され、プロンプトが空になります。

また、カーソルが途中にある場合は、カーソルの左側のみが削除されます。
```bash
$ echo Hello, World!
             ↑
```
この状態で `Ctrl + U` を押すと、`echo Hello, ` だけが削除され、残るのは `World!` になります。

## 実際に使ってみた
実際に `Ctrl + U` を試してみると、コマンドの修正がとても楽になりました。特に、長いコマンドを打ち直すときや、誤った入力をすぐに消したいときに便利です。

**コマンド実行前**

![Screenshot 2025-02-13 at 6.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/50274493-f887-47be-b6f6-17aed0716a96.png)

**コマンド実行後**

![Screenshot 2025-02-13 at 6.32.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4f9237a9-d188-4692-8973-94776bc10f89.png)


さらに、`Ctrl + U` だけでなく、以下のショートカットと組み合わせると、より快適にコマンド編集ができます。

- `Ctrl + K`: **カーソルの右側を削除**
- `Ctrl + W`: **直前の単語を削除**
- `Ctrl + Y`: **`Ctrl + U` や `Ctrl + K` で削除したテキストを貼り付け**

例えば、間違えた部分だけを削除したい場合は `Ctrl + W`、入力の続きを調整したい場合は `Ctrl + K` を使うと、より効率的に操作できます。

## まとめ
`Ctrl + U` は、ターミナルで作業をする際に非常に便利なショートカットキーです。カーソルの左側の文字を一括で削除できるため、手動で消すよりも効率的に作業ができます。

:::note info
**また、他のショートカットと組み合わせることで、よりスムーズにコマンド編集が可能になります。**
:::

ターミナルを頻繁に使う方は、ぜひ `Ctrl + U` を活用して、作業効率を向上させてみてください！
SSOの基本についてまとめた

## SSOの基本
大きく分けてCookie型とリバースプロキシ型に分かれる。
これらは基本的に認証の窓口としての機能を担い、実際の処理は認証サーバーに依頼し処理させる。

### Cookie型
SSOの範囲は同一ドメイン内のページに限られる。

1. webサーバーにエージェントをインストール
2. 認証サーバーがCookieに認証情報を含めクライアントに返す
3. 別のwebサーバーへのアクセス時、クッキー情報を元に認証を行う

### リバースプロキシ型
Cookie型同様に、同一ドメイン内のページに限られる。
ID/PASSを用いる方法とデジタル署名を用いる方法がある。

1. リバースプロキシが認証役を担う
2. 認証後、リバースプロキシがwebサーバーにアクセスする

---

## 実際のサービスで見られるSSO方式
### Cookie型
#### SAML (Security Assertion Markup Language)
認証情報、**属性情報、アクセス制御情報**をドメインを超えて伝達可能なプロトコル。  
主に企業向けのSSOで利用される。  
SP（Service Provider）とIdP（Identity Provider）で構成され、IdPがユーザーを認証し、SPにSAMLアサーションを渡すことでSSOを実現する。

- **特徴**
  - XMLベースのプロトコル
  - 認証情報を暗号化して安全にやり取り可能
  - 主に企業向けのSSOに採用される（Google Workspace, AWS IAM など）

- **流れ**
  1. ユーザーがSP（例: AWS）にアクセス
  2. SPがIdP（例: Google Workspace）にリダイレクト
  3. IdPでユーザーが認証される
  4. 認証後、SAMLアサーションがSPに送信される
  5. SPがアサーションを検証し、SSOが成立する

#### OIDC (OpenID Connect)
OAuth2.0の上に構築された認証フレームワークであり、**JSON Web Token（JWT）** を用いた認証情報のやり取りが可能。  
GoogleやAWS Cognitoなど、モダンなSSOで広く利用されている。
OIDCトークンは短命のため、セキュリティリスクが少ない。
GitHub ActionsでAWS Access Key IDやAWS Secret Access Keyを環境変数に設定が不要という点から、先日OIDCを使ってAWSにデプロイする仕組みを導入した。

- **特徴**
  - OAuth2.0を拡張し、認証（Authentication）を追加
  - JSONベースのプロトコルで軽量
  - IDトークン（ID Token）を利用し、ユーザー情報を伝達

- **流れ**
  1. ユーザーがOIDCプロバイダ（例: Google）にログイン
  2. 認証成功後、アクセストークン（JWT）を取得
  3. クライアントがJWTを含めて各サービスにリクエスト
  4. サーバー側でJWTを検証し、ユーザーを認証

#### JWT (JSON Web Token)
トークンベースの認証方式であり、認証情報を**ステートレス**に管理できる。  
JWTは電子署名付きのJSONデータであり、改ざんが検出可能。

- **特徴**
  - 認証状態を維持するために利用
  - クライアント側でのトークン管理が可能
  - API間の認証やマイクロサービス間認証でよく使われる

- **構成**
  - **ヘッダー（Header）**: 署名アルゴリズム情報
  - **ペイロード（Payload）**: ユーザー情報や有効期限
  - **署名（Signature）**: 署名鍵でのハッシュ値

- **流れ**
  1. 認証サーバーがJWTを発行
  2. クライアントが各サービスへJWTを付与してリクエスト
  3. サーバー側がJWTを検証し、認証を行う

---

### リバースプロキシ型
#### OAuth2.0
認可（Authorization）を担うプロトコルであり、SSOの一部として利用されることもある。  
特にAPI認証やマイクロサービス間の認可で広く使われる。

- **特徴**
  - クライアントが直接認証情報を扱わない
  - アクセストークンを発行し、各サービスが認可を行う
  - 認証そのものはOIDCなどと組み合わせる

- **流れ**
  1. クライアント（アプリ）が認可サーバーに認可リクエストを送信
  2. ユーザーがログインして認可を許可
  3. 認可サーバーがアクセストークンを発行
  4. クライアントがアクセストークンを用いてリソースサーバーにアクセス
  5. リソースサーバーがアクセストークンを検証し、リクエストを許可

- **適用例**
  - API Gateway によるSSO
  - AWS Cognito / Google Sign-In との連携
  - Webアプリ + モバイルアプリ間の統合認証

---
MinecraftServerで特定のIPアドレスを遮断する方法

最近、ふとマイクラ鯖のコンソールを見ると見慣れない、IPからの接続があると気づいた。

さいわい、ホワイトリストを導入していたので、ワールドに入ることはできない様子。

そもそも、Mod鯖なのにバニラ接続を何度も試みている様子。 (参加する意思は無さそう...)

その後も海外から何度もマイクラ鯖にログインしようと何度もアクセスしてきていて、それが嫌になったので対策をすることにした...

# 環境

* ProxmoxVE 8.2.4 下のVM
* Debian 12.6.0-amd64-netinst.iso

# 作業内容

## 1. IPアドレスの特定

ログを見たところ海外からアクセスしてくるIPは2つあった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641372/d68b7674-48a6-4a1b-8513-bf23dcc89287.png)

1個目: 45.135.xxx.xxx
2個目:199.58.xxx.xxx

## 2. 特定IPアドレスの拒否

以下の`ufw`コマンドでIPアドレスの拒否を試みた

```
root@debian:~# ufw deny from 45.135.xxx.xxx to any
root@debian:~# ufw deny from 199.58.xxx.xxx to any
```

しかし、これだとうまくいいかないことに気づいた

というのも、`ufw`のルールには優先順位があり、これらルールの順位が一番上に来ていないようだ

以下の`ufw status numbered`で優先順位を確認してみる

```
root@debian:~# ufw status numbered

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    192.168.1.0/24
[ 2] 25565/tcp                  ALLOW IN    Anywhere
[ 3] Anywhere                   DENY IN     45.135.xxx.xxx
[ 4] Anywhere                   DENY IN     199.58.xxx.xxx
[ 5] 25565/tcp (v6)             ALLOW IN    Anywhere (v6)
```

こんな感じで真ん中に来ていた...

これでは意味がないので`ufw delete`とかでルールを消しておく

`insert`を用いて優先順位を一番上に指定して再度ルールを追加します

```
root@debian:~# ufw insert 1 deny from 45.135.xxx.xxx to any
root@debian:~# ufw insert 1 deny from 199.58.xxx.xxx to any
```

再度`ufw status numbered`で優先順位を確認してみる

```
root@debian:~# ufw status numbered

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] Anywhere                   DENY IN     45.135.194.65
[ 2] Anywhere                   DENY IN     199.58.83.10
[ 3] 22/tcp                     ALLOW IN    192.168.1.0/24
[ 4] 25565/tcp                  ALLOW IN    Anywhere
[ 5] 25565/tcp (v6)             ALLOW IN    Anywhere (v6)
```
優先順位上部に特定IPを拒否するルールが追加されていることが分かります

最後に`ufw reload`を行って設定を再読み込みさせる

```
root@debian:~# ufw reload
Firewall reloaded
```

# 実験

試しにスマホのIPを拒否した状態でテザリングを介してマイクラ鯖に接続してみたところ...

![Screenshot_2025-02-13_032153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641372/afbe1cad-a3fa-4e6e-977e-e030f2af54cd.png)

無事に拒否されました!!!(?)

# おわりに

これで前よりかは安心してマイクラマルチが楽しめます。

# 引用
https://mymanfile.com/?p=5684

https://bunoacts.hatenablog.com/entry/2016/05/16/173816
2025/2/13主にITとかセキュリティの記事

1日あたり280万件のIP用いる大規模ブルートフォース攻撃が進行、VPNデバイス等が標的に(2/10)
https://codebook.machinarecord.com/threatreport/37236/

Google Tag Manager悪用の新手口が発覚、Magecartがクレジットカード情報を窃取(2/11)
https://innovatopia.jp/cyber-security/cyber-security-news/47804/

DeepSeek偽サイト急増｜AI企業を狙う新型フィッシング詐欺の実態と対策(2/11)
https://innovatopia.jp/cyber-security/cyber-security-news/47807/

米国 NIST IR 8539 遷移モデルによるセキュリティ特性の検証 (2025.01.31)(2/11)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/02/post-ef0eba.html

安佐市民病院へ不正アクセス、患者情報5000件の個人情報漏洩の可能性(2/11)
https://rocket-boys.co.jp/security-measures-lab/asa-hosp-5000-patient-leak/

SparkCatマルウェアは写真からデータを盗むことができます、ここにカスペルスキーの自分自身を守るためのヒントがあります(2/10)
https://voi.id/ja/teknologi/458692

偽のエラーメッセージや偽のキャプチャ画面などを使ったソーシャルエンジニアリングについて(2/10)
https://qiita.com/masaomi346/items/c8c32a068e8beb76edfb

本当にできる？サイバー攻撃に遭う前に先制攻撃　能動的サイバー防御に必要なのは国際的な連携(2/11)
https://news.yahoo.co.jp/articles/ffd8d242980caf42d3ef3725ab4a4b843bbdbee4

検閲技術と抵抗：世界的な軍拡競争(2/10)
https://qiita.com/pseudonym2/items/04aa9b646c4090f18798

米国 司法省 ハッキングツールを販売するサイバー犯罪者用のウェブサイトを押収 (2025.01.30)(2/11)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/02/post-571eaf.html

中央アフリカ共和国、ミームコイン「CAR」を発表も情報ページがフィッシングリンクで汚染(2/11)
https://nextmoney.jp/?p=71672

AIが人間の助けなしに自己複製する能力を獲得、専門家は警鐘を鳴らす(2/11)
https://xenospectrum.com/ai-gains-ability-to-replicate-itself-without-human-help/

今夜のNEXT　日本を「能動的サイバー防御」で守れるか(2/11)
https://www.nikkei.com/article/DGXZQOCD111C90R10C25A2000000/

安全なバックドアはない、英国によるアップルへの要求はiPhoneに最悪の状況を招く(2/11)
https://forbesjapan.com/articles/detail/77053

ＰＣでネット上の広告をクリック　「ハッカーに乗っ取られた」と言われ男性がマネーをだまし取られる　秋田(2/11)
https://www.aab-tv.co.jp/news/aabnews-25021114090070/

AI開発向け個人情報、本人同意求めず　政府が法改正準備(2/11)
https://www.nikkei.com/article/DGXZQOUA0639F0W5A200C2000000/

Microsoft、Windows 11非対応PCの回避手順を公式文書から削除(2/11)
https://reinforz.co.jp/bizmedia/70448/

フランス AIアクションサミット開催 (2025.02.10-11)(2/11)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/02/post-9ec554.html

フィッシング詐欺にあった女性「まったく疑問に思わなかった」その手口とは…そして対策は(2/11)
https://www.akita-abs.co.jp/nnn/news933wl0cd29ymctphxo.html

DevSecOpsとは？ メリット・デメリット、実現方法まで初心者向けに解説(2/10)
https://www.i3design.jp/in-pocket/13917

日経NEXT【狙いは日本!?サイバー攻撃防ぐには/マスク氏オープンAI買収？】(2/11)
https://www.tv-tokyo.co.jp/broad_bstvtokyo/program/detail/202502/22663_202502112100.html

米国 White House 日米共同首脳声明 (2025.02.07)(2/11)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/02/post-ea7219.html

【2025】DX人材の確保が難しい原因とは？企業が行うべき7つの解決策
https://cad-kenkyujo.com/dx-jinzai/
JavaScriptで「Google Chromeでコンソールを表示しJavaScriptを実行する」の動作を確認してみた。

# 概要

JavaScriptで「Google Chromeでコンソールを表示しJavaScriptを実行する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/javascript/console/index1.html

# 実装

ディベロッパーツールを起動し、コンソールを選択します。
実行結果は以下の通りです。

![Screenshot from 2025-02-13 03-53-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/d645fcb1-ebed-4814-b900-421e9ca6dfae.png)

# まとめ

何かの役に立てばと。
株式会社アマテックのコーポレートサイトでの技術紹介について

 
      
# 株式会社アマテックのコーポレートサイトでの技術紹介について

株式会社アマテックのコーポレートサイトを技術的な観点から解説させて頂きます。

## 目次

  [1.技術スタック](#技術スタック)

  [2.サイト構成](#サイト構成)
   
  [3.サイトの運用](#サイトの運用)

  [4.参考文献とリンク](#参考文献とリンク)

## 技術スタック
 　
### Astro
 Astroは、静的サイトジェネレーター（SSG）の一つで、ReactやVue.jsなどのフレームワークを使用して、高速でSEOに優れたウェブサイトを構築することができます。
 
 Astroは、サーバーサイドレンダリング（SSR）やクライアントサイドレンダリング（CSR）もサポートしており、柔軟な開発環境を提供します。
 
 設計方針として、静的ファイルとしてホスティングすることを心がけています。
 
 Astroは、MarkdownやMDXなどのマークアップ言語をサポートしており、コンテンツの管理が容易です。
 
 Astroのアイランド（Islands）機能がフレームワークを選んだ一番のポイントです。

 最大のメリットを活用することで、必要な部分だけをインタラクティブにし、パフォーマンスを最大化できることです。
 
 ページ全体を静的に生成しつつ、必要な部分だけクライアント側で動的に動作させることができます。

### Node.js
 Node.jsは、JavaScriptをサーバーサイドで実行するためのランタイム環境です。
 
 Node.jsを使用することで、JavaScriptをフロントエンドとバックエンドの両方で使用することができ、一貫性のある開発環境を提供します。

### TypeScript
 TypeScriptは、JavaScriptのスーパーセットで、静的型付けをサポートしています。
 
 TypeScriptを使用することで、コードの可読性と保守性が向上し、開発効率が向上します。

### Cloudflare
 Cloudflareは、グローバルCDN（Content Delivery Network）サービスを提供しており、
 
 サイトのパフォーマンスを向上させることができます。
 
 Cloudflareを使用することで、サイトのセキュリティも向上させることができます。
 
 Cloudflare Turnstileは、Web訪問者が人であるかどうかを確認することで、
 
 実際のユーザーのWeb体験を遅延させることなく迷惑ボットをブロックできます

### Github
 Githubは、ソースコードのバージョン管理と共有をサポートするプラットフォームです。
 
 Githubを使用することで、チームでの開発がスムーズに行えるようになります。

## サイトの構成
 
### フロントエンド
 フロントエンドは、ユーザーが直接操作する部分です。
 
 フロントエンドは、HTML、CSS、JavaScriptで構成されています。
 
 フロントエンドは、ユーザーが入力した情報をバックエンドに送信します。

### バックエンド
 バックエンドは、ユーザーが直接操作しない部分です。
 
 バックエンドは、Node.jsで構成されており、APIを提供しています。
  
 APIは、フロントエンドから呼び出され、turnstileの認証を行います。
 
 また、メールサーバーと連携して、メールを送信します。

### データベース
 データベースは、データを保存する部分です。
 
 データベースは、このサイトでは使っておりません。
 
 mdxファイルを使用して、データを保存しています。
 
 Githubで管理することができます。

### インフラ
 インフラは、サイトを動かすための基盤です。
 
 インフラは、CloudflareとVPS(Virtual Private Server)で構成されています。

## サイトの運用

### サイトの更新
 ニュース・ブログの更新は、MDXファイルを編集することで行います。
 
### サイトのバックアップ
 Githubで管理することで、バックアップが自動的に行われます。
  
### サイトのセキュリティ対策
 Cloudflareのセキュリティ対策を利用しています。
 
### サイトのパフォーマンス最適化
 サイトのパフォーマンス最適化には、以下のようなことが含まれます。
 　
#### 画像の最適化
 Astroを使うことで、WebPやAVIF形式に自動変換されます。
 
#### CSSの最適化
 Astroを使うことで、HTMLへ埋め込むことができるため、インライン化することができます。
 
 また、CSSの最適化を行うことで、CSSのファイルサイズを削減できます。
 
#### JavaScriptの最適化
 Astroを使うことで、必要最低限のJavaScriptとすることができます。
 
#### ファイルの圧縮
 Astroを使うことで、自動でファイルの圧縮が行われます。
 
#### CDNの利用
 CDNは、Cloudflareを使っています。
 
 HTML、CSS、JavaScript、画像、フォントなどのファイルを、世界中のデータセンターにキャッシュすることで、ユーザーからのアクセスを高速化することができます。
 
 AstroとCloudflareを組み合わせることで、爆速なサイトを構築することができます。

## 参考文献とリンク
 [株式会社アマテック 公式サイト](https://ama-tec.jp/)
 ※Tech ブログで記載されている内容です。
 
 [Astro公式サイト](https://astro.build/)
 
 [NodeJs](https://nodejs.org/ja)
 
 [TypeScript](https://www.typescriptlang.org/)
 
 [Cloudflare](https://www.cloudflare.com/ja-jp/)
 
 [Github](https://github.co.jp/)
【Flutter】FIrebaseの連携タイミングに注意

# Firebaseのタイミングが大事
初めてリリースしたアプリの大規模アップデートをしているとき、Firebase Cloud Messagingが動かないということが発生した。その原因は、Firebaseに登録されているBundler identifierが異なるというものだった。firebaseに登録されているbundle identifier が```com.example.appname```という初期値ｎ形式になっていた。
今思うと、何もわからず右往左往しながらやっていたので、firebaseの連携をした後に、bundle identifierを入れ替えたのが原因だと考えている。

# 結局何が重要か？
firebaseの連携は非常に簡単だが、下のURLで連携をする前に、
https://firebase.google.com/docs/flutter/setup?hl=ja&platform=ios
Change app package_name(https://pub.dev/packages/change_app_package_name)でbundle idを正しいものにしておかないと、firebaseに登録されているidが実際のアプリのbundler identifierと異なるということが発生する。

# やらかした場合の対処法
firebaseで新しいアプリを作成し、案内に現れてくるGoogleService-info.plistとGoogleService.jsonを上書きするということを行えば解決できる。
Rust EnumとResult, Option型について

# Enumについて

rustを勉強してたらまた知らない概念が enum

[わかりやすい記事１](https://zenn.dev/keisuke333/articles/729d8da86c27ef)
[わかりやすい記事２](https://qiita.com/kujirahand/items/dd655a813a7c2b902f0b)

# Result型とOption型について

## Result型


## Option型

### 定義
Option<T> は、「値があるかもしれないし、ないかもしれない」という状態を表す型です。
```rs
enum Option<T> {
    Some(T),
    None,
}
```

### 例
```rs
fn find_user(id: u32) -> Option<&'static str> {
    match id {
        1 => Some("Alice"),
        2 => Some("Bob"),
        _ => None,
    }
}

fn main() {
    let user = find_user(1);
    match user {
        Some(name) => println!("User found: {}", name),
        None => println!("User not found"),
    }
}
```
コーディング不要でDeepSeek R1 APIをマスターするガイド

# コーディング不要でDeepSeek R1 APIをマスターするガイド

## はじめに

近年、**DeepSeek R1 API** のようなAI駆動ツールの人気が高まっています。これは、複雑な機械学習タスクを簡素化し、広範なコーディング知識を必要とせずに活用できるためです。本ガイドでは、**コーディング不要** でDeepSeek R1 APIを効果的に活用する方法を説明し、[業界](#)の主要な知見を取り入れて、さまざまなアプリケーションへのシームレスな統合を実現します。

## DeepSeek R1 APIとは？

[DeepSeek R1 API](#) は、コーディング不要でAI機能を統合したい個人や企業向けに設計されています。データアナリスト、マーケター、起業家など、どんな方でも以下のことが可能です。

- 大規模データセットを簡単に処理
- 予測分析の生成
- 意思決定プロセスの自動化

**DeepSeek R1 API** の主な利点は、技術的な複雑さを最小限に抑えながら効率を最大化できる直感的な設計です。

## DeepSeek R1 APIを選ぶ理由

**[オンラインカジノ おすすめ](https://poker-choice.com/rec-online-casino/)** では、ユーザーエンゲージメントとデータ駆動型戦略が重要です。AIを統合することで、パーソナライズされた推奨、詐欺検出、リアルタイムのカスタマーサポートを提供し、より良い体験を実現できます。[DeepSeek R1 API](#) は次のような重要な役割を果たします。

- **ユーザー行動分析**：アクティビティを追跡し、体験を向上
- **パーソナライズされた推奨**：履歴に基づいて最適な選択肢を提案
- **詐欺防止**：不審な活動を検出し、リスクを最小化

## DeepSeek R1 APIの始め方

### ステップ1: 登録とAPIアクセスの取得

[DeepSeek R1 API公式ページ](#) にアクセスし、サインアップしてAPIキーを取得してください。ビジネスニーズに合ったプランを選択しましょう。

### ステップ2: ノーコードプラットフォームの選択

プログラミングの知識がない場合でも、[Zapier](#)、[Bubble](#)、[Make.com](#) などのノーコードプラットフォームを使用して、APIを簡単に統合できます。

### ステップ3: ユースケースの定義

主な機能を明確にし、以下のような目的を特定します。

- **自動カスタマーサポート**
- **予測分析**
- **支払い詐欺の検出**

### ステップ4: APIの接続

ノーコードプラットフォームのインターフェースを使用して、**[DeepSeek R1 API](#)** を[プラットフォーム](#)やその他のアプリケーションとリンクさせます。ほとんどのプラットフォームはドラッグ＆ドロップ機能を備えており、簡単に統合できます。

### ステップ5: テストと最適化

テストクエリを実行し、セットアップを調整することで最大限の効率を確保します。結果をモニタリングし、必要に応じて改善を行いましょう。

## 追加の洞察: ベストプラクティス

AIを統合する際は、**[イギリスのギャンブル委員会](https://www.gamblingcommission.gov.uk/)** の規制を確認し、適切なプラットフォームを選択することが重要です。以下の点を考慮してください。

- **ライセンスと規制**：有効なライセンスを取得しているか確認
- **ユーザーレビューと評価**：実際のユーザーのフィードバックをチェック
- **セキュリティ対策**：安全なゲートウェイと暗号化技術を備えているか

詳細については、**[包括的なガイド](#)** を参照して、適切な選択をしましょう。

## 結論

**[DeepSeek R1 API](#)** をコーディング不要でマスターすることは、これまで以上に簡単になりました。**[デジタル体験](#)** を向上させたり、その他のAI駆動型アプリケーションを最適化したりする際に、このノーコードアプローチを活用できます。AIを活用することで、ビジネスはユーザーエンゲージメントを高め、セキュリティを強化し、貴重なインサイトを得ることができます。

今すぐAIの活用を始め、**[DeepSeek R1 API](#)** で自動化の真の可能性を解き放ちましょう！
Anacondaはもう古い？次世代パッケージ管理ツール【Pixi】を徹底解剖

## はじめに
最近、研究用にPythonのパッケージ管理をしたくなり、色々あさっていたところ`uv`というRust製の高速パッケージ管理ツールに辿り着いた。ただ、古いpip依存のパッケージのインストールができず泣く泣く断念しかけたところ、`Pixi`というconda型パッケージ管理ツールに出会った。ビビッと来たものがあったので、今回はその魅力をご紹介！！

古くて`uv`でのインストールを断念したパッケージはこちら

https://github.com/astral-sh/uv/issues/7291

## pipとconda
Pythonでパッケージ管理をする人にとって誰もが知ってるであろうパッケージ管理ツールに`pip`と`conda`がある。あまり違いをわかっていない人も多いので違いをまとめてみた。

| 項目 | **pip** | **conda** |
|------|---------|---------|
| **管理対象** | Pythonパッケージのみ | Python + 他言語のパッケージ |
| **リポジトリ** | PyPI (Python Package Index) | Conda (Anaconda, conda-forge) |
| **依存関係解決** | 単純 | 高度 |
| **速度** | 標準的 | 遅い |
| **用途** | Web開発 | データサイエンス・機械学習 |

`conda`はPython以外のパッケージや仮想環境を扱うことができて便利である一方で、動作が一般的に遅いことが知られている。一方で`pip`はPythonのパッケージのみを扱うことを目的としており、`conda`と比べて軽量で高速である一方、仮想環境管理はvenvなど他のツールと組み合わせる必要がある。

## Pixiとは
- `Pixi`は**軽量・高速・直感的**をコンセプトに登場した**conda型パッケージ管理ツール**
- Pythonのパッケージ管理にとどまらず、**他のプログラミング言語**にも対応

https://pixi.sh/latest/

### 従来ツールとの比較
| 項目 | **pip** | **uv** | **conda** | **Pixi** |
|------|---------|---------|---------|---------|
| **リポジトリ** | PyPI | PyPI | Conda | Conda + PyPI |
| **管理対象** | Pythonのみ | Pythonのみ | Python + 他言語 | Python + 他言語 |
| **速度** | 標準的 | :white_check_mark:速い | 遅い | :white_check_mark:速い |
| **安全性** | 低い | :white_check_mark:高い | :white_check_mark:高い | :white_check_mark:高い |
| **依存関係解決** | 単純 | 単純 | :white_check_mark:高度 | :white_check_mark:高度 |

`Pixi`はRust製であることで高速化を実現し、pipとcondaのいいとこどりをしたパッケージ管理であることがわかる。また`Pixi`では他のパッケージ管理ツールではあまり実装されていない、タスクランナー機能を持ち合わせており、よく使うコマンド群を簡単にまとめることもできる！

## インストール方法
以下のような形でインストールできる。詳しくは[公式ドキュメント](https://pixi.sh/latest/ "Pixi")を参照。

### Linux or macOS
```sh
curl -fsSL https://pixi.sh/install.sh | bash
```

### Windows
```sh
powershell -ExecutionPolicy ByPass -c "irm -useb https://pixi.sh/install.ps1 | iex"

powershell -c "irm -useb https://pixi.sh/install.ps1 | more"
```

`pixi`の詳しい使い方や便利機能については本記事では割愛したいと思う。
また別の記事で書いて公開しようと思うのでお楽しみに。

## まとめ
- 軽量・高速・直感的を目指す`Pixi`は、`pip`と`conda`のいいとこ取りをした強力なパッケージ管理ツール
- Rust製特有の高速性と安全性が大きな魅力
- チーム開発で重宝されるタスクランナー機能も持ち合わせている
- Python以外の言語を使ったプロジェクトでも活躍の可能性大

パッケージ管理で悩んでいるなら、次世代パッケージ管理ツール`Pixi`をぜひ一度試してみてください！
JMTEBをpython3.9で動かすには

[modernbert-base-japanese-wikipedia](https://huggingface.co/KoichiYasuoka/modernbert-base-japanese-wikipedia)を、[JMTEB](https://www.sbintuitions.co.jp/blog/entry/2024/05/16/130848)で評価してみることにした。ただし、JMTEBはpython3.9では動かないので、そこは、ちょっとばかり頑張ってみることにした。

```
#! /bin/sh
model="KoichiYasuoka/modernbert-base-japanese-wikipedia"
pip3.9 install sentence-transformers accelerate datasets jsonnet jsonargparse smart-open openai loguru tiktoken triton
test -d JMTEB || git clone --depth=1 https://github.com/sbintuitions/JMTEB
NAWK=nawk
if [ -x /usr/bin/gawk ]
then NAWK=/usr/bin/gawk
elif [ -x /usr/bin/mawk ]
then NAWK=/usr/bin/mawk
fi
find JMTEB/src -type f -print |
( while read F
  do T=`echo $F | sed 's?/src/?/src9/?'`
     mkdir -p `dirname $T`
     case $T in
     *.py) $NAWK '
{
  if(f!=1){
    if($0!~/__future__/){
      printf("from typing import Union\n");
      f=1;
    }
  }
  s=$0;
  while(match(s,/[A-Za-z]+(\[[A-Za-z ",]+\])?( \| [A-Za-z]+(\[[A-Za-z ",]+\])?)+/)>0){
    u=substr(s,RSTART,RLENGTH)
    gsub(/\|/,",",u);
    s=substr(s,1,RSTART-1)"Union["u"]"substr(s,RSTART+RLENGTH);
  }
  print s;
}' $F > $T ;;
     *) cp $F $T ;;
     esac
  done
)
( cd JMTEB/src9 && python3.9 -m jmteb --embedder SentenceBertEmbedder --embedder.model_name_or_path $model --save_dir ../../result/$model )
echo '***' $model
cat result/$model/summary.json
echo ''
```

NVIDIA A100-SXM4-40Bだと、約8時間で以下の結果が出力された。

```
*** KoichiYasuoka/modernbert-base-japanese-wikipedia
{
    "Classification": {
        "amazon_counterfactual_classification": {
            "macro_f1": 0.7421788737578211
        },
        "amazon_review_classification": {
            "macro_f1": 0.48802715434889077
        },
        "massive_intent_classification": {
            "macro_f1": 0.7691018550046452
        },
        "massive_scenario_classification": {
            "macro_f1": 0.8592072858263317
        }
    },
    "Reranking": {
        "esci": {
            "ndcg@10": 0.9074315783061467
        }
    },
    "Retrieval": {
        "jagovfaqs_22k": {
            "ndcg@10": 0.31588139624501516
        },
        "jaqket": {
            "ndcg@10": 0.04412074696344684
        },
        "mrtydi": {
            "ndcg@10": 0.02025729160659547
        },
        "nlp_journal_abs_intro": {
            "ndcg@10": 0.7693263292058586
        },
        "nlp_journal_title_abs": {
            "ndcg@10": 0.5514830546550054
        },
        "nlp_journal_title_intro": {
            "ndcg@10": 0.32297762338199365
        }
    },
    "STS": {
        "jsick": {
            "spearman": 0.7487648151029657
        },
        "jsts": {
            "spearman": 0.6872200019629169
        }
    },
    "Clustering": {
        "livedoor_news": {
            "v_measure_score": 0.5042800077305779
        },
        "mewsc16": {
            "v_measure_score": 0.3847169582408134
        }
    },
    "PairClassification": {
        "paws_x_ja": {
            "binary_f1": 0.623541887592789
        }
    }
}
```

かなり`Retrieval`が低いのだが、modernbert-base-japanese-wikipediaは検索コーパスによるトレーニングをおこなっていないので、まあ、仕方ないだろう。あとは、まあまあの評価値かな。
📖 『マネジメントは嫌いですけど』を読んで

# 📌 本の紹介

大手IT企業（おそらく通信大手のS社）のエンジニアのマネージャーが、現場での経験をもとに「IT技術者向けのマネジメント経験」を綴った一冊。  

* マネジメントの目的
* 組織全体としてのエンジニアの技量をどう高めるか
* そのための、インプットとアウトプット（そして予備）時間の配分
* 部下やビジネスサイドとの関わり方

などのテーマを、エッセイ的に描いている。  

https://amzn.asia/d/95X3BLK

# 本の全体の構成

本書は 8つの章 で構成されている。  

🔹 第1章：マネジメントできるのは未来だけ
🔹 第2章：理想を描いて余裕を作る
🔹 第3章：部下は思い通りに動いてくれない
🔹 第4章：学べる仕組みを実装する
🔹 第5章：キャリアパスから組織を考える
🔹 第6章：プロジェクト予算を疑う
🔹 第7章：完成したマネジメントなんてない
🔹 第8章：正解のない世界でマネジメントをしていく

# 📌 感じたこと

✅ アウトプットは60%、学習20%、緊急対応20%という時間配分  

→ インプット大事。まじクソ大事。

✅ エンジニアとビジネス職の間にはコミュニケーション

→ 知識や関心の分断からエンジニアとビジネスのコミュニケーションがうまくいかないというのは、筆者の会社でも課題になっているみたいでソレナー。

# 📌 まとめ

いい本。エンジニアのマネジメントをしている人にはおすすめ。

エンジニア個人のセルフマネジメントにも応用できる考え方があると思う。
CIでGoのテストを実行するとき、失敗したテストを探すのが面倒だから改善した

 GitHub Actionsの黄色いぐるぐるが赤いバツマークになったとき、うんざりする。しかも詳細を見てみると、テストで失敗している。そして画面をスクロールしながら"FAIL"の文字を一生懸命探すことになる。テストが多くなると、探すのがとても面倒。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779907/a18701e0-2a62-4c82-b73f-9c2b267b1d4c.png)

（テストのエラー画面。画像はサンプルなので大した量ではないが、仕事で扱うテストの量は膨大でつらい。）

そこで、mfridman/tparseを導入することで失敗したテストをすぐに探せるようにした。

> tparse attempts to do just that; return failed tests and panics, if any, followed by a single package-level summary. No more searching for the literal string: "--- FAIL".

上記の説明の通り、まさに自分が感じていた課題にうってつけのライブラリだ。

https://github.com/mfridman/tparse


さっそくスクリプトを書いてみる。元のスクリプトは以下の通り。

```yaml:before

name: CI
on:
  push:
    branches:
      - master
  pull_request:
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@v2
      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: "1.23"
      - name: Install dependencies
        run: go mod tidy

      - name: Run tests
        run: go test ./...
```

```diff:変更箇所
       - name: Install dependencies
         run: go mod tidy

+      - name: Install tparse
+        run: go install github.com/mfridman/tparse@latest

       - name: Run tests
-         run: go test ./... -v
+         run: |
+           set -o pipefail
+           go test ./... -json | tparse -all
```
ポイントは2つある。1つは、go testを -jsonをつけて実行すること。公式にも
> Don't forget to run go test with the -json flag.

と書いてある。ちなみに-vはなくてok。

もう1つはgo test ./... -json | tparse -allとしてそれぞれパイプ演算子でつなぐこと。

```yaml
     run: |
       set -o pipefail
       go test ./... -json
       tparse -all
```
上記のようにgo testとtparseをパイプ演算子で繋がないとgo testとtparseが独立して実行される。tparseはgo testの結果を受け取るのではなく空のデータで解析するので、CIにはgo testの実行結果がjson形式で表示される。

ちなみに、突如として現れたset -o pipefailはよくおまじない的に使われるらしい。パイプラインの中で失敗したいずれかのコマンドの終了ステータスがパイプライン全体の終了ステータスになる。これにより、「前のコマンドは失敗したのに、後のコマンドは成功したのでパイプラインとしては正常終了」のようなことが起きず、エラーを追跡しやすくなる

参考: https://hirosaji.hatenablog.com/entry/2022/07/05/210045

以上をふまえ、tparseを使ってテストを失敗させると以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779907/f7659b44-656e-4028-ba16-14b8b49793e4.png)

一番下にパッケージ単位でテストのサマリーが出てくる。また、その上に失敗したテストが表示されるので探す手間が省ける。
uv環境構築忘備録

最近uv使い始めたんですが、なんか毎回程よく忘れたころに環境構築するせいでグダグダになりがちなので忘備録として

# uvを使って仮想環境を構築する
### **プロジェクトの作成**
まず、プロジェクトの作成から
プロジェクト名（ymd）とpythonのバージョンを指定してuv initします。
なんと1行で終わります。楽ですね
```powershell
uv init -p 3.10 ymd
```
作成されたプロジェクトフォルダに移動して、勝手にできている hello.py を実行すると
あら不思議、仮想環境ができました。不思議ですねぇ～（棒）
```powershell
uv run hello.py
>>
warning: `VIRTUAL_ENV=C:\Workspace\Python\.venv` does not match the project environment path `.venv` and will be ignored
Using CPython 3.10.0
Creating virtual environment at: .venv
Hello from ymd! 
```

なんか警告してきやがりましたが、既存の環境と新規作成した環境をうまく認識できてないことに対する警告のようです。対処法はこちらの記事を参考に
>warning: `VIRTUAL_ENV=C:\Workspace\Python\.venv` does not match the project environment path `.venv` and will be ignored

https://qiita.com/baku2san/items/adeeb82dd6a9b18f1887

\
他の環境が構築されていないクリーンなフォルダで作成したら特に警告もなくできました。
```powershell
PS C:\tmp\ymd> uv run hello.py
>>
Using CPython 3.10.0
Creating virtual environment at: .venv
Hello from ymd!
```

問題なく実行されると、"Hello from ymd!" と挨拶してくれます。かわいいね

この時点でもうすでに仮想環境の構築は終わっていて、このまま依存関係の同期やらパッケージの追加をしても何ら問題はないらしいんですが、、、
\
僕は (ymd) が付いてないと安心できない病気のため、明示的にアクティベートします（）。
```powershell
PS C:\tmp\ymd> .venv\Scripts\activate
>>
(ymd) PS C:\tmp\ymd> 
```
なんか (ymd) ついてないと謎の危機管理が発動するんすよね。

# パッケージの管理
### **パッケージの追加**
uv addを使って追加していきます、pipと混在するとめんどくさいことになるらしいので統一しようね
```powershell
uv add polars xarray
```

### **パッケージの表示**
インストール済みのパッケージは uv pip list で表示
```powershell
uv pip list
>>
numpy           2.2.2
packaging       24.2
pandas          2.2.3
polars          1.22.0
...
...
```
### **パッケージの削除**
「あー:angry:、またpandas入り込んでんじゃん！もぉ～～」ってときは、、
・・・大丈夫、uv remove で消してやりましょう！（~~消しゴムマジックで消してやるのさ~~）
```powershell
uv remove pandas
```
### **パッケージの同期**
パッケージをrequirements.txtから引っ張ってくるときと同期は以下でできます。
特に変わったところはなさそう。
```powershell
uv add -r requirements.txt
uv sync
```

# まとめ
とりあえず以下順番に実行すればおｋ
```powershell
# windows
uv init -p 3.10 ymd
cd ymd
uv run hello.py
.venv/Scripts/Activate

#linux
uv init -p 3.10 ymd
cd ymd
uv run hello.py
source .venv/bin/activate
```
これで次また忘れても大丈夫やな！ ヨシッ！！
Amazon Cognito マネージドログインの日本語化（ALB連携なし）

# はじめに
マネージドログインの日本語化についてはALBと連携して日本語化している記事が多いですが、ALBを使用せず日本語化する方法です。シンプルな方法ですが、記事にしました。




# やってみる
Quick Setupガイドに以下のようなソースがありますが、それに言語の設定を追加するだけです。


```index.js
import { AuthProvider } from 'react-oidc-context';

const cognitoAuthConfig = {
  authority: "～",
  client_id: "～",
  redirect_uri: "～",
  response_type: "～",
  scope: "～",
  extraQueryParams: {
    ui_locales: "ja" // 日本語を設定
  }
};


const root = ReactDOM.createRoot(document.getElementById("root"));

root.render(
  <React.StrictMode>
    <AuthProvider {...cognitoAuthConfig}>
      <App />
    </AuthProvider>
  </React.StrictMode>
);
```



# おわりに
ググってもわかりませんでしたが、Microsoft Copilotで聞いたら一発でわかりました。とても便利です。
資格試験勉強

# まずは試験勉強


skillbuilderで試験勉強しています。
始めたのはいいのですが、本当にこれでいいのかと若干不安になっていろいろ調べていると以下の記事をみつけました。

https://tech.nri-net.com/entry/matsuzawablog-aif

大きくずれてないので、このまま資格取得に向けて勉強進めようと思いました。
Udemyの対策講座があるのは知らなったのでありがたい記事でした。

※マナー違反などあれば指摘いただければと思います。修正します。
kaggle Chess AI Challenge 参加記

おはようございます。Hikari30です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626970/c192d71d-d362-4fae-adfe-4fe2d816f829.png)

## 自己紹介

私は大阪大学の2回生です。

普段はAtCoderに取り組んでおり、ヒューリスティックレーティングは青色、アルゴリズムは水色となっています。
## きっかけ

コンペ開始時、Xのタイムラインで「AHC勢におすすめのコンペ」というツイートが流れ、話題になりました。

また、チームメイト募集のツイートを見かけたことがきっかけで、チームを組んで本格的に参加することになりました。

その後、1月後半に同じサークルの先輩が加わり、3人チームとなりました。
## コンペへの取り組み
コンペは11月に開始され、最初の1か月はディスカッションや共有コードの理解に努めました。

手元でさまざまな公開ボットを動かしていた中で、私たちが注目したのは「fruktik」というボットでした。

おそらく、工夫なしで使えるボットの中では圧倒的な強さを誇っていたと思います。そのため、他のボットの仕様についてはあまり考慮していませんでした。

12月は、時間関数の工夫に取り組みましたが、振り返ると多分無駄な努力だったと感じています。

その後、ほかに工夫できる点がないかと試行錯誤を重ねた結果、現状のfruktikの中身を調整するしかないという結論に至りました。

その時点ではすでに2月となっており、コンペに使える時間もほとんど残っていませんでした。

しかし、私たちのチームにはC言語が扱えるメンバーがおらず、GPTを活用しながら試行錯誤を続けました。

具体的には、提出可能なエージェントが2体まで選べるというルールを利用して、攻撃型と防御型の2種類を作成。

また、ライブラリ内では各駒の価値や攻守のウェイトを変更するなどの調整を行いました。

ちなみに、private LBの計算が開始されてから15時間経過した時点では、防御型の方が有意に強い状況となっていました。

## 最後に

結果は来週の水曜日ごろ、全試合終了次第判明する予定です。メダルを獲得できれば嬉しいのですが、成績はボーダーギリギリなので心配です。

多くのチームが公開エージェントを使用している中、私たちが銅圏内にとどまってしまったのは、単純に時間不足と実力不足が原因だと思います。

また、強化学習の本質に触れる機会を逃してしまったのは、非常にもったいなかったと感じています。

---

おわり
初投稿


# 初投稿！AWS/AIエンジニアを目指す

## 👋 自己紹介
SIerの会社で5年経験を積んできたのですが、自分のやれることに少しだけ自身はありつつも、これといった資格もなく、本当にこんな3流かどうかもわからないエンジニアでいていいのかと思って悩んでいます。
何か新しいチャレンジを、と思い、とりあえず考えるより先に行動だと思ってこの記事を書いています。

### 🔧 現在の技術スキル
- [現在の技術スタック]仕事でwebアプリの開発経験3年ほど（javaがメインでshell,ストアドプロシージャ,git,svnなどは触れてきた）、学生時代にpythonとjsかじった程度、資格はなし
- [得意分野・強み]障害の原因見つけるのは同じ会社の同期とかと比べて早いかも、程度であまりよくわからないです
- [最近取り組んでいること]AWSの資格取得に向けて勉強してます

### 💡 興味のある技術分野
- AWS
  - [興味を持ったきっかけ]とりあえず一番需要高そうで、後述するやりたいことに繋がりそうで興味持ってます
  - [特に学びたい技術領域]特にAIサービスはこれからさらに需要があがりそうなので注目してます
- 人工知能/機械学習
  - [興味を持ったきっかけ]自分の苦手な計画/段取りを簡単にできてしまうことに感動して、この先この技術をものにした人間しか生き残れないと感じました。この記事もNotionAI君に手伝ってもらって書いてます
  - [特に学びたい技術領域]データ分析が一番興味あります。大量のデータからなにかをアウトプットする力はもっと多くの人に簡単に手に渡るようにしたほうが世の中のためになる気がしています

## 🎯 目指す方向性
### AWS資格への挑戦
- AWS AI Practitioner資格取得
- その先のAWSの上級資格取得（とりあえずやってみてそのあと考えます）

### AI/ML学習計画
- AWS skillbuilder での基礎学習
- AWS Quicksightを使った分析（ぱっと調べた感じ、とりあえずこれがデータ分析っぽいなと思ったので）
- 実践的なプロジェクト開発

## 🚀 今後の活動予定
### 技術ブログ投稿計画
- AWS AI/ML関連の学習記録
- プロジェクト開発過程の共有
- 技術的な発見や気づきの発信

### チャレンジするプロジェクト
- ファン感想分析システムの構築
　とあるアイドルグループが大好きなのですが、このグループのこれからの活躍のため自分に何かできることはないかと思い、自分のスキルアップのモチベーション維持もかねてこれを作ることをまず第一の目的として考えました。もっと多くの人に注目してもらうにはどうしたらいいかが見えればいいなと。
 データ集めは基盤さえできればあとはインスタとか2ちゃんとかからスクリプトがりがりするとかでいかようにでもなるのではという浅はかかもしれない考えです。
 
## おわりに
技術を通じて、自分自身の成長だけでなく、周りの人々にも良い影響を与えられるような人間を目指しています。このQiitaでの発信もその一歩として、皆さんと一緒に学び、成長していけたら嬉しいです。
[aws][iam][初心者向け]「iam:CreateRole へのアクセスが拒否されました」と表示された時

## はじめに
AWSを触り始め詰まったところを備忘録として残しつつ、
後々誰かの役に立てばいいなと思い記事にしてみました。

今回は、`API Gateway` + `Lambda`で簡易的なAPIを作ろうと思った時に
iam関連で弾かれたので、その内容を記載していきます。

## Lambdaで関数作ろうとしたらいきなり怒られた。。
```
iam:CreateRole へのアクセスが拒否されました
iam:CreateRole に対する許可がありません。 アクセスをリクエストするには、次のテキストをコピーして AWS 管理者に送信してください。
ユーザー: arn:aws:iam::**********:user/powerAccessUser
アクション: iam:CreateRole
リソース : arn:aws:iam::**********:role/service-role/**********
コンテキスト: no identity-based policy allows the action
```

AWS管理者って俺なのだが。。。

## とりあえず、勘で問題解決に向けて動いてみた。
エラーの一行目の内容からRoleを作る権限がないんだなと思い、
管理権限を持ったユーザーに切り替えて、権限を付与しようとしてみた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561214/f17363af-e621-4d33-8a22-3d9354f2dea3.png" width="700px">

CreateRoleってやつないやん。。。

## もうちょっとエラーの内容を詳しくみてみた。
`アクション: iam:CreateRole`って書かれてあったので、
ググって見つけたページが[こちら](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awsidentityandaccessmanagementiam.html)

なるほど。。
アクションとポリシーは違うものなのね。

## もうちょっと調べてみた
[この記事](https://qiita.com/charon/items/5d82e25e858fb3d4ecce)の内容的に
いくつかのアクションをまとめたものがポリシーなのかなと推測。

## コンソールで確認してみた
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1561214/c0397b0f-c50c-4229-8b63-7a6123f96313.png" width="700px">

うん！なんとなく当たってそう！！
というわけで、このポリシーを適用して無事に解決！

## 終わりに
たぶん、もっと細かく権限付与した方が良さそうだが、
本来のやりたいことからちょっとずれてきたので、
またの機会にもっと深掘りすることにしよう。

ではまた:wave:
【Next.js15】params でエラーが出るときの対処

## **はじめに**
Next.js の **App Router** を使っていると、  
動的ルート（例: `/schools/[id]`）で以下のようなエラーに遭遇することがあります。

Error: used params.id. params should be awaited before using its properties.


このエラーの原因は、**Next.js の新しい仕様で `params` が Promise になることがあるため** です。  
本記事では **エラーの原因と、その解決方法** について解説します。

---

## **原因**
Next.js **15.1.6** 以降の App Router では、**動的ルートの `params` が非同期（Promise になる場合がある）** 仕様になりました。  
そのため、以下のように **`params.id` に直接アクセスするとエラー** になります。

### **間違ったコード例**
#### **`params.id` に直接アクセスするとエラー**
```tsx
export default async function Page({ params }: { params: { id: string } }) {
  const id = params.id; // ❌ ここでエラーが発生する可能性あり！

  const data = await fetchData(id);
  return <div>{data.name}</div>;
}
```
params は Promise かもしれない ので、params.id にすぐアクセスするとエラーになります。

---
**対処**
---
解決策は await を使って params を解決してから使うこと です。

***修正後のコード例***
✅ await を使って params を取得
```tsx
export default async function Page(props: { params: Promise<{ id: string }> }) {
  const resolvedParams = await props.params; // ✅ `params` を `await` してから使う
  const id = resolvedParams.id;

  const data = await fetchData(id);
  return <div>{data.name}</div>;
}
```
これで params.id が未解決のまま参照されることがなくなり、エラーが解消 されます！
---
**追記**
---
Vercelでデプロイを実行したところ、params を await する際の ESLint エラーが発生しデプロイに失敗しました。
具体的には、params: { id: string } の型が Promise の可能性を考慮していないため、型エラーが発生していました。

エラー例 (Vercelデプロイ時)
```
ams: { id: string; }; children: ReactNode; }' does not satisfy the constraint 'LayoutProps'.
Types of property 'params' are incompatible.
Type '{ id: string; }' is missing the following properties from type 'Promise<any>': then, catch, finally, [Symbol.toStringTag]
```
**修正**
---
ESLint のエラーを防ぐために、型を Promise<{ id: string }> に変更 します。
こうすることで、ESLint に「params が Promise である可能性がある」と明示でき、エラーを防ぐことができます。
Zod を使って入れ子になったオブジェクトを定義した場合に、どのように中のオブジェクトの型や値を取り出すか

以下は、Zod を使って入れ子になったオブジェクトを定義した場合に、どのように中のオブジェクトの型や値を取り出すかの例です。

## 例1: 別々のスキーマとして定義する場合
まず、内側のオブジェクトのスキーマを別に定義し、それを親スキーマに組み込む例です。

```typescript
import { z } from 'zod';

// 内側のオブジェクトのスキーマ
export const innerSchema = z.object({
  firstName: z.string(),
  lastName: z.string(),
});

// 親スキーマの定義
export const parentSchema = z.object({
  user: innerSchema,
  id: z.number(),
});
```
### 型の取り出し方
#### 内側のオブジェクト型を取り出す
内側のスキーマから型を取り出すには、以下のようにします。

``` typescript
// innerSchema から型を取り出す場合
type UserType = z.infer<typeof innerSchema>;
// 結果: { firstName: string; lastName: string; }
```
親スキーマから内側のオブジェクト型を取り出す
親スキーマから内側のオブジェクトの型だけを取り出す場合、TypeScript のインデックスアクセス型を使います。

```typescript
type ParentType = z.infer<typeof parentSchema>;
// 結果: { user: { firstName: string; lastName: string }; id: number; }

type UserFromParent = ParentType['user'];
// 結果は同じ: { firstName: string; lastName: string; }
```
### 値の取り出し方
たとえば、実際にデータをパースした後、内側のオブジェクトの値にアクセスするには次のようにします。

```typescript
const data = {
  user: {
    firstName: "Taro",
    lastName: "Yamada",
  },
  id: 123,
};

// parentSchema を使って検証・パース
const parsedData = parentSchema.parse(data);

// inner のオブジェクトは、parsedData.user として取り出せます
console.log(parsedData.user.firstName); // "Taro"
```


## 例2: インラインで入れ子に定義する場合
スキーマ定義内に直接入れ子のオブジェクトを定義した場合も同様です。

```typescript
import { z } from 'zod';

const schema = z.object({
  user: z.object({
    firstName: z.string(),
    lastName: z.string(),
  }),
});
```
### 型の取り出し方
この場合、親スキーマから内側の型をインデックスアクセス型で取り出すことができます。

```typescript
type SchemaType = z.infer<typeof schema>;
// 結果: { user: { firstName: string; lastName: string; } }

type UserType = SchemaType['user'];
// 結果: { firstName: string; lastName: string; }
```
### 値の取り出し方
パース後に値を取り出す方法は同じです。

``` typescript
const data = {
  user: {
    firstName: "Hanako",
    lastName: "Suzuki",
  },
};

const parsed = schema.parse(data);
console.log(parsed.user.lastName); // "Suzuki"
```

### まとめ
#### 型定義の抽出:

内側のスキーマから直接型を取り出す場合は z.infer<typeof innerSchema>
親スキーマから内側の型のみ取り出す場合は、z.infer<typeof parentSchema>['user'] のように記述します。
#### 値の取り出し:
パース後のオブジェクトから、内側のオブジェクトは単にプロパティアクセス（例: parsedData.user）で取り出すことができます。

このように、Zod のスキーマで入れ子のオブジェクトを定義しても、型と値の両方を簡単に取り出すことが可能です。
MarkdownAI で楽しく漢字を学べるサイトを公開してみた

# はじめに

**[MarkdownAI](https://mdown.com/ja/)** は、「対話型 AI 」や「画像生成 AI 」を組み込んだ Web ページを簡単に作成できる Web サービスです。

本記事では Markdown AI の「**画像生成 AI**」機能を「**漢字学習**」に活用したサイトを紹介します。

漢字学習の**課題**として、漢字練習が単調な作業になりがちで、子どもたちが飽きてしまうことが挙げられます。


そこで、画像生成 AI を活用して、楽しみながら漢字を学べるサイトを作成しました。このサイトでは、「漢字を**覚える**段階」と「漢字を文として**使う**段階」に分けて機能を実装しています。


今回作成した Web ページは以下のリンクから見ることができます。

https://mdown.ai/content/2ba55dc5-98cb-4d6e-8039-b974fbe3d91f

<img alt="demo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801269/8c1a2eaa-4c81-479b-8daf-5739d9de2156.png" width="300px"/>


# Markdown AI とは？
改めて Markdown AI とは、**簡単に** Web ページの**作成から公開まで**を行うことができる Web サービスです。

以下のリンクから **Google アカウント**[^1]のみで**無料**で利用を開始することができます。
[^1]: 日本で Google アカウントを作成するには 13 歳以上である必要があります。

https://mdown.ai/ 

Markdown AI は「**シンプルさ**」と「**自由度の高さ**」が大きな強みで、初心者から Web 開発経験者まで幅広い層のニーズに応えることができるサービスです。

- **シンプルさ**
  - `Markdown` [^2]で手軽に Web ページを作成
  - Web ページの公開は何回かボタンを押すだけ
- **自由度の高さ**
  - `Markdown` だけではなく `HTML`・`CSS`・`JavaScript` も使用が可能
  - さらに `対話型 AI` や `画像生成 AI` の組み込みも可能

Markdown AI は現在 `β 版` であり、機能が続々と追加されています。最新の情報は [News - Markdown AI](https://mdown.com/ja/category/news/) で確認できます。

[^2]: Markdown は**文章の構造を記述するためのルール**です。Web ページの構造は HTML で記述することが一般的ですが、Markdown を使用することで簡単に記述することができます。


# 実装した機能
このサイトの機能は大きく 2 つあります。

- ひとつは漢字を楽しく**書く練習**ができる機能です。
 
    <img alt="demo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801269/3451cf49-4a56-4838-a588-cb8bf942b22c.png" width="300px"/>

    - 学びたい学年を選択すると、ランダムに漢字が表示されます。
    - 工夫した点は、**好きな色のペンを選択できる**ところです。この機能により、単調な作業になりがちな漢字練習を**主体的に**進められるようになります。
        - 実際に子どもに使ってもらうと、「次はどの色で書こうかな？」とワクワクしながら練習する様子が見られました。
- もうひとつは**与えられた 3 つの漢字を使って文を作成し、その文をもとに AI が画像を生成する機能**です。

    <img alt="demo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801269/64e1830f-8bc2-437c-aae6-a4468536116f.png" width="300px"/>
    
    - 漢字はただ書けるようになるだけでなく、実際に文の中で使えるようになることが大切です。
    - しかし、漢字を使ってただ文を作るだけでは、どうしても**学習が単調**になり、楽しさが欠けてしまうことがあります。
    - この機能により、子どもたちが自分で作った文が画像として**視覚的に表現**されるため、学習がより楽しく、**記憶に残りやすく**なります。
    - また、この機能を通じて、面白い画像を作りたいという気持ちが自然に生まれ、結果として子どもたちが**自ら工夫を凝らして**文章を考えるようになることを期待しています。





# おわりに
MarkdownAI で Web ページを作成していて良かった一番の点は、Web ページの公開が非常に簡単であることです。変更した内容もすぐに反映され、確認作業の負担が軽減されました。
【Mac】カーソルを一定時間操作がない場合に非表示にする方法

Cursorcererをインストールするとカーソルを一定時間動かさない場合に非表示にすることができます。

https://doomlaser.com/cursorcerer-hide-your-cursor-at-will/

## インストール

以下のコマンドを実行してCursorcererをインストールします。

```terminal
brew install --cask cursorcerer
```

## 設定

システム設定アプリを開き、一番下に追加されているCursorcererの設定画面を開きます。

![スクリーンショット 2025-02-12 23.27.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/9ff4e7bb-a6b6-4281-a340-b988ac8a96fa.png)

- `Toggle cursor hotkey`: ホットキーでカーソルの表示・非表示を切り替えます
- `Hide idle cursor after`: 設定した時間マウスを動かさない場合にカーソルを非表示にします
- `Always show cursor if moved`: 移動中はカーソルを表示します
Proxmox の `config.db` を解析してみました

Proxmox クラスタを管理する `config.db` は、通常 `/etc/pve/` にマウントされる `pmxcfs` (Proxmox Cluster File System) に格納されています。しかし、

- クラスタが起動していないと `/etc/pve/` がマウントされない
- `config.db` は SQLite 形式なので、普通の `cat` などで中身を確認できない

といった理由で、手軽に中身を見ることができません。

そこで、`config.db` のデータ構造を調査し、最終的にこのデータを元にファイルシステムを復元するスクリプトを作成してみました。

## `config.db` の中身を確認する

まず、手元の `config.db` を `sqlite3` で開いて中身を確認します。

```sh
sqlite3 config.db ".tables"
```

すると `tree` というテーブルがあることがわかります。

```sh
sqlite3 config.db "SELECT * FROM tree LIMIT 5;"
```

出力結果を見ると、各ファイルやディレクトリが `inode`, `parent`, `type`, `name`, `data` という形で管理されています。

| inode | parent | type | name         | data    |
|-------|--------|------|-------------|---------|
| 0     | 0      | 8    | __version__ | (NULL)  |
| 2     | 0      | 8    | datacenter.cfg | (バイナリ) |
| 8     | 0      | 4    | virtual-guest | (NULL)  |

- `type=4` はディレクトリ
- `type=8` はファイル
- `parent` によって親ディレクトリが管理されています

つまり、

1. `type=4` のエントリを辿ってディレクトリを作成する
2. `type=8` のエントリを辿ってファイルを作成し、`data` の内容を書き込む

という処理をすれば、Proxmox の `config.db` からファイルシステムを復元できるはずです。

## スクリプトの作成

この構造を元に、`config.db` のデータをファイルシステムに展開するスクリプト `proxmox_config_to_fs.py` を作成しました。

```sh
python3 proxmox_config_to_fs.py config.db -o ./reconstructed_fs --verbose --debug
```

このスクリプトでは、

- `--debug` を指定すると SQLite のレコードを表示します。
- `--verbose` を指定すると作成されたディレクトリ・ファイルの情報を表示します。

これにより、復元処理の詳細を確認できるようになっています。

## まとめ

Proxmox の `config.db` は SQLite 形式のデータベースであり、ツリー構造でファイルシステムを管理しています。クラスタが起動していないと `/etc/pve/` がマウントされず確認できませんが、このスクリプトを使えば手軽に内容を復元できます。

作成したスクリプトは GitHub に公開しているので、興味があればぜひ試してみてください。

GitHub リポジトリ: [https://github.com/flathill/Proxmox/blob/main/proxmox_config_to_fs.py](https://github.com/flathill/Proxmox/blob/main/proxmox_config_to_fs.py)
コンポーネント化時はproptypeを設定しておかないと赤い波線がでる

こんな感じで設定しておかないとエディターに怒られた。
```
NavItem.propTypes = {
  icon: PropTypes.node,
  title: PropTypes.string,
  to: PropTypes.string,
  isOpen: PropTypes.bool,
};
```
FXのEA制作における初心者におこるであろう問題を一つ発見したので報告。

初心者がEA開発において陥る可能性があるエラーを一つ発見したのでご報告。
買いの関数から売りの関数へ変換するにおいて、Ask→Bid　BUY→SELL　をする際、指値と逆指値も入れ替える必要があるので、気をつけてください。以上。
正規表現は便利だったが油断した

今日のタスクは開発ではなく、表現の統一を依頼された。

()を全角に修正するものだった。

普通に検索すれば(だけだと無限に出てくる。

「正規表現で対応すれば楽です。」

と言われて早速作って対応した。

### 検索

    \((?=[^A-Za-z0-9]*?[\u3040-\u30FF\u4E00-\u9FFF])(.+?)\)




### 置換

    （$1）

目視確認して置換していった。
ファイルを確認して他にもないかチェックして、いざプッシュ！

そうしたら(kg)等、()内にアルファベットが入っているものを置換できていなかった。

動作確認でファイルではなくページを確認するのは大事ということを痛感しました。

ということでちょっとばかし正規表現について調べながら書いていこうかな。

メールアドレスとかで使われてるやつだよね。

# 特殊な文字がメタ文字

    .

任意の1文字にマッチ
“acb”, “a1b”

    *

直前の文字が0回以上繰り返されるパターンにマッチ
“a”, “ab”, “abb”

    +

直前の文字が1回以上 繰り返されるパターンにマッチ
“ab”, “abb”

    ?

直前の文字が0回または1回 出現するパターンにマッチ
colou?r→「color」または「colour」にマッチ

    []

角括弧内のいずれか1文字にマッチ
[abc]
「a」または「b」または「c」にマッチ

    [^]

角括弧内に含まれない1文字にマッチ
[^abc]
「a, b, c以外」の文字にマッチ

    ^

行頭
^Hello
行の最初が「Hello」で始まる文字列にマッチ

    $

行末
end$
行の最後が「end」で終わる文字列にマッチ

    ()

グループ化
(abc)+
「abc」が1回以上連続するパターンにマッチ

    \

直後の文字の特殊な意味を無効にする
\\.
実際のピリオドにマッチさせる

    \d

数字にマッチ
\d\d\d
3桁の数字

    \w

単語の文字にマッチ
\w+
1文字以上の単語

    \s

空白文字にマッチ
スペース、タブ、改行

    \D

数字以外の文字にマッチ

    \W

単語の文字以外にマッチ

    \S

空白文字以外にマッチ

    {n}
    
直前の要素がちょうど n回 繰り返される
a{3}
「aaa」にマッチ

    {n,}

直前の要素が n回以上 繰り返される
a{2,}
「aa」以上にマッチ

    {n,m}

直前の要素が n回以上 m回以下 繰り返される
a{2,4}
「aa」から「aaaa」までにマッチ

    `

``に囲まれた文字にマッチ
\`hello`
helloにマッチ

意外に一文字ずつ追っていったらなんてことなさそうに見えてきた！

気がするのであった。。。。
電脳少女プログラミング2088【ギャングのアジト】Cで解いてみた

paizaさんの、電脳少女プログラミング2088、楽しく解いてます。
レイミ可愛いし、検証中画面もかっこいい。
問題によってC言語で解いたりPythonで解いたりしてますが、
解いてみた投稿でC言語が少ない印象だったので、Cで書いたものを載せてみます。
リンクはこちら　[電脳少女プログラミング2088](https://ppg.paiza.jp/denno2088/areas/16 "ギャングのアジト")

本記事投稿した後で、レイミちゃんからの指摘を反映して解き直したので、編集します。
反映した指摘内容は、配列のサイズを小さくできるはず、的な内容。
解き直し前は、ピクセルアートを読み込むときにスペースを除く処理をしないで済むように配列サイズをn*2で組んでいました。そこを改善しました。結果、ずいぶんすっきりしました。

```hideout.c
#include <stdio.h>
#include <string.h>
int main(void){
    // 自分の得意な言語で
    // Let's チャレンジ！！
    int n;
    int i,j,k; //loop counter
    int ans = 1;
    char str[128];
    fgets(str, sizeof(str), stdin);
    sscanf(str, "%d", &n);
    
    //ピクセルアートを読み込む
    char art[n][n];
    memset( art, 0x00, sizeof(art));
    for( i=0; i<n; i++) {
        fgets(str, sizeof(str), stdin);
        for( j=0; j<n; j++) {
            art[i][j] = str[j*2];
        }
    }
    //左右対称か見ていく
    for( k=0; k<n; k++){
        for(  i=0, j=n-1; i<n/2; i++, j--){
            if( art[k][i] != art[k][j]) {
                ans = 0;
                break;
            }
        }
        if( ans == 0) break;
    }
    if( ans == 0) {
        printf("No\n");
    } else {
        printf("Yes\n");
    }
    return 0;
}
```
褒められてる…のかな…？（笑）
![2025-02-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007618/8252bba2-96f6-4fa0-90f6-fd1121afb7c6.png)



下記は改善前の記事です。

二次元配列に入力値をそのまんま読み込んで、
ループして一行ずつ、
iを行の先頭からのインデックス、jを行末からのインデックスとして、
両端から順々に比較していくだけです。

```hideout.c
#include <stdio.h>
#include <string.h>
int main(void){
    // 自分の得意な言語で
    // Let's チャレンジ！！
    int n;
    int i,j,k; //loop counter
    int ans = 1;
    char str[1000];
    fgets(str, sizeof(str), stdin);
    sscanf(str, "%d", &n);
    
    //ピクセルアートを読み込む
    char art[n][n*2];
    memset( art, 0x00, sizeof(art));
    for( i=0; i<n; i++) {
        fgets(str, sizeof(str), stdin);
        strcpy( art[i], str);
    }
    //左右対称か見ていく
    for( k=0; k<n; k++){
        for(  i=0,  j=n*2-2; i<(n*2-1)/2; i++,j--){
            if( art[k][i] != art[k][j]) {
                ans = 0;
                break;
            }
        }
        if( ans==0) break;
    }
    if( ans == 0) {
        printf("No\n");
    } else {
        printf("Yes\n");
    }
    return 0;
}
```

ほめられた。
にこにこかわいい。
![2025-02-12 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4007618/0b919b6c-eff9-4a23-ae12-21fcc044e8d7.png)

同じコードを提出しても、レイミちゃんから
「文字列の終端文字のこと、忘れんようにしようね！」
とか、
配列のサイズがn*2じゃなくn-1がいいんじゃないかとか配列サイズが大きいんじゃないかとかのご指摘がありました。
文字列の終端は止めてないけど意識はしてたし（でも止めるべきか）、
配列のサイズを小さくするなら確かに比較の回数減るけど、マップの読み込み時の処理量が増えるよね、と思いますが…その方がいいのかな？でもnの最大値が50なので大して気にする必要がない気もする…ご教示くださる方がいらっしゃったらありがたいです。
#0047（2024/02/12）「尋ねるな命じろ」（Don't Ask, Tell）

# 「尋ねるな命じろ」

「尋ねるな命じろ」（Don't Ask, Tell）は、オブジェクト指向設計における重要な原則の一つです。  
この原則は、オブジェクトの内部状態を外部から「尋ねる」のではなく、オブジェクトに対して「何をするか」を「命じる」ことで、カプセル化と責務の明確化を促します。

---

## 背景と目的

### 問い合わせ（質問）の問題点

- **カプセル化の破壊:**  
  オブジェクトの内部状態を外部に問い合わせると、その内部実装に依存するコードが増え、変更に弱い設計となります。

- **責務の不明確さ:**  
  外部がオブジェクトの状態をチェックし、そこから処理を決定すると、どのオブジェクトが本来の責務を持つべきかが曖昧になります。

### 命じる（指示する）のメリット

- **カプセル化の維持:**  
  オブジェクトに具体的な操作を命じることで、内部状態はオブジェクト内に隠蔽され、外部からの不要な依存を防ぎます。

- **責務の明確化:**  
  各オブジェクトが自分自身の状態や振る舞いを管理することで、システム全体の責務が明確になり、保守性や拡張性が向上します。

---

## 原則の適用例

### 悪い例（「尋ねる」パターン）

以下の例では、クライアントが `BankAccount` オブジェクトから直接残高を問い合わせ、その値に基づいて判断を行っています。

```python
class BankAccount:
    def __init__(self, balance):
        self.balance = balance

    def get_balance(self):
        return self.balance

# 悪い例: 外部が内部状態を問い合わせ、処理を判断している
account = BankAccount(100)

if account.get_balance() >= 50:
    print("十分な残高があります。")
else:
    print("残高が不足しています。")
```

### 良い例（「命じる」パターン）
「尋ねるな命じろ」の原則に則り、クライアントは BankAccount に対して直接操作を命じ、オブジェクト自身が内部状態に基づいて判断を行います。

``` python
class BankAccount:
    def __init__(self, balance):
        self.balance = balance

    def has_sufficient_balance(self, amount):
        # 内部で残高が十分かどうかを判断する
        return self.balance >= amount

# 良い例: クライアントは命令を出し、オブジェクトに判断させる
account = BankAccount(100)

if account.has_sufficient_balance(50):
    print("十分な残高があります。")
else:
    print("残高が不足しています。")
```

## まとめ
- 「尋ねるな命じろ」の原則は、オブジェクトに直接操作を命じ、内部状態の問い合わせを避けることで、カプセル化を強化し、責務を明確にします。
- このアプローチにより、コードの保守性や拡張性が向上し、システム全体が変更に強くなります。
- 結果として、各オブジェクトが自らの役割を担い、柔軟で堅牢な設計が実現されます。

この原則は、堅牢なオブジェクト指向設計を目指す上で非常に有効な指針となります。
C++ 学習備忘録 2 - 文字入力編

## 目次
●[1.はじめに](#1はじめに)
●[2.文字列を入力](#2文字列を入力)
●[3.おわり](#3おわり)

## 1.はじめに
前回（[C++ 学習備忘録 1 - 文字出力編](https://qiita.com/uchiita/items/07a965473371e92b72c3)）は文字列の出力について記事にしたので、今回は入力について記載。
大きくは出力の時 cout で、入力のときは cin の違いだけですが:confused:

## 2.文字列を入力
リンゴ、みかん、メロンの個数を入力し、その合計の個数を表示するプログラムを作成しました。

```c++:study2_prog1.cpp
#include <iostream>
using namespace std;

int main(){
    int apple, orange, melon;

    cout << "リンゴ の個数を入力してください --->";
    cin >> apple;
    cout << "みかん の個数を入力してください --->";
    cin >> orange;
    cout << "メロン の個数を入力してください --->";
    cin >> melon;

    cout << "リンゴの個数は" << apple << "みかんの個数は" << orange << "メロンの個数は" << melon << "です" << endl;
    cout << "合計の個数は" << apple + orange + melon << "です" << endl;
    
    return 0;

}
```

**実行結果**
`リンゴ の個数を入力してください --->`**5**
`みかん の個数を入力してください --->`**3**
`メロン の個数を入力してください --->`**2**
`リンゴの個数は5みかんの個数は3メロンの個数は2です`
`合計の個数は10です`
（※太字はキーボードから入力）

:::note info
文字列の入力の際には cin >> を使用する
この >> で cin に与える文字列を指定しているイメージ。
※namespace を指定しているので std:: はついていない。
:::

:::note info
改行するの際には endl を付ける。
endl がプログラムで endl がないところは改行がされていない。
:::

## 3.おわり
文字列の入力について記載しました。
これで入出力は完璧です:wink:
#0046（2024/02/12）デメテルの法則

# デメテルの法則 (Law of Demeter) とは？

デメテルの法則は、ソフトウェア設計における**低結合**を促進する原則のひとつです。  
この法則は、オブジェクト間の依存関係を必要最低限に保つことで、システムの保守性や拡張性を向上させることを目的としています。

---

## 基本的な考え方

デメテルの法則は、しばしば「**友達の友達には話しかけるな**」というシンプルな表現で説明されます。  
つまり、あるオブジェクトは、直接関係のある（＝「友達」と呼べる）オブジェクトにしかメッセージを送るべきでなく、間接的な関係（＝「友達の友達」）に対してはアクセスすべきではないというものです。

### 具体例

#### 良くない例

以下のコードは、複数のオブジェクトを連鎖的に呼び出すことで内部構造に依存してしまっています。

```python
# Python の例（良くない例）
result = order.getCustomer().getAddress().getZipCode()
```

この例では、order オブジェクトが直接 Customer を取り出し、その Customer が Address を提供し、さらに ZipCode を取得しています。
このような連鎖呼び出しは、各オブジェクトの内部構造に強く依存してしまうため、将来的な変更に弱くなります。

#### 改善例

デメテルの法則に従って、必要な情報を直接取得するメソッドを用意します。

``` python
# Python の例（改善例）
zip_code = order.getCustomerZipCode()
```

ここでは、order が内部で必要な情報を集約して返すメソッド getCustomerZipCode() を用意することで、他のオブジェクトの内部構造を隠蔽しています。

### デメテルの法則のメリット
- 低結合の実現:
    - オブジェクト同士の依存関係が減ることで、システム全体が変更に強くなります。
- 変更の局所化:
    - 内部構造の変更が外部に影響を与えにくく、保守性が向上します。
- テストの容易性:
    - オブジェクトの依存関係が単純化するため、ユニットテストやモックを使ったテストがしやすくなります。

### 適用時の注意点
- 過剰なラッピングの回避:
    - 必要以上にラッパーメソッドを作成すると、コードが冗長になりかえって理解しにくくなる恐れがあります。バランスを考えた設計が重要です。
- 柔軟な適用:
    - 全てのケースにおいて厳密に適用するのではなく、システム全体の設計や要件を踏まえて適用することが望まれます。


## まとめ

デメテルの法則は、オブジェクト間の依存関係を最小限にし、システムの保守性と拡張性を高めるための有力な設計原則です。
「友達の友達には話しかけるな」というシンプルなルールに基づき、各オブジェクトは自分の責任範囲内で完結する設計を心がけることで、柔軟かつ堅牢なシステムを実現することができます。