OmniAICreator/Qiita-1.07M huggingface dataset:
iRICソフトウェア上で動作するプログラムを自由に操るまでの記録（3）「Visual Studioを用いたNays2DHのデバッグ」

# はじめに
## この記事の目的・内容
これは、初めてプログラミングに触れる人が河川シミュレーションソフトウェア「iRIC_v4」のNays2DH（ソースコードは[こちら](https://github.com/iRICsolvers/v4_Nays2DH)）を自らの手で改良し、実行可能にすることができるように基礎知識と手順を記すシリーズ記事<qiitaの記事へのリンクをここに入れる>の一部である。

前回記事で、Visual Studioの開発を行う際の基本操作であるプロジェクト作成、ビルドの方法について学んだ。今回はデバッグの方法について学ぶ。

## 前提
シリーズで一貫して、以下のような環境を想定する。
- 言語：Fortran
- IDE：Visual Studio 2022
- コンパイラ：Intel Fortran Compiler Classic (ifort), Intel(R) Fortran Compiler (ifx)
- OS: Windows 

Fortranの開発環境は、[こちらの記事](https://qiita.com/Kazutake/items/a069f86d21ca43b6c153)の方法で構築している。

# （再掲）Visual Studioでのプログラムの開発
## 大まかな流れ
Visual Studioを用いたプログラムの開発は、一般に下の図のような手順で行う。

![development.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917090/e7964485-bef6-d016-5eaf-c7ad3a60c441.png)

1. **プロジェクト、ソリューションの作成**：Visual Studioでソースコードを編集しビルドするためには、ソリューション・プロジェクトを作り、そこに編集したいソースコードを格納する必要がある。
2. **コーディング**：Visual Studioのエディタを使って、プログラムのロジックを記述する。
3. **ビルド**：ソースコードをコンパイルして実行可能なファイルを生成する。プロジェクトのプロパティを設定し、ビルドを実行する。
4. **テスト**：生成された実行ファイルをテストし、期待通りに動作するか確認する。
5. **デバック**：プログラムの不具合を修正する。Visual Studioのデバッガを使って、ステップ実行や変数の監視を行う。
6. **デプロイ**：最終的な実行ファイルを動作させる環境に配置して利用できるようにし、配布する。

本記事では、「5.デバック」について扱う。「2.コーディング」、「4.テスト」については、今後の記事で触れる。「6.デプロイ」に関しては、今回のシリーズ記事は、iRIC Softwareという既存のアプリに対してその一部を改良することを目的としていることから扱わないものとする。

# Visual Studioでのデバッグ
## デバッグに関わるプロジェクトのプロパティを設定
-  **デバッグをする際の実行ファイルのワーキングディレクトリの設定**

    左側のメニューから「構成プロパティ」→「Debugging」→「アクション」→「Working Directory」を選択し、実行ファイルのワーキングディレクトリを指定する。


-  **デバッグをする際の環境変数の設定**

    「Debugging」→「アクション」→「Environment」を選択し、ここに「PATH="`パス`"」という形でパスを指定することで、デバッグにおけるプログラムの環境変数を指定することができる。これは、システム環境全体に適用されるものではなく、そのプロジェクトのデバッガのみに適用される。
   
    iRIC_v4のソルバーをIntelのコンパイラーでコンパイルする場合には、iRIC_v4のプログラムファイルのパス（`C:\Users\Username\iRIC_v4\guis\prepost`）と、Intelのコンパイラーへのパス（Windowsの場合は`C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin`）を通せばよい。

    :::note info
    **環境変数**

     環境変数とは、OSやアプリが動作する際に使用する設定情報を格納するための変数である。PATH変数を用いて、プログラム内で参照されるファイルへのパスを入力しておけば、デバッグの際に、PATH変数に設定されたディレクトリが順番に検索され、最初に見つかった実行可能ファイルが実行される。また、PATH変数にディレクトリを追加することで、そのディレクトリ内のプログラムをフルパスを指定せずに実行できる。

## Visual Studioに備えられたデバッグのための機能
### ブレークポイントの設定
ブレークポイントを設定することで、プログラムの実行を一時停止し、特定の行でプログラムの状態を確認することができる。ブレークポイントを設定するには、コードエディタの左側の余白をクリックし、赤い丸が表示さればよい。

`F5`キーを押すと、デバッガがプログラムを開始し、次のブレークポイントまで実行を続ける。

### ステップ実行
ステップ実行を使用すると、プログラムを一行ずつ実行し、各ステップで変数の値やプログラムの状態を確認できる。ステップ実行には以下の3つの方法がある。

- **ステップイン**：関数の内部に入って実行を続ける。ショートカットキーは `F11`。
- **ステップオーバー**：関数の内部には入らずに次の行に進む。ショートカットキーは `F10`。
- **ステップアウト**：現在の関数の実行を完了し、呼び出し元に戻る。ショートカットキーは `Shift + F11`。

### 変数の監視

変数の監視は、データヒント機能やウォッチウィンドウ機能を用いて行うことができる。

#### データヒント機能
データヒント機能を使うと、コードエディタ上で変数にマウスカーソルを合わせるだけで、その変数の現在の値をポップアップ表示で確認できる。デバッグ中に変数の値を迅速にチェックでき、特に複雑なデータ構造やオブジェクトの状態を把握するのに便利である。

データヒントを表示するには、デバッグ中に変数の上にマウスカーソルを移動させればよい。ポップアップには変数の値やオブジェクトのプロパティ、フィールドの値も表示される。

#### ウォッチウィンドウ機能
ウォッチウィンドウに変数を追加すると、その変数の現在の値が表示され、デバッグ中に変数の値を監視することができる。変数を追加するには、変数を右クリックし、「ウォッチに追加」を選択すればよい。

<!--
### 呼び出し履歴の確認
呼び出し履歴ウィンドウを使用すると、現在の関数呼び出しの履歴を確認できる。これにより、プログラムの実行フローを追跡し、どの関数がどの順序で呼び出されたかを確認できる。

### ローカル変数の確認
ローカル変数ウィンドウには、これまでにデバッグを行った範囲内のすべての変数とその値が表示される。これにより、現在の関数内で使用されているすべての変数の状態を一目で確認できる。
>
C_TADM_23:SAP Certified Associate - SAP S/4HANA System Administrationについて


### C_TADM_23とは？

C_TADM_23は、SAPが提供する認定資格の一つで、**SAP S/4HANAシステムの技術コンサルタント**としての専門知識とスキルを証明する資格です。この資格を取得することで、SAP S/4HANAシステムの導入、カスタマイズ、運用に関する深い理解を持っていることを示すことができます。

### 資格取得のメリット

* **キャリアアップ:** SAP S/4HANAは最新のERPシステムであり、この資格を持つことで、SAP関連のプロジェクトでより高度な役割を担うことができます。
* **市場価値の向上:** SAP S/4HANAは多くの企業で導入されており、この資格を持つ人材の需要は高まっています。
* **専門性の証明:** SAP S/4HANAシステムに関する深い知識とスキルを持っていることを客観的に証明できます。
* **グローバルな通用性:** SAPはグローバルな企業であり、この資格は世界中で通用する資格です。

### 試験内容

C_TADM_23の試験は、SAP S/4HANAシステムの以下の領域に関する知識を問われます。

* **システムのインストールと設定:** SAP S/4HANAシステムのインストール、パッチ適用、システム設定など
* **データベース:** SAP HANAデータベースの管理、パフォーマンスチューニング
* **システムの監視:** システムの健康状態の監視、パフォーマンス分析
* **トラブルシューティング:** システム障害の分析と解決
* **セキュリティ:** システムのセキュリティ設定、アクセス管理
* **高可用性:** システムの可用性を高めるための設定
* **バックアップとリカバリー:** システムのバックアップと復元

### 試験対策

試験対策としては、以下の方法が考えられます。

* **SAPの公式教材:** SAPが提供する公式教材を学習する
* **オンライン学習:** UdemyやCourseraなどのオンライン学習プラットフォームで、SAP S/4HANAに関するコースを受講する
* **実務経験:** SAP S/4HANAの実務経験を積む
* **スタディグループ:** 他の受験者と協力して学習を進める

### まとめ

C_TADM_23は、SAP S/4HANAシステムの技術コンサルタントを目指す人にとって、非常に価値のある資格です。この資格を取得することで、キャリアアップや市場価値の向上に繋がります。試験対策は、SAPの公式教材やオンライン学習、実務経験などを活用して、体系的に学習を進めることが重要です。

### さらに詳しく知りたい方へ

* **SAPの公式ウェブサイト:** 最新の試験情報や教材を確認できます。
* **SAPコミュニティ:** 他の受験者と情報交換することができます。
* **オンライン学習プラットフォーム:** Udemy、Courseraなどで、SAP S/4HANAに関する様々なコースが提供されています。
SAP Fiori：中級者向け深堀り解説


### SAP Fioriのアーキテクチャと開発の更なる深堀り

#### アーキテクチャの詳細

* **SAPUI5:**
    * **MVCアーキテクチャ:** Model-View-Controllerの設計パターンを採用し、UIの構造を明確化。
    * **データバインディング:** モデルとビューを双方向に結びつけ、データの変更をUIに自動的に反映。
    * **コントロール:** テーブル、チャート、フォームなど、多様なUIコントロールを提供。
    * **テーマ:** Material DesignやSAP独自のテーマなど、様々なテーマに対応。
* **OData:**
    * **RESTful API:** HTTPメソッドを用いたシンプルなAPIで、SAPシステムのデータを操作。
    * **アノテーション:** ODataアノテーションを用いて、データの構造や操作方法を定義。
* **Gateway:**
    * **ODataサービスの提供:** ODataプロトコルで外部システムからSAPシステムのデータを公開。
    * **セキュリティ:** 認証認可機能を提供し、データへの不正アクセスを防ぐ。

#### 開発の詳細

* **SAP Web IDE:**
    * **フルスタック開発:** UI開発からバックエンドのODataサービス開発まで、一貫した開発環境を提供。
    * **デバッグ:** ブレークポイント設定や変数監視など、デバッグ機能が充実。
* **Visual Studio Code:**
    * **拡張機能:** SAP開発向けの豊富な拡張機能を提供。
    * **カスタマイズ:** キーボードショートカットやテーマなどをカスタマイズ可能。
* **カスタムコントロール:**
    * **SAPUI5 SDK:** SAPUI5のSDKを利用して、独自のUIコントロールを開発可能。
* **テーマのカスタマイズ:**
    * **CSS:** CSSをカスタマイズすることで、UIの外観を自由に変更可能。
    * **テーマデザイナ:** SAPUI5のテーマデザイナを利用して、視覚的にテーマをカスタマイズ可能。

### SAP Fioriの活用と拡張

* **分析アプリケーション:**
    * **SAP Analytics Cloud:** SAP Fioriと連携し、高度な分析機能を提供。
    * **カスタムチャート:** SAPUI5のチャート機能を利用して、独自のチャートを作成。
* **モバイルアプリケーション:**
    * **SAP Fiori Client:** モバイルデバイス向けのクライアントアプリ。
    * **オフライン機能:** 一部の機能をオフラインで使用可能。
* **チャットボット:**
    * **SAP Conversational AI:** SAP Fioriと連携し、自然言語処理によるインタフェースを提供。
* **拡張現実（AR）/仮想現実（VR）:**
    * **SAP Anywhere:** AR/VRを活用した新しいユーザーインタフェースを提供。

### 中級者向け学習のヒント

* **SAPコミュニティ:** SAPコミュニティで他の開発者と情報交換し、疑問を解決。
* **ブログやフォーラム:** SAP Fioriに関するブログやフォーラムで最新情報を入手。
* **トレーニング:** SAPが提供するトレーニングコースを受講し、体系的に学ぶ。
* **サンプルコード:** GitHubなどのプラットフォームで公開されているサンプルコードを参考に、開発スキルを向上。
* **ハンズオン:** 実践的な演習を通して、知識を定着させる。

### 今後のトレンドと展望

* **低コード/ノーコード開発:** SAP Build Appsなどのツールを利用し、開発の効率化が進む。
* **AIの活用:** AIによるパーソナライゼーションや予測分析が実現。
* **クラウドネイティブ:** SAP Cloud Platformなどのクラウドプラットフォームとの連携が強化。
* **セキュリティ:** ゼロトラストアーキテクチャなど、より高度なセキュリティ対策が求められる。

### まとめ

SAP Fioriは、その柔軟性と拡張性により、企業のデジタル変革を加速させる上で重要な役割を果たしています。中級者の方々は、アーキテクチャ、開発、活用の深い理解と、最新のトレンドを把握することで、より高度なSAP Fioriアプリケーションを開発し、ビジネスに貢献することができます。
AL2023でコンテナ利用する環境を作る

# タイムゾーン変更
```
$ sudo timedatectl set-timezone Asia/Tokyo
```

# 各種インストール前の準備
```
$ sudo dnf update
```

# dockerインストール
```
$ sudo dnf install docker
$ sudo systemctl start docker
$ sudo gpasswd -a $(whoami) docker
$ sudo chgrp docker /var/run/docker.sock
$ vi /etc/docker/daemon.json 
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "1"
  }
}

$ sudo service docker restart
$ sudo systemctl enable docker
```

# docker-composeインストール
```
$ sudo mkdir -p /usr/local/libexec/docker/cli-plugins
$ sudo curl -L https://github.com/docker/compose/releases/download/v2.29.3/docker-compose-linux-x86_64 -o /usr/local/libexec/docker/cli-plugins/docker-compose
$ sudo chmod 755 /usr/local/libexec/docker/cli-plugins/docker-compose
```

その後、再ログインでdocker version結果が表示されるか確認
Django Routingについて

## はじめに
今回はDjango REST Frameworkで、ルーティングを使ってビュー（APIエンドポイント）とURLパターンを関連付けを学びます。

## 目次
- 通常のルーティング
- ルーターを使った自動ルーティング
- カスタムルーター
- 名前空間を使ったルーティング
- まとめ（DRFのルーティング設定）

## 通常のルーティング

通常、Djangoでは、pathを使用してビューとURLを手動で関連付けます。
Class-based Views のルーティングの場合

```python
# backend/profiles/urls.py

from django.urls import path
from.views import MyProfileView

urlpatterns = [
    path("profile/me/", MyProfileView.as_view(), name="my_profile"),
]
```
のようになります。
## ルーターを使った自動ルーティング

ViewSetsを使う場合、DRFが提供するルーターを使用すると、CRUD操作を簡単に設定できます。

```python
# backend/tweets/urls.py

from rest_framework.routers import DefaultRouter
from.views import TweetViewSet

router = DefaultRouter
router.register(r'tweets', TweetViewSet, basename='tweets')

urlpatterns = router.urls

```
上記のようにすると
DefaultRouterを使ったルーティングでは、
以下、ViewSetのエンドポイントを自動的に生成してくれます。

- GET /tweets/: ユーザー一覧を取得
- POST /tweets/: ユーザーを作成
- GET /tweets/{id}/: 特定のユーザー詳細を取得
- PUT /tweets/{id}/: 特定のユーザーを更新
- DELETE /tweets/{id}/: 特定のユーザーを削除

**以下のような、ルーターと通常のURLパターンの組み合わせも可能です。**

```python
# backend/tweets/urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from.views import TweetViewSet
from.users.views import UserAPIViewSet

router = DefaultRouter
router.register(r'tweets', TweetViewSet, basename='tweets')

urlpatterns = [
    path('user/', UserAPIViewSet.as_view(), name='user_list'),
    path('', include(router.urls)),
]

```

## カスタムルーター

必要なエンドポイントだけを指定したい場合は、
SimpleRouterが用意されてたり、CustomRouterを使います。

#### SimpleRouterを使った例

SimpleRouter はブラウザ用のAPIルートを含まない、シンプルなルーターです。

```python

from rest_framework.routers import DefaultRouter
from.views import TweetViewSet

router = SimpleRouter()
router.register(r'tweets', TweetViewSet, basename='tweets')

urlpatterns = router.urls

```

#### CustomRouterを使った例

特定のエンドポイントを追加するために、カスタムルーターを作成できます。

```python

from rest_framework.routers import DefaultRouter
from.views import TweetViewSet

class CustomRouter(DefaultRouter):
     routes = [
        # 必要なルートをここに定義
    ]
    
```

## 名前空間を使ったルーティング

以下のように名前空間を使うことで、
アプリケーションごとにURLのスコープを明確にできます。


```python

from django.urls import path
from.views import TweetViewSet
from.views import UserAPIViewSet

app_name = 'example'

urlpatterns = [
       path('user/', UserAPIViewSet.as_view(), name='user_list'), 
    ]

```

## まとめ（DRFのルーティング設定）
**ViewSetとルーターを活用**
単純なCRUDエンドポイントはViewSetとルーターで設定すると効率的です。

**カスタムビューとルーターの組み合わせ**
複雑なビジネスロジックや特殊なエンドポイントは、APIViewでカスタマイズします。

**名前空間を使う**
名前空間を使うことで、大規模プロジェクトでもURLの競合を防ぎます。
【勉強記録】Dev community(通称Dev.to)を知ってますか

# はじめに
こんにちは。アメリカで独学でエンジニアを目指しているものです。
Qiitaでの毎日投稿を始めて、もうすぐ4カ月が経とうとしています。

現在、アメリカに在住していることもあり、将来的なキャリアはアメリカで築きたいと考えています。そのため、Qiitaのように技術的な記録を英語でも残す必要があると感じ、いろいろ調べた結果、今回紹介する**Dev Community（通称 Dev.to）**にたどり着きました。

## Dev community(通称Dev.to)
Dev Communityは、開発者向けのソーシャルブログプラットフォームです。プログラマーや技術者が自身の経験や知識を共有したり、他の開発者の記事を読んだりする場として利用されています。投稿は日本語でも可能ですが、主に英語が中心です。

エンジニアとして英語で情報収集を行う能力は重要であり、さらに英語で発信するスキルも必要だと感じています。以下に、Dev Communityの特徴や利点をまとめました。

* 技術記事の投稿・閲覧

ユーザーはプログラミング、ツール、フレームワーク、ソフトウェア開発全般に関する記事を書いて公開できます。
他のユーザーが投稿した記事を検索し、読むことができます。Qiita 英語版のような感じです

* オープンソース

Dev.toはオープンソースのソフトウェアで、GitHub上で管理されています。これにより、コミュニティがサービスの改善に参加できます。

* タグによる分類

投稿はタグを使って分類されており、興味のあるトピックを簡単に見つけることができます。
例: #javascript, #ruby, #webdev, #career, #rails

* コミュニティ機能

記事に対してコメントや「いいね」（リクション）を送ることで、コミュニケーションを図ることができます。
フォロー機能で特定のユーザーの記事を追いかけることも可能です。

* 無料で利用可能

プラットフォームの利用は無料で、広告も比較的控えめです。

* Markdown対応

Markdown形式で記事を作成できるため、コーディングやドキュメント作成に慣れている人にも使いやすい仕様です。

## まとめ
以上の特徴から、Dev Communityはまさに英語版Qiitaという印象を受けました。RubyやRailsは日本で非常に人気が高い一方、海外ではPythonやGoほど使われていないため、初心者目線の記事が求められていると感じます。

毎日投稿は難しいかもしれませんが、週1回を目標に記事を投稿していきたいです。同じように興味のある方は、ぜひ一緒にDev.toを始めましょう！

https://dev.to/
フリーランスのヤバイ現場のお話

フリーランスエンジニアとして現場に参画する形態の業務に初めて就いた際に出会ったヤバイ現場先について、記事にまとめてみました。
身の回りのフリーランスエンジニアには同じような経験をした方がおらず、他に同じような経験をされている方がいるのか興味があり、調べていたところ下記の記事に出会いました。

関係の優位性を悪用する企業が他にも少なからずいるということを知り、悲しい気持ちになりました。
https://qiita.com/mesaka/items/41ec09a4dae3fba6dd6c


これからフリーランスを検討されている方にとってこのような現場があるということを知っていただければと思い記事にしました。
また、これまでにこういった現場にあたったことがない人に向けて参考となると幸いです。


# ヤバイ現場
この現場はあるフリーランスエージェントが扱っている案件で常駐形態で参画した参画先企業です。
現場に参画した時点で、参画前に聞いていた他のエンジニアの方が（急にやめたなどで）現場におらず、その方の業務を引き継いで進めることとなったのですが、現場では充分な受け入れ体制も整っておらず、この段階から少なからず疑問を抱えながら業務に取り組んでいました。

このとき企業常駐は初めてであったため不慣れなところが多く、要領が分からない点もありましたが、エージェント担当者からは充分な説明がなく、当初聞いていた「参画中のサポート」というのは名ばかりで、参画したらほぼ放置同然で扱われていました。

このため後述する問題が発生した際も、対応方針が不明瞭で大きな不安を覚えたと同時に、途中から担当者が変更されるなど対応の体勢に疑問が生じていました。

# 現場にどんな問題があったか
- 当初聞いていたエンジニアの方が不在かつ引継ぎが必要であったこと、受け入れ体制がなく業務フローが整備されていなかった
このため担当者や業務に関して不明点が多く社内で確認を行い、収集していく必要があった
- エージェント担当者による参画中のサポートがなく、担当者が途中で変更されたことで、意思疎通が困難であった
- 現場ではタスク管理やスケジュール管理が適切に行われておらず、ソース管理がない
改善を訴えても、これらを行うことで業務のスピードを損なうといった理由で見送られていました
- 裁量がなく、指示された手順以外での作業を否定される
- 現場は協調性が欠けており、「連絡するな」、「忙しいのでやらない」といった業務依頼の否定や拒否が横行していた
- このような円滑に進む体制がないことに加え改善が見られないにも関わらず残業を求められる
- 「指導」という名目で人格否定にあたる発言を繰り返される
代表的なものに「このやり方ではダメだ、頭を使って仕事しろ」というものがあります。
- 契約終了後、支払いが行われたのちに報酬の減額を求められる
現場では確認が行われ、成果物は利用されている実態があるのにもかかわらず、成果物の品質が悪いなどとし、減額を求められる

# 身を守るために行えること
## 法的に詳しくなる
常駐経験が少なく事情が分かっていないこともありましたが、
この一件を機に法的に詳しくなる必要があると感じました。

下記の記事内の「業務委託」は法律上の用語ではなく、法的には「準委任契約」、「請負契約」の２通りであるということについて違いが解説されていますが、改めて税務のみならずこのような法的な理解も必要だと感じた出来事でした。

いざというときに備えて、法的な内容も理解している必要があるのだと経験になりました。
https://qiita.com/kazukichi/items/c458aa9e763b9a3eb25b#%E6%BA%96%E5%A7%94%E4%BB%BB%E3%81%A8%E8%AB%8B%E8%B2%A0%E3%81%AE%E9%81%95%E3%81%84

## 相談できる人を見つけよう
そしてもう一つは横の繋がりを持っていることが重要だと感じた一件でもありました。
幸いにも周囲にはフリーランスエンジニアをしている方が何人かいたため、他の方の現場の状況や経験を伺うことで、現場の問題を改めて考え直す機会になりました。

下記のツイートにもあるように、何らかの問題が生じた際など相談できる人の存在は非常に心強く、これから始めようと検討する場合はまず経験者に話を伺った方が良いというのは実際に痛感してから思っています。

https://x.com/napple74/status/1880533906757472683

この手の問題は大きく語られていることは少なく、ときおり個人ブログやツイート等でお見掛けすることがありましたが、こうしてまとめることで今後フリーランスを検討されている方の役に立てれば幸いです。
iframeを使うと検証ツールでconsole.log()の結果が確認できない

## 概要

デバッグとして多用されるconsole.log()ですが、たまにDevToolsで確認できないことがありました。
調べてみても「**コードが実行されていない**」とか「**jsファイルが読み込まれていない**」という指摘ばかりであり、「いや、alert()で上下挟んだら出てるから絶対実行されてるんだよなぁ…」というモヤモヤを抱えていました。

たまに成功するときもあって、console.log()は気まぐれだからalert()の方がいいや、と力技で解決していたのですが、さすがに向き合う必要があると思って調べてみました。

非常に簡単な落とし穴だったので、同じ原因で悩んでいる方の助けになれば幸いです。

## 先に結論

DevToolsのConsoleを開くと、親のファイルをデフォルトで指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3814957/e2f53f5b-9d3a-c83f-9e84-fad492973035.png)

これを、iframeで実行している対象のファイルにすれば表示されます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3814957/9d30935c-ff4f-4473-a474-1163ba2ab5a4.png)

iframeを使って複数のフレーム（ファイル）が組み合わさっている場合、親フレームを見ても子フレームで呼び出されたconsole.log()は見えなかったのです。
また、alertはフレームに依存せずブラウザで出力されるものなので、まったく別物なのでした。

## あとがき

タイトルには「iframeを使うと～」と書いたのですが、iframeが原因だと分かるまでに苦労しました。
iframeを使っていなければ普通にできるので「今日も運が悪かったらできないのかなー、だったら嫌だなー」とめんどくさく思っていました。

他の解決策（それこそalert）でなんとかなっていたので致命傷には至りませんでしたが、些細な心理的負荷がクオリティ低下に繋がってしまうので「**なんだかわからないことのせいで手間が増えてる**」という問題は早めに解決しましょう！
【ServiceNow】Reference項目の参照制御をしてみよう。（簡易版）

前回の記事
---
https://qiita.com/masa3150/items/bc3f08eb2f7792de1d0c

はじめに
---
テーブルのカラムでよく使用するReference項目ですが、何も表示制御をしない場合は、
設定した参照先テーブルのリストが表示されます（ログインユーザーが参照可能なレコード全て）

![スクリーンショット 2025-01-27 14.07.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/80ad095c-c15b-5a24-762a-f6ac4edca0a6.png)

・sys_userテーブル（ログインユーザーが参照可能なレコード全て）
![スクリーンショット 2025-01-27 14.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/7ec92d38-6e8e-3343-9f4e-7f1483e30fb0.png)


そこで、「名前」「次の値で始まる」「ATF」レコードのみを表示させたい時の設定方法を紹介します


参照制御を設定
---

・参照修飾子の条件を　「名前」「次の値で始まる」「ATF」に設定し、更新ボタンを押下する。
![スクリーンショット 2025-01-27 15.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/d7cd7bb4-c664-2c34-bca2-7c974438f07b.png)



結果
---
・名前が「ATF」から始まるユーザで参照制御されます。
![スクリーンショット 2025-01-27 15.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/c585d5d3-7968-060b-242f-2935266e22c9.png)


![スクリーンショット 2025-01-27 15.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154654/c613eac1-3666-286e-6097-9b56185619cb.png)


参考記事
・servicenowのドキュメント

https://www.servicenow.com/docs/ja-JP/bundle/washingtondc-platform-administration/page/script/server-scripting/task/t_ConfigureReferenceQualifiers.html


終わりに
---
開発では、会社や役職によって表示させたいレコードがある際に、参照制御を設定します。他にも色々参照制御する方法はありますが、１つ知識として覚えておくといいかもしれませんね。
QGISである地域から最寄の公園の場所を検索する

# はじめに
自分の住んでいる地域で、最も最寄の何かの距離を調べられたら便利だろうなと考えたため、備忘録的にやり方を残す。

# 環境
QGISバージョン: 3.34.13-Prizren

# データ
e-stat、国土数値情報のHPから、以下のページで地域(番地等)のポリゴンデータ、公園のデータを取得する。
ポリゴン: [統計地理情報システム データダウンロードページ](https://www.e-stat.go.jp/gis/statmap-search?page=1&type=2&aggregateUnitForBoundary=A&toukeiCode=00200521&toukeiYear=2020&serveyId=A002005212020&coordsys=1&format=shape&datum=2000)
公園: [国土数値情報ダウンロードサイト 都市公園データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P13.html)
(ポリゴンデータは国土数値情報にないと思えないが、今回はe-statで見つかったので良しとする。データ元が揃っているほうがより正確ではあると思うが...)

## QGISへのインポート
両データとも、ダウンロードすると.shpファイルというものが入っている。それをQGISにドラッグアンドドロップすると、以下のように何丁目などのポリゴンと、公園の位置が記載されたポイントが出現する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256521/2978d556-0db4-9285-4824-e1188eb7e71d.png)

※ 公園データが、インポートした際に文字化けしていたので、それの解消法も記載
QGIS画面左下「レイヤ」から、公園データのレイヤを右クリック→「プロパティ」を押下→「ソース」から文字コードを「Shift_JIS」に変更。

## 座標系の修正
座標系(CRS)を修正する(ダウンロードしてきたデータ同士で座標系が違うと、距離が正確に出せないため)
- まずは、各ファイルのCRSを確認する。ダウンロードしたHPに、JGD2011や、JGD2000、WGS84などと書かれているはず(以下図例)。今回はお試しなので精度は出なくて良いかと、緯度経度座標のWGS84を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256521/3cba6442-3c4e-d386-0b51-78f068e0f076.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256521/cd5eee76-39d8-ed72-a5a8-fd9f3ae3f59a.png)

- 各データのCRSを確認し、元の内容と合っているかを確認する。(「プロパティ」「ソース」「設定されたCRS」を確認)

※公園のポイントデータはインポートした際に自動でCRSを設定できていなかったため、CRSの設定を行う。ポイントデータのレイヤを右クリック→「プロパティ」「ソース」→設定されたCRSのオプションボタン→JGD2000と検索し、それを選択→「OK」

- QGIS上部のバー(「プロジェクト」、「編集」などと書かれているところ)から「プロセシング」「ツールボックス」を押す。
すると右側にボックスがでるので、そこで「再投影」と検索をかけ「ベクタレイヤを再投影」をクリック。

- 指定したいレイヤと座標系を選んで実行

## ポリゴンの中心点作成
公園との距離を出すのに、ポリゴンデータの中心点がある方がやりやすい。
上部バーの「ベクタ」→「ジオメトリツール」→「重心」を選択。ポリゴンデータのレイヤを選び、実行すると重心点が出力される

## 中心点と公園との距離測定
公園とポリゴン中心点との距離を測定し、距離が近いtop5を選ぶ機能がQGISには存在する。
プロセシングツールボックスから、「属性の最近傍結合」を選択し、入力レイヤにポリゴンデータの中心点、第２の入力レイヤに公園のレイヤを選択する。「近接地物の個数」に何個の公園データと距離を求めるかを記載(今回は5点)。
実行を押すと、以下のように同一の丁目に対し、それぞれ別の公園名が入っていることが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256521/c830fd03-d54e-6d1c-4baa-3df0c70b984f.png)
ちなみに、距離の列もあり、以下のように公園が距離順に並べられている。(今回は緯度経度の座標系のため、距離が緯度経度単位となっている。m単位で欲しければ、座標系をJDG2011などのm単位のものに変えると良い)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3256521/dc303cf1-ccd0-3e9e-98a0-c745d58e989b.png)

以上で作成完了となる。

# おわりに
初学者にも分かるよう説明したつもりではいるが、分かりにくいところあれば修正します
集計ツールを作る

独学した内容でプログラミングをした記録です。

〇行動のねらい

・「家計消費状況調査」の対象となり、手作業で集計するのが面倒なのでツールを作る
↓
家計消費を項目別（７２項目）に分類し、項目ごとに合計金額を出力する
 
〇何をしたか

・インスタンスフィールドで1件ごとの金額を受け取り、staticフィールドで合計金額、件数を集計、集計結果を出力するメソッドを持つクラスを72個作成

・上記クラスを利用するメインクラスを作成。キーボード入力で1件ごとの分類、金額を入力し、集計結果を出力する

〇行動の結果何を考えたか

・要件を満たすプログラムはできた

・類似のクラスを72個も作ったのが迂遠だった
（集計するんだし、staticフィールドを使えそう…から考え始めたのでこうしましたが、72個類似のクラスを作りながら思ってました）

・実現したい内容の読み込み不足（そもそも集計が必要だったのは72項目中一部だった）

・発生したエラーで試験内容の補強ができた
セミコロン忘れ
インターフェイスはpublic staticのフィールド不可
パッケージ宣言の扱い
switch式のぶんぽう間違い、->とbreak併用不可
スペルミスetc...

◯今後やりたいこと

・対象を必要な項目に絞り、クラス1つとメインクラスの構成で同じ機能を実現する
【振り返って考える】システム開発の要求と要件ってなんだっけ？

　アイスブレイク（創作）
　偉い猫は言いました「スカウトサービスを作れば雇用が流動的になり、企業も求職者もハッピーになる」と……
　反抗的なチンパンジーは問いかけました、「そのスカウトサービスはどの業界をターゲットにしてどのようなユーザーペルソナが考えられますか？ユーザー層によってはモダンなデザインよりレガシーなものが良いような気もするのですが？」
　偉い猫は言いました「それが要件」だと……
　チンパンジーはあまりのショックで台パンし懲戒になりましたとさ。めでたしめでたし

# 要件と要求ってなんなの
 　そもそも「要求」と「要件」の違いって何なのか？私はこう定義しました。

 <dl>
  <dt>要求</dt>
  <dd>要求は顧客や利害関係者が「システムに」やって欲しいことを定義</dd>
  <dt>要件</dt>
  <dd>要件定義は顧客や利害関係者の視点を元に「システムが」行うべきことを定義</dd>
</dl>

 　基本的に利害関係者がこうしたいよねーって脳内だけで言語化されていない考えを、実際のシステム想定で何をしたいのか具体的にしたものが要件になるはずです。

　Q:じゃぁ要件＝設計というところ？
　A:設計って言っちゃうと満足して会話しない利害関係者がいて面倒なんすよ。設計終わってるんでしょって……思い出したら「レバ」に一発打ち込みたくなってきた。
 
 # んじゃ要求って何なのさ
　例えば……要望として「私はトピックをユーザーに提供し快適にブラウジングを提供するために、それを記述したページに飛ぶリンクをだしたいん……だ！！」ってしましょう。

　面倒なんでぱっと分解したいことを画像化してきました
 ![42d98727-60b7-47c1-8c0e-7ea1c2cf4603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381248/246dcc60-39f9-c815-95f4-6fb6dac47123.png)
 　
　要望を分解すると以下の情報が出てきます
 
1\. リンクを出したい
2\. どんなトピックを出すのか？

　抽象的な一文を分解して具体として表現するこれを要求定義でもいいんですけどねぇ……もっと踏み込むと主語をつけたいなと。
 　WEBサイトなんかはシステムがXXXするだけの主語じゃないですよね？ユーザーがどのように見てどう感じるかも要求の条件の一つになります
  
1\. システムは画面にリンクを出したい
2\. システムは特定の条件を満たすXXXを検索する
3\. ユーザーはそれをXXXのように見たい

　とより具体的なところに分解されていきます。
　こいつをより具体にすると要件になりますね。

1\. リンクの出し方
2\. 呼び出しの流れ（画面遷移の情報など）
3\. 情報の検索条件の決定
4\. どのような情報が返却されるべきか
5\. etc

結論：要望から要求、要件の一連の流れはより具体にしていく作業であり抽象的なものを排除していく作業

# 「先生、実装しているんですがXXXの情報って何ですか？」
　まれによくこういうことが起きますよねー……これもまたアジャイル（？）
　アジャイルだから要望はそのままでも開発できるだろと偉い猫が昔言ってた気がしますが、何のためにイベストとかユーザーストーリーとかステークホルダーを巻き込んだ手法があると思ってんだ！！
　さっさと要望を分解するんだよ90度！
 　結局やりたいことを具体化するのはどんな開発手法やどんなチームでも変わらず、それを隠蔽すればするほどのちのタスクで手戻りが発生してしまうんですよね。
　アジャイル、ウォーターフォール関係なく、まともに機能しなくなるのでできるなら要件で細かいのは無理でもある程度、利害関係者の「脳内.zip」を解凍しておきたいですね。

# 例：アジャイルでの要件
　基本的にアジャイルでも要件定義ライクなものが必要になります、ウォーターフォールみたいにガチガチじゃなくより抽象的なものにはなるのですが……
　そうですね……メタバース向けにクリエーターが3Dモデルやエフェクトを販売できるサイトをつくろうと私が考えていたとしましょう。
　一部を除きどのような企業もまず「Who」「What」「How」を記述すると思います。
* 「私」はクリエータの販売ページを管理する
* 「私」は購入者の情報を管理する
* 「私」は売り上げをクリエータに還元する
* 「クリエーター」は商品を登録する
* 「クリエーター」は商品情報を更新する
* 「購入者」はhogehogehoge

　Whyも書いた方がいいんだけど、今回は省いています。
　これにより商品？売り上げ計算？還元するには領収書とかは？とかとか詰めていけば細かく出てくるはずです。
　それがユーザーストーリーマッピングってやつですね。
  ここら辺おろそかにしたまま、いきなりバックログに落とし込もうとしたらアジャイルは死にますね

# 最後に
　要求分析、要件定義、基本設計、詳細設計となんか専門的なことを言っているように見えるけど……抽象的なことを具体的にしていく作業なだけなんですよね。
　どこまで具体的にすればいいか分からない最初のうちは、実際の課題を自分なりに分解してみたあと10分寝てもう一度見直した時に疑問点がありそれが自己完結できるのであれば具体が足りないのでもうちょっと分解してみましょう。
　第三者を巻き込まないといけないとなれば、それは課題の方に割り振られますが。
uvとPyO3でPythonからRustを呼ぶ①（プロジェクト作成・Hello World実行まで）

# はじめに

備忘用。②以降も書くかもしれない。
勉強し始めの初心者のため、何か指摘や気づきがあれば是非コメントお願いします。

→（追記）②を書きました。

+ [uvとPyO3でPythonからRustを呼ぶ②（基本的なデータ型の値をやり取りする）](https://qiita.com/nukipei/items/1081b1de90df3332bc13)

# 実行環境

Windows 11
uv 0.5.24
python 3.12.1
rustup 1.27.1
rustc 1.79.0
cargo 1.79.0
maturin 1.5.1
pyo3 0.22.4


# プロジェクト作成

参考：https://docs.astral.sh/uv/concepts/projects/init/#projects-with-extension-modules

公式docの通り、以下を実行すると、プロジェクトが作成されます。

```
> uv init --build-backend maturin example-ext
```

ディレクトリ構成は以下の通り。

```
> tree /f example-ext
example-ext
│  .gitignore
│  .python-version
│  Cargo.toml
│  pyproject.toml
│  README.md
│
└─src
    │  lib.rs
    │
    └─example_ext
            _core.pyi
            __init__.py
```

主要なファイルの内容は以下の通り。

```rust: src/lib.rs
use pyo3::prelude::*;

#[pyfunction]
fn hello_from_bin() -> String {
    "Hello from example-ext!".to_string()
}

/// A Python module implemented in Rust. The name of this function must match
/// the `lib.name` setting in the `Cargo.toml`, else Python will not be able to
/// import the module.
#[pymodule]
fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(hello_from_bin, m)?)?;
    Ok(())
}
```


```python: src/example_ext/__init__.py
from example_ext._core import hello_from_bin


def main() -> None:
    print(hello_from_bin())
```

上記のコードでは、`Hello from example-ext!`という文字列を返すRustの`hello_from_bin()`関数を、Pythonの`__init__.py`の`main`関数で呼び出し、返り値の文字列をPrint出力しています。 

`hello_from_bin()`のインポート文は`from example_ext._core import hello_from_bin`ですが、この`_core`の部分を変更したい場合は、`lib.rs`の他に`Cargo.toml`も修正する必要があります。

```toml: Cargo.toml
[package]
name = "example_ext"
version = "0.1.0"
edition = "2021"

[lib]
name = "_core" # => ここを変える
# "cdylib" is necessary to produce a shared library for Python to import from.
crate-type = ["cdylib"]

[dependencies]
# "extension-module" tells pyo3 we want to build an extension module (skips linking against libpython.so)
# "abi3-py39" tells pyo3 (and maturin) to build using the stable ABI with minimum Python version 3.9
pyo3 = { version = "0.22.4", features = ["extension-module", "abi3-py39"] }

```

# Hello World 実行

以下でビルドと`src/__init__.py`の`main`関数の実行を同時に行います。
この時、プロジェクト用の仮想環境が`.venv`配下に作成されます。また、`src/example_ext`配下にRustのバイナリ（`_core.pyd`）が作成されます。

```
>uv run --directory src/example_ext example-ext
Using CPython 3.12.1 interpreter at: C:\Python312\python.exe
Creating virtual environment at: C:\path\example-ext\.venv
   Built example-ext @ file:///C:/path/example-ext
Installed 1 package in 21ms
Hello from example-ext!
```

ビルドは初回のみで、2回目の実行以降は`Hello ...`のみ出力されます。
```
>uv run --directory src/example_ext example-ext
Hello from example-ext!
```

なお、`lib.rs`の内容を変更し、再ビルドする場合は`uv run`実行時に`--reinstall`オプションを加える必要があります。以下は、`Hello from example-ext!`という文字列を`Hello World!`に変更した例です。

```
> xuv run --reinstall --directory src/example_ext example-ext
   Built example-ext @ file:///C:/path/example-ext
Uninstalled 1 package in 2ms
Installed 1 package in 18ms
Hello World!
```
[Linux][command] デバイス_lsusb, lsblk, lsmod, modprobe

# USBデバイス
## デバイスクラス
|デバイスクラス|デバイス|
|:--|:--|
|Human Interface Deice Class<br>HID|キーボード、ジョイスティック、マウスなど|
|Mass Storage Class|USBメモリ、ハードディスクドライブなど|
|ACM Comunication Device Class|モデム、TAなど|
|Audio Device|オーディオインターフェース、マイク、スピーカーなど|
|Block Device|ハードディスクドライブ、SSDなど|

## lsusbコマンド
~~~terminal:
$ lsusb [オプション]
~~~

|オプション|英語の由来|説明|
|:--|:--|:--|
|(default)|list usb|システムに接続されているUSBデバイスの基本情報を一覧表示|
|`-v`|verbose<br>(冗長な)|詳細に表示する|
|`-t`|tree|階層構造をツリー状に表示する|

## lsblk コマンド
- ストレージデバイスの階層構造を表示
~~~terminal:
$ lsblk [オプション]
~~~
~~~terminal:
$ lsblk [オプション] デバイス名
~~~

| オプション    | 由来   | 説明 |
|:--|:--|:--|
| (default)    | list block | - システム内のすべてのブロックデバイスをツリー形式で表示します。 |
| `-f`         | filesystem | ファイルシステム情報（UUID, TYPE, LABEL など）を表示 |
| `-o columns` | output     | 表示するカラムを指定（例: `NAME,SIZE,UUID`） |
| `-p`         | path       | フルパス（`/dev/sda1` のような形式）で表示 |
| `-r`         | raw        | ツリー構造ではなく、フラットなリストとして表示 |


# デバイスドライバ
## lsmod
~~~terminal:
$ lsmod [オプション]
~~~

| オプション | 英語の由来 | 説明 |
|:--|:--|:--|
| (default) | list modules | 現在ロードされているカーネルモジュールの一覧を表示する |
| `-h` | help | ヘルプメッセージを表示する |
| `-V` | version | `lsmod` のバージョン情報を表示する |

## modprobe
~~~terminal:
$ modprobe [オプション] デバイスドライバ名
~~~

| オプション | 英語の由来 | 説明 |
|:--|:--|:--|
| (default) | load module | 指定したカーネルモジュールをロードする |
| `-v` | verbose<br>(冗長な) | 実行時の詳細な情報を表示する |
| `-r` | remove | 指定したカーネルモジュールをアンロードする |


### 設定ファイル（`/etc/modprobe.d/[*].conf`）
- `blasklist`: ロードしないカーネルモジュールを指定
- `alias`: カーネルモジュールに別名をつける
- `options`: カーネルモジュールのデフォルトパラメータを指定
- `install`: カーネルモジュールのロード時に実行されるコマンドを指定する
- `remove`: カーネルモジュールのアンロード時に実行されるコマンドを指定する

# Ping-t
デバイスクラス
- [3000_HID](https://mondai.ping-t.com/question_subjects/31/question_sessions/30339661/progressing_questions/464809434)


lsblk
- [3698_lsblk, blkid](https://mondai.ping-t.com/question_subjects/31/question_sessions/31232403/progressing_questions/478592405)

lsmod
- [3393_lsmod, cat /proc/modules](https://mondai.ping-t.com/question_subjects/31/question_sessions/31718661/progressing_questions/486071282)

modprobe
- [2997_modprobe](https://mondai.ping-t.com/question_subjects/31/question_sessions/31718661/progressing_questions/486071283)
- [3376_modprobe](https://mondai.ping-t.com/question_subjects/31/question_sessions/30339661/progressing_questions/464809433)
- [3377_/etc/modprobe.d](https://mondai.ping-t.com/question_subjects/31/question_sessions/30862848/progressing_questions/472796586)
- [34707_modprobe](https://mondai.ping-t.com/question_subjects/31/question_sessions/30862848/progressing_questions/472796581)
Linuxに任意のバージョンのPythonをインストールする

# 概要
Linuxに任意のバージョンのPythonをインストールする手順を記載します。
Linuxにも色々ありますが、本記事では次のディストリビューションへのインストール手順を紹介します。

* Ubuntu(22.04/24.04)
* Amazon Linux2023

上記のディストリビューションに関しては、最初からPythonが備わっていることを確認しています。
最初から備わっているPythonのことを本手順では`システムPython`と呼びます。
システムPythonはOSの動作に関わっているため、いじらない方が良いです。
なお、システムPythonのバージョンは、以下の通りでした。(2025/1/27確認時点)

Ubuntu 22.04：`3.10.12`
Ubuntu 24.04：`3.12.10`
Amazon Linux2023：`3.9.16`

もし、システムPythonを利用するのであれば、他のPythonバージョンをインストールする必要は無いので、本記事の手順は実施不要です。

インストール方法ですが、選択肢としては次の3つが挙げられます。
① パッケージマネージャ(aptやdnf)でインストールする -> 任意のバージョンがインストールできない
② ソースコードをダウンロードし、ビルドする -> 任意のバージョンはインストールできるが、インストール手順やバージョン管理方法が複雑
③ pyenvを用いる -> インストールやバージョン管理が簡単

一番操作が簡単な`pyenv`を用いてインストールを行います。


# 前提条件
Gitがインストール済みであること

# 手順
## pyenvインストール
### Ubuntuの場合
※以下の手順は、Ubuntu 22.04 および 24.04にて動作することを確認しています。

```
$ sudo apt update
```

```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

```
$ sudo apt install libedit-dev -y
```

```
$ sudo apt install libncurses5-dev -y
```

```
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git
```

pyenvをPATHに通します。
```
vi ~/.profile
```

`if [ -n "$BASH_VERSION" ]; then`の直後に、次の3行を挿入して下さい。
```
    export PYENV_ROOT="$HOME/.pyenv"
    export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init --path)"
```
3行挿入すると、次のようになります。

```~/.profile(一部抜粋)
# if running bash
if [ -n "$BASH_VERSION" ]; then
    export PYENV_ROOT="$HOME/.pyenv"
    export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init --path)"
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi
```
続いて、`~/.bashrc`を編集します。
```
vi ~/.bashrc
```
ファイルの最下部に下記を追記します。
```
eval "$(pyenv init -)"
```

シェルを再起動します。
```
$ exec $SHELL -l
```

pyenvがインストールされていることを確認して下さい。
```
$ pyenv --version
```


### AmazonLinux2023の場合
```
$ sudo dnf install -y gcc zlib-devel bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel
```

```
$ curl https://pyenv.run | bash
```

pyenvをPATHに通します。次の3つのコマンドを実行して下さい。
```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

シェルを再起動します。
```
$ exec $SHELL -l
```

pyenvがインストールされていることを確認して下さい。
```
$ pyenv --version
```

## Pythonインストール

次のコマンドにて、インストール可能なバージョンの一覧を表示できます。
```
$ pyenv install -l
```
この中からインストールしたいバージョンが存在することを確認し、
次のコマンドを実行すればPythonがインストールされます。
```
$ pyenv install <任意のバージョン>
```

新規インストールが完了したら、次のコマンドを実行する必要があるようです。
```
$ pyenv rehash
```

次のコマンドにて、インストールされているPython一覧(システムPython含む)が確認可能です。
```
$ pyenv versions
```

Pythonのバージョンを切り替えるには次のコマンドを実行します。
globalにすると全体に反映し、
localにするとカレントディレクトリにのみ反映されます。
```
$ pyenv global <インストールされたPythonバージョン>
```
or
```
$ pyenv local <インストールされたPythonバージョン>
```

Pythonインストール手順は以上となります。

# 参考
https://qiita.com/tfukumori/items/c2997988acacd0da17d0
https://www.kkaneko.jp/tools/man/python.html#systempython
https://techblog.ap-com.co.jp/entry/2024/04/26/083000
で結局Web3とはなんぞや

## はじめに
前回[【ERC-20】Polygon Amoy Testnet にスマートコントラクトをデプロイする](https://qiita.com/komepon/items/c260e46b39905a37cb53)
といった内容でPolygonのブロックチェーン上にスマートコントラクトをデプロイする記事を書きましたが、今回は改めてブロックチェーンやスマートコントラクトについてまとめてみようと思います。

この記事では、どなたでも理解できるように概念を簡単に説明していければと思います。

## ブロックチェーンの歴史
ブロックチェーンの技術は、2008年に Satoshi Nakamotoという匿名の人物（またはグループ）によって提案されたビットコインという暗号通貨から始まります。
### 現在までの大まかな流れ
**2008年：ビットコインのホワイトペーパー公開**
- Satoshi Nakamotoが「Bitcoin: A Peer-to-Peer Electronic Cash System」という論文を発表。
ブロックチェーンの概念が具体化されました。


 **2009年：ビットコインネットワークの開始**
- 最初のビットコイン（Genesis Block）が採掘され、ブロックチェーン技術が実用化されました。

**2015年：Ethereumの登場**
- Vitalik ButerinがEthereumを発表し、**スマートコントラクト**が実現可能となりました。
- ブロックチェーンは暗号通貨だけでなく、分散型アプリケーション（dApps）を構築する基盤として注目され始めました。

**2020年代：Web3とDeFiの急成長**
- 分散型金融（DeFi）やNFT（非代替性トークン）の普及により、ブロックチェーン技術の応用範囲がさらに広がりました。

これらの進化を通じて、ブロックチェーンは現在の形に発展してきました。

## ブロックチェーンとはなんぞや？
ブロックチェーンは、取引データを記録するための分散型台帳の技術です。以下の特徴があります。
1. 分散型
データが世界中の多くのコンピュータ（ノード）に保存されます。
一箇所が壊れてもシステム全体が止まることはありません。
2. 改ざん耐性
データが一度記録されると変更が非常に難しいため、信頼性が高いです。
3. 透明性
誰でも記録されたデータを確認できます（ただし匿名性は保持されます）。

これにより、金融取引やサプライチェーン、デジタル証明書など多くの分野で利用されています。

## スマートコントラクトとはなんぞや？
スマートコントラクトは、ブロックチェーン上で動作するプログラムのことです。「コントラクト＝契約」という名前がついていますが、法的な意味の契約というよりは「自動的に実行されるルールセット」と考えてもらえばOKです。

**特徴**
- **自動化**
    - 条件が満たされたときにプログラムが自動的に実行されます。
- **透明性**
    - コードは公開されているので誰でも内容を確認できます。
- **信頼性**
    - 一度デプロイされたスマートコントラクトは変更が困難で、ルールが勝手に変わることはありません。

**以下GPT曰く**
例えば、友人同士で賭けをするケースを考えてみましょう。
- 賭け金をスマートコントラクトに預ける。
- 試合の結果が外部の信頼できる情報源から取得される。
- 勝った人に自動的に賭け金が送られる。
 
これにより、誰かがルールを破る心配がなくなります。

## で結局Web3とはなんぞや
Web3はブロックチェーンを活用して構築された新しいインターネットの形です。
ユーザーが自分のデータをよりコントロールできる分散型のウェブエコシステムを理想としています。
従来のインターネットのように特定のプラットフォーマー（例えばMetaやGoogleなど）に依存しない世界を目指す話です。

**もう少し詳しく**
1. **分散型アプリケーション(dApps)**
    - ブロックチェーン上で動作するアプリケーション。
1. **自己管理型のアイデンティティ**
    - ユーザーが自分のデータや認証情報を完全にコントロールできます。
1. **トークンエコノミー**
    - 暗号通貨やトークンを利用した新しい経済圏を形成します。

主に上記を組み合わせることで自己責任でありながらも特定のプラットフォーマーに依存しない自由なインターネットを使うことができます。

## さいごに
全体的にざっくりと書かせていただきました。いかがだったでしょうか？

ビットコイン自体が400年ぐらいの中央銀行家による信用創造と不換紙幣の疑惑のアンチテーゼとしてのサトシ・ナカモトの解であり、それを土台としての社会変容を狙ったWeb3というバズワード。とも捉えています。
信用創造の民主化か、はたまた通貨の切り替え詐欺なのか。（実際100年を越えて続いている基軸通貨は英ポンドだけです）
通貨とはなにか？とか考え始めたら際限ないのでこの辺にしておきます。
シーケンス図を書くツール

# ブラウザで作成するツール 
[マーメイド](https://mermaid.live/edit "マーメイド")
[テキストファイル](https://sequencediagram.org/ "テキストファイル")
[PlantUMLのオンライン](https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa700003 "PlantUML")

# VSCodeの拡張機能で作成
- Markdown Preview Mermaid Support
- Mermaid Markdown Syntax Highlighting
- PlantUML

## VSCodeの拡張機能 マーメイド使う場合
`.md`拡張子でファイルを作成
下記の文から記述を始める
```
```mermaid
```
### プレビューを見るときのコマンド
`Shift`＋`Ctrl`＋`P`　で `Markdown: Open Preview` で開く

## VSCodeでのPlantUMLの使い方とプレビューと出力
### ファイルの拡張子
`.pu`で保存する

### プレビュー
`Alt`＋`D`　でプレビューを開く

### 出力
`Shift`＋`Ctrl`＋`P`　で `>PlantUML: カーソル位置のダイアグラムをエクスポート` で開く
保存拡張子を選択
ブータブルISOイメージを簡単に使えます


# A New Bootable USB Solution
##### ブータブルなisoイメージをコピーするだけで、簡単にUSBメディアから起動できます。
[Ventoy](https/www.ventoy.net/en/index.html)のおかげで、レスキューもOSの試用も、安心して試せます。
ISOのイメージをUSBディスクなどに書き込まず、Ventoy[^4]がインストールされたUSBディスクにファイルとしてコピーすることで、大体のISOイメージは起動できます。Normal Modeで起動しない場合でも、Grub Modeで起動できる場合もあります。
万一の備えに、あなたもお一ついかがですか？

USBディスクに、セキュアブート対応でGPTパーティションのventoyをインストールする場合のコマンド例。
GUIでも同じことができますよ。
```sh
sudo Ventoy2Disk.sh -i -s -g /dev/sdX
```
USBディスクの中味は消えますよ！

---
# インストール方法
## Linux全般  
sourceforgeまたはgithubからダウンロードします。
```sh
wget https://sourceforge.net/projects/ventoy/files/v1.1.05/ventoy-1.1.05-linux.tar.gz/download
```
```sh
wget https://github.com/ventoy/Ventoy/releases/download/v1.1.05/ventoy-1.1.05-linux.tar.gz
```
```sh
tar xf ventoy-1.1.05-linux.tar.gz
cd ventoy-1.1.05
./VentoyGUI.$(uname -m)
```

## Manjaro Linux
```sh
sudo pamcan -S ventoy
ventoygui
```

## Arch Linux
AURパッケージ
```sh
yay -S ventoy-bin
ventoygui
```

## Windows  
ブラウザなどで[Ventoy](https://github.com/ventoy/Ventoy/releases/)を[ダウンロード](https://github.com/ventoy/Ventoy/releases/download/v1.1.05/ventoy-1.1.05-windows.zip)します。または[Ventoy Files(SourceForge)](https://sourceforge.net/projects/ventoy/files/v1.1.05/)から、ダウンロードしましょう。
ダウンロードしたzipファイルを開いて、`ventoy2disk.exe`を実行しましょう。

## Mac
MacでのVentoyのインストールは公式には未対応の模様。

https://toolboxforweb.xyz/blogs/blog/ventoy-for-mac

他のOSでインストールすれば、おそらく使えるでしょう。

https://www.youtube.com/watch?v=t569-j5aoA4


[^3]: https://etcher.balena.io/
[^1]: https://github.com/raspberrypi/rpi-imager
[^2]: https://github.com/FedoraQt/MediaWriter/releases
[^4]: https://ventoy.net/en/

# ファイルシステムを変更する場合
ventoyが対応しているファイルシステムならisoイメージをコピーする場所は、再フォーマットできます。
（特にこだわりがなければ、デフォルトでいいと思います。）

変更する場合には、ISOイメージをコピーする前に、最初に変更しておくと良いかと思います。
標準だとexfatになっているかと思いますが、Ventoyはext4にも対応していますから、ext4にフォーマットしても使えます。
ext4はsymlinkなども使えるので、最初にext4にフォーマットし直しておくと良いかもしれません。
## Ventoyのデバイスを確認
```sh
VENTOY=$(lsblk -e7 -lpf -o NAME,LABEL |grep Ventoy|cut -d' ' -f1)
echo $VENTOY
```
## ext4にフォーマット
```sh
sudo mkfs.ext4 $VENTOY
```
---
isoファイルをコピーするだけで、いろんなブート可能なイメージファイルを試せるなんて、素敵ですね。
公式サイトみたら、これだけ[テスト済み](https://www.ventoy.net/en/isolist.html)なんだというので驚きますし、安心できます。

---
実際、使ってみたら、便利なことこのうえない。
USBブートさえできれば、レスキューできる。
これがあれば、安心安心。

誰か作ってくれないかと思っていたら、既に完成といえるものが、できていたんだもの。
ありがとう。ありがとう。

ほんとに、足を向けて寝れませんよ。ありがたやー。
Dockerを使って学習してみた！

## はじめに
今回、Dockerを使用するのにあたって学習したことをまとめてみました。

### Dockerとは
Dockerとは、軽量で高速に動作するコンテナ型仮想環境用のプラットフォームです。Dockerを使うことで、1台のサーバー上で様々なアプリケーションを手軽に仮想化・実行できる。

**Dockerの利点**
1. 1台のサーバー上に複数のアプリケーション実行環境（Dockerコンテナ）を作成・利用できる
2. アプリケーション実行環境（Dockerコンテナ）の他サーバーなどへの移転、他ユーザーとの共有※Dockerコンテナの移転や共有は複雑で手間のかかる操作を必要とせず、簡単に実行可能
3. Dockerコンテナでアプリケーションの開発環境を作成し、インターネット上で他エンジニアと簡単に共有できる

**基本用語**
* イメージ(image)
    * Dockerイメージはアプリケーションやその実行環境をまとめたテンプレートである。コンテナはこのイメージを元に実行される。例えば、Node.jsを動かす場合はnode:14やMySQLの場合はmysql:5.7など公式に提供されている
* コンテナ(Container)
    * コンテナは、イメージから作成される実行環境そのものであり、一つのコンテナは一つのプロセスを実行するのが基本である
* Dockerfile
    * Dockerfileはカスタムイメージを作成するための設定ファイルである。Dockerfileに記述された手順に従ってDockerがイメージを構築する
* Docker Compose
    * Docker Composeは、複数のコンテナをまとめて管理するツールである。YAML形式の設定ファイルを使い、どのイメージを使用するか、どのポートを公開するかなどを記述できる

### Dockerfile
Dockerfileは、イメージ作成のための「レシピ」である。
```Dockerfile:Dockerfile
FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

CMD ["npm", "start"]

EXPOSE 3000
```
* **FROM**
    * 使用するベースイメージを指定。この場合はnode:14を使用している
* **WORKDIR**
    * 作業ディレクトリを設定。以降の操作はこのディレクトリを基準に実行
* **COPY**
    * ホストのファイルをコンテナ内にコピーする
* **RUN**
    * コンテナ作成時に実行されるコマンド。この場合では依存関係をインストールしている
* **CMD**
    * コンテナ起動時に実行されるコマンドを指定
* **EXPOSE**
    * コンテナが使用するポートを指定

### Docker Compose
Docker Composeは複数のコンテナを一括で管理するツールである。
```yaml:docker-compose.yml
version: "3.8"
services:
    wordpress:
        image: wordpress
        ports:
            - "8000:80"
        environment:
            WORDPRESS_DB_HOST: db
            WORDPRESS_DB_USER: user
            WORDPRESS_DB_PASSWORD: password
            WORDPRESS_DB_NAME: wordpress
        depends_on:
            - db
db:
    image: myspl:5.7
    environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: wordpress
        MYSQL_USER: user
        MYSQL_PASSWORD: password
```

* **version:**
    * docker-compose.ymlのバージョンを指定
* **services:**
    * サービス名をwardpressと定義。`docker-compose up`コマンドを使うと、この名前でコンテナが作成される
* **image:**
    * 使用するDockerイメージを指定。この場合はWordPressの公式イメージを使用している
* **ports:**
    * ホストとコンテナ間のポートマッピングを指定。この場合はホストの8000番ポートをコンテナ内の80番ポートに紐付けしている
* **environment:**
    * 環境変数を設定。ここではWordPressが使用するデータベース接続情報をここで指定
        * WORDPRESS_DB_HOST: データベースのホスト名
        * WORDPRESS_DB_USER: データベースのユーザー名
        * WORDPRESS_DB_PASSWORD: データベースのパスワード
        * WORDPRESS_DB_NAME: 使用するデータベース名
* **depends_on:**
    * wordpressサービスがdbサービスに依存していることを指定している。これにより、dbサービスが先に起動される
* **db:**
    * MySQLデータベースの設定
        * image:使用するイメージ(mysql:5.7)を指定
        * environment:MySQLの初期設定を指定

### Docker Composeコマンド
設定ができたらdocker-composeコマンドでDockerを起動
* `docker-compose --build`
    * Dockerイメージを構築する
* `docker-compose up`
    * 構築したDockerを起動する
* `docker-compose stop`
    * 起動したDockerを一時停止する
* `docker-compose down`
    * 構築したDockerを削除する

### まとめ
Dockerはアプリケーションの開発・デプロイをするために便利なツールであり、どの環境でも同じアプリが動作する一貫性のある環境を提供でき、必要なリソースをすぐにセットアップ可能なので迅速なデプロイの実現を可能。軽量で高速なため仮想マシンよりリソース消費が少ない、Docker Composeで簡単に連携し複数のサービス管理をしやすいメリットがある。
アリババクラウドのInternational SMS Solution: 世界規模での顧客エンゲージメントへのゲートウェイ

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/alibaba-clouds-international-sms-solution-your-gateway-to-global-customer-engagement_601953?spm=a2c65.11461433.0.0.4ee35355AbBZFM)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# 国際SMSがビジネスのグローバル展開を支える

国際SMSは、新たな市場へのビジネス拡大において重要な役割を果たし、世界中のユーザーとの直接的かつ効果的なコミュニケーションを確保します。MailChimpによると、SMSとメールの開封率はそれぞれ97%と21%に達しており、これら2つのチャネルはあらゆるグローバルマーケティング戦略の鍵となります。特に、顧客エンゲージメントを強化することを目指す企業にとって、国際SMSは最も信頼性が高く広く利用されている通信ツールの一つです。しかし、グローバルなリーチのためにSMSを使用する際、企業は以下の4つの主要な課題に直面することがよくあります。

- **不安定性**: さまざまな国の通信インフラの違いにより、遅延、メッセージの消失、配信失敗などが発生し、メッセージの到達範囲と効果に悪影響を与える可能性があります。
- **パーソナライゼーションの不足**: 一般的でワンサイズフィットオールのSMSメッセージは、顧客がよりパーソナライズされた関連性の高いコンテンツを求めているため、開封率が低く、コンバージョンも悪くなります。
- **高コスト**: 地域によって国際SMSのコストは異なり、先進国では国内のSMSサービスよりも数倍の料金がかかることがあります。これにより、企業がグローバルな対象者にリーチするためのコストが嵩みます。
- **コンプライアンスリスク**: 多くの企業は国際SMSキャンペーンに対処するのに十分なコンプライアンス経験を持っておらず、法的な問題や多額の罰金に直面する可能性があります。

アリババクラウドの国際SMSソリューションは、これらの課題に対処するために「安定性」「精度」「費用効果」の3つの主要な柱に焦点を当てています。

## 安定性、セキュリティ、およびコンプライアンスを備えた通信

国境を超えてSMSを送信することは、国の規制や通信インフラの違いによりしばしば妨げられます。アリババクラウドは、メッセージがシームレスかつ安全に配信されるように堅牢な国際SMSプラットフォームを開発しています。

- **グローバルカバレッジ**: アリババクラウドは200以上の国和地区でのSMS配信をサポートしており、複数言語対応とチャネル冗長性によってバックアップされています。これにより、企業は遅延なく大規模なキャンペーンを実施し、いつでもどこでも顧客にリーチすることができます。
- **簡単な統合**: [アリババクラウド SMS](https://www.alibabacloud.com/en/product/short-message-service) は使いやすいAPIと統合ドキュメンテーションを提供しており、企業が迅速にサービスをシステムに統合できるようになっています。また、人気のある開発フレームワーク用のSDKにより、開発者の作業負担が軽減されます。
- **コンプライアンス保証**: 数年の国際サービス経験を持つアリババクラウドは、包括的なコンプライアンス基準を開発しています。当社のソリューションはGDPRやCCPAなどのグローバルデータプライバシー規制に準拠しており、企業は法的なリスクを心配することなく事業を運営できます。

## 精度と効率性の高いメッセージング

パーソナライゼーションとターゲット指向のリーチは、効果的なグローバルコミュニケーションに不可欠です。複数の市場にわたる多様な対象者にリーチするためには、顧客をグループ化し、セグメント別のキャンペーンを作成し、適切なタイミングで関連性の高いメッセージを送信する必要があります。[アリババクラウド SMS](https://www.alibabacloud.com/en/product/short-message-service) は、特定の顧客ニーズに合わせてビジネスメッセージングソリューションを実装できるようにし、メッセージの関連性を向上させ、コンバージョン率を高めます。当社の会話APIにより、企業はパーソナライズされた自動メッセージで顧客と接続し、効率的かつ高品質なリーチを確保できます。

## グローバルリーチのための手頃な価格

国際SMSサービスは多くの場合高価ですが、アリババクラウドのソリューションは質を犠牲にすることなく手頃な価格を提供します。当社のプラットフォームは異なる地域の企業向けにコスト効果の高い価格設定を提供し、グローバルなプレゼンスを拡大しながら全体的なメッセージングコストを削減します。

## 国際SMSの主な使用例

国際SMSは、ビジネスコミュニケーションを強化するための様々な方法で使用できます。以下は、当社のビジネス向けSMSメッセージングソリューションで企業が恩恵を受ける3つの主要なカテゴリです。

- **マーケティングSMS**: 特別オファー、プロモーション、限定デールをターゲット顧客に送信し、ランディングページや製品ページへのリンクを含めて簡単にアクセスできるようにします。
- **検証SMS**: アプリ登録、ログイン、支払い認証、またはパスワード回復時の身元確認に使用されます。これにより、ユーザーアカウントへの安全なアクセスが確保され、顧客の信頼が高まります。
- **通知SMS**: 注文確認、イベントリマインダー、支払い通知など、重要な更新情報を送信して、ユーザーがブランドに従事し続けることを促します。

![_2025_01_22_4_53_33](https://yqintl.alicdn.com/73fc56e86f33bff8e142455822da6da7919f05da.png)

売上増加、ユーザーエンゲージメントの向上、またはカスタマーサポートの改善を目指しているかどうかに関わらず、アリババクラウドのSMS APIプラットフォームは、あなたのビジネスニーズに最適なメッセージングプラットフォームです。当社のソリューションにより、企業は複数の国で大量のSMSキャンペーンを効果的に送信でき、コミュニケーションが常に信頼性と効率性を維持することができます。限られた枠での国際SMSトライアルオファーをご利用ください。見逃さないように、[こちら](https://www.alibabacloud.com/en/campaign/smscampaign)から今すぐ始めましょう！
pipについて

## はじめに
この記事では、Pythonのパッケージ管理ツール「pip」についてまとめます。
pipはPythonでの開発を円滑に進めるための重要なツールです。

 ## 目次
 - pipとは
 - pipを使う理由
 - pipの基本操作




## pipとは
pipは「Python Package Installer」の略、読み方は「ピップ」です。
pipはPythonのパッケージを管理するためのツールになります。
パッケージには
- 公式が配布しているもの
- サードパーティが配布しているもの
と大きく分けて2つがあります。

サードパーティのパッケージはPyPIというサイトで配布されています。
[公式サイト] (https://pypi.org/)

公式が配布しているものはたいていPythonをインストールする時点で自動的にインストールされますが、サードパーティが配布しているパッケージは別にインストールをする必要があります。

このサードパーティが配布しているパッケージをインストールするために、pipを使います。
pipを使うことでパッケージの管理が楽になります。

**Pythonで使われるパッケージマネージャとして考えて良いでしょう。**

## pipを使う理由
#### 多くのライブラリを簡単に利用できる
- 豊富なサードパーティ製ライブラリを簡単にインストール可能
- Pillow(画像処理)、BeautifulSoup（ウェブスクレイピング）、pandas（データ解析）、scikit-learn（機械学習）
#### ライブラリのバージョン管理が簡単
- 特定のバージョンのライブラリを簡単にインストール可能
- 依存関係の管理を自動化
#### コミュニティのサポートが豊富
- 多くの開発者に利用されているため、情報が豊富
- 公式ドキュメントも充実

## pipの基本操作

#### よく使うコマンド
| コマンド                        | 説明                             |
|:-------------------------------|:--------------------------------|
|pip install パッケージ名          |パッケージをインストール   |
|pip install --upgrade パッケージ名 |パッケージをアップグレード   |
|pip uninstall パッケージ名|	パッケージをアンインストール   |
|pip list |	インストール済みパッケージを表示    |
|pip show パッケージ名 |	パッケージの詳細情報を表示   |
|pip check   |依存関係を確認   |
Djangoのシグナルについて

## はじめに

今回はDjangoのシグナルについてお話します。
Djangoは、学習コストが低く、信頼性の高いウェブアプリケーションを構築するための強力なフレームワークです。その中でも、シグナルは非常に重要であり、イベント駆動型のプログラミングにおいて非常に有用です。
学習したことをここにまとめます。

## 目次
- シグナルについて
- シグナルの主な用途
- よく使われるシグナル
- まとめ

## シグナルについて
Djangoには「シグナルディスパッチャー」と呼ばれる仕組みが組み込まれています。
これは切り離されたアプリケーションがフレームワークの他の場所でアクションが発生した際に通知を受けるのに役立ちます。要するに、シグナルは特定の送信者が一連のレシーバに対して、あるアクションが発生したことを通知することを可能にします。これは同じイベントに関心を持つ多くのコードが存在する場合に特に役立ちます。
たとえば、User（Userモデル）が新規登録された場合に、Profile（Profileモデル）を自動的に作成するよう設定したりできます。

つまり、Djangoの組み込みシグナルは、
特定のアクションが発生したことを通知する機能を提供しています。

## シグナルの主な用途
具体的にどのようい使われるかイメージ沸かせましょう。
例えば、以下のような用途で活用されます。

#### モデルの変更の検知
モデルのインスタンスが保存、更新、削除されたときに
Signalを使用してそれを検知し、必要な処理を実行します。

#### ユーザー認証の拡張
ユーザーがログインまたはログアウトしたときにSignalを使用して、
特定のアクションを実行する。

#### アクションの起動装置
アプリケーション内の異なるコンポーネント間での
特定のアクションの起動装置としてSignalを使用する。

## よく使われるシグナル

以下によく使われるシグナルの実行タイミングと
それを使う際のレシーバー関数の引数の**kwargsとして使えるものをまとめています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895655/d5cf6834-4bd2-8602-eba4-a02ff3e335c9.png)


## まとめ
Djangoのシグナルを活用することで、アプリケーションの機能を拡張し、柔軟性を高めることができます。 シグナルはDjangoアプリケーションの中で強力なツールであり、正しく使用することでコードの保守性と拡張性を向上させることができます。
【Laravel】ファイルの配置から始まるLaravelの勉強

## **Laravelのディレクトリ構造**

Laravelプロジェクトを新規作成すると、以下のようなディレクトリ構造が生成される。

```
project-name/
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
├── storage/
├── tests/
└── vendor/
```

それぞれのディレクトリには明確な役割がある。

### **1. app/**
`app/` ディレクトリは、アプリケーションの中核となるコードを格納する場所だ。主なサブディレクトリは次の通り。
- **Models:** データベースとやり取りするEloquentモデルを格納する。
- **Http:** コントローラ、ミドルウェア、リクエスト処理に関するクラスを配置する。
- **Providers:** アプリケーションサービスプロバイダを格納する。

### **2. bootstrap/**
アプリケーションの初期設定が格納されるディレクトリだ。`app.php` というファイルがあり、Laravelの起動プロセスを管理する。

### **3. config/**
アプリケーションの設定ファイルが含まれている。データベース接続、メール設定、キャッシュ設定などがここにある。

### **4. database/**
データベースに関するファイルを格納する。
- **migrations:** テーブルスキーマの定義ファイル。
- **seeders:** テストデータや初期データを登録するためのクラス。

### **5. public/**
アプリケーションのエントリーポイントとなる `index.php` が配置されるディレクトリだ。ブラウザからアクセス可能なファイル（CSS、JavaScript、画像など）もここに置かれる。

### **6. resources/**
ビュー（Bladeテンプレート）、未コンパイルのCSSやJavaScriptファイル、翻訳ファイルなどを格納する。

### **7. routes/**
アプリケーションのルーティング定義ファイルを格納する。
- **web.php:** ウェブ用ルート。
- **api.php:** API用ルート。

### **8. storage/**
ファイルの保存やログ、キャッシュなど、アプリケーションで生成されるデータを格納する。

### **9. tests/**
自動テスト用のファイルを格納する。
- **Feature:** 機能テスト用のファイル。
- **Unit:** 単体テスト用のファイル。

### **10. vendor/**
Composerでインストールしたライブラリが格納される。このディレクトリは通常、直接編集することはない。
アリババクラウドアカデミーの2025年1月のコースおよび認定試験の更新情報

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/course-and-certification-updates-from-alibaba-cloud-academy-in-january-2025_601959?spm=a2c65.11461433.0.0.4ee35355AbBZFM)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# Alibaba Cloud Academy 2025年1月号

![2](https://yqintl.alicdn.com/175ecd3569ad0362366d05557020d71839e07b75.png)

Alibaba Cloud Academyの月刊記事、2025年1月号へようこそ。この記事では、Alibaba Cloudのトレーニングコースや認定試験に関する最新情報を提供し、あなたとあなたのチームが最新の知識を維持できるようにお手伝いします。今月は、刷新されたAlibaba Cloudプロフェッショナル認定試験のリリースと、生成AI、ビッグデータ、データベース技術について実践的な知識を提供する新しい公開クラスを発表します。また、Alibaba Cloud WorkspaceやQuick BIなどの人気のあるAlibaba Cloudサービスでスキルを迅速に習得できるように特別に設計した、新しくリリースされたAlibaba Cloud Capability & Competency Certificationsをご覧いただくことをお勧めします。

## プロフェッショナル認定試験の更新
- [ACA Cloud Security Associate](https://edu.alibabacloud.com/certification/aca_cloudsecurity) は、2025年2月13日からCloud Security Engineer (Associate)に置き換えられます。
- 以下3つの認定試験は、2025年2月13日に販売終了（EOS）となり、引退します：
  - [ACA Cloud Security Associate](https://edu.alibabacloud.com/certification/aca_cloudsecurity)
  - [ACP Cloud Computing Professional](https://edu.alibabacloud.com/certification/acp_cloudcomputing)
  - [ACE Cloud Computing Expert](https://edu.alibabacloud.com/certification/ace_cloudcomputing)

Alibaba Cloudプロフェッショナル認定試験の置き換えと引退に関する詳細情報については、[Professional Certification Update](https://edu.alibabacloud.com/certification/update-announcement)をご覧ください。

## 新しいセルフペースのeラーニングコース
今月は3つの新しいコースを紹介します。これらのコースは、専門トレーナーによってライブで配信され、現在セルフペースのeラーニングコースとして利用可能です。通常通り、これらのコースは私たちの愛すべき学習者に無料で提供されます。

### 生成AI
- [Generate Quality Outputs](https://edu.alibabacloud.com/course/780)

### データベース
- [How to Set Up and Manage Tair](https://edu.alibabacloud.com/course/797)

### ビッグデータ
- [How to Set Up DataWorks for Data Migration](https://edu.alibabacloud.com/course/781)

## Alibaba Cloud Capability & Competency Certifications
最近、人気のあるAlibaba Cloudサービスに関するコンテンツの追加要望が多く寄せられました。その声にお応えして、Alibaba Cloud Capability & Competency Certificationsを正式に発表します。これらの認定試験は、Alibaba Cloudサービスに関する基本的な知識とスキルを提供することを目的としています。コースを修了すると、そのサービスの熟練度を示すCapabilityまたはCompetency認定証が取得できます。さらに、これらは無料で提供されています！

### サービス能力認定
現在、以下の2つのCapability認定をリリースしています：
- [Alibaba Cloud Workspace](https://edu.alibabacloud.com/certification/acw-capability-competency-certifications)
- [QuickBI](https://edu.alibabacloud.com/certification/quick-bi-capability-competency-certifications)

Alibaba Cloud Academyへの継続的なサポートと信頼に感謝いたします。私たちは最高の学習体験を提供し、皆様のプロフェッショナルな目標達成をお手伝いすることに全力を尽くしています。気に入った内容があれば、Alibaba Cloud Academyからの最新のコンテンツ更新を受け取るためにフォローしてください！
Twitter X API v2 でアップロード


Xから以下のメールが来てた

```
開発者が X API v2 を使用してメディアを X にアップロードできるようになったことをお知らせします。

POST https://api.x.com/2/media/アップロードエンドポイントを使用して画像や動画をアップロードし、POST https://api.x.com/2/postsを使用して X の投稿にメディアを添付できます。

以前のメディアアップロードエンドポイント ( https://upload.twitter.com/1. 1/media/upload.json)を使用していた開発者は、新しい v2 エンドポイントへの移行を開始する必要があります。

X API v2 を使用してメディアを X にアップロードおよび公開する方法についての完全なガイドをご覧ください。

詳細については、開発者向けドキュメントをご覧ください。また、 Postman コレクションまたはGithub リポジトリのサンプル コードを使用して開始することもできます。

X 開発者プラットフォームチーム


```

ようは、apiv2でもmediauploadできるようになったよ
ということか。

しかし、oauth2.0のBearerトークンが無いと使えない。

自分はoauth1.0なので今回は無視ですね。