OmniAICreator/Qiita-1.07M huggingface dataset:
【Flutter】DatePickerの背景を画像にする

## 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263661/2db46663-417b-4823-af54-968ef685fd00.png)

## やりたいこと
DatePickerの背景に画像を設定したい。
興味本位です。

## 課題
- 標準のDatePickerは単色しか設定できない
- 背景に画像を設定できるDatePickerのパッケージ(無料)はない

ということで自作しました。

## 大まかな流れ
① DatePickerの背景を透過にする
② StackでDatePickerの後ろにImageを置く
③ 細かい調整

## ① DatePickerの背景を透過にする
基本的には`showDatePicker()`でDatePickerを表示すると思います。
その引数の`builder: (context, child)　＝> Widget`を使ってThemeを設定することで、DatePickerの色などをカスタマイズできます。

こんな感じです。
```dart
Theme(
  data: Theme.of(context).copyWith(
    datePickerTheme: DatePickerTheme.of(context).copyWith(...),
    textButtonTheme: TextButtonThemeData(...),
  ),
  child: child,
)
```

今回はこのようにしてDatePickerの背景を透過させます。
```dart
datePickerTheme: DatePickerTheme.of(context).copyWith(
    backgroundColor: Colors.transparent,
    surfaceTintColor: Colors.transparent,
),
```
`surfaceTintColor`も`transparent`に設定しないと若干色味が変わるので設定してください。
こんな感じです。

| transparent | null |
|:-:|:-:|
| ![Simulator Screenshot - iPhone 15 - 2024-05-19 at 14.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263661/d373658b-93ab-e8ff-16dd-ca04fe49c71d.png)  | ![Simulator Screenshot - iPhone 15 - 2024-05-19 at 14.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263661/88b2c791-cedc-06da-0102-08885992a29c.png)
|

## ② StackでDatePickerの後ろにImageを置く
背景が透過のDatePickerを表示できたら、画像を設定します。
標準のDatePickerは角丸になっているので、`ClipRRect`で囲ったImageウィジェットを使います。

```dart
ClipRRect(
    borderRadius: BorderRadius.circular(32),
    child: Image.asset(...)
)
```

`Stack`で画像を背面、`DatePickerDialogを前面にします。

```dart
Stack(
    alignment: AlignmentDirectional.center,
    children: [
        ClipRRect(
          child: Image.asset(...),
        ),
        Theme(
          data: Theme.of(context).copyWith(
            datePickerTheme: DatePickerTheme.of(context).copyWith(
              backgroundColor: Colors.transparent,
              surfaceTintColor: Colors.transparent,
            ),
          ),
          child: datePickerDialog
        )
    ]
)
```

画像のサイズは下記のものを用意すると標準のDatePickerのサイズの比率と同じになって綺麗におさまります。
MaterialDesign3を使用している場合は、 幅328, 高さ512 の比率の画像
MaterialDesign2を使用している場合は、 幅330, 高さ518 の比率の画像

## ③ 細かい調整

以下DatePickerの他の部分の色設定
```dart
Theme(
  data: Theme.of(context).copyWith(
    datePickerTheme: DatePickerTheme.of(context).copyWith(
      backgroundColor: // 背景色
      surfaceTintColor: // 表面にかかる色
      dividerColor: // ヘッダーとカレンダーの間の色
      todayForegroundColor: // 今日の文字色
      todayBackgroundColor: // 今日の背景色
      dayBackgroundColor: // 日付の背景色
    ),
    textButtonTheme: TextButtonThemeData(
      style: TextButton.styleFrom(foregroundColor: // Cancel, OKボタンの文字色),
    ),
  ),
  child: child,
),
```

日付の背景色について、選択したものだけ別の色にするためにはこのようにします。
```dart
dayBackgroundColor: MaterialStateProperty.resolveWith((states) {
    if (states.contains(MaterialState.selected)) {
      return Colors.green;
    }
    return Colors.transparent;
}),
```
## 今回使った画像
https://www.canva.com/ja_jp/templates/EAFc76vDSpI/
ITIL4 Foundationとは

# ITIL4 Foundationとはこんな資格！
こんにちは。mochiです。ITIL4ファンデーションの資格試験に最近合格したため、この資格についての概要や試験対策について少しご紹介します。

ITIL4ファンデーションは、ITサービスマネジメントについてのベストプラクティス(成功事例)を提唱するIT資格です。

英国政府と投資会社が合同で立ち上げた企業『AXELOS』がITサービスマネジメントやITILに関する基礎知識を保有することについてを認定する資格です。
Infomation Technology Infrastrcuture Libraryの略であり、これを略して(アイティル)と呼びます。
# ITIL4ファンデーションの試験形式
1,以下の領域の知識が問われます。
・サービスマネジメントの基本概念
・ITIL4の主要な原則
・サービスバリューチェーン
・ITIL4の次世代のアプローチ

2,試験概要
項目	概要
試験名	PC0-003: ITIL4Foundation
試験内容	ITサービスの計画、提供、サポート、運用、および改善に関する包括的な知識
試験日	通年実施
試験時間	60分
問題数	小問：40問
合格点	65%（26問/40問）
試験方式	CBT（Computer Based Testing）方式
マウスによる選択方式
受験場所	テストセンター、自宅受験(PeopleCert)
受験料	67,793円（税込）
合格率	不明　※非公開
有効期限	資格取得日から3年間
# 勉強する際に使用した教材
ここからは実際に自分が試験対策をしていた際の使用教材をご紹介します。
少しでも皆様のご参考になれば幸いです。
### 1,【2024年更新】PC0-003 ITIL4ファンデーション 模擬問題集
この問題集はUdemyで販売されている模擬試験形式の問題集です。実際の試験と同じ、四肢択一で出題されている為、本番のノリで問題を解くことができます。さらに時間制限もある為、本試験と同じ60分で自分の中での問題解答ペースを決めることもできます。

https://www.udemy.com/course/itil4-foundation-japan/?couponCode=LEADERSALE24B
### 2,【ITILの認定講師が解説】サービスマネジメントとITIL4フレームワークの概要を具体例とともに理解しよう！
ITILはイギリスの資格であり、本国のDionさんという方の講義を日本語訳化されてわかりやすく表現されている講義です。これは問題集ではないのですが、問題を解いていてイメージが湧かなかった場合などは、一度ふりかえってITIL4の基礎を学ぶことができます。

https://www.udemy.com/course/intro-to-service-management-japanese/?couponCode=LEADERSALE24B
### 3,クラムメディア問題集
クラムメディア社が提供しているITIL4の問題集です。6000円で1ヶ月間のサブスクリプションとなります。少し高いのですがこちらも演習モードと模擬試験モードがあります。
本番試験を受けてから思ったのですが、問題の的中率に関してはこの問題集の方が高いように感じました。正直、6000円かけて良かったと今は思っています。ただ答えの解説がないためその点はあらかじめ覚えておいてください。

https://www.crammedia.com/ITIL-V4-Foundation-Exam/p/247/261
# 最後に
試験そのものはクラムメディアで出題されていた問題と全く同じか似たような問題が頻出したように記憶しています。

ですが解説の充実度でいくとUdemyの方がかなり良いため、どちらも並行して対策すれば十分合格できるのではないかと思いました。ITIL資格は受験料が高いものの、勉強すればITサービスマネジメントのベストプラクティスやインシデント管理、情報セキュリティの管理などエンジニアに欠かせない知識を得られると思います。

そのため、この資格の受験は強くお勧めします。
お互いに自己研鑽を継続し、自分のIT市場価値をどんどん上げていきましょう！🔥
MVCモデルの簡単な解説

MVC概要

# MVC

MVC（Model-View-Controller）モデルは、ソフトウェアの設計パターンの１つです。
私が初めて聞いたのは30年以上前でした。
調べたら、1980年代初頭には有った概念のようです。

## 概要

MVCはアプリケーションの構造を３つの主要なコンポーネントに分割します。
1. Model（モデル）
1. View（ビュー）
1. Controller（コントローラ）


```plantuml
@startuml

class Model {
    + data
    + getData()
    + updateData()
}

class View {
    + render()
}

class Controller {
    + handleUserInput()
}

Model <.. Controller : <<uses>>
Controller -- View : <<updates>>
View ..> Model : <<observes>>

@enduml
```

それぞれのコンポーネントが疎結合になることにより、移植性やメンテナンス性が上がります。

## コンポーネントの内容

それぞれのコンポーネントを解説します

### Model（モデル）
ビジネスロジックを表します。
モデルはアプリケーションの状態を保持し、データの取得、更新、変換などの操作を実行します。
データベース、ファイルシステム、ネットワークリクエストなどのデータソースとのやり取りもモデルが担当します。

### View（ビュー）:
ユーザーにデータを表示する責任を持ちます。
ビューはモデルからデータを取得し、ユーザーが見ることができる形式に整形して表示します。
グラフィカルユーザーインターフェース（GUI）、ウェブページ、テキストファイルなどがビューの例です。


### Controller（コントローラ）:
入力を受け取り、それに基づいてモデルやビューを制御します。
コントローラはユーザーの操作やセンサーからの入力を解釈し、適切なアクションを起動してモデルを更新したり、ビューを変更したりします。



## 利点

パターンの主な利点は以下の通りです：

1. 分離の原則（Separation of Concerns）：MVCパターンはアプリケーションの構造を3つの主要なコンポーネント（Model、View、Controller）に分割します。これにより、それぞれのコンポーネントが特定の役割に集中でき、コードの理解とメンテナンスが容易になります。

1. 再利用性（Reusability）：各コンポーネントが独立しているため、他のアプリケーションで再利用することが容易です。例えば、同じModelを異なるViewで使用することが可能です。

1. 並行開発（Parallel Development）：MVCパターンを使用すると、開発者はModel、View、Controllerを同時に開発することが可能になります。これにより、開発時間を短縮することができます。

1. 拡張性（Extensibility）：新しい機能を追加する際に、既存のコードを変更することなく新たなModel、View、Controllerを追加することができます。

1. テスト容易性（Testability）：各コンポーネントが独立しているため、単体テストやモックテストを行いやすくなります。


## 実際のところ...

ファームウェアの仕事をしていた時は、MVCの考え方を設計に入れることでViewの影響をビジネスロジックから切り離せるのはメンテナンス性から良いというのは実感してました。
ただ、WindowsアプリやAndroidアプリ等のフレームワークが提供されている環境での開発ではVとCの分離がうまくいかず、理想通りにはいきませんでした。

そのあたりは、MVVMの解説でやっていきます。
ChromeOS Flexにcursorをインストールする

結構前から話題になっているAI搭載のコードエディタである [cursor](https://cursor.sh/) を ChromeOS flexにインストールしてみました。

やや躓いたのでメモとして残しておきます。

# 試した環境
### PC
* [Beelink eq12](https://bee-link.com/collections/mini-pc/products/eq12-n100-intel-12th-gen-4-cores-3-4-ghz-processor)
  * intel N100 搭載の小型PCです。安くて小さくて処理性能もゲームなどしない分には十分なため重宝しています。

### ソフトウェア
* ChromeOS Flex 124.0.6367.219
* Cursor 0.33.4

Chromebookも持っているのですがCursorのLinux版にarm版がないので手元のPCにChromeOS Flexいれて試してみました。手元のChromebookがすべてarm系CPUのものでした。（intel系のも一台ほしい)

ChromeOS flexにLinux環境はできているものとして進めます。

# ダウンロード
https://cursor.sh/ からダウンロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294409/c65a7217-b2a7-fd0f-acb7-a6b14df0f5d5.png)

ChromeOS flex ないし、ChromeOSからアクセスすると `Download for Mac` のリンクが出るので要注意。
横の `Other` をクリックしてLinux版をダウンロードします。

# インストール
ダウンロードできるのが AppImage ファイルなので起動しようとしても以下のような画面が出ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294409/279eed7a-e8ed-ea83-25ec-39ddc5815799.png)

### Linux ファイル領域にコピー

ChromeOS のファイラを使ってダウンロードした AppImage ファイルをLinuxファイル領域にコピーします。
ドラッグ＆ドロップでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294409/75a1abbc-140f-5945-c0fb-32e9e9c0ca2e.png)

### 実行
ターミナルを開き AppImage ファイルに実行権を付与して実行します。
```bash
chmod +x ./cursor-0.33.4x86_64.AppImage 
./cursor-0.33.4x86_64.AppImage 
```

ただこのまま起動しようとするとエラーになります
```
dlopen(): error loading libfuse.so.2

AppImages require FUSE to run. 
You might still be able to extract the contents of this AppImage 
if you run it with the --appimage-extract option. 
See https://github.com/AppImage/AppImageKit/wiki/FUSE 
for more information
```

libnssとfuseをインストールします
```bash
sudo apt update && sudo apt -y upgrade
sudo apt install -y libnss3 fuse
```
これで実行可能になりました。
```bash
./cursor-0.33.4x86_64.AppImage 
```

# フォントの設定
起動してみるとわかるのですがフォントがぼんやりしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294409/799bb3b7-2263-618c-4942-78d3bf8a9ca0.png)

`Ctrl + ,` でセッティングを開き、 `Editor: Font Family` に `'Noto Sans Mono'` を設定します。

# AI Chatで日本語が使えない
これが致命的でした。
右ペインに出てくるAI Chatですが、日本語を入力して変換して確定しようとすると
![Screen-recording-2024-05-19-14.04.12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294409/8d84be08-667c-f9a3-38ae-4e06bc7e0b14.gif)
消えてしまいます。

この辺は Chromebook(ChromeOS) でLinuxアプリを使う時あるあるですが、 fcitx5 と fcotx5-mozc を入れて解決していきます。

### fcitx5とfcitx5-mozcをインストールする
```
sudo apt install fcitx5 fcitx5-mozc
```
そして fcitx-configtool でInputメソッドを設定
```bash
fcitx5-inputool
```
Mozc と日本語キーボードにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294409/057a8db4-d29d-cf73-2aee-33a49289ac5b.png)

### 環境変数の設定
~/.bashrc に以下を追記します。
```bash
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
```
.bashrc の読み込みを行います
```bash
source ~/.bashrc
```

## AI Chatで日本語入力ができるようになりました
![Screen-recording-2024-05-19-14.20.36.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294409/873f0ff4-a625-8c5e-2230-2541ac5a70f9.gif)


無事にAI Chatで日本語入力ができるようになりました。
fcitx5 の自動起動設定など割愛している部分がありますのでそのあたり他の方の記事などを参考にしてください。

# まだ出来ていないところ
* curosrを直接起動できない
  * 起動したcursorをタスクバーに固定することが出来ないため、コマンドラインでの起動となります。
FlutterとFirebaseを勉強してみる

## はじめに

### 概要

モバイルアプリを使ったプロダクトのアーキテクチャや非機能を考える際に自分のモバイルの知識のなさに愕然としたので、最近Flutterの勉強を始めました。自分の知識の整理のため、初学段階がひと段落したタイミングで、私なりのおすすめの勉強方法を私の備忘も兼ねて記事に残しておきます。

### 対象読者

下記全てに該当する人

* モバイル全くわからない
* Flutterを勉強してみたいけどどこから勉強したら良いかわからない
* Web開発の知識は少しある
* サンプルアプリを作りながら勉強したい人

### 注意点

私のような初学者が語っても仕方がないので、Flutterに関する解説は参考として載せた記事に任せます。代わりに私なりの勉強した流れを説明します。

私は、各言語の詳細や文法を勉強してから始めるというよりは、ToDoアプリなどサンプルアプリの実装を通して概観を掴んでから文法などを学び直す、という勉強方法を好みます。そのためこの記事も後者の勉強方法を好む方向けです。

## flutter-study.devをやってみる

私は最初本から勉強を始めたのですが、途中から[このサイト](https://www.flutter-study.dev/)を見つけ、このサイトで勉強をし直しました。複数のアプリを作りながらよく使われる機能を学べる良サイトだったのでおすすめです。ただし、バージョンが古いという欠点があり、ところどころ補完が必要です。その補完を残しておきます。

### 環境セットアップ

私は最初本から学習しようと思い、[「動かして学ぶ Flutter開発入門」](https://www.shoeisha.co.jp/book/detail/9784798177366)を買って勉強したのでこの本の中でセットアップを済ませてしまいました。セットアップに関しては色々な記事があり、[こちらのサイト](https://zenn.dev/kboy/books/ca6a9c93fd23f3)が参考になりそうでした。

また、私はバージョン管理ツールを使いたかったので、Flutter SDKのインストールの際、別のサイトを参考にしました。Flutterのバージョン管理ツールとしては

* [fvm](https://fvm.app/)
* [asdf](https://asdf-vm.com/)


があります。それぞれの導入のための参考記事を記載しておきます。

https://zenn.dev/altiveinc/articles/flutter-version-management-3

https://ryamate.hatenablog.com/entry/2023/02/27/204608

どちらかを使うかは正直好みです。既存プロジェクトがfvmを使っているから、すでにasdfを使っているからなどなど理由はなんでも良いと思います。ただし、fvmはver.2と3で仕様が変わっているので既存プロジェクトでfvmを使っている場合はどのバージョンかも確認した方が良いです。

### ToDoアプリを作ってみる

flutter-study通りに勉強していきます。ただ、バージョンが古くエディタからもheadline4を使われていないよなどのエラーが出ると思います。その際は補完機能を有効活用しましょう。例えば、headline4のエラーの場合、下記のように消してドットを入力して補完を表示させてみましょう。そうするとheadlineMediumやheadlineSmallと表示されていますよね。そうすればわざわざ調べなくても変更された名前がわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2249551/b2f6eca5-96dd-1338-e211-777c9feac573.png)

バージョンエラー以外は特に難なくToDoアプリを作れるようになります。

### Firebaseの補足

モバイルでよくFirebaseという単語を聞き、知りたかった私にはとても良い学習教材でした。ただ、これもfirebaseのセットアップ方法が古くこの手順ではセットアップできません。
昔のバージョンでは自分でhtml内にコンフィグを書いていたのですが、今は公式サイトの通り、flutterfire CLIをインストールしてCLIで実行します。最初CLIを使うことに抵抗がありましたが、導入も導入後のセットアップも非常に簡単でした。

https://firebase.google.com/docs/flutter/setup?hl=ja&platform=ios

上記のセットアップを乗り越えれば、あとはflutter-study.dev記載のチャットアプリを難なく作成できます。認証やDB,Providerなどfirebaseを使わなくてもこういう風にやるんだという雰囲気を掴むことができて良かったです。

こちらのサンプルアプリを残しておけばFirebaseの他の実験とかにも使えて便利です。

## Firebaseの学習

上の学習ではAuthenticationとFirestoreしか使いませんが、下記サイトではサンプルアプリケーションにFirebaseの様々なパッケージを導入して学ぶことができます。最初このページを見つけた際は全くわかりませんでしたが、studyをやった後であれば苦労することなく導入できます。全てをやったわけではありませんが、業務で使いそう、興味ありそうなものを見つけてやってみると良いと思います。

https://zenn.dev/snova301/books/6df29a230d681f

Firebaseは画面が慣れないですね...

## おわりに

私はこの後、学習前に買った[「動かして学ぶ Flutter開発入門」](https://www.shoeisha.co.jp/book/detail/9784798177366)を読んで復習しました。なお、その際の感想は[私のブログ](https://kmnky.dev/posts/20240519_reading-diary)に記載していますので、ご参照ください。

以上、私のFlutterやFirebaseの初学メモでした。この後は業務で使うか自分なりにアプリを作ってみて学習を深めてみようと思います。知人に聞いたところリファレンスとしては[Flutter実践開発](https://gihyo.jp/book/2024/978-4-297-13993-3)という本がよいそうです。こういった本を読みながら並行して文法などの理解も深めていきたいと思っています。

勉強の仕方は人それぞれなので紹介したやり方はあくまでも一例にすぎませんが、これを読んでくださった方の少しでも参考になれていたら嬉しいです。

最後まで読んでいただきありがとうございました。
【Atcoder】非情報系が2ヶ月で茶色コーダーになるまでにやったこと

## はじめに
この記事はこれから茶色を目指す方に向けて書かれています。
少しでも気づきがあったり、競プロ熱が刺激できたら嬉しいです。

## 自己紹介・なぜAtcoderを始めたのか
AI領域での起業を志し4月から休学している大学院2年生です。

専攻は化学系で、研究でもPCを触るのは簡単なデータ集計とスライド作成くらいで、ほとんどコードに触れたことはありませんでした。

AI領域に興味があるため、深層学習の学習・実務への応用を学ぶのはもちろんなのですが、コンピュータを介した技術のスピードがえげつない現代では、最先端の情報にアンテナを立てて学び続けることと、基礎に戻って根本を理解しておく両輪が大切だと考えています。

そこで、根本の理解としてアルゴリズムはコンピュータの世界に限らず、課題解決の一般論として学ぶ価値があると思いAtcoderを始め増田。

日々の中で、これは基礎理解ためにやってるなと思っていることは以下の対応があります。もちろん実務で学べることも非常に多いですし、なるべく早く実務環境に身を置くことは非常に大事ですが、同時に基礎を補強していくイメージですね。

 - コンピュータサイエンス → CS50, 42tokyo
 - アルゴリズム → 競技プログラミング
 - 機械学習 → 松尾研GCI
 - 深層学習 → 松尾研DL基礎, ゼロから作るdeep learning

## レートの推移
実は友人に誘われて、全くコードが書けないのに何回かコンテストにでたことはありました。ただ、その時は自分はコードを書かず、自分がアルゴリズムを考えて友人が書くのを横で見ているという形だったので、実質的なスタートは2月末でした。

そこから3月は42tokyoの試験に通い詰めだったため、4月から本格参戦。

![Screenshot 2024-05-19 at 13.04.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455058/de217e10-aa7e-cb2b-df5c-bd07f2a46644.png)



## 実際にやったこと
### 毎週欠かさず参加する
皆さんが口を揃えて言われることですが、本当にこれが全てです。

いくら調子が悪くても、勉強が足りていなくても最初のうちは毎週欠かさず参加する。

いかに早く習慣化して、自分の中での参加ハードルを下げるかが勝負です。参加しない週があると気持ち悪い、くらいまで行けたら勝ちですね。

### 解けた問題+1問復習する
毎週参加した上で、解けなかった問題がもう一度出たら必ず正解できるように復讐することも大事です。

1時間頑張って考えたのに解けなかった！という問題は、解説を見て自分で実装すると、大きく力がつきます。悔しい！と思えるところまでコンテスト中は考え続けることも大切ですね。

### 【APG4b】Atcoderの日本語教材でC++の基礎を学ぶ
すでに何かの言語の経験がある人はそれで問題ないと思いますが、僕と同様初心者の人にはC++かPythonがおすすめです。

公式の解答や情報量的にこのどちらかを選んでおくと後々困らないかなと思います。

僕はc++を選択し、まず下のAtcoder公式教材を一周しました。

他の書籍や講座と違い、実際に競プロの問題を解きながら進めるので、実際にコンテストに出るときにハードルが低くなるところがおすすめポイントです。

1-3章だけでOKで、4章はサラッと目を通すくらいで十分だと思います。軽く1周したら、AtcoderProblemsなどでA問題をひたすら解きながら、わからないことあったら調べるくらいの方が学習効率は高いです。

[C++入門 AtCoder Programming Guide for beginners (APG4b) - AtCoder](https://atcoder.jp/contests/APG4b)

### 【鉄則本】"競技プログラミングの鉄則"で入門のアルゴリズムを学ぶ

茶色に入るだけなら、上記のようにひたすらA問題、B問題の過去問を解いていくことがベストだと思います。

しかし、元々アルゴリズムの勉強をするために競プロを始めたので、一通り競プロで使用されるアルゴリズムを網羅的に学びたいという衝動に駆られました。

1ヶ月くらいかけて書籍を一周しましたが、4月の頭からずっとC問題までの3完で、この書籍のおかげでレートが爆上がりした！みたいなことはないですね。

しかし、明らかに成長は感じていて、コンテストの解説動画や問題の解説などの理解はスピード質ともに高まりました。もっと演習を積んで使いこなせるようにしていきたいと思います。

## これからやりたいこと
### 【Atcoder Problems】A,B,C,D問題埋め
競プロに限らず、基礎がぶれていて高いレベルに辿り着ける人はいません。当然のことを当然に実装できる基礎力をつけていきます。

また、Atcoderは100分と限られた時間の中での実装勝負なので、早く実装できること、迷いなく実装できることは直接レートに響いてくるのはもちろん、思考体力の温存にもなります。頭は実装よりも手前のアルゴリズムの選定などの不可価値が高い領域に使いたいものです。

ただ、単調な基礎問ばかりだと刺激が少なくなり、飽きてしまう可能性が高いので、日々の演習のスタートの勢いづけとして解いていこうと思います。

### 分野別　初中級者が解くべき過去問精選 100 問
水色コーダーを目指す人向けに、レッドコーダーである米田さんがまとめてくださっている良問集。

分野ごとに問題が分かれており、散発的に多くの問題に手を伸ばすよりも、この100問を何度も解くことの方が近道の可能性も高いのではないか。

https://qiita.com/e869120/items/eb50fdaece12be418faa#2-3-%E5%88%86%E9%87%8E%E5%88%A5%E5%88%9D%E4%B8%AD%E7%B4%9A%E8%80%85%E3%81%8C%E8%A7%A3%E3%81%8F%E3%81%B9%E3%81%8D%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-100-%E5%95%8F

## まとめ
このまま毎回のコンテストでレートを50ずつ上げることができれば、あと8回（約2ヶ月）で緑に上がれる。

7月中の入緑を目指して、日々積み上げていきたい。そしてまたこの投稿のように入緑の記事を書きたい。

毎回のパフォーマンス的にこのまま推移すれば緑は達成できそうなので、緑の上である水色を目指して精進を続けます。目指せ今年中に青色。
フロー効率を高めたことでチーム開発の質が向上された話

## はじめに
自社開発のエンジニアをやっています。  
毎スプリント振り返りを実施しているのですが、ある日計画したタスクのほとんどの作業は完了できているけどちゃんとクローズできたものが１つ２つしかないよねという話があがり、その改善案として「フロー効率」という言葉が出ました。  
当時はフロー効率というものを知らなかったのですが、調べてみると確かに今の自チームにおいて必要であると理解できたので、フロー効率の向上を目的とした改善案を見出してアクションをとりました。  
その結果、良い効果がいくつか見られたので、フロー効率の概要と得られた効果について書いていこうと思います。  
## フロー効率とリソース効率 
フロー効率は前述で出てきましたが、それを知る上で「リソース効率」というものも理解すると良さそうです。  
簡単に概要をまとめます。*誤りがありましたらすみません  
### リソース効率とは
**リソース(作業者)が作業できている割合**を示していると考えています。  
例えば作業者Aさんがタスク1とタスク2をもっており、業務時間内常にタスク1→タスク2を着手できている場合のリソース効率は100%になります。  
もし、Aさんがタスク1を着手されている途中で別件の庶務作業が入り業務時間の50%割かれてしまったとすればリソース効率は50%になると考えられます。  
### フロー効率とは
**タスクが作業されている割合**を示していると考えています。
前述と同じ例で作業者Aさんがタスク1とタスク2をもっており、業務時間内常にタスク1を着手している場合にタスク1のフロー効率は100%、タスク2のフロー効率は0%であると言えます。  
もしBさんもチームに加わり、Aさんがタスク1、Bさんがタスク2を常に着手できている場合はタスク1、タスク2共にフロー効率は100%であると考えられます。
## チームの課題感
自チームでは作業メンバー全員が常にタスクに着手できるような動きはできていました。言い換えると、リソース効率は常に100%に近い動きはできていました。  
しかし、タスクが1~5あったとしてタスクの優先度もタスクの連番順としたときの最優先度のタスクのフロー効率が低いという疑惑が浮上していました。  
実例として、下記を前例と置きます。  
- チームメンバーは3人(Aさん、Bさん、Cさん)
- タスクは5つ(タスク1 ~ タスク5)で優先度は1~5の順で高い
- 各タスクはテスト設計、実装、STG環境テストの実施のサブのタスク含んでいる
- サブのタスクはそれぞれ作業者以外のレビューが必須  

この場合にスタート地点ではAさんがタスク1のテスト設計、Bさんがタスク2のテスト設計、Cさんがタスク3のテスト設計を着手していきます。そこではじめにAさんがテスト設計を終え、レビュー依頼をするのですが、BさんとCさんは自分のタスクがやりかけであるためレビューを後回しにして、自分のタスクが完了したらAさんのレビューに移るという動きになっていました。  
そうしたことで優先度の高いタスク1は一旦ペンディングの状態になり、タスク2、タスク3の足並みが揃ってからタスク1の作業が進み始めるためほぼほぼ同時進行でタスクが進んでいくという動きになってしまったのです。その結果、スプリントで完了させたいタスク全てほとんど完了はしているものの完全にクローズができているタスクがほとんどないということに繋がってしましました。  
これは優先度の高いタスクのフロー効率を意識できていないと考えることができ、本来であればAさんがレビューを投げた時点でそのタスクよりも優先度が劣るタスクを着手されているBさんとCさんはすぐにAさんのレビューに移ることで優先度の高いタスクから着実にクローズできる動きが実現できるのではと考えました。  
## 実際にやったこと
優先度の高いタスクのフロー効率を高めることを目的として下記を実施しました。  
- チーム内で改めて優先度高いタスクから確実に終わらせたいという認識を合わせる
  - 目的における認識齟齬が起きないようにするため
- レビュー完了が後続タスクの着手可能条件であると認識を合わせる
  - 後回しにすることがフロー効率を下げてしまうと意識付けるため
- レビュー依頼者が直接会話で呼びかけていち早くレビューを実施できるようにフォローをする
  - チャットのみで依頼をしても実施までに時間がかかる可能性があるため
  
上記を行ったことで確実に優先度の高いタスクからクローズすることができました。
## 優先度高いタスクのフロー効率を高めたことで得られたメリット
ここまでの記述で優先度高いタスクのフロー効率を高めたことで何が嬉しいのかいまいち見えてこないと思いますので、良かった点を挙げていきます。  
### 不備や要件変更による後戻りが少なくなった
定期的にチーム外に向けて実機レビュー会を実施させていただいているのですが、着実にタスクのクローズができていなかったときは成果物が大規模になってしまい、レビュー会でいただく指摘の対応範囲が広くなっていました。
着実にクローズできるようになってからは細々レビューに持っていける動きが実現でき、対応範囲を狭めることができました。  
### スケジュールの見積もり差異のリスクが減らすことができた
自チームではタスク量をポイントで見積もっているのですが、今週どれくらいポイントを消化できたかという話をする際にクローズできていないタスクに関しては「大体8割くらい完了できているからタスクのポイント5ptのうち4ptは消化ポイントで計上しとこう」みたいな感じでスケジュール管理をしていました。  
このようにざっくりで見積もってしまうと実はこの受け入れ条件が満たせていなかったと判明した時に大きくスケジュールに影響が及ぶ可能性があると考えられます。  
着実にタスクをクローズする動きを確立してからはざっくり見積もりが激減し、スケジュール管理のリスクを減らすことができました。
## まとめ
自チームで優先度高いタスクのフロー効率を高める動きを実施したことで、開発効率とスケジュール管理の質を向上することできました。  
この動き方は現場のプロダクトや案件内容によって有用性が変わってくると思うのでその時折々で動き方については検討する必要があると思いました。  
自分はまだまだだスクラムの経験は少ないので留意点やもっと良いやり方があればご教示いただきたいです。
Visual studio code のスクリプトマクロ

## VSCodeのマクロ
エディタのマクロとは、エディタの動作をスクリプトで拡張すること。EmacsだとEmacs Lispでまあなんでも書ける。というか、ほとんどの機能が、Emacs Lispで書かれている構造。VSCodeももともとJavaScriptで書かれているはずなので、同じようにできそうなものだが、デフォルトではサポートされていない(たぶん)。

キーボードマクロを可能にするExtensionはいくつかあって、それはそれで愛用しているのだけど、これだけだと基本はキーボード操作を発行できるだけなので、繰り返しや条件分岐ができない。頑張ればできるのかもしれないけど。

https://marketplace.visualstudio.com/items?itemName=ctf0.macros


## スクリプトマクロ
JavaScriptが書けるマクロを探してみたところこんなのを見つけた。

https://marketplace.visualstudio.com/items?itemName=EXCEEDSYSTEM.vscode-macros

このExtensionは、特定の場所に置いた特定の書き方で書いたJavaScriptをキーボードショートカットやコマンドとして実行できるもの。使ってみたところ、遅延もなくかなり快適に使えた。

1. Extensionをインストール
2. 適当なところにディレクトリを作成して、そこにスクリプトファイルを置く。
2. settings.json でこのファイルを指定。

``` json
       "vscodemacros.macroFilePath": "{HOME}/Repos/vsmacro/barmacro.js",
```

これでコマンドパレットから `VSCMacros: Run macro` で起動できるようになる。ファイル内には複数のマクロが書けるので、それを選択する形になる。

### 個々のマクロの呼び出し

個々のマクロに名前を与えて、キーボードショートカットを設定する事もできる。それには、settings.json に以下のように書く。

``` json
       "vscodemacros.userMacroCommands": [
           {
               "path": "/{HOME}/Repos/vsmacro/barmacro.js",
               "name": "FooMacro"
           },
           ...
        ],
```
このようにリストを指定すると、"vscode-macros.user1","vscode-macros.user2".. のように名前が与えられる。10個しか設定できない。

## マクロの書き方
マクロファイルは、コンフィギュレーション部と本体に分かれる。
コンフィグ部にはJson形式でマクロ名と関数を宣言する。このマクロ名をsettings.jsonでも用いる。

``` Javascript
const vscode = require('vscode');

/**
 * Macro configuration settings
 * { [name: string]: {              ... Name of the macro
 *    no: number,                   ... Order of the macro
 *    func: ()=> string | undefined ... Name of the body of the macro function
 *  }
 * }
 */
module.exports.macroCommands = {
   FooMacro: {
      no: 1,
      func: divideFunc
   },
   BarMacro: {
      no: 2,
      func: barFunc
   }
};
```

マクロ関数本体はこのような感じ。これは、選択したテキストの前後にダブルクォート(`"`)を挿入するだけの
もの。

``` javascript
/**
 * FooMacro
 */
function fooFunc() {
   const editor = vscode.window.activeTextEditor;
   if (!editor) {
      // Return an error message if necessary.
      return 'Editor is not opening.';
   }
   const document = editor.document;
   const selection = editor.selection;
   const text = document.getText(selection);
   if (text.length > 0) {
      editor.edit(editBuilder => {
         // To surround a selected text in double quotes(Multi selection is not supported).
         editBuilder.replace(selection, `"${text}"`);
      });
   }
}
```

## 感想
すばらしい。けどこれはデフォルトで入っているべき機能だと思う。
また、JavaScriptのファイルが別ファイルになってしまうのは、設定ファイルの管理がとても面倒くさい。settings.jsonに埋め込めれば一番いいのだけど。JSONにはraw stringがないから無理なのか。。
【備忘録】SQL

# SQL
## 関数
### MID
`MID({対象の文字列}, {何文字目から}, {何文字分抽出するか})`
文字列を抽出する関数
```
SELECT MID('123456789', 2, 2)
-> 23
```

### TOP
`SELECT TOP {何行} * FROM table`
SQL結果のレコード数を指定できる関数
上から何行分出力するかを指定できる
```
SELECT TOP 3 * FROM table;
```

### GETDATE
`SELECT GETDATE()`
現在の日時を取得する関数
```
SELECT * FROM table
WHERE start_date <= GETDATE();
```

### DATETIME
`SELECT DATETIME(GETDATE(), '%Y-%m-%d')`
日付の出力形式を整形する関数

### CONVERT
`CONVERT({型名}, {対象文字列})`
型変換を行う関数
```
CONVERT(NVARCHAR,100.00)
```

### UNION
`{SELECT文} UNION {SELECT文}`
二つのSQL結果を縦につなげて１つの実行結果のように見せる関数
- レコードが重複しない
- 出力結果が同じテーブル構造でないといけない
```
SELECT * FROM table1
UNION
SELECT * FROM table2
```

### CONCAT
`CONCAT({対象文字列1}, {対象文字列2}, ....)`
複数のカラムを結合して表示できる関数
- NULLも結合できる（"+"で結合した場合、すべてNULLになる）
```
SELECT CONCAT("hoge", NULL, "fuga")
-> hogefuga
```

### ISNULL
`ISNULL({対象}, {置き換え後の文字列}) `
対象がNULLの場合に置き換える関数
```
SELECT ISNULL(NULL, "test")
-> "test"
```

## システム変数
### `@@ROWCOUNT`
直前のSQLで影響を受けたレコード数を持つ変数
SELECT文で３行表示されれば3を持つし、UPDATEで5行更新したら5を持つ
レコードの存在チェックに使える

## 記法
### JOINとEXISTSの使い分け
どちらも２つのテーブルをつなげて条件を付けることができる
- JOINの場合
    - 結合される側のテーブルの同じレコードが複数できる
    - バリエーションをすべて見たかったらこっち
- EXISTSの場合
    - 結合される側のテーブルは複製されない
    - 重複しない単純な種類数を見たかったらこっち

### CASE文
- 単純CASE式
    - 対象の1データに対して条件をかけて分岐させたいとき
```
CASE column
    WHEN '男' THEN 1
    WHEN '女' THEN 2
    ELSE 3
END
```
- 検索CASE式
    - 条件によって使うデータを複数パターンで切り替えたいとき
```
CASE
    WHEN sale IS NOT NULL THEN sale_price
    WHEN tax IS NOT NULL THEN tax_price
    ELSE price
END
```

### IF文
```
IF 条件1
BEGIN
    実行文1
END
ELSE IF 条件2
BEGIN
    実行文2
END
ELSE
BEGIN
    実行文3
END
```

### 変数
SQLも変数を使える
```
DEWCLARE @price INT(8)
SELECT @price = price FROM table
```

## 型
### VARCHAR と NVARCHAR
型 | 特徴 | サイズ | Umicode
--- | --- | --- | ---
VARCHAR | 可変長 | 8000 B | -
NVARCHAR | 可変長 | 8000文字 | 〇
CHAR | 固定長 | 8000 B | -
NCHAR | 固定長 | 8000文字 | 〇
【Chakura UI】ボタンを中央に配置する

# はじめに
ボタンを中央に配置する方法についてメモしておきます。
UIはChakura UIを使用しています。

# サンプル
```tsx:tsx
        <Box display="flex" alignItems="center" justifyContent="center">
          <Button
            type="submit"
            colorScheme="green"
            variant="outline"
          >
            ボタン
          </Button>
        </Box>
```

# おわりに
**display="flex"**
これだけだと**デフォルトで水平方向に横並び**のレイアウトになります。
従って、具体的な配置（中央揃え、スペースの均等割り、折り返しなど）は指定できません。
**justifyContentとalignItemsを使用してボタンの位置を調整します。**

**justifyContent**
フレックスアイテムを**主軸**（通常は水平方向）に沿ってどう配置するかを指定します。

・flex-start: 左揃え（デフォルト）
・flex-end: 右揃え
・center: 中央揃え
・space-between: フレックスアイテム間に均等なスペースを配置し、両端はコンテナの端に揃える
・space-around: フレックスアイテム間に均等なスペースを配置し、両端に半分のスペースを配置
・space-evenly: フレックスアイテム間に均等なスペースを配置

**alignItems**
フレックスアイテムを**交差軸**（通常は垂直方向）に沿ってどう配置するかを指定します。

・flex-start: 上揃え
・flex-end: 下揃え
・center: 中央揃え
・baseline: テキストのベースラインに揃える
・stretch: 高さを揃えて伸縮させる（デフォルト）
# 参考
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox

https://v2.chakra-ui.com/docs/components/button/usage
[Google Cloud Speech-to-Text API(V2)] Javaで長時間実行オペレーションをキャンセル・削除する

Cloud Speech-to-Text API V2(Java)を使用して、
長時間実行オペレーションをキャンセル・削除する方法についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Cloud Speech-to-Text API(V2)] JavaでSpeech-to-Text APIを使ってみる](https://qiita.com/doran/items/8e4ef896588229c4fed3)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[オペレーションをキャンセル](#1-オペレーションをキャンセル)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[オペレーションを削除](#2-オペレーションを削除)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|

## 1. オペレーションをキャンセル
指定した長時間実行オペレーションをキャンセルします。

### 1.1. スコープ
OAuth2.0でこのAPIを実行するには、以下のスコープを指定してください。
サービスアカウントで実行する場合はスコープの指定は不要です。
```
https://www.googleapis.com/auth/cloud-platform
```

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    try(SpeechClient client = getSpeechClient();
        OperationsClient op = client.getOperationsClient()){
    
        String opName = String.format(
                "projects/%s/locations/%s/operations/%s", 
                "プロジェクトID","ロケーションID","オペレーションID");
        op.cancelOperation(opName);
    }
}
```

#### 1.2.1. HTTPリクエスト
POST:　https:\//speech.googleapis.com/v2/projects/{プロジェクトID}/locations/{ロケーションID}/operations/{オペレーションID}:cancel
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありません。

#### 1.2.3. リクエストボディ
リクエストボディはありません。

### 1.3. レスポンスの内容
レスポンスはありません。

## 2. オペレーションを削除
指定した長時間実行オペレーションを削除します。

### 2.1. スコープ
OAuth2.0でこのAPIを実行するには、以下のスコープを指定してください。
サービスアカウントで実行する場合はスコープの指定は不要です。
```
https://www.googleapis.com/auth/cloud-platform
```

### 2.2. 実行

```java
public static void main(String[] args) throws Exception{
    try(SpeechClient client = getSpeechClient();
        OperationsClient op = client.getOperationsClient()){
    
        String opName = String.format(
                    "projects/%s/locations/%s/operations/%s", 
                    "プロジェクトID","ロケーションID","オペレーションID");
        op.deleteOperation(opName);
    }
}
```

#### 2.2.1. HTTPリクエスト
DELETE:　https:\//speech.googleapis.com/v2/projects/{プロジェクトID}/locations/{ロケーションID}/operations/{オペレーションID}
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

#### 2.2.3. リクエストボディ
リクエストボディはありません。

### 2.3. レスポンスの内容
レスポンスはありません。

<br>
<br>
おしまい。。
RSCのミニマルフレームワーク”Waku”をデプロイしようとしたら、無理だった話

## はじめに

最近出た、Next.jsの小さいバージョンみたいなフレームワークの"Waku"をデプロイしようとしたら、できなかったので共有ついでにQiitaへ投稿します

## 事象

Wakuというフレームワーク使用して、雑なWebアプリを作成して、いざデプロイしようとしたら以下のエラーになった。
ただし、ローカルでもデプロイワークフロー上においても、ビルドはできている。

## 公式サイトを見てみた

https://waku.gg/#deployment

![スクリーンショット 2024-05-19 13.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312905/e530db0e-a752-1286-79f5-3e27631928b5.png)

すごいコマンド一発でできそうに書いてありますが、実際にやってみると・・・

<details><summary>package.json</summary>

```diff_package
{
  "name": "dora-timer",
  "version": "0.0.0",
  "type": "module",
  "private": true,
  "scripts": {
    "dev": "waku dev",
    "build": "waku build",
    "start": "waku start",
    "deploy": "vercel"
  },
  "dependencies": {
    "react": "19.0.0-canary-e3ebcd54b-20240405",
    "react-dom": "19.0.0-canary-e3ebcd54b-20240405",
    "react-server-dom-webpack": "19.0.0-canary-e3ebcd54b-20240405",
    "vercel": "^34.2.0",
    "waku": "0.20.1"
  },
  "devDependencies": {
    "@types/react": "18.2.74",
    "@types/react-dom": "18.2.24",
    "autoprefixer": "10.4.19",
    "tailwindcss": "3.4.3",
    "typescript": "5.4.4"
  }
}
```

</details>


```bash:shell
$ npm i vercel
$ npm run deploy
> dora-timer@0.0.0 deploy
> vercel

Vercel CLI 34.2.0
> > No existing credentials found. Please log in:
? Log in to Vercel Continue with GitHub
> Success! GitHub authentication complete for
? Set up and deploy “”? yes
? Which scope do you want to deploy to? t-abe09's projects
? Found project “”. Link to it? yes
🔗  Linked to (created .vercel and added it to .gitignore)
🔍  Inspect:  [5s]
✅  Preview:  [5s]
Error: The following Serverless Functions contain an invalid "runtime":
  - RSC (nodejs18.x)
```

githunにPushした際の、画面のエラーも同じエラーとなります。

![スクリーンショット 2024-05-19 14.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312905/864af50a-4f7b-7d73-4085-0c551491bee7.png)

## まとめ

最近できたばかりのフレームワークですし、気長に待ちたいと思います。
OpenWrt の 2.4GHz 帯(1 ～ 11ch)では、チャネル選択で auto が使用できない。

OpenWrt で 2.4GHz のチャネル選択を `auto` にすると、`disabled` / `無効` となってしまい 2.4GHz のチャネルが使用できません。

👉 `Network > Wireless` / `ネットワーク > 無線` では以下のように表示されます。

![disabled](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/ac20415c-8b86-3465-3f13-9735043453c5.png)　![無効](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566576/636e285c-3f2e-7e57-53f8-f6205a35e181.png)


今まで 10 種類以上のデバイスで OpenWrt を使用してきましたが、なぜか全て `auto` では 2.4GHz 帯が使えません。

そのため、2.4GHz のチャネル選択では、`1`, `6`, `11` のどれかを選択して使用しています。

https://hgot07.hatenablog.com/entry/2021/05/20/141338

https://blog.scaredeer.com/2020/07/openwrt-wifi-configuration.html
CloudFromationでIAMユーザ作成時にアクセスキーをSecret Managerに保管してみた

## はじめに
アクセスキーを作成するとセキュリティが心配になりますよね。
数も増えると管理も大変になってしまいます。

そんな時は、「Secret Manager」を使いましょう！

今回は、CloudFormationでIAMユーザ作成→アクセスキー作成→Secret Managerに
保存まで自動化してみました。

## テンプレート

```
AWSTemplateFormatVersion: 2010-09-09
Description: CreateIAMUser
Resources: 
  TestUser:
    Type: AWS::IAM::User
    Properties:
      UserName: TestUser
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AdministratorAccess

  AccessKey:
    Type: AWS::IAM::AccessKey
    Properties:
      Status: Active
      UserName: !Ref TestUser

  AccessKeySecret:
    Type: AWS::SecretsManager::Secret
    Properties:
      Name: !Sub ${TestUser}-credentials
      SecretString: '{"accessKeyId": {"Ref": "AccessKey"},"secretAccessKey": {"Fn::GetAtt": ["AccessKey", "SecretAccessKey"]}}'
```

解説が入らない方はここまででも大丈夫です。作成されたリソースの確認をしてみてください。
「TestUser」の部分は適宜変えていただいて問題ございません。

以下からテンプレートについて解説していきます。

```
#cloudformationテンプレートのバージョンを指定します
AWSTemplateFormatVersion: 2010-09-09

#テンプレートの説明を任意で入れます
Description: CreateIAMUser

#リソースの定義をします
Resources: 

　　　　#作成する任意のリソース名をいれます
  TestUser:

    #作成するリソースのタイプを指定します
    Type: AWS::IAM::User

    #このプロパティの項目に基づいてリソースの作成をしていきます
    Properties:

    　　　　#IAMユーザの名前を指定します
      UserName: TestUser

      #作成するIAMユーザにアタッチするポリシーを指定します
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AdministratorAccess

　　　　#作成するアクセスキーのリソース名です
  AccessKey:

    #作成するリソースのタイプを指定します
    Type: AWS::IAM::AccessKey

    #このプロパティに基づいてリソースの作成をしていきます
    Properties:

    　　　　#アクセスキーを有効な状態で作成します
      Status: Active

      #作成するアクセスキーと上記で作成したIAMユーザの関連付けをします
      UserName: !Ref TestUser

　　　　#任意のシークレット名を指定します
  AccessKeySecret:

    #作成するリソースタイプの指定をします
    Type: AWS::SecretsManager::Secret

    #このプロパティに基づいてリソースの作成をしていきます
    Properties:

      #作成するシークレット名を指定します
      Name: !Sub ${TestUser}-credentials

      #作成したシークレットに格納する文字列を指定します。アクセスキーIDは指定した「Accesskey」(ポリシーの行の下)を参照し、
      #シークレットアクセスキーはGetAtt使用して「AccessKey」リソースの「secretAccessKey」属性を取得します。
      SecretString: '{"accessKeyId": {"Ref": "AccessKey"},"secretAccessKey": {"Fn::GetAtt": ["AccessKey", "SecretAccessKey"]}}'
```

参考にさせていただきました。
https://dev.classmethod.jp/articles/issuing-iam-access-keys-and-storing-them-in-secrets-manager-with-cloudformation/

お疲れ様でした。
DockerコンテナからUbuntuのホストにhost.docker.internalでアクセスできない問題を解決した。

# 問題

- Ubuntu上でDockerで立てたコンテナ内からホストOS（Ubuntu)へのアクセスは`host.docker.internal`でできるはずだが、できなかった。
- MacOS用のDockerDesktop環境では`host.docker.internal`でアクセスできた


# 解決法

## 1. `docker-compose.yml`に`extra_hosts`を追加

```
version: "3"
services:
  api:
    // 省略
    extra_hosts:
      - "host.docker.internal:host-gateway"
```


## Ubuntuでufwの設定をする

- Dockerコンテナからホストに繋ぐには、firewallを設定する必要あり
    - 参考：https://qiita.com/okeysea/items/51829955357f7399dd72

### ホストの4001番にアクセスしたい場合

```
sudo ufw allow proto tcp from 172.16.0.0/12 to any port 4001
```
- (*)  `172.16.0.0/12`はDockerがデフォルトで使うIP

```
sudo ufw status
```
↓

```
To                         Action      From
--                         ------      ----
22/tcp                     DENY        Anywhere
2222                       ALLOW       Anywhere
4001/tcp                   ALLOW       172.16.0.0/12
22/tcp (v6)                DENY        Anywhere (v6)
2222 (v6)                  ALLOW       Anywhere (v6)
```

#### これでコンテナ内からアクセス成功


# 詳細、その他考慮事項

## セキュリティ面での問題

### 1. portsよりもexposeが安全

- portsはiptablesを使ってファイアウォールを上書きして、そのポートが外部公開されてしまうため、ファイアウォール(ufw)の設定が意味ない
- exposeはコンテナ間通信だけに限定されるためファイアウォールを上書きしないので安全

```
version: "3"
services:
  db:
    container_name: postgres_db
    // 省略
    expose:
      - 5432　 // apiからのみアクセスするのでexposeを指定
  api:
    // 省略
    ports:
      - 3001:3001　// フロントエンドからアクセスするのでports指定が必要
    depends_on:
      - db
    extra_hosts:
      - "host.docker.internal:host-gateway"
```

### 2. `/etc/default/docker`に以下のオプションを追加
- iptablesでポートを外部公開させないために以下のオプション追加が必要

```
DOCKER_OPTS="--iptables=false"
```

# 参考

https://ngzm.hateblo.jp/entry/2017/08/19/233934
https://qiita.com/jqtype/items/9574ef74868b73323939
https://qiita.com/satons/items/889b541626ca5351fd2e#ubuntu%E3%81%A7ufw%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B
「単体テストの考え方/使い方」を読んで印象に残ったこと

# はじめに
「単体テストの考え方/使い方」という本を読みました。タイトルに違わず、考え方から細かい実装テクニックまで幅広い内容がカバーされており、非常に味わい深い本でした。

https://book.mynavi.jp/ec/products/detail/id=134252

業務において、単体テストについて悩みがあって手に取ったのですが、知りたいと思っていたことが全部書かれていました。その中で特に印象に残った点について記録しておこうと思います。

印象に残った点が多すぎるので、特に印象に残ったことのみを抽出しています。なので短い記事です。

# 内容

## テストの分類について
「単体テスト」とは、以下の3つの性質を全て満たすテストのことです。

* 1単位の振る舞いを検証すること
* 実行時間が短いこと
* 他のテストケースから隔離された状態で実行されること

このうち1つでも満たさない性質があればそれは「統合テスト」に分類されます。なので、SpringBootTestなどを使って複数のDB操作もまとめて実行するようなテストは単体テストではなく統合テストになります。私はこれを「単体テスト」だと思っていたので、この時点で勘違いしていました。

統合テストがダメなわけではなく、統合テストのほうが単体テストよりもデグレ検出に強いというメリットがあります。一方で、テストの実行が遅い、コードが膨れ上がりやすいのでメンテナンスコストが高くなる、といったデメリットがあります。

基本的には単体テストで多くテストし、統合テストではハッピーパスと、単体テストではテストできなかった異常系のテストのみに絞るのが良いようです。

私は、統合テストばっかり書いていたので統合テストのデメリットが直撃し、それで悩んでいました。どうやらこのあたりの話を理解していなかったのが原因だったようで…

## コードは負債
重要なのは「多くのテストを書くこと」ではなく「良いテスト」を書くこととそれに絞ることであり、質の悪いテストなら書かないほうがいいです。コードは資産だと考えていると、質が悪くともないよりはあったほうがいいと考えがちです。しかし実際には、コードが存在するとそれに対するメンテナンスコストが発生するので、コードは資産ではなく負債と考えるべきでした。

負債である以上、それを超える価値をもたらすテストのみをコードベースに含めるべきです。コストを下回る価値しかもたらさないテストはマイナスなので書くべきではないです。

## コードをテストするのではなく、観察可能な振る舞いをテストする
私がテストを書こうとすると、ホワイトボックスみたいな感じで「コードをテストする」発想になりがちだったのですが、これだとテストが実装の詳細に依存してしまいます。このようなテストはリファクタリング、つまり観察可能な振る舞いを変更しないコード改善のような修正でも壊れてしまいます。

テストのあるべき姿は、テストの失敗はバグの検出とイコールであることです。バグが埋め込まれたのにテストが失敗しないのは当然問題ですが、バグがないのにテストが失敗するのもまた問題です。そのような状態ではリファクタリングの意欲が削がれますし、バグがないのに失敗するということが繰り返されるとテストの失敗が軽視されるようになるという問題もあります。テストの失敗が軽視されると、バグがあることで失敗したテストがあったとしても、いつもバグがないのに失敗してるから今回もそうでしょ、とバグを見逃すことにつながります。

## ドメインにおける重要性が高い処理をテストする
ドメインというのが私はまだよくわかっていないですが、要するにビジネス上の要求に直結する箇所ほどテストする価値が高いです。少なくとも、テストする価値が高い箇所、テストする価値は多少あるけど重要性が高くはない箇所、テストする価値が全くない箇所、などに分類できるのは想像できます。テストを書くべきなのは、テストする価値が高い箇所のみです。

前述のとおりコードは負債なので、テストする価値も多少はある、程度だとメンテナンスコストに見合わない可能性があります。その場合は、それに対するテストは書かないほうがいいということになります。

## 単体テストの可読性について
テストコードにもメンテナンスコストはかかるので、可読性は重要です。そのためには、一つのテストケースでは一つのことしか検証しない、条件分岐を使わない、長いコードになる場合はヘルパー関数に切り出すといったことに気をつけます。

またテストメソッド名の命名について、テストメソッド名の中にテストから呼び出すメソッド名を含めるようなことをするべきではないです。それは観察可能な振る舞いではなく、コードをテストとする発想です。「どのメソッドをテスト対象としているか」ではなく、「どのような振る舞いをテストするのか」で命名する必要があります。
（このあたりも反省点が非常に多い…）

# おわりに
他にもモックの考え方や使い方、良いテストにするためのリファクタリングの実践例、DBのテストに対する考え方やコードの書き方、など多くの知見がありました。知見が多すぎて消化しきれていないので、折に触れてまた読み返していこうと思っています。

今まではとにかく全部テストしようと考えていたので、ドメインにおける重要性が低くてもテストを書いていたし、単体テストではなく統合テストとしてドカッとテストしてしまっていたり、いろいろアンチパターンを踏んでしまっていたんだなあと少ししょんぼりしました。

単体テストではなく統合テストばかり書くことになってしまっていたのは、テストすべきこととすべきでないことの区別をつけず全部テストしようとしていたからでもありますが、そもそもプロダクションコードが適切に分割されていなかったからでもあります。区別してテストすべきと思っていなかったことで、プロダクションコードもそれに適したコードとなっていなかったです。

しかし、この本のおかげでやるべきことがある程度わかったように思いました。テストコードも直す必要があるけど、そもそもプロダクションコードのリファクタリングからですね。
MySQLをDocker上で構築

### docker-composeの作成

```docker-compose.yml
services:
  mysql:
    image: mysql:latest
    platform: linux/amd64
    container_name: test-mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: hogehoge
      TZ: "Asia/Tokyo"
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:

```

docker-composeでコンテナを起動
**$ docker-compose up -d**

起動しているか確認
**$ docker-compose ps**

コンテナにログイン
**$ docker exec -it test-mysql bash**

MySQLに接続
**＞ mysql -p**
Enter password:
hogehogeと入力

**＞ create database test;**
**＞ show databases;**
+--------------------+
| Database 　　　　|
+--------------------+
| test 　　　　　　|
+--------------------+
todo_appが含まれていればOK

MySQLの接続から抜ける
**＞ \q**

コンテナから抜ける
**＞ exit**

### DBeaverによる接続確認

DBeaverアプリを起動
左上のアイコンをクリック
新しい接続でMySQLをクリック
接続情報を入力（パスワード入れる以外は変更ないはず）
テスト接続をクリック
Connections > localhost　＞　データベース　＞　todo-app　が表示されれば接続成功

**※ドライバファイルが取得できない問題（Error resolving driver librariesと出る場合）**
以下のリンクにアクセス
https://dev.mysql.com/downloads/connector/j/
Platform Independentを選択、ZIPファイルをダウンロード
(Downloadボタンを押した後、No thanks, just start my download.をクリックすればDLされる)
解凍後、mysql-connector-j-8.4.0.jarを任意の場所に配置

Connections > localhost　を右クリック　＞　編集 接続　＞　ドライバの設定を編集　＞　ライブラリ
デフォルトの設定を全すべて消去する
ファイルの追加　＞　mysql-connector-j-8.4.0.jarを選択、OKをクリック

**※Public Key Retrieval is not allowedと出る問題**
Connections > localhost　を右クリック　＞　編集 接続　＞　ドライバのプロパティ
allowPublicKeyRetrievalをTRUEにする

### 参考：

【入門】DockerでMySQL環境を構築する方法とデータの永続化手順まとめ
https://www.kagoya.jp/howto/cloud/container/dockermysql/
DockerでMySQL環境構築
https://zenn.dev/ryo7/articles/create-mysql-on-docker
🦫【DBeaver】アプリからドライバファイルが取得できない場合の設定方法
https://qiita.com/eltociear/items/11d5306e748127cb48ca
[python / pandas] 年・月・日・時・分が別々の列に別れている DataFrame から、日付型の列を作成する

# 1. 概要

## 1-1. 動機

結構調べたけど、実現してくれる関数っぽいものは見つけられなかったので、記事にしておく((φ(>ω<\*)


## 1-2. やりたいこと


以下のような DataFrame があったときに、

```python: colaboratory
df_datetime: pd.DataFrame = pd.DataFrame({
    "Year": [2024] * 10,
    "Month": [1, 1] + [2] * 4 + [4] * 4,
    "Day": [10, 13, 1, 2, 14, 15, 19, 20, 21, 24],
    "Hour": [11, 15, 18, 21, 1, 6, 21, 23, 2, 5],
    "Minute": [20, 21, 3, 35, 15, 59, 8, 2, 52, 26]
})

df_datetime

# 実行結果
	Year	Month	Day	Hour	Minute
0	2024	1       10	11      20
1	2024	1       13	15      21
2	2024	2       1	18      3
3	2024	2       2	21      35
4	2024	2       14	1       15
5	2024	2       15	6       59
6	2024	4       19	21      8
7	2024	4       20	23      2
8	2024	4       21	2       52
9	2024	4       24	5       26
```

以下のように新しい列を作りたい。


```python:colaboratory
	Year	Month	Day	Hour	Minute   dt
0	2024	1       10	11      20       2024-01-10 11:20:00
1	2024	1       13	15      21       2024-01-13 15:21:00
2	2024	2       1	18      3        2024-02-01 18:03:00
3	2024	2       2	21      35       2024-02-02 21:35:00
4	2024	2       14	1       15       2024-02-14 01:15:00
5	2024	2       15	6       59       2024-02-15 06:59:00
6	2024	4       19	21      8        2024-04-19 21:08:00
7	2024	4       20	23      2        2024-04-20 23:02:00
8	2024	4       21	2       52       2024-04-21 02:52:00
9	2024	4       24	5       26       2024-04-24 05:26:00
```

# 2. 実現方法

以下のように書けば、所望の列を生成できる！

```python:colaboratory
# 各列の値が int や float の時は、 str にしておく
df_tmp = df_datetime.astype({
    "Year": str,
    "Month": str,
    "Day": str,
    "Hour": str,
    "Minute": str
})

# 全ての列が str (object) 型なら実行可能
series_cat = (
    df_tmp["Year"]
    .str.cat(df_tmp["Month"], sep="/")
    .str.cat(df_tmp["Day"], sep="/")
    .str.cat(df_tmp["Hour"], sep=" ")
    .str.cat(df_tmp["Minute"], sep=":")
)
pd.to_datetime(series_cat)

# 実行結果
0   2024-01-10 11:20:00
1   2024-01-13 15:21:00
2   2024-02-01 18:03:00
3   2024-02-02 21:35:00
4   2024-02-14 01:15:00
5   2024-02-15 06:59:00
6   2024-04-19 21:08:00
7   2024-04-20 23:02:00
8   2024-04-21 02:52:00
9   2024-04-24 05:26:00
Name: Year, dtype: datetime64[ns]
```

# 3. 補足

`"2024/2/4 1:2:3"` こういう文字列を正しく datetime 型に変換できるのか不安があったので、試してみた。

```python
pd.to_datetime("2024/2/4 1:2:3")

# 実行結果
Timestamp('2024-02-04 01:02:03')
```

大丈夫みたいだね( \*˙︶˙\*)وｸﾞｯ!
いまさら3DSでPythonを動かす

## Python on your Nintendo 3DS

https://github.com/vbe0201/3DS.py

.3dsxを入れるだけでできちゃう。HomeBrewで起動

![スクリーンショット (67).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624852/d3e31d2e-26e3-863a-a68c-20c1974b126b.png)


### できること
Python 3.6.9が動かせるので基本何でもできる。
ただし、input()で文字入力は非対応らしい。

ライブラリもそろっているのでtkinter等ウィンドウ表示系以外は実行可能。

あと日本語表示は非対応。

（アスキーアートはprint()で表示させてるだけ）
![スクリーンショット (68).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624852/eeb0577c-4ccb-a273-fba0-b975fc74506d.png)
Docker環境をリセットする手順

**注意: 以下の手順はテスト環境で実行してください。本番環境で実行すると、すべてのデータが削除されるため注意が必要です。**

Docker環境をリセットするためには、すべての実行中および停止中のコンテナ、イメージ、ボリューム、ネットワークを削除し、関連ファイルやディレクトリも削除する必要があります。以下はその詳細な手順です。

## 1. 実行中のコンテナを停止する

まず、すべての実行中のコンテナを停止します。以下のコマンドを実行してください。

```bash
docker stop $(docker ps -q)
```

このコマンドは、現在実行中のすべてのコンテナを停止します。

## 2. 停止したコンテナを削除する

次に、すべての停止したコンテナを削除します。以下のコマンドを実行してください。

```bash
docker rm $(docker ps -a -q)
```

このコマンドは、すべての停止したコンテナを削除します。

### 具体的な操作例

#### 1. 実行中のコンテナを停止する

```bash
docker stop $(docker ps -q)
```

#### 2. 停止したコンテナを削除する

```bash
docker rm $(docker ps -a -q)
```

これで、すべての実行中および停止中のコンテナが削除されます。

## 3. Dockerイメージの削除

次に、すべてのDockerイメージを削除します。以下のコマンドを実行してください。

```bash
docker rmi $(docker images -q)
```

このコマンドは、すべてのDockerイメージを削除します。

## 4. Dockerボリュームの削除

Dify関連のDockerボリュームを削除します。以下のコマンドを実行してください。

```bash
docker volume prune
```

このコマンドは、未使用のDockerボリュームをすべて削除します。

## 5. Dockerネットワークの削除

Dify関連のDockerネットワークを削除します。以下のコマンドを実行してください。

```bash
docker network prune
```

このコマンドは、未使用のDockerネットワークをすべて削除します。

## 6. 残りのディレクトリやファイルの削除

最後に、Difyの設定ファイルやその他の関連ファイルが存在するディレクトリを削除します。以下のコマンドを実行してください。

```bash
# Difyのディレクトリを削除
sudo rm -rf /home/user/dify/docker
```

これで、Difyに関連するすべてのDockerコンテナ、イメージ、ボリューム、ネットワーク、およびディレクトリが削除されます。

---

以上の手順を実行することで、Docker環境をリセットし、クリーンな状態に戻すことができます。
rails7でrails newを実行するとDockerfileが上書きされてしまう...

# rails7でrails newを実行するとDockerfileが上書きされてしまう...
rails7 + docker環境を構築していた際に、Dockerfileがrails newを実行すると上書きされてしまい、環境構築がなかなか進まなかったので記録を残します。

## つまずきポイント
やっと、環境構築に必要な各ファイルの作成が終わり、以下コマンドを実行した。
```bash
docker compose run --rm web rails new . --force --no-deps --database=mysql

docker compose build
```

この時点ではうまくいっていたため、database.ymlを書き換え、DBの作成をした。
```bash
docker compose run --rm web rails db:create
```
すると、ここで
```bash
docker compose run --rm web rails db:create

[+] Running 1/0
 ⠿ Container rails_test-db-1  Created                                                                                                                                                     0.0s
[+] Running 1/1
 ⠿ Container rails_test-db-1  Started                                                                                                                                                     0.3s
/rails/bin/docker-entrypoint: line 8: exec: rails: not found
```
rails: not foundとエラーが発生。
いろいろ調べてみた結果、Dockerfileが上書きされていたことが原因だった。
rails7ではrails newした際に、production用のDockerfileが自動生成され、上書きされてしまうのだ...
なんたる仕様。

## 解決方法
初期で作成するDockerfileの名前をDockerfile.devに変更
docker-compose.ymlのbuildの部分を以下に書き換え
```yml
  web: # アプリケーション名
    build:
      context: .
      dockerfile: "Dockerfile.dev"　←　Dockerfile.devを参照するように変更
```
この状態で、以下コマンドを実行
```bash
docker compose build --no-cache
```

その後、自動生成されたDockerfileの名前をDockerfile.prodに変更

再度、DBをcreate
```bash
docker-compose run --rm web rails db:create

[+] Running 1/0
 ⠿ Container rails_test-db-1  Running                                                          
 
Created database 'app_development'
Created database 'app_test'
```

DB createできました！
SQLAlchemyを学ぶ

## この記事で扱うこと
FastAPIを使用したアプリケーションを開発する際に、SQLAlchemyの扱い方がわからなかったので備忘録としてまとめる。


## ORMとSQLAlchemy
#### ORMとは・・・
オブジェクト指向プログラミングとリレーショナルデータベースの間を仲介する技術のこと。ORMを使用することで、SQLを直接記述せずにオブジェクト操作を行うことができる。

#### SQLAlchemyとは・・・
Pythonで広く使用されているORMライブラリ。テーブル定義、クエリの実行、リレーションシップの定義といった機能を提供する。

以下では、Userクラスがusersテーブルに対応している。
```Python
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)
```

## SQLAlchmyを使用する
1. データベースの設定を行う
    - `database.py`ファイルを作成し、データベース接続を設定する
    - `create_engine`関数を使用して、データベースのURLを指定し、エンジンを作成する
    - `sessionmaker`関数を使用して、セッションを作成するための設定を行う


2. モデルの定義をする
    - `models.py`ファイルを作成、データベースのテーブルに対応するモデルクラスを定義する
    - `declarative_base`関数を使用して、ベースクラスを作成する
    - 各モデルクラスは、Baseクラスを継承して、テーブル名と列を定義する

3. CRUD操作を実装する
エンドポイントを作成し、SQLAlchemyを使用してデータベース操作を行う。

```Python
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from database import SessionLocal, engine
from models import Base, User

app = FastAPI()

Base.metadata.create_all(bind=engine)

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/users")
def create_user(user: User, db: Session = Depends(get_db)):
    db.add(user)
    db.commit()
    db.refresh(user)
    return user
```

- `Session`オブジェクトでデータベースセッションを管理する。
- `query`メソッドを使用することでデータ検索する
- `add`メソッドを使用してデータを追加する
- `commit`メソッドを使用して変更をデータベースに反映する


## マイグレーション
#### マイグレーションとは・・・
データベースのスキーマを変更するための仕組み。テーブル構造を変更する際に、マイグレーションを使用することで、変更を管理し、追跡することができる。


Pythonでは`Alembic`というマイグレーションツールが利用される。SQLAlchemyと連携して動作することでさまざまな機能を提供する。

#### Alembicが提供する機能
- マイグレーションファイルの作成
    - `alembic revision`コマンドを使用して、マイグレーションフィイルを作成する
- マイグレーションの実行
    - `alembic upgrade`コマンドを使用して、マイグレーションを実行し、データベーススキーマを変更する
- マイグレーションのロールバック
    - `alembic downgrade`コマンドを使用して、マイグレーションを元に戻す

マイグレーションを使用することで、スキーマの変更履歴を追跡することができチーム開発を行う場合でも、データベースの変更を共有することができる。また、デプロイ時にデータベースの変更を自動で変更することが可能。

#### Alembicを使用したマイグレーションの設定手順
1. Alembicのインストール
    ```
    pip install alembic
    ```
2. Alembicの初期化
    標準的なディレクトリ名は`alembic`だが、任意に指定することができる。
    
    ```
    alembic init 任意のディレクトリ名
    ```
3. `alembic.ini`ファイルの編集し、データベースのURLを設定する
    下記はPostgreSQLを使用する場合の設定
    ```
    sqlalchemy.url = postgresql://username:password@hostname:port/database
    ```
4. `env.py`ファイルの`target_metadata`変数にモデルのメタデータを設定する
5. マイグレーションファイルの生成
    ```
    alembic revision --autogenerate -m "説明を記載"
    ```
6. マイグレーションの実行し、適用する
    ```
    alembic upgrade head
    ```
ProDyインストール

## この記事について
タンパク質の基準振動解析(Normal Mode Analysis;NMA)を行うためにProDyを使う必要があったので、Macにインストールする方法を残しておきます。記事の内容に間違い等ございましたら、お手数ですがご連絡ください。

## 環境
- MacOS Sonoma 14.5
- 最終動作確認日：2024年5月18日

## ProDyとは？
- Pythonのパッケージ
- タンパク質立体構造や、ダイナミクスの解析に使える(タイトルにも"Protein Dynamics & Sequence Analysis"とある)
- 主成分分析(PCA)や、ANM/GNMを使った基準振動解析(NMA)ができる
- 以下の公式サイトが親切なので、基本はこれを読めば良い
    - [公式サイト](http://www.bahargroup.org/prody/)
    - [インストール方法](http://www.bahargroup.org/prody/manual/devel/develop.html)
    - [GitHubレポジトリ](https://github.com/prody/ProDy/tree/main)

## この記事で使う表記
初めて見たとき何が何やらわからなかった記憶があるので、一応書いておきます。
- `$`：シェルコマンド(今回はMacターミナルの黒い画面で打つコマンド)
- `>>>`：Pythonコード
- `なし`：それ以外(`~/.zshrc`への書き込みなど)

## インストール  
上述の[インストール方法](http://www.bahargroup.org/prody/manual/devel/develop.html)を参考に進める。
Macの場合、まずはGitHubのリポジトリからProDyをcloneしてくる。
```
$ git clone https://github.com/prody/ProDy.git
```
次に、Pythonの環境変数を設定する。以下を`~/.zshrc`に追記して、`source ~/.zshrc`で反映させる(`/path/to/ProDy`は、clone先のpathに適宜書き換える)。
```
export PYTHONPATH=/home/USERNAME/path/to/ProDy:$PYTHONPATH
```
ProDyにはC++で書かれたモジュールがあるらしいので、以下のコマンドでそれらをコンパイルする。
```
$ cd ProDy
$ python setup.py build_ext --inplace --force
```
最後に、pathを通せばインストールは完了である。以下を`~/.zshrc`に追記して、`source ~/.zshrc`で反映させる。
```
export PATH=/home/USERNAME/path/to/ProDy/scripts:$PATH
```

## 動作確認
Pythonを起動して、ProDyをimportする。
```
$ python
>>> from prody import *
```
Protein Data Bank(PDB)から、Villin headpiece(PDBID:[1unc](https://www.rcsb.org/structure/1UNC))という有名なタンパク質を試しにダウンロードしてみる。
```
>>> pdb = parsePDB('1unc')
```
以下のようなメッセージが表示されたらOK。最終行に`577 atoms`と書かれているので、577個の原子で構成されていることがわかる。また`25 coordinate set(s)`とあるのは、PDB上に(NMRで測定された)1uncの構造が25個上がっていることを示す。
```
@> Connecting wwPDB FTP server RCSB PDB (USA).
@> 1unc downloaded (1unc.pdb.gz)
@> PDB download via FTP completed (1 downloaded, 0 failed).
@> 577 atoms and 25 coordinate set(s) were parsed in 0.04s.
```

以上。