OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】ボタン内でtextを改行して上と下で別のclassを指定したい。

## こういうボタンを作りたいときに困ったので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723972/60608f54-925a-9ae6-f20e-76b524add04a.png)


## 書き方が分からなかったので試行錯誤した

```ruby:qiita.erb
<%= submit_tag "規約を確認のため、\n投稿する", class:'hobehoge',name:nil %> 
```
のように書くと改行はできるけど、こんな感じになってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723972/67bba1e5-3f1d-d56c-fe78-e57428bd4bf8.png)

「規約を確認の上、」の部分と「投稿する」の部分で別のcss定義を反映したい。


```ruby:qiita.erb
<% submit_label "<span class = 'fugafuga'>規約を確認のため、</span>" %> 
<%= submit_tag "#{submit_label}+\n投稿する", class:'hobehoge',name:nil %> 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723972/695934a4-536a-33ca-88f8-bb059a46d1c7.png)

だとのようにspanタグで設定したい内容がボタンに表示されてしまう…

## 【結論】button_tagとcontent_tagを使った

```ruby:qiita.erb
<%= button_tag type::sumit,class: 'hogehoge' do %> 
  <%= cotent_tag :span,"規約を確認のため、",class:'fugafuga' %> 
  <%= cotent_tag :br,"投稿する" %> 
<% end %> 
```
button_tagについて
https://railsdoc.com/page/button_tag

content_tagについて
https://railsdoc.com/page/content_tag

それぞれのクラスを指定してcontent_tagをbutton_tagで囲うと期待していたボタンのデザインが完成した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723972/60608f54-925a-9ae6-f20e-76b524add04a.png)

## 感想
submit_tagしか知らなかったからこういった書き方があるんだな～と思った。
似たようなものにbutton_toというものがある。
違いはリンク先の記事が分かりやすかった。
https://zenn.dev/dai_44/scraps/210c5291226c9b
Playwrightを用いてフロントエンドのE2Eテストに触れてみる

サポーターズのオンラインで開催されたE2Eテスト勉強会に参加して学んだことをまとめたのでアウトプットします。普段の開発や学生生活であまり体験することのないテスト工程について学べて触れることができました。

https://talent.supporterz.jp/events/5514283c-d726-4a5a-b759-3593d1d74b23/

## 環境構築
作成するディレクトリでこのコードを作成していくつかの質問に答えると自動で作成されます。
```
npm init playwright@latest
```
このコードを入力するとUIモードが起動し、ウィンドウが開きます。
```
npx playwright test --ui
```


## ソフトウェアテストとは
プログラムからバグを見つける作業。プログラム中の欠陥を修復することをデバッグという
#### なぜテストを書くのか
- 正常な動作を保証する
- 欠陥を発見する
- 健全なコードを継続的に維持する
- 欠陥の発生を未然に防ぐ


## E2Eテストとは
end-to-end(E2E)
ユーザーの視点でウェブシステムの動作を確認するテスト
例）フロント、バック、DB

#### 自動化すべきなのか？
投資対効果を意識して自動化することが望ましい
壊れにくいE2Eテストを作成する技術もある

## playwrightとは
ブラウザ操作のAPI＋テスト関連の機能をオールインワンで提供するアプリケーション
- クロスブラウザ
- 堅牢で安定したテスト
- 制限のないテストシナリオ
- テストの完全な分離と高速化
- テスト作成とデバッグのための強力なツール

その他ツール
cypress
puppeteer
Nightwatch

## テスト用API
ロケーター
- ページ内要素の特定
ナビゲーション
- ページ遷移、ページ情報返却
アクション
- ユーザ操作のシュミレート
マッチャー
- 選択要素の状態と期待値の検証

### ロケーター
ページ上の任意の要素を特定するモノ

page.getByRole()
- アクセシビリティ情報から要素を特定する
page.getByLabel()
- HTMLフォーム要素のラベルテキストから要素を特定する
getByText()
- HTML要素に含まれるテキストから要素を特定する

getByTestId()は使用すべきでない？
	ソースコードを見ないとわからないから
	最終手段として使う
CSSセレクタなども使用すべきでない

### ナビゲーション
URLに関連するアクション

### アクション
ロケーターで選択した要素に対して、キーボード操作やマウス操作を行うこと
- .fill()に入力
- .clear()でクリアする
- press()
キーストロークを作成する
- pressSequentially()
フィールドに1文字ずつ入力する
- check()
ロケーターで選択して
- click()/dblclick()
クリックとダブルクリック

mouse.move( )/mouse.up( )/mouse.down( )
座標を指定してドラックアンドドロップを再現できる

### マッチャー
選択した要素の状態と期待値の検証を行う
ボタン操作やリンク操作などの何らかのアクションに伴い、何らかの最終結果の表示を確認する
toChecked()
チェックボックスを確認する
toByEmpty()
要素が空かどう確認
.not
マッチャーの前につけると否定になる

## 何をテストするのか
メンテナンスコストも実行時間も大きいため、効果のないテストを増やすことはデメリットになる
**「何をテストするのか」** を適切に決めることが大切

### シナリオを考えるポイント
・コアとなる正常系のユーザーシナリオを考える
例）ログイン、投稿機能等
・ビジネス上影響の大きいユーザーシナリオを考える
例）会員登録、購入・課金等
シェルスクリプトのaliasを使った引数の生成（メタプログラミング）

## はじめに

シェルスクリプトの `alias` はコマンドに対して別名をつけたり、標準で追加するオプションを定義したりするために、主に（シェルスクリプトではなく）対話シェルで使う機能です。しかしその機能は単語を置き換えるだけという単純な機能であるため、メタプログラミングやシェル言語のハックに利用することができます。これを利用して変数を使わずにコマンドの引数を変更するテクニックを思いついたので紹介します。

## コードと説明

```sh
# bash の場合にシェルスクリプトでエイリアスを有効にする
[ $BASH_VERSION ] && shopt -s expand_aliases

cmd() { echo "$#" : "$@"; }
alias cmd="cmd "

alias args="a b c"
cmd args # cmd a b c => 3 : a b c

alias args="'a b c'"
cmd args # cmd 'a b c' => 1 : a b c
```

このコードで珍しいのは、おそらく `alias cmd="cmd "` の末尾にあるスペースでしょう。本来この機能は後続の単語をエイリアス展開する時に使います。例えば `nohup` コマンドを使うときなどに使用します。`nohup` コマンドはコマンドを実行したまま端末をログアウトする時に使うコマンドで以下のような形で使います。

```console
$ nohup backup.sh &
```

一般的にエイリアスは最初の単語、つまり `nohup` しかエイリアス展開の対象になりません。もし後続の単語、つまり `backup.sh` もエイリアス展開の対象にしたい場合は `alias nohup="nohup "` とエイリアスを定義すれば可能になります。本来はこのように後続の「コマンド」に対してエイリアス展開を行うのですが、結局のところシェルにとってコマンド名と引数に違いはなくどちらも単なる文字列です。別にコマンドでなくとも展開することができます。

エイリアス展開は単なる文字列として展開を行います。したがって次のようなコードは正しく動作します。

```sh
alias tr="tr "
alias "%file%"='< "$file"'

file=/etc/hosts
tr %file% a-z A-Z
```

エイリアスを利用すると変数を使うだけではできないことができてしまうのです。嫌われがちの `eval` も使用していません。もっともやっていることは `eval` と大差ありませんが。

## さいごに

このようなテクニック（メタプログラミング）は一般的なシェルスクリプトで使うようなものではなく、使い方を間違えるとトラブルの原因になり得ますが、時としてシェルスクリプトの限界を超えるようなことを可能にできたりします。今のところ便利な使い方は思いついていませんが、なにか変わったことができそうだと予感しています。
「電子署名=『秘密鍵で暗号化』」という良くある誤解の話　……の解きほぐし

■概要
------------------------------

[「電子署名=『秘密鍵で暗号化』」という良くある誤解の話](https://qiita.com/angel_p_57/items/d7ffb9ec13b4dde3357d) の記事内容を整理して、『秘密鍵で暗号化』が誤解である理由をわかりやすく説明する。



■電子署名で出来ること
------------------------------

電子署名（デジタル署名）とは、あるメッセージがその作者によって作られたことを検証する仕組み。

平文のメッセージm、電子署名s、公開鍵から、以下が検証できる。

- mが秘密鍵の持ち主によって作られたこと
- mが改ざんされていないこと


■RSAで電子署名を実現する初期のアイデア
------------------------------


RSA暗号アルゴリズムには、公開鍵で暗号化する関数、秘密鍵で復号化する関数『しか存在しない』。
公開鍵と秘密鍵は形式が違うため、公開鍵を秘密鍵として利用したりその逆を行うこともできない。
```
１． 暗号化関数(平文メッセージm, 公開鍵) → 変換されたデータs
２． 復号化関数(変換されたデータs, 秘密鍵) → 平文メッセージm
 ```
これでは秘密鍵を使った関数で平文しか出力できないので電子署名が実現できないように思える。

ここで……、
```
２． 暗号化関数(変換されたデータs, 公開鍵) → 平文メッセージm
１． 復号化関数(平文メッセージm, 秘密鍵) → 変換されたデータs
```
……ということが『可能であるとすれば』、秘密鍵を使った関数で変換されたデータsを作り、それを電子署名として平文メッセージmに添付することで秘密鍵の持ち主によって署名がつくられたこと、改ざんがされていないことを検証できる。
そしてRSAではこれが『可能である』ため、実際にRSAを使って電子署名を実現できている。

このアイディアは1977年に公開鍵暗号と同時に提唱された。


■RSA以外の普及している電子署名
------------------------------


前述の「初期のアイデア」は、暗号化関数と復号化関数を逆にしても成立するという特殊な性質を必要とする。

これはむしろ、RSAが例外的に持っている性質であるため、他の公開鍵暗号アルゴリズムではこの手法は使えないことが多い。

しかし電子署名の本質はあくまで、(秘密鍵を持つ)本人のみが署名を作れること、(秘密鍵と対になる公開鍵を使って)誰でも署名データの妥当性を検証できることである。メッセージをまるごと暗号化、復号化できる必要は、じつは無い。

今日主流の電子署名では、以下のような要件のみを満たすアルゴリズムが使われている。
このアルゴリズムはメッセージ全体の暗号化、復号化をできないので、もはや公開鍵『暗号』を使った方式とは言えない。

- 平文メッセージmと秘密鍵から、電子署名sを作成できる関数
- 平文メッセージmと公開鍵から、検証用の値(a)を作成する関数
- 正しい電子署名sと公開鍵から、上記と同じ値の検証用の値(b)を作成する関数
  ※(a)と(b)が一致することで、署名データの妥当性を検証できる


■結論
------------------------------


- RSAについて

  - 「秘密鍵で暗号化（＝RSA暗号化関数に平文メッセージと秘密鍵を渡して戻り値を得る）」して電子署名を作るというのは、厳密には誤っている。

  - 「秘密鍵で復号化（＝RSA復号化関数に平文メッセージと秘密鍵を渡して戻り値を得る）」して電子署名を作るというのが正しい。

- RSA以外の電子署名について

  - そもそも署名データの妥当性を検証するために暗号化・復号化できる公開鍵暗号を使っていない。
	そのため「秘密鍵で暗号化」という表現は成立しない。


よって、電子署名=『秘密鍵で暗号化』」は誤解である。



■補足
------------------------------


しかし技術資格試験や多くの解説サイトでは、（本当は「RSAを使う場合は秘密鍵で復号化する」と書くべきところが）「秘密鍵で暗号化する」となっている。
厳密な話をするのでなければ、この表現は受け入れるしかない。

> 実は間違いとしては駄目でした。なぜなら、技術資格試験(情処など)のその手の問題で不正解として点を失う恐れがあるからです。
> 試験対策で「秘密鍵で暗号化」という記述があった場合は大人の対応で受け入れて下さい。カラスは白いんです。

https://qiita.com/angel_p_57/items/d7ffb9ec13b4dde3357d#%E7%A7%98%E5%AF%86%E9%8D%B5%E3%81%A7%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%AF%E6%9C%AC%E5%BD%93%E3%81%AB%E9%96%93%E9%81%95%E3%81%84%E3%81%AA%E3%81%AE%E3%81%8B-314%E8%BF%BD%E8%A8%98
【 Mac OS 】multipass authenticateでハマった場合の解決方法

## はじめに

MacでUbuntuの環境を使う選択肢として、Multipassがあります。Multipassのバージョンをアップグレードした際に、multipassのコマンドを使おうとすると、`multipass authenticate`を実施して下さいと言われ、コマンドが使えなくなったので、その解決方法を記載します。

## ハマった事

multipassのコマンドを実行しようとしたところ、
```
multipass ls
```
以下のようなエラーが発生しました。
`multipass authenticate`を実施して下さいと書かれています。

```
list failed: The client is not authenticated with the Multipass service.
Please use 'multipass authenticate' before proceeding.
```
書かれている通り、以下の通り'multipass authenticate'を実行します。

```
multipass authenticate
```
すると、パスフレーズの入力を求められます（設定した覚えがない！）

```
Please enter passphrase: 
```
認証に失敗すると、`multipass set local.passphrase`でパスフレーズを設定してから認証を行うように言われます。

```
authenticate failed: Passphrase is not set. Please `multipass set local.passphrase` with a trusted client.
```
書かれている通り、`multipass set local.passphrase`を実行すると、以下の通りパスフレーズの設定を求められるので、パスフレーズを決めて入力します。

```
multipass set local.passphrase
```
解決したかと思いきや、以下の通りエラーが発生します。
setコマンドを使用するには、先に`multipass authenticate`を実施しておく必要があるとのこと。エラーの無限ループに陥って、詰んでしまいました。

```
set failed: The client is not authenticated with the Multipass service.
Please use 'multipass authenticate' before proceeding.
```

解決策を探したところ、やっとの事で英語の記事を見つけました（日本語での記事は、本記事が初になります）。英語の記事は終わりに載せておきます。

## 解決策

あまり深く考えず、以下のコマンドをコピペで実行して下さい。すると、`multipass ls`コマンド等が今まで通り利用できるようになります（ホッとしました）。

```
$ sudo launchctl unload /Library/LaunchDaemons/com.canonical.multipassd.plist
$ sudo killall Multipass
$ sudo rm /var/root/Library/Application\ Support/multipassd/authenticated-certs/multipass_client_certs.pem
$ sudo cp ~/Library/Application\ Support/multipass-client-certificate/multipass_cert.pem /var/root/Library/Application\ Support/multipassd/authenticated-certs/multipass_client_certs.pem
$ sudo launchctl load /Library/LaunchDaemons/com.canonical.multipassd.plist
```
Linux版の解決策も載っていたので、参考に記載しておきます。

```
$ sudo snap stop multipass
$ sudo killall multipass.gui
$ sudo rm /var/snap/multipass/common/data/multipassd/authenticated-certs/multipass_client_certs.pem
$ sudo cp ~/snap/multipass/current/data/multipass-client-certificate/multipass_cert.pem /var/snap/multipass/common/data/multipassd/authenticated-certs/multipass_client_certs.pem
$ sudo snap start multipass
```

## 参考文献

https://discourse.ubuntu.com/t/unable-to-authorize-the-client-and-cannot-set-a-passphrase-workaround/28321
Naninobel備忘録

学んだことを追記予定。

---

--2024/9/2--

デモプロジェクトのスタートはできるけどSTART DEMO等々ボタンが押下できない場合
↓↓↓
Package ManagerからNaninovelをダウンロードおよびインポートする（現在ではv1.19推奨）

もしv1.18など前バージョンをインポートしている場合は**プロジェクトごと全消し**する（バージョンアップ方法不明です、有識者コメントお願いします……）

v1.19インポートやり方（該当Discodeへの参加必須）
↓↓↓
「プロジェクト」タブから「パッケージをインポート」、「カスタムパッケージ…」へと進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3873268/bdf88d4b-8b70-ce00-28ff-b14cbcdc0758.png)

Discode内で公開されてるv1.19の.unitypackageファイルを選択してインポートする

これでデモを進められるはず。普通はこんなんでつまづかないんだろうなぁ（遠い目）

---

--2024/9/8--

VScodeのNaninovel拡張機能について。
現在すぐにインストールできるバージョンはv1.9.0（おそらくv1.19と対応している）。

ただUnity上で使用しているバージョンがv1.18の場合は、拡張機能の方をv1.8.0にしないと上手く動作しないっぽい。理由は不明。

~~実際これで自作コマンド反映されない問題が解決したので、~~ 一バージョンごとにしか対応してない可能性ががが

（追記）自作コマンドで「Command 'XXX' is unknown.」てなっても問題なく使えた。

---

--2024/9/13--

https://naninovel.com/ja/guide/integration-options#switching-modes

上記URLの「3. ステートをリセット。」の箇所を一番上に持ってきたところ、

```言語:C#
Debug.Log(scriptPlayer); //Naninovel.ScriptPlayer
Debug.Log(scriptPlayer.PlayedScript); //Null
```

という結果になった。どこまでリセットされるかは不明なので、最後あたりに持ってきた方が無難なのかも。

---

--2024/9/14--

無料アセット「Simple Fade Scene Transition System」について。本趣旨からは外れるけどまあよかろう。
https://assetstore.unity.com/packages/tools/particles-effects/simple-fade-scene-transition-system-81753

以下の書き方をすればシーン間でのフェードイン・アウトを勝手にやってくれる優れもの。
```言語:C#
Initiate.Fade("シーン名", Color.XXX, X.0f（フェードの速さ）);
```
自分が躓いたのが、最後のフェードの速さのトコで「あれ、ここデカくすりゃフェードの時間も伸びるんちゃうん？」と思ってしまったこと。

逆です。フェードが過ぎ去る速さなので、値を大きくすればするほど光の速さで過ぎていきます。お気を付けください。
RailsのMinitestで処理実行前後の差分テストをスマートに書きたい

# ざっくりで言うと
処理実行前後の差分テストを行う時は、以下のメソッドを使うって話です。
- assert_changes
- assert_difference
- assert_no_changes
- assert_no_difference

# どれぐらいスマートに書けるか
以下二つのテストコードを比較してください。
## 上記のメソッドを使わなかった時
```ruby
test 'ユーザーを作成' do
  before_count = User.where('hoge').count

  # ユーザー作成処理
  post users_path, params: { name: 'hoge' }

  after_count = User.where('hoge').count

  assert_equal(1, after_count - before_count)
end

test 'ユーザーをプレミアム会員に変更' do
  before_grade = User.find(1).gread
  assert_equal before_grade, 'REGULAR'

  # ユーザーをプレミアム会員に更新
  patch users_path(1), params: { gread: 'PREMIUM' }

  after_grade = User.find(1).gread
  assert_equal after_grade, 'PREMIUM'
end
```
## 上記のメソッドを使った時
```ruby
test 'ユーザーを作成' do
  assert_difference -> { User.where(name: 'hoge').count } => 1 do
    # ユーザー作成処理
    post users_path, params: { name: 'hoge' }
  end
end

test 'ユーザーをプレミアム会員に変更' do
  assert_changes -> { User.find(1).gread }, from: 'REGULAR', to: 'PREMIUM' do
    # ユーザーをプレミアム会員に更新
    patch users_path(1), params: { gread: 'PREMIUM' }
  end
end
```
どうでしょう？かなりスッキリしたと思います。
また、このメソッドを利用した方が仕様がわかりやすくなります。

# assert_difference活用サンプル
## 予期したデータが作成されていることを確認
```ruby
assert_difference -> { User.where(name: 'hoge').count } => 1 do
  # ユーザー作成処理
  post users_path, params: { name: 'hoge' }
end
```
## 予期したデータが削除されていることを確認
```ruby
assert_difference -> { User.where(id: 1).count } => -1 do
  # ユーザー削除処理
  delete users_path(1)
end
```
## 2つ以上の値の変化を見る
```ruby
# 名前がhogeの人が増えていることと、全体で1件足され、余計なデータが増えていないことが確認できる。
assert_difference -> { User.where(name: 'hoge').count } => -1,
                  -> { User.count } => -1 do
  # ユーザー作成処理
  post users_path, params: { name: 'hoge' }
end
```
# assert_change活用サンプル
## 予期値に更新されてることを確認
```ruby
assert_changes -> { User.find(1).gread }, from: 'REGULAR', to: 'PREMIUM' do
  # ユーザーをプレミアム会員に更新
  patch users_path(1), params: { gread: 'PREMIUM' }
end
```
## 2つの以上の値を確認する
公式ドキュメントを見た感じで、普通にはできなさそうなので、配列を利用します。
```ruby
assert_changes -> { user = User.find(1)
                    [user.gread, user.name] },
               from: ['REGULAR', 'hoge'],
               to: ['PREMIUM', 'hogehoge'] do
  patch users_path(1), params: { gread: 'PREMIUM', name: 'hogehoge' }
end
```
# assert_no_difference活用サンプル
使い方はassert_differenceとほとんど同じです。差分がないので、その分の引数が不要になります。
```ruby
assert_no_difference -> { User.count } do
  # 不正な名前はデータ作成を行わない
  post users_path, params: { name: '不正な名前' }
end
```
# assert_no_changes活用サンプル
使い方はassert_changesとほとんど同じです。差分がないので、`to:` のパラメータ引数が不要になります。
```ruby
assert_no_changes -> { User.find(1).name }, from: 'hoge' do
  # 不正な名前に更新しない
  patch users_path(1), params: { name: '不正な名前' }
end
```
# 記述する時の注意点
各メソッドのラムダの部分は文字列で書くこともできます。
```ruby
assert_difference 'User.where(name: "hoge").count', 1 do
  # ユーザー作成
  post users_path, params: { name: 'hoge' }
end
```
この書き方をするとIDEの名前変更機能がこの部分に適用されない恐れがあるので、ラムダで書くのがおすすめです。

# 参考
https://api.rubyonrails.org/v7.2/classes/ActiveSupport/Testing/Assertions.html#method-i-assert_changes
Pythonの非同期タスク処理ライブラリCeleryの入門ガイドビギナー向け

## 1. Celeryとは

Celeryは、Pythonで書かれた非同期タスクキューライブラリです。大規模なアプリケーションで、時間のかかる処理や定期的なタスクを効率的に実行するために使用されます。

主な特徴：
- 分散システムでの非同期タスク実行
- スケジューリング機能
- 様々なメッセージブローカーとの互換性（Redis、RabbitMQなど）
- 高い拡張性と柔軟性

## 2. Celeryのインストールと基本設定

まず、Celeryをインストールしましょう。

```bash
pip install celery
```

次に、プロジェクトにCeleryを設定します。`celery.py`ファイルを作成し、以下のコードを追加します：

```python
from celery import Celery

app = Celery('myproject',
             broker='redis://localhost:6379/0',
             backend='redis://localhost:6379/0',
             include=['myproject.tasks'])

app.conf.update(
    result_expires=3600,
)

if __name__ == '__main__':
    app.start()
```

このコードでは、Redisをブローカーとバックエンドとして使用しています。

## 3. タスクの定義

タスクは、Celeryで非同期に実行される関数です。`tasks.py`ファイルを作成し、以下のようにタスクを定義します：

```python
from celery import shared_task

@shared_task
def add(x, y):
    return x + y
```

`@shared_task`デコレータを使用することで、この関数がCeleryタスクとして認識されます。

## 4. タスクの実行

タスクを実行するには、以下のようにします：

```python
from myproject.tasks import add

result = add.delay(4, 4)
```

`delay()`メソッドを使用すると、タスクが非同期で実行されます。

## 5. 結果の取得

タスクの結果を取得するには、以下のようにします：

```python
result = add.delay(4, 4)
print(result.get())  # 8
```

`get()`メソッドは、タスクが完了するまでブロックします。

## 6. 定期的なタスクのスケジューリング

Celeryを使用して、定期的にタスクを実行することができます。`celery.py`に以下を追加します：

```python
from celery.schedules import crontab

app.conf.beat_schedule = {
    'add-every-30-seconds': {
        'task': 'myproject.tasks.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}
```

これにより、`add`タスクが30秒ごとに実行されます。

## 7. ワーカーの起動

Celeryワーカーを起動するには、以下のコマンドを使用します：

```bash
celery -A myproject worker --loglevel=info
```

## 8. Celery Beatの使用

定期的なタスクを実行するには、Celery Beatを使用します：

```bash
celery -A myproject beat --loglevel=info
```

## 9. タスクの優先順位

タスクに優先順位を設定することができます：

```python
@shared_task(priority=10)
def high_priority_task():
    pass
```

数値が大きいほど、優先順位が高くなります。

## 10. エラーハンドリング

タスクでエラーが発生した場合、自動的に再試行するように設定できます：

```python
@shared_task(bind=True, max_retries=3)
def my_task_with_retry(self):
    try:
        # タスクの処理
    except Exception as exc:
        raise self.retry(exc=exc, countdown=60)
```

## 11. タスクのチェーン

複数のタスクを連鎖的に実行することができます：

```python
from celery import chain

result = chain(add.s(4, 4), add.s(8))()
print(result.get())  # 16
```

## 12. モニタリング

Celeryの動作状況をモニタリングするには、Flowerというツールが便利です：

```bash
pip install flower
celery -A myproject flower
```

これにより、Webインターフェースでタスクの状況を確認できます。

## 13. 並列処理

Celeryは複数のワーカーを使用して並列処理を行うことができます：

```bash
celery -A myproject worker --concurrency=4 --loglevel=info
```

この例では、4つの並列ワーカーを起動しています。

## 14. タスクのグループ化

複数のタスクをグループ化して実行することができます：

```python
from celery import group

result = group(add.s(i, i) for i in range(10))()
print(result.get())  # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
```

## 15. セキュリティ対策

Celeryを本番環境で使用する際は、以下のセキュリティ対策を考慮してください：

- SSL/TLSを使用した通信の暗号化
- 認証機能の有効化
- タスクシリアライゼーションの制限

```python
app.conf.task_serializer = 'json'
app.conf.accept_content = ['json']
```

以上が、Celeryの基本的な使い方と主要な機能の解説です。Celeryを使いこなすことで、Pythonアプリケーションのパフォーマンスと拡張性を大幅に向上させることができます。非同期処理やバックグラウンドタスクの実装に悩んでいる方は、ぜひCeleryの導入を検討してみてください。
採用人事がエンジニア目指すってよ

# 採用人事がエンジニア目指すってよ
こんにちは。こんばんは。
IT業界にいれば1度は聞いたことがあるであろう企業のエンジニア採用人事をしている"どこかの人事ちゃん"です。**人事ちゃん**と呼んでください。

ところで、エンジニア経験が全くと言ってない文系人材がエンジニア採用を担当するって結構無理ゲーだと感じていて。（不可能ではないと思う。世の中の大半がそうだと思うし。）
私は今新卒3年目でエンジニア採用担当になって10カ月だけど、既にどことなく感じている気持ち悪さ。何もエンジニアのこと知らないのに、自分が学生に何をしてあげられるっていうんだという文系人事の限界を感じている真っ最中です。

例えば、GoとかRubyはバックエンドで使用する言語だよとか開発手法にアジャイルとウォーターフォールがあるよとかITパスポートレベルの話は知っている。大学3年の秋に就活の足しになればと思い1か月勉強したり前職もエンジニア専門のエージェントで働いていたので基本的な知識は持っているつもり。

それで？
それが何の役に立つんだ？
私この場にいる意味ある？
ただ採用オペレーション回すだけだったら誰でもできるでしょ。自分がリクルーターとして介入価値のある人間になるにはどうしたらいいんだ？

結論：**エンジニアになる（暴論）**

## 結構本気

冗談抜きでこれが一番いいと思っている。いくら時間がかかっても。
だって、自分より仕事できない人に何言われても響かないじゃん？
現場で働いている人間が営業経験ない本社の人にあーだこーだ言われても
「( ﾟДﾟ)ﾅﾆｶ?」って感じだよね？
少しでも経験してる人に言われるのと全く経験していない人に言われるのでは雲泥の差があると勝手に思っている。少なくとも私はそう。

なので**自分が身をもって学んで経験することで、学生が自分のより良いキャリアを選択できる何かを提供してちゃんと介在価値があるリクルーターになりたいと思っている。**

## ごめん。ちょっときれいごと言ってる自覚はある。

とはいったけど、理由はそれだけじゃなくて。
ビジネス職は大半そうかもしれないけど、**自分のスキルを言語化/定量化するのって結構難しい**と思っていて。「これを経験したことある」とか「これができる」とかを客観的に把握することが難しい。今私は正にこれに悩んでいて、自分って実は何もできないんじゃないかと疑心暗鬼に陥る要因の一つになっている。
今こそ、ある程度名の通っている企業にいるからそこそこ上手くいっている部分も多くあって、じゃあまったく状況の違う企業に行ったらどうなるかって言われたらもう、本当に、
恐ろしくて涙が出るよね^^
だから、自分はこれができるよ！っていう何か安心できるスキルが欲しいのもあるんだと思う。

## シンプルにエンジニアの文化が好き。
勿論企業によってエンジニア組織の文化とか雰囲気と勝手違うと思うけど、少なくとも私は弊社のエンジニア組織のカルチャーが大好きで。
あえて言語化してみると、
- ユーザーにとっての本当の価値を追求することに夢中になっている
- 勉強会や技術発信会のような技術研鑽系のイベントを自発的に開催して技術を高め合うような関係性・環境がある
- 開発合宿とか楽しそう（非常に安易）

普段社内のエンジニアが集まるミニ総会（こんな機能をリリースしたよ～とか）に参加してるけど、シンプルにエンジニアってすごいな、かっこいいなと思えることが多くて、自分の性格上かっこいいと思ったことは見てるだけでは収まらない性格でやってみたいという感情が湧いてくるので挑戦してみたいというのもある。

## 甘くないよね。

といってもまあ甘くないよねというお話。（当たり前）
よく巷で「ITエンジニアになろう！」「Webエンジニアになろう！」みたいな広告を垂れ流しているプログラミング教室があるが、非常にナメていることだけはわかる。
普段すごいエンジニアを目の当たりにしているから今自分がそう感じるんだろうけど、かなり小手先というか、なんというか、情報弱者に向けてあまり役に立たない教材を売っていることだけはわかる。（一概にそうだとは言えないが。）

だからそれなりの覚悟感を持って、本当に長期的にしっかり取り組んでいきたいと思っているというのが今のお気持ち。

## まずCSから学んでみる。

昨日夜中3時にRecursionに登録して無料コンテンツをさらっと読んでみた。
ただただため息が出た。今まで使ってた言葉の定義全然違うじゃん、とか。色々。
でもやっぱり自分が何も知らないことを学んでいることにドキドキ感ワクワク感を感じている自分がいる。あくまで本業は採用人事だから、めちゃくちゃ時間を割いてコミットする！とかはできないけどとにかくできることはやってみようと思う。ありがたいことに弊社には心優しいエンジニアがたくさんいるので分からないことがあったら教えてくれそうだし。（他力本願）なんとか頑張りたい。

どうぞ、いつまでこのブログが続くのかは見てのお楽しみ^^
1週間に1回更新出来たら良い方かな～
SwiftUIでの柔軟な吹き出し作成とアニメーション化: Popoverから手作りまで

この記事についての詳細説明となります。

https://android.benigumo.com/20240827/speech-bubble/


# 1. SwiftUIでのPopoverを使った吹き出しの作成
この記事では、SwiftUIを使って吹き出しを作成する手法が解説されています。最初に紹介されているのは、popover(isPresented:arrowEdge:content:) を利用したシンプルな方法です。Popoverは、iOS開発者にとって便利なツールであり、簡単に使用できる点が魅力です。この方法を使うことで、ユーザーインターフェース内に簡単な吹き出しを表示させることができます。

具体的なコードとしては、HStack内に配置されたText要素に対して、popoverメソッドを適用しています。このpopoverメソッドには、表示を制御するためのブール型の状態変数と、吹き出しをどの方向に表示するかを指定するarrowEdge、そして表示するコンテンツを指定するクロージャが渡されます。これにより、ユーザーがボタンを押すと、指定された方向に吹き出しが表示される仕組みになっています。

Popoverを使った方法は一見便利に思えますが、実際に試してみるといくつかの問題点が明らかになりました。例えば、arrowEdgeを.trailingに設定しても、期待通りに吹き出しが横方向に表示されないケースがありました。また、吹き出しの背景色やボタンの色が予期せず変わる現象も確認されました。これらの問題は、UIデザインにおいて制約となり得るため、特にカスタマイズ性が求められる場合には、別のアプローチを検討する必要があります。

# 2. Popoverの限界とカスタマイズの必要性
Popoverを使用する際のもう一つの大きな課題は、デフォルトの設定では柔軟性が不足している点です。特に、カスタムデザインを実現したい場合や、UIの特定の部分にのみ吹き出しを表示したい場合には、Popoverでは十分な制御ができません。このため、開発者はPopover以外の方法を模索することが求められることがあります。

この記事では、Popoverの限界を克服するために、手作りで吹き出しを作成するアプローチが提案されています。この手法を採用することで、Popoverでは不可能だった細かいデザインや動作の調整が可能となります。また、より洗練されたユーザー体験を提供するためには、UIコンポーネントを自分で作成するスキルが重要であることも強調されています。

# 3. 基本的なSwiftUIの組み合わせによる手作り吹き出し
次に紹介されているのが、SwiftUIの基本的なビューコンポーネントを組み合わせて、手作りで吹き出しを作成する方法です。このアプローチでは、Pathやカスタムシェイプを使用せず、標準のビューコンポーネントを活用してシンプルかつ効果的なデザインを実現しています。

まず、吹き出しの尖った部分を表現するために、45度回転させた矩形を使用しています。この矩形は、吹き出しの「尾」に相当し、吹き出しの主要部分となるテキストやアイコンと組み合わせられます。吹き出し全体のデザインには、HStackを利用しており、矩形とテキストを並べて配置しています。

この方法の利点は、カスタマイズが容易である点です。例えば、吹き出しの背景色やテキストスタイル、さらには角の丸みを調整することができます。これにより、アプリケーションのデザイン全体と調和した吹き出しを作成することが可能になります。また、Pathやカスタムシェイプを使わないため、コードが簡潔で理解しやすく、メンテナンスもしやすいという利点があります。

# 4. アニメーションを使った吹き出しの動的表現
手作りの吹き出しにさらなる魅力を加えるために、アニメーションを追加する方法も説明されています。SwiftUIでは、簡単にアニメーションを実装できる機能が豊富に揃っており、これを活用することで、吹き出しを動的に表示・非表示にすることができます。

この記事では、scale と opacity のトランジションを組み合わせて、吹き出しの出現と消失を滑らかに表現しています。具体的には、吹き出しを表示する際にスケールを0.25倍にしつつ、透明度を調整することで、徐々に現れるようなアニメーション効果を実現しています。このアプローチにより、ユーザーが吹き出しを操作した際に、自然な動きを提供できるようになります。

アニメーションは、ユーザーインターフェースにおいて非常に重要な要素であり、視覚的なフィードバックを提供することで、操作感を向上させる効果があります。特に、インタラクティブな要素にアニメーションを加えることで、ユーザーエクスペリエンスが大幅に向上します。この記事で紹介されている方法は、シンプルながらも効果的なアニメーションの一例であり、他のUIコンポーネントにも応用できるでしょう。

# 5. SwiftUIを使ったUIデザインの柔軟性と可能性
最後に、この記事はSwiftUIを使ったUI開発における柔軟性とカスタマイズ性の重要性を強調しています。Popoverのような標準コンポーネントを使用することは、素早くUIを作成するためには便利ですが、特定のデザイン要件や動作要件を満たすためには、それだけでは不十分な場合があります。そのような場合には、この記事で紹介されたように、基本的なビューコンポーネントを組み合わせることで、より柔軟なUIを実現することが求められます。

また、アニメーションを効果的に取り入れることで、ユーザーインターフェースがより魅力的になり、操作性が向上します。SwiftUIの豊富な機能を活用することで、コードをシンプルに保ちながら、洗練されたデザインと動作を実現することが可能です。

この記事で紹介された手法は、SwiftUIを使った開発において、基本的な知識を持っている開発者にとって非常に有用です。Popoverを使ったシンプルなアプローチと、よりカスタマイズ性の高い手作りのアプローチの両方を学ぶことで、アプリケーションのユーザーインターフェースを効果的にデザインできるようになります。これにより、デザインの自由度が高まり、ユーザーにとってより魅力的なアプリケーションを提供することができるでしょう。


# 引用

https://android.benigumo.com/20240827/speech-bubble/
Docker版「バルス」不要リソースをまとめて消してストレージの空き容量を回復する

## これは何?

Dockerを使っているとコンピュータの記憶領域のリソースが足りなくなることがあります。
また，無駄なコンテナやイメージをまとめて消したくなる時もあります。

この記事では，Dockerで作成したすべてのものをまとめて削除する方法を書きます。
実行は自己責任でお願いします。

この記事は前記事の続編のバルスシリーズです。

https://qiita.com/sigma_devsecops/items/c1ec056a80f12f151ed7

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/18949b1f-9a98-6d6a-2213-db24c3e7e547.png)
(笑)

---

## コマンド

### imageの全削除

```shell
docker image rm $(docker image ls -q) -f
```

```shell
docker rmi $(dokcer images -q) -f
```
`-q`オプションを使うとコンテナIDやImage名だけを返してくれるのでシェルスクリプトを扱う上でめちゃくちゃ便利です。

どちらのコマンドを使っても一緒ですが，古いバージョンのほうが自分は個人的には文字数が少ない後者が好きです。

### containerの全削除

```shell
docker container rm $(docker container ls -q -a) -f
```

```shell
docker rm $(docker ps -q -a) -f
```
これもどちらを使っても同じです。`-a`オプションで起動していないコンテナも削除しているのがミソです。

### キャッシュの全削除

普通に数十GB空きスペースが増えたりするので定期的に実行すると良いです。

```shell
docker builder prune
```

---

## 終わりに

それではみなさんも快適なdocker版「バルス」ライフを!
#100DaysOfCodeを2ヶ月続けて感じた変化

# 初めに
***#100daysOfCode***というハッシュタグを知っていますか？
100daysOfCodeはコーディングの習慣をつけるためのチャレンジです。
このチャレンジをはじめて2ヶ月が経ちましたので、振り返ります。

↓100daysOfCodeとは何かや1ヶ月経った感想はこちらに書いてありますので、ぜひご一読ください。
https://qiita.com/masafumi1073/items/97ef3d12f96a4aef01e0

# 変化
このチャレンジを続けて2ヶ月目に入ると、最初の1ヶ月とは異なる変化が現れ始めました。

- ***勉強は完全に生活の一部になる***
- ***効率を考えるようになる***
- ***少しの停滞は気にならなくなる***

## 勉強は完全に生活の一部になる
チャレンジの目的は勉強の習慣化になりますので、十分に目的は果たせています。毎日勉強をすることによりある程度ルーティンが作られたことにより勉強することはもはや生活の一部になりました。

## 効率を考えるようになる
勉強することが当たり前になったので、次は効率化を図るために様々な試行錯誤を始めました。その中でも特に効果があったのが***朝活の導入***です。集中力が最も高いとされる朝の時間を活用することで、学習効率が向上し、当初は効果を感じていました。

しかし、無理な早寝早起きが続き、体調を崩してしまうという事態が発生。睡眠不足による集中力低下や、体調不良による学習意欲の減退など、思わぬ副作用に見舞われました。

朝活について下記の記事をぜひご覧ください。

https://qiita.com/masafumi1073/items/be4f78e3c91f8ae00713

## 少しの停滞は気にならなくなる
これだけ長く勉強を続けていると少しのことでは動じなくなります。今日解決できないエラーがあっても、明日には解決できるだろうという気持ちになります。なぜなら毎日続けていれば、少しずつですが確実に積み上がっていくという実感があるからです。このような心理的な成長も変化の一部です。

また、停滞を乗り越えるために、自分なりのモチベーション維持の方法を見つけることも大切です。例えば、休憩時間を設けることや、解決策を一旦寝かせてみるなど、柔軟な対応ができるようになりました

# 最後に
2ヶ月目もあっという間に過ぎてしまいました。残り1ヶ月ですが、まずは100日間続けることを目標に頑張ります。次の一ヶ月では、これまで学んだことをより深め、さらにスキルアップしていきたいと思います。
【バルス】封じ! 間違ってrm -rfしないようにするターミナルの設定方法

## これは何

みなさんはITエンジニア界の「バルス」こと`rm -rf`で失敗したことはありますか?
自分は`rm -rf ~/hoge`のつもりで`rm -rf ~/ hoge`を実行してホームディレクトリを消し飛ばしたことがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/b7fc774a-534c-a227-5003-9385e23ee7d1.png)
(まじでこんな顔になりました)

今回は`rm -rf`での事故を防ぐための方法を考えたので良ければ使ってください。

---

## 具体的な方法
以下のような関数をシェルスクリプトで作成して.bashrcや.zshrc等に登録しておきます。

```bash
# rm -rf -i
function rm() {
        DIR=$(eval echo '$'$#)
        OPTION=${@%*$DIR}
    if [[ $OPTION =~ r && $OPTION =~ f ]]; then
        echo "rm -rf: remove directory $DIR? [y,n]"
        read judge
        case "$judge" in
            "y")
                :
                ;;
            ?)
                return 0
                ;;
        esac
    fi
    command rm $@
} # end function rm
```

これにより，`rm -i`のように削除対象の確認を行うことができます。yを入力すると`rm -rf`が実行されます。

```shell
rm -rf ~/tmp
rm -rf: remove directory /home/tomita/tmp? [y,n]
```

`rm -i -rf`のように実行すればいいんじゃない?と思った方がいたかもしれませんが，`rm`では`-i`よりも`-f`のほうが優先されるので確認を挟むためには自作関数を定義する方法を今回は取りました。

---

## 終わりに
この方法を3年くらい使っていますが，今の所バグってやらかしみたいなことにはなっていないです。

もっといい方法がありそうな気もしているので知っている方がいればご享受ください。
それでは皆さん快適な「バルス」ライフを!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/a592d8ab-db9f-5abe-aebb-571f0e7d3d45.png)
【豆知識とError】belongs_toとvalidatesのちょっとした誤解

# はじめに
正確にはエラーではありませんが、バリデーションメッセージの表示が何かおかしかったので、どう解決したのかとそこから学んだことをアウトプットしたいと思います

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3


## バリデーションメッセージが何かおかしい

[![Image from Gyazo](https://i.gyazo.com/06da613a4ece144b254e35a49cf81aa2.png)](https://gyazo.com/06da613a4ece144b254e35a49cf81aa2)

文字が英語表記というのは一旦おいておいて。同じ単語が表示されていることがわかるかと思います。
このバリデーションメッセージを確認する為、関連するファイルを見てみると次のようなコードを入力していました。

```ruby
  # モデル間の関連を定義
  belongs_to :user  # PostはUserに属している
  belongs_to :prefecture  # PostはPrefecture（都道府県）に属している
  belongs_to :station  # PostはStation（駅名）に属している
  belongs_to :line  # PostはLine（路線名）に属している
  has_many :favorites, dependent: :destroy  # Postは多くのFavoriteを持ち、Postが削除されたら関連するFavoriteも削除される

  # バリデーション（データの保存前にチェックするルール）
  validates :line, presence: true  # 路線名は必須
  validates :photo_image, presence: true  # 画像のアップロードは必須
  validates :station, presence: true  # 駅名は必須
  validates :location, presence: true  # 撮影場所は必須
  validates :prefecture, presence: true  # 都道府県は必須
  validates :shooting_time, presence: true  # 撮影時間は必須
  validates :comment, presence: true, length: { maximum: 250 }  # コメントは必須で、最大250文字まで

end
```

## belongs_toがバリデーションの役割をしているのか？
上記のコードと画面から`belongs_to`がバリデーションの役割をしているのかと思いましたが、実際はそうではないようで。

> belongs_to の役割は、モデル間の関連付けを行うことです。belongs_to 自体にはバリデーション機能はありませんが、belongs_to の関連付けに対して、Rails にはデフォルトでバリデーションが組み込まれています。

つまり、**belongs_to で関連付けたモデルが存在しない場合、Rails では自動的にバリデーションが追加される**ということ。
だから2回同じ内容のエラーメッセージが表示されていたという事がわかりました。


### ついでに次のように修正したらとりあえず解決
```ruby
class Post < ApplicationRecord
  # 関連付け
  belongs_to :user
  belongs_to :prefecture
  belongs_to :station
  belongs_to :line
  
  # 明示的なpresenceバリデーションを削除
  validates :photo_image, presence: true
  validates :location, presence: true
  validates :shooting_time, presence: true
  validates :comment, presence: true, length: { maximum: 250 }
end
```


# さいごに
`belongs_to` で設定した関連付けのバリデーションエラーは、`Post` モデルの関連付け属性が正しく設定されているかどうかが大切だという事がわかりました。
validatesだけがバリデーションメッセージに関わっているだけだと思っていたので、今回で知ることができてよかった。

今回の記事が何か参考になれば幸いです。
フォントサイズを表すremって何者!?

# 概要
CSSでのフォントサイズ指定に使用できる単位にはいろいろなものがあります。
その中でも、先日初めてremを使用する機会があったので、学びの整理として記事にまとめたいと思います。

# remとは

ルート要素のフォントサイズを1とした時の相対的なサイズ指定を表します。

ルート要素についての記述は以下のとおりです。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/html

>\<html> は HTML 要素で、 HTML 文書においてルート (基点) となる要素 (最上位要素) であり、ルート要素とも呼ばれます。他のすべての要素は、この要素の子孫として配置しなければなりません。

つまり、`<html>`に指定されているフォントサイズを1とした時の相対的な文字サイズを表すのがremです。

## 例
以下のように、`<html>`に10pxを指定したとします。
```css
html {
    font-size: 10px;
}
```

では、この場合以下のpタグのフォントサイズはいくつになるでしょうか。
```css
p {
    font-size: 1.5rem;
}
```

答えは 10px * 1.5 = 15px になります。

# 応用編その1
remを使用するとこんなことができます。
以下のように`<html>`のフォントサイズをvwで指定してみます。


```CSS
html {
    font-size: 10vw;
}
```

vwはビューポートの幅(画面幅)から見たサイズの相対値指定です。
1vwはビューポートに対して1%の大きさで表示されることを表します。

上記の指定をすることにより、ルート要素のフォントサイズが画面幅によって変わるようになります。

この状態でpタグのフォントサイズをrem指定するとどうなるでしょうか。
```CSS
p {
    font-size: 1.5rem;
}
```

前述の通り、1.5remはルート要素のフォントサイズの1.5倍を表しますが、今回はルート要素のフォントサイズが画面幅によって変わるため、pタグのフォントサイズも連動して変わってくれるようになります。

これにより、画面幅によってフォントサイズを流動的に変えることができるようになりました。

# 応用編その2
上記の例(応用編その1)にもう少し手を加えてみましょう。
応用編その1で画面幅と連動してフォントサイズを変更できるようになりましたが、
これでは小さな端末で画面を見たときに、文字が読めないくらい小さくなってしまう可能性があります。
また、逆に画面幅の大きなデバイスで見たときに、フォントサイズが必要以上に大きくなってしまう可能性もあります。

この現象を防ぐために、clamp関数を使用してみます。

```css
html {
    font-size: clamp(10px, 10vw, 20px);
}
```

clamp関数では、サイズの最小値と最大値を指定することができます。
日本語で書くと以下のような感じです。

```plaintext
clamp(最小値, 表示したい文字サイズ, 最大値);
```

つまり、上記の例だと
「ルート要素のフォントサイズは10vwになる。ただし、10pxより小さくならないし20pxよりも大きくはならない」
という指定を入れることができます。

この状態で要素の文字サイズをrem指定してみましょう。

```CSS
p {
    font-size: 1.5rem;
}
```

これによって、
「pタグのフォントサイズは15vwになる。ただし、15pxよりも小さくならないし30pxよりも大きくならない」
という風に指定ができました。

つまり、文字サイズ変動の下限値と上限値を指定することによって、よりユーザーにとって見やすい文字サイズを実現することが可能になります。

# 感想
相対値でフォントサイズ指定をする方法は他にもありますが、remを使用すると参照先がルート要素のフォントサイズになってわかりやすいのがいいなと感じました。

個人的には普段フロントを触る機会があまりないので、フォントサイズについて学ぶいいきっかけになったのが嬉しかったです。
勇気をもってショートカットに踏み出してみる

## はじめに
ショートカットって慣れるまでが大変ですよね。
「慣れるために時間をかけるぐらいならショートカットなんか使わない」なんて方も一定数いると思います。（気持ちはすごくわかる）

初めてショートカットを使う方は「こんなの覚えられないよ」、「覚えるのが時間がかかりそう」って思いますよね。
事実私もそうでした。
ですが、ショートカットは作業の効率化の観点から必須スキルとされています。
勇気をもってショートカットの道へ踏み出すことは、あなたにとってメリットしかありません。

そこで今回は、覚える負担を少しでも軽減するために、語源を交えてショートカットを紹介していこうと思います。

※今回紹介するショートカットはEmacsで使用できるものになっています。

## ショートカットの一例
| コマンド | 語源 | 機能 |
|:-----------|------------:|:------------:|
| Ctrl + A       | Ahead        | カーソルを行の先頭に移動         |
| Ctrl + E     | End      | カーソルを行の末尾に移動       |
| Ctrl + F       |   Forward      | カーソルを右（次の文字）に移動         |
| Ctrl + B         | Backward          | カーソルを左（前の文字）に移動          |
| Ctrl + D    | Delete     | カーソルのある場所の文字を削除      |
| Ctrl + H    | -     | カーソルの左の文字を削除（通常のバックスペースと同じ）      |
| Ctrl + W    | Word     | カーソルの前の単語を削除      |
| Ctrl + K    | Kill     | カーソルから行末まで削除      |
| Ctrl + U    | -     | カーソルから行の先頭まで削除      |
| Ctrl + Y    | Yank     | 直前に削除したテキストを貼り付け（ペーストをEmacsではYankと呼びます）      |
| Ctrl + P       | Previous       | カーソルを前の行に移動       |
| Ctrl + N       | Next       | カーソルを次の行に移動      |

語源の欄が「-」となっている箇所は語源が不明なものです。

ただ、語源が不明と言っても、そのキーにコマンドが設定されている理由はあるはずで、例えば、Ctrl + U はCtrl + K と位置が近く、使い勝手が良いという理由でコマンドが設定されているようです。

## 最後に
語源を理解しながら覚えると、ショートカットが頭に入りやすくなったと思います。
ショートカットは怖くありません。むしろ便利な道具です。
勇気をもってショートカットの道へ踏み出せた方は、ぜひこの世の全てのショートカットをマスターしてみてください。
daisy UIの魅力と使い方


# daisy UIとは？

daisy UIは、Tailwind CSSベースのCSSライブラリです。Bootstrapのような使い勝手で、さまざまなコンポーネントを簡単に実装できます。

[daisyUI — Tailwind CSS Components ( version 4 update is here )](https://daisyui.com/)

## 特徴

### コードが簡潔で、スタイル適用が爆速

daisyUIを使うことで、Tailwindのみを使う場合よりも、少ないコードで同じUIを作成できます。

- Tailwindのみの場合:
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/753c8865-df76-8a25-6473-f42bbcc5c0fb.png)
    
- Tailwind + daisyUIを使用した場合:
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/7dda705d-30a0-804c-2e8f-9939a1e5907d.png)
    

### 豊富なテーマ

daisyUIには多彩なテーマが用意されており、デザインのバリエーションが広がります。

- テーマ一覧 
[daisyUI themes](https://daisyui.com/docs/themes/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/86614c83-c95c-71f8-4c99-6a83d4c552bb.png)


- Theme Generator
さらに、**テーマのカスタマイズ**も可能です。公式サイトの[Theme Generator](https://daisyui.com/theme-generator/)を使えば、リアルタイムでコンポーネントの色を決められます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/950e1726-0a6d-f9fa-3462-29a0bcfc7a7a.png)


# 実際に使ってみる

## 1. Tailwindのインストール

まず、Tailwind CSSをインストールします。

[公式ドキュメント](https://tailwindcss.com/docs/installation)

```bash
npm install -D tailwindcss

// tailwind.config.js ファイルを作成
npx tailwindcss init
```

### Tailwindが効かないとき

Tailwindがうまく適用されない場合は、postcssのインストールを確認しましょう。

参考: [React(Next.js)でTailwindが効かないときにみるべきところ - Qiita](https://qiita.com/Sicut_study/items/7147e47441557a43b0fe#1-postcss%E3%82%92%E3%81%84%E3%82%8C%E3%82%8B)

```bash
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
```

## 2. daisyUIのインストール

次に、daisyUIをインストールし Tailwind CSSプラグインとして追加します。

[公式インストールガイド](https://daisyui.com/docs/install/)

```bash
npm i -D daisyui@latest
```

```jsx
// tailwind.config.js

plugins: [
  require('daisyui'),
],
```

## 3. テーマ設定

使用したいテーマを設定します。

```jsx
// tailwind.config.js

daisyui: {
  themes: ["cupcake"],
},
```

## 4. コンポーネントを使ってみる

[Buttonコンポーネントのドキュメント](https://daisyui.com/components/button/)

必要な`className`を記述するだけで、テーマに沿ったボタンが作成できます。

```jsx
<button className="btn btn-primary">Button</button>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/f1cc6d67-1cae-22d4-f643-988fd16cb9ad.png)

daisyUIを使って作成した天気アプリのスクリーンショットです。

![スクリーンショット 2024-09-02 18.26.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3461384/e15dfeac-9d12-389d-8d02-77a6ee2f6b37.png)
【モチベーションを高く，継続する技術】 LAPRASでアウトプットを増やしてツヨツヨエンジニアに

## これは何?

[LAPRAS](https://lapras.com/)というサービスを使うとあらゆるアウトプットを集約して自動でポートフォリオを作成することができます。
![画像](https://downloads.intercomcdn.com/i/o/822123779/e3c12dc726a5474951d50924/image+%281%29.png)


これらの情報を集約してスコアを出してくれるので個人的にアウトプットするモチベーションを保つのに利用させていただいています。イメージ↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/ef18cb3f-81e4-9c3b-64b9-c12949088bdd.png)

[公式のスコアについて](https://talent-help.lapras.com/ja/articles/2867310-%E3%82%BF%E3%82%B0%E3%81%A8%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)をみるとこんな感じ
![画像](https://downloads.intercomcdn.com/i/o/112929107/031056f5a4041d36edc49ae7/score02.png)
> 技術力スコアは下記の割合で評価され、1.0〜5.0の間で人数が正規分布になるように点数を付けられています。
> スコアは平均値が3.0、目安は上位13% 3.3以上、4% 3.5以上です。 

---

## LAPRASをやるメリット

- スコアが増えるのが純粋に楽しい: アウトプットするモチベーションが上がります。転職する気がなくてもおすすめです。
- 文章を書くのがうまくなる，早くなる: 実際に職場でも引き継ぎのドキュメントが早く書けるようになったと思います。結構文章を書く機会は多いので練習して損はないです。
- 多角的な視点が持てるようになる: たまにカジュアル面談等のお誘いがあったりするので，いろんな会社の人と話してみることで，自分の市場価値だったり，自分の会社のいいところ，悪いところが相対的に評価できるようになります。

---

## スコアをあげるためにやったこと

### スコアアップ作戦前
LAPRASを使い始めたのは2024年の3月です。
当時の技術力スコアは3.26とかで構成としてはこんな感じだったなと思います。

- GitHub 3.3くらい
- Tech Article 2.3とか
- Tech Event 4.1とか
- Tag Count 3.9とか

### 具体的なアクションプラン

ちなみにこれらの4要素には重み付けがあります。
>  技術力スコアは各スコアのGitHubを18、Tech Articleを5、Tech Eventを3、Tag Countを2の重みを置いた上で平均しています。

とのことなので，スコアアップの作戦としてこの半年は以下を実施しました。
- GitHubでのコミットを増やす → 無作為に行っていた勉強会を必要なものに絞ってその分手を動かす。
- 今までローカルに書いていたメモを少しずつzennやQiitaに移す。
    - まとまったものはzenn bookに
    - メモ書き程度のメモははQiitaに
    - まとめるのに時間をかけたものはzennに投稿
- コミュニケーションを減らしすぎも良くないのでもくもく会とかに参加してコミュニケーションしつつ手を動かす。

### 工夫したこと

- GitHubはmainに直pushしても反映されないので，ブランチを切って一人でもpull requestを上げる。
- ググって5分以上悩んだことは何かしらの形でアウトプットする
    - GitHubのREADMEやドキュメントに記載
    - 記事にする
- 技術検証に使ったリポジトリ等を紹介する記事を作ってGitHub自体へのPVを増やす(これはREADMEちょっと変えるだけでOK)

### 結果

LAPRASを初めてからのアウトプットが右肩上がりで増えているのがわかります。(2024年9/2)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/1149e27b-8957-7a4b-351e-cca02145164c.png)

スコアとしても
2024年3月の3.26から**3.61**まで大幅にアップすることができました。順位も念願の4桁順位です。
GitHubとTech Articleが大幅に上がったのがわかるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/ef18cb3f-81e4-9c3b-64b9-c12949088bdd.png)

---

## まとめ

LAPRASを始めると楽しくアウトプットする習慣がつくのでなんとなくモチベーションが続かない人は試してみてはいかがでしょうか。

:::note warn
警告
○○に注意してください。
:::
Elixirでピコピコ音鳴らそう

# 前提条件
- OS Ubuntu 22.04

# 環境構築

soxのインストール
```sh
$ sudo apt install sox
```
# プロジェクト作成

```sh
$ mix new sox
```

# ソースを書く

```elixir:lib/sox.ex
defmodule Sox do
  @moduledoc """
  Documentation for `Sox`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Sox.hello()
      :ok

  """
  def hello do
    1..10
    |> Enum.each(fn _ -> piko() end)
    :ok
  end

  def piko do
    play(0.1, 440)
    play(0.1, 880)
  end

  def play(t, f) do
    System.cmd("play", ~w"-n synth #{t} sin #{f}")
  end
end
```

```elixir:test/sox_test.exs
defmodule SoxTest do
  use ExUnit.Case
  doctest Sox
  
end
```

# 実行

```sh
$ mix test
```

440Hzと880Hzの交互の音が鳴りました

# ソース(github)
https://github.com/ymn-t-yamanashi/sox/releases/tag/v0.01
Flutterでアプリの開発時、SQLiteファイルの格納場所の見つけ方

#まず、Android Studio を開いて、Device File Explorerを探す
Android Studio > View > Tool Windows > Device File Explorer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/908dfe55-bc85-79cc-5b11-ff4719c56d94.png)


# 下記のパスを探す
/data/data/com.example.flutter_application_1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/1da9f9fc-2d15-afe2-6560-77e8da730f92.png)
EventBridgeの入力トランスフォーマーを使ってOpsItemを登録したい

# :sunrise_over_mountains:はじめに
ある特定のイベントが発生したら、OpsCenterにOpsItemを自動で登録したい！

### :point_up:そもそもOpsCenterとは
> AWS リソースに関連する運用上の作業項目 (OpsItems) の表示、調査、解決を一元管理できます。  

例えばある障害が起きた際に、SSM Automation を利用して復旧することやリソースを関連づけで原因調査、ステータスによるインシデント管理やナレッジを蓄積・検索したり、簡易レポートを表示することが出来る。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/OpsCenter.html

### :point_up:EventBridgeの入力トランスフォーマーとは
EventBridgeRuleが受け取った情報をターゲットに渡す前に、整形できる機能！

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-transform-target-input.html

# :sunrise:ルールの作成
今回はEC2インスタンスが停止したことを検知してOpsItemを登録できるようにします。

### :one:イベントパターンの設定
EC2の停止を検知できるように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/1527dc89-fd83-a7cb-4396-38a61dec1b2a.png)


### :two:ターゲットの指定
ターゲットで「Systems Manager OpsItem」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/d40e2b07-cf10-3d59-13bd-cb7e5a1e824f.png)

### :three:入力トランスフォーマーの設定（ここがメイン）
- 追加設定＞ターゲット入力を設定　で「入力トランスフォーマー」を選択し、設定ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/329db8d0-b4bd-01f8-6fd7-eca7197a1a4b.png)

- サンプルイベントの確認
　指定したイベントで入ってくる情報を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/e54cd31f-c7ae-88a0-ec5b-756a8aff63a9.png)  
　　
- 入力パスの設定
　先ほど確認したサンプルイベントの中で必要な情報を変数に格納できます。
今回はインスタンスIDとArnを使うことにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/0b3706f2-dcbe-7db1-2db3-b50c560161d9.png)
　
- テンプレートの設定
　入力パスで設定した変数は<>で囲むことで使用できます。
 なお、OpsItem登録に必須の項目はtitle,description,sourceの3つとなっています。
 その他項目は任意で指定してください。
今回は関連リソースにインスタンスを表示させたいので指定しています。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/75192860-8582-f494-8a37-bfd97a7cbffc.png)

- 出力を生成
イベントから必要な情報を想定通りに抜き出して整形できていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/82cee3de-f26e-1125-5998-8daa10a1d608.png)

- あとは任意の設定で作成まで進めます

### :four:EC2を止めてみる
指定した内容で登録されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/24f071e4-3ce5-f2fa-77ac-6a3b37be1b08.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788032/ac62106c-5a1a-ab6e-a04c-7d08f8f53aca.png)

# :city_dusk:さいごに
今回OpsItemの登録方法を解説しましたが、入力トランスフォーマーは
汎用性の高い機能となっているのでぜひ活用していきましょう！
私は、テンプレートでOpsItem登録に必要な項目が何かわからず苦労したので、同じように困っている方の助けとなればと思います:santa:
メモリ使用率を監視し、閾値を超えたら処理を実行する

# メモリ使用率の監視
今回はメモリ使用率を監視し、閾値を超えたら処理を実行するコードを紹介。

メモリ使用率が高くなったらアプリケーションを再起動するコードです。
```bash
#!/bin/bash
MEM_LIMIT=80
while true
do
    sleep 10
    USED_MEM=`free | grep Mem | awk '{print int($3/$2*100)}'`
    if [ $USED_MEM -gt $MEM_LIMIT ]
    then
        lsof -t -i :80 | xargs kill -9
        sleep 2
        <アプリケーション起動コマンド> &

    fi
done

```
[React] Typographyプロパティのcolor部分で暗黙的に 'any' ってエラーが出た

## 概要
UdemyでReactの講座を受けていた際、写経したらエラーが出たので共有します

## 該当講座
https://www.udemy.com/course/reacttypescrip-reacttypescript

こちらの講座の「32.MUIでメニューの見た目を作ろう」で発生しました。
## コード

```TypeScript:DailySummary.tsx
    <Typography
        color={(theme) => theme.palette.incomeColor.main}
        textAlign="right"
        fontWeight="fontWeightBold"
        sx={{ wordBreak: "break-all" }}
    >
     ¥500
    </Typography>
```

## 出ていたエラー🤢
```sh
ERROR in src/components/DailySummary.tsx:19:17
TS2769: No overload matches this call.
  Overload 1 of 2, '(props: { component: ElementType<any, keyof IntrinsicElements>; } & TypographyOwnProps & CommonProps & Omit<any, "border" | ... 112 more ... | "variantMapping">): Element | null', gave the following error.
    Type '(theme: any) => any' is not assignable to type '(string & {}) | "primary" | "secondary" | "success" | "error" | "info" | "warning" | "textDisabled" | "textPrimary" | "textSecondary" | undefined'.
  Overload 2 of 2, '(props: DefaultComponentProps<TypographyTypeMap<{}, "span">>): Element | null', gave the following error.
    Type '(theme: any) => any' is not assignable to type '(string & {}) | "primary" | "secondary" | "success" | "error" | "info" | "warning" | "textDisabled" | "textPrimary" | "textSecondary" | undefined'.
    17 |               </Typography>
    18 |               <Typography
  > 19 |                 color={(theme) => theme.palette.incomeColor.main}
       |                 ^^^^^
    20 |                 textAlign="right"
    21 |                 fontWeight="fontWeightBold"
    22 |                 sx={{ wordBreak: "break-all" }}

ERROR in src/components/DailySummary.tsx:19:25
TS7006: Parameter 'theme' implicitly has an 'any' type.
    17 |               </Typography>
    18 |               <Typography
  > 19 |                 color={(theme) => theme.palette.incomeColor.main}
       |                         ^^^^^
    20 |                 textAlign="right"
    21 |                 fontWeight="fontWeightBold"
    22 |                 sx={{ wordBreak: "break-all" }}
```

vscode上では「パラメーター 'theme' の型は暗黙的に 'any' になります」とも出ていました。

## 原因
Typographyコンポーネントのcolorプロパティにテーマ関数を使用しようとしているため。
Typographyプロパティ内のcolorは文字列かカスタムカラー名しか使えないようです。

## 解決
sxプロパティを使い、sxプロパティ内でcolorを定義することで対応した。
```TypeScript:DailySummary.tsx
    <Typography
        sx={{
          color: (theme) => theme.palette.incomeColor.main,
          textAlign: "right",
          fontWeight: "fontWeightBold",
          wordBreak: "break-all",
        }}
      >
        ¥500
    </Typography>
```
コロナ禍以降のパソコンまわりの変遷

最近のスマホ・パソコンまわりの変遷を残しておこう。

コロナ禍の2020年春、10年以上使ったパソコンを買い替え、さらに初めてのタブレットとしてiPadを購入。そしてクラウドの世界へ。ちなみに買い替えたパソコンのストレージはインテルOptuneメモリー付のHDDで1TB、メモリーは20GBだけど、直後に時代はSSDとクラウドストレージだったことに気が付き後悔。

買い替えたパソコンでWSLを起動してUbuntuでGMTやGrADSにも挑戦。
解析雨量や国土数値情報を使った気象データの解析・可視化に取り組んだ。

2022年にはスマホをiPhoneSE初代からiPhoneSE3に買い替え。快適度がアップ。
いまやApple、Microsoft、Amazonに課金中。まだGoogleには課金していない。

それから2022年から2023年までにITパスポート、情報セキュリティマネジメント、応用情報技術者、ネットワークスペシャリスト、情報処理安全確保支援士の各試験に合格。
まさにマイITバブルな数年間だった。
QGIS 国土数値情報から河川縦断面図を作成する

令和になってからQGISを使っている..ではじまるQGISの記事を別のブログからこちらに転載します。元の記事は2020年5月に書いたものです。

***

河川の縦断面図をつくりたくて試行錯誤した。縦断面図という表現で合っているかわからないけど、河口からの距離と標高のグラフのやつ。よく、ヨーロッパのセーヌ川なんかに比べると日本の川は滝だ、という表現で示されるあれ。

今回はQGISと国土数値情報を使って作成した。ここに方法をメモしておく。
おおまかには、国土数値情報のシェープファイルをラスタ化して、QGISのプラグインである「Plofile tool」や「qProf」で河川等の任意の断面図を作成する。

ちなみに、国土地理院の基盤地図情報をダウンロードして、フリーのツールでDEMにして…という方法もあるみたいだけど、国土数値情報だけでできました。まぁ、元データは同じだろうから変換の過程が違うだけだろう（詳しいことは知らない）。

# 手順
- まずはデータの準備。国土数値情報ダウンロードから標高・傾斜度3次メッシュデータをダウンロードする。ダウンロードしたZIPファイルを展開する。そして、QGISで表示する。

- ベクタレイヤのマージを行う。（しなくてもよいがしておくと便利）

- 「プロセッシングツールボックス」－「ベクタテーブル」－「文字列を浮動小数点に変換」で、標高のフィールド（この例ではG04a_002）を文字列から数値に変換する。これをせず文字列のままだと、ラスタ化できない。

- 「ラスタ」－「変換」－「ベクタのラスタ化」を実行する。オプションは次の通り；
出力ラスタの単位：地理単位
水平方向の解像度：0.001
鉛直方向の解像度：0.001

ちなみに、解像度を適切な値にしないとうまくいかない（ここでハマりました）。地理単位が度なのかkm（キロメートル）なのかによっても違うと思うので、留意されたい。

 - QGISの画面右下のアイコンをクリックして、プロジェクトの座標参照系を「JGD200/Japan Plane Rectangular CSⅧ」あたりにする。これをすることで、距離の単位を度からkmにかえる（最初、距離が度でしか表示されず、ハマりました）。

- プラグイン「Profile tool」を起動して、作成した標高のレイヤ（ラスタ）を追加する。あとはProfile toolを操作して必要な断面を指定、表示する。

# 豆知識
- 自分でレイヤを作成するには、CSV形式データを読み込む機能を利用する。
- フィールドを文字列（String）から数値（Integer）に変更するには、「プロセッシングツールボックス」－「属性のリファクタリング」という方法もある。
002 もう間に合わない、夏休みの宿題の読書感想文の作り方


もう間に合わない、夏休みの宿題の読書感想文を

geminiに作ってもらう・・でしたが、
夏休みも終わっちゃいました。

安価に追加学習済みのＬＬＭを開発する方法です。

前回までの要約
https://qiita.com/bono0/items/4a992dc388527d3b99f4

今更ですがgeminiの使い方の説明です。

https://ai.google.dev/aistudio?hl=ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/8b5fffa0-29df-f243-4594-f8859333885b.png)


上記から入って、
　サンプルコードを出力してもらって
　ローカルにコピーして
　apikeyを追加したら
出来上がりです。
自分で使うだけの開発環境なら　引数と戻り値を半固定にしても良いでしょう。
pip install ライブラリはコメントをご参照ください。

これだけです。
あとはプロンプトに資料を丸ごと　２００万トークン　たっぷり入力してください。
追加学習済み専用ＬＬＭの出来上がりです。

　取説でも、
　教科書でも、
　法律でも、
　規格書でも、
　特許でも、
 
　日本語でも、
　英語でも、
　中国語でも、

お好きな資料をお試しください。
あっという間に専門分野特化のＬＬＭがお相手してくれます。





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/e09eb592-6cbc-4b5c-1b6c-5e0ea8c554b2.png)


自分専用だけなら、ローカルに落とす必要もありませんでしたが、ここからもうひと捻りで、皆で使おう　専門分野特化のＬＬＭ　の公開方法！！！
次回は、webapi化の方法です。

ー続くー
Techマネージャーが伝える1on1ミーティングのいろは


# はじめに
1on1ミーティングは、上司と部下の信頼関係を深め、問題の早期発見と解決、個々の成長促進に役立つ重要なコミュニケーションの場です。本記事では、私がマネージャーとしての学んだ1on1ミーティングの目的や進め方、よくある課題とその解決策について解説します。

## 1. 1on1ミーティングの目的
1on1ミーティングの目的は多岐にわたりますが、主に以下の3つが挙げられます。
前提としては部下のための時間になります

### 部下の成長促進
部下のスキルアップやキャリアの方向性を確認し、成長をサポートします。1on1では、個々の強みや改善点についてフィードバックを提供することで、成長の機会を創出できます。

### 問題解決
日常業務で発生する問題や課題を早期に発見し、解決策を一緒に考えます。これにより、問題が大きくなる前に対応でき、業務の効率化が図れます。

### キャリア開発の支援
長期的な視点で部下のキャリアをサポートします。定期的な1on1を通じて、目標設定やキャリアパスの見直しを行い、部下のモチベーション向上につなげます。

## 2. 1on1の進め方

効果的な1on1ミーティングを行うための進め方について、いくつかのポイントを挙げます。

### 頻度
- **週一が基本**: メンバーによって頻度を上げたい、下げたいがあるので適宜調整しましょう。

### 実施場所
- **プライベートを確保**: オンライン、オフラインでもプライベートな空間を作ることが必要です。どんな話もできる環境を作っておきましょう。オンラインの場合はイヤホンをして周りに内容が聞こえないようにして下さい。



### 1on1の準備
- **目的を明確にする**: その日の1on1で話すべきテーマや目標を事前に決めておくと、話がブレずに効果的な時間を過ごせます。
- **質問を準備する**: 抽象的な質問だと話が進まないことがあるのでクローズドクエッションからオープンクエッションに変えていけるといいでしょう。

### 信頼関係を築くためのコミュニケーション
- **リスニングを重視する**: 部下の話をしっかりと聴くことで、信頼関係を構築します。相手の話に耳を傾け、共感の意を示すことが重要です。
- **フィードバックの提供**: 建設的なフィードバックを提供し、部下が次のステップに進めるようにサポートします。フィードバックは具体的かつポジティブに行うことがポイントです。

### 具体的なアクションプランの設定
- **アクションプランの作成**: 1on1の終わりに具体的なアクションプランを設定し、次回の1on1でその進捗を確認します。これにより、部下の目標達成をサポートし続けることができます。

## 3. 1on1でよくある課題と解決策

1on1ミーティングでよくある課題と、その解決策をいくつか紹介します。

### 上司からのフィードバックが少ない
1on1がただの情報共有の場になってしまうと、部下は成長を感じにくくなります。解決策としては、上司が積極的にフィードバックを提供することが大切です。フィードバックは、良い点と改善点の両方をバランスよく伝えるようにしましょう。ただ話し過ぎに注意してください。

### 部下が話しにくいと感じる
部下が自分の意見を自由に言えない雰囲気だと、1on1は形骸化してしまいます。上司は、オープンな質問を投げかけることや、部下の意見を尊重する姿勢を示すことで、話しやすい環境を作る努力をしましょう。

## 4. 結論

1on1ミーティングは、上司と部下の間のコミュニケーションを強化し、チーム全体のパフォーマンス向上に寄与する重要な場です。定期的に1on1を行い、部下の成長を支援し続けることで、組織の成功にもつながります。
EKSクラスター、ノードグループをCLIで作成する

今回、EKS理解のためにCLIでリソースを作成する機会がありました。
クラスター作成に必要な設定は多く、少しわかりにくく感じますね
# EKSクラスターを作成する
<>内は置き換えてください
```shell
aws eks create-cluster \
  --role-arn <ClusterRoleArn> \
  --resources-vpc-config subnetIds=<SubnetId>, <SubnetId>,endpointPublicAccess=true,endpointPrivateAccess=true,publicAccessCidrs=0.0.0.0/0 \
  --logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}' \
  --access-config authenticationMode=API \
  --name eks-cluster
```
endpointPublicAccess=true と publicAccessCidrs=0.0.0.0/0 はセキュリティ上のリスクがある設定です。必要に応じて、適切なCIDR範囲に変更してください。

# ノードグループを作成する
<>内は置き換えてください
```shell
aws eks create-nodegroup \
  --cluster-name eks-cluster \
  --nodegroup-name nodegroup \
  --scaling-config minSize=2,maxSize=2,desiredSize=2 \
  --subnets "<SubnetId>" "<SubnetId>" \
  --node-role <EKSNodeRoleArn>
```
気象データの解析・可視化に使えそうなツールらへん

気象データの解析・可視化をすることがある
その際に使ってきたツール類を紹介しよう

プログラミング言語はFortran、Java、PHP、Python、Rubyらへん、VBAやVisualBasicあたりも懐かしい
データベースはMySQLやSQLServerなど

格子点値（GPV）の可視化にはGrADSやGMTが有名
地理情報の可視化にはQGISが有名、シェープファイルなんかを扱える

WindowsのパソコンでLinux環境を構築するならWindows Subsystem for Linux（WSL）というのがある
これでWindows上の仮想PCでUbuntuを使うことができる

ローカルPCでPythonを使うならAnacondaが便利
ブラウザ上でコーディングできるJupyternotebookやコマンドプロンプトをセットでインストールできる

というわけで実はちょっとしたツール・プログラムを作るだけなら覚えることは意外と少ない