OmniAICreator/Qiita-1.07M huggingface dataset:
ブロックチェーン社会実装のための基礎知識概論〜ブロックチェーンの基本機能(スマートコントラクト：スワップ)〜

# 第３章　ブロックチェーンの基本機能

本章では、ブロックチェーンの基本的な機能について取り上げます。スマートコントラクト、トークン、マルチシグ、スワップなど、ブロックチェーン上で実行される機能がどのように構成され、どのような利点を持つかを詳細に説明します。これにより、ブロックチェーンが単なる取引記録の技術にとどまらず、複雑な契約や資産管理に応用されることを理解できます。


### 3. スマートコントラクトによる「スワップ」

スマートコントラクトによる「スワップ」は、ブロックチェーン技術を活用して、異なる資産間での自動的かつ信頼性の高い交換を実現する仕組みです。従来、異なるトークンや暗号資産の交換には、中央集権的な取引所や仲介者が必要でしたが、スワップによって、信頼できる第三者を介さずに直接取引を行うことが可能になりました。この「トラストレス（trustless）」なモデルは、特に分散型金融（DeFi）の分野で重要な役割を果たしており、ユーザーがより効率的で安全に資産を交換できる環境を提供します。

#### スワップの仕組み

スワップの基本的な仕組みは、「原子スワップ（Atomic Swap）」と呼ばれるプロセスを通じて実現されます。原子スワップは、異なるブロックチェーン上の資産を直接交換することができる取引方法で、その特徴は「原子性（Atomicity）」にあります。原子性とは、取引が「全て」か「無」かの形で行われることを意味します。つまり、取引の片方が失敗すると、もう片方もキャンセルされ、取引は成立しない状態に戻ります。この仕組みにより、いずれか一方の当事者のみが利益を得ることがないため、取引の公正性が保証されます。

具体的には、原子スワップでは各取引者が一時的に資産をスマートコントラクトにロックし、条件が満たされると双方の資産が自動的に交換されます。このプロセスはブロックチェーン上で実行され、取引内容は改ざんされることなく、すべての参加者が確認できる透明性を持ちます。

#### スワップの利点

##### 1. **トラストレスな取引**
スワップの最大の特徴は、信頼できる第三者に依存することなく、ユーザー同士が直接取引を行える点です。中央集権的な取引所を介する従来の資産交換では、取引所が資産を預かり、手数料や安全性の問題が発生しますが、スワップでは取引が完全にスマートコントラクトにより自動化されるため、仲介者に依存しない取引が可能です。これにより、ユーザーは取引所に資産を預けるリスクを回避し、取引の安全性とプライバシーが向上します。

##### 2. **コスト削減**
中央集権的な取引所を介さないため、スワップでは取引手数料が大幅に削減されます。従来の取引所では、仲介手数料が発生するだけでなく、資産の移動や引き出しにも追加の手数料がかかることがありました。スワップでは、スマートコントラクトが自動的に資産を交換するため、手数料のコストを抑えることができ、ユーザーにとって経済的な利点があります。

##### 3. **自動化と迅速性**
スワップは、スマートコントラクトを活用することで、取引の全プロセスが自動化されます。取引が開始されると、ユーザーが手動で承認する必要がなく、条件が満たされればスマートコントラクトが自動的に取引を実行します。これにより、従来の金融システムで発生する承認プロセスや時間的な遅延が排除され、取引が迅速に完了します。特に、グローバルな資産取引においては、スワップによってタイムゾーンや銀行の営業時間に左右されずに取引を行うことが可能です。

#### スワップのユースケース

##### 1. **暗号通貨の交換**
暗号通貨間の直接交換は、スワップの代表的なユースケースの一つです。例えば、ビットコイン（Bitcoin）とイーサリアム（Ethereum）といった異なるブロックチェーン上のトークンを交換する場合、従来は取引所を介して行う必要がありました。しかし、原子スワップを用いることで、中央集権的な取引所を使用せずにユーザー同士が直接資産を交換できるようになり、取引の迅速性と安全性が向上します。これにより、取引所への依存や中間手数料を削減しながら、効率的な資産交換が可能です。

##### 2. **分散型取引所（DEX）**
分散型取引所（DEX）では、スワップ機能が取引の基盤となっています。DEXは、中央集権的な取引所と異なり、ユーザーの資産を取引所自体が管理するのではなく、ユーザー自身が保管した資産を直接交換できるプラットフォームです。スワップは、スマートコントラクトを活用してトークンの自動交換を実現するため、中央集権的な取引所のリスクを排除し、ユーザーに安全な取引環境を提供します。また、DEXではプライバシーが強化されており、個人情報を提供することなく取引が行えるため、匿名性を重視するユーザーにとっても魅力的な選択肢となります。

##### 3. **金融デリバティブ**
スワップは、単なるトークン交換にとどまらず、金融デリバティブや先物取引にも応用されています。スマートコントラクトを使用することで、条件付きの資産交換が可能になり、例えば、特定の日付や市場価格に基づいて資産が自動的に交換されるようにプログラムすることができます。これにより、トークンや資産を活用した高度な金融商品が構築され、取引の自動化と効率化が進んでいます。特に、複雑な金融取引においても、スマートコントラクトが全ての条件を自律的に管理するため、人的エラーや詐欺のリスクを軽減します。

#### スワップのさらなる応用と未来展望

スワップ技術は、暗号通貨の交換や分散型取引所だけでなく、他の多くの分野でも応用される可能性があります。例えば、物理的な資産のデジタル証明書とトークンを交換する「資産トークン化」分野では、土地や不動産、芸術品などのトークンがスワップ機能を通じて容易に取引される未来が考えられます。また、サプライチェーン管理においても、異なる組織間で商品やサービスの価値をトークン化し、スワップを通じて効率的に交換することが可能になるでしょう。

さらに、スワップの技術は、分散型金融（DeFi）のエコシステムと深く結びついており、将来的にはより多くの取引や契約が自律的に管理され、仲介者を介さない透明で信頼性の高い金融システムが構築されることが期待されています。分散型取引所の利用が増えるにつれて、スワップ機能の重要性はますます高まり、金融市場全体におけるスワップの応用範囲が拡大するでしょう。

#### 結論

スマートコントラクトによる「スワップ」は、ブロックチェーン技術を利用してトークンや資産を迅速かつ安全に交換できる画期的な仕組みです。原子スワップを通じて、取引の片方が失敗した場合でも全体がキャンセルされるため、公平性が担保され、信頼できる第三者に依存しない「トラストレス」な取引を実現します。スワップは、コスト削減や取引の自動化を可能にし、特に分散型取引所や暗号通貨の交換においては、重要な役割を果たしています。

将来的には、スワップ技術がさらに多くのユースケースに応用され、金融デリバティブや資産トークン化、サプライチェーン管理といった新たな分野での活用が進むことが予想されます。スワップは、従来の金融システムの枠を超え、ブロックチェーンを基盤とした新しい金融のあり方を構築する上で、ますます不可欠な技術となっていくでしょう。
Win32 APIを使って、セキュリティ関連のツールを作成してみる

# GitHub
https://github.com/mniyk/usb-device-monitoring

# Screen Shot
![スクリーンショット 2024-12-14 094657.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498946/86eb9fd7-de77-3c57-0499-1452183786c0.png)

# Motive
この2つを満たす何かを作ってみたかったため
- 何かセキュリティに関連したツールを作成してみたかった
- Win32 APIを利用したことがなかった

# Use Case
社員のデスクトップでUSBデバイスモニタリング（usb-device-monitoring）を常に実行し、管理者のSlackに通知を送るユースケースを想定しました.

# Tech Stack
- Go
- Win32 API

# Difficulty
- Win32 APIの利用方法
Win32 APIの利用方法、ここでやはり躓きました.
Chat GPTで生成 -> エラー調査 -> 修正 -> 動かしてみるの、Try & Errorしながら作成しましたが、難しい.
1の補数　2の補数

# 結論
2進数において、

1の補数は、ある数に足して各桁を1にするのために必要な数で、"1"の補数
例） 0011 の補数は 1100 → 0011 + 1100 = 1111

2の補数は、ある数に足して繰り上がる数で、"2(2進数では繰り上がる数)"の補数
例） 0011 の補数は 1101 → 0011 + 1101 = 10000

## もう少し細かく
2進数において、1 と 2 という数がどのような数であるか、見てみましょう。

1 → 各桁における最高値
2 → 繰り上がりの数字

つまり、
1の補数を言い換えると
**各桁を最高値とするために必要な数**

2の補数を言い換えると
**繰り上がるために必要な数**
となるわけです。

## 一般化
n進数において、

**nの補数は繰り上げるための数**

**n-1の補数は各桁を最大にするための数**
Streamlit使いがWriter Framework (旧Streamsync)を使ってみる

# 背景
業務でStreamlitを使って簡単なPOC用Webアプリケーション開発、みたいなケースが多かったが、streamlitにはいくつか課題がある。

- UIのカスタマイズ性
- 何かイベントが走るたびにスクリプトが頭から走り直しになる

とくに2つ目には、アプリに機能が追加されればされるほど苦しめられるので本当になんとかならないかと常々感じている。

# 使ってみる

## インストール

公式サイトを参考にいろいろやってみる

https://dev.writer.com/framework/quickstart

公式サンプルアプリインストール・実行してブラウザで表示までたどり着いた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1911348/6c6d9c89-b9e5-4d35-559c-eeec66fca128.png)

## UI編集

### 既存コンポーネントUI
画面上のサイドバーより右側の任意の場所を触ると、そこに該当するコンポーネントツリー上の場所までサイドバーがスクロールされ、該当箇所の要素編集GUIが出現する。
たとえば一番上の「Hacker Pigeons」をクリックしてみると、下図のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1911348/9ee97a7f-45ac-5a23-0a0b-3e3a7c5630f0.png)

そしてCSSを変更してみる。該当の要素のデフォルトのアトリビュートについてはGUIでそのまま変更できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1911348/f858c0b1-3e14-265c-9ce2-e955f22d7199.png)

より詳しく変更するにはCustom CSS classesに、コード側で定義したcssクラスを入力するらしい。以下参考。

https://dev.writer.com/framework/stylesheets

### 新規コンポーネント編集
サイドバーからColumn, Chatbotを検索して、component tree上の挿入したい箇所にドラッグアンドドロップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1911348/dfb9cf61-6172-25b3-9d9a-cbf47c423bfd.png)

また、コンポーネントを自分で作ることも可能な様子。

https://dev.writer.com/framework/custom-components


## セッション管理

セッションの内容は画面上部の「State Explorer」から閲覧できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1911348/0799666a-92d4-24a1-3d97-ca0265baad0f.png)

参考：コード上での定義記述
```
# STATE INIT

initial_state = wf.init_state({
    "main_df": _get_main_df(),
    "editable_df": _get_editable_df(),
    "editable_df_open_text": "<none>",
    "highlighted_members": _get_highlighted_members(),
    "random_df": _generate_random_df(),
    "hue_rotation": 180,
    "paginated_members": _get_paginated_members(0, 2),
    "paginated_members_page": 1,
    "paginated_members_total_items": len(_get_main_df()),
    "paginated_members_page_size": 2,
    "story": {
        "text": _get_story_text(),  # For display
    },
    "filter": {
        "min_length": 25,
        "min_weight": 300,
    },
    "metrics": {}
})

update(initial_state, None)
```

UI上でコンポーネントを動かしていても、裏でスクリプトが走り直し、みたいなことにはならない様子。
イベントハンドラがコンポーネントごとに細かく定義されているのもあり、Streamlitでのようにわざわざスクラッチで定義しなくて済むのは本当にありがたい限り。

参考：Chatbotのイベントハンドラ
fxのロゴがついているのは裏（pythonファイル側）で定義済み関数。
隠れてはいるが、他にあと２つほどイベントハンドラがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1911348/0b711d3b-294d-e19e-1f76-4517f4d1fbe1.png)

# 終わりに

## こんな場合に刺さりそう

- streamlitほどコンポーネントのバリエーションが多くなくていい
- streamlitより見た目にこだわりたい
- streamlitよりコーディング数を削減したい
- 他のクラウドベンダーなどのサービスとしてのローコードツールは使用不可能な環境にいるけどローコード開発したい

## 課題、今後やりたいこと

- コンポーネントが少なく、本格活用の場合はコンポーネントを自作しなければならない場合がありそう
- cssの自由度がだいぶ高いので、できることが多い分使いこなそうとするとフロントエンドの知識もstreamlitよりは必要そう
- （やりたいこと）実際にFunctionやコンポーネント自作して配置
- （やりたいこと）複数ユーザーでアプリに接続するとどんな挙動になるのか
カルマンフィルタと状態空間モデルをわかりやすく解説！

カルマンフィルタや状態空間モデルは、現代の多くの分野で活用されている強力なツールです。しかし、一見すると数学的に難しく感じられるこれらの概念を、具体例やシンプルな説明を通してわかりやすくまとめました。
※この記事は、ChatGPTの出力を基に作成しています。

---

### 状態空間モデルとは？

状態空間モデルは、「観測可能なデータ」から「見えないけれど知りたい状態」を推測するための数学的な仕組みです。  
#### 具体例：洞窟の中から外の天気を推測する
- **状態（知りたいもの）**：外の天気（晴れ、曇り、雨）。直接見ることはできません。
- **観測（見えるもの）**：洞窟の中で聞こえる音（雨音や風の音）。
- **モデルの役割**：音から天気を推測するためのルールを作る。

状態空間モデルでは、「観測したデータ（音）」と「天気の移り変わりの規則性」を使って、見えない天気を推測します。

---

### カルマンフィルタとは？

カルマンフィルタは、状態空間モデルを使ってリアルタイムで「観測データ」と「予測」を組み合わせて最適な推定を行う方法です。たとえば、ロボットが部屋の中を動く際の位置推定に使われます。

#### 具体例：ロボットの位置推定
1. **予測**：ロボットは車輪の回転から「進んだ距離」を計算し、次の位置を予測します。
2. **観測**：部屋のセンサー（例えばカメラやGPS）がロボットの位置を測定します。
3. **推定**：カルマンフィルタは、予測と観測の両方を信頼性に応じて組み合わせ、「本当の位置」に近い推定値を計算します。

---

### カルマンフィルタの計算ステップ

1. **予測ステップ**  
   - 過去の状態や動きのモデルから次の状態を予測します。
2. **更新ステップ**  
   - センサーの観測値をもとに予測を修正し、より正確な状態を推定します。

---

### カルマンフィルタのハイパーパラメータ

カルマンフィルタの性能を左右する「調整可能なパラメータ」は以下の通りです：

#### 1. 状態遷移モデル
- **状態遷移行列 $\(F\)$**  
  状態が時間とともにどのように変化するかを示す行列。
- **制御行列 $\(B\)$**  
  外部入力（例：加速度）による影響を考慮する行列。

#### 2. 観測モデル
- **観測行列 $\(H\)$**  
  隠れた状態と観測値の関係を表します。

#### 3. ノイズ特性
- **プロセスノイズ共分散行列 $\(Q\)$**  
  モデル化できないランダムな変動を表す。
- **観測ノイズ共分散行列 $\(R\)$**  
  センサーの誤差を表します。

#### 4. 初期値
- 初期状態の推定値$x_0\$とその誤差$P_0$を設定。

#### チューニングのポイント
- $\(Q\)$（プロセスノイズ）と $\(R\)$（観測ノイズ）のバランスが重要。
  - センサーの信頼性が高ければ観測を重視。
  - システムモデルが信頼できる場合は予測を重視。

---

### 応用例

カルマンフィルタと状態空間モデルは、さまざまな分野で利用されています。

1. **位置推定**  
   GPSや加速度センサーを使った自動車のナビゲーション。
2. **航空機の航法**  
   レーダーやセンサーを統合して機体の位置を推定。
3. **経済データの分析**  
   ノイズを含むデータから景気や売上のトレンドを推定。
4. **音声認識**  
   ノイズのある音声信号をきれいにする。

---

### まとめ

カルマンフィルタは、「観測データ」と「予測」をリアルタイムで組み合わせて最適な推定を行う手法です。ノイズの影響を考慮して信頼性の高い推定ができるため、位置推定、航法、経済分析など多くの分野で利用されています。

「見えないものを推測する」という基本的な考え方を覚えれば、カルマンフィルタや状態空間モデルの魅力がよりわかりやすくなるはずです！
はんだ はんだ付け 電子工作

# はんだ
- はんだは、錫(すず)Snと、鉛(なまり)Pbを6対4の割合で混ぜ合わせた合金SnPbである
- 融点が231.9℃の錫(すず)と、融点が327.5℃の鉛(なまり)を混ぜ合わせることによって融点が183℃のはんだができる
- はんだは金属としては融点が低く加工しやすい
- はんだのような、融点が低く、流動性(濡れ性)がある合金を共晶合金（きょうしょうごうきん）という

# はんだ付け
- 電子、電気回路の部品を配線するために用いる
- 電気的に接続することが目的であり、接着や溶接のように接合強度のためではない
- はんだSnPbと、基板上の銅(どう)Cuを溶かし合金SnCuを形成し部品を接続する

# リンク
https://godhanda.co.jp/
https://www.youtube.com/@godhanda/videos

 |||
 |---|---|
 |リード型（アキシャル）抵抗のはんだ付けお手本（体験用基板を使用）効果音|https://www.youtube.com/watch?v=ZwgdvJ82kz8|
 |LEDはんだ付け|https://www.youtube.com/watch?v=f3Z5K237pbk|
ドローン検定2級合格体験記

ドローン検定を受験し合格することができました。
合格体験記をまとめますので、
これから受験する方のご参考になればと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881331/e511f940-69c0-f975-0087-b75c2c0bb782.png)

①試験名
ドローン検定2級

②受験日
2024/11/24

③点数
数問ミス程度だと思いますので、90点～100点だと思います。

④受験回数
1回目

⑤学習期間
約1か月

⑥使用テキスト
ドローンの教科書 標準テキスト、上級テキスト

⑦参考にしたサイト
航空気象学やバッテリーに関してはより理解を深めるため、
youtube上の動画を活用しました。

⑧学習方法
基本的には「ドローンの教科書 標準テキスト、上級テキスト」で充分だと思います。
ただ、仕組みに関して理解を深めるため、youtubeで動画を見ました。

⑨試験の感想

・小さな会議室1部屋で受験者は10程、男女比8:2だったと思います。
　おそらく30代～だったと思います。

・途中退出可能でした。私は試験開始40分程度で退出しました。

・会議室に時計はありました。

・問題数が多いので、テンポよく解答する必要があると思います。
　
⑩次に受験予定の試験
ドローン検定1級の予定ですが未定です。
[Rust]オブジェクトに「メソッド」を生やす

## メソッドと関数の違い

Rustでは「メソッド」と「関数」は明確に区別されます。

メソッドは関数と似ており、`fn`キーワードを使って宣言します。ただし、メソッドは必ず何かしらのオブジェクト（構造体や列挙型などを指します）に紐づけられます。

メソッドを実装するときは`impl`キーワードを使用します。例えば構造体にメソッドを実装したい場合は、`impl 構造体名 { ... }`とします。

### メソッドの引数

メソッドの第一引数は必ず実装されているインスタンス自身になります。その引数名は`self`で型は`Self`と表現されます。この`self`は、メソッドが基づく構造体のインスタンスを指します。例えば`Person`という構造体にメソッドを定義した場合、そのメソッドの第一引数の`self`は`Person`型になります。インスタンスのメソッドを呼び出すと、そのインスタンスの情報を参照したり、更新したりできます。

また、`fn メソッド名(self: Self)`と書く代わりに`fn メソッド名(self)`というシンタックスシュガーも用意されています。

:::note warn
更新する際は、`&mut self`と書く必要があります。
:::

```rust
struct Person {
    name: String,
    age: u8,
}

impl Person {
    fn greet(self) {
        println!("Hello, my name is {}.", self.name);
    }
    
    fn birthday(&mut self) {
        self.age += 1;
        println!("Happy birthday! I'm now {} years old.", self.age);
    }
}
```

`self`だけでなく、第二引数以降で追加の引数を取るメソッドも定義できます。

```rust
impl Person {
    fn update_name(&mut self, new_name: String) {
        self.name = new_name;
        println!("My name is now {}.", self.name);
    }
}
```

### メソッドの呼び出し

`インスタンス名.メソッド名()`の形で呼び出します。第一引数の`self`は自動的に渡されるので、呼び出し時に明示する必要がありません。すなわち、`self`しか引数を取らない場合は、`()`だけで大丈夫です。第二引数以降がある場合、第二引数からメソッドに渡します。

```rust
fn main() {
    let mut person = Person {
        name: String::from("Alice"),
        age: 30,
    };

    person.greet(); // "Hello, my name is Alice."
    person.birthday(); // "Happy birthday! I'm now 31 years old."
    person.update_name(String::from("Bob")); // "My name is now Bob."
}
```

:::note
構造体にロジックを持たせるという点で、強力なオブジェクト指向を実現できそうな気がします。
:::

## 関連関数

メソッドの定義時には「第一引数は`self`である」と書きましたが、そうでない関数を書くことも可能です。すなわち、第一引数が`self`でない関数を定義でき、それは（メソッドではなく）**関連関数**と呼ばれます。

関連関数はあくまで関数であり、インスタンスではなく構造体そのものに紐づきます。呼び出すときは`型名::関連関数名`で呼び出します（`String::newやVector::new`のようなものです）。

```rust
impl Person {
    // 関連関数
    fn new(name: String, age: u8) -> Self {
        Self { name, age }
    }
}
```

主なユースケースですが、構造体のコンストラクタに利用することが考えられます。構造体は`構造体名 { ... }`で宣言できますが、フィールドを個別に指定させるのが手間になります。生成時に指定したいフィールドとそうでないフィールド（自動計算したい、任意の値を取れない）がある場合は、そのロジックをコンストラクタとして定義しておき、そのコンストラクタを通してインスタンスを生成させるパターンが有効です。

```rust
fn main() {
    let person = Person::new(String::from("Charlie"), 25);
    person.greet(); // "Hello, my name is Charlie."
}
```

:::note
関連関数はJavaでいうstaticメソッドのようなものでしょうか。上手に使い分けたいですね。
:::
キャリアブレイク中の時間割

キャリアブレイク中にやっている勉強8個と息子サポート。大体全部1時間やっていると書きました。今日はその時間割について書こうと思います。

# スケジュールは必要 
キャリアブレイク中に勉強する内容は、仕事の最終出社日が近づくにつれ何となく決まっていきました。でも、実際毎日どうやるかは最終出社日を迎えてもまだ決まっていませんでした。ただこれも別途書きますが、そこから1ヶ月は勉強せずに自由に過ごす期間と決めていました。自由期間を過ごすうちにいくら自由でもある程度スケジュールを作ってそこに縛られないと続かないかもと思うようになりました。自由に遊んでいただけなのにｗ。。

# 学校の時間割
ふと息子の時間割を見た時、これだと思いました。義務教育は基本時間割があります。毎日同じことを同じ時間でやるのではなく1週間で色んな教科をバラバラにやります。これと似たようなものを作らないと、しっかり勉強するのは難しいと感じました。

# 表計算ソフトで時間割を考える
時間割みたいなフォーマットに表計算ソフトはピッタリです。とりあえず何を何日、何時間やるかを考えました。コンピュータ系は毎日やりたい。英語も、、出来ればやりたい。最初は全部毎日やりたいと思っていましたが、こうやって具体的に考えると無理になってきました。そこで、一旦1教科1時間にして、考えてみたところ、どうやってもいくつかは日替わりになりました。（一日の過ごし方とか含めてはもっと悩みましたが、これもおいおい書きます）。とりあえず確定ではないけれど、出来そうな時間割には見えたので、一旦これでやることにしました。

# GitHubで公開
次にこれをマークダウンにして[GitHubで公開](https://github.com/binnmti/Study/blob/main/READMEver1.md)しました。あまり深く考えたわけではなく、何となくこれは公開する場所に置きたいと思ったからです。実際やってみると、メリットもあってパソコンが変わっても見られるし、スマホでも見られるのはやっぱり便利でした。GitHub上で書き換えられることも良かったです。

# で、1週間試してみた
そして11月に入り1週間ぐらいこの時間割でやってみました。やってみると色々分かることもあります。本当は都度、時間割を変更してアップデートしていこうと思っていました。ただ、自分なりに見えてきたルールは細かかったり、状況によって変わることも多いので、時間割のフォーマットで書くのが面倒になってきました。例えば別の用事で2時間取られた時どうカバーするかはわりと日によって違います。(今回この記事を書いたきっかけで、少し[時間割をアップデート](https://github.com/binnmti/Study)してみました。)

# わりと適当
何となくプライオリティはあります。例えば3時間が2時間になった時、アルゴリズムは絶対で、削るならCS、コンパイラ。どっちを選ぶかは進行状況や気分でも変わるし、時間の取り方も1時間、1時間、0分にするか1時間、30分、30分にするかも決めきってはいませんでした。また乗ってくると1時間では足りないこともあります。要は適当にしている部分も多く、またこれは適当な方が良いとも思っていました。

# なるべくゼロにはしない
当たり前のことかもしれないですが、例え総時間が少なくなっても、ゼロにするよりは、時間を削る方が絶対的に良いと思います。例え10分であっても毎日やる方が効率面もモチベーションも維持しやすいです。もちろん限度はあるので、例えば1日で1時間しか取れない場合は、1つ1時間か30分ずつ2つにして全部10分みたいなことはしません。でもなるべくちょっとでもやることは意識しています。

# 時間割が絶対あった方が良いが、そこに縛られない
自分は時間に縛られたい方だと思ってしっかりした時間割を作りました。正直時間割通りにはいかないこともありますが、それであっても、時間割があってすごく良かったと思いますし、なかったら出来てないこともあったと思います。時間割がない中で好きにやると軸がなくばらついてしまうと思うし、一方で好きなことを好きにやっているだけなので、完全に時間割通りでやるのも違う気がします。時間割があって、その中で自分にとって適しているように崩すことに価値があると思います。
anacondaにpytorch,opencv等、一気にinstallコマンド

### Ubuntu20.04
```
conda install -y -c conda-forge python=3.9
conda install -y -c conda-forge pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
conda install -y -c conda-forge clip
conda install -y -c conda-forge pillow
conda install -y -c conda-forge opencv
conda install -y -c conda-forge cv2
conda install -y -c conda-forge cudatoolkit
conda install -y -c conda-forge datetime
conda install -y -c conda-forge shutil
pip install git+https://github.com/huggingface/transformers.git

```
___

### wsl
'''
conda install -y -c conda-forge python=3.9
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
conda install -y -c conda-forge clip
conda install -y -c conda-forge pillow
conda install -y -c conda-forge opencv
conda install -y -c conda-forge cv2
conda install -y -c conda-forge cudatoolkit
conda install -y -c conda-forge datetime
conda install -y -c conda-forge shutil
pip install git+https://github.com/huggingface/transformers.git

'''
CLIでディレクトリを移動しつつ、新しいタブを開く方法

## はじめに

私はよくWeb開発をします。Web開発ではディレクトリ構造が以下のような感じになることが多いと思います。

```
app
├── api
└── client
```

アプリを起動するには、まず`app`ディレクトリまで移動してから、それぞれのディレクトリ内で以下のコマンドを実行する必要があります。

- **`app/api`**

  ```bash
  docker compose build
  docker compose up
  ```
<br/>

- **`app/client`**

  ```bash
  pnpm dev
  ```
---
つまり、アプリを起動するための行動をまとめると

**appディレクトリに移動する**
```
cd ~/app
```
↓

**apiディレクトリに移動する**
```bash
cd api
```

↓

**dockerを起動する**

  ```bash
  docker compose build
  docker compose up
  ```
↓

**新規タブを開く**
- マウスを動かして新規タブを開く

↓

**clientディレクトリを開く**

```bash
cd ../client
```

↓

**Nextを開く**
```bash
pnpm dev
```
---
このように、6手順もありコマンド操作をしているのに、新しいタブを開くためにマウスを使わないといけないことに大変<font color="red">不便さ</font>を感じていました。

**<font color="yellow">コマンドだけで簡素に完結させたい!!</font>** ということで


コマンドライン上で新しいタブを開きつつ、指定したディレクトリに移動する方法を紹介します。

## 解決策：`open -a`コマンドの活用

Macでは、`open`コマンドを使ってアプリケーションを開くことができます。以下ようなコマンドで、指定したアプリケーションで指定したディレクトリを開くことができます。

```bash
open -a <アプリケーション名> <パス>
```

例えば、私が使用しているターミナルアプリケーションが**Warp**の場合、以下のコマンドで新しいタブを開きつつ、`client`ディレクトリに移動できます。

```bash
open -a Warp client
```

このコマンドを使うことで、ターミナルからマウスを使わずに新しいタブを開いてディレクトリを移動することができます。

## ターミナルアプリケーション別の使用方法

### Warpの場合

先ほどの例の通り、Warpでも同様に`open -a`コマンドを利用できます。

```bash
open -a Warp ./client
```

### Terminalの場合
```bash
open -a Terminal ./client
```
他もアプリケーションでも同様にできるはずです。
このようにすることで、先ほどの手順の

**新規タブを開く**
↓
**clientディレクトリを開く**

が一括ででき、なおかつコマンドだけで完結します！！

でも、以下のコードを打つのも邪魔くさいですよね...
そんな人のために次の章があります。
```bash
open -a <アプリケーション名> <パス>
```

## エイリアスや関数でさらに効率化

頻繁に使用するのであれば、シェルのエイリアスや関数として登録すると便利です。

### エイリアスの設定

`~/.bashrc`や`~/.zshrc`ファイルに以下を追加します。

```bash
alias open_client='open -a Warp ./client'
alias open_api='open -a Warp ./api'
```

ターミナルを再読み込みして、以下のように実行できます。

```bash
open_client
```


## おわりに

コマンドライン上で新しいタブを開きつつ、指定したディレクトリに移動する方法をご紹介しました。これにより、マウスを使わずにターミナルの操作を完結できるようになり、開発効率が向上します。

ターミナル操作に慣れている開発者にとって、ちょっとした工夫で日々の作業が快適になります。ぜひ試してみてください。


**追記**

各ターミナルアプリケーションによって、対応状況や使用方法が異なる場合があります。使用しているターミナルに合わせてコマンドを調整してください。
【Rails】ArgumentError: Passing string to be evaluated in :if and :unless conditional options is not supported.の対応

## 問題
コード
```ruby
validates :name, length: {is: 8}, if: 'name.present?'
```

エラー文
```ruby
ArgumentError: Passing string to be evaluated in :if and :unless conditional options is not supported. Pass a symbol for an instance method, or a lambda, proc or block, instead.
```

## 解決方法
Rails5.2から、:if, :unlessでstringがサポートされなくなりました。
以下のようにコードを修正します。
```ruby
validates :name, length: {is: 8}, if: -> { name.present? }
```

## 参考
https://stackoverflow.com/questions/46719763/rails-how-to-replace-if-and-unless-option-for-rails-5-2
.rbenvを使った環境構築

# はじめに

Ruby on Railsの開発環境を構築する際に、Rubyのバージョン管理ツールである**rbenv**を使うと便利です。プロジェクトごとに異なるRubyのバージョンを簡単に切り替えることができるため、複数のRailsプロジェクトを扱う際に非常に有用です。

本記事では、rbenvを使ってRailsの開発環境を構築する手順を詳しく解説します。

# 目次
1. rbenvのインストール
1. Rubyのインストールとバージョン設定
1. Bundlerのインストール
1. Railsのインストール
1. インストールの確認
1. まとめ

# 1. rbenvのインストール

Homebrewを使用して、rbenvをインストールします。

```bash
brew install rbenv
```

また、Rubyのビルドに必要な**ruby-build**もインストールします。

```bash
brew install ruby-build
```

# 2. Rubyのインストールとバージョン設定

## 2.1 ターミナルの設定ファイルを更新

rbenvを使用するために、シェルの初期化ファイルを更新します。

**bash**を使用している場合：

```bash
echo 'eval "$(rbenv init - bash)"' >> ~/.bash_profile
source ~/.bash_profile
```

**zsh**を使用している場合：

```bash
echo 'eval "$(rbenv init - zsh)"' >> ~/.zshrc
source ~/.zshrc
```

## 2.2 Rubyのインストール

利用したいRubyのバージョンを確認します。ここでは、グローバルに**Ruby 3.2.2**を、プロジェクトローカルに**Ruby 3.2.5**をインストールします。

**Ruby 3.2.2のインストール（グローバル）**：

```bash
rbenv install 3.2.2
```

**Ruby 3.2.5のインストール（プロジェクトローカル）**：

```bash
rbenv install 3.2.5
```

## 2.3 グローバルとローカルのバージョン設定

**グローバルなRubyのバージョンを設定**：

```bash
rbenv global 3.2.2
```

**ローカルなRubyのバージョンを設定**：

プロジェクトのディレクトリに移動してから、以下を実行します。

```bash
rbenv local 3.2.5
```

これにより、そのディレクトリ（およびサブディレクトリ）ではRuby 3.2.5が使用されます。


# 3. Bundlerのインストール

**Bundler**はRubyの依存関係を管理するためのツールです。指定されたバージョンのBundlerをインストールします。

```bash
gem install bundler -v 2.5.6
```


# 4. Railsのインストール

指定されたバージョンのRailsをインストールします。

```bash
gem install rails -v 7.0.4.3
```

Bundlerを使用してRailsをインストールする場合は、以下のコマンドを実行します。

```bash
bundle install
```

# 5. インストールの確認

## 5.1 Rubyのバージョン確認

```bash
ruby -v
```

出力結果が`ruby 3.2.5...`のようになっていれば、プロジェクトローカルでRuby 3.2.5が使用されています。

## 5.2 Railsのバージョン確認

```bash
rails -v
```

出力結果が`Rails 7.0.4.3`であれば、Railsのインストールは成功です。

# 6. まとめ

以上で、rbenvを使用したRuby on Railsの開発環境構築が完了しました。これで複数のプロジェクトで異なるRubyのバージョンを使い分けることができ、柔軟な開発が可能になります。

# 補足情報

- **rbenv local と global の違い**：

  - `rbenv global`：システム全体のデフォルトのRubyバージョンを設定します。
  - `rbenv local`：特定のディレクトリ内でのRubyバージョンを設定します。そのディレクトリ内に`.ruby-version`ファイルが作成されます。

- **Bundlerのバージョン指定**：

  プロジェクトで必要なBundlerのバージョンをインストールすることで、依存関係の問題を回避できます。


# トラブルシューティング

- **コマンドが見つからない場合**：

  `rbenv`や`rails`などのコマンドが見つからない場合は、シェルの初期化ファイル（`~/.bash_profile`や`~/.zshrc`）が正しく設定されているか確認し、ターミナルを再起動してください。

# おわりに

rbenvを活用することで、Rubyのバージョン管理が簡単になります。これからのRails開発がスムーズに進むことを願っています。
起業するならElixirシリーズSTEP15. 組織設計

https://qiita.com/Yoosuke/items/f19b22afec174269f167

前回の続きです。

## 組織設計

前回は人的資本経営の話題を少し入れました。前々回はSDGsやESGなどの話しだったので、ちょっと仰々しいや、いきなり大袈裟だとか考えている人もいるかも知れません。

しかし、その考えは危険です。なぜなら、Mission、Vison、valueを基軸に戦略を作った後は、その戦略を実行する為に必要な機能を洗い出し、そしてその機能を実現する為の組織を設計する必要があるからです。

全ては繋がっています。特に人的資本経営や、アジャイル開発化したいなどの相談を受けた所で行き詰まるのは組織構造の問題で、最終的には組織構造を抜本的に改革する必要があります。

例えば、起業当初は、少数精鋭でスピーディーに動けるため、組織設計の重要性についてはあまり触れずに進めていると思います。途中退場する企業や、せっかくプロダクトが市場に受け入れられ始めたスタートアップも、その後うまく組織を作れなかったり、組織構造が悪いと後々、多大なコストを支払って変更する必要が出てきます。

例えば、
- 創業メンバーへの過度な依存
- 属人的な業務プロセス
- 不明確な意思決定プロセス
- 柔軟性を欠いた部門構造

そもそも対応する機能を果たす部門がなく、誰かが属人的に頑張ってた。なんて事もありえます。
この問題を放置すると、情報の不透明性が高まり、運営チームが疲弊します。それに伴って品質も悪くなり、顧客満足度が下がります。顧客満足度をなんとかキープしていても、それは現場の努力で、長くは持たない無理を強いてる状況が続いたりします。

事業をスケールフェーズに入る前にこの課題を解決する為の準備にコストを払う必要があります。広告予算だけ取るのではなく、運用をスケールに耐えられる状態へ整備する事も重要になります。
Pythonプログラムの動作を確認してみた

# 概要

何か間違いがあるようなので、動作を確認してみました。

# 実装

以下はファイルの中身です。

```sample.py
def input():
    return 10

n = int(input())
ans = 0
for i in range(n):
    ans += i
    print(ans)
```

以下は実行結果です。

```
$ python3 sample.py 
0
1
3
6
10
15
21
28
36
45
```

正常に動いているように思うのですが、どこかまずいのでしょうか？

# まとめ

何かの役に立てばと。
サンタさんに手紙を出したら返ってきた話

毎年恒例となっている、子供たちと一緒にサンタさん宛ての手紙を書くイベント。今年もその季節がやってきました。
ご存じない方のために補足すると、カナダには「サンタさんに手紙を出すと返事がもらえる」という郵便サービスがあります。子供たちが手紙を出し、無事に返事が届けば、彼らの信じる「サンタ神話」を強化する良い機会になります。

昨年、このサービスを初めて利用しました。その際には、カナダからサンタさん直筆の手紙が届き、子供たちは大喜び。親としても「これはいいイベントだ」と手応えを感じ、今年も早速手紙を書かせました。

## 今年の手紙、カナダまでたどり着かず
子供たちはそれぞれのお願い事をしっかり書き、絵まで添えた手紙を完成させました。

![子供たちが描いた手紙.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960567/519c0ec9-1c67-a5fc-ca6c-e3fee4c3cbc9.jpeg)

封筒に宛名を書き、切手を貼り、いざポストへ投函。
あとは返事を待つだけ。昨年と同じ流れでいくはずでした。

ところが、数週間後。送ったはずの手紙が返送されてきました。

![返送された封筒.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3960567/2f461fda-ec91-0f72-4b96-aef0fc6a0f00.jpeg)

封筒には以下のような説明が添えられていました。

「お預かりしました郵便物は、カナダ郵便事業体のストライキの長期化に伴い、日本からの発送を見合わせているため、国際交換郵便局からお客さまにお返しいたしますので、何卒ご理解いただきますようお願いいたします。以下略」

つまり、サンタさんに手紙を届ける前に、郵便局でブロックされていたのです。

## 子供への説明
問題は、これをどう説明するかです。子供たちは返送された手紙を見て、「なんでサンタさんに届かなかったの？」と疑問を抱いています。

実際、「カナダ郵便事業体がストライキ中」という事実をそのまま伝えるのは難しいところです。「サンタさんがストライキを起こしている」という解釈を避けつつ、納得してもらえる説明を考える必要があります。とはいえ、サンタさんが労働条件について組合交渉しているようなイメージを与えるわけにもいきません。


## まとめ
今年は残念ながらサンタさんからの手紙は届きそうにありません。子供たちの「サンタさんに手紙は届かないの？」という純粋な問いに答えを見つけられないまま、どう対応すべきか考えています。

これからサンタさんに手紙を送る予定の方は、ぜひ事前に郵便事情を確認しておくことをお勧めします。
サンタさんへの手紙は夢を運ぶものですが、現実の国際郵便の壁を越えなければ、届けることはできないのだと実感しました。
【TryHackMe】TakeOver：Walkthrough

# 概要

TryHackMe「TakeOver」のWalkthroughです。

https://tryhackme.com/r/room/takeover

# Task1

## **Q1**.*What's the value of the flag?*

**Hint**.*This is an enumeration challenge, once you will find it, it will straight up give you the flag.*

ポートスキャンを実行します。

```
$ nmap -Pn -T4 -sVC -A -p- 10.10.18.78 -oN nmap_result
PORT      STATE    SERVICE  VERSION
22/tcp    open     ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 dd:29:a7:0c:05:69:1f:f6:26:0a:d9:28:cd:40:f0:20 (RSA)
|   256 cb:2e:a8:6d:03:66:e9:70:eb:96:e1:f5:ba:25:cb:4e (ECDSA)
|_  256 50:d3:4b:a8:a2:4d:1d:79:e1:7d:ac:bb:ff:0b:24:13 (ED25519)
80/tcp    open     http     Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to https://futurevera.thm/
443/tcp   open     ssl/http Apache httpd 2.4.41 ((Ubuntu))
|_ssl-date: TLS randomness does not represent time
| tls-alpn: 
|_  http/1.1
|_http-title: FutureVera
| ssl-cert: Subject: commonName=futurevera.thm/organizationName=Futurevera/stateOrProvinceName=Oregon/countryName=US
| Not valid before: 2022-03-13T10:05:19
|_Not valid after:  2023-03-13T10:05:19
|_http-server-header: Apache/2.4.41 (Ubuntu)
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.2p1|
|80|http|Apache httpd 2.4.41|
|443|https|Apache httpd 2.4.41|

ドメインを追加し、`80`,`443`ポートにアクセスすると同様のサービスが展開されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/ebc3d57a-8b80-c895-9b30-481f552b25ff.png)

`80`番ポートのサブドメインを列挙すると2つのサブドメインが見つかりました。

```
$ ffuf -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.futurevera.thm" -u http://futurevera.thm -fw 1

portal                  [Status: 200, Size: 69, Words: 9, Lines: 2, Duration: 239ms]
payroll                 [Status: 200, Size: 70, Words: 9, Lines: 2, Duration: 239ms]
```

両方から有用な情報は得られませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/cfeadd27-397f-3d44-c8c5-407b762f70d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e548d398-db2b-aad2-6c12-287c3081a6dc.png)

`443`ポートのサブドメインを列挙すると、また2つのサブドメインが見つかりました。

```
$ gobuster vhost -k --append-domain -u https://futurevera.thm -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -t 100

Found: blog.futurevera.thm Status: 421 [Size: 408]
Found: support.futurevera.thm Status: 421 [Size: 411]
```

`blog`サブドメインからは何も得られませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/336d6a6e-f9ef-2f07-eaff-37070aa4e528.png)

`support`サブドメインにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/08785d53-28e9-ace4-6c5a-8e5ef2788b0e.png)

証明書を確認すると`DNS Name`の項目から更なるサブドメインを発見しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/74b229d4-e3b5-02eb-83c5-498498d5fbd6.png)

ドメインにアクセスするとフラグを入手できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/15347990-86b8-9981-d707-b11dd040ceae.png)

**A**.**flag{beea0d6edfcee06a59b83fb50ae81b2f}**
VScodeの更新頻度を見直してみよう

# VScodeの更新が多い...

皆さん、開発順調ですか？
好みのエディタはあれど、VScodeが世の中のマジョリティを占めていると思われます。
VScodeは拡張機能も含めて頻繁に更新があり、できることが日進月歩で増えています。

VScodeの左下に更新の通知がたびたび現れますが、「早くアップデートをしないと！」という強迫観念に駆られます。
私だけでしょうか？
Windows Updateによる再起動の通知も、業務時間中でもついつい即座に行うタイプです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/ca442aa5-eb8e-c775-a888-9cc860f4cef8.png)

更新が多いのは一般的に良いことですが、新機能を把握しきれないということが往々にしてあります。

デフォルトでは自動更新が有効になっていますが、いっそのこと無効にしてみましょう。
更新を自分マターにすることで、自分のリズムを乱されないようになります。

:::note warn
注意
セキュリティアップデートを逃しうる設定変更ではあるため、手動にはなりますが任意のタイミングで必ずアップデートを行ってください。 
:::

# 設定
ユーザー設定から、設定画面を開きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/f40375ae-e1f3-91a6-5f04-c823541e4fc8.png)

何も設定していなければ、「default」となっているはずです。
自動的に更新を確認するモードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/872b2673-7eb9-5e88-c3d8-922122380927.png)

「none」を選択し、無効にしましょう。
その後, VScodeを再起動を求められるので、実施しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123580/d4b58c87-093b-5880-30bc-d2bd40a1cd62.png)

これで次回の起動から自動更新は行われなくなります。

# まとめ
時に断捨離も必要ですよね。
増えていく情報量を意識して抑える癖は、何事においても必要と考えます。


AdventCalendarにするほどの内容ではありませんが、
皆さんも開発環境の見直しをこの年末に実施してみてください。
Raycastのスニペットを使って長いコマンドを簡単にペーストしよう!

みなさん、こう言う経験あったりしませんか？

***ターミナルで長いコマンドを毎回打つのめんどくさい***

そんなあなたにRaycastのスニペット機能をご紹介します。

:::note
### スニペットとは
プログラミング言語の中で切り貼りして再利用できるソースコードやマシンコードなどを指します。
:::


# Raycastとは

Macのランチャーアプリケーションで、アプリケーションの起動やファイルの検索など、様々な機能をショートカットキー一つで素早く実行できるようにするツールです。

https://www.raycast.com/

homebrewでもインストールすることができます。
```zsh:brew
brew install --cask raycast
```

# スニペットを使おう
今回紹介するRaycastのスニペット作成機能を使うことで、長いコマンドをメモして簡単に取り出すようにできます。

まず、`cmd(⌘)+option(⌥)`を選択して、下のような画面を表示します。

![スクリーンショット 2024-10-31 17.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/d72a4140-0f0f-7d49-b0bc-a364ac28cc5a.png)

検索バーから`Create Snippet`が出てくるように検索をかけて、`Create Snippet`を選択します。

![スクリーンショット 2024-10-31 17.39.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/8e137e6f-0eb0-8f04-483f-267eb1d1fdb5.png)

すると下の画面が出てきます。
![スクリーンショット 2024-10-31 17.39.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/2e06330f-6617-2eab-eab9-a2eeb4af22b8.png)

これらの入力欄は下のような役割を持っています。

|名前|役割
|---|---
|Name|スニペットに名前をつけることができます
|Snippet|スニペットを入力します
|Keyword|検索に引っかかるようなキーワードを設定できます

今回はmysqlclientのmysql接続のコードを`cmd(⌘)+enter`で登録してみました。

![スクリーンショット 2024-10-31 17.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/bf23ff95-0fc1-2f68-2aa1-ab17bd932c31.png)

では、登録したスニペットを呼び出してみましょう。

`Seach Snipets`を選択します。

![スクリーンショット 2024-10-31 17.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/ba4c9629-4585-e049-8cb6-848d7824f8f9.png)

すると下のような画面が出てきます。

![スクリーンショット 2024-10-31 17.50.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/d1cf2a62-a2b8-a762-f3f8-fccacb156db4.png)

コンソールでスニペットの名前を選択すると、下のように入力されます。
![スクリーンショット 2024-10-31 17.51.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/115a415b-5f42-c967-cf4e-b1c8818be186.png)


このような感じでスニペットを登録、使用できます。

ぜひ活用してみてください！
LocalStorageとは

## LocalStorageの概要
LocalStorageは、Webブラウザが提供するキーと値のペアを保存する仕組みです。
クライアントサイドにデータを永続的に保存する際に利用します。
主な特徴
- データの永続性：ブラウザを閉じてもデータが保持される
- 最大容量：約5MB
- サーバー通信を必要としない

## SessionStorageとの違い
よく比較されるSessionStorageとの違いも押さえておきましょう
||LocalStorage|SessionStorage|
|---|---|---|
|データの保存期間|ブラウザを閉じてもデータが保持される|ブラウザやタブを閉じるとデータが削除される
|データの共有|異なるタブ間でデータが共有される|同一タブ内でのみデータが共有される|

ここから見るにLocalStorageは永続的なデータの保存に適していることが分かります

## LocalStorageの基本的な使い方
```javascript:javascript
// データの保存
localStorage.setItem('key', 'value');
// データの取得
const value = localStorage.getItem('key');
// データの削除
localStorage.removeItem('key');
// ストレージのクリア
localStorage.clear();
```

## LocalStorageの用途
ユーザー設定の保存などに使われることが多いです。
例
- テーマ（ライトモード/ダークモード）
- 言語選択
- ショッピングカートの中身

ダークモードの切り替えを保存の例をコードにしてみます
```javascript:javascript
const toggleDarkMode = () => {
  // 現在のテーマの設定がダームモードであるかをローカルストレージから取得
  const isDarkMode = localStorage.getItem('darkMode') === 'true';
  // isDarkModeに応じてWebサイト上のダークモードトグルをON/OFF
  document.body.classList.toggle('dark-mode', !isDarkMode);
  // ローカルストレージにダークモードの設定を保存
  localStorage.setItem('darkMode', !isDarkMode);
};
```


## セキュリティと注意点
**機密情報（パスワード、トークンなど）は保存しないようにしましょう。**
なぜなら、LocalStorageはJavascriptで簡単にアクセスできてしまうからです。
XSS（クロスサイトスクリプティング）という攻撃者がWebサイトに悪意のあるスクリプトをフォームなどに仕込んで挿入する攻撃があるのですが、XSSでLocalStorageの中身を盗聴することができます。
フォームの検証やサニタイズなど対策はありますが、LocalStorageに機密情報を入れないが吉でしょう。


## まとめ
LocalStorageは、クライアントサイドのデータ保存に便利な機能として提供されています。
ユーザー体験の向上やデータキャッシュに活用できますが、セキュリティには注意が必要です。
読んでいただきありがとうございました！
入力: 速度

### 背景
メイン基板にはIMUが搭載されているので速度の計算もできるようです。

今回はコンパスを使ったプログラミングを試してみます。
### Scratch
速度はセンサのブロックで値を取得することができるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/80ea04ec-fb79-ee59-3d07-a3239b998903.png)

「速度が2未満であれば正面LEDを青色で点灯し、2を超えると正面LEDを赤色で点灯させる」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/ad605dd7-f7c6-2fbf-f695-6c9de4dbc01f.png)

手で持ち上げて素早く動かしている間、正面LEDの色が青から赤に変わりました。
### spheroV2
BoltTest.pyとsphero_edu.pyのメソッドを参考に同様な動作をするスクリプトを作成しました。
CTRL+Cで終了します。
```
import time
import keyboard
import math

from spherov2 import scanner
from spherov2.sphero_edu import EventType, SpheroEduAPI
from spherov2.types import Color

print("Testing Starting...")
print("Connecting to Bolt...")
toy = scanner.find_BOLT()

if toy is not None:
    print("Connected.")
    with SpheroEduAPI(toy) as droid:
        print("Testing Start...")
        droid.set_main_led(Color(r=0, g=255, b=0))
        time.sleep(1)
        droid.set_main_led(Color(r=0, g=0, b=0))
        time.sleep(1)        
        droid.set_stabilization(False)
        time.sleep(1)
        
        try:
            while True:
                velocity = droid.get_velocity()
                time.sleep(0.1)
                
                if  math.sqrt((velocity['x']))^2 + (velocity['y'])^2) < 2 :
                    droid.set_front_led(Color(r=0, g=225, b=0)) 
                else:
                    droid.set_front_led(Color(r=225, g=0, b=0)) 
                    print(f"Velocity: x={velocity['x']:.1f}, y={velocity['y']:.1f}")

        except KeyboardInterrupt:
            print("\nProgram interrupted by user.")

        except Exception as e:
            print(f"An error occurred: {e}")

        print("Testing End...")
else:
    print("Failed to connect to Sphero.")
  
```

実行結果はこちらのようになりました。
なぜか上下方向がx、前後方向がyになっていました。

```
git\spherov2.py\spherov2\test>python BoltTest_velocityMeter1.py
Testing Starting...
Connecting to Bolt...
Connected.
Testing Start...
Velocity: x=1.0, y=1.9
Velocity: x=0.1, y=-2.8
Velocity: x=-1.6, y=-4.1

Program interrupted by user.
Testing End...
```

### まとめ
加速度センサーからの速度を入力に使ったプログラミングを実験しました。
ScratchとspheroV2の両方とも軸と対応が分かりにくいようなので、自転車や車に乗せて調べてみると面白そうです。
CSS組版 - Vivliostyle とやらを試したい

今年を振り返る「なんかかく」アドベントカレンダー 14 日目、たぶん 14 日目です。今年は春と秋の技術書典に参加してみました。かねてより本を出したいと豪語していた私なので、ようやく有言実行をかなえた格好です。

[続けること、続けてるとどうにかなること - 2023年のひとりアドベントカレンダー #ポエム - Qiita](https://qiita.com/e99h2121/items/6dca74e4b270646041bc#%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AF%E4%BD%93%E5%8A%9B%E3%81%A0)
[技術書典 16 に「開発論論」を出してみた #技術書典16 - Qiita](https://qiita.com/e99h2121/items/7b9b66382834c2ad2f14)
[2024 年、はじめて本「開発論論」を書いてみた話 #出版 - Qiita](https://qiita.com/e99h2121/items/7323c2bcbfd22c8d89e3)

だからその話は 4 日目に書いたんだが今日はその執筆環境にはまだ改善の余地がありそうだという話をしたい。


## 執筆環境を試したい

いずれの回とも Re:VIEW Starter を一つ覚えのように使いました。が、もっとこれ何か工夫できるやろという気持ちでいます。以下辺りがメモです。

[技術系同人誌を書く基礎メモ #Pandoc - Qiita](https://qiita.com/e99h2121/items/72b21cb104f8dee523e0)
[技術系同人誌を書く人の味方「Re:VIEW Starter」の紹介 #ReVIEW - Qiita](https://qiita.com/kauplan/items/d01e6e39a05be0b908a1)


## CSS組版というものがあるらしい

> HTMLのデータをマスターとし、CSSでレイアウトを指定して組版することをCSS組版といいます。 CSS組版で、HTMLという1つのソースから、EPUBなどの電子書籍、Webコンテンツ、印刷データPDFを作成する、いわゆるワンソースマルチユースを実現することができます。

と Google 先生が教えてくれました。良さそう。

[CSS組版 Advent Calendar 2024 - Adventar](https://adventar.org/calendars/10448)
[CSS組版の光と闇 - ふぃーるどのーつ](https://blog.fieldnotes.jp/entry/css-layouting)
[[CSS組版]固定配置コンテンツのページとフロー配置コンテンツページを本に同居させる](https://zenn.dev/hidaruma/articles/dd422371302f3b)



## 中でも Vivliostyle

で、その CSS 組版の中でも著名なのが Vivliostyle というものの模様。良いじゃん良いじゃん。

[Vivliostyle — 楽しく CSS 組版！](https://vivliostyle.org/ja/)

中でも https://vivliostyle-pub-develop.vercel.app/ というのを開くともうそこにエディタがあるような。

https://github.com/e99h2121/vivliostyle-playground



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/e6d7534c-d0b8-b4e6-d092-f8540895a945.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/e95b0f77-9109-06f4-397a-b6b8d1741f34.png)

と、全然触れていないのですが、新しいものを触るのは楽しいですよね。これは来年に持ち越し。以上です～
10年前2014年：忘年会で突如決まったチームハッカソン、テーマは「お断り：ダメよ～ダメダメ」

# はじめに
昭和男の　はじめてのQiita投稿。はじめての公開アドベントカレンダー。

記載前に断っておきますと、中身の少ないポエム記事になるかと予想しております。
どうぞ、お許しくださいませ。


# きっかけは
10年前の2014年12月の話。

某測定機器メーカー・アプリ部署の忘年会を、山源というホルモン屋さんにて開催。

ホルモンが焼けるたびに、煙がモクモクとあがる中、ハッカソンの話題に。

ちょうど忘年会の少し前に大手検索サイトの方からハッカソンへの協賛のお話をいただいたのがきっかけ。

メンバーからチームでハッカソンを試しにやってみるのはどうか、という話に。


# ネーミング
飲みながら、まずチーム内のメンバーから、ハッカソンの名前の提案。

うちの部署が技術４課ということで「ヨンカソン」にしようとネーミングアイデア。

はい採用。


# テーマ
ハッカソンは、当時私含めてまだ参加したことがあるメンバーは誰もおらず、どう開催したらよいかわからない状態。

フリーでプログラミングをするのも、逆に難しい気がしたので、基本的なテーマを決めることに。

そこで、私がたまたま目にしたのが流行語大賞。

日本エレキテル連合「ダメよ～ダメダメ」。

そこに目をつけて、「お断り」をテーマにすることに。

ちょっと真面目な話をすると、
その年の春にスマホと通信できる商品を発売し、それに伴ってアプリ開発の仕事の相談も急速に増えていた時期。

仕事の「断り方」も重要、というのも個人的に思っていたところ　でした。


# 余談：今年の流行語

ちなみに今年2024年の流行語（「現代用語の基礎知識」選 ユーキャン 新語・流行語大賞）は、
大賞が「ふてほど」（金曜ドラマ『不適切にもほどがある！』）。

4話連続「板東英二」が登場したが、本人は登場しない、という謎のニュースが話題となり、面白かった　です。

高校野球で歴史的な記録を残し、中日ドラゴンズで77勝。
そして、名古屋のサウナ「ウェルビー」が好きで専用のロッカーには「ここが大好き。ここが大切な家」と刻まれている。

ちなみにネット検索の情報で恐縮ですが、今年亡くなられた中山美穂さんの1988年（昭和63年・辰年）の雑誌インタビュー記事より。
「『毎度おさわがせします』の頃、帰りがけに控室で、一人で泣いてたら板東英二さんが『一緒に帰ろう』って誘ってくれて。緑山のスタジオから浜松町までタクシーに乗りながら『今を頑張れば、君は絶対大スターになれる』って言ってくれたんです。うれしかったな」

自己紹介になってしまって申し訳ないけれど、
昭和に愛知県で生まれ育ったドラゴンズファンで、サウナ好きの私。
不適切かもしれないけれど、坂東氏に少なからず共感するところがたくさん　ある。
毎週金曜日CBCテレビで放送されていた「毎度おさわがせします」も楽しみで、C-C-B「Romanticが止まらない」は今でも耳に残る名曲。

あと、大賞にはならなかったけど、個人的大賞はNetflix「地面師たち」の「もうええでしょう」。

電気グルーヴのライブに行ったら、卓球の「例のやつやっとかなくていいの？」に応えてやってくれました。
会場は大盛りあがり。
卓球「まんざらでもない顔」
瀧「出所して良かった！」

話がソレて失礼しました。

（閑話休題）


# 準備
忘年会の翌日、部長に「年末プログラミングを集中して実施するので、１日時間を使いたい」といった旨の相談し承諾をもらう。

その数日後、総務へ連絡し、社内掲示板サイトには「年末集中プログラミングのため担当者への連絡を控え、急ぎの場合は課長へ連絡」の旨を載せる。

「ハッカソン」といってもメーカーでは当時はまだ説明が大変だったので「集中プログラミング」という言葉でお茶を濁す形に。

せっかくなので、大賞など設けて審査する形に。

商品としては、貯まっていたクレジット会社発行のギフト券や、当時個人的に愛用していたもの（RHODIAのメモ帳）を購入するなど、準備。


# 当日
２週間ほどで、ある程度、準備が整いハッカソン当日。

１日８時間で実施。

そのうちアプリ検討やデモ・発表があるので、実質プログラムできる時間は５時間あるかないか。

実施してみると、かなり時間は短い。

その中で、実際にデバイスと通信して連携できるスマホアプリや、サーバで動くアプリなど技術的には幅広いアプリ、かつテーマ・コンセプトも面白いものをメンバーが作成。


# まとめ
大賞は「お断りバード」という体の測定結果を考慮したスマホゲームアプリ。
これも当時流行っていた「アングリーバード」のパクリ・・・インスピレーション・オマージュ作品。

突貫での準備だったけれど、メンバーの積極性（おもしろがり）が光って、面白い取り組み　でした。


# 余談：その後の話
その翌年、2015年には大手検索サイトの24時間ハッカソンへ協賛するとともに私含め3名が参加。

24時間徹夜。

早朝にソースコードが消失するなどもあり、フラフラになって完成させたのも今となってはいい思い出。

こちらも改めてポエムとして掲載してみたい　です。

ハッカソンへ協賛ということで、メディアでも取り上げていただきました。
会社の宣伝になった・・・かどうかは不明。


# 謝辞
最初にお断りしたとおり（！）、
稚拙なポエム記事となりました。
大変失礼しました。

今日は12月14日。
あと、10日でクリスマス・イブ！
Windowsでキーを別のキーに置き換える方法

# はじめに
この記事は、[農工大 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/tuat) 14日目の記事です。

:::note warn
この記事で紹介されている内容を試す際は自己責任でお願いします！
この記事の内容を実行したことによって生じた損害等の一切の責任を負いかねますのでご了承ください。
:::

# 導入
皆さんは、無変換キーを使ったことはありますか？
このキーに機能を割り当てられるゲームをやったことがない[^1]ので、私はないです。
そのくせ、WASDキーに指を置くときかなり押しやすい位置にあるのがむかついたので、別のキーで置き換えてみました。

# 環境
OS: Windows 11
キーボード: Logicool G512 日本語配列

# 序文
この記事を書くまでは知らなかったんですが、なんか **AutoHotKeyでもできる** らしいです。（！？）
自分の環境ではなぜか動作しなかったので、本文では Scancode Map をレジストリエディタで書き換えてキーを置き換える方法を紹介しようと思います。

# 本文
### ① 編集するレジストリを探す
お好きな方法でレジストリエディタを開きます。
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout` を探します。（`Keyboard Layouts` もあるので注意！）
`Keyboard Layout` 直下に `Scancode Map` という **バイナリ値** を作成します。

### ② `Scancode Map`を編集する

私の編集済みの `Scancode Map` がこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951882/7b6083cf-e469-eafe-02b5-88d4c491aed9.png)

これをフォーマットに沿って分解すると、次の図のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951882/51209b50-5978-38a6-2ada-8743898ec752.png)

:::note
`Scancode Map` 内の値はすべてリトルエンディアンで表されます
:::

| 番号 | サイズ(Byte) | 値の説明 |
|:-:|:-:|:-:|
| ① | 4 | バージョン情報　すべて0 |
| ② | 4 | ヘッダー　すべて0 |
| ③ | 4 | ④スキャンコードマップ の数+1 |
| ④ | 4×n | スキャンコードマップ |
| ⑤ | 4 | 終端　すべて0 |

スキャンコードマップは、 `(割り当てたいキーのスキャンコード(2 Byte)) (実際に押されるキーのスキャンコード(2 Byte))`というフォーマットで表されています。
上の画像④内の `36 00 7B 00` という部分を例にすると、**右Shift `36`** のスキャンコードを **`7B`** すなわち**無変換**キーにマップするということになります。

また、動作してほしくないキーは、**割り当て先を `00 00` にすることで無効化することもできます**。実際に、上に示した画像の④ 1~4バイト目を参照すると、`00 00 52 E0`となっています。私はこのマップでInsertキーを無効化しています。

日本語キーのスキャンコードそのものについては、参考資料に置くWebページが詳しいです。私が実際にマップする際には、 `Set 1` を参照したところうまくいきました。

# おわりに
私はこれで**無変換**キーを**右Shift**、**カタカナ/ひらがな**キーを **BackSpace**、**変換**キーを **Enter** に割り当て、そして**Insert**キーを**抹消**して快適な人生を送っています。

# 参考資料
[Japanese Keyboard (layout and scancode)](https://hp.vector.co.jp/authors/VA003720/lpproj/others/kbdjpn.htm)

[^1]:探せばいくらでもありそう
JAWS-UGとの出会いから見つけた道！

## はじめに

ちょっと前にポエムLTをしてきましたが、この記事は今年の振り返りや来年の目標を書くポエム記事にしたいと思います。

https://www.docswell.com/s/moriyama/Z9VM8P-2024-11-29-061313

## 振り返り：JAWS-UG初参加

現在私はJAWS-UG札幌支部/初心者支部に参加していますが、初参加7/12でした。

https://jawsug-sapporo.connpass.com/event/321565/

今の所属会社は７月で年度が変わるため、何かチーム作りに活用できるものがないかな？と考え、勉強会に参加し始めました。

今は本当に楽しく参加できていますが、この時はまだ「怖い」、「自分がちっぽけすぎる」みたいなあまり良くない感情の方が多かったように思います。

## 現在

最近はJAWS-UGだけではなく、オフラインを中心に週１回のペースでは参加できていて、本当に楽しく勉強させていただいています。

どのイベントに参加しても、本当に尊敬できるすごい技術をもつ方が居て、わくわくが止まりません！

なかなか参加できなかった懇親会にも参加する勇気が出てきました。

この感情の変化は、JAWS-UGをはじめとしてた種勉強会における心理的安全性の高さだと思っています。

資格取得等のインプット中心の活動からQiita執筆・LT登壇等、アウトプット中心の活動へ変更し、半年近く経ちますが、それなりに成長できているはずです！（自信はまだない）

## これから：2025年は選択と集中！

私はIT系全般で知らないことに触れるのが大好きなので、どのジャンルも好きだったりします。最近はチーム作りなんかも興味があったりります。

ただ、仕事がそこそこ忙しいことに加え、まだ小さい子供が二人いて、活動できるのは早朝の１〜２時間程度や、週１程度の退勤後の勉強会参加といった状況だと、全然トレンドに追いつけません。

そこで、来年は目標を選択して、そこに集中していきたいと思います。

本当はお仕事の中で自身がしたいことに取り組めると良いのですが、今のお仕事は自社サービスの世話なので、新しいことも少しずつしかできない、といった状態です。

もっとやりたい事をできるお仕事へ転職も考えたほうがいいのか？

##  これから：AWS Community Builderになりたい。

私の目標は自身の技術力で困っている人を助けることです。

AWSに触れ、JAWA-UGに参加してから、私の目標を実現するための最適解なツールはAWSだと信しています。
（もちろん盲目的な信者ではないけど）

日々の活動をAWSに集中するとして、どのように活動すればいいか？と考えたときに、やはりアウトプット中心かつ、既に活躍されている人たちや、これから同じモチベーションを持った人たちと積極に関わっていくことが良いのではないかと考えています。

一人でインプットだけという学習方法では、とても追いつけない気がします。

そこで目標を「AWS Community Builder」とします！

Waitlistへの申し込みはしましたので、これに向けて活動をしていきたいです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/c97afbf4-233f-1951-6c62-af719e3cf764.png)

あと、もう少し積極的な性格になりたいところ。陰キャすぎる。

## さいごに

今年から勉強会等、社外での活動をするようになり本当に良かったと思います。

まだ、興味があって参加できていない人がいたらぜひJAWS-UGに参加してみると良いと思います！

私も来年はもっと精力的に活動したいと思います！
【Rustのまほう2】#15 bevy_remote_inspector

[#2](https://qiita.com/hiruberuto/items/b5d0f970ab1ed9fe2183)で bevy-inspector-egui というプラグインを紹介しました。これは Bevy 界隈ではデバッグ用に比較的よくつかわれているツールのようなのですが、Bevyのウィンドウ上に被さるように表示されるため、画面が少々見づらいです。また、**bevy-inspector-egui のリストを操作するとウィンドウをクリックしたことになって魔法が発射されてしまう**という難点もありました。

それで、先日リリースされた Bevy 0.15 で Bevy Remote Protocolという機能が提供されるようになったのですが、これはBevyアプリケーションに外部から接続してワールドを覗けるという共通プロトコルになっており、これをもとにしたデバッグ用ツールがいくつか新しく登場しているようです。

https://bevyengine.org/news/bevy-0-15/#bevy-remote-protocol-brp

- https://bevyengine.org/news/bevy-0-15/#bevy-remote-protocol-brp


そこで、今回は最近登場した bevy_remote_inspector というプラグインを試してみます。


# bevy_remote_inspector

https://github.com/notmd/bevy_remote_inspector

bevy_remote_inspectorはリモートからBevyアプリケーションに接続できるデバッグツールです。使い方は `cargo add bevy_remote_inspector`で依存関係に追加して、`app.add_plugins(RemoteInspectorPlugins)`でプラグインを追加するといういつもの手順です。ただし、Bevy Remote Protocolはは外部からの接続を受け入れるものですから、wasmビルドでは動きません。私の場合は、以下のように `target.'cfg`を使って依存関係を記述する必要がありました。

```toml
[target.'cfg(target_arch = "x86_64")'.dependencies]
bevy_remote_inspector = "0.1.0"
```


こうして起動すると、デフォルトでは `ws://localhost:3000` で Bevy の Remote のポートが開きます。そしてここが特徴的なのですが、**UIはウェブアプリケーションとしてデプロイされています**。https://bevy-remote-inspector.pages.dev/ というURLを開くとこれがローカルのアプリケーションに接続します。なのでデバッグ用のツールを個別にローカルにインストールする必要がありません。

実際に使ってみると、こんな感じになりました。デバッグツールにはゲームの状態がリアルタイムに表示されていますし、エンティティのコンポーネント一覧からプロパティをいじると、それがリアルタイムにゲームのほうに反映されます。素晴らしい！

![スクリーンショット 2024-12-14 034435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64695/4ea02360-4d72-d254-2958-e0ffb87bb114.png)

それでこのツールをいじっていたら、さっそく自分のゲームのバグを見つけました。ゲーム本編からメイン画面に戻ったときに、一部のエンティティ(ゲーム内にあったランタンの光源)が消去されず残ったままになっていました。`printf`デバッグも有用なのですが、ちゃんとGUIデバッガで観察することも大切ですね。





# そのほかのデバッグツール

#### bevy_inspector.nvim

UIがNeovimになっているやつ。私はNeoVimは使っていないので今回はパス。

https://github.com/Lommix/bevy_inspector.nvim

#### bevy-remote-devtools

TauriベースのUIのやつ。今はメンテナンスされていないようです。

https://github.com/reneeichhorn/bevy-remote-devtools

#### bevy-inspector-egui

私も今まで使っていたやつ。

https://github.com/jakobhellermann/bevy-inspector-egui
Azure Container appをTerraformで実現する

Azure Container appをTerraformで実現できたので、メモ。

```
az Loginをしてsubscription_idを取得
```

そのあと
```
az provider register --namespace Microsoft.App --subscription YOUR_SUBSCRIPTION_ID
```

を実行
```
 cpu    = 1　　　　
 memory = "2Gi"
```
 の変更であとは公式でいけるはずです。

```main.tf
provider "azurerm" {
  subscription_id=""
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

resource "azurerm_log_analytics_workspace" "example" {
  name                = "new-workspace-name"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku                 = "PerGB2018"
  retention_in_days   = 30
}

resource "azurerm_container_app_environment" "example" {
  name                       = "Example-Environment"
  location                   = azurerm_resource_group.example.location
  resource_group_name        = azurerm_resource_group.example.name
  log_analytics_workspace_id = azurerm_log_analytics_workspace.example.id
}

resource "azurerm_container_app" "example" {
  name                         = "example-app"
  container_app_environment_id = azurerm_container_app_environment.example.id
  resource_group_name          = azurerm_resource_group.example.name
  revision_mode                = "Single"

  template {
    container {
      name   = "examplecontainerapp"
      image  = "mcr.microsoft.com/k8se/quickstart:latest"
      cpu    = 1　　　　
      memory = "2Gi"
    }
  }
}
```
プロジェクトのチームで使えそうな API 検証ソフトを軽く比べてみる

# はじめに
前回 postman をインストールしてみたが、無料枠だと 3 人までしか共有できなかったので、色々調べてみた。
条件は無料で postman のような機能を持ち、最低でも 5 人招待できるソフトとしている。

以下にあげるソフトは Ubuntu にインストールしてあり、実際に少し触ってみた。

https://qiita.com/waigoma/items/984f3c441363f2c522e3


# 比較
まずは表に起こしてみる。こう見ると Insomnia が優秀に見えそう。

| ソフト   | 共同人数   | プロジェクト数 |
| :-:      |:-:       |:-:             |
| Postman  | 最大 3 人 | -             |
| Apidog   | 最大 4 人 | 最大 5 件      |
| Insomnia |     ∞     | 最大 1 件  |
| EchoAPI  | 最大 8 人 | 最大 10 件     |

以降 API を登録する画面の UI を見ていく。
ちなみにすべて Google アカウントや GitHub アカウントでのログインに対応している。
(GitHub はないやつあったかも？)


# Postman
洗練されたデザインで直感的に使用することができ、かなり使いやすいと感じる。
しかし、共有人数が 3 人なので今回は使用しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/3bed9b4a-7840-9b10-3d7e-50a2d4a5491c.png)

https://www.postman.com/pricing/


# Apidog
個人的には Postman より下だが、洗練されたデザインで直感的に使用することができ、使いやすいと感じる。
しかし、共有人数が 4 人なので今回は使用しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/a8ade284-ce68-2134-41b6-8abfc442a0af.png)

https://apidog.com/jp/pricing/


# Insomnia
軽くしか触っていないが、正直ここにあげた中で一番使いにくいと感じている。
リクエストを登録する画面に行くのも少し分かり辛く、UI も複雑な印象。
無制限に共有できるようだが、一旦使用しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/1088ff12-11f9-bdac-d370-bb81e5f900f8.png)

https://insomnia.rest/pricing


# EchoAPI
UI は Apidog に似ているが、こちらの方が UI がすっきりしていて使いやすさを覚えた。
さらに共有人数は最大 8 人となっていて、非常に優秀である。
あとエディタで使えるプラグインもあるみたい。

不満点として、
- ダークモードに対応していない、
- 初期で選択されているのが Body で Params になっていない、

という点を感じたが、最近リリースされたもののようなので大目に見る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348896/2d3f9c63-dc6a-c1f3-e80e-3cb9e9c08525.png)


https://www.echoapi.jp/price

# 結論
最大 8 人まで共有出来て GUI も使いやすそうだった EchoAPI を使うことにした。


# 参考
https://qiita.com/wataru86/items/75789460dec887cce113
Dockerを使用したアプリ開発の最低限のコマンド

# この記事の目的
仕事でDockerを使用した開発を行った際に使用した、最低限のDockerの知識を記載します。これを見れば、Dockerについてあまり理解をしていなくても開発を行うことができます

## 前提
開発初期の環境構築の際はやや複雑なDockerの操作,設定が必要になります。
今回は、そういった最初期の設定がすでに完了している状態で考えています。

## 最低限覚えておきたいコマンド
- `docker compose up`：
・開発を実行するとき
・初回実行時や、サーバーを停止した場合に再実行する
`docker compose up`は、コンテナを停止するコマンド(`docker compose down`)を実行した後や、VScodeやDockerDesktopを閉じた後に開発を再開する時再実行が必要です。


- `docker compose down`：
・コンテナを停止・削除するとき

## おわりに
これはあくまで最低限なので、時間がある時にDockerの知識をインプットすることをお勧めします。
Oracle Live SQL v2が出ました

本記事は [JPOUG Advent Calendar 2024](https://adventar.org/calendars/10258) の14日目の記事となります。

JPOUG Advent Calender、13日目の記事は Hiroshi Sekiguchi  さんの記事「[実行計画は, SQL文のレントゲン写真だ！ No.65 / JPOUG Advent Calendar 2024 / JSON-Relational Duality Views](https://discus-hamburg.cocolog-nifty.com/mac_de_oracle/2024/12/post-f7ca64.html) 」でした。

本日は、Oracle Live SQL v2が出ました、と言う内容になります。
今回の要点としては、Oracle DBを用意することなくWebブラウザからSQLを実行できるOracle Live SQLですが、v2になって、サインなし、23aiが使えるようになった、という内容です。
実は、11/18には使える状況になっていました。

## Oracle Live SQL とは

Oracle DBを用意することなく、WebブラウザからSQLを実行できる環境のことです。
Oracle Live SQL
https://livesql.oracle.com/

以下の画像のように、ワークシートにSQLを書いて実行し、実行結果はグリッド形式で表示されます。SQL Developer Webに感覚は近いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/2d9fa473-b4b0-aff1-99e9-4a68d3ca9ecc.png)

v1ではOracleアカウントさえ用意してブラウザからアクセスすれば実行できます。
最初からサンプルスキーマが入っているため、いきなりSQLを実行できます。また、小さいサイズであればオブジェクトを作成することができます。

Oracle Live SQL v1の主な特徴は下記の通りです。
・Oracle Database 19c EE Extreme Perf - 19.17.0.0.0 で稼働
・サンプルスキーマがいきなり利用できる
・自分のオブジェクト（テーブル、インデックスなど）の作成も可能
・SQL実行結果を使ってスクリプトやチュートリアルを作成、共有ができる
・他のユーザーが作成したスクリプトやチュートリアルを参考にできる

他詳細は、トップページ画面右上のHelpのところから確認してください。確認にはサインインが要ります。


## Oracle Live SQL v2 で変わったこと
・v1まではサインインが必要でしたが、サインインなしで利用可能になりました。いきなりサンプルスキーマを使ってSQLを実行することができます
（DMLやDDLを使いたい場合はサインインして利用が必要です。）
・Oracle Database 23ai環境を利用できるようになりました。
・スキーマの保持期間が８時間から90日に延長されました

利用方法は、トップページ右側のTry Live SQL V2のアイコン付近をクリックすることで利用できます。
下記リンクからも利用できます。
https://livesql.oracle.com/next/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/5aa0502c-4af7-5b76-1b8e-eba6c60bc4f5.png)

サインインがなくなったことでSQLを試しやすくなっていますので、ぜひ使ってみてください。