OmniAICreator/Qiita-1.07M huggingface dataset:
【SIer日記】プロジェクトの基本ルールを設けて良かったため共有してみた

## はじめに

私は某SIerでSEをやっています。最近開発案件(メンバ5名程度)のプロジェクトリーダーを任されていて、そこで運用しているプロジェクト基本ルールについて、結構よさげだったので考えとともに共有してみたいと思いました。
当たり前のことかもしれませんが、頭の整理程度に書いていきたいと思います。

## 背景

プロジェクト基本ルールを定めた理由としては以下があります。

#### メンバそれぞれに方針の話をするのが面倒(あたりまえ)

当たり前ですが、明言されていないプロジェクト方針は質問されます。
決まっている方針は、何度も説明する羽目になりますし、決まっていない方針はその場で決めて進めますが、忘れてしまっておりバラバラな指示を出して方針がぶれます。

#### ルールを明文化することで属人化を防ぐ

今のプロジェクトは、メインで開発していた人がプロジェクトを抜けてしまっております。また、その人の中で持っていて明文化されていなかったルールがあり、現在それを想像して理解するフェーズが発生しています。これはかなり無駄なので今からでもルールを明文化しようと思いました。
SIerのプロジェクトは人を入れ替えることも多々ありますので、極力俗人化されている知識が無い方が良いです。

#### タスクのフローを用いて、誰がどこまでやるかを定義する

これを決めることで、誰がどこまでやって、次に誰に渡すのかを定義しておきます。そうすることで、誰にも割り当てられていないタスクがなくなります。

#### メンバのタスク実行速度アップ、適切に処理させる

メンバからこんな声がありました。
「聞くほどのことではないと思ったので、迷ったが聞かなかった」
こういった迷いに無駄に時間を費やしていたり、聞かずに誤った処理の仕方を行っていて手戻りになるといったことが起こります。ルールを明文化することでこれらも対処でき、結果的にメンバ全員のタスク速度アップ、適切にタスク処理をさせられます。


## ルール一覧
※基本方針として、以下2点を常に意識
- アクション後はチャットで共有する
- 常にどこかに記録を残す(会話だけで終わらせない)


#### 読み込み資料一覧

プロジェクト参画後に最低限読み込む資料を決めておきます。
どこまで読めば、読み込みタスクは完了するか、頭に最低限入れておく知識を本ルールで縛るイメージです。

#### スケジュール管理表更新ルール

SIerのプロジェクトではWBSやEVMでタスクとスケジュールを管理しがちです。
これをどういった頻度でいつ更新するのかを明言しておきます。
また、どこにスケジュールを記載するかも一緒に記載しておくと楽です。

#### プロジェクト内での質問起票ルール

基本的にプロジェクト内での話はどこかに記録をとり、同じ質問を繰り返さない、ほかのメンバに展開する、といった意識をすることが大事だと考えます。
私たちのプロジェクトでは、質問票を使用し以下のフローで運用しています。

- 質問者は質問表に起票
- プロジェクト用チャットでリーダに共有
- リーダが誰が回答者か判断
  - プロジェクトメンバ内で回答可能なら質問票に回答
  - 他ならリーダが聞きに行き質問票に回答
- リーダが質問者に回答済みであることを報告
- 質問者が回答を確認し、完了ステータスとする

#### 成果物作成後手順
※完了、レビュー中などのステータスはEVM or WBSで管理されているものとします。
※レビュー指摘は指摘管理表で管理されているものとします。

- 成果物作成者はEVM or WBSの該当タスクステータスを「成果物作成完了」とする
- 成果物配置場所(メンバ全員がみられる場所)に成果物を配置
- プロジェクト用チャットでレビュー担当者に成果物と成果物配置場所について連絡
- レビュー者レビュー実施
- レビュー後、指摘管理表に指摘を記載
- 成果物作成者にプロジェクト用チャットで報告
- 成果物作成者は指摘管理表の指摘対応を行う
- 完了したら、成果物作成者はEVM or WBSの該当タスクステータスを「作成完了」とする

#### 設計書修正手順

- プロジェクト用チャットでどの設計書を修正するか報告
- 設計書修正を行う。（どこを変えたかわかるように色を変える）
- 同じ色で該当箇所がわかるように改版履歴を記載する
- プロジェクト用チャットでレビュー者を立て、レビュー実施


## さいごに

上記のような基本ルールを運用することでメンバからは「迷いがなくなりスムーズにタスク実行ができるようになった」という声があったのでやってよかったなと思います。
ルールを明言するだけで効果があるならやらない手はないのでは？
今後明言すべきルールがあれば追加していきたいと思います。
あたりまえのことしか書いてませんが、誰かの参考になれば幸いです。
チーム/個人の活動管理アプリ「シュッキン」をリリースした！！🎉

# はじめに
**チーム/個人の活動管理アプリ「シュッキン」** をリリースしたので、どんなふうに使えるのかを紹介する！


# アプリ概要
![シュッキン](https://aidea-hp.s3.ap-northeast-1.amazonaws.com/shukkin_promo.png)

**シュッキンは、チームの活動を記録し、進捗を可視化するためのサポートを行う。活動の記録をシンプルにし、チームメンバーがどんな作業をしているかをリアルタイムで把握できる。これにより、チーム全体のモチベーション維持につながる。**
* **ワンタップで活動を記録**: 活動開始時に簡単に記録。後から編集も可能なので、抜け漏れを防ぐ。
* **アクティブメンバーの可視化**: 誰が活動中かすぐに確認でき、必要なタイミングで迅速にコミュニケーションを取れる。
* **活動データをグラフ化**: チームや個人の活動状況をデータで見える化。効率向上のためのフィードバックが可能になる。

**シュッキンを使えば、リモートワーク中の活動が一目でわかり、チーム全体のコミュニケーションと効率が向上する。**

↓からダウンロードできます！

https://apps.apple.com/jp/app/%E3%82%B7%E3%83%A5%E3%83%83%E3%82%AD%E3%83%B3/id6504806607

<img width=30%><img width=40% alt="シュッキン_QRコード" src="https://aidea-hp.s3.ap-northeast-1.amazonaws.com/shukkin_qr.png"><img width=30%>
↑パソコンで見てる人はiPhoneでスキャンして、App Storeへ！


**Android版は現在開発中です！公開したらストック済みの方に記事変更通知でお知らせします！本記事をストックしておいていただけると嬉しいです！**

<!--ぜひ一度ダウンロードしてみてください！今はiOS版のみですが、Android版も公開予定。-->



# 機能
### **簡単記録**
活動を始めるタイミングでスワイプして簡単に記録できる。記録を始めるとライブアクティビティが始まって、時間を確認するときやふとスマホを見てしまいそうになっても「あ、今作業中だった」って開こうとするたびに思うことができる。
もちろん過去の活動記録もできるので、もし忘れた時でも安心

<img width=5%><img width=42.5% src="https://aidea-hp.s3.ap-northeast-1.amazonaws.com/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2024-11-12+13.39.01.png"><img width=5%><img width=42.5% src="https://aidea-hp.s3.ap-northeast-1.amazonaws.com/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2024-11-12+13.39.20.png"><img width=5%>






### **現在のアクティブメンバーと月毎の活動記録データ**
誰かが活動を開始すると、一緒に作業しないか？という通知がチームメンバーに届く。さらに、アプリを開くと現在のアクティブなメンバーを確認することができる。
活動記録データも積み上げ棒グラフの形で可視化されており、今月誰が頑張ったか可視化することができる。記録に際し、自分自身のロールをつけることができるのでチームの場合はどのロールの作業に負担がかかってるか確認できる。また、個人で使ってもロールをつけて自分の作業割合を管理することができる。

<img width=5%><img width=42.5% src="https://aidea-hp.s3.ap-northeast-1.amazonaws.com/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2024-11-12+13.39.13.png"><img width=5%><img width=42.5% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788759/0326ae7d-f1f8-db28-52fc-625a9004ba7e.png"><img width=5%>


# 想定ユースケース
* **まだ勤怠管理をしていないスタートアップ**
* **授業のグループワーク**
* **課外活動**

また、個人としても問題なく使える。

# ユーザーの声
* なんやかんやせかせか過ごしているのにタスクが進んでいないことが多くて「あれ 結局今週何してたっけ」と頻繁になってしまうのですが、振り返って見れるおかげでタイムマネジメントがしやすくなりました！
* チームメンバーの活動量が見れて管理がしやすい！**チームメンバーに負けずに活動したくなりました！**
* チーム活動をするときに**メンバーの活動状況がわかるのはいい機能だと思いました！**
* **とっても便利**（開発者本人）

# おわりに
使ってみて！

https://apps.apple.com/jp/app/%E3%82%B7%E3%83%A5%E3%83%83%E3%82%AD%E3%83%B3/id6504806607

お高いんじゃないですか？って聞こえたけど、なんと今だけ無料！


**Android版は現在開発中です！公開したらストック済みの方に記事変更通知でお知らせします！本記事をストックしておいていただけると嬉しいです！**
GitでリポジトリURLを置き換える方法

# はじめに
　Gitで、リポジトリURLを置き換えたい際の設定方法を紹介する。この方法を使うと、Gitリポジトリの移管などで、リモートリポジトリURLが変更された場合に有効。


# 方法

Git Configコマンドで設定する。

グローバルに設定する場合（```--global```オプション）
```bash
git config --global url.{after_url}.insteadOf {before_url}
```
* {after_url} : 置き換え後のURL
* {before_url} : 置き換え前のURL

例: GitLabからGitHubへの置き換え
```bash
git config --global url."https://github.com/".insteadOf "https://gitlab.com/"
```
:::note info
ポイント
置き換えたいURLのみ記載する（Organization名など）
:::

以下のコマンドで確認することができる。
```bash
cat ~/.gitconfig
```

結果例
```bash
[url "https://github.com/"]
    insteadOf = https://gitlab.com/
```

## 複数のURLを1つのURLに置き換えたい場合

グローバルに設定する場合（```--global```オプション）
```bash
git config --global --add url.{after_url}.insteadOf {before_url}
```
* --addを使うと追記可能

例: GitLabおよびBitbucketからGitHubへの置き換え
```bash
git config --global url."https://github.com/".insteadOf "https://gitlab.com/"
git config --global --add url."https://github.com/".insteadOf "https://bitbucket.org/"
```

結果例
```bash
[url "https://github.com/"]
    insteadOf = https://gitlab.com/
    insteadOf = https://bitbucket.org/
```

# まとめ
　Git Configを使い、GitでリポジトリURLを置き換える方法を紹介した。複数のリポジトリURLを1つのURLに置き換える方法も併せて紹介した。Gitリポジトリの移管などで、リモートリポジトリURLが変更された場合に有効。

# 参考

 https://git-scm.com/docs/git-config#Documentation/git-config.txt---add
MacにRuby3.0.7インストールでエラーになってしまう際の対応方法

MacにRuby3.0.7を入れようとした時、エラーになってしまった。
```
❯ rbenv install 3.0.7
/opt/homebrew/bin/ruby-build: line 1158: versions: bad array subscript
==> Downloading openssl-1.1.1w.tar.gz...
-> curl -q -fL -o openssl-1.1.1w.tar.gz https://dqw8nmjcqpjn7.cloudfront.net/cf3098950cb4d853ad95c0841f1f9c6d3dc102dccfcacd521d93925208b76ac8
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 9661k  100 9661k    0     0  34.2M      0 --:--:-- --:--:-- --:--:-- 34.1M
==> Installing openssl-1.1.1w...
-> ./config "--prefix=$HOME/.rbenv/versions/3.0.7/openssl" "--openssldir=$HOME/.rbenv/versions/3.0.7/openssl/ssl" --libdir=lib zlib-dynamic no-ssl3 shared
-> make -j 8
-> make install_sw install_ssldirs
==> Installed openssl-1.1.1w to /Users/k_tetsuhiro/.rbenv/versions/3.0.7
==> Downloading ruby-3.0.7.tar.gz...
-> curl -q -fL -o ruby-3.0.7.tar.gz https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.7.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20.2M  100 20.2M    0     0  11.3M      0  0:00:01  0:00:01 --:--:-- 11.3M
==> Installing ruby-3.0.7...

WARNING: ruby-3.0.7 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

ruby-build: using libyaml from homebrew
-> ./configure "--prefix=$HOME/.rbenv/versions/3.0.7" "--with-openssl-dir=$HOME/.rbenv/versions/3.0.7/openssl" --enable-shared --with-libyaml-dir=/opt/homebrew/opt/libyaml --with-ext=openssl,psych,+
-> make -j 8

BUILD FAILED (macOS 15.1 on arm64 using ruby-build 20241105)
```

どうやらbuildにopenssl1.1系が必要らしい。
また、さらにpatchを当てるなどひと工夫しないとbuildができなかった。
そこでこの記事ではどのように解決したかを記載していきます。


## openssl 1.1のインストール
`brew install openssl@1.1` で本来ならインストールできるのだが、2024/10/24をもってEOLされてしまった。openssl1.1系が入ってない場合はこの記事を参考にインストールする

https://qiita.com/k-tetsuhiro/items/70843c746e3c185378f8



## Ruby 3.0.7をpatchを当てながらインストールする

■ patchを当てるために、まずは下記内容をそのままコピーして、ruby-3.0.x.patchという名前でファイルを作って保存する
```ruby-3.0.x.patch
--- ext/bigdecimal/bigdecimal.c.orig	2024-09-25 16:24:50
+++ ext/bigdecimal/bigdecimal.c	2024-09-25 16:25:15
@@ -65,7 +65,7 @@
 static ID id_half;
 
 /* MACRO's to guard objects from GC by keeping them in stack */
-#define ENTER(n) volatile VALUE RB_UNUSED_VAR(vStack[n]);int iStack=0
+#define ENTER(n) volatile VALUE vStack[n];int iStack=0
 #define PUSH(x)  (vStack[iStack++] = (VALUE)(x))
 #define SAVE(p)  PUSH((p)->obj)
 #define GUARD_OBJ(p,y) ((p)=(y), SAVE(p))

```
<br>

■ patchを当てながらインストールする、またLDFLAGSとCPPFLAGSをhomebrewで入れたopenssl@1.1のものを使うように指定する

```
cat /path/to/ruby-3.0.x.patch | LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib" CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include" rbenv install --patch 3.0.7
```
※`/path/to/ruby-3.0.x.patch`はあなたが保存したMacのファイルパスを指定する

これでbuildが通りruby3.0.7がインストールされる

## 参考サイト
https://github.com/rbenv/ruby-build/discussions/2185
を参考にpatchを当てました
MacにEOLとなったopenssl 1.1を入れる方法

この記事はMacにEOLされたopenssl1.1系をどうやって入れたかの記事です。

## homebrewでinstallするとエラーになってしまう
```
❯ brew install openssl@1.1
==> Auto-updating Homebrew...
Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with
HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Downloading https://ghcr.io/v2/homebrew/portable-ruby/portable-ruby/blobs/sha256:303bed4c7fc431a685db3c3c151d873740114adbdccd23762ea2d1e39ea78f47
############################################################################################################## 100.0%
==> Pouring portable-ruby-3.3.6.arm64_big_sur.bottle.tar.gz
==> Auto-updated Homebrew!
Updated 4 taps (ngrok/ngrok, heroku/brew, homebrew/core and homebrew/cask).
==> New Formulae
azqr                   comtrya                onnx                   tcl-tk@8               typos-lsp
==> New Casks
aide-app         ba-connected     bobhelper        fathom           font-parkinsans  lunatask         mythic
==> Deleted Installed Formulae
pkg-config ✘

You have 19 outdated formulae and 2 outdated casks installed.

Error: openssl@1.1 has been disabled because it is not supported upstream! It was disabled on 2024-10-24.
```
→どうやら、openssl1.1が2024/10/24でEOLされてしまったようだ。
そのため `過去のversionに戻して無事にopenssl1.1入れる` という方法で対応することに。


#### 過去のversionに戻してopenssl1.1をインストール

```
brew search openssl@1.1
```
→まずはopenssl@1.1があるのを確認する。ここのリストにあるがたぶんインストールできない人はopenssl@3がデフォルトになっているはず。  


```
brew tap-new あなたのユーザー名/openssl@1.1
```
→ localにtapを作成する。あなたのユーザー名はどんな文字列でもOK。
→ `/opt/homebrew/Library/Taps/あなたのユーザー名/homebrew-openssl@1.1` をメモしておく
　

```
curl https://raw.githubusercontent.com/Homebrew/homebrew-core/df0c4994aa4b2d61a86d38f4b954e8315dc4678c/Formula/o/openssl@1.1.rb -o /opt/homebrew/Library/Taps/あなたのユーザー名/homebrew-openssl@1.1/Formula/openssl@1.1.rb
```
→さっきtap際にメモしたところにソースをダウンロードする。
ちなみに、このコミットハッシュ`df0c4994aa4b2d61a86d38f4b954e8315dc4678c` がEOLされる前の最後のコミットハッシュになっているため、これを指定してダウンロードしている。
　

```
brew install あなたのユーザー名/openssl@1.1/openssl@1.1
```
→tapしたものを指定してopenssl1.1をインストール。
これで無事にインストールできる。

### 参考記事
https://zenn.dev/itouuuuuuuuu/articles/a4227c9f25b82a
OSの基礎解説

自分でOSを1から作ってみる Advent Calendar 2024の3日目です。
# そもそも昨日書いたコードは何をしているのか
昨日書いたコードが何をしているのかが分からなければ、これからのことはさらに分からなくなると思いますので、説明しておきます。
昨日書いたコードはアセンブラ(NASM)で作りましたが、ブートセクタはバイナリです。バイナリというのは2進数のみで書かれているコードで、PCが直接認識できるのはこの形式のみです。実際に、昨日作った```boot.bin```はバイナリで、バイナリエディタを使えば確認することができると思います。そして、普通のテキストエディタで開いても文字化けして見ることができないと思います。
そして、このコードがなぜ実行されているのかというと、コンピュータの電源が入ると最初にBIOSが実行され、まずシステムの基本的なハードウェアをチェックし、正常に動作するか確認します。そしてその後、BIOSはブートデバイス（HDD、USB、CD-ROMなど）の先頭セクタ（最初の512バイト）を探し、この512バイトのデータがブート可能なものであるかをチェックし、ブートデバイスに有効なブートセクタが見つかると、BIOSはこの512バイトの内容をメモリの```0x7C00```番地にロードします。そして、CPUの制御を```0x7C00```番地に移し、このアドレスからプログラムが実行されるように設定されるからです。ちなみに先頭セクタがブート可能かどうかは最後の2バイトが```0xAA55```であるかどうかで判断しています。
# boot.asmのコードの説明
ここでは機能書いたコードを1から解説していますが、アセンブリがわかる人とかにとってはあまり必要ない話だと思いますので、読み飛ばしてもらっても大丈夫です。
```nasm:boot.asm
org 0x7C00
```
```org```というのはアセンブリの「起点アドレス」を設定する命令で、BIOSはブートローダをメモリのアドレス```0x7C00```に読み込むため、ここでプログラムの起点を```0x7C00```に指定します。
```nasm:boot.asm
mov ax, 0xB800   ; テキストモードのビデオメモリのアドレス
mov es, ax
```
```0xB800```は、テキストモードでのビデオメモリのセグメントアドレスです。
```mov ax, 0xB800```で、ビデオメモリのアドレスを```ax```レジスタに格納します。
```mov es, ax```で、このアドレスを```es```（Extra Segment）に設定します。```es```を使うことで、以降のコードで```[es:di]```に書き込みを行うと、ビデオメモリにアクセスできます。
```nasm:boot.asm
mov di, 0
```
```di```は```es```と組み合わせてアドレス指定に使われます。ここでは、ビデオメモリの先頭位置（左上）を示す0を設定しています。
```nasm:boot.asm
mov si, message
```
```si```（Source Index）に```message```のアドレスを格納します。これにより、```message```で定義された文字列のデータを1文字ずつ読み取ることができます。
```nasm:boot.asm
print_char:
```
ここから、```message```内の各文字を順に読み出し、ビデオメモリに書き込むループが始まります。
```nasm:boot.asm
lodsb
```
```lodsb```は、```si```が指しているメモリから1バイトをalレジスタにロードし、```si```を自動的にインクリメントする命令です。
ここでは、```message```から1文字ずつ```al```にロードし、```al```に格納された文字をビデオメモリに表示します。
```nasm:boot.asm
cmp al, 0        ; 終端をチェック
je hang          ; 終端なら停止
```
```cmp al, 0```で、```al```の内容が0かどうかを確認します。
0は文字列の終端を示す特殊な文字で、もし0なら```je hang```により、```hang```ラベル（無限ループ）にジャンプして表示を終了します。
```nasm:boot.asm
mov [es:di], al
inc di
```
```mov [es:di], al```で、```al```にロードした文字をビデオメモリの現在の位置に書き込みます。
```inc di```で、ビデオメモリのカーソル位置を1バイト分進めます。
```nasm:boot.asm
mov byte [es:di], 0x07
inc di
```
```mov byte [es:di], 0x07```で、表示する文字の色属性を指定します。```0x07```は白色を意味します。
```inc di```で、再度カーソル位置を進めます（1文字分の位置を確保するため、2バイト進める必要があるので```inc di```を2回使用しています）。
```nasm:boot.asm
jmp print_char
```
```print_char```ラベルに戻り、次の文字を表示するためにループを継続します。
```nasm:boot.asm
hang:
    jmp $
```
メッセージの表示が終わった後、無限ループに入ります。このループは、プログラムが終了しないようにするためのものです。
```jmp $```で現在のアドレスにジャンプすることで、プログラムを停止させています。
```nasm:boot.asm
message db "hello, world", 0
```
0は終端文字で、この文字が出てきたらループを終了するようにしています。
```nasm:boot.asm
times 510-($-$$) db 0
```
ブートセクタは必ず512バイトである必要があり、残りのバイトを0で埋めて512バイトにしています。
```($-$$)```は現在の位置からプログラムの開始位置までのバイト数を表し、```510-($-$$)```で埋めるべきバイト数を計算しています。
```nasm:boot.asm
dw 0xAA55
```
ブートセクタの最後の2バイトには必ず```0xAA55```という署名が必要です。この署名がないと、BIOSはこのコードをブートセクタとして認識しません。
【Tableau】集計表の数値に応じて背景色を付ける方法

備忘録としての記録します
### 集計表の背景色について
Tableauでクロス集計表を作成した場合、
網掛けの書式設定から行・列に対して背景色を設定できる。
だが、この値の以上の場合に背景色を変えたいといった動的に変更した場合は少し工夫が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/e764139f-9b71-73c3-543d-6121ab109da3.png)

### 手順
１． マーク部分の空きスペースを右クリックし、「新しい計算」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/1d57b12c-888a-b228-5736-7bf643859a76.png)
２． 数字の「1」と入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/1826e83f-c8c1-7493-66be-18ad37f2ca90.png)
３． 合計(1)という項目ができるため、マークを「自動」から「棒」に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/ee735594-6ec9-e0c2-54a7-6cc7862c9902.png)
４． 合計(1)の項目を「詳細」から「サイズ」に変更し、サイズを最大まで大きくする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/60a5cf0f-89ac-3d37-c612-c13b0ca1e671.png)
５． その後、色として集計値を複製・設定し、条件に応じて色が変わるようにIF文を記載する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3437732/65309e1a-2214-292b-aeb3-cec15c853eec.png)
※書式設定の背景色よりもマークに設定されている色の方が優先される
EC2 インスタンスにEBSボリュームは必要？使わないケースもある？

Amazon EC2 インスタンスにおいて、**EBS (Elastic Block Store) ボリューム**は必須ではありませんが、ほとんどのケースで **EBSボリュームを使用することが推奨されます**。理由とともに、EBSボリュームの役割や、必須でないケースについて説明します。

### 1. **EBSボリュームとは？**
Amazon EC2 インスタンスにアタッチする **EBSボリューム**は、永続的なストレージを提供します。これにより、インスタンスが停止したり終了したりしても、データは保持されます。EBSボリュームはインスタンスのOSディスクとしても、データディスクとしても使用できます。

### 2. **EBSボリュームが必須でないケース**
実際には、EBSボリュームは必須ではありません。例えば、以下のような場合はEBSを使用せずにEC2インスタンスを運用することも可能です。

#### a. **インスタンスストアを使用する場合**
EC2インスタンスには、**インスタンスストア**（または「エピソディックストレージ」）と呼ばれる、一時的なローカルディスクがある場合があります。このストレージは、インスタンスを起動したときに自動的に提供され、インスタンスの終了時にデータが消失します。

- **インスタンスストアの特徴**:
  - インスタンスの一部として提供され、インスタンスが終了するとデータが失われるため、永続的なストレージとしては不適切です。
  - 高速な読み書きが可能ですが、データの持続性がないため、データ保存が重要な場合には適していません。
  - 使用可能なインスタンスタイプには制限があり、すべてのインスタンスタイプでインスタンスストアが提供されるわけではありません（例: `t2`, `m5` などのインスタンスではインスタンスストアがないことがあります）。

インスタンスストアを使用する場合、EBSボリュームは必須ではなく、インスタンスのデータをローカルストレージに保存することができます。

#### b. **EFS (Elastic File System) や S3 を使用する場合**
EBSボリュームを使用せずに、**Amazon EFS (Elastic File System)** や **Amazon S3** などの他のストレージサービスを使用することもできます。

- **Amazon EFS**: 複数のEC2インスタンスで共有アクセス可能なファイルストレージサービスです。EBSよりもスケーラブルで、分散型ファイルシステムとして複数のインスタンスからのアクセスを容易にします。
- **Amazon S3**: オブジェクトストレージサービスで、ファイルやデータを永続的に保存するために使用できます。EC2インスタンスとは直接的に関連付けられませんが、APIを介してデータをアップロードしたり、ダウンロードしたりできます。

これらのサービスを使用する場合、インスタンスのローカルストレージ（EBSやインスタンスストア）を使用しない選択肢として利用できます。

### 3. **EBSボリュームが推奨される理由**
ほとんどの使用ケースでは、EBSボリュームを使用することが推奨されます。理由は以下の通りです。

#### a. **永続性**
EBSボリュームに保存されたデータは、インスタンスが停止したり終了したりしても失われません。インスタンスストアとは異なり、インスタンスが終了してもEBSボリュームのデータは保持され、別のインスタンスに再アタッチすることもできます。

#### b. **バックアップとスナップショット**
EBSはスナップショット機能を提供しており、ボリュームの状態を保存することができます。スナップショットは別のリージョンに保存したり、新しいボリュームとして復元することが可能です。このため、データのバックアップや災害復旧が容易に行えます。

#### c. **パフォーマンスのカスタマイズ**
EBSボリュームは、使用するストレージタイプに応じてパフォーマンスを選択できます。たとえば、**io1**（プロビジョンドIOPS）を使用すれば、非常に高いパフォーマンスを提供でき、**gp3**や**gp2**ではコストとパフォーマンスのバランスを取ることができます。

#### d. **スケーラビリティ**
EBSボリュームは、サイズやパフォーマンスを動的に変更できます。必要に応じてボリュームを拡張したり、ストレージ容量を増加させることができるため、柔軟に運用できます。

#### e. **インスタンスの終了後のデータ保持**
EBSボリュームはインスタンスの終了後にも保持され、別のインスタンスにアタッチしてデータを利用することができます。一方、インスタンスストアはインスタンス終了時にデータが消失するため、永続的なストレージが必要な場合には適していません。

### 4. **結論：EBSボリュームは必須ではないが推奨**
- **必須ではない**: EC2インスタンスにEBSボリュームは必須ではありません。インスタンスストアを使ったり、外部ストレージ（EFSやS3）を使うこともできます。
- **推奨される理由**: 永続性、バックアップ、スナップショット機能、柔軟なスケーリング、データ保持などの理由から、ほとんどのケースでEBSボリュームを使用することが推奨されます。

したがって、用途や要件に応じて、EBSを使うかどうかを決定することになりますが、データの永続性が重要な場合や、パフォーマンス要件が厳しい場合にはEBSを使用するのが一般的です。
Haskellでラムダ計算：乗算編

加算に引き続いてラムダ計算の乗算についてやっていきます。
乗算のラムダ式は以下のようになります。

$$\lambda x y a .x(ya)$$

例えば、$3$かける$3$は
$$(\lambda x y a .x(ya))\textbf{3}\textbf{3}\rightarrow\lambda a.\textbf{3}(\textbf{3}a)$$

$$\textbf{3}a\equiv(\lambda s z.s(s(s(z))))a\rightarrow\lambda z.a(a(a(z)))$$

$$(\textbf{3}a)b\rightarrow a(a(a(b)))$$となるので、


$\textbf{3}(\textbf{3}a)b = (\lambda s z.s(s(s(z))))(\textbf{3}a)b$
$\rightarrow\[\textbf{3}a\](\[\textbf{3}a\](\[\textbf{3}a\]b))$
$\rightarrow\[\textbf{3}a\](\[\textbf{3}a\](a(a(a(b)))))$
$\rightarrow a(a(a(a(a(a(a(a(a(b)))))))))$

```
two s z     = s(s(z))     -- 2
three s z   = s(s(s(z)))  -- 3
mult x y a = x(y a)
add1 x = x + 1

main = do
    print $ mult three three add1 0     -- 3 * 3
    print $ mult two three add1 0       -- 2 * 3

ghci> main
9
6
```
【Tableau】Date関数について

Tableauについてよく利用するDate関数についてまとめる

### DATE
DATEは文字列や数値を日付に変換する。変換できないものはNULLで返す
| 例 | 結果 | 備考 |
|:-:|:-:|:-:|
| DATE(1) | 1900/01/02 | 1900/01/01から+n日の日付を表示 |
| DATE("2023/01/01") | 2023/01/01 | 間が'-'、'/'、','、'.'であればよいみたい（"2023/1-1"でも同様に表示）|
| DATE("20230101") | 2023/01/01 | 8桁の文字列で実際する数値であれば表示される |
| DATE("2023/01/01 00:00:00") | 2023/01/01 | タイムスタンプ型でも日付に変更できる（もちろん桁と実際の数値であれば区切り文字は不要） |
| DATE("2018 September 22") | 2018/09/22 | 年 月 日の並びでないとNULLが返ってくる |
| DATE("9/22/2018") | 2018/09/22 | 数字であればこの並びでも表示される |

### DATEPARSE
DATE関数でも自動で判別できない場合、フォーマットを指定して日付に直すことができる
| 例 | 結果 | 備考 |
|:-:|:-:|:-:|
| DATE("2018?2~22") | NULL | 判別できない |
| DATEPARSE("yyyy?MM~dd", "2018?2~22") | 2018/02/22 0:00:00 | 日付に直すことができる |

### DATEPART・DATENAME
DATEPARTは指定された日付部分を個別の数字として返し、DATENAMEは文字列として返す
※基本的に数値として取り扱った方が高速に結果は返ってくる
| 例 | 結果 | 備考 |
|:-:|:-:|:-:|
| DATEPART('year', #2022/1/1#) | 2022 | 数値型 |
| DATENAME('year', #2022/1/1#) | 2022 | 文字列型 |

### DATEADD
DATEADDは開始日に対して任意の期間を加えた日付を返す
任意の期間を負の整数を入れれば任意の期間を引くこともできる
| 例 | 結果 | 備考 |
|:-:|:-:|:-:|
| DATEADD('week', 1, DATE("2024-1-1")) | 2024/01/08 0:00:00 | 2024年1月1日から1週間足した日付を表示 |
| DATEADD('week', -1, DATE("2024-1-1")) | 2023/12/25 0:00:00 | 2024年1月1日から1週間引いた日付を表示 |

また、よく利用する期間は以下の通り
| 期間 | 備考 |
| :-: | :-: |
| year | 年 |
| month | 月 |
| week | 週 |
| day | 日 |
| quarter | 四半期 |

### DATEDIFF
開始日から終了日の期間を返す（開始日は含めない）
また、開始日が終了日よりも後の場合数値はマイナスを返す
| 例 | 結果 | 備考 |
|:-:|:-:|:-:|
| DATEDIFF('day', DATE("2024/01/01"), DATE("2024/1/3")) | 2 | 2024年1月1日から３日までの日数を出す |
| DATEDIFF('day', DATE("2024/01/03"), DATE("2024/1/1")) | -2 | 2024年1月3日から1日までの日数を出す |
Oracle Instant Clientセットアップのためのリンク集

Oracle DBに接続するためには、基本的にクライアント側にOracle Clientをインストールする必要があります。
しかし、環境設定のたびにパッケージの配布リンクをいちいち探すのが面倒なので、メモとしてまとめました。


# Oracle Instant Clientについて

クライアント用パッケージとしてOracle Instant Clientは以下の8つの形で提供されています。
- Basic
- Basic Light
- SDK
- SQL*Plus
- ツール
- ODBC
- コンパイラ
- JDBC OCIの追加ライブラリ

それぞれの簡単な説明については、[こちら](https://www.oracle.com/jp/database/technologies/instant-client.html)を参照ください。

もっとも基本的な接続手法としてCUIベースのクライアントソフトである`SQL*Plus`があると思いますが、この`SQL*Plus`を使用できるようになるためには以下の２つのパッケージをインストールする必要があります。

- Oracle Instant Client Basic
- Oracle Instant Client Sqlplus

後者のSqlplusパッケージは前者のBasicパッケージに依存しているので、Basic → Sqlplus の順番でインストールします。


# パッケージのダウンロードリンク
ダウンロードは以下のリンクからできます。

- **Linux x86-64用**
  （https://www.oracle.com/jp/database/technologies/instant-client/linux-x86-64-downloads.html ）
- **Linux ARM (aarch64)用**
  （https://www.oracle.com/jp/database/technologies/instant-client/linux-arm-aarch64-downloads.html ）
- **Windows（x64）**
  （https://www.oracle.com/jp/database/technologies/instant-client/winx64-64-downloads.html）
- **macOS (ARM64)**
  （https://www.oracle.com/database/technologies/instant-client/macos-arm64-downloads.html ）
- **macOS (Intel x86)**
  （https://www.oracle.com/jp/database/technologies/instant-client/macos-intel-x86-downloads.html ）

上では代表的なものを挙げていますが、親元のリンクは[こちら](https://www.oracle.com/jp/database/technologies/instant-client/downloads.html)です。自身の環境がない場合は覗いてみてください。
GithubActionsについて簡単にまとめる

Github Actionsについて、公式ドキュメントを読んで学んだことをまとめる。

https://docs.github.com/ja/actions

### Github Actionsとは
リポジトリに特定のイベントが発生した際に、特定の処理を実行できる仕組み。
例えばissueが作成された時にラベルを付与したりできる。

### Github Actionsのコンポーネント
以下のコンポーネントから成る。

![ワークフロー](https://docs.github.com/assets/cb-25535/mw-1440/images/help/actions/overview-actions-simple.webp "ワークフロー")
※公式ドキュメントより引用

#### ワークフロー
1つ以上のジョブを実行するプロセス。
ワークフローはYAMLファイルで定義される。
リポジトリの`.github/workflows`ディレクトリ以下にYAMLファイルを配置し、YAMLファイルで指定されているイベントが発生した際に、ワークフローが実行される。

#### ジョブ
1つ以上のスクリプトないしアクションから構成されるまとまった処理。
ジョブは既定では並列に実行される。
依存関係を設定した場合、前のジョブが完了してから後続のジョブを実行することもできる。
同じワークフロー内であればジョブ間でデータを受け渡すこともできる。

#### ランナー
ワークフローが実行される仮想環境。

#### ステップ
実行されるコマンド。
シェルコマンドなどが記述される。
予め定義された一覧の処理を実行する「アクション」の指定も可能。
例えば、リポジトリの内容をチェックアウトする`actions/checkout`など。

### 実際に試したコード
```yml:.github/workflow/github-actions-test.yml
name: Github Actions Test            #ワークフローの名称
run-name: test-action                #アクションログに表示される名称
on:                                  #ワークフローが実行される条件を以下に記載
  workflow_dispatch:                 #手動で実行された時
jobs:                                #ジョブの定義
  test-job:                          #ジョブ名称
    runs-on: ubuntu-latest           #実行環境の指定
    steps:                           #実行されるコマンドの指定
      - name: Step1                  #ステップの名前
        run: whoami                  #実行するコマンドを記述
      - name: Step2
        run: pwd
  checkout:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4    #アクションを指定する場合はusesを使用する
        
      - name: ls directory
        run: ls ${{github.workspace}}
```
Dockerコンテナが起動しない？不要なリソースをクリーンアップしよう

Dockerの不要なデータやコンテナ、イメージ、ボリュームを削除してディスクの空き容量を確保するには、いくつかの方法があります。以下に一般的な方法を紹介します。

### 1. 未使用のコンテナを削除
停止しているコンテナや、もはや必要のないコンテナを削除するには、以下のコマンドを使用します。

#### 停止しているコンテナを削除
```bash
docker container prune
```
このコマンドは、停止しているすべてのコンテナを削除します。

#### 特定のコンテナを削除
特定のコンテナを削除するには、コンテナIDや名前を指定して次のコマンドを実行します。
```bash
docker rm <コンテナIDまたは名前>
```

### 2. 未使用のイメージを削除
不要なDockerイメージを削除するには、以下のコマンドを使用します。

#### 使用されていないイメージを削除
```bash
docker image prune
```
このコマンドは、未使用のイメージ（タグがついていないものや、他のコンテナに使われていないもの）を削除します。

#### 全ての未使用イメージを削除
さらに徹底的に削除したい場合、以下のコマンドで使用されていないすべてのイメージを削除できます。
```bash
docker image prune -a
```
このコマンドは、未使用のイメージや、参照されていないタグがついたイメージをすべて削除します。

### 3. 未使用のボリュームを削除
Dockerボリュームは、コンテナとデータを保存するために使用されます。使用されていないボリュームは削除できます。

#### 未使用のボリュームを削除
```bash
docker volume prune
```
このコマンドは、どのコンテナにもマウントされていない未使用のボリュームを削除します。

#### 特定のボリュームを削除
```bash
docker volume rm <ボリューム名>
```

### 4. 使用されていないネットワークを削除
コンテナ間の通信に使用されているネットワークが不要な場合、削除できます。

#### 未使用のネットワークを削除
```bash
docker network prune
```

### 5. 全体的にゴミを削除
上記の方法を組み合わせて、すべての不要なデータを一度に削除したい場合は、次のコマンドを実行します。

```bash
docker system prune
```
このコマンドは、停止したコンテナ、未使用のイメージ、未使用のネットワーク、未使用のボリュームをすべて削除します。

#### すべてを強制的に削除
さらに厳密に削除したい場合、以下のオプションを追加できます。
```bash
docker system prune -a --volumes
```
これで、すべての未使用のイメージ、ボリューム、コンテナ、ネットワークが削除されます。

---

これらのコマンドを実行することで、不要なDockerのリソースをクリーンアップし、ディスクの空き容量を増やすことができます。ただし、必要なデータまで削除してしまわないように注意してください。
メソッドの副作用とは

- メソッドを実行した際に（何かしらの影響で）オブジェクトの内部状態などが更新され、そのメソッド自身や、他のメソッドの振る舞いに影響を与えること
例）
    - 実行する毎に何が取得できるのか分からない
        - 現在時刻の取得
        - グローバル変数の参照
        - ファイルやDBからの読み込み
        など
    - 入力だけで終わってしまうと、何を入力したかテストできないもの
        - ファイルやDBへの書き込み
        - 標準出力（何も指定されなかったときに使われる出力先）
        など
- 一般的には、副作用を持たないメソッドよりもテストが難しくなる


#### 参考サイト、文献
https://qiita.com/suzuki-hoge/items/bad43630ad1ad723ca4a

- 渡辺修司.JUnit実践入門── 体系的に学ぶユニットテストの技法.技術評論社, 2012, p.45, p.359

https://wa3.i-3-i.info/word11637.html
WSL2, VSCodeを使ったら、git diff はないのに、VSCodeのgitが全てのファイルに差分ありと判定してしまった。

# 背景
今まで、ポートフォワーディングを使って、EC2 インスタンスで開発をしていたが、お金を節約するために、ローカルで開発することにした。
Windows なので、WSL2 を使って環境構築しようとしたが、git diff は一切ないのに、VSCodeの git が全てのファイルを差分あり判定してしまう。

# WSL2, VSCode を正常に使う方法
## (1)
WSL2 上で、目的のレポジトリを cloneする。

```
~$ git clone git@github.com:XXX/YYY.git
```

## (2)
VSCode で開こうとすると、Linux フォルダが表示されないので、`git clone` したレポジトリを開けない

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/1d8a1586-8bc4-7bb9-fe2f-b7b3ffe36528.png)

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/6d837e1e-77fe-493d-3b94-1f0156842c2c.png)

## (3)
VSCode の左下をクリックして、`Connect to WSL` を選択する。
※ 下記の画像は二回目以降なので、`Connect to WSL`と表示されてるが、初めてのときは、もっと下の方の`WSL`という選択肢をクリックした気がする。
これで、先ほど開けなかったレポジトリを開くことができる。

![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/215844ab-e523-bcd7-9a9e-5cfec759307c.png)

![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/271199e6-23b5-eb30-50f7-ec1d228afdd4.png)

![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/25ff8ae3-e47a-8d96-2277-b914b9de2504.png)

# 遭遇したエラー
上記の手順のように、VSCode の左下をクリックして WSL に切り替るようなことはせず、`code`コマンドで無理やりレポジトリを開いたので、下記のように大量の差分が出た。
これは何が原因だろうか。
![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508161/992021a4-871a-2f50-bac9-a68074ac8bae.png)



# 参考

https://www.reddit.com/r/bashonubuntuonwindows/comments/ee2s68/vscode_wsl_git_line_endings_crlflf_i_cant_get_it/

https://imgur.com/a/t2ZeJ7X
Amazon Aurora Cluster のリーダーエンドポイントに騙されないで！

# はじめに
最近はクラウドに触れる時間が減少気味の [@\_\_\_nix___](https://twitter.com/___nix___)  です。

# 背景
みなさん、Amazon Aurora を利用されている方も多いかと思います。

https://aws.amazon.com/jp/rds/aurora/

更新系のエンドポイント(Writer Endpoint)と参照系のエンドポイント(Reader Endpoint)が分かているのは非常に嬉しい機能の一つですね。

# 概要

今回、この参照系エンドポイント(Reader Endpoint)の落とし穴をご紹介しようと思います。

既に常識になっている方もいるかと思いますが、この Reader Endpoint 経由で接続してもデータの更新が出来てしまうケースがあります。

「DBユーザーは更新権限を与えているが、 Reader Endpoint に接続しているので安心！」という方は注意です。


# 詳細

## 一般的な Aurora Cluster

Writer Instance と Reader Instance (Replica) の一般的な構成です。
今回この構成になっている場合は「安心」して頂いて構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/5354fc18-2248-257c-6cef-2a11cd520e01.png)

## Writer Instance 単体の Aurora Cluster

以下のように Writer Instance のみで運用している場合は「注意」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/cffce6ad-be0b-e363-799f-d3d896dbbd8b.png)

このような構成でも Amazon Aurora では Writer Endpoint と Reader Endpoint をあたかも問題が無いかのように提供してくれますが、ポイントは「★Reader Endpoint」の部分です。

この構成の場合、「★Reader Endpoint」に接続しても更新系クエリ（INSERT/UPDATE/DELETE）が実行できてしまいます。

:::note alert
「Reader Endpoint に接続していたのに Where句 付けずに UPDATE を実行してしまった！」と言った大事故に繋がる可能性があります。
:::

# 解説

元々 Writer と Reader の権限はインスタンス単位で設定されています。

つまり、Writer Instance のみが存在する場合、権限は Writer の設定になっていますので、 Reader Endpoint に接続しても接続しているのは Writer Instance であるということです。

Reader Endpoint と Writer Endpoint のIPを調べてみると以下の通りIPが同じ（＝Writer も Reader も同じインスタンス）であることが分かります。
```
# dig <Reader Endpoint> a +short
xxxx.<region>.rds.amazonaws.com.
192.0.2.86

# dig <Writer Endpoint> a +short
xxx.<region>.rds.amazonaws.com.
192.0.2.86
```

**【付録】RDS Proxy を利用しているケース**

RDS Proxy で単体運用している場合、RDS Proxy で Reader に繋いでもエラーとなるのでこのような事故には繋がりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/c3dd5df5-2e12-a11d-2073-64e947f9d473.png)

これについては公式サイトでも以下のように記載されています。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/rds-proxy-endpoints.html#rds-proxy-endpoints-reader

> 注記
> 
> 新しいエンドポイントが読み取り専用であることを指定する場合、RDS Proxy は Aurora クラスターに 1 つ以上のリーダー DB インスタンスがあることを必要とします。場合によっては、プロキシのターゲットを、シングルライターのみを含む Aurora クラスターに変更することがあります。この場合、リーダーエンドポイントへのリクエストはすべてエラーになり、失敗します。プロキシのターゲットが Aurora クラスターではなく RDS インスタンスである場合も、リクエストは失敗します。

# 結論

Writer Endpoint を使って参照権限を付与する運用のケースでは必ずレプリカを作成し、Reader Instance を作成するようにしましょう。

また、Serverless v2 等で運用している場合も、Writer がスケールしても Writer でしかありませんので、Reader Endpoint を利用する時は明示的に Reader Instance を作成しましょう。

# 終わりに

「Reader Endpoint に接続していれば安心」と思っていた方がおりましたら注意しましょうね。
参照権限だから雑に扱っても大丈夫ってことにはなりませんので。


# 一言

この記事良かったと少しでも思って頂けたら是非 [@\_\_\_nix___](https://twitter.com/___nix___) をフォローしてあげてください。或いは記事に対してリアクションをお願い致します。
【AWS】EventBridgeSchedulerでCreateExportTaskを実行し、S3へログ転送を行った際にはまったこと

## はじめに
CloudWatchLogsにたまったログをS3に保管する必要があったため、EventBridgeSchedulerを利用しログの転送を行おうと考えた

## 設定
基本的には以下の記事通りの設定しました。

Eventbridge Schedulerによる Cloudwatch LogsのS3への出力について考えてみる
https://qiita.com/s-niim/items/ef5a4ac4b19696386d17

Inputのみ以下のように設定します。
(CloudWatchLogs側でログはローテーションするため、あるログすべてを転送する仕組み)
```
{
   "destination": "s3name",
   "from": 0,
   "logGroupName": "loggroupname",
   "to": 253402300799000
}
```
0：1970/01/01 00:00:00(UTC)を表すミリ秒
253402300799000：9999/12/31 23:59:59(UTC)を表すミリ秒


## 何が起こったか
以下のエラーが発生した。
ただし必ずエラーが発生するわけではなく、うまくログの転送が行われることもある。。。
```
An error occurred (InvalidParameterException) when calling the CreateExportTask operation: Specified time range of '0' and '253402300799000' is not valid. Please make sure the values are within the retention period of the log groups and from value is lesser than the to values
```
## 原因
AWSに問い合わせたが、CreateExportTaskのtoで指定する値(桁数)で動作の保証がされている桁数が13桁または14桁らしい。公式リファレンスにも記載がなかったため躓いた・・・

また、15桁でもうまくいった理由については回答できないとのことでした。

## 参考
https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateExportTask.html
Paper & Hacks memo 25... AI(10)

# Paper & Hacks 
## Vol.25 11/12(火) 20:00 〜 21:30 
 「Google Colabによる Llama3.2 / Qwen2.5 のファインチューニング・ハンズオン」
発表者: 松尾研LLMコミュニティメンバー 異業種データサイエンス研究会®代表 井伊篤彦
https://matsuolab-community.connpass.com/event/336318/

### 翻訳
信頼性の高い機械学習 ―SRE原則を活用したMLOps 
https://www.amazon.co.jp/dp/4814400764/

Pythonではじめるバイオインフォマティクス ―可読性・拡張性・再現性のあるコードを書くために 
https://www.amazon.co.jp/dp/4814400373/

## LLM 大規模言語モデル講座 2023コンテンツ
LLM 大規模言語モデル講座 2023コンテンツ
https://weblab.t.u-tokyo.ac.jp/llm_contents/
2023年度のLLM大規模言語モデル講座のコンテンツ公開は終了しました。

［講座詳細］
https://weblab.t.u-tokyo.ac.jp/education/large-language-model/

2023年の講義資料は非営利目的の２次利用が許可されています。

大規模言語モデル Fine-Tuning  東京大学工学系研究科  修士課程   中筋 渉太 
サマースクール2023 大規模言語モデル Day5 
https://speakerdeck.com/schulta/llm-fine-tuning-dong-da-song-wei-yan-llmjiang-zuo-day5zi-liao

>本資料はクリエイティブ・コモンズのCC BY-NC-SA 4.0 DEED(表示 – 非営利 – 継承 4.0 国際)のライセンスが登録されています。
• ライセンスの表示について
• 各スライドのページ最下部にライセンスの記載がございます。再利用時にはこちらの要素も含めてご利用ください。ただしこちらはスライドマスターに設定されている為、再利用時に複製が困難な場合は、下記のテキストボックスを利用の上、ハイパーリンクも含めてライセンスの表記をする様にお願いします。 
LLM 大規模言語モデル講座 講義資料  © 2023 by  東京大学松尾研究室 is licensed under CC BY-NC-ND 4.0 
再利用するページに参照論文等の引用がある場合は、巻末にあるReferenceより引用箇所を掲載してください。(引用元の著作権者に対しての再利用の正当性が証明できなくなる可能性がございます。)


[1] https://huggingface.co/docs/trl/index
[2] https://huggingface.co/docs/trl/sft_trainer
[3] https://arxiv.org/abs/2310.05914
[3] https://huggingface.co/datasets/bbz662bbz/databricks-dolly-15k-ja-gozarinnemon


- Llama3.2 (Meta) 
https://huggingface.co/collections/meta-llama/llama-32-66f448ffc8c32f949b04c8cf
- Qwen2.5 / Qwen2.5-Coder (Alibaba) [9]
https://huggingface.co/Qwen
- BitNet-Llama3 (Hugging Face/Microsoft) [10]
https://huggingface.co/HF1BitLLM
- Gemma2-2b-jpn (Google) [11]
https://huggingface.co/google/gemma-2-2b-jpn-it
-（おまけ）Qwen2.5-Coder [9]
https://huggingface.co/collections/Qwen/qwen25-coder-66eaa22e6f99801bf65b0c2f

ローカルLLMでbolt.newを動かしてみた
https://zenn.dev/robustonian/articles/bolt_new_local


[1] Hugging Face TRL: 
https://huggingface.co/docs/trl/index
[2] Hugging Face SFTTrainer: 
https://huggingface.co/docs/trl/sft_trainer
[3] Neel Jain, Pin-yeh Chiang et al. (2023)  “NEFTU N E: NOISY EMBEDDINGS IMPROVE INSTRUCTION FINETUNING” 
https://arxiv.org/abs/2310.05914
[4] OpenAI Whisper: 
https://github.com/openai/whisper
[5] Hugging Face Llama3.2-1B-Instruct:
https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct
[6] Hugging Face Qwen2.5-0.5-Instruct:
https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct
[7] databricks dolly datasets: 
https://huggingface.co/datasets/bbz662bbz/databricks-dolly-15k-ja-gozarinnemon
[8] VOICEVOX: 
https://github.com/VOICEVOX
[9] Qwen2.5 Coder: 
https://huggingface.co/collections/Qwen/qwen25-coder-66eaa22e6f99801bf65b0c2f
[10] BitNet-Llama3: 
https://huggingface.co/HF1BitLLM
[11] Gemma2 JPN: 
https://huggingface.co/collections/google/gemma-2-jpn-release-66f5d3337fdf061dff76a4f1
文字列をコピーして遊ぶ。(教科書的、やり方)(例題の為の例題)


文字列をコピーして遊ぶ。(教科書的、やり方)(例題の為の例題)


C++ Arduino アルゴリズム M5stack m5nanoC6


参考


https://monozukuri-c.com/langc-funclist-strcpy-memcpy/


x M5NanoC6で使う予定は、未定
x C++とうたいながらC言語
x 文字列bが完全に0クリアされている条件(使い回ししない)(教科書的には、例題中で正しい)
x C言語の学習サイト様の内容を個人学習、企業研修の為に利用しまし、リンクしました。

目的
文字列のコピーする

いろいろ
コピーについては、いろいろな人が関心があるようなので
逃げるように教科書的内容を提示
高速にコピーする場合は、切れ目毎に合わせてDMA転送して割り込みで教えて貰う(はず)
なぜ、納得いかないのかと言うと、文字列bの最後に0がコピーされない事。

オンラインコンパイラ


```c++


#include <stdio.h>
int main(void){
    // Your code here!
    
    char *a = "Alice";
    char b[16] = {0};
    
    
    for(int i = 0; a[i] != 0;i++){
        b[i] = a[i];
    }
    
    printf("b = %s\n",b);
    
}




```



```

b = Alice

```
話題のNapkin AIを触ってみた

## 背景
プレゼンテーション資料向けの画像生成に向いていると話題のNapkin AIを触ってみましたので、Napkin AIについての情報をまとめておきたいと思います。

##  Napkin AIとは
- テキストを視覚的に魅力的なグラフィックや図に自動的に変換するAIツール
- 制限(生成可能な画像数、利用可能な色の数、共同編集不可等)はあるものの無料でも利用可能
- 2024年11月時点では有料プラン(Professional Plan)がβ版であり無料で利用可能
- 2024年9月から日本語のテキストからも正確な図解やコンテンツを生成可能に
- ツールの特徴：
    - 直感的な操作性：デザインスキルがなくても簡単に利用可能
    - 多様な図解形式に対応：グラフ、フローチャート、チャートなど、さまざまな形式の図解を生成可能
    - 編集と共有のしやすさ：生成された図解は簡単に編集でき、PNG、PDF形式でエクスポートしたりリンクで共有可能
- 生成した画像は商用利用可

### 実際にNapkin AIを触ってみた
- Napkin AIの利用する際にまず以下2つのどちらで利用するのか選択する
    - Draft with AI：文章作成、画像生成をどちらも実施する場合に利用
    - Blank Napkin：既に作成済みの文章に対して図を生成する場合に利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917475/02973caf-65c1-80b8-d80e-b53784e9ec15.png)

- Draft with AIを選択するとどのような文章を生成したいのか問われるので入力する
    - 今回は例として「データ通信量の変化について」というお題で実施してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917475/b49decac-63b9-92fe-ada7-d1391c35da28.png)

- お題に対しての文章が自動生成される
    - データ通信量の増加要因/データ通信量の影響など様々な観点で情報をまとめてくれました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917475/0516374f-f163-aeea-7b2f-e4561ce3b068.png)

- 図として整理したい文章を選択すると、様々な図を提案してくれるので、適切だと思うものを選択
    - データ通信の増加要因について端的に図としてまとめてくれました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917475/9dde633a-b607-c4f8-fe97-2136255f19d8.png)

- 図のパターンも多種多様
    - このようにキーワードにあったアイコンなども自動で生成してくれました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917475/20df157d-257a-2ccf-5111-371fc1e84f3a.png)

## Napkin AIを利用してみた感想
:::note info
文章に対する要点の抜き出しや、適切なアイコンの生成の精度に驚きました
:::

:::note info
文章の生成含めNapkin AIで実施できるためゼロベースでのプレゼンテーション資料作成について特に時短できると感じました
:::

## 終わりに
実際にNapkin AIを利用してみて、Napkin AIのようなAIツールを利用している人、してない人でタスクの処理時間等に大きな差がでるように感じました。今後もAIに関する動向についてアンテナを張ってトレンドに乗り遅れないようにしていきたいと思います。
UIScrollViewでヘッダー部を固定する

# やりたいこと

- ズーム、スクロールをしつつヘッダー部を固定したい
    - 過去に投稿した[UICollectionViewでExcelライクなUIを作成する](https://qiita.com/ooooo8/items/c5d0b8d943dc87e33944)ではズームが出来ないため、不採用

# どうすれば良いか

UIScrollViewの子Viewに固定したいViewを配置し、ズームとスクロール時に座標を更新すれば解決！

# コード

``` swift

import UIKit

class ViewController: UIViewController {
    /// UIScrollView
    @IBOutlet weak var scrollView: UIScrollView! {
        didSet {
            scrollView.delegate = self
            scrollView.minimumZoomScale = 1.0
            scrollView.maximumZoomScale = 5.0
        }
    }
    /// UIScrollViewでズームさせるView
    @IBOutlet weak var zoomView: UIView!
    /// ヘッダーView
    @IBOutlet weak var headerView: UIView!
    
    // 座標を更新する
    func updateHeaderViewOrigin(_ scrollView: UIScrollView) {
        // スクロールさせている位置にY座標を移動する
        headerView.frame.origin.y = scrollView.contentOffset.y / scrollView.zoomScale
    }
}

// MARK: UIScrollViewDelegate

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidZoom(_ scrollView: UIScrollView) {
        updateHeaderViewOrigin(scrollView)
    }
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        updateHeaderViewOrigin(scrollView)
    }
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        zoomView
    }
}

```

# 注意点

固定させるViewは必ず**最前面**に表示する
（スクロール時に後ろへいってしまうため、固定されている様にみえない）

# 応用

### 列のみを固定したい場合

列Viewを作成し、x座標を変更する

``` swift
    func updateHeaderViewOrigin(_ scrollView: UIScrollView) {
        firstColumn.frame.origin.x = scrollView.contentOffset.x / scrollView.zoomScale
    }
```

### Excelのような枠固定したい場合

列View/行View/枠固定Viewを作成し、それぞれ座標を更新する

``` swift
    func updateHeaderViewOrigin(_ scrollView: UIScrollView) {
        let x = scrollView.contentOffset.x / scrollView.zoomScale
        let y = scrollView.contentOffset.y / scrollView.zoomScale
        // 先頭行
        headerView.frame.origin.y = y
        // 先頭列
        firstColumnView.frame.origin.x = x
        // 固定枠
        frozenPaneView.frame.origin.x = x
        frozenPaneView.frame.origin.y = y
    }
```
Fsx for NetApp ONTAP 2024年下半期のアップデートを振り返る

こんばんは、小寺です。
もうすぐre:Inventですね。Amazon FSx for NetApp ONTAPの2024年下半期のアップデートについて簡単に振り返ってみたいと思います。

## Amazon FSx for NetApp ONTAPの第二世代ファイルシステムがGAになりました
拡張性と柔軟性を向上させ、512 TiBのSSDストレージから単一の高可用性（HA）ペアで最大6 GB/秒のスループットを提供します。

次世代のファイル・システムは、ネットワーク・バースト・スループット300%、ディスクバーストスループットが150%向上しています。

生成AIのような大規模で高性能なワークロードに対応するため、第二世代のAmazon FSx for ONTAPシステムは、必要に応じてHAペアを追加することで動的な拡張性をサポートし、最大12のHAペアがサポートされます。
従来では、後からHAペアの追加ができなかったため、本機能によりさらに柔軟に拡張ができるようになりました。1 PiBのSSDストレージから最大72 GB/秒のスループットが利用できるようになりました。

### HAペアを追加するときの考慮点
・HAペア追加は可能だが、削除はできない。一時的なパフォーマンスの改善であれば、スループットキャパシティのスケーリングが推奨

・新しいHAペアを追加すると、新しいファイルシステムノードのNVMeキャッシュがデフォルトで有効になる。スループットが高いワークロードでは、無効化が推奨

・新しい HA ペアのパフォーマンスを向上させるには、既存のボリュームの一部を新しい HA ペアに移動し、クライアントを再マウントして接続する必要あり

・iSCSIで接続する場合はHAペアの数が6つ以下、NVMe/TCPで接続する場合は第二世代でかつHAペアの数が6つ以下

### 利用可能なリージョン
2024年7月のGA時点で利用可能なリージョンは以下の4つでした。
・米国東部 (バージニア北部、オハイオ)
・米国西部 (オレゴン)
・欧州 (アイルランド)
・アジアパシフィック (シドニー) 

アップデートがあり、さらに以下の2リージョンで第二世代が利用可能です。
・米国西部 (北カリフォルニア) 
・欧州 (フランクフルト)

## Amazon FSx for NetApp ONTAP が NVMe-over-TCP のサポートを開始
NVMe-over-TCP (NVMe/TCP) ブロックストレージプロトコルのサポートが開始されました。

データベースや仮想デスクトップインフラストラクチャ (VDI) などのブロックストレージワークロードを従来の iSCSI ブロックストレージと比較して低レイテンシーで高速に、iSCSI よりも簡単にマルチパス IO (MPIO)構成ができます。 

サポートされるのは、第二世代です。また前提として、HAペア数は6以下である必要があります。



## Amazon FSx for NetApp ONTAP で、バックアップの復元中にデータを読み取り可能に

バックアップからの復元中にボリュームからデータを読み取れるようになりました。第二世代から「バックアップ復元中の読み取りアクセス」機能により、バックアップ復元に依存する読み取り専用ワークロードの目標復旧時間が最大で17倍向上します。

従来は、バックアップを復元する際、バックアップがボリュームに完全にダウンロードされてから、Amazon FSx はデータへの読み取り/書き込みが可能でした。よって、復元完了するまでデータ容量にもよりますが数分から数時間かかっていました。

本アップデートにより、復元開始してから数分以内に復元が完了していなくともデータへのアクセスができ、より迅速にバックアップからの復元が可能になります。

復元状況をモニタリングするには、以下のCLIコマンドで確認可能です。

``aws fsx describe-volumes``

### まとめ
Fsx for NetApp ONTAPのアップデートについて簡単に振り返りました。
一番大きなアップデートは第二世代のGAですよね。東京リージョンでも利用できるのが待ち遠しいですね。
VS Code における Markdown の独自構文など

# はじめに

Markodown は便利である反面、拡張した性にやや乏しい。そこで、Markdown Preview Enhanced を使うことでリアルタイムで拡張可能になる。まず、独自の構文やスタイルの設定について話していく。

1. [Markdown Preview Enhanced](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced) を VS Code にインストールする。
1. `Ctrl + Shift P` を押す。
1. `Markdown Preview Enhanced: Open Config Script (Workspace)` を選択する。

こうするとワークスペースに `.crossnote` ディレクトリができる。この中の `parser.js` を書き換えると独自構文を使うことができる。最初の状態では以下のようになっている。（2024/11/12）

```js: parser.js
({
  // Please visit the URL below for more information:
  // https://shd101wyy.github.io/markdown-preview-enhanced/#/extend-parser

  onWillParseMarkdown: async function(markdown) {
    return markdown;
  },

  onDidParseMarkdown: async function(html) {
    return html;
  },
})
```

例えば、「カクヨム」や「小説家になろう」、「note」などで使われる振り仮名を振る構文を実装してみよう。

```js: parser.js
({
  onWillParseMarkdown: async function(markdown) {
    // ルビの正規表現にマッチさせる
    return markdown.replace(/｜(.*?)《(.*?)》/g, (match, word, ruby) => {
      return `<ruby>${word}<rt>${ruby}</rt></ruby>`;
    });
  },

  onDidParseMarkdown: async function(html) {
    return html;
  },
})
```

これで、例えば `｜Qiita《キータ》` と書けば <ruby>Qiita<rt>キータ</rt></ruby> と出力される。

# 画像のキャプション

```js
({
  // Please visit the URL below for more information:
  // https://shd101wyy.github.io/markdown-preview-enhanced/#/extend-parser

  onWillParseMarkdown: async function(markdown) {
    return markdown;
  },

  onDidParseMarkdown: async function(html) {
    return  html.replace(/<img src="(.*?)" alt="(.*?)"(.*?)>/g, (match, src, alt, rest) => {
      return `
        <div style="text-align: center;">
          <img src="${src}" alt="${alt}" ${rest}  />
          <div style="font-size: 0.9em;">${alt}</div>
        </div>
      `;
    })
  },
})
```

これで `![画像](./img.jpg)` と書くと画像の下に `画像` と表示される。

# PDF

PDF サイズをA4にするには以下のように先頭に書く。

```yaml
---
puppeteer:
  format: "A4"
---
```
WindowsからLinuxサーバーに公開鍵認証でssh接続するまで

```
ssh-keygen -t rsa -b 4096
scp <ローカルの公開鍵のパス> <サーバーのユーザー名>@<サーバーのIPアドレス>:~/.ssh/

～一旦パスワードでサーバーに接続～

cat <サーバーの公開鍵のパス> >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
```
Python3: paizaラーニング問題集「マップの判定・縦横」やってみた

なんとなく解き方あったなと思ったのでやってみました。

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_map_boss

マップのある場所の四方を調べる的なことなので、マップの廻りを何かで取り囲んでやると場合分けが少なくなる的なことです。

```py:
H, W = map(int, input().split())

BORDERED = tuple(
    (True,) * (W + 2)
        if j == 0
        or j == H + 1
        else
    (True
     , *(i == "#" for i in input())
     , True
     )
    for j in range(H + 2)
    )
    
every_side_surrounded = (
    (j - 1, i - 1)
    for j in range(1, H + 1)
    for i in range(1, W + 1)
    if BORDERED[j - 1][i]
    and BORDERED[j + 1][i]
    and BORDERED[j][i - 1]
    and BORDERED[j][i + 1]
    )

for p in every_side_surrounded:
    print(p[0], p[1])
```
Ubuntu 24.04でFcitxに変更、VS Codeで日本語インライン入力するための設定

## 無駄な前書き
ずっとMac/Linuxユーザーだったのだが、この3年ほど、子どもたちのガイドのためにWindowsをメインに使ってきた。特に最近はラズパイを触る機会も減り、かなり遠ざかっていたが、今月からLinuxに復帰。

まぁ、Ubuntuだよな、ということで、24.04をインストール。Windows11からの移行も特に困るところもなく、逆にアットホーム感。（実は、外付けSSDにインストールするつもりが、Windowsを上書きしたのは内緒。各種クラウドサービスのおかげでほぼ無傷、強制さよならWindows。まぁ、常時通電のWindows11、10もいるので問題なし。）

Chrome Remote Desktopが使えないこと、VS Codeでの日本語入力がおかしいことが課題だったが、後者について解決したので、記録。

# ibus-mozcから、fcitx5-mozcに変更

ibus-mozcがインストールされているが、ラズパイ／ラズパイデスクトップ／Ubuntu／Debianのときもfcitxが好きだったので、変更。英語キーボードを使っていることも関係しているかも？変更方法については、特に難しいところはないため省略。

ただ、VS Codeで日本語がインライン入力できなくなってしまったので、気持ち悪い。それ以前に、ibus-mozcでは2バイト文字の扱いがおかしいという、どうしようもない状態だったが。

# fcitx5-mozc、VS Codeで日本語インライン入力するための設定変更方法

解決方法は、意外と簡単で
**Fcitxの設定／アドオン／X Input Method フロントエンド**　で、
**拡張オプションを表示**　して、　　（追記：これは不要だった。）
**XIM でOn The Spot スタイルを使う（再起動が必要）**　にチェックするだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5412/0cd4a328-ee57-7b29-30da-7d4a743fa901.png)


VS Codeは、XからWaylandへ移行中（中途半端）のようだが、まだ、この設定が有効みたい。Wayland自体がまだイマイチなんだな。
initializeメソッド

# initializeメソッド
>```rb
>User.new
>```
>この時呼ばれるのがinitializeメソッドです。`インスタンスを初期化するために実行したい処理があれば、このinitializeメソッドでその処理を実装`します。（特に必要なければ定義しなくても構いません)。
```rb
irb(main):042* class User5
irb(main):043*   attr_accessor :name, :age
irb(main):044*
irb(main):045*   def initialize(name,age)
irb(main):046*     @name = name
irb(main):047*     @age = age
irb(main):048*   end
irb(main):049> end
=> :initialize
irb(main):050> user = User5.new("Alice", 30)
=> #<User5:0x000000010c12f4a0 @age=30, @name="Alice">
irb(main):051> user.name
=> "Alice"
irb(main):052> user.age
=> 30
irb(main):053> user.age = 40
=> 40
irb(main):054> user.age
=> 40
```
### 失敗した
```rb
irb(main):055* class User6
irb(main):056*   attr_accessor :name, :age
irb(main):057*
irb(main):058> end
=> [:name, :name=, :age, :age=]
irb(main):059> user = User6.new("Alice", 30)
(irb):59:in `initialize': wrong number of arguments (given 2, expected 0) (ArgumentError)
```
https://gihyo.jp/book/2017/978-4-7741-9397-7

* この場合はinitializeメソッドが引数をインスタンス変数に代入していたため今までインスタンス変数の書き換えができていた。しかしそのinitializeメソッドなくなったためインスタンスの状態が無いためexpected 0になると考える

# 感想
railsはinitializeメソッドを使ったことがないので上位のクラスがうまくやって、簡単にできてるのか。
AWS SAP備忘録

[前回](https://qiita.com/_takenoko)からの続きです。

さて自分にとって本丸であるSAP試験。これに受かったら転職活動始めようとずっと思ってたので気合が入ります。
「資格取るに越したことはないけど、別になくてもやりたいって意思と、学習してることをちゃんとアピールすれば割と通るよ」ということも相談してた方からは言われたのですが、如何せん僕は面倒臭い性格なので、最低限取っておかないと筋が通らないと考えてます。頑固。
あと過去にDBが得意という触れ込みで入ってきた人がER図を知らず、結果メンバーが足りず炎上した経験があるため、僕が採用側だったら業務で使用経験なしだけど学習はしてますという人を信用しないというのもある。

今回購入した書籍はこちら
[AWS認定 ソリューションアーキテクト プロフェッショナル](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%EF%BC%86%E5%95%8F%E9%A1%8C%E9%9B%86-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-%EF%BC%A1%EF%BC%B7%EF%BC%B3%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4815617929/ref=asc_df_4815617929?mcid=63e51dbf50543210878bbe2496f2c34a&th=1&psc=1&tag=jpgo-22&linkCode=df0&hvadid=707442440817&hvpos=&hvnetw=g&hvrand=4145552502030188938&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9193764&hvtargid=pla-1945183960042&psc=1&gad_source=1)
解説が用語レベルに留まらず、今回の試験の問題に合わせてちゃんとベストプラクティスを解説してくれているのがありがたい。
過去問は前回同様[Cliud License](https://cloud-license.com/)です。今回もしっかり活躍してくれました。前回記事でも書いたけど、絶対料金設定ミスってるよ、これ...。

先の書籍を一通り読んでから、隙間時間を利用して7問1セットの過去問を解いていき、あまりピンとこなかった箇所については書籍見直したり、ドキュメント見たり。
模試の結果としては
10/16 403
10/20 507
10/22 520
10/29 572
当初は10月中に取りたいと思っており31日に試験申し込みしてたが確実に落ちるため1週間後、11/7にリスケ。
11/3 598
11/5 689
これ、もう1回リスケした方が良いか...?と思ったが、自分の性格上またリスケするとズルズル先延ばししそうだったので、そのまま。
11/6 689
合格点にはやはり届いてないが、まあ前回も本番が一番良かったしイケるだろというアレな思考のもと受験
結果781で合格
なんで...?

SAAとSAPで感じた問題の違いは以下の通り。

### 手拍子で回答ができない
SAAだと特定のキーワードが出たら回答はコレみたいな問題が多く出題されたが、SAPだとそういった問題は出ない。問題読む途中で「あ、これ多分正解の選択肢はこの用語出てくるな」とか考えてたら選択肢4つ全部に該当単語が出てくるというのがザラ。そのためザッと見ての回答だと痛い目を見る。

### チェーホフの銃が成立しない
創作においてチェーホフの銃という用語がある。これは創作における用語の1つであり、「ストーリーで登場するものには必然性がなければならない」という意味である。SAPの特徴として問題文が（回答もだけど）割と長いのだが、その中で特に無くても回答に影響がない、言ってしまえば不要な部分が多く存在する。そのためある程度文章から必要な情報を取捨選択しながら読んでいく必要がある。

### 正解ではなく最適解を
個人的に一番厄介に感じたのはこの部分。選択肢の中で要件を満たせる選択肢が複数存在するということが多々ある。そのため最初の選択肢で要件を満たすことができてもそれがイコール正解の選択肢とは限らない。実は最後の選択肢が最適解なんてことも少なくない。故に途中で正解だと思しき選択肢が出ても全ての回答を読み進める必要があり、結果として時間がギリギリになりやすい。

以上です。
これから受ける方の参考になりましたら幸いです。