OmniAICreator/Qiita-1.07M huggingface dataset:
dbt-osmosis を使用した自動YAML管理の効率化について

## はじめに

`dbt` では、モデルやソースのドキュメント管理にYAMLファイルを用いますが、手動での管理は面倒です。そこで、`dbt-osmosis` というツールを使用することで、YAMLファイルの生成や更新が自動化され、作業が効率化されます。

このブログでは、`dbt-osmosis` を使った設定例と実行結果について説明します。

### `dbt-osmosis` の概要

`dbt-osmosis` は以下のような機能を持ち、`dbt` プロジェクト内のYAMLファイル管理を簡略化します：

- **自動ドキュメント生成**：モデルやソースに対応するカラム情報やデータ型を自動でYAMLに反映。
- **整然としたYAML管理**：定義済みの設定に基づいてYAMLファイルの並び替えや不要なカラム削除。
- **ストリームリット対応のインターフェース**：リアルタイムでのクエリテストとドキュメント更新の可視化。

## 設定例

### `dbt_project.yml` の設定

`dbt-osmosis` を使用するには、`dbt_project.yml` に `+dbt-osmosis` の設定を追加します。

```yaml
name: 'data_example_project'

config-version: 2

profile: 'data_example'

model-paths: ["models"]
seed-paths: ["seeds"]
test-paths: ["tests"]
analysis-paths: ["analysis"]
macro-paths: ["macros"]

target-path: "target"
clean-targets:
  - "target"
  - "dbt_modules"
  - "logs"

models:
  data_example:
    +dbt-osmosis: "{model}.yml"  # ←「ここを追加する」：各モデルに対応するYAMLファイルを自動生成
    +materialized: table  # デフォルトでテーブルとして素材化

    project_summary_view:
      +materialized: view

    project_metrics_dwh:
      +materialized: table
```

### `dbt-osmosis` 実行前のYAMLファイル例

以下は、`dbt-osmosis` 実行前の`schema.yml`です。

```yaml
version: 2

sources:
  - name: DUMMY_DB  # データベース名
    schema: DUMMY_SCHEMA  # スキーマ名
    tables:
      - name: PROJECT_SUMMARY  # ダミーテーブル名
```

### `dbt-osmosis` 実行コマンド

以下のコマンドで `dbt-osmosis` を実行し、YAMLファイルの自動生成・更新を行います：

```bash
dbt-osmosis yaml document #全てのschema.yml 
dbt-osmosis yaml document --project-dir . --profiles-dir .
```
![スクリーンショット 2024-10-31 12.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/4d6317bc-09b5-59bd-23dc-f882c999d0e8.png)


このコマンドにより、データベースのカラム情報やデータ型が `schema.yml` に反映されます。

## `dbt-osmosis` 実行後のYAMLファイル例

`dbt-osmosis` の実行により、自動的にカラムとデータ型の情報が追加されたYAMLファイルは以下の通りです。

```yaml
version: 2

sources:
  - name: DUMMY_DB  # データベース名
    schema: DUMMY_SCHEMA  # スキーマ名
    tables:
      - name: PROJECT_SUMMARY  # ダミーテーブル名
        columns:
          - name: PROJECT_ID
            description: ''
            data_type: VARCHAR
          - name: PROJECT_NAME
            description: ''
            data_type: VARCHAR
          - name: MANAGER_NAME
            description: ''
            data_type: VARCHAR
          - name: START_DATE
            description: ''
            data_type: DATE
          - name: END_DATE
            description: ''
            data_type: DATE
          - name: BUDGET
            description: ''
            data_type: NUMBER
          - name: COST
            description: ''
            data_type: NUMBER
          - name: PROFIT
            description: ''
            data_type: NUMBER
          - name: STATUS
            description: ''
            data_type: VARCHAR
          # 他のダミーカラムが追加されます
```
## さらに
IDE環境にCursorもしくはGithub copilotを使用している場合、以下のようにdescriptionの生成をお願いすると、簡単なdescriptionを生成してくれます。

![スクリーンショット 2024-11-01 15.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/905c5a3e-050b-82db-e847-531ccd707811.png)

## まとめ

`dbt-osmosis` を使うことで、`dbt` プロジェクト内のYAMLファイル管理が大幅に効率化されます。データベーススキーマに基づいて自動生成されたドキュメントにより、手動の更新作業が軽減され、信頼性も向上します。`dbt` によるモデル管理をさらにスムーズにしたい方には、`dbt-osmosis` の活用をぜひおすすめします。
mainブランチで作業してしまった… 途中で作業用ブランチを切り替える方法


Hello しっしーです！🦁

Qiitaは久しぶりの更新になってしました笑

ですが、エンジニアたるもの…
やはり、Qiitaでのアウトプットもやらねばならぬ…

と思い至ったので、本日より不定期ではありますが、
Qiitaでのアウトプットも行っていきたいと思います。

また、私は、現在RUNTEQという 
Webエンジニアを目指すスクールの受講生をしております。
(7月6日より入校。現在は10月31日です。約４ヶ月)

なので、思いっきり初学者です…

その為、アウトプットの内容が間違っていたり、
より効率的な方法があるかもしれません。

その点ご了承下さい。

また、間違えていた際には、適切なフィードバック等頂けますと幸いです。


## 目次：

- [mainブランチで作業してしまった…](#mainブランチで作業してしまった)
- [手順を紹介](#手順を紹介)
- [1.git stash](#1git-stash)
- [2. git checkout -b (作業用ブランチ名)](#2-git-checkout--b-作業用ブランチ名)
- [3. git stash pop](#3-git-stash-pop)
- [まとめ](#まとめ)


## mainブランチで作業してしまった…

課題やカリキュラム、動画講義などで…

mainブランチより、新しいブランチを作成し、

#### 作業用ブランチで作業を行なって下さい。


☝️上記のような指示を受けることが多々あるかと思います。


そこで、

あ…🙂

作業用ブランチ…

作ってないやないかいっっっっっっ！！！！！！！！

となった時の対処法を本日はご紹介したいと思います。


## 手順を紹介

手順は簡単です。

1.git stash
2.git checkout -b (※⚠️自分の作成したい作業用ブランチ名)
3.git stash pop

以上です。

めちゃくちゃ簡単👀👀👀

この作業を行うことで、main ブランチをクリーンな状態に保ちながら、
main ブランチで途中まで作業していた内容を新しく作成したブランチに移すことができます。

一つづつコマンドを説明していきましょう。

## 1.git stash

未コミットの変更を一時的に保存:

git stash コマンドを使用して、現在の未コミットの変更を一時的に保存します。
これにより、作業内容がスタッシュに保存され、作業ツリーがクリーンな状態になります。


## 2. git checkout -b (作業用ブランチ名)

新しいブランチを作成:
main ブランチから新しいブランチを作成します。


## 3. git stash pop

スタッシュした変更を戻す:
新しいブランチに切り替えた後、git stash pop コマンドを使用して、スタッシュした変更を戻します。これにより、作成した作業用ブランチに未コミットの変更が適用されます。


この手順を踏むことで、main ブランチはクリーンな状態を保ちつつ、
途中まで作業していた内容を 新規作成した作業用ブランチ に引き継ぐことができます。

## まとめ

本日は、意外とやってしまう…
作業用ブランチを作成し忘れる…

ということについて、自分で調べて解決した内容をアウトプットしました。

上記のように、意外とやってしまう…

けど、どうやって解決したらいいかわからない…

というような、小ネタを見つけてはアウトプットするように心がけていこうと思います。

皆さんの疑問ではないが…悩み…とまではいかない…微妙な謎…

みたいなところを言語化出来るように出来たら嬉しいなと思います。

at by しっしー🦁
サクラエディタの個人的に便利だと思った機能（キーマクロ）

こんにちは！エンジニアの篠原です:penguin:
今回もサクラエディタで個人的に便利だと思った機能を紹介します。

前々回＆前回はこちら↓

https://qiita.com/pesysyon/items/6559649ab6f60b8af749

https://qiita.com/pesysyon/items/e4c11c71ffd0cdbc0e28


## 便利機能（キーマクロ）

一言でいうと、「キーボード操作を覚えてくれる機能」です！
どれくらい便利なのかは実際やってみたほうが分かりやすいので
すぐ実践です。
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/17f17b26-978b-4ba2-1c0d-df5279e5088f.png)

例えば上図のようなデータがあって
全文字列をシングルクォーテーションで囲んだ状態にしたい！ってとき
1行ずつポチポチ入力するのは面倒ですよね？
これくらいの量だと我慢できてもこれが100件、1000件になってくると大変です。

そんなときはキーマクロに覚えさせましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/6de01f9a-5f4e-2a02-e90b-6a82d92d4c81.png)

ツール＞キーマクロの記録開始を押下、もしくはShift+Ctrl+M。
するとこれ以降のキー入力をすべて記録してくれます。

手順としては以下です。

1行目の先頭にカーソルを置いた状態で、

1.**Shift+Ctrl+M**(記録開始)
2.**シングルクォーテーションを入力**
3.**Endキー**(行末移動)
4.**シングルクォーテーションを入力**
5.**Homeキー**(行先頭移動)
6.**↓キー**(次行に移動)
7.**Shift+Ctrl+M**(記録終了)

これで記録は完了です:+1:
では記録したマクロを実行してみましょう！

実行は**Shift+Ctrl+L**です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/e75cf07d-5946-3c48-f3f2-f61d42fc68ae.png)

<br>
2行目に記録したキー入力が実行されました:clap:
<br>
Shift+Ctrl+Lを長押しすることで一番下の行まで連続で実行してくれます:sparkles:
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/5898274d-cc1c-a443-274f-33c0312e9714.png)

注意点としては、全てキー入力の為
EndキーやHomeキー等を使って移動してくださいね！



## まとめ
今回は「キーマクロ」について紹介しました。
大量のデータに対して何か文字列をつけたい、はずしたいときって
結構ありますよね。
キーマクロを使って少しでも作業を時短していきましょう:muscle:

以上、篠原でした:penguin:
Amazon Linux2023のEC2でOpenSSL 3.4.0にバージョンアップする方法

EC2（Amazon Linux2023）にデフォルトで入っているOpenSSLのバージョンアップの対応手順をまとめました。

## ゴール
OpenSSL 3.4.0

## 現状
OpenSSL 3.0.8

## 対応手順
### 1. OpenSSL公式HPから対象のソースコードをダウンロードして展開する
```linux
cd /usr/local/src/
sudo wget https://www.openssl.org/source/openssl-3.4.0.tar.gz
sudo tar xvf openssl-3.4.0.tar.gz
```
### 2. 必要なPerl周りのモジュールをインストールしておく
```linux
sudo yum install perl perl-FindBin perl-Module-Load-Conditional perl-Test-Harness perl-CPAN
```

🚨次の手順で設定ファイルを実行した際に下記のエラーが出るため
```linux
Can't locate FindBin.pm in @INC (you may need to install the FindBin module) (@INC contains: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at /usr/local/src/openssl-3.4.0/Configure line 15.
BEGIN failed--compilation aborted at /usr/local/src/openssl-3.4.0/Configure line 15.
```

### 3. 設定ファイル実行
```linux
cd openssl-3.4.0
sudo ./config

※下記が出れば成功
**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL.md file first)      ***
***                                                                ***
**********************************************************************

```

### 4. コンパイル及びインストールを行う
```linux
sudo make
sudo make install
```

### 5. lib64のパスを通す
.bashrcファイルの最後の行に`export LD_LIBRARY_PATH=/usr/local/lib64`を追加する。

```linux
sudo vi ~/.bashrc
```

🚨次の手順でバージョン確認をする際にパスが通っておらず下記のエラーが出るため
```linux
openssl: /lib64/libssl.so.3: version `OPENSSL_3.4.0' not found (required by openssl)
openssl: /lib64/libssl.so.3: version `OPENSSL_3.2.0' not found (required by openssl)
openssl: /lib64/libcrypto.so.3: version `OPENSSL_3.0.9' not found (required by openssl)
openssl: /lib64/libcrypto.so.3: version `OPENSSL_3.3.0' not found (required by openssl)
openssl: /lib64/libcrypto.so.3: version `OPENSSL_3.4.0' not found (required by openssl)
openssl: /lib64/libcrypto.so.3: version `OPENSSL_3.2.0' not found (required by openssl)
```

### 6. 再起動する
```linux
sudo reboot
```

### 7. バージョンアップされていることを確認する
```linux
openssl version

※下記が出ればOK
OpenSSL 3.4.0 22 Oct 2024 (Library: OpenSSL 3.4.0 22 Oct 2024)
```
M5Stackで距離計測(HC-SR04)

# M5StackでHC-SR04を使う
## Grove 超音波距離センサー編
### センサー
SEEEDから発売されている[GROVE - 超音波距離センサモジュール](https://www.switch-science.com/products/1383)を使います．
### M5Stack
Grove端子が使えるCore2を使います．
BASICもGroveの端子がありますが，HC-SR04では使えませんでした．

### プログラム
#### ライブラリ
SEEEDのライブラリ[Grove_Ultrasonic_Range](https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger/archive/master.zip)をダウンロードして，IDEに追加しておきます．
![aruduino-librarymanager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/3e487873-5d72-a1e8-e8cb-40bc1f15f432.png)


#### ソース
距離計測だけではなく，センサーから得られる超音波を発信してから反射して戻ってくるまでの時間を計測したかったので，MeasureDuration()を追加(ライブラリの関数を修正して，距離を返さずに時間を返しているだけ)しています．距離のみ計測して表示するなら不要です．
```C++
#include <M5Core2.h>
#include "Ultrasonic.h"
#define PIN G33

Ultrasonic ultrasonic(PIN);
void setup()
{
  M5.begin(true, true, true, false); // I2C無効(PORTA をGPIOで使用するため)
  //M5.Power.begin();
  M5.Lcd.setTextSize(2);
  M5.Lcd.println("Ultrasonic HC-SR04");
  M5.Lcd.setCursor(10, 30);
  M5.Lcd.println("Distance to obstacles");
}

void loop()
{
 long duration;
 long RangeInCentimeters;
 const double soundvelocity = 34350./1000000.; //[cm/usec at 20 degrees Celsius]

 duration = MeasureDuration(); // two measurements should keep an interval
 M5.Lcd.setCursor(0,46);
 M5.Lcd.printf("%10d usec   \n", duration);
 RangeInCentimeters = duration * soundvelocity / 2.;
 M5.Lcd.printf("%10d cm    \n", RangeInCentimeters);//0~400cm
 //M5.Lcd.print(RangeInCentimeters);
 delay(500);
}

/*The measured distance from the range 0 to 400 Centimeters*/
long MeasureDuration(void)
{
        pinMode(PIN, OUTPUT);
        digitalWrite(PIN, LOW);
        delayMicroseconds(2);
        digitalWrite(PIN, HIGH);
        delayMicroseconds(5);
        digitalWrite(PIN,LOW);
        pinMode(PIN,INPUT);
        long duration;
        duration = pulseIn(PIN,HIGH);
        //long RangeInCentimeters;
        //RangeInCentimeters = duration/29/2;
        return duration;
}
```
### 完成
![1730342050195.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/59ea9a7e-87bc-dbb9-c63e-0704a2845c53.jpeg)

## HC-SR04編
Groveと違って，センサーの出力が5Vなので，抵抗をつかって降圧させる必用があります．
[M5StackGrayで超音波距離センサ(HC-SR04)の動作テスト](https://coskxlabsite.stars.ne.jp/html/for_students/M5Stack/UltrasonicDistanceSenror2/UltrasonicDistanceSenror.html)など，多くのページで情報があるので参考にしました．
### ブレッドボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233756/b868961c-406f-7c0f-4eb1-17deb2000220.png)
wslでrust その7

# 概要
wslでrustやってみた。
練習問題やってみた。

# 練習問題
wgetを作れ。

# 参考にしたページ

https://qiita.com/mekamaru/items/d3c5b00d373786a06b4d

# 操作手順

```
$ cd rust
$ cargo new wget
$ cd wget
$ cargo add bytes
$ cargo add reqwest
$ cargo add tokio
$ explorer.exe .
$ cargo build
   Compiling lock_api v0.4.12
   Compiling parking_lot_core v0.9.10
   Compiling scopeguard v1.2.0
   Compiling tokio-macros v2.4.0
   Compiling signal-hook-registry v1.4.2
   Compiling parking_lot v0.12.3
   Compiling tokio v1.41.0
   Compiling tokio-util v0.7.12
   Compiling tokio-native-tls v0.3.1
   Compiling h2 v0.4.6
   Compiling hyper v1.5.0
   Compiling hyper-util v0.1.10
   Compiling hyper-tls v0.6.0
   Compiling reqwest v0.12.9
   Compiling wget v0.1.0 (/home/ore/rust/wget)
    Finished dev [unoptimized + debuginfo] target(s) in 1m 06s

~/rust/wget$ cargo run https://docs.rs/-/rustdoc.static/rust-logo-151179464ae7ed46.svg rust.svg
    Finished dev [unoptimized + debuginfo] target(s) in 0.24s
     Running `target/debug/wget 'https://docs.rs/-/rustdoc.static/rust-logo-151179464ae7ed46.svg' rust.svg`
status code = 200

~/rust/wget$ ls
Cargo.lock  Cargo.toml  rust.svg  src  target

~/rust/wget$
```

以上
【ChatGPT】ソクラティックメソッドPrompt（ソクラテス問答法）の紹介です。


　どうも、カーブミラーです。

　今回は、ソクラティックメソッドPromptの紹介です。ソクラテス問答法を行なうPromptになります。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　まずは、ニュース。

　ChatGPTの
　　デスクトップアプリですが、
　　　Advanced Voice Modeが、
　　　　macOSとWindowsの
　　　　　デスクトップアプリで
　　　　　　利用可能になりました。

　デスクトップで
　　Advanced Voiceに
　　　アクセスするには、
　　　　最新バージョンのアプリを
　　　　　忘れずにダウンロード。

　相変わらず、
　　パソコンがないので
　　　触れない😭
***
　さて、本題です。

　今回は、
　　ソクラティックメソッドPromptの
　　　紹介です。

　Taiyoさんという方が
　　ポストしてくださったPromptです。
[Taiyoさんポスト](https://x.com/taiyo_ai_gakuse/status/1851569302727700616?t=VJdsGPI-oDqyCz7fnWqwhQ&s=19)

　命名はされていませんでしたが
　　“ソクラティックメソッド”という
　　　ものと同じようです。

　ソクラティックメソッドとは
　　Google SGEによると
>ソクラティックメソッドとは、教員が学生の返答を基に、その返答に含まれる知識についてさらに多方面から質問をする方式の授業です。学生が自分で考え、その考えを深め、幅広くさせつつ、正確に理解することを目的にしています。
>﻿
>ソクラティックメソッドの主な特徴は次のとおりです。
>
>・教員が学生一人ひとりに考えさせることで、学生自らの思考を促す効果がある。﻿
・教員が学生の返答を基に、その返答に含まれる知識についてさらに多方面から質問をする。﻿
・「なぜ、そのように考えるのか」「○○○とは、何か」といった質問が繰り返される。﻿

　こちらも参考に。
　　[ソクラテス・メソッド](https://masahiroito.hatenablog.com/entry/20070605/1181046867)

　ソクラテス問答法とも
　　言います。

　簡単に言うと、
　　教師と学生が
　　　問答するやり方。

　ソクラテスと言えば、
　　古代ギリシャの哲学者。

　ソクラテスが教師となり、
　　若者たちと問答したのが
　　　はじまり、らしいです。
***
　それはさておき、
　　そんな問答をするための
　　　Promptです。

　Taiyoさんの
　　ポストしてくださったPromptを
　　　そのまま引用します。
```Text:ソクラティックメソッドPrompt
あなたはソクラテスのように、ユーザーが指定する命題について、ユーザーに質問してください。

条件：
ユーザーから指示がない限り、質問は繰り返し続けてください

1回の質問につき、1つの質問内容のみを出力してください

批判的な度合い：[1-10の範囲で指定]

質問を作る際のポイント：

1. 問いかける姿勢を持つ
2. オープンな質問をする
3. 追及する
4. 相手を否定しない
5. 聴くことに集中する
6. メタ認知を促す
7. 答えを出すのではなく、疑問を残す
```

　このPromptを送信したあと、
　　命題と度合いを入力すると、
　　　問答が、はじまります。

　問答の終了は
　　“終わり”とか“終了”とかでOK。
　　　決まりはありません。
　　　　放っといてもOK。

　私的には
　　苦手なタイプでした😅

　でも
　　ほかの学生はいませんし、
　　　時間もあなたの味方です。
　　　　このPromptで
　　　　　やり取りした結果を
　　　　　　ChatGPTにまとめさせる
　　　　　　　のも手です。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【Google Cloud】自動スケーリングについて

# まえがき
おつかれさまです。Mochiです。
今回はGoogle Cloudの自動スケーリングについて簡単にご紹介しようと思います。
現在私はACEを勉強しており、そこで自動スケーリングを活用したソリューション構築に関する設問が多く見受けられたので、ここに記録しておきます。
# 自動スケーリングとは？
Google Cloudに限らず、クラウドサービスを選択する最大のメリットのひとつが、自動スケーリング機能です。これによりシステムの負荷が増減した際に、必要なリソースを自動的に調整することができます。
Google Cloudではこの機能が『Compute Engine』や『Google Kubernetes Engine』等に実装されています。
基本的に、マネージドインスタンスグループとオートスケーラーを組み合わせて実装します。
#### 使用例
・トラフィックが急増し、サーバがその負荷に耐えられない場合に自動でリソースを追加。
・トラフィックが減少した際に不要なリソースを削除し、コストを節約。
# Google Cloudの自動スケーリング機能について
#### Compute Engineの自動スケーリング
マネージドインスタンスグループ(MIG)を使用してリソースの負荷に応じて、インスタンス数を自動的に増減できます。CPU使用率やHTTPのリクエスト数をその指標としてスケーリングします。
#### GKEの自動スケーリング
GKEではCompute Engineと少し変わり、クラスタ全体のノード数を自動的にスケーリングする『クラスターオートスケーラー』と、個々のポッドのリソース需要に応じてポッド数を調整する『ポッドオートスケーラー』の2つの機能を提供しています。
Horizontal Pod Autoscaler (HPA)とVertical Pod Autoscaler (VPA)が存在しますが、長くなるので別の記事でまとめようかと思います。
#### Cloud Runの自動スケーリング
Cloud Runは、サーバレスなコンテナサービスで、リクエスト数に応じてコンテナのインスタンスを自動的に増減させます。これによってサーバレスの特性を活かした柔軟なスケーリングが可能です。
#### App Engineの自動スケーリング
スタンダード環境とフレキシブル環境が存在しており、スタンダード環境はインスタンス数『0』からスケーリング可能。
# 自動スケーリングでどのようなメリットが生まれるか
#### パフォーマンスの向上
リクエストが急増しても、追加のリソースが自動でスケーリングされるため、アプリケーションの応答速度を維持することができます。
#### コストの最適化
トラフィックが減少した際はリソースを自動的に減少させるため、リソースの無駄遣いを防ぎます。それによってコストを削減できます。
Google推奨のプラクティスは、権限やコストを最小限に抑えることです。
#### トラフィックへの柔軟な対応
定期的なトラフィックの波や突発的なアクセス増加にも柔軟に対応できます。そのためアプリケーションに対するUXが維持できます。
# 適切なオートスケーリング設定をする
#### スケーリング指標について
CPU使用率やリクエスト数など、アプリケーションに最適なスケーリング指標を選ぶことが重要です。
#### インスタンス数の最大値・最小値を設定
スケーリングの範囲を適切に設定し、無制限にリソースが増減しないように管理することも重要です。
Cloud Runを使用する場合、インスタンスの最小値を0までスケーリング出来る為、トラフィック発生時のみにインスタンスを動かすことができます。その為、コストを最小限に抑えることができます。
#### スケーリングをスピーディに行う
スケーリングが遅いとアプリケーションのパフォーマンスに影響を及ぼすリスクがあります。対応策として、例えばCloud Runを使用して最小インスタンス数を『3』などに設定しておけばインスタンスの初期遅延を抑えることができます。
#### 信頼性の向上
MIGのオートヒーリング機能を使用すれば、内部のCompute Engineインスタンス等が破損しても自動的に復旧をすることが可能です。
# まとめ
Google Cloudの自動スケーリング機能を活用することで、効率的なリソース管理とコスト最適化を実現できます。Compute EngineやGKE、Cloud Run、App Engineといった様々なサービスでスケーリング機能を柔軟に活用することで、クラウド環境のメリットを最大限に引き出すことができます。

アーキテクチャを設計するうえで、自動スケーリングの知識は必ず必要になってくると思います。また、Compute EngineやGKE、Cloud Runなど使用するリソースによっても運用方法が変わってきます。状況に応じて適切なリソースを選択することが重要であると感じました。
# 参考サイト
https://cloud.google.com/compute/docs/autoscaler?hl=ja

https://reinforz.co.jp/bizmedia/60716/
Railsで`ckeditor`の`Sprockets::FileNotFound`エラーを解決する方法


## 問題の背景

Railsアプリケーションにおいて、`ckeditor`を利用する際に`Sprockets::FileNotFound`エラーが発生する場合があります。具体的には、次のようなエラーメッセージが表示されます。

    Sprockets::FileNotFound at /admin/users/sign_in
    couldn't find file 'ckeditor/init' with type 'application/javascript'
    Checked in these paths: ...

このエラーは、アセットパイプラインで`ckeditor/init`ファイルが見つからないために発生します。`ckeditor`のバージョンとSprocketsの互換性の問題が原因であることが多く、公式リポジトリでも議論されています（[Issue #881](https://github.com/galetahub/ckeditor/issues/881)）。

## 解決方法

この問題を解決するには、いくつかのアプローチがありますが、互換性のあるバージョンへのダウングレードとアセットパイプラインの設定を変更する方法が推奨されています。

### 1. `ckeditor`のバージョンを指定してダウングレード

まず、`Gemfile`を編集して`ckeditor`の安定したバージョンに固定します。Issueで推奨されているバージョンやRailsバージョンに応じて、以下のようにバージョン指定を行います。ここでは、互換性が確認されているバージョン`4.2.4`を例にしています。

    gem 'ckeditor', '~> 4.2.4'

変更後に`bundle install`を実行します。

    bundle install

### 2. アセットパイプラインに`ckeditor/init`を追加

エラーの原因である`ckeditor/init`を正しく読み込むために、`app/assets/javascripts/application.js`に次の行を追加します。

    //= require ckeditor/init

### 3. プリコンパイル設定の変更

Sprocketsがアセットを見つけられるように、`config/initializers/assets.rb`に以下を追加して`ckeditor`関連ファイルをプリコンパイル対象に含めます。

    Rails.application.config.assets.precompile += %w[ckeditor/*]

### 4. アセットの再プリコンパイル

最後に、アセットを再プリコンパイルして、`ckeditor`のアセットをRailsアプリケーションで使用できるようにします。

    rails assets:precompile

### 5. サーバーの再起動と動作確認

サーバーを再起動し、エラーが解消されていることを確認します。

    rails s

## まとめ

これらの手順により、`ckeditor`の読み込みエラーを解消し、Railsアプリケーションで正常に利用できるようになります。詳細は[Issue #881](https://github.com/galetahub/ckeditor/issues/881)にて議論されていますが、ここで紹介した手順で大半のケースで解決できます。
GitLABとJenkinsのWebHook

### 要件
CIツールのJenkinsでコンパイルし、Deployする

GitLabからWebhook飛ばしてJenkinsのJobを実行す
https://qiita.com/rk05231977/items/8b87b091eb6d45a370e1


### Jenkinsマシンの試し

#### gitlabからソースチェックアウト

```
git ini
git remote add origin https://sfdjp13998.swf.nec.co.jp/gitlab/ALLProjectMember/saprise_poc_java.git
git pull
git branch -a
git checkout -b dev001 origin/dev001
git 
```

#### Webhook
##### JenkinsのToken

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529847/a1b45baf-2660-852b-cc53-fe04c4cec193.png)

#### gitlabのWebhook
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529847/04b40bc2-a3be-4697-d18e-a05284c3a972.png)







##### Pipeline

トークン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529847/89c0193b-1751-1b8c-c8df-989162d53c15.png)

Jenkinsの設定のところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529847/a32e87a5-7f60-3662-c951-0d4f83d1e5b6.png)


```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529847/78ca7c64-e77b-b9df-ca71-2d9dd6d10b6e.png)

```pipeline {
    agent {
        label '1201041_build1013426'
    }
    environment {
        PATH = "C:\\Program Files\\Cloud Foundry;C:\\Program Files\\SapMachine\\JDK\\21\\BIN;${env.PATH}"
        JAVA_HOME = "C:\\Program Files\\SapMachine\\JDK\\21"
        HTTPS_PROXY = "http://proxygate2.nic.nec.co.jp:8080"
        CF_API_ENDPOINT = "https://api.cf.jp10.hana.ondemand.com"
    }

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
                echo "PATH is: ${env.PATH}"
                echo "JAVA_HOME is: ${env.JAVA_HOME}"
                echo "HTTPS_PROXY is: ${env.HTTPS_PROXY}"
                echo "CF_API_ENDPOINT is: ${env.CF_API_ENDPOINT}"
                
            }
        }
    
        stage('Checkout') {
            steps {
                script {
                   // The below will clone your repo and will be checked out to master branch by default.
                   git branch: 'master',credentialsId: '63ead174-294f-4c05-9f92-0558740f8989', url: 'https://sfdjp13998.swf.nec.co.jp/gitlab/ALLProjectMember/saprise_poc_java.git'

                  }
                 bat 'gradlew.bat bootJar' 
                 bat 'cf8.exe login -u hu-chunqiang@ncontr.com -p hUcq1125 -a https://api.cf.jp10.hana.ondemand.com'
                 bat 'cf8.exe push'
             }
        }
        
    }
}

```
【2024アメリカ大統領選をAIで予測：独自システムと機械学習の活用】


2024年アメリカ大統領選挙に向けた勝利予測を、日次で更新してリアルタイム分析中です。
10月30日時点では共和党が54.2%とリードしていましたが、11月1日の予測では民主党47.7%、共和党46.1%と逆転の可能性が見えてきました。

今回、オープンソースと独自開発の予測システムを活用し、機械学習によるモデル構築を行っています。
予測市場のデータと比較しながら、選挙情勢を追いかける仕組みを作成。モデル精度や誤差の傾向分析を行い、予測の改善を続けています。

技術の詳細やデータ解析プロセスにご興味のある方、ぜひ一緒に選挙の未来を技術的視点で見守りませんか？

![TOTAL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/31802e2d-d666-41ed-ccc2-553c264326f1.png)
実行コストの低い経過時間計測

## 参考
この記事は、以下の動画を参考にしています。
詳しくは、動画をご覧ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/Lvdyi5DWNm4?si=kYp7CV3wq1YmMPSI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## △DateTime.UtcNow
``` cs
// 開始時刻を得る
DateTime start = DateTime.UtcNow;

// 計測対象の処理

// 経過時間を得る
TimeSpan elapsed = DateTime.UtcNow - start;
```

`DateTime.UtcNow`は、うるう秒の調整など、**時刻**を得るための処理を行っている。経過時間を知るには必要のない、余分な処理をしている。

## △Stopwatch.Elapsed
``` cs
// ストップウォッチを得る
Stopwatch sw = Stopwatch.StartNew();

// 計測対象の処理

// 経過時間を得る
TimeSpan elapsed = sw.Elapsed;
```

`Stopwatch`はクラスなので、インスタンスを作るとヒープを使う。ヒープを使うとガベージコレクションの原因となる。

## ◎Stopwatch.GetTimestamp, GetElapsedTime
``` cs
// タイムスタンプを得る
long start = Stopwatch.GetTimestamp();

// 計測対象の処理

// 経過時間を得る
TimeSpan elapsed = Stopwatch.GetElapsedTime(start);
```

`Stopwatch.GetTimestamp`は、OSのAPIを呼び、タイムスタンプ（マシンの起動からの経過時間）を得る。タイムスタンプのデータ型は`long`であり、ヒープも使用しない。
HTMLで簡単に数値のプラスボタンとマイナスボタンを作る

意外と知らない方が多いと思いますが、JavaScirptで自作しなくても簡単にできます。
便利ですね！

``` html
<a id="minus" class="number-control">-</a>
<input type="number" id="number" value="5.0" max="10" min="1" step="0.1" />
<a id="plus" class="number-control">+</a>
```

``` javascript
document.getElementById("minus").addEventListener("click", (event) => {
    document.getElementById("number").stepDown();
});
document.getElementById("plus").addEventListener("click", (event) => {
    document.getElementById("number").stepUp();
});
```

stepUpとstepDownは以下のtypeで使えます。
* number
* range
* date
* month
* week
* time

詳しくはこちら
https://developer.mozilla.org/ja/docs/Web/API/HTMLInputElement/stepUp
Azure Functionsのpublishで、デプロイ後の「トリガーの同期」だけ実行されない場合の対処

# 2024.12.22追記
この記事の方法では回避できないケースに遭遇してしまいました。
引き続き根本原因を調査中であります。解決したらまた書きます。

# 現象

Azure Functionsを`func azure functionapp publish`でパブリッシュする際、
処理は「デプロイ」「トリガーの同期」の二段階で進みます。

* デプロイ開始：Starting the function app deployment...
* デプロイ終了：Deployment completed successfully.
* トリガーの同期開始：Syncing triggers...
* トリガーの同期終了：緑色で各種URLが表示される

![CleanShot 2024-10-31 at 10.23.47@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24333/a5d31861-217d-0275-a8a2-ada759e00fcd.png)


しかし稀に、「デプロイは成功して、そのままトリガーの同期に進まずに終わってしまう」という場合があります。
以下のスクショのように「Syncing triggers...」が始まらない。

![CleanShot 2024-10-31 at 10.22.24@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24333/7fa0cba7-8701-993e-7b20-b7b2286db63c.png)

特にエラーが出るわけでもなく、ただ「デプロイのみ実行して満足している」状態。publish全体は完了しておらずfunctionは古いままになるんですが、エラーが出ないせいで問題の原因が特定しづらく、非常に困ります。

# 回避方法

一旦は「handler関数の中身をちょっといじって再デプロイすればOK」でした。

![CleanShot 2024-10-31 at 10.40.04@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24333/d5257b9f-5db8-0e07-6032-549dfa0b0d83.png)

例えば↑のように、handler関数内から別の自作モジュールをimportして、
その関数を呼び出すことはよくあると思うんですよね。
この場合、import先（この場合はmain）を修正してもトリガーの同期はされないままでした。
handler関数（この場合はExampleFuncHTTP）の直下を修正してあげると、
それによって「トリガーに変更があったので同期する！」とスイッチが入るようですね。

# 根本原因と対策は・・・
なんかもっと、本質的な部分で根本原因と対策がありそうな予感はしています。
根本対処など詳しい方いらっしゃれば、コメントお待ちしてます！
しかし、もうちょっとAzure側でなんとかしてほしいところではありますよね。。

# 参考サイト
[Azure Functions のトリガーの同期とは - Japan Azure PaaS Support Team](https://azure.github.io/jpazpaas/2023/09/15/what-is-sync-trigger.html)
[Azure FunctionsでPrismaを使おうとしたらcli からのデプロイでドハマりしたメモ](https://qiita.com/hibohiboo/items/ef879a366eea39655eb4)
[【Azure】(Syncing triggers...)で関数アプリが同期できない](https://qiita.com/tz77/items/bcb7c8bc00830f6de54a)
[Tips]pdf-readerでパスワード付きファイルからデータを抽出する

pdfの中身を抽出する方法は各言語様々な方法があると思いますが、rubyでやる方法の一つとして[pdf-reader](https://github.com/yob/pdf-reader)を利用する方法があります。
gemのインストール後、以下のようなコードで簡単にページのテキストやメタデータを見ることができます。

```ruby
require 'pdf-reader'

reader = PDF::Reader.new("sample.pdf")

puts reader.pdf_version
puts reader.info
puts reader.metadata
puts reader.page_count
reader.pages.each do |page|
  puts page.text
  puts page.fonts
end
```

ただ今回扱うファイルがパスワード付きだったので、どうするのかReadmeを見たところ特に言及はありませんでした。
どうしたものかと思っていましたが、gemのテストを見たところ答えがありました。

https://github.com/yob/pdf-reader/blob/main/spec/integration_spec.rb#L346

```diff_ruby
require 'pdf-reader'

-reader = PDF::Reader.new("sample.pdf")
+reader = PDF::Reader.new("sample.pdf",password: 'ここに入力')

puts reader.pdf_version
puts reader.info
puts reader.metadata
puts reader.page_count
reader.pages.each do |page|
  puts page.text
  puts page.fonts
end
```

そのままpasswordを引数として渡してあげればいいみたいです。
GitHubアクセス時に「remote: Support for password authentication was removed on August 13, 2021.」のエラーが出てログインできない

## はじめに
- 内容的には薄いのですが、前使っていたアカウントで未だによく見られている記事なのでこちらでも再掲しようと思います


## エラー内容
```powershell

remote: Support for password authentication was removed on August 13, 2021.

```

## 結論
2021年8月13日以降、GitHubリポジトリにアクセスするには、ユーザ名とパスワードではなくアクセストークンが必要になった


## 手順
1. GitHubにログイン
2. 右上の自分のアイコンをクリック
3. 「Settings」をクリック
4. 左メニュー下部の「Developer settings」をクリック
5. 左メニューの「Personal access tokens (classic)」をクリック
6. 右上の「Generate new token」をクリックしてアクセストークンを作成➡Select scopes：repoと、admin:repo_hookとdelete:repoは必須でチェックを入れる
7. vscodeのターミナルでIDとパスワードの代わりにアクセストークンを入力してログイン

今回は短めですが以上です。
paiza.ioでrust その14

# 概要
paiza.ioでrustやってみた。
練習問題やってみた。

# 練習問題
threadを使え。

# 参考にしたページ

https://qiita.com/MiyagiYuki/items/4d1cd9d3a16e6a2ace52


# サンプルコード

```
use std::sync::{Arc, Mutex};
use std::time::Duration;
use std::thread;
use std::process::exit;

static HowManyCheckNum: i32 = 50;
fn main() {
    let count_arc = Arc::new(Mutex::new(0));
    let flag_arc = Arc::new(Mutex::new(0));
    thread::spawn({
        let count_clone = Arc::clone(&count_arc);
        let flag_clone = Arc::clone(&flag_arc);
        move || {
            loop 
            {
                thread::sleep(Duration::from_millis(10));
                let mut num = count_clone.lock().unwrap();
                let mut flag = flag_clone.lock().unwrap();
                if *num % 15 == 0 && *flag == 1
                {
                    println!("FizzBuzz:{}", *num);
                    *flag = 0;
                }
                else if *num % 3 == 0 && *flag == 1 
                {
                    println!("Fizz:{}", *num);
                    *flag = 0;
                }
                else if *num % 5 == 0 && *flag == 1
                {
                    println!("Buzz:{}", *num);
                    *flag = 0;
                }
                else 
                {
                    continue;
                }
            }
        }
    });
    thread::spawn({
        let count_clone = Arc::clone(&count_arc);
        move || {
            loop 
            {
                thread::sleep(Duration::from_millis(50));
                let num = count_clone.lock().unwrap();
                if *num > HowManyCheckNum 
                {
                    println!("Check FizzBuzz TO {}", HowManyCheckNum);
                    exit(0);
                }
            }
        }
    });
    let count_clone = Arc::clone(&count_arc);
    let flag_clone = Arc::clone(&flag_arc);
    for _ in 1..99
    {
        thread::sleep(Duration::from_millis(10));
        let mut num = count_clone.lock().unwrap();
        let mut flag = flag_clone.lock().unwrap();
        if *flag == 1 
        {
            println!("{}", num);
        }
        *num = *num + 1;
        *flag = 1;
    }
}

```

# 実行結果

```
1
2
Fizz:3
4
Buzz:5
Fizz:6
7
8
Fizz:9
Buzz:10
11
Fizz:12
13
14
FizzBuzz:15
16
17
Fizz:18
19
Buzz:20
Fizz:21
22
23
Fizz:24
Buzz:25
26
Fizz:27
28
29
FizzBuzz:30
31
32
Fizz:33
34
Buzz:35
Fizz:36
37
38
Fizz:39
Buzz:40
41
Fizz:42
43
44
FizzBuzz:45
46
47
Fizz:48
49
Buzz:50
Fizz:51
52
53
Check FizzBuzz TO 50
```

# 成果物


https://paiza.io/projects/8NvFbxhhGaNXgGkiVK5GnQ


以上
nvm installに失敗するときの対処法

## 事象
nvmを利用して、nodeをinstallしようとすると、エラーが出てインストールに失敗する。

## 背景
プロジェクトの環境に合わせるため、nodeのバージョンを`v18.16.0`から`v16.17.1`にしたかった。


## 発生手順
1. まずは自分の使用環境の確認。
`node -v`
-> v18.16.0

2. 使いたいnodeのバージョンをインストールする。
`nvm install 16.17.1`

ここで、エラーが発生した。
```
nvm install 16.17.1
Downloading and installing node v16.17.1...
Downloading https://nodejs.org/dist/v16.17.1/node-v16.17.1-darwin-arm64.tar.xz...
#######                                                                                                                       6.1%
########                                                                                                                      6.6%curl: (92) HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)

Binary download from https://nodejs.org/dist/v16.17.1/node-v16.17.1-darwin-arm64.tar.xz failed, trying source.
grep: /Users/hoge/.nvm/.cache/bin/node-v16.17.1-darwin-arm64/node-v16.17.1-darwin-arm64.tar.xz: No such file or directory
Provided file to checksum does not exist.
Binary download failed, trying source.
Detected that you have 8 CPU core(s)
Running with 7 threads to speed up the build
Clang v3.5+ detected! CC or CXX not specified, will use Clang as C/C++ compiler!
Downloading https://nodejs.org/dist/v16.17.1/node-v16.17.1.tar.xz...
#####################                                                                                                        17.8%curl: (92) HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)

Binary download from https://nodejs.org/dist/v16.17.1/node-v16.17.1.tar.xz failed, trying source.
grep: /Users/hoge/.nvm/.cache/src/node-v16.17.1/node-v16.17.1.tar.xz: No such file or directory
Provided file to checksum does not exist.
```


## 解決方法
今回は、下記のコマンドだけで解決できました。古いキャッシュが残って悪さをしていたようです。

`nvm cache clear `
->nvm cache cleared.

nvmが以前にダウンロードしたNode.jsのインストールファイルやその他の一時ファイルをクリアするためのコマンドです。

## 解説
**〜nvm cache clearが必要な理由〜**
- インストール失敗のリカバリー
nvmがNode.jsのインストールに失敗すると、途中までダウンロードされた不完全なファイルがキャッシュに残ることがあります。このキャッシュが残ったままだと、次回のインストールでもエラーが発生しやすくなるため、キャッシュをクリアすることで解決できる場合があります。
　　
- バージョンの更新
Node.jsのバージョンが更新されると、同じバージョン番号でも細かいパッチが適用されていることがあります。その場合、古いキャッシュが残っていると、最新の内容にアクセスできないことがあるため、キャッシュクリアが役立ちます。
　　
- ストレージのクリーンアップ 
キャッシュには一時的にファイルが保存されるため、キャッシュをクリアすることでディスクスペースの無駄な使用を抑えることができます。


## 使用環境
macOS Ventura13.4
Apple M1 Pro
share/texmf-dist/ls-R これって何なん

# 知っている人は知っているだろうが...
随分と以前\(恐らく [www/apache20](https://www.freshports.org/www/apache20) の頃ぐらい\)から、特定の環境下で ports のリフレッシュしおる時に、削除されずに残るファイルがあったんじゃ😒
```text:謎ファイル
/usr/local/share/texmf-dist/ls-R
```
ディレクトリ名から察するに [TeX](https://ja.wikipedia.org/wiki/TeX) 関連ってのは理解できるが、全く持って TeX を触ったことも無く、時間が有れば削除されない理由を調査するか？って程度に思いよってから、問答無用で `rm -f` でバイバイして貰っていた🤣

# 何で出来るんと🤔
Google 先生に聞きおたんじゃが `mktexlsr` コマンドで生成されるっポイ答えが出てきおったけぇ、そのコマンドを含む ports を grep で摘まんでみた。
```shell:つまみは伍魚福😋
find -s /usr/ports/ -depth 3 -name pkg-plist -exec grep mktexlsr "{}" \+
```
```text:検索結果
/usr/ports/print/texlive-base/pkg-plist:bin/mktexlsr
/usr/ports/print/texlive-base/pkg-plist:share/man/man1/mktexlsr.1.gz
/usr/ports/print/texlive-base/pkg-plist:%%TEXMFDISTDIR%%/scripts/texlive/mktexlsr
/usr/ports/textproc/gastex/pkg-plist:@postexec %D/bin/mktexlsr
/usr/ports/textproc/gastex/pkg-plist:@postunexec %D/bin/mktexlsr
```
* print/texlive-base
* textproc/gastex

この二つの ports skeleton が執筆時点での最新 ports collection で見つかった。
# mktexlsr\(1\)のチョイ深掘り
[TeX Wiki](https://texwiki.texjp.org/?TeX%20%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E6%88%90)に拠ると、一覧表の作成と更新の作業ファイル的な一覧を生成しているんと！
TeX 関連の ports をインスコしおると、恐らく生成されたんじゃろ💦
# あっけない結末
てな訳で、TeX 関連の実行ファイルが無くなりおった環境下で残存しおる場合、問答無用で `rm -f` しても桶って事が理解できた👏👏👏
ラジオボタン切り替えでタブのように表示を切り替えるjs

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>花火アニメーション</title>
    <style>
      .display_none {
        display: none;
      }
    </style>
  </head>
  <body>
    <p>
      以下のコードでjs-toggle-displayを取得し（複数あっても対応できるように）、
      js-toggle-display-radioのラジオボタンのcheckedがある要素のdata-displayのクラスを持つもののdisplay_noneクラスを削除し、
      checkedがない場合はdisplay_noneクラスはついたままにしてクリックするたびに表示がかわるようにjqueryで書いてほしい
    </p>
    <div class="js-toggle-display">
      <div class="js-toggle-display-radio">
        <label tabindex="0"
          ><input
            type="radio"
            name="radio"
            data-display="js-toggle-display1"
            checked
          />
          <span>合計</span>
        </label>
        <label tabindex="0"
          ><input type="radio" name="radio" data-display="js-toggle-display2" />
          <span>月別</span>
        </label>
      </div>

      <div class="js-toggle-display1">合計エリア</div>
      <div class="js-toggle-display2">月別エリア</div>
    </div>

    <script>
      document.addEventListener("DOMContentLoaded", function () {
        // 全ての .js-toggle-display を取得してループ処理
        document.querySelectorAll(".js-toggle-display").forEach((container) => {
          // 初期化：checkedのdata-displayに対応するエリアを表示
          updateDisplay(container);

          // ラジオボタンのクリックイベント設定
          container
            .querySelectorAll('.js-toggle-display-radio input[type="radio"]')
            .forEach((radio) => {
              radio.addEventListener("change", () => updateDisplay(container));
            });
        });

        // 表示を更新する関数
        function updateDisplay(container) {
          // 全ての表示エリアを非表示にするが、.js-toggle-display-radioは対象外
          container
            .querySelectorAll(".js-toggle-display1, .js-toggle-display2")
            .forEach((element) => {
              element.classList.add("display_none");
            });

          // チェックされているinputのdata-display属性に対応するエリアのdisplay_noneクラスを削除
          const checkedInput = container.querySelector(
            '.js-toggle-display-radio input[type="radio"]:checked'
          );
          if (checkedInput) {
            const displayClass = checkedInput.getAttribute("data-display");
            const displayElement = container.querySelector(`.${displayClass}`);
            if (displayElement) {
              displayElement.classList.remove("display_none");
            }
          }
        }
      });
    </script>
  </body>
</html>

```
【Flutter/インテグレーションテスト】expectの基本解説

# はじめに

FlutterやDartでアプリを作るときに欠かせないことは、当たり前のことですがちゃんと動くか動作確認することです！
でも毎回やるのはちょっと大変、、、そんな時に便利なのが、自動的にテストしてくれるインテグレーションテスト（統合テスト）です！
そのテストでよく使うのが `expect` です。`expect` を使うと、「ある値」が「期待した値」と同じかどうかをチェックできます。今回は、`expect` の使い方や便利な機能を説明します！

## `expect` の基本ルール

`expect` の基本は、「テストする値」と「期待する条件」をセットで書くことです。


    expect(actual, matcher, reason: 'エラー時のメッセージ');


- `actual`: 実際にテストする値や結果
- `matcher`: 期待する条件や値
- `reason`: テストが失敗したときに出すメッセージ（オプション）

## 基本的な使い方

    
    expect(2 + 2, equals(4));            // 2 + 2が4か？
    expect('Hello Flutter', contains('H'));   // 'H'が含まれているか？
    expect([1, 2, 3], isNotEmpty);       // リストが空じゃないか？
    expect(5, greaterThan(3));           // 数値が3より大きいか？
    

## マッチャーって何？ なぜ必要？

「マッチャー」は、`expect` の条件をもっとわかりやすくするためのものです。

### 1. **何をチェックしているのかがわかりやすい**
    
マッチャーを使うと「何を確認したいのか」が明確になります。
ただの比較よりも、`equals`を使った方が読みやすくなります。
    
    
    expect(2 + 2, equals(4));  // 「2+2が4であること」を確認 
    
    
### 2. **いろんな条件を簡単にチェックできる**
    
マッチャーには`equals`以外にも、範囲や特定の条件をチェックするものがあります。
複雑なテストも短く簡単に書くことができます。
    
    
    expect(score, greaterThan(50));     // scoreが50より大きいか？
    
    
### 3. **エラーの原因がわかりやすくなる**
    
マッチャーを使うと失敗したときのメッセージも具体的です。
どのテストが失敗したかがすぐわかり、修正しやすくなります。
    
### 4. **コードの再利用や修正がしやすい**
    
マッチャーは共通ルールなので、複数の場所で使いやすいことも利点の一つです。
また、独自のマッチャーを作ってテストコードを整理することもできます。
    

## 主なマッチャー

### 1. `equals(expectedValue)`

値が期待通りかを確認します。

```dart
expect(result, equals(10));    // result が 10 か
```

### 2. `isNull` / `isNotNull`
値が`null`（何もない状態）か、または`null`でないかをチェックします。

```dart
expect(value, isNull);          // 値が null か
expect(value, isNotNull);       // 値が null でないか
```

### 3. `contains(element)`

文字列やリストに特定の要素が含まれているかを確認します。

```dart
expect('Flutter', contains('Flut'));    // 'Flutter' に 'Flut' が含まれるか
```

### 4. `isTrue` / `isFalse`

値が`true`または`false`かを確認します。

```dart
expect(isLoggedIn, isTrue);    // ログイン状態が true か？
expect(hasError, isFalse);     // エラー状態が false か？
```

### 5. `greaterThan(value)` / `lessThan(value)`

値が特定の数より大きいか小さいかをチェックします。

```dart
expect(score, greaterThan(70));       // スコアが70より大きいか？
expect(temperature, lessThan(100));   // 温度が100未満か？
```

## まとめ

`expect` を使えば、アプリがちゃんと動くか簡単にテストすることが可能になります！
また、マッチャーを活用することでテストが読みやすく書きやすくなり、失敗しても原因がわかりやすくなるので、テストを作成する際は参考にしてみてください！
picoCTF 2023 writeup useless

## useless (General Skills)

There's an interesting script in the user's home directory The work computer is running SSH. We've been given a script which performs some basic calculations, explore the script and find a flag.

Hostname: saturn.picoctf.net
Port:     58374
Username: picoplayer
Password: password

とりあえず、ssh接続する。
```
$ ssh picoplayer@saturn.picoctf.net -p 58374
picoplayer@saturn.picoctf.net's password: 
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 6.5.0-1023-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Thu Oct 31 00:01:27 2024 from 3.140.102.47
picoplayer@challenge:~$
```
ログインできた。homeディレクトリにあるスクリプトを探索しろとのことである。
```
$ ls
useless
picoplayer@challenge:~$ man useless 

useless
     useless, -- This is a simple calculator script

SYNOPSIS
     useless, [add sub mul div] number1 number2

DESCRIPTION
     Use the useless, macro to make simple calulations like addition,subtraction, multiplication and division.

Examples
     ./useless add 1 2
       This will add 1 and 2 and return 3

     ./useless mul 2 3
       This will return 6 as a product of 2 and 3

     ./useless div 6 3
       This will return 2 as a quotient of 6 and 3

     ./useless sub 6 5
       This will return 1 as a remainder of substraction of 5 from 6

Authors
     This script was designed and developed by Cylab Africa

     picoCTF{us3l3ss_ch4ll3ng3_3xpl0it3d_5657}
```
`man`コマンドは、コマンド、サブルーチン、ファイルなどのトピックに関する情報を提供するコマンドである。

フラグが得られた。

`picoCTF{us3l3ss_ch4ll3ng3_3xpl0it3d_5657}`
203日目 365日後に〇〇する社畜に新メンバー加入：社畜ママ

## 社畜ママ

【**年齢・前職**】   
31歳・SNSマーケティング（広告審査） 

【**学習状況**】  
JavaScript特化の通信スクール卒業
Next.js(DBはFirebase)でシンプルなwebアプリ作成、リリース

【**目標**】  
基本情報技術者試験とAWS SAAを2024年中に取得
言語や技術、フロント・バックエンド問わずなんでも挑戦して爆速成長をめざします！！！！

【**自己紹介**】  
こんにちは！今年からエンジニアの世界に飛び込んだ、社畜ママです！

普段は小さなわが子と一緒にエンジニアとして一歩ずつ成長中！

自宅では、5分に1回の頻度でYouTubeの動画を「電車に変えろ」という要求（すでに電車の動画なのに飽きて違う電車に変えろと言ってくる）に顔を引きつらせながらも「私毎日まじえらい」と自分に言い聞かせて日々資格取得や自己学習に奮闘しています！

やっと子供が寝そう！寝たら勉強の続きするぞ～！とニヤニヤしたのも束の間、パパが「寝てた！！！！」と大きい声で入場して子供はエビぞりギャン泣き！私は心の中で怒り狂いながら寝たふりしてたら、そのまま寝落ち！

そんなドタバタ生活の社畜ママですが、新人ならではの失敗やそこから学んだこと、よかったと思える勉強法などの発信を通して成長していく様を投稿できたらと思っています！

あと、私もお仲間の社畜さんたちみたいにスキルもキャラも強くなりたいので、アドバイスありましたら教えてください～！
これからよろしくお願いします！
【備忘録】Power Apps で録音してみる

## はじめに
超個人的備忘録シリーズ。
これは、Power Apps で録音機能を作ったときのものです。

## 機能
1. まず、Power Apps のオーディオを使って録音します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/ced34309-841a-68f7-59c2-c9affd09a5b5.png)

2. 録音を SharePoint Lists に JSON 形式で保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/77c5a154-f541-daf4-777d-46a18c0b8aa3.png)

3. リストをギャラリーで表示し、録音を聴けるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/95ec0406-bcf1-8628-2532-f45f206e826e.png)

## おわりに
結構単純な感じなので、もうちょっと工夫したいなとは思いますね。
時間見つけて取り組んでみようかな。
[Rust] マクロを書く 1st step

rustにマクロ定義の機能があるので、それを使ってマクロを書きます。

サンプルプログラムは、エラトステネスの篩で、素数を求めるプログラムです。

pops(l)というマクロです。ベクターlからpopして、Noneだった場合は１を返します。

マクロ

```rust:macro.rs
#[macro_export]
macro_rules! pops {
    ($vec:ident) => {
        match $vec.pop() {
            Some(value) => value,
            None => 1,
        }
    };
}
```

ソース

```rust:sieve.rs
use std::env;
mod macro;   // マクロファイルをインクルードする

fn main() {
    let args: Vec<String> = env::args().collect();
    let n=&args[1];
    let n:i32=n.parse().unwrap();
    let f:Vec <i32>=sieve(n);
    let l:i32=f.len() as i32;
    println! ("{:?} : {:?} ",l,f);
}

fn sieve(n:i32)->Vec<i32> {
  let mut tab:Vec<i32>=(2..=n).rev().collect();
  let mut l:Vec<i32>=vec![];
  while !tab.is_empty() {
    let v:i32=pops!(tab);  //ここでマクロを使っている。
    l.push(v);
    tab.retain(|&x| x%v !=0);
    }
  l
}
```


簡単な構成なので、cargoを使う必要がありません。

コンパイル:`rustc sieve.rs`
実行:`./sieve 100`
書籍分類を可視化する：Flaskとvis.jsで実現するネットワーク図

国立国会図書館が付与する件名標目（NDLSH, 書籍に付与されるラベル）の関係性をネットワーク図として可視化し、書籍に関する概念やラベル同士の関係性を視覚的に把握しやすくする新しいサービスを開発しました。このサービスでは、関連する書籍情報も含めて表示し、国立国会図書館サーチへのリンクを通じたダイレクトなアクセスも可能です。

https://ndlsh-nw.vercel.app

# サービス概要
このサービスは、指定した件名標目に関連するノード（他の件名標目）をネットワーク図で表示し、ユーザーが直感的にその関係性を把握できるようにしています。また、特定の件名標目に関連する書籍へのリンクも提供し、国立国会図書館サーチへ直接アクセスできる仕組みを備えています。

![スクリーンショット 2024-10-31 7.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611822/35ad21d1-1f67-8bba-187b-b59530313490.png "「数学」を起点としたネットワーク")


# 技術スタック
* バックエンド : Flask.py
* フロントエンド（ネットワーク描画） : vis.js
* ホスティング : Vercel

# 件名標目間の関係性
件名標目間の関係性には

* 同義語（Synonym）
* 上位語（Hypernym）
* 下位語（Hyponym）
* 関連後（Metonym）

の4つの種類があり、それぞれの関係性に基づき、サービス内でグラフとして可視化しています。
なお、同義語と関連語は対称関係を持ち、上位語と下位語は逆の関係性を持ちます。これは RDF 記法を用いて次のように表現されます。

```turtle
# 同義語・関連語の対称性
# 'A :synonym B.' --> 'B :synonym A.'
# 'A :metonym B.' --> 'B :metonym A.'
:synonym rdf:type owl:SymmetricProperty .
:metonym rdf:type owl:SymmetricProperty .

# 上位語と関連後の逆関係
# 'A :hypernym B.' --> 'B :hyponym A.'
:hypernym owl:inverseOf :hyponym .
```
<details><summary>表記等について</summary>

「トリプル」とは、RDF（Resource Description Framework）でデータを表現するための基本単位で、**「主語（subject）」「述語（predicate）」「目的語（object）」** の3つの要素から成り立つ文のことです。この3つの要素を1組にして表現するため、「トリプル（三重）」と呼ばれます。

例えば、「リンゴは果物である」という情報をトリプルで表すと次のようになります。

主語（subject）：リンゴ（apple）
述語（predicate）：果物である（is a type of）
目的語（object）：果物（fruit）
このトリプルは次のように表現されます： 「apple is a type of fruit」

トリプルの記法の一つが`Turtle`と呼ばれるものです。これは主語・述語・目的語をこの順番に並べて書いたものであり，主語・述語は名前空間に定義されます．
「apple is a type of fruit」をTurtleで記述すると次のようになります．
```turtle
# 名前空間の定義
@prefix things:<SOME_URI> .
@prefix rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

# トリプルの記述
things:Apple rdf:typeof things:Fruit.
```

RDFでデータを記述する際、トリプルは単独の文としての意味だけでなく、他のトリプルと組み合わさることで知識のネットワークを形成し、データ間の関係性を表現します。このネットワークがグラフとして視覚化され、データを直感的に理解する助けになります。
</details>

# 可視化の先を見据えて
今回は件名標目の関係性に着目してネットワークを定義・可視化しました。国立国会図書館が一般公開している件名標目は実際のごく一部ですが、同様のアイデアを用いることで多数の概念同士を関係性で繋ぎ、大きなネットワークを作ることもできます。
これはナレッジグラフと呼ばれるものであり、Googleの検索エンジンや昨今話題のRAGにも組み込まれつつあります。

https://www.rd.ntt/se/media/article/0025.html

また、ナレッジグラフを検索するクエリとしてはSPARQL（SPARQL Protocol and RDF Query Language）が、データベースサービスとしてはAmazon Neptuneなどが提供されています。

https://aws.amazon.com/jp/neptune/

今回実装したネットワークの可視化だけでなく、生成AIとの連携や推論など、さまざまな方向に利活用が進んでいくことを期待しています。
Language Reference

[Previous << 10. Composable Resources](https://qiita.com/flowcadence/items/729d4317f64df7882783)
[Next >> Syntax](https://qiita.com/flowcadence/items/29b0617fdfbf652c5425)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#cadenceの言語仕様を学ぶ

<h1>The Cadence Programming Language</h1>
<h1 id="Introduction">Introduction</h1>

Cadenceプログラミング言語は、スマートコントラクト開発を目的とした新しい高レベルプログラミング言語です。

この言語の目標は、重要度の順に以下の通りです。
* **安全性とセキュリティ**：強力な静的型付けシステム、コントラクトによる設計（前提条件と事後条件）、リソース（Linear Typeに着想を得た）を提供します。
* **可監査性**：可読性に重点を置きます。コードが何をしているかを簡単に検証でき、意図を明示でき、冗長性をほとんど犠牲にしません。
* **シンプルさ**：開発者の生産性と使いやすさに重点を置きます。コードを簡単に記述でき、優れたツールを提供します。

<h1 id="Terminology">Terminology</h1>

この文書では、言語で許可されていない構文や動作を説明するために、以下の用語を使用します。
* `Invalid`とは、無効なプログラムは実行さえ許可されないことを意味します。(補足: 翻訳文書中では`無効です`または`出来ません`と表示されます)プログラムエラーは型チェッカーによって静的に検出され報告されます。
* `Run-time error`とは、エラーのあるプログラムは実行されるものの、プログラムの実行が中断されるような好ましくない動作が発生することを意味します。

<h1 id="Syntax-and-Behavior">Syntax and Behavior</h1>
この言語の構文の多くはSwift、Kotlin、TypeScriptから着想を得ています。

構文、型、標準ライブラリの多くはSwiftにインスパイアされており、オプショナル、引数ラベルなどを普及させ、整数値や文字列の安全な処理を提供しています。

リソースはRustで普及したLinear Typesに基づいています。

イベントはSolidityにインスパイアされています。

**免責事項**：実際のCadenceコードでは、すべての型定義とコードは[スマートコントラクト](https://qiita.com/flowcadence/items/91a5ecb5812af1f98bef)または[トランザクション](https://qiita.com/flowcadence/items/0d73ce09c9da04d8b697)で宣言および格納する必要がありますが、例では簡略化のためこれらのコンテナを省略しています。

翻訳元

https://cadence-lang.org/docs/language/

***
<b>[Previous << 10. Composable Resources](https://qiita.com/flowcadence/items/729d4317f64df7882783)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Language Reference)

<b>[Next >> Syntax](https://qiita.com/flowcadence/items/29b0617fdfbf652c5425)</b>
S3の転送速度って、、、どんぐらい？こんぐらい

# はじめに
某ベンダで、クラウドの人材育成企画と研修トレーニングのデリバリを担当しています。
先日、講義の中に受講者の方から「パブリック回線を利用したS３への転送速度って、性能の目安はどのくらい？」と質問を頂きました。通常、10TBを超えると大量データの移行はAWS Snowball使いましょう、と講義では教えているのですが、実際にS3の性能を測ったことがなく解答にモゴモゴしちゃいました。世の中に色々と実測情報は出ていますが、折角なので、自分で計測してみるとにしました。

# 前提環境
仕事でお借りしている、某サテライト事務所のwifi環境を利用します。
USENの回線スピードテストで測定してみました。

https://speedtest.gate02.ne.jp/

>[ネットワーク]
`DOWN LOAD：25Mbps`
`UPLOAD: 21Mbps`


>[クライアント環境]
Ubuntu Server 24.10 (MacBook Air（M2）上の仮想VM)

>[S3]
東京リージョン
シドニーリージョン

# 評価手順

## 1.　aws-cliのインストールと設定
Ubuntu Serverを利用したので、aptコマンドを利用します。依存関係を解決して`aws-cli`をインストールします。便利ですねー、以前はパッケージを個別に入手してたハズが本当に楽になりました。インストール後に`aws configure`で、各種設定を行います。

```
# apt install awscli
# aws --version
aws-cli/2.17.3 Python/3.12.7 Linux/6.11.0-9-generic source/aarch64.ubuntu.24
# aws configure 
# aws configure list
```

## 2. アップロード転送用にデータの作成
乱数生成機能を利用して、アップロード転送用に500MB、100MBのデータをそれぞれ作成します。本当はGB単位で転送データを作りたいのですがディスク容量が少ないので、小さなデータで実験します。

```
# dd if=/dev/random of=500_data  bs=1M count=500
# dd if=/dev/random of=100_data_3  bs=1M count=100
```


## 3. S3の作成とファイルのアップロード評価
`aws cli`のコマンドラインで、500MBのデータと100MBのデータをそれぞれアップロードしてtimeコマンドで時間を計測します。

<!-- コメントアウトしたい内容 

### ○ 6GBBのデータをアップロードした場合
```
# time aws s3 cp 6000_data s3://{東京リージョンのバケット名}
upload: ./6000_data to s3://{東京リージョンのバケット名}/6000_data

real	5m33.144s
user	0m7.945s
sys	0m5.217s


# time aws s3 cp 6000_data s3://{シドニーリージョンのバケット名}
upload: ./6000_data to s3://{シドニーリージョンのバケット名}/6000_data

real	16m3.070s
user	0m24.130s
sys	0m16.479s
```
-->

### ○ 500MBのデータをアップロードした場合
```
# time aws s3 cp 500_data s3://{東京リージョンのバケット名}
upload: ./500_data to s3://{東京リージョンのバケット名}/500_data

real	3m23.277s
user	0m6.374s
sys	0m4.306s

# time aws s3 cp 500_data s3://{シドニーリージョンのバケット名}
upload: ./500_data to s3://{シドニーリージョンのバケット名}/500_data

real	5m33.144s
user	0m7.945s
sys	0m5.217s
```

### ○ 100MBのデータを順次アップロードした場合
```
# time aws s3 cp 100_data_1  s3://{東京リージョンのバケット名}
upload: ./100_data_1 to s3://{東京リージョンのバケット名}/100_data_1

real	0m31.305s
user	0m1.425s
sys	0m1.243s

# time aws s3 cp 100_data_1  s3://{シドニーリージョンのバケット名}
upload: ./100_data_1 to s3://{シドニーリージョンのバケット名}/100_data_1

real	1m39.429s
user	0m1.753s
sys	0m0.934s
```
## [トラブル発生] 時刻ズレのエラーが出てしまった
実測中に以下のトラブルが出てしまいました。
```
An error occurred (RequestTimeTooSkewed) when calling the CreateMultipartUpload operation: The difference between the request time and the current time is too large.
```
仮想VMの時間設定をサボっていたので、時間ズレが発生してしまったようです。
`timedatectl`コマンドでクライアント側の時刻を合わせて、無事に問題解決しました。

```
# timedatectl set-timezone Asia/Tokyo
# date
Thu Oct 31 07:22:36 JST 2024
```

# おわりに
リージョンで比較すると、想定通り、近隣のリージョン>>遠方のリージョンで性能差が出ていました。ネットワーク環境がそんなに良いものではなかったのですが、もう少し速度の出る環境だと1GB/分くらいアップロードの性能が出てもおかしく無さそう、かなと思います。数テラ単位のデータ転送だと、十分S3へのネットワーク転送でも要件は満たせそう。実は朝と深夜で性能評価したのですが、時間帯でも性能に大分揺れがありました。パブリック回線を使う限り、混まない時間帯を利用することが鉄則ですね。

今回、実測は淡々と進んだのですが、MackBook Air(M2)に何の仮想化機構を使うか悩んでしまいました。Intel Mac時代にVirtual Boxが秀逸だったので長年利用していたのですが、今回を機会にVMware Fusionに仮想化機構を引っ越ししました。VMware Fusionって、今年の春先から無償で利用できるようになったんですね。まだまだ修行です。