OmniAICreator/Qiita-1.07M huggingface dataset:
医師がAtCoderで黄色になった話【色変記事】

rinmaoと申します。
ABC308でついに黄色コーダーとなったので色変記事です。

![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211836/63ef4845-a283-5f52-daa6-7e1cf6235dc1.png)


色変記事は他にも山ほど転がってると思いますが、比較的レート帯に関わらず共通する内容を書いたつもりですので、この記事を少しでも参考にしてくださる人がいれば幸いです。

前回の色変記事もあるのでそちらも是非お願いします。

https://qiita.com/rinmao_catlover/items/bbbf6767a6a028562c80

# 自己紹介
・プログラミング歴6年くらい？趣味でやってる
・メイン言語はPython
・医師


# 精進の取り組み方
自分なりの精進方法をまとめます。

## 精進対象
![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211836/1c941b70-991e-9e00-ceb4-b48467328094.png)


基本的にABCしか解いてないです。
ARCはたまにやってますが、AGCはほぼ手をつけてません。
過去問をひたすら遡っていき、解けなかった問題をストックしておいて暇な時に解き直しています。
その他、典型90問やEDPCなどはやっていました。

atcoder以外のコンテストサイトも全くと言っていいほどやってないです。
やらなくていいと思っているというよりかは、シンプルに時間がないだけです。

## 精進中の意識
**再現性のある考察ができるか**、ということは精進中に常に意識しています。

例えば「DPで解けることは自力では思いつけないが、DPで解けると言われたらコードを書ける問題」みたいな状況はよくあると思います。
こういう問題で学ぶべきは、DPそのものではなく、**DPを使うという結論に至る思考過程**です。
**その思考過程を経ずに解説を見ると、ひらめきや天才的能力が無いと解けない問題に感じてしまいます。**

どうしてもアルゴリズムやデータ構造そのものの勉強をしがちだと思いますが、それと同等に、それらを使用するべき時に引き出せる思考過程を学ぶべきです。
この力を鍛えるには、1つのアルゴリズムの例題を連続して解くのではなく、ABCの実際の問題セットなどでランダムに解くのがいいでしょう。
公式解説だけでなく、Twitterやブログ等で色々な人の思考過程を見るのがすごく勉強になると思います。

## 解く問題のdiff
![img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211836/874d93e2-3ee6-174a-6139-ad3c821f0e64.png)


自分は**現在のレートより2色以上問題はほとんど解きません。**
青色の間は青色diffを解くのがメインで、**黄色diffすらもほぼ解いてない**です。
**1.5-2色以上離れちゃうと、背景知識が足りず、その問題が難しい理由がまず理解できないんじゃないかなと思ってます。**
自分よりも知識も技術もあるかなり強い人達が悩んでいる問題ということなので。
それよりも自分と同等〜1つ下の色を確実に速く解くことを重視すべきという考えです。
たまにTwitter等で2,3色上の問題を解きまくってる人を見ると「なんだかなー」という気持ちになります。
もちろん高diffのテクニックを修得しておいて、一発逆転を狙えるようにするっていうのも考え方の一つですが。


# 競プロへのスタンス
 **いかに高いパフォーマンスを出せるかという<font color="Red">「競技」</font>** だと思っています。
早解きをするのか、得意分野を作って博打的にするのか、実装力をつけるのか、強さの種類は人それぞれです。
自分にとって最も(平均的に)高いパフォーマンスを出せる戦略を取るべきです。

また、通信環境、ジャッジ遅延時の立ち回り、体調管理なども含めて競プロです。
これらを言い訳にすべきではありません。
不測の事態が起こった状況でもいかに最善手を取れるかが大事です。

## 言語選択について
言語選択の有利不利についても度々議論に挙げられるので少しだけ。
これも人それぞれ好きな言語を使うべき、それだけです。
言語間で難易度が変わるような問題に対して文句を言うのはナンセンスでしょう。
そういう言語ごとの得手不得手も含めて「競技」というべきです。
もちろん参加者が広く楽しめるよう、運営は適度な問題を提供すべきではありますが。

ちなみに自分はコンテストではPythonしか使っていませんが、言語仕様や弱点も大体理解しているので、青色になってからくらいは、Pythonを選んでるせいでACできないということはなかったように思います。

# 青色から黄色の過程
正直新しく修得した知識・アルゴリズムはほとんどないです。
ただ、確実にいえるのは、解くスピードが速くなった、精度が上がったことでしょうか。
この期間での精進量もそこまで多くはなく、基本的にABCに参加とその復習がメインでした。

青色→黄色の期間で、新規にコンテスト中にACできたものは
・ちょっと難しいDP(期待値, bit, 桁など)
・ダブリング
・ローリングハッシュ
くらいだと思います。
逆に言えばここら辺かけなくても青色にはなれます。
フロー、LCA、SCCとかは勉強はしていましたけど、コンテスト中に使ったことはないです。

黄色に到達した人の中では比較的アルゴリズム知識が少ないほうじゃないかと思います。

# 最後に
青色になったときは黄色になれるとは思っていませんでした。
ただ、今後積極的にARC/AGCに参加していくかというと微妙なところなので、橙を目指すのは厳しいかな…という気持ちです。
他のコンテストサイトに参加とかはしてみたいかな。
あとはヒューリスティックにほぼ参加しておらずヨワヨワなので、そっちもやっていきたいです。

拙い文章ですが、ここまで読んでくださりありがとうございました。
WezTerm で tmux のような `<prefix>→〇` というショートカットを設定する

## 経緯

Windows上のターミナルエミュレータで作業をしていると、やはり画面を分割したくなることがあります。  
ただそのときに画面を分割する程度でマウスに手を伸ばしたくはないし、Ctrl と何かの同時押しというショートカットはエディタでほぼ使用済み、AltやWinキーは押しづらいので嫌だ…  
ということで tmux のように prefix キーを押してから何か押すタイプの設定ができないか色々探していました。  
色々探した結果、[WezTerm](https://wezfurlong.org/wezterm/index.html)なら実現できたのでメモを残しておきます。

## 設定方法

設定ファイルに以下ように Leader キーと Leader キーを使用するショートカットを書けばできます。

```lua
local wezterm = require('wezterm')

return {
  -- 省略
  leader = { key = 'b', mods = 'CTRL', timeout_milliseconds = 1000 },
  keys = {
    {
      key = '%',
      mods = 'LEADER|SHIFT',
      action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' },
    },
    {
      key = '"',
      mods = 'LEADER|SHIFT',
      action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' },
    },
  }
```

上の例は、ほぼそのままWezTerm公式のドキュメントにも記載されています。   
tmux における prefix キーは、WezTerm では Leader キーと呼ぶようで、その用語の違いのせいもあってかこのページにたどり着くのに結構かかってしまいました。

https://wezfurlong.org/wezterm/config/keys.html#leader-key


## 余談

ちなみに、試したり調べてみてダメだったのは下記の通りです。

- Windows Terminal: 画面分割はできるが `<prefix>→〇` というショートカットは設定できない。さらに最近 IME 関連でよくクラッシュして辛い。
- WSL + tmux: 他諸般の事情により WSL は却下。
- Alacritty: 画面分割する機能がない。
- zellij: Windowsをサポートしていない。[Issue](https://github.com/zellij-org/zellij/issues/316)は存在していてるものの難度が高いようであまり進んでいない。(自分でもちょっと試してみたけど辛そうだった)
MacOSで `undefined symbols` のリンクエラーが発生する(binutilsが悪さする)

はじめに
-----
MacOS上でasdfを使用して`erlang`をインストール時に以下のエラーが発生した。
```
LD  /Users/xxxx/.asdf/plugins/erlang/kerl-home/builds/asdf_26.0/otp_src_26.0/lib/erl_interface/bin/x86_64-apple-darwin22.4.0/erl_call
 ld: warning: ignoring file /Users/xxxxxx/.asdf/plugins/erlang/kerl-home/builds/asdf_26.0/otp_src_26.0/lib/erl_interface/obj/x86_64-apple-darwin22.4.0/libei.a, building for macOS-x86_64 but attempting to link with file built for macOS-x86_64
 Undefined symbols for architecture x86_64:
   "___erl_errno_place", referenced from:
         _main in erl_call-456a49.o
   "_ei_connect", referenced from:
         _main in erl_call-456a49.o
```
このエラーを調査して、表題のとおり`binutils`が影響している事がわかったのでここに記述します。

なお、この問題は、`erlang`に限らずMacOS特有の話で、いろんなappのインストール、build(make)のリンク時に発生します。


参考資料(原因がわかった後に見つけた記事)
-----

[macでライブラリをビルドしてインストールするときはbinutilsに気をつける](https://qiita.com/nagomiso/items/dc6021beb72d09f2128f)

こんな場合に発生します
-----
* MacOS上、[Gnu binutils](https://www.gnu.org/software/binutils/) のバイナリツールがインストールされている。
```
$ which -a ar
/usr/local/opt/binutils/bin/ar 
/usr/bin/ar
```
* make時に複数のobjをarchiveにし、そのライブラリー(*.a)とリンクする場合(Makefile上に`ar`、`ranlib`がある)

エラー発生のしくみ
----
Makeする時に使用するコマンドには
* compiler : gcc, g++   -- MacOS上にあり
* archive  : ar, ranlib -- MacOSとbinuntilsとの両方にあり
* linker   : ld         -- MacOS上にあり(binutilsにはなかった)

*binutils* のar、ranlibのコマンドでarchiveを作り、 *MacOS* のlinker(ld)でリンクしたので、archiveファイルを読めずに`undefined symbol`のエラーが発生した。
MacOSのarで作るarchiveが標準のarchive(binutilsで作った)と違っているため。

linker(ld)をbinutilsのものを使用すれば、良いのかも、と思ったんですが、linker(ld)がbinutilsにはありませんでした。

解決の方法
----
1. `binutils`をアンインストールする
```
$ brew uninstall binutils
// Pathを削除する
#export PATH="/usr/local/opt/binutils/bin:$PATH"
```
2. `binutils`を使いたい場合は、一時的にpathを無効にするか、ar,ranlibをMacOSのもの指定とする

そもそも、`binutils`は一体必要なのか
-----
`binutils`には以下のものがあります。
`/usr/local/opt/binutils/bin`にあって`/usr/bin`にないもののリストです。
X: なし、◯: あり

| name | /usr/bin  |
|-------|---------|
| addr2line* | X |
| ar* | ◯ |
| c++filt* | ◯ |
| coffdump* | X |
| dlltool* | X |
| dllwrap* | X |
| elfedit* | ◯ |
| nm* | ◯ |
| objcopy* | X |
| objdump* | ◯ |
| ranlib* | ◯ |
| readelf* | X |
| size* | ◯ |ｓ
| srconv* | X |
| strings* | ◯ |
| strip* | ◯ |
| sysdump* | X |
| windmc* | X |
| windres* | X |

`binutils`にあり、`/usr/bin(MacOS)`にないものがあるが、必要なものは準備されている。
従って、MacOSは独自のものを開発しているので、「MacOSで開発する場合はこの`Gnu binutils`は使うべきでない」と考える。
ただ、`buildroot(組込みlinux)`などのクロスコンパイルで使用される事があるのでの注意または処置が必要となると思われる。

最後に
-----
私の場合、たぶん、ESP32(SoC)のクロスコンパイラをインストールした時に手順に従いインストールしたと思う。
で、想像するに、少し前はMacOSでもGnuの`gcc`を使用していて、この`binutils`が必要であったが、clang(表面上gccと名前は同じ)をMacOSでの標準となり、この際、MacOS専用のフォーマットに変えたためにその歪みが現れたのでは、と。
想像の範囲から出てないが、今のところ、`binutils`は不要なので削除のまま運用していこうと思う。
OSはいかなる時でもメモリ領域外アクセスを止めてくれるのか

# まえおき
真似してPC壊れたとか言われても知らん
やるなら自己責任でよろしく

# はじめに
free()したらデバッガにヒープ破壊してますよと言われた時の対処
https://qiita.com/DozyouMetoro/items/e8937f4fba2d38ec2bc2

OSはメモリ領域外アクセスを止めてくれないという濡れ衣を着せてしまったので、実はちゃんと気づいて強制終了してくれると信じて検証。

# 環境
windows11
visual studio 2022(リリースビルドとデバッグビルドで検証)

# テストコード
```c
#include<stdio.h>
#include<stdlib.h>

int main(void) {
	int* data;
	char a = 0;

	data = (int*)malloc(sizeof(int));

	printf("malloc\n");
	fflush(stdout);
	scanf_s("%c", &a);//一時停止用
	

	data[0]++;
	data[1]++;

	printf("data++\n");
	fflush(stdout);
	scanf_s("%c", &a);//一時停止用


	printf("%d\n", data[0]);
	printf("%d\n", data[1]);

	printf("print\n");
	fflush(stdout);
	scanf_s("%c", &a);//一時停止用

	free(data);

	printf("free");
	fflush(stdout);
	scanf_s("%c", &a);//一時停止用

}
```
豆知識：printf()でどこで落ちたか見たい時はprintf()のあとにfflush(stdout)を置いとくとよい。
~~return 0;忘れてた~~

# 結果
## デバッグビルド編
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2944355/a99d9bc4-3f53-a597-b4dd-4f31e3525d4c.png)
デバッガがちょうどfree()で止めてくれたみたいです。
~~破壊した瞬間に止めろよ~~

## リリースビルド編

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2944355/dce8c6a0-ab6f-6a07-aee4-63ba88493ee5.png)
**なんでだよ止めろよ**

# 結論
**アプリが落ちたりデバッガが止めないから領域外アクセスしてないとは言えない**

# 追実験

領域外アクセスをした場所が確保した場所から近場過ぎて見逃された説

追テストコード
```c
#include<stdio.h>
#include<stdlib.h>

int main(void) {
	int* data;
	char a = 0;

	data = (int*)malloc(sizeof(int));

	printf("malloc\n");
	fflush(stdout);
	scanf_s("%c", &a);//一時停止用
	

	data[0]++;
	data[100]++;

	printf("data++\n");
	fflush(stdout);
	scanf_s("%c", &a);//一時停止用


	printf("%d\n", data[0]);
	printf("%d\n", data[100]);

	printf("print\n");
	fflush(stdout);
	scanf_s("%c", &a);//一時停止用

	free(data);

	printf("free");
	fflush(stdout);
	scanf_s("%c", &a);//一時停止用

}
```
ちょっと遠くにアクセスしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2944355/142b1dfa-3463-4dd8-bedb-0e99a147848d.png)

**なんでだよ止めろよ**

# 結論
**アプリが落ちたりデバッガが止めないから領域外アクセスしてないとは言えない**
よっぽど大規模にやらないと落ちないかなぁ…
それかこれでも近場で見逃されたのか
(リンクだけです)「斜めの楕円」を調べてみたい。

オリジナル

https://manabitimes.jp/math/1124

# Mathematicaで 
勉強中

# sympyで 
勉強中

# 過去問

https://qiita.com/mrrclb48z/items/77b3de2c3444aaad3925

# 参考


# 未整理

https://ja.wikipedia.org/wiki/%E4%BA%8C%E6%AC%A1%E5%BD%A2%E5%BC%8F
UiPathで画面上の複数ウィンドウから指定のウィンドウを選びたい

# はじめに
本記事では、UiPathを使用して画面上の複数のウィンドウから指定のウィンドウを選択する方法についてご紹介します。今回は、複数のChromeブラウザウィンドウを立ち上げ、各ウィンドウのタイトルを入力ダイアログで表示します。

# 背景
あるサイトで複数のIDを入れて検索し、表示されたウィンドウのタイトルを入力ダイアログで選択したうえで、情報を取得したい（検索時はIDしか分からない）とのケースに対して、どういう実装ができるのか考える機会があったのでご紹介をいたします。


# 実装
今回は「子要素を探す」と「繰り返し（コレクションの各要素）」を用いて実装します。
「子要素を探す」の詳細な使い方は他サイトをご参照ください。
今回の実装では、指定したボタンやウィンドウと紐づいた要素を取ってくるイメージでいれば大丈夫です。

処理では「子要素を探す」で取得したChrome画面情報からタイトルを抜き出し、入力ダイアログで表示します。

### 実装手順
「子要素を探す」でデスクトップ画面を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389245/76288429-9452-4277-0227-a1176a94a9e6.png)

プロパティより、スコープを「FIND_TOP_LEVELS」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389245/d9250e32-9a77-8875-0d0e-0dc79fc12392.png)

この設定で、デスクトップ上で開かれている全てのウィンドウの情報を出力することができます。
例えば、以下の画像のQiita記事ウィンドウの情報は次のようにアプリケーション情報とタイトルの2つが表示されます。
`UiElement[xx] { UiElement { ClippingRegion=null, Selector="<wnd app='chrome.exe' cls='Chrome_WidgetWin_1' title='【UiPath】マウススクロールアクティビティを使ってみた - Qiita - Google Chrome' />" }}`


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389245/cfde0ef1-0521-3e48-c24b-7379c2e549c1.png)



複数のウィンドウが画面上にある場合、上記のUiElementが複数出力されます。
今回はChromeで開かれているウィンドウだけが欲しいので、"chrome.exe"が含まれているUiElementのtitleを出力するように、「繰り返し（コレクションの各要素）」を指定します。
また、入力ダイアログで表示するために、取得されたタイトルを";"で繋ぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389245/74063cf9-4912-da90-50ce-0a4e6a41eca9.png)

そうすると、次のような入力ダイアログを表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389245/1827a532-91bc-8e6c-e0b2-500549d84f42.png)

最後に選択した画面で行いたい処理を追加したら完了です。（今回はハイライトする実装をしております）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2389245/ff171188-b3f7-8f35-2e46-b8ebdb97c27c.png)



# 最後に
個人的に「子要素を探す」を使うケースが今まであまり無かったですが、今回の実装で勉強になりました。

最後まで読んでいただきありがとうございます！
テックブログ開始から現在までの軌跡！発信継続の課題と解決策

初投稿です。自由に書かせていただきます。
お手柔らかにおねがいします。

# 自己紹介
私はARISE analyticsというアナリティクスカンパニーにて、広報をしております。
エンジニアではないのですが、エンジニアと一緒に頑張る立場として、本記事を執筆しております。
軽く紹介をすると

ARISE analyticsは
- アクセンチュアとKDDIのジョイントベンチャー
- データサイエンティストが350名以上いる分析を生業とする会社
- その一方で分析のみならず、アプリ・ソリューション開発など幅広く手掛けているため、エンジニア職種のメンバーもいる

私自身の紹介をすると
- もともとはアパレル企業のPR出身
- ECサイトの立ち上げ＆運営をしていた時、データの可能性に気づく
- ARISE analyticsに入社
- 社内外広報の業務を担当！入社から3年経つ

こんな感じです。

# テックブログは良いぞ。テックブログの効果
ARISE analyticsでは3年前より公式HPに「ARISE Techblog」：https://www.ariseanalytics.com/activities/report/category/arise-tech-blog/ をオープンしました。
その頃、ギルド活動という技術力を高めるための有志組織が社内に存在しており、その活動の一環で「公式HPにテックブログを作りたい！」という社員の一声から立ち上がりました。

その後、徐々にテックブログが社内にも浸透して全社の大きな取り組みになった現在は、私が所属する全社横断の有志組織「テックブログ事務局」が運営を担当しています。
（ARISE analyticsにはこうした会社を良くするための有志組織や取り組みが無数に存在します！我ながら良い文化ですね）

開始より40本以上の記事を発信してきましたが、以下のような効果がありました。
- 公式HPでテックブログ経由の新規ユーザー数が爆増（！）した。ざっくりいうと、直近では公式HPに流入する新規ユーザー数のうち、3分の1くらいがテックブログ経由で流入したユーザーに。
- HP宛ての問い合わせで「テックブログをきっかけにARISE analyticsを知ってお問い合わせしてくださる方」が増えてきた！
- 社員の技術的なアウトプット文化が徐々に醸成されてきた！（何か技術的なトピックがあれば、Techblog書きたいです！と手を挙げてくれる方が徐々に増えてきた…！）

かなりざっくりですが、わかり易い効果はこんな感じです。
かなり多くの会社がテックブログで発信を行っていると思うので、ここらへんは想像の範囲内かなと思います。

# テックブログの執筆者が一巡すると継続することが課題になるよね問題 
企業がエンジニアなどの採用を強化するにあたり、技術広報施策の1つとして「テックブログを始めてみる」はよくある方法だと思うのですが「発信を継続していく」はわりと初歩にぶち当たる壁かなと思います。

私たちARISE analyticsのテックブログもご多分にもれず、その課題はありました（というか今もまだあります、というのが正直なところ）。
最初の頃は自然とリレーを繋ぐようにいた執筆者も一巡し、開始から1年半ほどで執筆者が枯渇‥‥（！）

本業務がある中で、特にインセンティブが用意されているわけでもなく、公式HP内で発信される内容を書くって…執筆者にとってはしんどい作業ですよね‥‥。また、開始から1年経っても「そもそも会社にテックブログがあることを知らなかった」「テックブログに発信したいネタはあるけど手を挙げるか躊躇う…」などの声もありました。

# 発信を継続できない問題の解決策

この課題に対して、テックブログ事務局内でも色々と策を練ったのですが「発信を継続する」ための解は結局のところ
- 早め＆早めに執筆依頼をして、精緻にスケジューリングしておく
- スケジューリングしたものに対して、こまめにリマインドやお尻叩きを行う　

これが一番なのでは？という結論に至りました。なんだか基本的なことのように見えますが、管理する側のテックブログ事務局メンバーも、執筆者も、本業の傍ら取り組んでいるので意外と難しいのです。

また、発信できそうなストック記事を持っておくという意味で「個人でクイックに発信できる場を作っておく」というのも良き解決策になりました。ARISE  analyticsの場合は

- 社内向けテックブログを作る
- Qiita Organizationを作る

この2つを行いました。万が一スケジューリングしていた記事が発信できなくなった際に、こうした媒体から良き記事を見つけて（ちょっとアレンジしたり、公式向けに書き換えてもらったりはしていますが）、テックブログにアップしてみるムーブもできます。

「会社のテックブログはちょっと公式みが強いよ～、書くハードルが高いよ～」という方でも、社内向けテックブログやQiitaの個人アカウントなら気軽に記事を書けるし、クイックに学んだことをアウトプットできるので、良きですよね。

ちなみに余談ですが、社内テックブログはARISE analyticsのAIエンジニアが自分でサイト構築を行って自力で作っていました。興味のある技術に触れられる場として、楽しみつつ？管理してくれています！

# これからもテックブログがんばる

色々課題はありつつ、会社の認知向上や採用活動に寄与しているテックブログ。もっと頑張っていかないとな。。。。。と思っている今日この頃です。

これから解決したい課題は、
- 執筆者や記事レビュワーへインセンティブがあるとより活性化されるのでは？（会社の認知向上にめっちゃ貢献してくれているので何か報いを差し上げたい…）
- アクセス数の分析や見える化をしたい。執筆者のモチベになりたい。

などなど…。挙げるとキリがないので、このへんで留めておきます。

まだまだ改善しなければならないことが多くありますが、引き続き頼もしいテックブログ事務局の仲間たちと頑張っていこうと思っております。

そんなARISE analyticsのテックブログはこちらです👇ぜひ、ぜひ、ご覧ください～！
https://www.ariseanalytics.com/activities/report/category/arise-tech-blog/
Moshiを使ったJsonのコンバート

# はじめに
今回はGsonが非推奨なのでMoshiを使ってのJson変換を紹介していきます
### 本文
コード自体は下記の通りです
```kotlin
Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
.adapter(HogeData::class.java)
.fromJson(Json)
```
`adapter`の中には変換先のデータクラスを渡し、`fromJson`には変換したい`Json`を渡します。
ここで***2点***注意が必要なのですが、
***1つ目***が`.add(KotlinJsonAdapterFactory())`Kotlin用のFactoryを追加することです
***2つ目***は変換先のデータクラスで下記二つのアノテーションをつけることです。
データクラス自体には`@JsonClass(generateAdapter = true)`
各種変数には`@Json(name = "hoge")`
### 最後に
今回はだんだんと増えてくるであろうMoshiの実装方法を紹介していきました
どなたかのお役に立てれば幸いです
EC2のAutoScaling時にEIPを自動で付与する(IMDSv2版)

## この記事を書いたきっかけ
* EC2へのアクセス元のネットワークがIPホワイトリスト形式でアクセス制限を行っていたため、EIPで固定化する必要があった
* 既存の記事で紹介されている実装はインスタンスメタデータv1が前提となっており、v2では稼働しなかった

## 前提知識
* [Auto Scaling で追加したEC2 インスタンスにEIP を自動で紐づける - Qiita](https://qiita.com/kanadeee/items/955eb8710e97a4ed5fd3)

## 事前に用意するもの
* EC2 Auto Scaling設定
* EIP

## 必要な設定
* 以下のポリシーを含めたIAMロールにEC2に付与し、EC2自身が空いているEIPの参照と割り当てが行えるようにする
* 起動テンプレートのUser Dataに以下のスクリプトを記載し、起動時に空いているEIPの参照と割り当てを行わせる。その際、**メタデータを参照するためのトークンを取得する**
```
#!/bin/bash

## EIPの自動割り当て処理
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
curl http://169.254.169.254/latest/meta-data/instance-id -H "X-aws-ec2-metadata-token: $TOKEN
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | awk -F\" '{print $4}'`

for ALLOC_ID in `aws ec2 describe-addresses --region=$REGION --filter "Name=domain,Values=vpc"  --output text | grep -v eipassoc- | awk '{print $2}'`
do
  CMD="aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $ALLOC_ID --no-allow-reassociation --region=$REGION"
  $CMD
  STATUS=$?
  if [ 0 = $STATUS ] ; then
    exit 0
  fi
done
exit 1
```

## 参考記事
* [InstanceMetaDataV2を分かりやすく解説してみる - サーバーワークスエンジニアブログ (serverworks.co.jp)](https://blog.serverworks.co.jp/tech/2019/11/27/imdsv2/)
(リンクだけです)「2変数関数」を調べてみたい。

「2変数関数」と言わないみたいです。

# 教科書より
教科書の記号・番号
数Ⅱ
教科書701 領域と最大値・最小値
教科書702 領域と最大値・最小値
教科書705 (線形計画法)
教科書706 領域における最大・最小
教科書709 領域と最大・最小
教科書710 領域と最大・最小
教科書711 領域と最大・最小
教科書713 領域と最大・最小

# 参考

https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%A4%89%E6%95%B0%E9%96%A2%E6%95%B0

＞Multivariate function 

https://en.wikipedia.org/wiki/Function_(mathematics)#Multivariate_function

https://reference.wolfram.com/language/ref/Plot3D.html.ja?source=footer

＞教科書目録（令和4年4月）

https://qiita.com/mrrclb48z/items/405c26b005a61a916c3f#%E6%95%99%E7%A7%91%E6%9B%B8%E7%9B%AE%E9%8C%B2%E4%BB%A4%E5%92%8C4%E5%B9%B44%E6%9C%88
Java Gold攻略法

Oracle Certified Java Programmer Gold SE 11に合格したので、僕なりの攻略法をまとめてみました。

[勉強方法](#勉強方法)
[試験問題の傾向](#試験問題の傾向)
[暗記のコツ](#暗記のコツ)
[消去法について](#消去法について)
[その他大事なこと](#その他大事なこと)
[最後に](#最後に)

## 勉強方法

勉強期間：約2か月（週3~5日 30分~1時間）
正答率：85%

使用したのは下記です。
- 黒本
- エクセル
- Eclipse

他の本は使用していないのでわかりませんが、黒本で十分という声が多いと思います。
エクセルに回答を記入し、各章毎に正答率がわかるようにしていました。
Eclipseは動作確認でたまに使用していました。

黒本は5~6周くらいしたと思います。

## 試験問題の傾向

僕の感覚ですが、下記割合でした。

|問題  |出題率  |
|---|---|
|見たことない問題  |8% |
|ラムダ式、ストリームAPI  |70% |
|その他黒本関連の問題  |22% |

最初の10問くらいは見たことない問題が出ます。
とても焦りますが、そこにはあまり時間をかけすぎない方がよいです。
マークつけて飛ばして下さい。

試験中盤以降は黒本の問題ばかりです。
特に、最終問題の問題がほとんどを締めています。
<font color="red">一度最後まで解き、残った時間で飛ばした問題をじっくり解きましょう。</font>

黒本を5~6周していれば、ほとんどの問題は息をするように解けます。

## 暗記のコツ

合格で一番大事なのは **暗記** といってもいいかもしれません。
暗記のコツは**短い時間で繰り返し覚える**ことです。

下記のように黒本を解くと、完全に暗記できます。

1. 問題を解く
2. 答え合わせをする。
3. もう一回同じ問題を解いて答え合わせをする。

これを章ごとに実施します。（模擬問題は量が多くて解くのに時間がかかるので20問ずつとかに分割してもOK）
大事な事は、<font color="red">答えを確認してすぐに、覚えているか確かめる</font>という事です。
なので、まったくわからなそうな章は先に答えを見てから解いてもよいです。

覚えて来たら、<font color="red">不正解の選択肢を理由を考えながら消去する癖を付けましょう。</font>
Java Gold試験において、消去法はとても大事です。

## 消去法について

問題は全て選択形式なので、いかに選択肢を絞れるかが重要です。
使用メソッドやクラスを問う問題は暗記するしかないですが、問題の大部分を締めるであろうラムダ式やストリームAPIの問題で消去法はかなり有効です。

ボリュームのある実装の問題が結構出てきますが、選択肢の中にそもそも構文違うやんってのが2つ以上はあります。1つまで絞れることもあります。

例）
- ストリームAPIの中間操作メソッドfilterに渡す実装がboolean型でないものを戻している。
- Function<T,R>は型パラメータ2つなのに、1つしか記載していない。
- 型パラメータを受け取っていないのにObject型以外の引数を渡している。
- ストリーム処理で、終盤操作を2回やっている。

<font color="red">戻り値や型パラメータの数を意識して選択肢を見る</font>とよいです。
難しそうな問題でも、消去法で難易度が50%くらい変わります。

もちろん構文エラーを見抜くためには**関数型インターフェースやストリームAPI**のメソッドを**暗記**する必要があります。
全ては**暗記**から始まるのです。

## その他大事なこと

暗記、消去法は攻略に欠かせないです。
その他にもいくつか大事だと思ったことを書きます。

- **受験前の追い込み**
受験前（出来れば当日）に黒本の問題を全て解くと良いです。
時間的に厳しければ、最終問題だけでも解いておくことをおすすめします。
- **何を問う問題か意識する**
これ結構大事です。回答の解説に「～を問う問題です」と書かれていることがあります。問題文、選択肢を見て何を問う問題なのかわかるようになってくると効率がかなりあがります。
- **受験前にトイレに行く**
僕は半分くらい解いたあたりでトイレに行きたくなりました。そこから集中力が低下し、まともに見直しできず1時間半くらいで我慢できず終了しました。
必ずトイレは済ましておいてください。

## 最後に

攻略法というタイトルですが、暗記する量は結構あるので結局Java Goldは簡単ではありません。
黒本を何回も繰り返し解くことが僕は大事だと思います。
黒本の内容を網羅すれば実装方法の幅も広がるので、ぜひ挑戦してみてください。
#7 RDSのマルチAZ配置

# はじめに
AWS CLIで、以下の構成図のようなRDSのマルチAZ配置を作成します。
![8_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3501605/ed0f1a4b-75a0-e8a2-9471-a488d08120da.png)

## 手順
* `aws rds modify-db-instance`を実行します。
* `--multi-az` `--no-multi-az`で可用性の変更を指定します。
* `aply-immediately`で変更をすぐに適用するようにします。
### シングルAZ→マルチAZの場合
```
aws rds modify-db-instance \
--db-instance-identifier xxxx \
--multi-az \
--apply-immediately
```

#### マルチAZ→シングルAZの場合
```
aws rds modify-db-instance \
--db-instance-identifier xxxx \
--no-multi-az \
--apply-immediately

```
マネジメントコンソール画面でも、設定が反映されていることを確認します。

# 参考ドキュメント
* [マルチ AZ DB クラスターの変更](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/modify-multi-az-db-cluster.html)
* [AWS CLI Command Reference](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html)

# 関連
* [AWS CLIでスケーラブルウェブサイトを構築する](https://qiita.com/kokichi8/items/fedb84896a286b70cc23)
Calckeyからfirefishへのアップデート

前回、[Calckeyのアップデート方法](https://qiita.com/schwarzewald/items/7151b472cf766d0c6af9)の記事を書いてから、Calckeyがfirefishに名前を変え、アップデート方法もちょっと変わったので別記事にします。

7/22ぐらい 追記
ver1.0.3からリポジトリがセルフホストになってgit remote set-urlのリンク先が変更になりました。記事の中では修正済みです。

### 前準備
- swapを2GB以上確保する
メモリが2GB以下のサーバだとbuildとかの途中で止まるかもしれないので前の記事を参考にswap領域を確保しておきましょう。
※ver1.0.3以降だと2GBのスワップでは止まったことがあるので4GB以上推奨です

- rustのバージョンを最新にする（v1.68.0以降）
インストールしていなかった場合は前記事を参考にインストール、していた場合は以下コマンドで出来ます。
ユーザーごとにインストールしていると思うのでアップデートの場合は前回インストールしたユーザーで実行するようにしましょう（インストールされていたら`rustc --version`打ってバージョン情報が出てくるはず）
```
rustup update
```

- nをインストールしてnodejsのバージョンを最新にする
簡単インストールでインストールした場合、nodejsとnpmは勝手にインストールされていると思うのでそこにnodeのバージョン管理ツールのnをインストールして最新版にアップデートするコマンドを入力してやれば勝手に最新版になります（現時点でnode-v20.4.0）

```
$ sudo npm update -g npm
$ sudo npm install -g n
$ sudo n latest
```

- サーバーの再起動
ここで謎のハマリポイントがあり一回サーバーを再起動しておかないと後のbuild時にエラーが出て先に進めなくなりスナップショットから復元するしかなくなります。
なので一度`sudo shutdown -r now`でサーバーを再起動しておきます。
以下のコマンドでアップデートできたかのバージョン確認をしましょう。

```
$ rustc --version
$ node -v
$ npm -v
$ n -V
```

### インストール
あとは[公式ページ](https://codeberg.org/firefish/firefish/releases/tag/v1.0.0)通りやれば大丈夫です
```
$ cd calckey/
$ git remote set-url origin https://git.joinfirefish.org/firefish/firefish.git
$ git pull --ff
$ corepack enable
$ pnpm i
$ NODE_ENV=production pnpm run build
$ NODE_ENV=production ANTENNA_MIGRATION_SKIP=true pnpm run migrate
```

最後にサーバーをもう一度再起動するのを忘れないようにしましょう
```
$ sudo shutdown -r now
```
terraformで｢「Error: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.｣というエラーが発生した件

terraformを実行しようとすると、「Error: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.」というエラーに直面しましたので、解決法を備忘録して記録します。

# 事象
terraform applyなどを実行すると以下のようなエラーが発生。

>│ Error: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
│
│ Please see https://registry.terraform.io/providers/hashicorp/aws
│ for more information about providing credentials.
│
│ Error: NoCredentialProviders: no valid providers in chain
│ caused by: EnvAccessKeyNotFound: failed to find credentials in the environment.


# 解決法
your_access_keyとyour_secret_keyをそれぞれ自分のものに置き換えて以下の方法で環境変数を設定する。
```
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
```

# おわりに
久々に使うと予期せぬエラーが出て困りました。
初心者がAWSでWebサイトを公開するまで

# やりたいこと
AWSでWebサービスを公開するまでの流れをまとめました。
公式が用意しているサンプルWebサービスを使ってWebサイトの環境構築を学びます。

参考にした公式チュートリアルはこちらです。
https://aws.amazon.com/jp/getting-started/hands-on/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/

# サンプルWebサービスの説明
まずサンプルWebサービスがどんなものかをざっくりと説明します。

![いらすとやユニコーン](https://2.bp.blogspot.com/-kwlzIOtHvuM/XOPXUYPc19I/AAAAAAABS7k/YyQ6OZTB2O4Wg4HSlYMgfOKkOy5E99uUgCLcBGAs/s800/yumekawa_animal_unicorn.png)
シチュエーションは以下です。
> あなた（の会社）はユコニーンを世界各地に派遣する能力を持っています。
そこで世界中の人がユニコーンをタクシーのように乗り回せるWebサービスを作ることにしました。

システムの概要は以下です。
> ユーザはスマホorパソコンからWebサイトにアクセスしてユニコーンを予約できる。あなた（の会社）はその予約を検知してユコニーンを派遣する。

今回のWebサービスを大きく2つに分けると、
①「スマホorパソコンからWebサイトにアクセスしてユニコーンを予約する」部分と
②「その予約を検知してユコニーンを派遣する」部分に分けることができます。

①をフロントエンド、②をバックエンド（もしくはサーバサイド）と呼びます。

①②それぞれをAWSを使ってクラウド上に構築し、①②が連携するようにAWSで設定することでWebサービスを公開できます。

# システム構成図
![システム構成図](https://d1.awsstatic.com/diagrams/Serverless_Architecture.d930970c77b382db6e0395198aacccd8a27fefb7.png)
（↑図中の番号は気にしないでください）

AWSを使って上記のようなシステムを構築します。
それぞれ以下のような担当となっています。

①「スマホorパソコンからWebサイトにアクセスしてユニコーンを予約する」部分：
**AWS Amplify**
②「その予約を検知してユコニーンを派遣する」部分：
**AWS Lambda** / **Amazon DynamoDB**
①と②の橋渡し：
**Amazon API Gateway**
その他（ログイン機能）：
**Amazon Cognito**

# AWSでWebサービスを公開する流れ
## アカウントの準備
AWSを使うためにはAWSアカウントが必要です。
まだ作っていない場合はこちらのチュートリアルを参考にアカウントを作成します。
https://aws.amazon.com/jp/register-flow/

## ①を作成する
①「スマホorパソコンからWebサイトにアクセスしてユニコーンを予約する」部分を作ります。
ソースコードはサンプルをそのまま使用するので、どうやってこのソースコードをオンラインで公開するかが課題です。

:::note info
**AWS Amplify**はクラウドの専門知識がなくてもWebサイトを簡単にホストできるサービスです。
他のAWSサービスと連携することでソースコードの変更を検知して自動でWebサイトをデプロイすることができます。
:::

↓詳しい手順はこちら
https://qiita.com/mkttks/items/b0f7d4b2b6756e7ed3c8

## ②を作成する
②「その予約を検知してユコニーンを派遣する」部分を作ります。
ソースコードは同じくサンプルを使用します。

:::note info
**AWS Lambda**はAWSで関数を動かすことができるサービスです。
あくまで関数なのでデータを保存したり呼び出したりするためには別途データベースを用意する必要があります。
:::
:::note info
**Amazon DynamoDB**はAWSで利用できるデータベースです。
Lambdaからデータの読み書きをさせることでデータベースありのバックエンド処理を作ることができます。
:::
:::note info
**Amazon Cognito**はAWSのWebサービスにログイン機能を実装できるサービスです。
面倒なログイン周りを自前で実装する必要がなくなります。別に無くてもいいのですが公式チュートリアルが使っているので解説しました。
:::

↓詳しい手順はこちら（ログイン機能の実装）
https://qiita.com/mkttks/items/5220724fdd10ff51333d
↓
↓（バックエンド処理の実装）
https://qiita.com/mkttks/items/c30e993adb520869dbb4

## ①と②を繋げる
最後に①と②を繋げます。①から「予約する」という通信を受け取って、②の「ユニコーンを派遣する」処理にリレーする役割が必要です。

:::note info
**Amazon API Gateway**はAPIという形でフロントエンドから通信を受け取ってバックエンドに橋渡しできるサービスです。
:::

↓詳しい手順はこちら
https://qiita.com/mkttks/items/bb277e01c2dad6e1ee45

# 完成品
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492231/e897faf5-0af6-a0a9-2c0f-7c05abd53dce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492231/c5a7489c-b31c-4153-6f6b-bb4905cc0567.png)
手順をすべて実施すると最終的にはこのようなWebページが公開できます。サインイン完了後、表示される地図の好きな地点をクリックして「Request Unicorn」を押すとユニコーンがすいーっとやってきます。

# おわりに
今回はAWSでサンプルWebサービスを公開するまでの流れをまとめました。
サンプルWebサイトのソースコードを弄ったり差し替えれば自分だけのWebサービスを公開できます。
AWSを使って自分だけのサービスを運用してみたら楽しそうですね。
[ServiceNow] FormのAnnotationの表示・非表示を動的に制御する

# はじめに

ServiceNowのOOTBでは、FormのAnnotation（注釈）の表示・非表示を動的に制御することはできませんが、Annotationの記述方法と、Client Scriptの工夫によって、それを可能にします。
ここでは、IncidentのImpactフィールドを例に、選択された値によって、Annotationを表示したり、非表示にしたりする例を取り上げます。

# Annotationの設定

IncidentのForm Layoutで、Impactフィールドの上のAnnotationを追加し、次のようにAnnotationを定義します。

![Incident_FormLayout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/c5fdfa9e-a8fc-36d5-4964-6d8bf7d524ff.png)

Annotation Textの定義は次のように記述します。ここでのポイントは、HTML形式のTextでメッセージをSpanダグで囲み、id属性として適当な値を設定します。

```HTML:Annotation Text
<span id="impact_annotation">
${gs.getMessage("When selecting High, check the impacted CI's business criticality.")}
</span>
```

# Client Scriptの設定

次にIncidentのClient Scriptを次のように作成します。

![Incident_ClientScript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/aa647e2e-4a72-8540-a4bf-3c72dcbd2371.png)

```JavaScript:Script
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    //if (isLoading || newValue === '') {
    //   return;
    //}

    //Type appropriate comment here, and begin script below
    var $j = jQuery.noConflict();
    //If Impact is High
    if (newValue == '1') {
        // Show the annotation
        $j("#impact_annotation").parents("tr").show();
    } else {
        // Hide the annotation
        $j("#impact_annotation").parents("tr").hide();
    }
}
```

# 実行結果

ImpactフィールドでHighを選択した場合は、次のように表示されます。

![Incident_ImpactHigh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/5479121a-675f-755b-8013-81f49101653a.png)

High以外を選択した場合は、次のように表示され、Annotationが非表示になります。

![Incident_ImpactNotHigh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490802/fc3cc236-e5d1-8496-b869-50c0ed29f632.png)
【小ネタ】OpenAIのインシデントステータスはSlackに通知させよう

## 前置き
OpenAIのAPIを使っているなら何も考えず取り敢えずやっとこう系です。

OpneAIは、提供するサービス（APIやChatGPT、Labs、Playground）のステータスに関してステータスページはもちろん、メールやSlack、RSSなどの手段でユーザに対してインシデント状況などを通知しています。

APIを用いて開発している手前、この手の障害情報などはキャッチ出来るようにしておくべきなので、まだのチームは是非この機会にセッティングしましょう！

## サービスのステータスページ

https://status.openai.com/#

ステータスページではAPI、ChatGPT、Labs、Playgroundそれぞれの稼働状況が確認できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/57e311e4-7aa0-9afb-4376-d9c898e02013.png" width="700">

赤くなっているところが、6/30にChatGPTにログイン出来なくなっていたことが分かります。
また、「Customer logins to ChatGPT are not available」をクリックすると詳細を確認出来ます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/29362fff-6b59-fc0b-0807-83ec84ac392c.png" width="600">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/68639bd8-eb21-6e0e-dc08-841e334e5e84.png" width="600">

## Slackへ通知させよう
画面右上の「SUBSCRIBE TO UPDATE」よりSlackのアイコンから「SUBSCRIBE VIA SLACK」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/478ec3a6-5b0a-557f-ea4c-f6dbb2be275f.png" width="400">

Statuspageの連携リクエストの画面が表示されるので、通知先のSlackチャンネルを選択して「許可する」を押下

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354022/aaf418ee-8c22-017c-7e58-353257ac7cf2.png" width="400">

設定はこれだけです！

たったこれだけですが、以降は選択したチャンネルに対してインシデント関連の通知が飛ぶようになるので、OpenAIのAPIやChatGPTになにかあった際には素早くキャッチして社内やチームに連携出来るようになります！

万が一、SlackとOpenAIが同時に障害が発生してしまった事を想定するならメール通知も併せて実施するとより安心ですね。

## おまけ
有志の方が手動でOpenAI障害情報のTwitterを運営しているので、ついでにフォローしておくのもいいかもしれません。

[@OpenAI_statusJP](https://twitter.com/OpenAI_statusJP)
Maven httpsを使って通信する場合、手順書メモ

①正しいバージョンのmavenをインストールする
　※正しくないバージョンの場合、mavenのプラグインダウンロードできない可能性あり
　※セントラルリポジトリのバージョン確認など重要

②開発ツール使用時、追加すること
　例：eclipseに上記インストールしたmavenランタイムを追加する
　　※組み込まれたmavenのバージョン大丈夫な場合、上記①②省略可

③jdkに証明書(mavenのセントラルリポジトリのhttpsの証明書)をキーストアに追加する
　keytool -keystore '***jdk/jre/lib/security/cacerts'　-importcert -alias aaa-bbb -file 証明書の場所　-storepass changeit

④追加した証明書を確認する
　keytool -keystore '***jdk/jre/lib/security/cacerts' -list -alias aaa-bbb -storepass changeit
  ※環境変数に必ず上記のjdkを使用すること
※開発ツール例eclipseのmavenの構成のJREタブ→代替JREのドロップリストに上記jdkを使用すること
新人教育を受けるときに大切だと思っていること

# はじめに
駆け出しエンジニアからすると教育を受けている期間に困ることがたくさんあると思います。
私も新人の時は右も左もわからなくてどうしたらいいかわからなかったこともたくさんありました。
そんな私も教育する立場となり、新人の時にはわからなかったメンターの考えが分かるようになってきたので新人教育を受けるときに大切だと思うことを書いていこうと思います。


# 簡単な経歴
- 1社目
   1年間新人のOJT担当として未経験エンジニアを育成
- 2社目
   1か月間の新人の教育カリキュラムのメイン講師を担当して、20人程度を教育して各現場へ配属させる
- 現在
   新規メンバが入ってから実施する2か月間の教育カリキュラムのメンターを3年間担当。教育カリキュラムの設計も担当

# 教育を受ける立場として
一番大切だと思うのは**積極的にアクションする**ことだと思っています。
自分としても早く成長してチームに貢献したいと思うでしょうし、メンター側も自分が教育したメンバが成長して活躍が見れると嬉しいものです。
私が新人の人が起こすと成長につながると感じるアクションを以下に並べていきます。

## わからないことを確実につぶす
メンターが忙しそうで質問しづらい。。。
あまりに基礎的なこと過ぎてこんなことを聞いていいのかな。。。
上みたいなケースってめちゃくちゃ多いと思います。
自分も新人の時にすごく多かったのですが、これでうやむやにしてよかったことは1回もなくて絶対お叱りを食らっていましたｗ
なので自分が**分からないことは確実になくして作業をする**ことがとても大切だと思います。
メンターとしてもなんで確認しないんだろうという不信感を持つ原因となり、お互いの心理的安全性が低下してしまいます。
メンターは新人より忙しい立場にあるのでなるべく状況把握をしようとしていても時間の都合でできない場合もあります。
なので次のようなアクションをすると解消されると思います。
- **メンターが忙しそう**
    - **まずは口頭で質問できるかを確認する**
      質問したい旨を伝えてもらえるだけで困っている状況の把握ができますし、メンターも作業の見積もりがしやすくなります
    - **SlackやTeamsやメールなど非同期のコミュニケーション手段を活用する**
      忙しそうな時こそ非同期コミュニケーションの一番の活用時だと思います。非同期コミュニケーションを使うと議事録としても残るし一石二鳥だと思っています。
    - **事前に質問事項をまとめておく**
      事前に質問をまとめておくことでその後の質問の回答がスムーズに行うことができお互いの時間を有意義に使うことができます。

- **基礎的な質問をするのが怖い**
基礎的なことや1度教えたことをメンターがもう一度聞かれると自分の評価が下がってしまいそうで聞きづらいことってあると思います。
正直なところ、メンターもそれぐらいわかってて欲しいなとかこの前言ったやんって思うこともありますｗ
ただ、必ずしもそうではなくて純粋にメンターの伝達漏れや勘違いしている部分があることもあります。
それに、確認せずに作業をして取り返しのつかないことが発生するほうがリスクが大きいとメンターも考えています。
なのでわからないときはしょうがないと割り切って確認をすることが大切です。
質問の仕方などで相手への印象は和らげることができると思うので、質問の仕方も工夫するとよりGoodです。

## 間違いを恐れない
いきなり完璧に作業ができたら教育なんていらないんですよね(暴論)
それにどれだけ優れたエンジニアでも人間である以上ミスを全くしないことはありません。
新人の時はわからないことも多く間違える可能性が高いだけだと思っています。
なので間違えないようにすることはもちろん大切ですが、間違えることに必要以上にビビることはないと思っています。
失敗から学べることもたくさんあるので、失敗を恐れずにチャレンジを続けることが大切です。
間違ってヘコヘコしているとメンター側も次のステップに進むための仕事を割り振りにくくなりますし、新しいことしたくないのかなって思ってしまいます。


## 失敗の対策を考える
上でも言いましたが新人なので失敗することは当たり前です。
失敗から学べることや成長できることがたくさんあるので失敗して落ち込んでいるだけだともったいないなと思います。
自分としても同じ失敗をしたくないと思いますし、メンターも同じ指摘を何回もするのはあまりいい気分ではないです。
お互いのためにも失敗の対策を考えることが大切です。
私は**考えた対策をメンターに共有する**のが効果的だと考えています
自分で考えた対策が本当に対策になっているか？もっと違う原因がないか？など自分だけの視点では出てこない意見が出てくることも多々あります。
また、メンターとしても失敗しないようにアクションをする姿勢がみられてより協力しようと思います。


# おわりに
メンター目線で新人の心構えを書いている記事ってあまりないように思ったので、成長の手助けになればと思います。

## 宣伝
新人向けにGit記事をいろいろ書いてるのでよかったらいいねとストックお願いします

https://qiita.com/yoshiichn/items/5d9c9105b980921f2809

https://qiita.com/yoshiichn/items/9acbaf5547a6dd304322
AWS初心者、Skill Builderをはじめました

AWSをこれから学習するにあたり、Skill Builderをはじめようとしている方向けに、同じくAWS初心者としてSkill Builderで学習している立場から、Skill Builderをはじめてみて感じたことを紹介する記事です。


## Skill Builderとは
一言で言えば、AWS公式のオンライン学習ポータルサイトです。
500を超える学習コンテンツが、すべて無料で提供されています。
個人およびチームでサブスクリプション契約をすると、追加機能が利用できるようになります。
詳細はリンクをご覧ください。

https://aws.amazon.com/jp/training/digital/


## Skill Builderを触ってみる
私がSkill Builderの利用開始直後に着手したのは、 *AWSome Day Online Conference* でAWS初心者に最適なコースとして紹介されていた **AWS Cloud Quest: Cloud Practitioner** です。
しかし、始まってすぐに全編英語であることが判明し、日本語に比べ学習効率が悪いと判断し早期に撤退しました。（そもそも内容自体が完全な初心者には優しくないように感じました。。）

その後、有識者からのオススメもあり、 **AWS Cloud Practitioner Essentials (Japanese) (日本語実写版)** の受講を進めていくことにしました。

この記事では主に **AWS Cloud Practitioner Essentials (Japanese) (日本語実写版)** を受講してみて感じた、AWS初心者目線での感想を紹介したいと思います。


## メリット/オススメできるところ

###### 1. 動画、アニメーション、図、テキスト、クイズなどが散りばめられ工夫された教材で学習できる
無料とは思えないクオリティです。
動画視聴→図とテキストでの補足説明→簡単なクイズといった流れで学習できるように設計されており、初心者でも躓かないような工夫を感じました。

###### 2. 理解度をチェックしながら進めることが可能
教材はモジュールという細かい単位で分かれており、モジュールごとの理解度を確認しつつ進めることができます。
これは、理解度チェックの問題が各モジュールの終わりに設けられているためです。
難易度は高くないですが、要点を理解していないと正しく解答できない問題だと感じました。

###### 3. ITの基本的な用語や仕組みの理解の棚卸になる
今のところ個人的にはこれが最もメリットに感じました。
CDN（Contents Delivery Network）やサーバ仮想化など、基本情報技術者レベルで学習するトピック、またはそれを土台としたトピックが随所に登場します。
恥ずかしながら私のこれらトピックに対する理解は浅く、そのため、そこの部分を改めて理解しAWSに応用することが必要でした。
その分ゆっくり学習することになってしまっていますが、さらに高度な内容を学習する際に助けになると信じて学習を進めています。
将来的に、各サービスの利点や革新ポイントを理解しやすくなったり、各サービスの仕組みを忠実に言語化/イメージできたりすることで、AWSのすごさをより実感できるようになりたいと考えています。


## デメリット/イマイチなところ

###### 1. 動画の解説がたまにスッと入ってこない
私の完全な主観ですが、動画に登場するAWSトレーナーの方が、英語版の教材を直訳したような日本語で解説されるため、そこに違和感を感じることがありました。

###### 2. パーソナライズされた教材が受講できるわけではない
受講者の理解度に合わせて解説の詳しさや教材の内容が変化するわけではないです。
受講者の理解度と解説の詳しさがマッチしないと、受講が効果的に/効率的に進まないこともあると感じました。
ただ、これは無料で利用可能な教材に求めるレベルではないため、強いて言うならこう感じた、程度に捉えていただけると幸いです。
また、受講できるコースは山のようにあるうえ、初めに実施するスキルアセスメントの結果に応じて現在のスキルレベルに応じたおすすめのコースを提案してくれるため、適切なコースを受講することへのサポートは充実しています。


## 今後のSkill Builder受講計画

**AWS Cloud Practitioner Essentials (Japanese) (日本語実写版)** を受講して感じたことを踏まえ、今後どのようにSkill Builderを活用しAWSを学習していくか考えました。

1. **AWS Cloud Practitioner Essentials (Japanese) (日本語実写版)** を完遂させる
　⇒AWSのいろはを学習するためです。
　⇒*AWS Cloud Practitioner* 取得の足掛かりにしたいです。
　⇒*AWS Cloud Practitioner* の受験準備に **Exam Prep: AWS Certified Cloud Practitioner (CLF-C01) (with Practice Material) (Japanese) (Na) 日本語実写版** を活用する予定です。

2. ハンズオン系のコースで手を動かしてAWSの各サービスを学んでいく
　⇒*AWS Cloud Practitioner* などの資格取得とは別軸で、AWSサービスを体感し理解するために実施する予定です。
はじめて読む486　第4章 プロテクトモード

## 4. プロテクトモード

## 4.1 プロテクトモードへの移行

- モード移行の手順
    - CRレジスタ0の最下位ビット（PE（プロテクションイネーブル）ビット）を1にセットすることでCPUの動作モードがプロテクトモードになる
    
    ```python
    mov eax, cr0
    or eax, 1
    mov cr0, eax
    ```
    
    - モード移行の前に以下の準備をしておかなくてはならない
        - セグメントの設定
        - 割り込みの設定
        - アドレス制限の解除

## 4.2 リアルモードへの移行

- モード移行の手順
    - CRレジスタ0の最下位ビット（PE（プロテクションイネーブル）ビット）を0にセットすることでCPUの動作モードがプロテクトモードになる
    
    ```python
    mov eax, cr0
    or eax, 0fffffffeh
    mov cr0, eax
    ```
    
    - モード移行の前（と後）に以下の準備をしておかなくてはならない
        - 割り込みの設定
        - セグメントの設定
        - アドレス制限の設定
- リアルモードへ移行するケース
    - MS-DOS上のアプリケーションソフトウェアを作る場合で、大規模なプログラムを効率的に開発するため、プロテクトモードに移行して作業を行うことがあるが、実行終了後にMS-DOSに制御を戻したり、ファイルの読み書きのためにMS-DOSを呼び出す時にはリアルモードに戻る必要がある（NS-DOSのシステムコールはリアルモードでしか実行できない）
- 286でのリアルモードへの移行
    - リアルモードへの移行機能がないため、リセット用の外部回路を使ってリアルモードへの復帰を実現する
    - リアルモードへの移行のためのリセットでは、ある特定の物理アドレスのメモリに故意のリセットであることを示す値を書き込んでおく

## 4.3 モード移行プログラム

- アセンブラの擬似命令
    - MASMやTASMでは、無指定の状態では8086の命令のみを受け付けるようになっているため、386以降に追加されたレジスタや拡張された命令を受け付けるようにするには、擬似命令による宣言が必要
        - 通常のアプリケーションソフトウェアで利用される一般命令を使用する場合
            - .386擬似命令で宣言
        - オペレーティングシステムで使用する特殊命令を使用する場合
            - .386p擬似命令で宣言
- プロテクトモード移行関数
    - 486はパイプライン処理（マシン語プログラムの読み出し、解釈、実行を並行して行うこと）を行なっているため、プロテクトモードに移行したにも関わらず、リアルモード状態で解釈されたものが紛れている可能性がある
    - JMP命令によってこれを無効にしている

```python
.386p
_TEXT segment byte public use16 'CODE'
			assume cs:_TEXT

public _RealToProto
_RealToProto proc near
						 push bp
						 move bp, sp
						 ;
						 cli # 割り込みを禁止
						 mov eax, cr0
						 or eax, 1
						 mov cr0, eax
						 ;
						 jmp flush_q1 # パイプラインに先読みした命令をクリアする
flush_q1:
						 pop bp
						 ret
push bp
_RealToProto endp
```

- リアルモード移行関数

```python
public _ProtoToReal
_ProtoToReal proc near
						 push bp
						 move bp, sp
						 ;
						 mov eax, cr0
						 or eax, 0fffffffeh
						 mov cr0, eax
						 ;
						 jmp flush_q2 # パイプラインに先読みした命令をクリアする
flush_q2:
						 pop bp
						 ret
push bp
_ProtoToReal endp

_TEXT ends
			end
```
GitHub ActionsのReusable workflowを試す


この記事は [お題は不問！Qiita Engineer Festa 2023 で記事投稿！ - Qiita](https://qiita.com/official-events/4f3daca63fb78f16df0b) の参加記事です。

https://qiita.com/official-events/4f3daca63fb78f16df0b

## はじめに

GitHub Actions の機能に Workflow を再利用できるものがあります。

https://docs.github.com/en/actions/using-workflows/reusing-workflows

リポジトリごとに同じような Workflow を記述している場合、この機能を使ってまとめることができそうだったので試しに触ってみました。

## 再利用する Workflow へのアクセス

同一リポジトリにある場合はもちろん、別リポジトリの Workflow を参照することもできます。
また、プライベートリポジトリの Workflow も[設定を許可](https://docs.github.com/en/actions/creating-actions/sharing-actions-and-workflows-from-your-private-repository)すれば可能です。

## 試す

今回は、

- my-github-workflows
- sample-app

のリポジトリがあり、sample-app リポジトリ側で my-github-workflows リポジトリの Workflow ファイルを参照することをやります。

my-github-workflows リポジトリに共通で使いたい Workflow ファイルを用意します。

`on`フックで`workflow_call`を指定する必要があります。
また、`inputs`, `secrets`を設定するとその値を my-github-workflows 側に渡すことができます。

なお、以下の Workflow 実行時の Context は参照元（sample-app）側のものが使用されます。

```.github/workflows/notify-slack.yml
name: Notify Slack

on:
  workflow_call:
    inputs:
      message:
        required: true
        type: string
    secrets:
      slack_bot_token:
        required: true
      slack_channel_ids:
        required: true

jobs:
  notify:
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: slackapi/slack-github-action@v1.24.0
        with:
          channel-id: ${{ secrets.slack_channel_ids }}
          payload: |
            {
              "blocks": [
                {
                  "type": "section",
                  "text": {
                    "type": "plain_text",
                    "text": "${{ inputs.message }}",
                    "emoji": true
                  }
                },
                {
                  "type": "section",
                  "text": {
                    "type": "mrkdwn",
                    "text": ">*<${{ env.GITHUB_REPOSITORY_URL }}|${{ github.repository }}>*\n>*Job*\n><${{ env.GITHUB_ACTIONS_JOB_URL }}|${{ github.run_id }}>"
                  }
                }
              ],
              "text": "Repository: ${{ env.GITHUB_REPOSITORY_URL }}\nJob: ${{ env.GITHUB_ACTIONS_JOB_URL }}"
            }
        env:
          SLACK_BOT_TOKEN: ${{ secrets.slack_bot_token }}
          GITHUB_REPOSITORY_URL: ${{ github.server_url}}/${{ github.repository }}
          GITHUB_ACTIONS_JOB_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
```

そして、sample-app リポジトリで my-github-workflows の Workflow を参照すると完成です。

```.github/workflows/sample.yml
name: Sample

on:
  workflow_dispatch:

jobs:
  sample:
    uses: "ohakutsu/my-github-workflows/.github/workflows/notify-slack.yml@main"
    with:
      message: test sample
    secrets:
      slack_bot_token: ${{ secrets.SLACK_BOT_TOKEN }}
      slack_channel_ids: ${{ secrets.SLACK_CHANNEL_IDS }}
```

無事動作確認できました。

## さいごに

簡単にですが、Workflow 再利用を試してみました。

Workflow を入れ子のように呼び出したり、Action を使用するときと同様に`@main`ブランチ指定やタグ指定もできそうなので便利そうです。
他にも、Reusable workflow から output を渡すことができたりもするようで、様々な用途に使えそうです。

詳しくは、↓ に載っています。

https://docs.github.com/en/actions/using-workflows/reusing-workflows
【備忘録】Add-Type: Cannot find path 'Microsoft.Office.Interop.Excel.dll' because it does not exist.エラーの対処法

プロジェクトで使用するExcel操作用のPowerShellスクリプトが、バージョンの影響か、端末の違いか、私の環境でだけ動かなかった。
対処法を備忘録として残す。

## エラーメッセージ
スクリプト実行時、以下のエラーメッセージが表示される。
```
Cannot find path 'C:\スクリプト実行場所\Microsoft.Office.Interop.Excel.dll'because it does not exist.
```
スクリプト内の以下行でエラーになっているらしい。
```
Add-Type -AssemblyName "Microsoft.Office.Interop.Excel"
```
PowerShell 5の場合、正常に実行できた。
7系で実行すると私はエラーになるが、他の端末ではできた人もいるので、原因は不明。

## 解決方法
パスが見つからないと言われているので、とりあえず**Microsoft.Office.Interop.Excel.dll** をWindows内で探してみると、以下の4つが見つかった。
```
C:\Program Files\Microsoft Office\root\Office16\ADDINS\PowerPivot Excel Add-in\Microsoft.Office.Interop.Excel.dll
C:\Program Files\Microsoft Office\root\Office16\ADDINS\Microsoft Power Query for Excel Integrated\bin\Microsoft.Office.Interop.Excel.dll
C:\Program Files\Microsoft Office\root\Office16\ADDINS\PowerPivot Excel Add-inv16\Microsoft.Office.Interop.Excel.dll
C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
```
上から、スクリプト内のAdd-Type -AssemblyNameの該当箇所にdllファイルをパス指定してあげると、2つ目のdllファイルで無事動くようになった。
```
Add-Type -AssemblyName "C:\Program Files\Microsoft Office\root\Office16\ADDINS\Microsoft Power Query for Excel Integrated\bin\Microsoft.Office.Interop.Excel.dll"
```
zsh上でDynamic Routesのディレクトリを作成できない場合の対応 

## tl;dr
`~/.zshenv` などに以下のように設定する。

```zsh
setopt +o nomatch
```

その後、設定ファイルを `source` する。

## これはなにか
社内の活動で、[React公式ドキュメント](https://ja.react.dev/)や[Next.jsの公式ドキュメント](https://nextjs.org/docs)の輪読会が開催されています。  
[Dynamic Routes](https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes)を扱う回で、手元で実際に試そうとしたときに、zsh上で指定の形式のディレクトリを作成できなかったので、この記事ではその原因と対応について書きます。

## そもそもDynamic Routesとはなにか
Dynamic Routesとは、Next.jsに存在する機能のひとつで、この機能を利用することで、与えられたURLから動的にページを生成して返すことができます。

下記はDynamic Routesを設定したNext.jsの商品紹介アプリのディレクトリ構造例です。

```
app
└── products
    └── [name]
        └── page.tsx
(省略)
```

このとき、`/products/hogepiyo` へアクセスがあると、`./app/products/[name]/page.tsx` に `name` として `hogepiyo` が渡り、対応した内容がユーザに返ります。
`/products/foobar` へアクセスがあると、今度は同じ仕組みで `foobar` が渡り、対応した内容がユーザに返ります。

このように、商品紹介ページやブログ・ニュースサイトの記事ページ、検索結果ページなど、DBの値やユーザ入力によって返すものが変動するときに利用すると便利です。

## どんなことが起きたのか
前述の例のように、Dynamic Routesで取り扱いたい値は `[name]` のように `[]` でくくったディレクトリ名として設定してあげる必要があります。
ところがzsh上でディレクトリを作成しようとしたところ、下記のようにエラーになってしまい、ディレクトリを作成できませんでした。

```zsh
$ mkdir -p ./app/products/[name]
zsh: no matches found: ./app/products/[name]
```

## どうしてこれが起きるのか
Dynamic Routesの指定するディレクトリ名が、[zshのglob展開の構文](https://zsh.sourceforge.io/Doc/Release/Expansion.html#Filename-Generation)と衝突していることから発生しています。

```zsh
$ mkdir -p ./app/products/[name]
```

このとき、zshはmkdirコマンドにファイルパスを渡す前に、 `./app/products/[name]` をglobだと判断し、ファイル名として展開しようとします。
ところが、 `./app/products/[name]` のパターンにマッチするディレクトリやファイルが存在しないため、mkdirが実行される前にzshがエラーを出して処理が止まってしまいます。
そのため、`zsh: no matches found: ` というエラーによって、ディレクトリを作成できなくなっているのです。

## 対応
### 1. エスケープする
`[`, `]` の前にバックスラッシュを追加して、globだと判定させないことで都度対応します。

```zsh
$ mkdir -p app/products/\[name\]
 ```

### 2. zshのオプションを設定する
[zshのドキュメント](https://zsh.sourceforge.io/Doc/Release/Options.html)を読むと、glob展開時、マッチしなかった場合にエラーを出して処理を止める動作は `NOMATCH` オプションで制御できることがわかります。

>     NOMATCH (+3) <C> <Z>
>
>    If a pattern for filename generation has no matches, print an error, instead of leaving it unchanged in the argument list. This also applies to file expansion of an initial ‘~’ or ‘=’. 

`~/.zshenv` などに以下のように設定します。

```zsh
setopt +o nomatch
```

その後、設定ファイルを `source` します。

以上のどちらかで、Dynamic Routesで指定されている形式のディレクトリを作成できます。
【html.erb】Emmetを使いコードを楽に書く方法

html.erbファイルの実装を入力補完のプラグインを使って楽に書きましょう！

Ruby on RailsでのWebアプリケーション開発を行う際のビューに関する設定を備忘録としてメモしておきます。

# htmlのコード実装で入力補完してくれるEmmet
htmlファイルのコードを記述する際、これまで入力補完による楽な記述ができていました。

ですが、Ruby on RailsでのWebアプリケーション開発を行う際、html.erbという拡張子のファイルを作成する際には、入力補完が機能しないことに気づきました。

そんな時はEmmetというプラグインの設定をいじることで解決できます。


# Emmetとは？
Emmetとは、HTMLやCSSを省略記法で入力できるプラグインのことを言います。


# 省略コードの書き方

箇条書きリストのタグを入力したい場合、このような感じで省略コードを書きます。

### 箇条書きリスト

```ruby:html.erb
ul>li*10
```
このように入力してEnterを押すと、以下のように補完して自動的に入力してくれます。

```c:html.erb
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>
```

### 箇条書きリスト（リンク付き）

```ruby:html.erb
ul>li*10>a
```

```c:html.erb
<ul>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
  <li><a href=""></a></li>
</ul>
```
# 最後に
Emmetを設定することでコーディングが格段に楽になり、ミスも減ります。
上記以外にも、いろいろな省略コードがありますので、何か知りたい場合は、「Emmet 記法」などで検索してみると良いです。


# 参考サイト

https://qiita.com/gorohash/items/bb5c42e0054c83fd4a2d

https://webst8.com/blog/vscode-emmet/

https://zenn.dev/miz_dev/articles/6cac5f2e32398d
Pythonのpandasで、DataFrameの行を抽出するとき、自作の関数を使用する

# 結論
`DataFrame`の`apply`関数とラムダを組み合わせます。

# 前提
サンプルコードでは、下記の記事で公開している[csv](https://raw.githubusercontent.com/nkmk/python-snippets/df339a7fdbc65d1a7a310103a0f4a795dc3321a5/notebook/data/src/sample_pandas_normal.csv)を使用させていただきました。[csv](https://raw.githubusercontent.com/nkmk/python-snippets/df339a7fdbc65d1a7a310103a0f4a795dc3321a5/notebook/data/src/sample_pandas_normal.csv)からデータを取り込み、`DataFrame`を作成しております。

https://note.nkmk.me/python-pandas-query/

# サンプルコード
```.py
import pandas as pd

# 抽出条件として使用する関数
def condition(row):
    if row['name'] == 'Bob': return True
    if row['state'] == 'NY': return True
    if (row['state'] == 'CA') and (row['point'] == 70) : return True
    return False

def main():
    # ...
    # dfにはすでにDataFrame型のデータが入っているものとします。
    print('全データ')
    print(df)
    
    print()
    
    print('抽出後')
    # apply関数とラムダを組み合わせて、関数に条件を委ねる
    # 「df.apply」と記述して1行の情報が全てほしい場合、axis=1が必要
    print(df[df.apply(condition, axis=1)])

if __name__ == '__main__':
    main()
```

### 結果
```
全データ
      name  age state  point
0    Alice   24    NY     64
1      Bob   42    CA     92
2  Charlie   18    CA     70
3     Dave   68    TX     70
4    Ellen   24    CA     88
5    Frank   30    NY     57

抽出後
      name  age state  point
0    Alice   24    NY     64
1      Bob   42    CA     92
2  Charlie   18    CA     70
5    Frank   30    NY     57
```

関数の条件が適応されていることが分かります。

# 補足
サンプルコードにあったコード
```.py
# apply関数とラムダを組み合わせて、関数に条件を委ねる
# 「df.apply」と記述して1行の情報が全てほしい場合、axis=1が必要
print(df[df.apply(condition, axis=1)])
```
これは、下記のコードを簡略したものです。
```.py
# apply関数とラムダを組み合わせて、関数に条件を委ねる
# 「df.apply」と記述して1行の情報が全てほしい場合、axis=1が必要
print(df[df.apply(lambda row: condition(row), axis=1)])
```
@shiracamus さんに教えていただきました。ありがとうございます！

以上です。

# 参考
https://note.nkmk.me/python-pandas-query/

https://qiita.com/ohtakazuki/items/522bb191aa7b510991aa

https://qiita.com/mihonak/items/d98f1dd846545c79155d
PoetryでPytorch 2.0.1をインストールするとCUDA関係の依存関係が入らない

# はじめに
condaで管理していた環境をpoetryに移して、pytorchを使おうとすると……
```
$ python
Python 3.10.12 | packaged by conda-forge | (main, Jun 23 2023, 22:40:32) [GCC 12.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/conda/envs/py310/lib/python3.10/site-packages/torch/__init__.py", line 229, in <module>
    from torch._C import *  # noqa: F403
ImportError: libcupti.so.11.7: cannot open shared object file: No such file or directory
```

pipやcondaでは正しくインストールして動作するのですが、poetryだと駄目みたいです。


# 原因
大方ここに書いてありました。

https://github.com/pytorch/pytorch/issues/100974

どうやらwheelには依存関係が正しく含まれているようですが、https://pypi.org/pypi/torch/2.0.1/json ではいくつか抜けてしまっているようです。

# 対処
## 方法1：手動で依存関係を追加
`pyproject.toml`の`[tool.poetry.dependencies]`以下に次の依存関係を追加します。
```
torch = "2.0.1"
nvidia-cublas-cu11 = { version = "11.10.3.66", platform = 'linux' }
nvidia-cuda-cupti-cu11 = { version = "11.7.101", platform = 'linux' }
nvidia-cuda-nvrtc-cu11 = { version = "11.7.99", platform = 'linux' }
nvidia-cuda-runtime-cu11 = { version = "11.7.99", platform = 'linux' }
nvidia-cudnn-cu11 = { version = "8.5.0.96", platform = 'linux' }
nvidia-cufft-cu11 = { version = "10.9.0.58", platform = 'linux' }
nvidia-curand-cu11 = { version = "10.2.10.91", platform = 'linux' }
nvidia-cusolver-cu11 = { version = "11.4.0.1", platform = 'linux' }
nvidia-cusparse-cu11 = { version = "11.7.4.91", platform = 'linux' }
nvidia-nccl-cu11 = { version = "2.14.3", platform = 'linux' }
nvidia-nvtx-cu11 = { version = "11.7.91", platform = 'linux' }
triton = { version = "2.0.0", platform = 'linux' }
```

## 方法2：`2.0.0`を使う
`2.0.0`なら正しく動くようです。特に`2.0.1`を使う理由がなければこちらを使っても良いかと思います。
`pyproject.toml`の`[tool.poetry.dependencies]`以下に`torch = ">=2.0.0, !=2.0.1"`を追加します。


# 参考

https://github.com/python-poetry/poetry/issues/7902

https://github.com/pytorch/pytorch/issues/100974