OmniAICreator/Qiita-1.07M huggingface dataset:
【Mery】選択範囲のJSONをjqで置き換えるマクロを作ってみた

# TL; DR

**1. JSONを選んでマクロを起動**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/758e2e49-caa7-4cb1-32c1-81339c76cf60.png" alt="テキスト中のJSONを選択した状態でマクロを起動" width=450>

**2. フィルタを書くと**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/f8538389-2533-e0bb-b0cc-6bdc4d5631a7.png" alt="「jqで選択範囲を整形」のプロンプトにjqのfilterを指定" width=600>

**3. 置き換わる！**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/f8717943-9081-3a4e-3f1d-862b080ad329.png" alt="expressionにしたがって選択範囲のJSONが変換され、その結果で置換される" width=450>

https://github.com/Syuparn/mery-jq

# はじめに
Meryは無料のテキストエディタで、軽量ながら正規表現検索やシンタックスハイライトが利用可能です。「VSCodeを開くほどでもないけどちょっとファイルを加工したい」というときに重宝しています。

https://forest.watch.impress.co.jp/library/software/mery/

今回は、Mery上でjqを適用できるようにするマクロを紹介します。

# バージョン

- Mery v2.6.7

jqは別途インストールしておいてください。

# 使い方

https://github.com/Syuparn/mery-jq

上記リポジトリをダウンロードし、Meryで `jq.js` を開いてください。

続いて、メニューバーの「マクロ」から「これを選択」を実行してください。マクロが登録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239887/9f119737-6703-0324-067b-56232daa897a.png)

以後、`F4` を押すことで実行できます。文章中のJSONを選択した状態でマクロを実行してください。

# 実装

マクロはJScriptで記述しています。注意点として、最新のJSの文法 (`const`、アロー関数等）は使えません。

```js:jq.js
function runJq(json, src) {
	var shell = new ActiveXObject('WScript.Shell');
	var cmd = 'jq.exe ' + src;
	
	// trim breaklines
	json = json.replace(/\s/g, '');

	var exec = shell.Exec(cmd);
	exec.StdIn.Write(json);
	exec.StdIn.Close();

	var out = exec.StdOut.ReadLine();
	while (exec.StdOut.AtEndOfStream == false) {
		out += exec.StdOut.ReadLine();
	}
	return out;
}

var json = document.selection.Text;
var src = Prompt("jqで選択範囲を整形", '-c "."');
var modified = runJq(json, src);
document.selection.Text = modified;
```

## 選択範囲を取得

まず、`document.selection.Text` で画面上の選択範囲のテキストを取得します。

```js
var json = document.selection.Text;
```

## jqのフィルタを受け取る

続いて、JSONを加工するためのフィルタを受け取ります。`Prompt` で入力画面を表示し、受け取った内容をjqの引数に使用します。

```js
// デフォルト値は `-c "."` (空白を除去しそのまま表示)
var src = Prompt("jqで選択範囲を整形", '-c "."');
```

## jqを起動する

本体の実装、jqを呼び出す処理です。wscriptを呼び出してシェルを実行しています。
組み込みAPIの `shell.run` でもシェル操作ができますが、標準出力が取得できないため今回は採用しませんでした。

```js
var modified = runJq(json, src);
```

```js
function runJq(json, src) {
	var shell = new ActiveXObject('WScript.Shell');
	var cmd = 'jq.exe ' + src;
	
	// 標準入力は1行で渡さないと上手く処理できないため、空白を除去
	json = json.replace(/\s/g, '');

    // シェル実行
	var exec = shell.Exec(cmd);
	exec.StdIn.Write(json);
	exec.StdIn.Close();

    // 標準出力を末尾まで読み込み
	var out = exec.StdOut.ReadLine();
	while (exec.StdOut.AtEndOfStream == false) {
		out += exec.StdOut.ReadLine();
	}
	return out;
}
```

## 結果を書き戻す

最後に、整形後のJSONを再び `document.selection.Text` に代入することで、選択範囲を更新します。
これで、整形結果に置換することができました。

# おわりに
以上、jqをMeryで使用するマクロの紹介でした。応用すれば他のコマンド (`awk`, `grep` 等)でも使えそうなので、機会があれば改造してみたいと思います。
チームのプロセスを改善するときにやってはいけないこと

## はじめに

◆この記事は何？
チームのプロセスを改善するためのコツを紹介する記事

◆対象は？
リーダー、マネージャー

◆この記事のねらい
立ち上がったばかりのチームはプロセスに課題が多く、改善の始め方に迷うことがあります。
そのようなチームの課題解消の方針を決める際に参考になれば幸いです。

## 先に結論
- 一気に改善しようとしない
- まず働きやすさ
- 自分たちで改善できる仕組みをまずつくる

## 同時にプロセス改善してはいけない

チームのプロセスを改善しようとするとき、やってはいけないのは「一気に改善しようとする」です。

プロセスの改善は、一つずつ取り組むとチームに定着します。
プロセスの体験がチームへの定着につながります。同時並行すると体験が不十分になりやすくなります。

例えば、立ち上がったばかりのチームではプロセスの課題が多く挙がります。
振り返りで複数の課題が挙がったとしても、一気に改善せずに順番に改善していきます。

## 改善の順番

プロセスの課題が複数あるときは、優先順位をつける必要があります。

まず「働きやすさの向上」につながるプロセスの改善が効果的です。

働きやすくなると次の改善がしやすくなり、改善サイクルの起点になるためです。

## 自分たちで改善できるように支援する

次に、チームメンバー自身で改善できるように支援していきます。

例えば、デイリーミーティングで「困っていること/不安なこと」を発信して、チームで相談できる場を設けます。

リーダーは過度に介入せず、メンバーで解決できる問題はメンバーに任せます。

改善の仕組みを整えることで、チームのプロセスの課題を一つずつ改善できるようになっていきます。

## おわりに

この記事では、チームのプロセス改善のコツを紹介しました。

プロセス改善の一歩目として参考になれば幸いです。
Excel VBA 時間が表示されるだけのデスクトップアプリを作る【1】

## Qiitan のぬいが欲しい

Qiita Engineer Festa 2024 の完走を目指していますが、ネタが尽きてきたので、とりあえずExcelでデスクトップアプリを開発します。

今日はちょっともう疲れたので、完成はできませんが、とりあえずの下準備だけやってみました。

最終目標
ブック起動時に現在時刻がリアルタイムで表示されるユーザーフォームが表示される

現時点では、ユーザーフォーム立ち上げ時の時刻が表示される状態です。

ユーザーフォームのプロパティ Picture から、任意の画像（.jpg）を選択して背景にはめ込みます。

![デスクトップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/0a30e416-15c3-72f8-6e8c-9ed34e05091c.png)

![ユーザーフォーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/80fe97ed-cfc7-dacc-7960-fc9e9f572ac1.png)

## とりあえず書いたコード（要修正）

```vb
Private Sub Label1_Click() 'Closeのラベルをクリックしてアプリケーション終了

  Application.DisplayAlerts = False '警告メッセージ無効化
  UserForm1.Hide  'ユーザーフォーム閉じる
  ThisWorkbook.Save 'ブックを上書き保存
  Application.DisplayAlerts = True '警告メッセージ有効化
  Application.Quit 'これがないとガワが残る
  
End Sub

Private Sub UserForm_Initialize()
    'ユーザーフォーム立ち上げ時にラベル（L_Time）に時間を表示させる
  Dim T As Date
  T = Time

  L_Time.Caption = Format(T, "hh:mm")
  
End Sub
```
明日以降はこの記事を参考にして、リアルタイムで表示させるようにします。

https://lemon818.com/excel-degital-clock/
Chandra CIAOの`PFILES`環境変数を活用した並列化時のパラメータファイルの競合の回避方法

## はじめに

[CIAO（Chandra Interactive Analysis of Observations）](https://cxc.cfa.harvard.edu/ciao/)は、[Chandra X-ray Observatory（Chandra）](https://chandra.harvard.edu/)のデータ解析用に設計された標準のソフトウェアパッケージです。CIAOで複数のプロセスを並列で実行したい場合、**パラメータファイルの競合**が問題になることがあります。本記事では、CIAOでパラメータ競合を避けるための方法を説明します。

なお、本記事の内容はUbuntu 22.04.3 LTS、CIAO 4.15で動作確認を行っています。

## CIAOのパラメータ環境変数`PFILES`とは

`PFILES` 環境変数は、CIAOがパラメータファイルを保存するディレクトリを指定するために使用されます。この環境変数は、セミコロン（`;`）で表示されます。ここで、このパラメータファイルについて簡単に確認します。

通常、AnacondaでCIAOに接続した状態で`PFILES`を表示すると、2つのパスがセミコロン（`;`）で区切った形式で表示されると思います。

```
$ echo $PFILES
/home/username/cxcds_param;/soft/ciao/param
```

その表示されたパスの左から優先的にパスを見るので、基本的に左のパスにパラメータが保存されています。そのディレクトリに移動して表示してみると、

```
$ cd /home/username/cxcds_param
$ ls
ardlib.par  dmcopy.par  dmlist.par  dmstat.par  fluximage.par 
```
このように、各コマンドのパラメータファイルが並んでいます。そのため、複数のターミナルセッションで同一コマンドを同時に実行すると、同じパラメータファイルに対して同時に読み書きを行うことになります。この結果、以下のような競合エラーが発生する可能性があります。

```
Error in parameter file: line XXX: field Value

TOOLNAME (VERSION DATE): ERROR Unable to open parameter file for TOOLNAME
```


## 解決策
`PFILES`のパスを複数使い分けることで、独立したファイルにパラメータを管理し、競合を回避することができます。

例えば、2つのターミナルで同じツールを並列的に使う場合、一つの環境では、
```
mkdir -p /home/username/cxcds_param_1
export PFILES="/home/username/cxcds_param_1;/soft/ciao/param"
```
を実行することで、`/home/username/cxcds_param_1`に書き込みます。そして、もう一方の環境では、
```
mkdir -p /home/username/cxcds_param_2
export PFILES="/home/username/cxcds_param_2;/soft/ciao/param"
```
と書くことで、`/home/username/cxcds_param_2`にパラメータが保存されます。これで、パラメータファイルが完全に独立しているので衝突することはありません。

:::note alert
CIAOの`PFILES`では、
```
mkdir -p /home/username/cxcds_param_2
export PFILES="/home/username/cxcds_param_2;$PFILES"
echo 
```
の書き方でパスを指定することはできません。このように指定して例えば`fluximage`を使おうとすると
```
# fluximage (VERSION DATE): ERROR Expected the PFILES environment variable to contain 1 ';' character, but found 2
```
のように`;`の数を1つのみ想定しているため、エラーとなります。

:::

## まとめ
CIAOの`PFILES`環境変数を利用して、複数のプロセスでのパラメータファイルの競合を回避する方法を説明しました。
各ターミナルで独自のパラメータファイルを持つように設定することで、競合を避け効率的に解析を進めることができます。

解決策は他にもあり、より詳細な説明については[公式ページ](https://cxc.cfa.harvard.edu/ciao/ahelp/parameter.html)をご参照ください。


## 参考

https://cxc.cfa.harvard.edu/ciao/ahelp/parameter.html
Qiitaで見たReactロードマップを実践する ~簡単なアプリ編~

# はじめに
最近Reactを勉強し始めたので、手始めにQiitaでみた以下のReactのロードマップをやってみようと思います。

https://qiita.com/Sicut_study/items/78910cd8d103b8d45a73
# 実装してみた
```jsx
import { useState } from "react";
import axios from "axios";

function App() {
  const [image, setImage] = useState("https://picsum.photos/800");

  const onClickGetRandomImage = () => {
    axios
      .get("https://picsum.photos/800")
      .then((res) => setImage(res.request.responseURL));
  };

  return (
    <>
      <img src={image} width="500px" height="500px" alt="ランダムな画像" />
      <button onClick={onClickGetRandomImage}>画像を変更</button>
    </>
  );
}

export default App;

```
# 注意点
ロードマップ内の以下のURLでは現在ランダム画像を取得できないようです。
```
https://source.unsplash.com/random
```
ですのでこちらの記事参考に以下のURLを使えばランダム画像を取得できます。
```
https://picsum.photos/800
```
https://ttydev.com/post/other/unsplash-random
# おわりに
今回はReactロードマップのSTEP2をやってみました。ロジック的にはカウントアップみたいなものだったので結構サクッとできました。STEP3はTODOアプリらしいです。

# 次回の記事
https://qiita.com/bisketoriba/items/bf8dfa9cd4c4d0e17739
ネストしたルーティングの_pathヘルパーについて

## 読んで欲しい人
- `link_to post_edit_path(@post, @hoge)`でなんで2つ引数を入れているかわからん人へ
- 過去の自分

## 動作環境
- ruby 3.3.0
- Rails 7.1.3.3

## pathヘルパーとは
- URLを生成するための便利なヘルパー


こんなルーティングがあったら
```ruby:routes.rb
resources :posts
```

下記のようにURLを生成してくれる

- `posts_path`→/posts
- `new_post_path`→/posts/new
- `edit_post_path(:id)`→/posts/:id/edit
- `post_path(:id)`→/posts/:id

今回メインに扱うのは下記

- `edit_post_path(:id)`→/posts/:id/edit
- `post_path(:id)`→/posts/:id

基本的に、ビューやコントローラに`edit_post_path(@posts)`という使い方をする。
引数を指定して、リンクを生成してくれる。

## リソースがネストしている時のlink_to

下記の場合：ポストに紐づいたコメントがあるとき

```ruby
resources :posts do
  resources :comments
end
```

生成されるURL

```ruby
post_comments GET    /posts/:post_id/comments(.:format)   comments#index
              POST   /posts/:post_id/comments(.:format)   comments#creat
new_post_comment GET    /posts/:post_id/comments/new(.:format)  comments#new
edit_post_comment GET    /posts/:post_id/comments/:id/edit(.:format) comments#edit
post_comment GET    /posts/:post_id/comments/:id(.:format)   comments#show
            PATCH  /posts/:post_id/comments/:id(.:format)  comments#update
            PUT    /posts/:post_id/comments/:id(.:format)   comments#update
            DELETE /posts/:post_id/comments/:id(.:format)  comments#destroy
```

その時に

- `edit_post_comment_path(@comments)`
- `post_comment_path(@comments)`

のように指定すると、うまくURLが生成されない。

- `edit_post_comment_path(@post, @comments)`

とか

- `post_comment_path(@comments.post, @comments)`

みたいに、2つの引数を指定する必要がある。


投稿に紐づいたコメントなので、`post_id`に紐づいた`comment_id`を指定してあげないと、URLが正確に生成されない。

```ruby
post_comment GET    /posts/:post_id/comments/:id(.:format)
```

引数の順番はルーティングを確認する。

最初に`:post_id`次に`:id（comment_id）`を引数に指定する


## 学び・感想
- ネストしたルーティングが苦手すぎる
- とりあえず、メモとして残せてよかった
- リソースの構造を知らないとRailsでデータは扱えないなと思った。

## 参考
https://railsguides.jp/routing.html
Ubuntuのセキュリティアップデートを行う手順

Ubuntuのセキュリティアップデートを行う手順は以下の通りです。これにはシステムのアップデートとパッケージのアップグレードが含まれます。端末を使用して行います。

### 1. システムのアップデート

1. **端末を開く**:
    - Ubuntuのデスクトップで`Ctrl + Alt + T`を押して端末を開きます。

2. **パッケージリストの更新**:
    ```sh
    sudo apt update
    ```
    これはシステムのパッケージリストを最新のリストに更新します。

### 2. セキュリティアップデートの確認とインストール

3. **アップグレード可能なパッケージの確認**:
    ```sh
    sudo apt list --upgradable
    ```
    これで、アップグレード可能なパッケージのリストが表示されます。

4. **セキュリティアップデートのインストール**:
    ```sh
    sudo apt upgrade
    ```
    `upgrade`コマンドを使ってセキュリティアップデートを含むすべてのパッケージをアップグレードします。アップグレードのプロセス中に、変更を確認するよう求められることがあります。その場合は、`y`を入力して続行します。

### 3. システムの再起動（必要に応じて）

5. **再起動が必要な場合の確認**:
    ```sh
    sudo reboot
    ```
    セキュリティアップデート後、システムの再起動が必要な場合は、再起動します。

### 追加のセキュリティパッケージ（推奨）

6. **必要に応じてunattended-upgradesをインストール**:
    自動的にセキュリティアップデートをインストールするために、`unattended-upgrades`パッケージをインストールすることも推奨されます。
    ```sh
    sudo apt install unattended-upgrades
    sudo dpkg-reconfigure --priority=low unattended-upgrades
    ```
    このパッケージを設定することで、システムは定期的にセキュリティアップデートを自動的にチェックしてインストールします。

これで、Ubuntuのセキュリティアップデートが完了します。定期的にこれらの手順を実行することで、システムの安全性を維持できます。
ローカル環境のSSLバージョンや暗号スイートを調べる

## はじめに
ローカル環境をSSL化したときに、その環境のSSLバージョンや暗号スイートを調べたいことがあったので、メモとして書きます。

```zsh
openssl s_client -connect localhost:8080
```

```zsh
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA
Server Temp Key: ECDH, prime256v1, 256 bits

SSL handshake has read 1863 bytes and written 465 bytes
Verification error: unable to verify the first certificate

New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
```

今回のケースだと、TLSv1.2、ECDHE-RSA-AES256-GCM-SHA384であることが分かりました。

## 参考
- https://qiita.com/ionis_h/items/277430a8807ee09c8b46
TortoiseSVN の更新ショートカットを作成して楽したい

# はじめに
資料のバージョン管理をするためにTortoiseSVNを使用しています。🐢 
そのため1日に何度もコミットや更新の作業を行います。
しかし、競合を防ぐために毎回チェックアウトしたフォルダorファイルに移動して、
"右クリック" ⇒ "svn更新"を実行するのは面倒なので、
ショートカットを作成することにしました。

# 更新ショートカット作成手順
➀ショートカットを作成したい場所で右クリック
➁「新規作成」を選択
➂「ショートカット」を選択
![2024-06-29_09h58_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/a5dded44-eee7-b5ec-57ee-4dd2e658b0fe.png)

➃下記のように更新を実行するコマンドを作成して記入
```:書き方
TortoiseProc.exe /command:update /path:"<更新を行いたい箇所のパスを記載>"
```

```:例）SVNチェックアウト済みフォルダを更新するコマンド
TortoiseProc.exe /command:update /path:"C:\Users\hogehoge\Documents\SVNチェックアウト済みフォルダ"
```
➄「次へ」を選択
![2024-07-02_19h40_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/b6ff46bb-ef29-8564-48d5-ec3cf84ab0b7.png)

➅ショートカットの名前を記入
➆次へ
![2024-07-02_19h41_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772806/3c2053f0-f8f9-46e0-d44b-d8a4c0deaee1.png)

**更新ショートカット作成完了！！**

# その他
### /command:<コマンド名>
```/command:<コマンド名>```コマンド名を```commit```と記載するとコミットするようにもできます。
```:サンプル
TortoiseProc.exe /command:commit /path:"<更新を行いたい箇所のパスを記載>"
```
その他のコマンドはTortoiseSVNのドキュメント[表D.1 使用できるコマンドとオプションの一覧](https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-automation.html#:~:text=%E8%A1%A8D.1%20%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%B8%80%E8%A6%A7)をご確認ください。更新・コミット以外もできます。

### /closeonend:<数字>
```/closeonend:<数字>```を記載するとダイアログを自動で閉じる制御ができます。
※記載しない場合はダイアログは閉じない。
- ```/closeonend:0``` ：コマンド実行後にダイアログを自動的で閉じないようにする。
- ```/closeonend:1``` ：コマンド実行後にエラーがなければダイアログを自動的で閉じる。
- ```/closeonend:2``` ：コマンド実行後にエラーや競合がなければダイアログを自動的で閉じる。
- ```/closeonend:3``` ：コマンド実行後にエラー、競合、マージがなければダイアログを自動的で閉じる。
Open Source Conference 2024 Hokkaidoに参加してきました！

# はじめに
北海道札幌市で開催された、Open Source Conference 2024 Hokkaidoにソロで参加してきました。
そのレポートを記載しておきます。
# Open Source Conferenceとは？
> オープンソースカンファレンス（OSC）は、オープンソースの今を伝えるイベントです。
東京だけでなく、北は北海道、南は沖縄まで、年間を通じて全国各地で開催しています。
>
> オープンソース関連のコミュニティや協賛企業・後援団体による、セミナーやプロダクトの展示などを入場・参加料が無料でご覧いただけるイベントです。
>
>現在は開催地域によってオンラインとオフラインで開催しております。
詳しくは「オープンソースカンファレンス今後の開催予定」の各開催ページをご確認ください。

引用:https://www.ospn.jp/
#  Open Source Conference 2024 Hokkaidoの概要
📍場所
　札幌市産業振興センター（地下鉄東西線「東札幌駅」から徒歩7分）

🕐️開催期間
　10時～18時

🧑‍🤝‍🧑参加者数
　約400名

💻️ 公式ホームページ
https://event.ospn.jp/osc2024-do/
# セッション情報
同時に、5つのセッションが、それぞれ部屋で開催されていました。
合計35セッション＋閉会式が開催されていました。

https://register.ospn.jp/osc2024-do/modules/eventrsv/1.html

私は、以下の5つのセッションに参加しました。

- いまいまMySQL2024～いよいよ姿を現した MySQL 8.4 LTS～
  https://event.ospn.jp/osc2024-do/session/1514768
  長年お話されている、MySQLの「今」を伝えるセッションでした。
  恥ずかしながら、ほとんどMySQLを使ったことがないのですが、興味深いお話でした。
  「LTS版」が採用されたというお話や、オススメの情報源を紹介されていました。 
  
- 再:自宅サーバーを始めてみよう!2024年版
  https://event.ospn.jp/osc2024-do/session/1499723
  MyDNS.JPのお話を中心にされていました。MyDNSを使ったことはなかったのですが、興味深いお話でした。
  自分でサーバー運営されている人とか、事前知識がないと、少し理解が難しい内容かもしれないです。 
- 絶対合格しようシリーズ LPIC-101 試験対策講座
  https://event.ospn.jp/osc2024-do/session/1461702
　これは、LPIC-101に合格するためのポイントを紹介されるセッションでした。私はLPIC-101を受ける予定は近日ありませんが、もし受ける際には、紹介されていたポイントを活かしたいと思います。
なお、このセッションは動画セッションでしたので、以下のYouTubeで見ることが出来ます。
<iframe width="560" height="315" src="https://www.youtube.com/embed/XzWTQaUvLvQ?si=2rIhH7iiiouoUpR3" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

- 海外カンファレンスなどで使うための、英語を話すコツ。（カギは日本語にあり）
  https://event.ospn.jp/osc2024-do/session/1507715
　英語を話すには、 単語、イディオオム、文法、文、英会話、TOEIC、海外旅行などももちろん大事ですが、日本語を理解するということが大事というお話でした。
日本語は英語と違い、主語を入れなくても良いという特徴があります。
英語は、言いたいこと・重要なことをとりあえず言えばいいので、それを意識しよう、というお話でした。
- せっかくのOSSなんだし、ソースコード読むよね？ 〜Apache Kafkaを例にした0SSのソースコードリーディングの初歩〜
  https://event.ospn.jp/osc2024-do/session/1461829
  スライドを共有してくださっていたので、貼っておきます。 
<iframe src="//www.slideshare.net/slideshow/embed_code/key/lDMAncECNypF1J" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" loading="lazy" allowfullscreen> </iframe> 

OSSのソースコードを読んだことがなかったので、これを気に、ぜひ読んでみたいと思いました。
ポイントなどが豊富に紹介されていたため、やったことがない私でも、イメージしやすいセッションでした。


# まとめ
大学・会社以外で、はじめてソロでカンファレンスに参加してきました。
セッションや、ブースで、色々な知見を得ることができて良かったです。
ただ、色々な方との名刺交換や交流などは0（ブースで話を聞いた程度）なので、次回カンファレンス参加時はもっと交流したいなと思いました。（[カレーカンファレンス](https://event.ospn.jp/osc2024-do/session/1554749)の存在を知らなかったので、Open Source Conferenceに次回参加するときは参加したいですね）
また、知らない技術については事前に調べておいたほうが、より理解が進んで有意義なカンファレンス参加になりそうだな、と思いました。
【Python】フォーマッター：Blackについて調べてみた

## はじめに
pythonのコードフォーマッターとして「Black」について、特徴や使い方などの基本を理解したいと思い、「Black」について調べてみました。

## Blackとは

### 特徴
・**BlackはPythonコードフォマッター**：2024/07/02現在、最新versionは24.4.2。

・**BlackはPEP8に準拠**：PEP8はPython自体の標準ライブラリなどに対するコーディング規約で、「インデント」や「1行の長さ」などに関するルールを適用します。

### インストール方法とフォーマット方法

・**インストール方法**：以下コマンドでインストールし、実行するにはPython 3.8以降が必要です。
```
pip install black
```

・**フォーマット方法**：特定のファイルをフォーマットする際は、以下のように使用します。
```
black　black_sample.py
```

## Blackの利点
#### 様々なツールと統合できる
Emacs、Vim、Visual Studio Code、Sublime Textなどのエディタに統合して使用できます。
Github Actionsのワークフロー内でもBlackを使用できます。

#### 豊富なコマンドラインオプション

-lオプションで1行あたりの長さを指定したり、-diffオプションでファイルを書き換えずにBlackが行う変更をdiffとして出力するなど、様々なオプションがあります。


## 参考文献
本記事は以下情報を参考にして執筆しました。

・Blackのドキュメント

https://black.readthedocs.io/en/stable/

・BlackのpypiのWebサイト

https://pypi.org/project/black/

・PEP8を読み解く

https://qiita.com/simonritchie/items/bb06a7521ae6560738a7
LangServeをAWS Lambdaにデプロイすると、アクセス時にファイルダウンロードになる

# 現象
AWS LambdaにLangServeをデプロイし、アクセスするとなぜかファイルダウンロードになる

![スクリーンショット 2024-07-02 19.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58745/9d8be00e-561f-6b3f-08ed-08af423d4b43.png)

# 原因
## ライブラリのインストール漏れ

## CloudWatchでエラーを追う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58745/db8516f0-876a-d6bc-5935-fef857bfb085.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58745/a19df5d8-8886-bdd1-3142-e37cb347bb87.png)

## requirements.txtに不足分を追記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58745/99cf73d7-ae2b-f9c3-d7b0-e422763eee1f.png)
macOS 用ダイナミックアイランド (ダイナミックレイク)


(Translated from English)


![FlairSmall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829065/18af6b64-b8fb-9e66-30d2-889bd2b43cdc.png)

https://www.dynamiclake.com/dynamiclakepro

私は DynamicLake Pro を開発しています。これは、Dynamic Island を iOS から macOS に導入するために設計された、洗練された macOS アプリケーションです。DynamicLake Pro は、macOS インターフェースにシームレスに統合される、インタラクティブでカスタマイズ可能なさまざまなウィジェットを提供し、ユーザーにリアルタイムの情報と重要な機能への迅速なアクセスを提供します

私は、Dynamic Island の機能を Mac に導入するために設計された macOS 用の DynamicLake Pro に取り組んでいます

DynamicLake: シンプルで直感的なインターフェイスで、音量、明るさ、キーボードのバックライトなどの重要なシステム機能を簡単に制御できます。

DynaMusix: 音楽を聴き逃すことなくコントロールできます。再生、一時停止、トラックのスキップ、音量調整はすべて、洗練された統合コントロール パネルから行えます。シームレスな音楽管理で、グルーヴ感をキープできます。

DynaGlance: デスクトップで直接リアルタイム更新を行い、スケジュールや天気を常に把握できます。重要なイベントを見逃したり、突然の天候の変化に驚かされたりすることはありません。DynaGlance は、簡潔で一目でわかる通知で最新情報を提供します。

miniLake: ミニマリスト アプローチを好む方のために、miniLake は DynamicLake のコンパクト バージョンを提供します。すべての重要な機能を小さく目立たない形式で提供し、貴重な画面スペースを解放します。

スリム プレーヤー: Mac の美観を引き立てる、美しくスリムな音楽プレーヤーで音楽を体験してください。エレガントなデザインとユーザー フレンドリーなコントロールにより、音楽を聴くことが視覚と聴覚の楽しみになります。

ダイナミック ボート: 「ライブ アクティビティ」の追跡をお楽しみください。音楽の再生の監視、Safari のダウンロードの追跡、その他の重要な通知の受信など、DynamicLake Pro は、動的なリアルタイム更新で常に最新情報を把握できるようにします。

ノッチのカスタマイズ: Mac のノッチ設定を好みに合わせてカスタマイズします。独自のスタイルとワークフローのニーズに合わせて外観と機能を調整します。さらに、他にもさまざまな機能があります。DynamicLake Pro には、Mac エクスペリエンスをよりスムーズで楽しいものにするための追加機能が満載です。今すぐ DynamicLake Pro を使いこなして、Mac の新たなレベルを発見してください。機能性、スタイル、使いやすさを兼ね備えたツールで、Mac の使い方を変えましょう。
成長するエンジニアの特徴

## 成長するエンジニア
こんにちは、HUSTARという会社でプロダクト開発をしている竹本と申します。
プロフィールはこちら↓
https://studychain.jp/takemoto

今回は成長するエンジニアになるためにどこが重要なのかについて執筆していきたいと思います。
これがqiita初投稿となります、、温かく見守って頂けますと幸いです。

### 成長するエンジニアとしないエンジニアの違い
エンジニアとしてのキャリアを積む中で、成長するエンジニアと成長しないエンジニアの違いに気づくことがあります。この違いは単なるスキルやセンスだけでは測れません。

以下に、その違いについて詳しく述べたいと思います。
### スキルやセンスは一定のレベルまで
エンジニアとしてのスタート時点で、スキルやセンスは確かに重要です。優れたプログラミングスキルや鋭いセンスを持つことは、初期の成長を大いに助けます。

もちろん僕自身も初めは以下のように思っていました。!

![スクリーンショット 2024-07-02 19.57.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/720765/f56dee1a-d4d6-14d2-19a9-3f720956064f.png)

ただし、実際やってみると、

[スクリーンショット 2024-07-02 19.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/720765/4eec0b14-33a2-fd76-7d10-dcded76149df.png)

そもそもの限界があります。スキルやセンスだけでは、一定のレベル以上に到達することが難しいです。スキルやセンスだけでなく、他の要素も必要です。

### 想像力と思考力の重要性
それよりも重要なのは、想像力と思考力です。新しい技術や解決策を見つけるためには、創造的な発想が不可欠です。
日常の問題を解決するための新しいアプローチを考え出す力、既存の枠にとらわれない柔軟な思考が成長を促進します。新しいアイディアを持つことが、成長のカギとなります。

### 謙虚さの価値
謙虚さは、成長するエンジニアに共通する特性です。自分の限界を認識し、他者から学ぶ姿勢を持つことが重要です。
謙虚であることにより、他のエンジニアや専門家からのフィードバックを受け入れ、成長の糧とすることができます。自己研鑽を怠らない姿勢が、成長を後押しします。

### 向上心と挑戦する精神
常に向上心を持ち続け、新しいことにチャレンジする姿勢も欠かせません。技術は日々進化しているため、最新の技術動向にアンテナを張り、学び続けることが求められます。
失敗を恐れずに挑戦し続けることで、成長のスピードは加速します。失敗から学び、次へと活かす力が重要です。

### 会社のカルチャーとの適合
成長するエンジニアは、スキルだけでなく、その会社のカルチャーに合っているかどうかも重要です。特に、バイブスや向上心の面で一致していることが成長を助けます。

自分の価値観や目指す方向性が会社と一致していると、より積極的に取り組むことができ、成長の機会も増えます。カルチャーフィットが成長の環境を整えます。

### 結論
成長するエンジニアとしないエンジニアの違いは、単なるスキルやセンスだけではありません。想像力と思考力、謙虚さ、向上心、そして会社のカルチャーとの適合が大きな要因となります。

これらの要素を持ち合わせたエンジニアは、継続的に成長し、変化する技術の世界で成功を収めることができます。
成長の道を歩むために、これらの要素を大切にしましょう。
【Rails】saveメソッドとcreateメソッドの使い分け

## はじめに
データ保存などで使用する`save`メソッド・`create`メソッドをどういう使い分けをしたら良いかに悩んだので、
勉強がてら使い分けについてまとめました。

## saveメソッドの使用場面
`save`メソッドは以下のように使用します。
```ruby:
user = User.new(name: 'taro', age: 18) #インスタンス生成
user.save #生成したインスタンスの保存
```
`save`メソッドの戻り値は`true`か`false`です。
実行結果によって分岐をさせたい場合などは、`save`メソッドが使用できます。

## createメソッドの使用場面
`create`メソッドは以下のように使用します。
```ruby:
user.create(name: 'taro', age: 18) #インスタンス生成＋保存
```

`create`メソッドは`new`と`save`を一度に実行してくれます。
しかし、createはインスタンスを戻り値として返すため、登録に成功したかどうかの判定には使用できません。

## まとめ
下記のような使い分けができます。

`save`メソッド：実行結果による判定を行いたいとき
`create`メソッド：インスタンスそのものを利用したい時、実行結果の判定が不要なとき

## 最後に
誤りなどあればご指摘いただけるとありがたいです・・！
poetryで仮想環境構築

## 概要

仮想環境を作るのにpoetryが便利だったので、使い方を自分用にまとめました。

## 環境
- M2 Macbook
- OS Sonoma14.4

## Poetryのインストール
### 

公式ドキュメントはこちら。

https://python-poetry.org/docs/

- Linux, macOS, Windows (WSL)の場合
```
curl -sSL https://install.python-poetry.org | python3 -
```

- asdfでいれる場合
```shell
$ asdf plugin-add poetry
$ asdf install poetry latest
$ asdf global poetry latest
$ poetry --version
Poetry (version 1.8.3)
```
## まずやっておきたい設定
poetryの設定は、configコマンドを使って確認します。
インストール直後は下記のようになっているかと思います。
```shell
$ poetry config --list
cache-dir = "/Users/User/Library/Caches/pypoetry"
experimental.system-git-client = false
installer.max-workers = null
installer.modern-installation = true
installer.no-binary = null
installer.parallel = true
keyring.enabled = true
solver.lazy-wheel = true
virtualenvs.create = true
virtualenvs.in-project = false
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.no-setuptools = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}/virtualenvs"
virtualenvs.prefer-active-python = true
virtualenvs.prompt = "{project_name}-py{python_version}"
warnings.export = true
```

venv環境を一括管理せずに、プロジェクトの場所に設置したいので、下記コマンドでvirtualenvs.in-project をglobalでtrueにしておきます。
```shell
$ poetry config virtualenvs.in-project true
```

## 使い方

### 環境作成
```shell
# pyproject.toml(共用設定ファイル)とvenv環境を作成
$ mkdir {作りたいディレクトリ}
$ poetry init

# モジュールのpyproject.tomlへの登録と、インストール
$ poetry add {モジュール名}

# 追加したモジュールの確認
$ poetry show
```

### 実行


```shell
# poetryのvenvで実行
# 実行中のみvenv環境となる
$ poetry run python xxxx.py

#シェルの起動
$ poetry shell
```

## その他のチートシート
```shell
# pyproject.tomlのライブラリを入れる。
# すでに入ってたらアップデート、最新時はスキップ
$ poetry update

# updateをしたらどうなるかを表示
$ poetry update –-dry-run

# モジュールのpyproject.tomlからの削除とアンインストール
$ poetry remove {モジュール名}

# 全モジュールのpyproject.tomlからの削除とアンインストール
$ poetry env remove --all

```

# 誰かが作った環境設定をもらったとき(初回のみ)
```shell
$ poetry install
```

:::note warn

下記のようなエラーになったときは、一度venvコマンドで仮想環境を作ってから、poetry installしてください。
```shell
$ python --version
Python 3.11.4

# version合ってるはずなのにエラー
$ poetry install
The currently activated Python version 3.12.4 is not supported by the project (=3.11.4).
Trying to find and use a compatible version. 

Poetry was unable to find a compatible version. If you have one, you can explicitly use it via the "env use" command.

# venvで仮想環境を作成
$ python -m venv .venv 
$ poetry install
```

:::
## 仮想環境を消したいとき

```shell
# 仮想環境の一覧を表示
$ poetry env list
# 仮想環境を削除
$ poetry env remove {name}
```

## VSCodeでJupyterを使う

Jupyterでセルを実行する際、下記のエラーが出ることがある。

```
'Python 3.12.4' でセルを実行するには、 ipykernel パッケージが必要です。
次のコマンドを実行して、'ipykernel' を Python 環境にインストールします。
コマンド: '/usr/local/bin/python3 -m pip install ipykernel -U --user --force-reinstall'
```

ipykernelを仮想環境にインストールすることで実行できる。
```shell
poetry add ipykernel
```


## 参考
https://qiita.com/IoriGunji/items/290db948c11fdc81046a

https://scrapbox.io/miyamonz/poetry%E3%81%AE%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E6%B6%88%E3%81%99
OpenSSHのCVE-2024-6387を検出するツール

2024年7月1日に発表されたOpenSSLの脆弱性[CVE-2024-6387](https://nvd.nist.gov/vuln/detail/CVE-2024-6387)を検出ツールがgithubにある。
[CVE-2024-6387_Check](https://github.com/xaitax/CVE-2024-6387_Check)はpythonスクリプトで確認する環境のIPアドレスを指定するとその環境が脆弱性[CVE-2024-6387](https://nvd.nist.gov/vuln/detail/CVE-2024-6387)対象の可能性があるかを確認してくれる。

可能性がある場合はOSのサイトを確認して脆弱性[CVE-2024-6387](https://nvd.nist.gov/vuln/detail/CVE-2024-6387)の対象であるかの確認とアップデートの有無を確認する。
* [Ubuntu](https://ubuntu.com/security/CVE-2024-6387) 主にUbuntu22.04以上が対象
* [Redhat](https://access.redhat.com/security/cve/cve-2024-6387) Redhat9以上が対象
* [Amazon Linux](https://explore.alas.aws.amazon.com/CVE-2024-6387.html)　Amazon Linux 2023が対象
* [AlmaLinux](https://almalinux.org/blog/2024-07-01-almalinux-9-cve-2024-6387/) AlmaLinux9以上が対象

以上
運用の自動化で開発効率を劇的に向上させる方法

## 運用の自動化とは？

運用の自動化とは、手動で行っていた運用作業を自動化することを指します。これにより、エラーの減少、作業時間の短縮、そして開発効率の向上が期待できます。特にクラウド環境では、多くの自動化ツールやサービスが提供されており、それらを活用することで運用の自動化が容易になります。

## なぜ運用の自動化が重要なのか？

### 1. エラーの減少
手動作業はどうしてもヒューマンエラーが発生しがちです。自動化することで、これらのエラーを大幅に減少させることができます。

### 2. 作業時間の短縮
自動化により、繰り返し行う作業を一度設定するだけで済むため、作業時間が大幅に短縮されます。これにより、開発チームはよりクリエイティブな作業に集中することができます。

### 3. 一貫性の確保
自動化されたプロセスは常に同じ手順で実行されるため、一貫性が保たれます。これにより、品質の向上が期待できます。

## スクラム開発における運用の自動化

スクラム開発では、短期間でのリリースが求められます。そのため、運用の自動化は非常に重要です。以下に、具体的な自動化の方法をいくつか紹介します。

### 1. CI/CDパイプラインの構築
継続的インテグレーション（CI）と継続的デリバリー（CD）は、運用の自動化の基本です。JenkinsやGitHub Actions、GitLab CIなどのツールを使用して、コードのビルド、テスト、デプロイを自動化しましょう。

### 2. インフラのコード化
インフラストラクチャをコードとして管理することで、インフラの設定や変更を自動化できます。TerraformやAWS CloudFormationなどのツールを使用して、インフラをコード化しましょう。

### 3. モニタリングとアラートの自動化
運用中のシステムの状態を常に監視し、異常が発生した場合には自動でアラートを発する仕組みを構築しましょう。PrometheusやGrafana、AWS CloudWatchなどのツールが役立ちます。

### 4. セキュリティの自動化
セキュリティスキャンや脆弱性チェックを自動化することで、セキュリティリスクを早期に発見し、対策を講じることができます。OWASP ZAPやSnykなどのツールを活用しましょう。

## クラウドベンダーのサービスを活用する

クラウドベンダーは、運用の自動化を支援する多くのサービスを提供しています。以下にいくつかの例を挙げます。

### AWS
- **AWS Lambda**: サーバーレスでコードを実行し、イベント駆動型の自動化を実現。
- **AWS CloudFormation**: インフラをコードとして管理し、自動化。
- **AWS CodePipeline**: CI/CDパイプラインを構築。

### Azure
- **Azure Functions**: サーバーレスでコードを実行。
- **Azure DevOps**: CI/CDパイプラインを構築。
- **Azure Resource Manager**: インフラをコードとして管理。

### Google Cloud
- **Google Cloud Functions**: サーバーレスでコードを実行。
- **Google Cloud Build**: CI/CDパイプラインを構築。
- **Google Deployment Manager**: インフラをコードとして管理。

## まとめ

運用の自動化は、スクラム開発において非常に重要な要素です。エラーの減少、作業時間の短縮、一貫性の確保など、多くのメリットがあります。クラウドベンダーのサービスを活用し、CI/CDパイプラインの構築、インフラのコード化、モニタリングとアラートの自動化、セキュリティの自動化を実現することで、開発効率を劇的に向上させることができます。
【AWS】CodeCommitを触ってみる（リポジトリ作成＆クローン）

AWSのCodeCommitでリポジトリ作成からローカルにクローンまで行います。

# リポジトリを作成
CodeCommitのリポジトリの画面を開き、「リポジトリを作成」を押下します。

![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2300564/084f61d2-6254-9568-624e-b1d97fc93b4f.png)<br>
「リポジトリ名」と「説明」を入力します。
「Amazon CodeGuru Reviewer for Java and Python を有効にする」にチェックを付けると、リポジトリにプッシュしたソースコードをAmazon CodeGuruでレビューすることが可能になるようです。
入力できたら「作成」を押下します。

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2300564/16fff5ce-aad7-3d29-aa5c-285a08676705.png)<br>
リポジトリの作成完了です。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2300564/36dae9d4-8de5-0ba6-0dda-680376e63668.png)

# IAMユーザーにHTTPS Git認証情報を設定
今回はHTTPSでクローンするため、IAMユーザーにHTTPS Git認証情報を設定していきます。

事前準備として、CodeCommitへのアクセス権限を持つIAMユーザーを用意します。
今回はAWS管理ポリシーの「AWSCodeCommitPowerUser」を付与していますが、「[CodeCommitのAWS管理ポリシー](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/security-iam-awsmanpol.html)」を参考に適切なポリシーを付与してください。

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2300564/12848039-abe8-737b-2463-bc37fbb1bcbc.png)<br>
「セキュリティ認証情報」タブを選択し、「AWS CodeCommit の HTTPS Git 認証情報」の「認証情報を生成」を押下します。

![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2300564/58006d0a-541d-2006-1433-2ec7b672ba02.png)<br>
生成された認証情報をダウンロードしておきます。
これで認証情報の設定は完了です。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2300564/87d01afa-9cb3-2c33-1cd7-d12a88dd702b.png">

# クローン実行
CodeCommitのリポジトリで「HTTPS」を押下し、URLをコピーします。

![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2300564/863ea969-86f4-305d-76d5-d8420542854d.png)<br>
Git Bashを起動し、クローンしたい場所で次のコマンド実行します。
```
git clone [コピーしたHTTPSのURL]
```
<br>
実行すると認証情報を求められるので、ダウンロードした認証情報を入力してOKを押下します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2300564/af4e22f5-2139-202c-20a5-63a718abb4f6.png"><br>
リポジトリと同名のフォルダが作成できていればクローン完了です。

***

お疲れ様でした🍵

# 参考文献
- [Git 認証情報を使用した HTTPS ユーザーのセットアップ](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-gc.html)
Ryeユーザー必見！全てのライブラリを更新するシェルスクリプト

「本記事はQmonus Value Streamの投稿キャンペーン記事です。」

@aimaigh さんよりコメントで指摘いただきました。
`rye sync --update-all` で全部アップデートできます。
ただし、`rye sync --update-all` の場合 `pyproject.toml` の `dependencies` に書かれたバージョンは書き換えません。
以下で紹介するスクリプトは `dependencies` を書き換えつつ全てアップデートするスクリプトとして使用できます。

---

## Rye で管理しているライブラリを全部アップデートしたい

Pythonでパッケージ管理にRyeを使っています。
Ryeは自身のアップデートをするコマンドが提供されているのですが、`pyproject.toml` の `dependencies` に書かれたライブラリを一括アップデートするコマンドがありません。
それぞれ `rye add xxx yyy zzz` とアップデートしていく必要があります。
ライブラリが増えてくるとかなり面倒。
`pnpm update --latest` みたいに手軽にやりたい!

## 全部アップデートするシェルスクリプト

```bash
#!/bin/bash

# スクリプトが呼ばれたディレクトリに移動
cd "$(pwd)"

# pyproject.toml ファイルのパスを指定
PYPROJECT_FILE="pyproject.toml"

# pyproject.toml ファイルが存在するか確認
if [ ! -f "$PYPROJECT_FILE" ]; then
  echo "$PYPROJECT_FILE が見つかりません。スクリプトを終了します。"
  exit 1
fi

# dependencies セクションを抽出し、コメント行を除外してライブラリ名を取得
DEPENDENCIES=$(awk '/^dependencies = \[/{flag=1; next} /\]/{flag=0} flag' $PYPROJECT_FILE | grep '>=.*' | sed 's/>=.*//' | tr -d '",')

# dev-dependencies セクションを抽出し、コメント行を除外してライブラリ名を取得
DEV_DEPENDENCIES=$(awk '/^dev-dependencies = \[/{flag=1; next} /\]/{flag=0} flag' $PYPROJECT_FILE | grep '>=.*' | sed 's/>=.*//' | tr -d '",')

# ライブラリ名をスペースで区切って変数に格納
LIBS=$(echo $DEPENDENCIES | tr '\n' ' ')
DEV_LIBS=$(echo $DEV_DEPENDENCIES | tr '\n' ' ')

# rye add コマンドを実行
if [ -n "$LIBS" ]; then
  rye add $LIBS
fi

# dev-dependencies 用の rye add --dev コマンドを実行
if [ -n "$DEV_LIBS" ]; then
  rye add --dev $DEV_LIBS
fi

```

こんな感じのスクリプトを作り、実行権をつけてパスが通ったところに配置し、 `pyproject.toml` があるディレクトリで呼んであげると・・・
```
$ rye_library_update.sh
Added bs4>=0.0.2 as regular dependency
Added chromadb>=0.5.3 as regular dependency
Added eventlet>=0.36.1 as regular dependency
Added Flask-Cors>=4.0.1 as regular dependency
Added Flask-SocketIO>=5.3.6 as regular dependency
Added Flask>=3.0.3 as regular dependency
Added google-api-python-client>=2.136.0 as regular dependency
Added google-auth-httplib2>=0.2.0 as regular dependency
Added google-auth-oauthlib>=1.2.0 as regular dependency
Added google-auth>=2.31.0 as regular dependency
Added gunicorn>=22.0.0 as regular dependency
Added langchain-community>=0.2.6 as regular dependency
Added langchain-huggingface>=0.0.3 as regular dependency
Added langchain-openai>=0.1.14 as regular dependency
Added langchain>=0.2.6 as regular dependency
Added langsmith>=0.1.83 as regular dependency
Added openai>=1.35.10 as regular dependency
Added pandas>=2.2.2 as regular dependency
Added pycryptodome>=3.20.0 as regular dependency
Added pymupdf4llm>=0.0.8 as regular dependency
Added python-dotenv>=1.0.1 as regular dependency
Added sentence_transformers>=3.0.1 as regular dependency
Added sentencepiece>=0.2.0 as regular dependency
Added boto3>=1.34.140 as regular dependency
Added langchain-aws>=0.1.9 as regular dependency
Added anthropic>=0.30.1 as regular dependency
Added langfuse>=2.38.0 as regular dependency
Added mypy>=1.10.1 as dev dependency
Added ruff>=0.5.1 as dev dependency
```
やったね!!
アップデート対象は、`>=` でバージョン指定しているライブラリに限定しています。
好みに合わせて、最後に `rye sync` 入れても良いかも
Ryeに一括アップデートのコマンド追加されたりしないかなぁ・・・
最近使ったcurlコマンド

仕事の都合でAPI実装のテストでcurlコマンドを使う機会があったので、使用したコマンドと躓いた点をメモしておきます。

### 1.GET
```
$ curl -v -X GET http://localhost:8080/~
```
- -v : 詳細をログ表示
- -X : HTTPメソッドを指定

### 2.POST/PUT/PATCH
```
$ curl -v -X POST -H "Content-type:application-json" -d "{¥"id¥": [id]}" http://localhost:8080/~
```

- -d : データを付与
- -H : ヘッダー情報を指定

:::note info
-d でデータを指定したら-Xは不要みたいです。
:::

### 3.DELETE
```
$ curl -v -X DELETE -H "Content-type:application/json" http://localhost/~?id=[id]&timestamp=[timestamp]
```
:::note info
DELETEを使用して一緒にデータを送りたかったんですが、なぜか-dオプションだとデータが送られてない？っぽかったので、パラメータとして送ることに。
他の記事いろいろみてたんですが、分からずじまいだったので、ご存知の方いらっしゃいましたらご教授いただけますと幸いです。
:::

### 4.エクセルファイルをアップロード
```
$ curl -v -X POST -H "Content-type:multipart/form-data" -F file=@"/[パス]" http://localhost:8080/~
```

- -F : ファイルを指定

:::note warn
-d オプションと -F オプションを同時に仕様することはできないみたいです。
:::
:::note info
最初content-typeをエクセル（application/vnd.openxmlformats-officedocument.spreadsheetml.sheet）を指定してましたができなかったため、いろいろ調べて上記で出来ました。
:::
あとで調べてみたら、-Fが"Content-type:multipart/form-data"を指定してるっぽいです。
なので、-Fを使えばContent-typeはわざわざ指定しなくてもいいみたいです。
[参考先](https://weblabo.oscasierra.net/curl-post/)

### 5.エクセルファイルをダウンロード
```
$ curl -v -X GET -H "Content-type:multipart/form-data" -L "http://localhost/~" -o C:/Users/~
```

- -L : リダイレクトを実行
- -o : 実行結果をファイルに出力

以上また新しく使用したコマンドがあれば更新します。
誰かのお役に立ちますように。

#### 参考文献

https://qiita.com/ryuichi1208/items/e4e1b27ff7d54a66dcd9

https://weblabo.oscasierra.net/curl-post/
PCが壊れたのでTILはじめました！

こんにちは！
Web受託系企業で働く元公務員のガッキーです！
先日業務を進めるなかで遭遇したPC爆死（壊れた）した事件をきっかけに
学んだことをシェアしたいと思います！


# なぜPCが爆死したか

先日 Docker の環境構築がなかなかうまくいかず、
原因を調べては修正して何度も`docker-compose build`を繰り返しましたが
うまくいかず…PCはフリーズし始めましたが気にせず、
強制終了->コンテナ再構築を繰り返しました。
するとPCの電源を入れても何も反応しなくなってしまいました…


# PCが爆死して困ったこと

PCが壊れたら、何もできないので全てが困った…
会社から代替PCが用意されましたが、
一番つらかったのがエンジニアになる前から書き溜めていた
ローカル管理していたWordのメモでした。

-   HTML/CSS
-   SQL
-   フレームワークの操作

あらゆるメモをストックしていました。
ローカルで、しかもWordで管理している自分が悪いのですが・・・
ここで自分メモの活用方法を考えてみることにしました。


# VSCode で管理してTILはじめました

まずツールはWordからVSCodeに切り替えてマークダウンで書き溜めることにしました。
また何かあったときに備えてやっぱりGitで管理することにしました。
そしてTILという素晴らしい習慣を知り実践してみることにしました！

:::note info
TILとは？
Github上にリポジトリを作成して、今日覚えたことを書いていくこと
:::

https://qiita.com/nemui_/items/239335b4ed0c3c797add

### 2023年のTIL

昨年は色々学びTILができました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671845/640ded56-5271-0107-a14d-27a7c36ebc98.png)


# ただ…pushし忘れる！ので自動化させた！

TILを習慣化することはいいのですが、とにかくPushを忘れる…
そのため.batファイルを作って、

```
git add .
git commit -m'comment'
git push
```
するコードを書いて、
あとはタスクスケジューラーで .bat 毎日実行させて自動化させました！

# まとめ🖊️

ご覧いただきありがとうございました！

何か気になる点や、おかしな点ありましたらお気軽にコメントください！
RockyLinux9でOpenSSHの脆弱性(CVE-2024-6387)に対応する

# TL;DR

RockyLinux公式から緩和策の実施手順が出ていますので、これを実施してください。

https://rockylinux.org/news/2024-07-01-rocky-linux-9-cve-2024-6378-regression

本記事にはこの記事に書いてある以上の情報はありません。

# 脆弱性の内容について

OpenSSHの脆弱性により、外部からroot権限で任意のコードが実行されうるというものです。詳細は他記事に譲ります。

https://qiita.com/mai_llj/items/e02383af984bd7f35ad0

https://piyolog.hatenadiary.jp/entry/2024/07/02/032122



# 手順を日本語で書いてくれ

以下、sudo権限のあるユーザーかrootで実施してください。

以下のコマンドを実行します。

```sh
sudo dnf install rocky-release-security
```

途中本当に実行していいかみたいなことを聞かれますので、`y`を入力してEnterします。

続いて以下のコマンドを実行します。

```sh
sudo dnf --enablerepo=security-common update openssh\*
```

本当に実行していいかみたいなことを2回ぐらい聞かれますので、都度`y`を入力してEnterします。

次のコマンドを実行します。

```sh
rpm -q openssh
```

`openssh-8.7p1-38.el9_4.security.0.5.x86_64`と表示されれば手順は完了しています。

# OpenSSHの更新をしたくない場合

`/etc/ssh/sshd_config`をroot権限で開き、`LoginGraceTime`を探します。筆者の環境では40行目あたりに次のようにコメントアウトされていました。

```conf
#LoginGraceTime 2m
```

これを次のように編集(または下の行にでも追記)します。

```conf
LoginGraceTime 0
```

変更を保存し、sshdを再起動します。

```sh
systemctl restart sshd.service
```
回路

RCローパスフィルタ
https://code4fukui.github.io/circuitjs1/war/circuitjs.html?ctz=CQAgjCAMB0l3BWEA2aAWB8CcBmSy0AOBBAdkJE0sskoFMBaMMAKAHkQ05xlaEwATD1oiWAc07cBhCl1o4BIqCwBOIAV2GTaYXlHCFILAMbatc9TP0x4kCGnSlkyfshwJkYUmi9RYdlgAldU1dWg1aLGROakVqJRgEFgB7fQV9LiwKJBgIHRSY9NpMrHjYJAghNBAcFgALGvUaliA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/fdc2b0e0-82f0-498d-6e02-a6bd5b55f90f.png)


反転アンプ
https://code4fukui.github.io/circuitjs1/war/circuitjs.html?ctz=CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxAXKQUgoFMBaMMAKADcRjCQUFuvwYFFHAgALLSS1p0BCwDmnbr37dcYkZBYAnJYOFhiBoSLDwd4I+DEbs2bmBsjccFgHcQdh06+XhWj0NjAytHDQC-aw0g8AxuCIEVSKSImLQ8ZL4oFgBDSJjfGIywJCYkM3g4KFh4FHsabDx4DF5sYgQM2grzAHlPe0iJLqtpFglscEIu5TwMpucAfUIxBcgFiVIFtFWawl4Fpi2F7GOxyAmGebDxDPTNJZW1jeIFhB3IITfDlFXT8fExMUphQ4jwUOFkA9fhs8Fs1jAwAdEawAPYiZYiGEUaqQXgifyeFhoswgDG0LFoHHwMiEPh4iCsIA
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/c71c95cd-aa33-c085-1ad2-ef5a1ae5171a.png)
非反転アンプ

https://code4fukui.github.io/circuitjs1/war/circuitjs.html?ctz=CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxAXKQUgoFMBaMMAKADcRjCQUFuvwYFFHAgALLSS1p0BCwDmnbr37dcYkZBYB3cMWFo8eg3ygsAhsavZs3MPs7gkTJGHjwQDMdDyFCGYkgUPDwaLCFPb18SWxR9FDBCWwxXdy1dGzsHTJ5TLQAnKxUQHOLaNDgWQoFi+xNuWjdK3QFmYTrBYXSrNp6MBpYAeRLbKwlGh2kWCWxPPFp58SMwMQ1pAH1CMXXIdYlSdYQd2HgyQj5edaZ1lB317GnIWZWNbDQeDGFsPDWQQk3trt9sRDsdIEIjtdbv8HjNxGJlv0KEiUBIRCCtnd9ngbrsYGArgTWAB7ERbETYihQE5wM4XKQ8EQPUnEP6-SnvGDuOmEXiiVhAA
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/d1cd87e1-ffe5-8ec2-3ad6-9795d155c7a0.png)

https://code4fukui.github.io/circuitjs1/war/circuitjs.html?ctz=CQAgzCAMB0l3BWcsAsA2A7GgHGtBGAJgUMgRRBWxCQUhoFMBaffAKAHcbSR8dv6hPlE6UU9PtRTiQpepDYBDMYOElVaENXxIWSfPHhRY8QigCcaBBjBohWc4WwYKEwwoDGK3v3U-q8ibw1uahYeHhSITQFlbm2AjOdAjJGMZw7ABOlHCyudKCuW5wSnnUcrLYhfTaujq87vQs0GbYThiE5h2Q5lQuIM2tTjgG2NjoKGDmDYZs2aS1hJUSJFAzc2W84z4S28UbC7LCfBprBgrzkOXCh4Rorutch-jbz6sKT1W8q07VIgDmmzuFFuX3kohOsksOyOmgUgIKsjAS0RxDhIi4fiEmix0I+AihmkhnThbAASjCXhQiNo9rwcjQ1oEEKUwNI8vRxH8DN8BvVzoZGdF9O5yeB2Yc2SCZPIGcKmcYWS8IL8OeAnGrmQMYPhjLqkPjkeVckbeI4MertOapWalgpSGlVTolk6iJQQAATACWADMfQxMgwAHYeBhsB0EkkE00UD0MDwAezjHvDkDSNvw1vZzvdwcTybYCd4aWEnJ61ANsANsmL4ELsmp6PE8QaLTguHMiRsKHwGAS6Qy9JdFDA9cIKrWzYCMQQYDa5l72F6GAQ91cQV1LqRdaLxBrZZblcMXSsdiQE73o6AA
あるある、空白のエラー？！

## ★はじめに★
GitHubでプルリクエストのコードレビューをしたとき、初めての頃は高頻度で出ていたエラーがあります。
それは**コードの末尾に改行をいれて**というエラー:scream:

初期のころは何度もこのエラーに遭遇しました😢
その度、該当ファイルのコードの末尾にひたすら`Enter`
疲れますね

- [ ] なぜ末尾に改行を入れるのか
- [ ] 何かいい方法はないのか

これら情報をアウトプットしようと思います。

## ★なぜ末尾に改行を入れるのか★
前提として、多くのプログラミング言語やツールは、ファイルの終わりに改行がないとエラーや警告を出すことがあるそうです。
歴史的にテキストファイルが行単位で処理されることが多く、行の終わりを改行で示すことが一般的だったから。
具体的には、以下のような理由があります

**1:互換性**
多くのツールやエディタがファイルの終わりに改行があることを前提に作られているため、改行がないと正しく動作しないことがある。

**2:バージョン管理システム**
Gitなどのバージョン管理システムも、ファイル末尾に改行がないと変更として認識することがある。

**3:可読性**
ファイルの末尾に改行があることで、他の行と一貫性が保たれ、可読性が向上する。


## ★何かいい方法はないのか★
私自身何かいい方法はないかと模索していたところ、VsCodeになりますが、次の設定を行うのが有効だそうです。

1：歯車の設定ボタンを押す
2：検索窓に`Insert Final Newline`を入力
3：`Insert Final Newline`のチェックをオンにする

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


## さいごに
だんだん慣れてくれば自分で末尾に改行を入れる癖はつきましたが、たまーにやってしまう改行忘れ:sweat_smile:
私と同じようなエラーを繰り返してしま人はぜひこちらの設定をしてみることをお勧めします
Workato：外形監視ツールを利用してWorkatoのWebhook（リアルタイムトリガー）を死活監視する

# はじめに

Workatoは、[コンテナベースのクラウドネイティブで非常に可用性の高いインフラ](https://medium.com/@andresalonso.ramirez/ipaas-beware-of-the-cloud-imposters-9d4f603bd644)の上でサービスが提供されており、高い可用性は確保されていますが、そのような環境下であっても、Workatoサービスの低レイヤに存在するクラウドサービスプロバイダのハードウェアやネットワーク障害等に起因する、偶発的なサービス障害が発生することはあります。

これにより、例えばある時刻に実行予定であった処理が遅延あるいは停止する、実行中の処理が中断する、Webhookエンドポイントに対するリクエストが処理できない等の問題が発生する場合があります。

ユーザー側においては、再現可能な（再実行でやり直しのきく）アプリ間連携レシピを作成する、障害が発生した際にいち早く気づいて対処できるような仕組みを用意することで、偶発的なサービス障害に対するレジリエンスを高めることは可能ですが、Webhook（＝リアルタイムトリガー）に関してはサービス障害発生時においてはアプリケーションから受けたリクエストを処理できず、かつWorkato上にはその履歴も残りません。

アプリケーションによってはリトライにより処理を再試行する、Webhookリクエストの成功・失敗をログに記録する、Webhookリクエスト失敗時に管理者へ通知する等、Webhookリクエスト時の障害に対応する機能を提供している場合はありますが、そのような機能を持たない（リクエスト投げっぱなしで結果を何も残さない）アプリケーションも存在します。お使いのアプリケーションが後者に該当する場合は、いつ障害が発生したかを全く気づけないため、Workato外で何らか障害を検知するための仕組みを用意する必要があります。

# StatusCakeでWorkatoのWebhookを死活監視

WorkatoのWebhookの障害を検知する最も手軽な方法として、外形監視ツールによるWorkatoのWebhook URLの監視が挙げられます。

この方法は、特定のレシピのWebhookトリガーやリアルタイムトリガーを監視するものではありませんが、そのワークスペースのWebhook機能に発生した障害を検出する方法としては有効です。

以下では[StatusCake](https://www.statuscake.com/)というSaaS型の外形監視サービスを例に、WorkatoのWebhookの死活監視の手順を説明します。なお、StatusCakeの設定および通知先（Slack）の設定、Workatoのレシピ作成方法などの詳細についてはここでは触れません。

## Workato監視用レシピを作成する

Webhookを監視するために、最初にWebhook監視用のレシピを作成します。

監視用のレシピは、以下の通りGETリクエストに対応したWebhookトリガーと、Stopアクションで構成されています。このレシピは、タスクにカウントされるアクションが存在しないため、タスクを消費することなく運用することが可能です。

なお、ここで出力されたWebhookのURLは後から必要になりますので、コピーしてテキストエディタ等に記録しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/308e66e1-f2fe-1646-7258-bc56ddec5e72.png)

## StatusCakeに監視を追加する

StatusCakeに先ほどコピーしたWebhookのURLを貼付し、監視を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/01b0c1a7-0d52-8965-548c-d7f7ead2fa67.png)

## 動作確認

Webhook監視用のレシピをStart/Stopすることで、指定された通知先に監視状況（Up/Down）が通知され、死活監視の動作を確認することができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/6194ff33-5eb6-8bfd-f097-0a580ce63ff4.png)


# おわりに

今回は外形監視ツールによるWorkato Webhookの死活監視をご紹介しました。外形監視ツールはStatusCakeを利用しましたが、Uptime RobotやMackerel, Zabbixなど他の外形監視ツールでも結構ですし、Google Apps ScriptやAWS Lambda,LinuxのCronやWindowsのタスクスケジューラで監視スクリプト作成し定期実行する方法でも同様の運用が可能です。

Workatoのリアルタイムトリガー（Webhook）の監視を検討されている方の参考になりましたら幸いです。
KCNA向け勉強メモ #2

#1に続いてKCNA(Kubernetes Cloud Native Associate)受験前の最後の見直しに使う資料として作成

https://qiita.com/y-vectorfield/items/e2a5d35b24e5d9871085

# Istio
* サービスメッシュを提供し、マイクロサービス間の通信を管理し、制御する

# PersistentVolumeClaim
* Kubernetesで永続的なストレージをポッドにマウントするためのリソース

# Pod Security Policy
* ポッドのセキュリティポリシーを定義し、ポッドのセキュリティを強化する

# Linkerd
* サービスメッシュを提供し、マイクロサービス間の通信を管理する

# サーバレスアーキテクチャ
* サーバーのインフラストラクチャを完全に排除する

# コンテナの利点
* ソフトウェアの依存関係を削減し、アプリケーションの移植性を向上させる

# コミュニティとガバナンスの役割
* ガバナンスはプロジェクトの方向性を決定し、コミュニティは技術的な実装を担当する

# Podのデザインパターン
* サイドカーパターン(役割：メインコンテナに機能を追加する)
* アンバサダーパターン(役割：外部システムと代理でやりとりを行う)
* アダプターパターン(役割：外部アクセスのインターフェースとなる)

# Pod名の名付けルール
* 利用可能な文字は「英小文字」と「数字」
* 利用可能な記号は「-」と「.」
* 始まりと終わりの文字は「英小文字」であること

# ブルーグリーンデプロイメント
* トラフィックの一部を新しいバージョンにルーティングし、残りのトラフィックは既存のバージョンにルーティングします

# サーキットブレーカー
* サービス間の依存関係を制御する

# ローリングデプロイメント
* 新しいバージョンを段階的に展開して、システム全体の可用性を維持

# GitOpsの主な利点
* インフラストラクチャの変更の透明性

# 現在のクラスター状態を標準出力にダンプするコマンド

```bash
kubectl cluster-info dump
```

# 指定されたNamespace内のPodに適用されるリソースの使用状況をリアルタイムで表示するコマンド

```bash
kubectl top pods --namespace=<Namespace> --watch
```

# ラベルapp=nginxを持つ全てのPodを含むDeploymentのリソース制限を表示するコマンド

```bash
kubectl describe pod -l app=nginx
```

# クラスター内の全てのPodのCPU使用率とメモリ使用量をリアルタイムで表示するコマンド

```bash
kubectl top pod --all-namespaces --containers
```
【prisma】Next.js (TypeScript)+PrismaでMongoDBからRDB(MySQL)へ切り替える

# きっかけ

前回の記事でMongoDBを使って、Mongoose→Prismaへの移行ができたので、続いてMongoDB→MySQLへの切り替えを目指してみました。
(devcontainerでMongoDB動かしてたんですが、prisma使うとreplica setを求められて、動かそうにもなかなか動かず、泣く泣くMongoDB Atlas使ってたので、、、)
    
- 前回記事
https://qiita.com/kei1-dev/items/e031efd41146e82b6759

# How to do
1. .envのDATABASE_URLの変更
1. schema.prismaの修正
    ```
    datasource db {
      provider = "mysql"
      url      = env("DATABASE_URL")
    }
    ```
    
    ```
    model tasks {
    -  id          String?   @id @default(auto()) @map("_id") @db.ObjectId
    +  id          Int   @id @default(autoincrement())
    ...
    }
    ```
    MongoDBだとIDに文字列を入れていたが、RDBでは連番数字に変更(autoincrementもIntでないと扱えない)
1. Prisma Clientの更新
    ```
    npx prisma generate
    ```

1. スキーマ変更に合わせたソース修正(IDを使った検索で文字列型をNumber型に変更など)

    ```route.ts
    const task: tasks|null = await prisma.tasks.findUnique({
        where:{
    -       id: params.id
    +       id: Number(params.id)
        }
    }); 
    
    ```

1. prisma migrateの実行
    ```
    npx prisma migrate dev
    ```
Scratch Tips（Z軸での並べ替え）

# Scratch Tips（Z軸での並べ替え）

奥行のあるゲームなどの場合、スプライト（クローンも含む）のレイヤーを管理したいことがあります。そうしたとき、ある値（通常は Z 軸座標）にしたがってレイヤーを並べ替える必要があるケースで、このやり方が役に立ちます。

元ネタは一番下に記載してあります。

# Z軸での並べ替え

## 概要

Z軸の大きい順に奥からレイヤを並べ替えます。

## サンプル

ここにサンプルがあるので、コードと結果を確認してみよう！

https://scratch.mit.edu/projects/1044100568/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/6d3f7d3d-db8d-d3f8-d330-dcdfa52bf652.png)

左上からバナナの Z 値が 1, 3, 5, 7, 9, リンゴの Z 値が 2, 4, 6, 8, 10 となっていて、値が大きいほど奥にあるということ。何もしないとバナナが全部リンゴの上に乗っかてしまうけど、Z 値にしたがってレイヤーを並べ替えると右のようになる。

## 方法

### Step 1

「Z軸」というリストを作ります。これは「すべてのスプライト用」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/31aea318-dfc9-21a6-71b0-61a0dd167c26.png)

### Step 2

「_Z軸並べ替え」のブロック定義を作ります。ブロック定義は以下のように「画面を再描画せずに実行する」にチェックを付けておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/4cd208c4-3a3f-d3c8-0816-d24550141399.png)

### Step 3

次のコードを並べ替え対象のスプライト全てに配置（コピー）します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/47a27fca-f7ef-a266-88de-2b1cebc3e4e8.png)

### Step 4

並べ替えイベントを常に実行させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/4b7b2f2b-9c12-f84d-3bfe-b343755e4dca.png)

---

間違いやご指摘などありましたら、ぜひコメントくださいませ～。

> [Scratch ライブラリと Scratch Tips 目次へ戻る](https://qiita.com/Kray-G/items/e1900d5b6c6dcfbe5321/)

---

## 元ネタ

非常に役立ちます。

https://youtu.be/bxjbYJLAUYU?si=0NjdG0z9nF52c3Uw
Scratch ライブラリと Scratch Tips

# Scratch ライブラリと Scratch Tips

皆さん、Scratch してますか～？

私は遅ればせながら今年(2024年) 5 月に初めて触りまして、その楽しさと魅力に気づかされて非常に良い経験をさせていただいております。元は小学生の息子に聞かれた際、色々と答えられるように、という動機でしたが、その目的は概ね達成しつつあります。

そこで、色々な小学生や Scratch をされている方々にとって有益な形で記事がまとめらえないか、ということで、あまり他では見かけたことがない観点「**ライブラリ化**」をベースに纏めてみたいと思います。

方法論的には、以前「[Kinx](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)」で行ったように、特定の目次ページから各種説明のページへリンクを張る、というのがいいかな、と思っています。何気に目次ページにインデックスが揃っているのが非常に使いやすかった（私にとっても）。

ということで、このページを目次ページにしたいと思います。

# 目次

## ライブラリ

スプライトをそのまま再利用できるものを「ライブラリ」としてここにまとめてみます。

> ちょっと増えてきたのでカテゴリーごとに分けてみた。ざっくりなので後で変える可能性あり

* **エフェクト・表示系**
  * [爆発エフェクト](https://qiita.com/Kray-G/items/8723ff5599392f0b7c33/)
  * [スコア表示](https://qiita.com/Kray-G/items/773c991e737af5e390f3/)
* **スクロール系**
  * [横スクロール](https://qiita.com/Kray-G/items/8550a646a77198b856b0/)
  * [縦スクロール](https://qiita.com/Kray-G/items/50a2848eb77711b676bc/)
  * [疑似3Dスクロール](https://qiita.com/Kray-G/items/1e0d46d6f19f538d7c39/)
* **オプション選択系**
  * [カルーセル・セレクタ(横)](https://qiita.com/Kray-G/items/8a82fada4eb6912c270a/)
  * [カルーセル・セレクタ(縦)](https://qiita.com/Kray-G/items/2fce4c311cf8caba553e/)
* **音楽系**
  * [BGM 管理](https://qiita.com/Kray-G/items/3955a4ab9f1117d105a8/)
* **開発支援系**
  * [FPS](https://qiita.com/Kray-G/items/6f73aeb7914c3e8fdeeb)

## Tips

ひとつのスプライトで使いまわす形が難しいもの（ライブラリ化は難しいもの）でも、やり方があるものを Tips としてここにまとめてみようかと。

* [Z軸での並べ替え](https://qiita.com/Kray-G/items/f6431e12f051fb11077d/)
* [画面範囲外への描画](https://qiita.com/Kray-G/items/21d78cde7c1bc19a0e17)

## 作品一覧

一つずつ書くの大変なので、下記の各スタジオを見てくださいませ。

# Scratch スタジオ

それぞれ分かりやすいよう、Scratch のプロジェクトは以下のスタジオに纏めておきます。

> 音楽用のプロジェクトは G14 Works に纏めていたのですが、G14 Games と G14 Music に分離しました。

|                     スタジオ(リンク)                     |                                                         イメージ                                                          |                  概要                   |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
| [G14 Games](https://scratch.mit.edu/studios/35458610)   | <img width="200" alt="G14 Games" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/87951cbf-1284-d5a2-6ff0-b2a6e0865665.png"> | ゲームをまとめているスタジオです          |
| [G14 Music](https://scratch.mit.edu/studios/35653808)    | <img width="200" alt="G14 Music" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/60333447-bcd9-fe6f-51c1-065800b6401e.png"> | 音楽プロジェクトをまとめるスタジオです |
| [G14 Library](https://scratch.mit.edu/studios/35458641) | <img width="200" alt="G14 Library" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/d4127f6e-bdb3-cf7c-61b7-dcc00e312375.png"> | ライブラリ用スプライト素材です          |
| [G14 Tips](https://scratch.mit.edu/studios/35458644)    | <img width="200" alt="G14 Tips" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/bf9e22f3-273d-dcaf-1bef-9a9faac6babe.png"> | Tips プロジェクトをまとめるスタジオです |

---

では、いつまで続くか分かりませんが、また細々と積小為大の精神で進めていきます。