OmniAICreator/Qiita-1.07M huggingface dataset:
アドベントカレンダー3日目

# 2つ目　湿度チェックアラーム

# きっかけ
　室内の湿度は温度と同じくらい重要であると、私は思っています。湿度が低すぎると、肌の乾燥や粘膜の乾燥による感染症になるリスクが適正値より増加してしまいます。逆に多湿だと、カビやダニの繁殖の増加や、体調不良や熱中症のリスクが増加する。適切な値でないと、弊害が多く生まれてしまいます。
 　ですが、外の湿度はスマホで検索すればすぐに出てくるようになっていますが、部屋内の温度は温湿度計が無い限り対処の仕様がありません。多湿はともかく低湿の場合は自身では気が付きにくく、対策が必要なのではないかと考えました。
  
### 初期案は温度計のみだった
　初期の案としては、室内の温度と自身が住んでいる市の天気を表示させるシステムを考えていました。これは、私の部屋には今テレビが無く、朝急いで出る際に天候を確認せずに出ることがあったため、スマホでの検索の手間を省こうとした結果の案でした。
 ですが、これではスマホの方が早いためわざわざM5Stackを起動させる手間の方が大きいと指摘を受け、改良する必要がありました。普段の生活を見直してみた結果、室内の湿度を測ることができたら便利になるのではと考えて、湿度計を追加することにしました。

# 実際作ってみる
 使用したのは、M5Core2、DHTセンサー、BUZZERセンサーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/dce13062-b0ee-6e32-10e1-9ec6788c34aa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/8edc5f62-a5ea-7517-10b5-278417fd60c2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/80ac7314-f7bd-afe4-495d-a4ed9c1f0410.png)

# プログラム

~~~Arduino:humidity.ino
#include <M5Core2.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 26
#define DHTTYPE DHT11
#define BUZZER_PIN 25

DHT dht(DHTPIN, DHTTYPE);

const float lowHumidityThreshold = 30.0; // 湿度の下限閾値
const float highHumidityThreshold = 70.0; // 湿度の上限閾値

void setup() {
M5.begin();
dht.begin();
M5.Lcd.setTextSize(2);

pinMode(BUZZER_PIN, OUTPUT);  // BUZZERピンを出力モードに設定
}

void loop() {
float h = dht.readHumidity();   // 湿度を測定
float t = dht.readTemperature(); // 温度を測定

// センサーが正しく読み取れない場合の処理
if (isnan(h) || isnan(t)) {
M5.Lcd.setCursor(0, 0);
M5.Lcd.println("Failed to read from DHT sensor!");
return;
}

// 画面の表示を更新
M5.Lcd.clear();
M5.Lcd.setCursor(0, 0);
M5.Lcd.printf("Temperature: %.1fC\n", t);
M5.Lcd.printf("Humidity: %.1f%%\n", h);

// 湿度が範囲外の場合、アラームを鳴らす
if (h < lowHumidityThreshold || h > highHumidityThreshold) {
M5.Lcd.setCursor(0, 40);
M5.Lcd.println("ALARM: Humidity Threshold Exceeded!");

// BUZZERを使って音を鳴らす (1000Hzで500ms鳴らす)
tone(BUZZER_PIN, 1000);  // 1000Hzの音を鳴らす
delay(500);              // 500ms待つ
noTone(BUZZER_PIN);      // 音を止める
}

delay(20000); // 20秒ごとに測定を更新
}
~~~

　開発環境はArudino、プログラムは、ここを参考にしたりしました。
[M5Stack GitHub](https://github.com/m5stack)

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/c6d46977-e91e-79fd-9308-23fc14f6e929.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/5333eee5-a10f-a78b-c7c8-d3a3e88a5fd2.png)

　起動すると、温度と湿度が出るようになっています。湿度が範囲外になるとBUZZERが鳴るようになっています。
Amazon EBS が EBS スナップショットの時間ベースのコピーを発表

# Amazon EBS「時間ベースのコピー」機能の発表

- EBSスナップショットのコピー操作において、指定した時間内に完了可能な新オプション。
- **15分から48時間**の範囲で完了時間を指定可能。
- 災害復旧、データ移行、コンプライアンス要件における信頼性の向上。
- **AWSのすべての商用リージョン**および**AWS GovCloud（US）**で利用可能。
- AWSコンソール、CLI、SDKからのアクセス対応。


# テスト
スナップショットの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/960d571b-5589-3ae8-6ee6-36353b3a468b.png)
コピー時に時間ベースのコピーを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/d8a2bf51-5206-6fae-092e-a3c54e72a907.png)
15分から48時間の間で指定可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/3e0954e2-c788-cc2f-45f9-2251a661442c.png)
過去のデータを基に推定可能するツールも提供されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/47857552-669b-962f-adc4-550723090d7f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/00782f24-b597-8fb4-5edd-a6bc27a205a0.png)

# コピー操作のクォータ
単一の時間ベースのスナップショットでコピー操作で達成できる最大スループット。	
500MiB/秒

ソースリージョンと宛先リージョン間の同時時間ベースのスナップショットのコピー操作によって達成できる最大累積スループット。	
2,000 MiB/秒（調整可能）

必要なスループット レート以上の場合、コピーは要求された完了期間内に完了します。
必要なスループット レートより小さいが 0 より大きい場合、要求は成功しますが、要求したよりも時間がかかります。コピーは、使用可能なスループット クォータを使用して完了します。
ゼロ（割り当て量に到達）の場合、リクエストは失敗します。


# 料金
15 分 — データ 1 GiB あたり 0.020 ドル
30 分と 45 分 — データ 1 GiB あたり 0.018 ドル
1 時間～1 時間 45 分 — データ 1 GiB あたり 0.016 ドル
2 時間～3 時間 45 分 — データ 1 GiB あたり 0.014 ドル
4 時間～7 時間 45 分 — データ 1 GiB あたり 0.012 ドル
8 時間から 15 時間 45 分 — データ 1 GiB あたり 0.010 ドル
16 時間以上 — データ 1 GiB あたり 0.005 ドル
たとえば、3,000 GiB のデータを含むスナップショットを 8 時間でコピーした場合、30 ドル (0.010 ドル x 3,000 GiB) が請求される。
.gitignoreに記載がないのに特定のファイルが無視される現象

# .gitignoreに記載がないのに特定のファイルが無視される現象について

Gitを使用していると、`.gitignore` に記載がないにもかかわらず、特定のファイルが無視される現象に遭遇することがあります。この問題の原因の1つとして、**大元の `.gitignore_global`** というファイルの存在が挙げられます。

## `.gitignore_global`とは？

`.gitignore_global` は、すべてのGitプロジェクトに対して適用されるグローバルな `.gitignore` ファイルです。このファイルに記載されたルールは、どのリポジトリにも影響を与えるため、`.gitignore` に記載がなくてもファイルが無視される原因となる場合があります。

## 私の体験談

ある日、`.css` ファイルがGitに認識されない現象に直面しました。プロジェクトの `.gitignore` ファイルを確認しても、該当する設定は見当たりませんでした。しかし、どうやっても `.css` ファイルが追跡対象にならず、この問題で丸一日悩みました。

### 原因

調査の結果、私の環境では **`.gitignore_global` に `.css` の記載があった** ため、すべてのリポジトリで `.css` ファイルが無視される状態になっていました。

## 解決方法

以下の手順で `.gitignore_global` を確認し、該当するルールを削除することで解決しました。

### 手順

1. **ホームディレクトリに移動する**
   ```bash
   cd ~
   ```

2. **`.gitignore_global` を編集する**
   ```bash
   vi .gitignore_global
   ```

3. **該当する行を削除する**
   `.css` に関連するルールを削除してください。

4. **変更を保存して終了する**

5. **Git設定を再確認する**
   念のため、グローバルな `.gitignore` の設定が適用されているか確認します。
   ```bash
   git config --get core.excludesfile
   ```
   正しいパスが表示されるか、空欄になっているかを確認します。

## まとめ

- `.gitignore_global` はすべてのGitプロジェクトに影響を与える設定ファイルです。
- 特定のファイルが `.gitignore` に記載がないのに無視される場合、まずこのファイルを確認することをおすすめします。
- 問題解決の手順は以下の通り：
  1. ホームディレクトリに移動
  2. `.gitignore_global` を編集
  3. 該当行を削除
  4. 設定を確認




## 参考
[alakiブログ](https://alaki.co.jp/blog/?p=2582)
Androidの定期購入の作成とテスト手順について

:::note info
この記事は [ZOZO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/zozo) カレンダーのシリーズ10の5日目の記事です。
:::

Androidアプリへのサブスクリプション（定期購入）の導入について調べたので、用語や注意点について備忘録としてまとめます。Androidで定期購入を実装するコードについてではなく、定期購入の用語や作成手順について書いてます

## 定期購入とは
Google developersでは以下のように定義されています。

> 定期購入は、指定された期間にユーザーが利用できる特典のセットを表します。たとえば、定期購入により、ユーザーは音楽ストリーミング サービスの利用資格を獲得できます。
同じアプリ内に複数の定期購入を設定して、異なる特典セットや、単一の特典セットの異なる階層（シルバー階層、ゴールド階層など）を提供できます。
基本プランと特典を使用して、同じ定期購入アイテムについて複数の構成を作成できます。たとえば、アプリを定期購入したことがないユーザーを対象とするお試し特典を作成できます。同様に、すでに定期購入しているユーザーを対象とするアップグレード特典を作成できます。

https://developer.android.com/google/play/billing/subscriptions?hl=ja

ここで「基本プラン」や「特典」について見ていきます。

- 定期購入: 指定した期間にユーザーが利用できる特典を規定します
- 基本プラン: 定期購入の請求対象期間、更新の種類（自動更新または前払い）、料金を規定します。1 つの定期購入に複数の基本プランを設定できます
- 特典: 対象ユーザーに提供する割引を規定します。1 つの基本プランに複数の特典を設定できます

親子関係は下の図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/bc5435ae-ac25-18f7-7be7-a6a163813ff3.png)

定期購入とは、指定された期間にユーザーが利用できる一連の特典です。定期購入には1つ以上の基本プランが含まれており、特定の請求対象期間を指定します。また、ユーザーは特典を購入することで、定期購入を割引価格で利用できるようになります。

- 定期購入(Subscription)
  - アイテムID
    - アプリ固有のIDである必要がある
    - <font color="Red">作成後に変更したり、再利用したりすることはできない</font>
    - 先頭は必ず数字または小文字にしてください。アンダースコア（_）、ピリオド（.）も使用できます。アイテム ID は半角 40 文字以内です
  - 名前
      - 半角 55 文字（全角 27 文字）以内
      - ユーザー向けのメールや定期購入センターには、この名前が表示される
- 基本プラン(Base plan)
    - 基本プラン ID 
        - 定期購入内で固有である必要がある
        - 基本プラン ID の先頭は必ず数字または小文字にしてください。数字（0～9）、小文字の英字（a～z）、ハイフンを使用できます
        - <font color="Red">基本プランが有効になった後で変更したり、再利用したりすることはできません</font>
- 特典(Offer)
    - 作成できるのは、自動更新の基本プランに対する特典のみ


**作成例**

1つの定期購入に複数の基本プランを用意できます。たとえば、「プレミアム メンバーシップ」という 1 つの定期購入について、次のような基本プランを作成できます。

- 月単位の自動更新の基本プラン
- 月単位のプリペイドの基本プラン
- 年単位の自動更新の基本プラン


## 定期購入の作成手順
Google Play Console上での定期購入の作成手順を紹介します

1. Google Play Console にログインし、アプリを選択
2. 収益化 > 商品 > 定期購入 に移動
3. 定期購入を作成をクリック
4. アイテムID と名前を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/60fac382-9f9a-3dda-ffab-8dea389a3a18.png)
:::note warn
アイテムIDは一度作成すると変更・削除ができないため要注意
:::
5\. 基本プランを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/22788da0-7cc8-2b0e-bdb2-75181e3b7bce.png)

:::note warn
基本プランIDは一度作成すると変更・削除ができないため要注意
:::
6.作成した基本プランを有効化する

## 定期購入のテストについて
ライセンステスターを設定することで、実際の課金を行わずに定期購入のテストを行うことができます。

https://developer.android.com/google/play/billing/test?hl=ja#license-testers

ライセンステスターの登録はGoogle Play Consoleから行えます。

ライセンステスターに登録済みのアカウントから定期購入の購入導線を辿るとテストカードでの購入ができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/87861eea-86fc-cea0-aa71-2ed5c008a529.png)

:::note warn
- アプリをオープンテスト版、クローズド テスト版、内部テスト版、または製品版のトラックに公開する必要があります。公式ドキュメントでは、内部テスト版を推奨しています
    - パッケージ名は、Google Play 用に構成されたアプリのパッケージ名と一致する必要がある。そのためdebugビルドで確認する場合はdebugビルドをテスト配信する必要があります
- 動作確認を行うAndroid端末でもライセンステスターに登録したアカウントでログインする必要がある
:::

## 終わりに
ざっくりですが、Androidでの定期購入の作成手順とそのテスト方法をまとめました。Androidアプリでの定期購入の導入について調べている方の参考になれば幸いです
バナー作成について考えてみた

こんにちは。TRAILBLAZERでPdMをしています浦上です。9月に入社して、現在はWESTERアプリの開発や新規サービスの企画に関わっています。

普段はプロダクトの機能開発をメインに担当することが多いのですが、今回WESTERアプリに掲載するバナー改善を担当する機会をいただきましたので、バナー作成について記事を書いてみたいと思います。

# バナー作成の基本ポイント
バナー作成の基本ポイントは様々な記事でも紹介されていますが、その中から私が重視したポイントを紹介します。デザインはデザイナーさんが担当、私は情報構成や訴求内容の検討をしました。

### 伝えたい情報を決める
バナーは限られたスペースでユーザーの興味を引きつけなければならないため、情報の取捨選択が重要です。「一番伝えたいメッセージは何か？」を明確にする必要があります。
### メリハリを考えて情報を配置
キャンペーンの条件等を正しく伝える必要がある場合、注釈含め記載が必要な情報が多くなります。情報が多すぎて伝えたいことが埋もれてしまわないように、必要最低限の情報に絞りつつ、視覚的に目を引くバナーに仕上げることが大事で、情報の優先順位を決めて配置を考えます。
### 配置する場所とのバランス、ユーザーの視線を想像してチェック
できあがったバナーを実際の配置場所においてみて、全体のバランスやユーザーの目に止まるかどうかをチェックします。

# 訴求方法を変えてみる
担当したうちのひとつ、WESTERポイント1,000ポイントで新幹線のグリーン車にアップグレードできるポイント商品があります。このケースでは、「快適さを訴求するパターン」と「お得さを訴求するパターン」の2種類のデザインを作成しました。それぞれの狙いをご紹介します。

### パターン1：快適さ訴求
グリーン車の魅力は何か？調べた結果、多くの人が「広々とした空間」や「静かな環境」といった理由でグリーン車を選んでいることが分かりました。アンケート結果からもこれが裏付けられたため、この要素を押し出すデザインを採用しました。新幹線を利用する方に向けて、グリーン車に乗る動機を持ってもらえるように、実際のグリーン車の座席写真を使用し、視覚的に快適さを伝えることを重視しました。

![IMG_Android.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932355/66007679-4d4e-9fe3-94ec-ef80b2badcf1.png)


### パターン2：お得さ訴求
1,000ポイント(=1,000円相当)でグリーン車にアップグレードできると言われても、どれくらいお得なの伝わらないのではという仮説を考えました。グリーン車に乗ったことがない私自身、グリーン車の通常のお値段がどれくらいで、1,000円相当で乗れることがどの程度「お得」なのか具体的な金額イメージを持っていませんでした。そこで、具体的なお得さを示すことを検討。実際にお得になる金額を全面に出すことで、どれだけお得なのか即座に理解できるようにしました。

# 今後の検証
今後、この2つのバナーデザインを使って、どちらが高いコンバージョン率(CVR)を達成するかを検証していきます。どういった結果が出るのか、実際のデータが楽しみです。テストを繰り返しながら最適解を探していきたいと思っています。

# 【※おまけ】WESTERポイントアップグレード(グリーン)の紹介
WESTERポイント1,000ポイントを使って山陽新幹線のどの区間でもグリーン車にアップグレードできます。例えば「新大阪〜博多」で利用する場合、約6,000円もお得になるんです。
せひチェックしてみてください！
https://www.jr-odekake.net/goyoyaku/e5489/westerpoint-use/#use02

-----------------
https://hrmos.co/pages/trail-blazer
[misc] file magic (SH365CTF) writeup

---

- Source: SH365CTF
- Author: [singetu0096](https://x.com/fubukiyokiyoki)

 ※ SH365CTFは[SecHack365](https://sechack365.nict.go.jp/)（2024 4th Event Week）にて、有志によって非公式に開催されたCTFです。

---

以下のスクリプトが動いている。flagは`/flag`に書いてあるらしい。
```sh
read -p "Input a file path: " filepath

if echo "$filepath" | grep -q "[flag]"; then
    echo "You can't use 'f','l','a','g'" #You can't read the flag!
else
    file $filepath
fi

exit 0
```

`$filepath`に対して任意の文字列を入れることができる。ただし、`/[flag]/`は使えない。

しばらくスクリプトを眺めていると、if句では`"$filepath"`とダブルクオーテーションで囲っているのにelse句では`$filepath`と囲っていないことに気付いた。すなわち、オプション付きでfileコマンドを実行することができる。
```
Input a file path: piyo
piyo: ASCII text, with no line terminators
---
Input a file path: -b piyo
ASCII text, with no line terminators
```

fileコマンドのオプションについて調べてみると、`-f`というオプションでファイルをリストとして渡せるらしい。そしてファイルが見つからない場合、ファイルの中身がエラーとして出力される。これは使えそう。
```
$ file -f piyo
hoge:         cannot open `hoge' (No such file or directory)
hogefuga:     cannot open `hogefuga' (No such file or directory)
hogefugapiyo: cannot open `hogefugapiyo' (No such file or directory)
```

しかし、`-f`は弾かれてしまうので同様にファイルの中身を出力できる他のオプションを探す。

調べていると`-m`というマジックファイルを指定するためのオプションを発見した。これも`-f`と同様エラーを出力する。
```
$ file -m piyo *
piyo, 1: Warning: offset `hoge' invalid
piyo, 2: Warning: offset `hogefuga' invalid
piyo, 3: Warning: offset `hogefugapiyo' invalid
file: could not find any valid magic files! (No such file or directory)
```

これを使って、`/[flag]/`を使わずに`/flag`を読み出してあげれば良い。
```
Input a file path: -m /[e-h]??? /*
/flag, 1: Warning: offset `SecHack365{f113_57r4n63_m461c}' invalid
```

flagが得られた。
`SecHack365{f113_57r4n63_m461c}`
（英語）チュートリアル系 YouTubeチャンネル と Udemy

## はじめに

案件で、初めて使う言語やフレームワークだったり、久しぶりなものを使う場合、案件前 1〜2 週間くらいで、知識を Install/Update する。その際、公式ドキュメントと YouTube, Udemy のどちらかに潜ることが多い。設計とかなら書籍を読むこともあるが、Handson な YouTube, Udemy のチュートリアルは、非常に分かりやすい。

今回は、これまで見てきた中で、楽しかった、主に初心者向けの動画コンテンツを紹介したい。全部英語だが、プログラミングの英語は、筋トレ英語くらい限られていて簡単だし、コードも見ながらなので全然分からないということは、きっとない。ついでに英語学習もできちゃう。1度で2度美味しい。

## コンテンツの選び方

紹介の前に、教材、コンテンツの選び方は、後でリファレンス的に使えるようになっているものが良い。案件で機能を実装する際に、あぁあそこで似たようなことやったなと思い出せるようなもの。人は何でもかんでも覚えていられないので、結局のところ、知識の Index 作りができれば良い。と私は思う。

アプリやシステムを作り上げていく過程で、必要なスキルを学んでいけるのが良い。そういうのをうまくチュートリアルに組み込める人がいるんですよ、世の中には。

という訳で、発音の癖がすごくなく、教え方がうまく、題材が面白いものをオススメしていく。YouTube を見て、良いなと思ったら体系的にまとまったコンテンツに課金すれば良い。スクールに通ったり、本を買うことを考えれば、オンラインコンテンツは、いまのところメチャクチャ安い。

なお、活発な OSS の場合、どのバージョンかによってだいぶ違ったりするので、課金する前に、対象としているバージョンは必ず確認しよう。

## （基礎）JavaScript: DevEd

https://www.youtube.com/@developedbyed

JavaScript 入門, HTML+CSS 入門、React など。

実際に素の JavaScript（Vanilla JS）を書くことは滅多にないが、基礎大事。これ以上分かりやすい説明ないんじゃないの？と思うくらい分かりやすかったので、非常にオススメ。

https://developedbyed.com/

なんか、一時期病んでる感があったけど、乗り切ったようで何よりです。

## （応用）Next.js: Dave Gray

https://www.youtube.com/@DaveGrayTeachesCode

全部無料。中でも、Next.js のチュートリアルが充実しており、Next.js でみんながやりたいことは、だいたい揃っている。情報も早いし、分かりやすい。

たぶん、これまで一番お世話になった。

## （基礎）SwiftUI: Kay Jay

https://www.youtube.com/@kayjayapps

YouTube はあんまりやる気がないらしく、Udemy に課金する前に、なんとなく雰囲気はつかめるかも程度に、1本動画を見てみよう。

https://www.udemy.com/share/105Kw03@B-m34pq0sIhr6R6ClVihjil9fN0RZ-h_f-Ya1Dz-xfv_e1jhidZFoBAdgGZwPKPtRQ==/

Storyboard ではなく、SwiftUI で開発する場合、思いの外コンテンツを探すのが難しいが、この Udemy のコースには必要なものはすべて詰まってる。リファレンスに最適。説明が丁寧で分かりやすいのだが、何より題材が面白い。ジュラシック・パーク、ブレイキング・バッド、ポケモン、ハリー・ポッター。

## （応用）SwiftUI: AppStuff

https://www.youtube.com/@appstuff5778

Tinder 作っちゃうの！？笑 スワイプってこうなってんのか。
MVVC な構成が整理されていて美しい。参考になる。まずは自分で Clone を試みて、これってどうやってんの？となってからやると良い。

https://www.stephancodes.com/

Tinder, Instagram, Uber, AirBnB, TikTok… のクローンなどのコースがある。うける。現在 Black Friday セール中。急げ！

## （番外編）Honeypot

https://www.youtube.com/@Honeypotio

Tech 系のインタビューなドキュメンタリー。Node.js, React.js, Vue.js, RoR, kubernetes...

喋る言語と同様、プログラミング言語やフレームワークをうまく操るには、背景にあるカルチャーを理解することがとても大事。あー、こういうの見たかったんよー！ってなった。（いまどき、エンジニアにはこんなエディティング力も求められるのか…とも思った）

## 英語に太刀打ちできなかった人は…

多読して出直すよろし。

[IT人材向け英語学習のススメ 〜 冬休みの読書課題](https://qiita.com/kurab/items/ca6f21871c5f01a5d429)

英語の本を読むのが続かないという人は、Audible で聞きながら読むという方法をオススメする。耳も良くなるし、なんなら発音も良くなる。たぶん、アメリカ英語よりもイギリス英語（Received Pronunciation）の方が読みやすいし、聞き取りやすい。 

英語ができることの一番のメリットは、莫大な量の優良コンテンツ・ドキュメントを参照できるようになることです。頑張りましょう。


みなさんのオススメあったら、是非、教えて下さい。
Terraformのlifesycleについてまとめてみる

# はじめに
この記事では三ヶ月ほどTerraformに触れてきた人間が、Terraformにおけるlifesycleついてまとめていく記事である。

# lifesycleとは
Terraformリソースの中でライフサイクルルールを定義するために用いるものである。
対象となるリソースに記載することで、そのリソースに何か変更が発生した場合の挙動を制御することができる。
[公式ドキュメント](https://developer.hashicorp.com/terraform/language/meta-arguments/lifecycle)でも詳細に記載されているがこの内容をまとめていく。
現在のversionまでに4つのlifesycleが存在する。

- create_before_destroy
- prevent_destroy
- ignore_changes
- replace_triggered_by

上の四つについて説明していく。

## create_before_destroy
create_before_destroyは新しいリソースを作成してから古いリソースを削除するようにするルールである。
ゼロダウンタイムの更新が必要だったりする場合に使用する。
ただし、一時的にリソースが重複するため特定の名前が被ってしまう等同時に存在できないリソースを扱う場合には注意する必要がある。

```
resource "aws_instance" "example" {
  ami           = "ami-12345"
  instance_type = "t2.micro"

  lifecycle {
    create_before_destroy = true
  }
}
```

## prevent_destroy
prevent_destroyはリソースの破棄を防止するルールである。
`terraform destroy`コマンドを行った際などにこのルールを付与しているリソースは破棄されない。
ただ、terraform経由ではない操作を防止することはできないのでその場合には別途設定が必要になる。
Production環境のリソースだったり重要なリソースの保護に用いることができる。

```
resource "aws_instance" "example" {
  ami           = "ami-12345"
  instance_type = "t2.micro"

  lifecycle {
    prevent_destroy = true
  }
}
```

## ignore_changes
ignore_changesでは指定した属性の変更をterraformの管理対象から除外するものである。
これは外部での変更や動的な変更を許容するということであり、例えば自動スケーリングによる変更などが行われるリソースにはこのルールを適応すると良いのだと思う。

```
resource "aws_instance" "example" {
  ami           = "ami-12345"
  instance_type = "t2.micro"
  tags = {
    Stage = "Integration"
    Project = "hogehoge"
  }

  lifecycle {
    ignore_changes = [
      tags
    ]
  }
}
```
ちなみに全ての属性を一括で無視したい場合には`ignore_changes = all`のようにも記述することができる。

## replace_triggered_by
このルールはTerraform 1.2で導入された新機能であり、指定したリソースの変更時にこのルールを記述したリソースを再作成するというものである。

```
resource "aws_instance" "example" {
  ami           = "ami-12345"
  instance_type = "t2.micro"

  lifecycle {
    replace_triggered_by = [
      aws_key_pair.example.public_key,
    ]
  }
}
```

例えば上のような例だと、awsのキーペアに変更が生じた場合に`aws_instance.example`は再作成が行われる。
依存関係のある設定変更の更新時や、セキュリティ更新、バージョンアップデート時の確実なリソース更新等に用いることができる。

## lifesycleの組み合わせ
これらは一つしか設定できないわけではなく複数を組み合わせて設定することも可能である。
状況に応じて使い分けていい感じのインフラ管理をできるようコードを書いていこう。

```
resource "aws_instance" "example" {
  ami           = "ami-12345"
  instance_type = "t2.micro"
  tags = {
    Stage = "Integration"
    Project = "hogehoge"
  }

  lifecycle {
    create_before_destroy = true
    ignore_changes = [tags]
    replace_triggered_by = [aws_key_pair.example.public_key]
  }
}
```

# 参考文献
- https://developer.hashicorp.com/
- https://amegaeru.hatenablog.jp/entry/2023/08/14/000000
- https://dev.classmethod.jp/articles/terraform_ignore_changes/
Advent of code 2024 Day 3 Part 1 & Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 Day 3 の Part 1 と Part 2 を解きます

問題文はこちら

https://adventofcode.com/2024/day/3

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2024/2024_day3_part1.livemd

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2024/2024_day3_part2.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 3 の入力を取得します

![スクリーンショット 2024-12-03 15.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/f463d720-fe37-1859-b55b-8ca5e4406715.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

### Part 1

<details><summary>回答</summary>

問題文にある命令は `mul\(\d+,\d+\)` という正規表現で取得可能です

`Regex.scan` で該当箇所を全て取得し、数値に変換して掛け合わせ、合計します

```elixir
Regex.scan(~r/mul\(\d+,\d+\)/, puzzle_input)
|> Enum.map(fn [mul] ->
  Regex.scan(~r/\d+/, mul)
  |> Enum.map(fn [str] ->
    String.to_integer(str)
  end)
  |> Enum.product()
end)
|> Enum.sum()
```

</details>

### Part 2

<details><summary>回答</summary>

正規表現 `mul\(\d+,\d+\)|do[n't]*\(\)` で掛け算の命令または `do()` または `don't()` の箇所を取得します

`Enum.reduce` で順番に処理していく際、現在が掛け算すべきなのかどうかをフラグとして管理します

```elixir
Regex.scan(~r/mul\(\d+,\d+\)|do[n't]*\(\)/, puzzle_input)
|> Enum.reduce({true, 0}, fn [instruction], {do_flag, acc} ->
  case {do_flag, instruction} do
    {_, "do()"} -> {true, acc}
    {_, "don't()"} -> {false, acc}
    {true, mul} ->
      product =
        Regex.scan(~r/\d+/, mul)
        |> Enum.map(fn [str] ->
          String.to_integer(str)
        end)
        |> Enum.product()

      {true, acc + product}
    _ ->
      {do_flag, acc}
  end
end)
|> elem(1)
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![aoc2024_day3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/70597b60-c42c-b11a-fc00-ad65bad9181b.jpeg)

Day 3 はほぼ正規表現の問題でした
スクラム　仕事が4倍速くなる"世界標準"のチーム戦術 を読んだまとめ


# スクラム　仕事が4倍速くなる"世界標準"のチーム戦術

「スクラムとは何ぞや？」という内容を、FBIなどの実例を交えてまとめた本。
書いてある内容から、スクラムのポイントとして主張されているところを記述する。

1. [ウォーターフォールとスクラムの比較](#ウォーターフォールとスクラムの比較)
1. [スクラムで目指すこと、やること](#スクラムで目指すことやること)
1. [読んでみての振り返り](#読んでみての振り返り)

## ウォーターフォールとスクラムの比較

FBIのシステム改修についての話がメイン。

ウォーターフォールで2回失敗→著者が依頼を受け、スクラムでのプロジェクト管理を行った。

結果、想定よりも低予算、短期間での改修に成功。

全体的に、ウォーターフォール下げスクラム上げの記述が多い。

ほかの章でも、ウォーターフォールをきっちりこなす会社があったが、変化についていけず消滅した等の記載があった。

「最初から全部仕様がわかっており、それが変化しない」という条件のプロジェクトであれば、ウォーターフォールは有効ともある。

これがソフトウェアの性質にそぐわない、それはそう。

## スクラムで目指すこと、やること

いろいろあるけど、「短いサイクル」と「現実的な計画」が大きいところかと思った。

多くの人がいろいろ進めた後で「これに気付いてなかった」が発生すると、影響が大きい。これを避けるためのスプリント。テスト駆動開発もこのためにあると思える。

見積をする際のプランニングポーカーで、各項目の作業を相対的サイズで見積もるというのは感覚で分かりやすかった。

また、ベロシティで「このままで行けるか間に合わないか」を判断することは、スクラムのコアな部分と思う。

「やれるだろう」を根拠薄く出すところから脱却し、「やれるorやれない」を根拠ありで出せるようにすることで先も見えるようになる。

## 読んでみての振り返り

ウォーターフォール下げの記述の多さで、「ウォーターフォールでいろいろやばいことが発生したのを見てきたんだろうな」と思った。

ウォーターフォールって、最初から仕様が見えてる＆短期間で終わるものならいけるかと思ったけど、そういったプロジェクトそのものが少数派になってきている時代なので、

スクラムの導入は結構必須レベルかもなぁ。スクラムマスターをとることを真剣に考え始めました。
高速なgrepといえばripgrep

メリークリスマス！[開発環境を紹介します Advent Calendar 2024](https://adventar.org/calendars/10438)です。

よく使うコマンドを紹介したくて登録しました。　
隙間があれば他にも書こうと思います。隙間産業！

## [ripgrep](https://github.com/BurntSushi/ripgrep)

紹介するのはripgrepです。
今更説明がいるのかと思うくらい有名なプロジェクトです。

grepはご存知のとおり、ファイルを行単位で検索するコマンドです。
ファイルと正規表現を入力として受け取り、正規表現にマッチするファイルの行を出力します。

ファイルの巨大化に伴い、より高速なgrepが求められるようになりました。
そこで誕生したのが、ag（The Silver Searcher）やrg（ripgrep）などです。
現在ではripgrepのほうがより広く使われる印象です。

### 実行例

インストールするとコマンド`rg`でripgrepが使えます。
デフォルトの色付けやフォーマットも見やすい印象です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/495fe8ea-240c-3c4d-dcd3-1b616abdfec7.png)

### grepとの速度比較

手元の環境にて、キャッシュバイナリを含む2.6GBのレポジトリで「todo」を検索しました。
なるべく検索条件を近づけるためにrgにオプションをつけています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/509eef0b-822e-347f-ec32-c335feca80fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/52c15493-d879-0a0d-7238-980b6a13d48c.png)

- grep 
  - 1759 ms
- ripgrep
  - 151.0 ms

実に11倍以上の差がついています。

## まとめ

ripgrepの紹介でした。
grepの代わりに高速なripgrepを使おう！
【Web】HTTPリクエスト・レスポンスのまとめ

# はじめに
こんにちは！アメリカの大学で語学を学びながら、ソフトウェアエンジニアを目指している者です。

現在、Rubyの学習と並行してWebの仕組みについて勉強しています。その中で出てきたHTTPリクエストとHTTPレスポンスの理解が漠然としていたため、この記事で整理してみました。
この記事では、HTTPリクエストとレスポンスの概要を説明し、それを知ることでどのようなメリットがあるのかを紹介します。

# HTTPリクエストとは？
HTTPリクエストは、クライアント（例: ブラウザ）がサーバーに対して情報を要求するためのメッセージです。
たとえば、ブラウザで「`https://example.com`」にアクセスすると、以下のようなリクエストが送信されます

### リクエストの構造
HTTPリクエストは大きく以下の3つの部分で構成されています

1. リクエストライン
リクエストの種類（メソッド）、リクエスト対象（URL）、HTTPバージョンを記述します。
```bash
GET /index.html HTTP/1.1
```

2. ヘッダー
クライアントの情報や、どの形式でデータを受け取りたいかを指定します。
```bash
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
```
3. ボディ（任意）
データをサーバーに送信するときに使用され、主にPOSTリクエストなどで使われます。
例：ログインフォームのデータやファイルのアップロードなど。

# HTTPレスポンスとは？
HTTPレスポンスは、サーバーがクライアントのリクエストに応じて返すメッセージです。
リクエストに対する結果を伝え、必要なデータ（HTML、画像など）を送信します。

### レスポンスの構造
HTTPレスポンスも大きく3つの部分で構成されています

1. ステータスライン
リクエストの結果を示すステータスコードとメッセージ、HTTPバージョンを記述しています。
```bash
HTTP/1.1 200 OK
```
2. ヘッダー
サーバーの情報や、データの形式、長さを指定します。
```bash
Content-Type: text/html
Content-Length: 512
```
3. ボディ
実際にクライアントが受け取るデータです。HTMLや画像、JSONなどが含まれます。

# ステータスコードの種類
ステータスコードは、リクエストの結果を数値で示します。以下のようなカテゴリに分かれています：

* 2xx: 成功
200 OK：リクエスト成功。
* 3xx: リダイレクト
301 Moved Permanently：リソースが別のURLに移動。
* 4xx: クライアントエラー
404 Not Found：リソースが見つからない。
* 5xx: サーバーエラー
500 Internal Server Error：サーバー側の問題。

# HTTPリクエスト・レスポンスを理解するメリット
1. Web開発でのデバッグが容易になる
リクエストやレスポンスを理解することで、ブラウザ開発者ツール(chromeの開発者ツール等)を使ったエラーの原因特定が簡単になります。
たとえば、リクエストのヘッダーやステータスコードを確認して、原因を突き止められます。

2. APIの利用がスムーズに
API（Application Programming Interface）は、クライアントとサーバー間でデータをやり取りする仕組みですが、基本的にはHTTPリクエストとレスポンスの形式を使用します。
これを理解していれば、外部サービスとの連携がしやすくなるようです。
私はまだAPIはノーコードアプリを作成したときのみ実装しただけなのでこれから勉強していきます。

# 実際の例を見てみよう
以下は、ブラウザでWebページを閲覧するときのリクエストとレスポンスの流れです

1. ユーザーが「`https://example.com`」にアクセス。

2. ブラウザが以下のリクエストを送信
```bash
GET / HTTP/1.1
Host: example.com
```
3. サーバーからのレスポンス
```
HTTP/1.1 200 OK
Content-Type: text/html
```
4. ブラウザがレスポンスを解析して、Webページを表示。

# まとめ
HTTPリクエストとレスポンスを理解することは、Web開発やAPIの利用を円滑に進めるために必須の知識です。
特にデバッグの際に役立つため、ブラウザの開発者ツールを活用して、実際に自分の見ているWebページのリクエストやレスポンスを確認してみると良いかもしれません。
「文字リテラルが多すぎる」とは？？

１．文字リテラルと文字列リテラルの違い
この2つの違いはString型とchar型の違いと同じです。
文字列(String)："Hello World"のような文字列をそのまま使用するときに使用
文字（char）：'a'のような文字を扱う

２．文字列リテラルが多すぎるとは？（ex. 'Hello World'）
2.1.　シングルクォートで文字列を囲ってしまった時
シングルクォートは一般的にchar型を表すときに使用します。
当然、'Hello World'としてしまうと、H～dまでの9文字を1つづつ処理をしないといけないから大変です
2.2. 特殊文字を入れてしまった時（ex. '鐚'）
特殊文字やサロゲートペア文字など、2バイト以上のサイズを持つ文字は文字列リテラルが多すぎると認識されてしまいます。
Design It!でまなぶ設計とその評価

この記事は[株式会社要 cavacanチーム Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cavacan) 6日目の記事です。

# Design It! ―プログラマーのためのアーキテクティング入門

https://www.oreilly.co.jp/books/9784873118956/

設計をしたことがある／設計をすることになった／設計に興味がある人にはぜひ読んでほしい本です。
チームで設計をして評価するということについて本書に書いてある内容をこの記事ではまとめました。

---
1. [Design It! ―プログラマーのためのアーキテクティング入門](#design-it-プログラマーのためのアーキテクティング入門)
   1. [ソフトウェアアーキテクトになる](#ソフトウェアアーキテクトになる)
   2. [アーキテクチャデザインスタジオを開催しよう！](#アーキテクチャデザインスタジオを開催しよう)
      1. [デザインスタジオの次にやること](#デザインスタジオの次にやること)
   3. [設計に通知表をつける](#設計に通知表をつける)
      1. [どの程度良いか？評価の手順](#どの程度良いか評価の手順)
      2. [どのように良いか？評価の手順](#どのように良いか評価の手順)
   4. [まとめ](#まとめ)
---

## ソフトウェアアーキテクトになる

役職として「ソフトウェアアーキテクト（ソフトウェアの設計をする人）」を肩書きに持っている人がチームにいないとしたら、チームメンバーであるあなたはその役割を担う必要があります（あるいはすでに担っています）。

あなたが「ソフトウェアアーキテクト」なら、チームメンバーに設計の理解と適切なタイミングでの教育活動を行うことがプロジェクトの成功に役立ちます。コードを書く時間は減っていきますが、コードを一切書かないアーキテクトにはならないのがオススメです。

## アーキテクチャデザインスタジオを開催しよう！

チーム全員でワークショップ形式のアーキテクチャ設計を行うのはどうでしょうか。これをアーキテクチャデザインスタジオと呼びます。
設計に対する合意を形成し、チームコミュニケーションを形成することができます。
ワークショップは早く、効果的で、楽しいものにすることでこれを達成します。

典型的なワークショップは数時間から1日あれば十分ですが、準備には時間がかかります。想像より大変になる可能性がありますが、頑張りましょう。
本書にはヒントがたくさん紹介されています。

また、対面で行う必要はありません。ツールを活用したり時間配分に気をつけることでリモート開催も可能です。

### デザインスタジオの次にやること

アーキテクチャデザインスタジオに参加したメンバーは設計に対して自主性と責任感を促進します。

ワークショップは強力ですが、それだけでは不十分です。

設計はタンジブル（目で見て、手で触れる状態）であるべきです。

チームメンバーだけでなくステークホルダーにも共有していくために、適切な形で設計を可視化していきましょう。

## 設計に通知表をつける

設計を評価する時間はプログラミング時間を奪うものではありません。
「どの程度良いか？」「どのように良いか？」という基準で評価してみましょう。

### どの程度良いか？評価の手順

まずは設計を評価可能な形にします。
それはホワイトボードに書かれたスケッチかもしれないし、ソースコードかもしれないし、draw.ioのような作図ツールで描画されたものかもしれません。

次に、設計上重要な要求についてステークホルダーの観点から見てどの程度良いかを確認していきます。
求められている品質特性を理解している必要があります。
開発者が良いと考えているものがステークホルダーにとっても良いとは限りません。
例えば、「改善が必要」「良い」「とても良い」「最も良い」のような尺度で評価していきます。

### どのように良いか？評価の手順

どの程度良いかの評価基準を分析していきます。
「改善が必要」なら、具体的にどう改善するかを決めていきます。「最も良い」でも、改善できる点はあるはずです。

リスクや未解決の問題を探し、ディスカッションをします。この段階で、わたしたちは設計の傾向を知ることが出来ます。

最後に、特定された課題について優先度を決めて対応の分担をしていきます。ここまでで評価が終わります。

この流れは議事録としてまとめ、設計手順の記録として残しておきましょう。

## まとめ

アーキテクチャには0点も100点も無く、全体を一度に評価することもできません。
設計したあとの評価までチームで出来たら良い経験になりそうですね。
記事に書いたように、理論的な話だけでなくチームで実践できるワークショップのガイドも充実しています。
本書はオライリーの中でも読みやすい方だったと思います。ぜひ読んでみてください。

次回のアドベントカレンダーは @matsujunjun さんの「スクラム　仕事が4倍速くなる"世界標準"のチーム戦術」です。
わいのgithubのプロフィールをめっちゃかっこよくした話

こんにちは、Coronaです！  
最近、自分のGitHubプロフィールがちょっと味気ないな～と思っていたので、思い切ってカスタマイズしてみました。  
結果、「めっちゃかっこよくなった！」と自画自賛できる出来栄えになったので、その過程をシェアしたいと思います。  

---

## Before: 味気なさすぎるプロフィール 😢

ただのテキストで、これといった魅力がない状態でした。

- 自己紹介が簡潔すぎる
- 技術スタックが文字だけでパッとしない
- Statsがないので活動量が伝わらない

GitHubを訪れた人に自分のスキルや雰囲気を伝えたいのに、これではもったいないですよね。

---

## After: カスタマイズ後のプロフィール ✨

カスタマイズした結果がこちらです！

![GitHub Profile Screenshot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/1c97cfe8-3dd5-586b-fcf4-a885e3f5afe5.png)


どうですか？  
技術スタックや活動内容が一目でわかるようになり、全体的に洗練された印象を与えられるようになりました！

---

## カスタマイズの手順 🛠️

### 1. `README.md` を作成
GitHubプロフィールに表示される内容は、自分のリポジトリ（自分のGitHubユーザー名と同じ名前のリポジトリ）の `README.md` に書くだけで反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527006/81916df1-ebf8-d264-910f-dfb4797f3ef8.png)

```bash
# リポジトリ作成コマンド
git init
git add README.md
git commit -m "初回コミット"
git push origin main
```

### 2. Skilliconsで技術スタックをビジュアル化
文字だけだと味気ないので、[Skillicons](https://skillicons.dev/) を使って技術スタックをアイコンで表示しました。

例：
```markdown
![](https://skillicons.dev/icons?i=nextjs,nuxtjs,react,typescript,go,nodejs)
```

### 3. GitHub Statsで活動量をアピール
[GitHub Readme Stats](https://github.com/anuraghazra/github-readme-stats) を使って、自分のリポジトリや活動の統計情報を表示しました。

例：
```markdown
[![Corona's GitHub stats](https://github-readme-stats.vercel.app/api?username=bskcorona-github&show_icons=true&theme=tokyonight)](https://github.com/anuraghazra/github-readme-stats)
```

---
## めんどくさい人のための丸ごとコピペ✂️

```markdown
# Hi, I'm Corona 👋

I'm a **Full Stack Engineer** specializing in modern web development.  
I'm still a beginner, but I look forward to working with you!

## 🛠 Skills & Tools

### Languages & Frameworks
![](https://skillicons.dev/icons?i=go,js,ts,vue,html,css,react,nextjs,nuxtjs,express)

### Databases
![](https://skillicons.dev/icons?i=mysql,mongodb,postgres)

### Tools
![](https://skillicons.dev/icons?i=git,github,tailwindcss,aws,postman,prisma,vscode,notion,discord,vercel)

## 🌱 Currently Working On
- Building innovative web applications with **Next.js** and **Nuxt.js**
- Exploring **AI integration** for enhanced user experiences

## 📈 Stats & Activities
[![Corona's GitHub stats](https://github-readme-stats.vercel.app/api?username=bskcorona-github&show_icons=true&theme=tokyonight)](https://github.com/anuraghazra/github-readme-stats)
[![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=bskcorona-github&layout=compact&theme=tokyonight)](https://github.com/anuraghazra/github-readme-stats)

## 📫 Contact
Coming Soon... 🚀
```

## まとめ 📝

わいのGitHubプロフィールをかっこよくしたい！という気持ちでカスタマイズした結果、大満足のプロフィールが完成しました。  
みなさんもぜひ試してみてください！  

参考にした記事は[こちら](https://zenn.dev/aiq_dev/articles/8386b812d7e384)。  
わいの作ったGitHubプロフィールは[こちら](https://github.com/bskcorona-github)。  

この記事が少しでも参考になれば嬉しいです！😄
料金見積りツール がプレビューになりました

# AWS Pricing Calculatorの強化。割引と購入コミットメントのサポート。
検証から見積作成がスムーズになりそうですね。

## 主な機能
### 割引適用
ワークロードや既存のAWS使用状況に基づいたコスト見積もり。適用可能な割引の計算。

### 購入コミットメントの影響
コミットメント購入のコスト影響を見積もりに反映。組織の合算請求への影響の把握。

### 柔軟なコスト見積もり
過去の使用状況のインポート機能。新規の使用状況の作成。既存の見積もりデータのインポート。
見積もりの作成は当然、保存ができて一覧で見れるの凄いありがたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/87a0047e-b0df-52a5-3d91-1ea3be1af48a.png)


#### 過去の使用状況のインポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/16d62498-0857-6a9a-162f-0e3e57b4c660.png)

フィルターも設定可能![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/1286cec0-71b7-5e32-7c6f-5c68f25b893a.png)

プレビューから見積へリソースを取り込める、フィルタ内の特定のリソースのみを選択して取り込みはできない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/97d6d067-564b-f02f-bc92-38078a93ec8d.png)

単一リソースを取り込む場合は Name タグでフィルタリングスレバOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/43cfe79b-14a4-5dfe-7d4b-0e141b3fdd6d.png)
一度のフィルタで取り込んだものはグループでひとまとまりになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/8d1d37af-3c27-f35e-fdaf-439084ff4fa0.png)

取り込んだものと新規作成文は都道府県?で判別可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/a1fb9587-1f50-fb12-90e3-e548952a10a0.png)





### 見積もりの共有
他のAWSコンソールユーザーとの見積もりデータの共有。
AWS Pricing Calculator で生成した共有URLから見積もりを取り込める。

適当な見積もりを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/d633084c-2db4-6e6a-1da8-69467ef56168.png)
取り込んでみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/fecff7c3-e0ab-07f3-f7be-3017fdf5499e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/66830053-f7f7-5ed8-8c0e-2987a917d4da.png)

取り込まれない、バグですかね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/3782d9c6-7901-3f28-55da-bf6597b85409.png)

### 利用方法
[AWS Billing and Cost Management Console](https://console.aws.amazon.com/costmanagement/home)からのアクセス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/ce2830fd-f058-a219-f028-1c15beb7b3db.png)
数学弱者が波に挑戦してみる②

# はじめに

https://qiita.com/Riru1290/private/d2fd21a52ccd73d30c43

上記の続きになります！

今回はハイトマップを動的に生成するところから。

# 波の合成

ハイトマップを生成していくんですが、リアルテイストな波を表現するためには
"**波の合成**"
が必要になるためハイトマップを複数生成することにする

### 環状波と直進波
波のハイトマップを作成する際、
「環状波」　　　　　　　　　　　「直進波」
　波が円形状に広がる　　　　　　　一定方向に並走して動く
![Shader_no4_im04_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941047/662d916d-e677-b48b-2ecf-7234ae57bf47.gif)　![Shader_No4_im06_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941047/8595522f-3dd3-6f5b-37bf-caa41c8d1640.gif)

の2種類のハイトマップを複数組み合わせていく。

![waveHight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941047/dc24c9fc-94c5-ff2a-dff9-92432cf7280c.png)

合成結果がこんな感じ。
*動画だと目に悪そうだったので静止画

次にこのハイトマップを法線マップへ変換する
そして適用

<iframe width="560" height="315" src="https://www.youtube.com/embed/5ITKaBQk8XE?si=L1lB7cYA8fRyVTDZ" 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>

動画では大小様々な環状波を80個ほど合成させてます。
直進波？いい奴だったよ。(直進波も適用させるとなんだか微妙な感じになったので消去)

**余談**
　ハイトマップを毎フレーム複数生成するのがくっそ重かったので、
　自分は、テクスチャサイズを64x64にする＋OpenMPの機能を使用する
　ってことをやって、なんとか対応しました。
　なんかほかに良い方法あるのかなぁ。

# 波は尖る

で、ここまでsin波を活用して生成してきたんですが、ここで知らない単語登場
"**トロコイド曲線**"と"**サイクロイド曲線**"

なんだこれは。

この曲線を使用してハイトマップを生成すれば
より`リアルな波`を表現できるらしい。

![real.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941047/8e2c7559-8ac4-c92e-ae2f-6b5647872819.png)

自分なりに調べた結果、
　「波を表現する際によく使われる曲線」
　「直線上を円が転がるときに、円のある一点が描く軌跡」

・・・トロコイド曲線についてもうちょい勉強してきます...

###### トロコイド曲線メモ
・サイクロイド曲線はトロコイド曲線の１種
・媒介変数
　　時間とともに動く点P（x，y） の座標が時刻 tによって
　　x ＝ t ＋ 1， y ＝ t2 − 2
　　と表せられるときの
　　tを媒介変数
　　この表わし方を媒介変数表示という
・サイクロイドの媒介変数表示
　x=a(θ–sinθ)
　y=a(1–cosθ)

いったん今日はここまで

次回はトロコイド曲線でのハイトマップ生成に変更するところからやります！
あと、頂点シェーダで実際に波を動かします！

#

開発環境
IDE:VisualStudio2022
使用言語:c/c++
使用ライブラリ:DirectXTex,DirectXMath etc.
ACDLを提唱します。その27

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
すばらしいアプリを見つけたので、plunkerに上げてみた。

# 参考にしたページ

https://github.com/MarwanYoussef/Visual-Verilog


# 機能
ビジュアルプログラミングでプログラムして、verilogを生成します。
サンプルは、７セグメントデコーダー。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9e439889-cc14-3089-8119-b628b3e00ed4.png)

# 成果物

https://embed.plnkr.co/plunk/gtyJUxPhjHOswfi6


以上。
シェルスクリプトの基本（連載第13回/25回）

# はじめに
シェルスクリプトは、複数のコマンドを一連のタスクとして自動化するために使用される強力なツールです。ここでは、シェルスクリプトの基本的な書き方と基本文法を紹介します。

# シェルスクリプトの作成
シェルスクリプトは通常、テキストエディタを使用して作成され、`.sh` 拡張子を持ちます。

1. **スクリプトファイルの作成**：
    ```bash
    nano script.sh
    ```

2. **シバン（Shebang）の追加**：
    スクリプトの最初の行に以下を追加して、スクリプトをどのシェルで実行するかを指定します。
    ```bash
    #!/bin/bash
    ```

#### 基本的なスクリプトの構造

```bash
#!/bin/bash

# コメントは#から始まります
echo "Hello, World!"    # 文字列を出力

# 変数の定義
name="Alice"
echo "Hello, $name"

# 条件分岐
if [ "$name" == "Alice" ]; then
  echo "Welcome, Alice!"
else
  echo "Who are you?"
fi

# ループ
for i in {1..5}; do
  echo "Number: $i"
done
```

# 基本的な文法
コメント：＃ を使ってコメントを追加できます。
```bash
# これはコメントです
```
変数：変数の定義は = で行い、アクセスする際は $ を使用します。
```bash
greeting="Hello"
echo $greeting
```
条件分岐：if 文を使って条件を評価します。

```bash
if [ "$var" -eq 1 ]; then
  echo "True"
else
  echo "False"
fi
```
ループ：for ループや while ループを使って繰り返し処理を行います。

```bash
for i in {1..10}; do
  echo "Iteration $i"
done
```
関数：関数を定義して再利用可能なコードブロックを作成します。

```bash
my_function() {
  echo "This is a function"
}

my_function
```
応用例
ディレクトリ内の全ファイルを表示

```bash
#!/bin/bash
for file in *; do
  echo "Found file: $file"
done
```
バックアップスクリプト

```bash
bash
#!/bin/bash
src="/path/to/source"
dest="/path/to/destination"
tar -czf "$dest/backup_$(date +%F).tar.gz" "$src"
echo "Backup completed."
```

# おわりに
シェルスクリプトを使用することで、タスクの自動化や繰り返し処理が簡単に行えるようになります。
次の記事では、データのバックアップと復元について説明します。

https://qiita.com/yu1016/items/6e38474a0c6b184aec23

一覧

https://qiita.com/advent-calendar/2024/pig
【Goで学ぶコンピューターサイエンス】ビットとバイト

## ビット

「binary digit」の略。
ビット (bit)は、データの最小単位のことで、0または1の値をとります。
複数ビットを組み合わせることで、様々なデータを表現します。

| ビット | 状態 | パターン |
|:-----------|:------------|:-----------|
| 1ビット       | 0, 1        | $2^1$ |
| 2ビット       | 00, 01, 10, 11 | $2^2$ |
| 3ビット       | 000, 001, ..., 111| $2^3$ |
| ...          | ...               | ... |
| 8ビット       | 00000000, 00000001, ...,11111111| $2^8$ |

## バイト

8ビットをひとかたまりとしたものが、1バイトです。
0～255（符号なし）、-128～127（符号付き）、ASCIIの1文字などを表現することが可能です。
これらがどのようなデータを表現しているかは、それを扱うアプリケーション側で判断されます。

## ビット演算

ここからはGoのコードを使って、ビット操作をしてみようと思います。
Goでは以下のようなビット演算子が利用可能です。

| 演算子 | 説明 | 使用例 (A=1010, B=1100) | 結果　|
|:-----------|:------------|:------------|:------------|
| &       | AND: 両方が1なら1 | A & B | 1000 |
| \|      | OR: どちらかが1なら1 | A \| B | 1110 |
| ^       | XOR: 異なれば1| A ^ B | 0110 |
| <<      | 左シフト: 指定桁数分移動 | A << 2 | 101000 |
| >>      | 右シフト: 指定桁数分移動 | A >> 2 | 0010 |

## ビット演算のGoサンプルコード

```go
package main

import "fmt"

func main() {
	A := 10 // 2進数: 1010
	B := 12 // 2進数: 1100

	// AND演算
	andResult := A & B
	fmt.Printf("A & B = %d (2進数: %04b)\n", andResult, andResult)

	// OR演算
	orResult := A | B
	fmt.Printf("A | B = %d (2進数: %04b)\n", orResult, orResult)

	// XOR演算
	xorResult := A ^ B
	fmt.Printf("A ^ B = %d (2進数: %04b)\n", xorResult, xorResult)

	// 左シフト
	leftShift := A << 2
	fmt.Printf("A << 2 = %d (2進数: %06b)\n", leftShift, leftShift)

	// 右シフト
	rightShift := A >> 2
	fmt.Printf("A >> 2 = %d (2進数: %04b)\n", rightShift, rightShift)
}
```

```
A & B = 8 (2進数: 1000)
A | B = 14 (2進数: 1110)
A ^ B = 6 (2進数: 0110)
A << 2 = 40 (2進数: 101000)
A >> 2 = 2 (2進数: 0010)
```

## ビット演算を使ったフラグ管理Goサンプルコード

```go
package main

import "fmt"

const (
	Read  = 1 << 0 // 001
	Write = 1 << 1 // 010
	Exec  = 1 << 2 // 100
)

func main() {
	// 権限を組み合わせて設定
	permission := Read | Write
	fmt.Printf("Permission: %03b\n", permission) // 011 (Read + Write)

	// 権限の確認
	fmt.Printf("Has Read: %t\n", permission&Read != 0)   // true
	fmt.Printf("Has Write: %t\n", permission&Write != 0) // true
	fmt.Printf("Has Exec: %t\n", permission&Exec != 0)   // false

	// 権限の追加 (Exec権限を付与)
	permission |= Exec
	fmt.Printf("Permission after adding Exec: %03b\n", permission) // 111

	// 権限の削除 (Write権限を削除)
	permission &= ^Write
	fmt.Printf("Permission after removing Write: %03b\n", permission) // 101
}
```

```
Permission: 011
Has Read: true
Has Write: true
Has Exec: false
Permission after adding Exec: 111
Permission after removing Write: 101
```

## バイト操作のGoサンプルコード

```go
package main

import "fmt"

func main() {
	// 文字のバイト表現
	char := 'A'                                             // ASCII文字
	fmt.Printf("Character: %c, Binary: %08b\n", char, char) // A, 01000001

	// 文字列のバイト配列
	str := "Go"
	fmt.Printf("String: %s\n", str)
	fmt.Printf("Bytes: %v\n", []byte(str))
	for i, b := range []byte(str) {
		fmt.Printf("Byte %d: %08b (%c)\n", i, b, b)
	}

	// バイト配列を結合
	bytes := []byte{71, 111} // G: 01000111, o: 01101111
	fmt.Printf("Reconstructed String: %s\n", string(bytes))
}
```

```
Character: A, Binary: 01000001
String: Go
Bytes: [71 111]
Byte 0: 01000111 (G)
Byte 1: 01101111 (o)
Reconstructed String: Go
```
Redashでのクエリとダッシュボード作成時のハマりポイント

# はじめに

Gakken LEAPのmizunoです。
当プロジェクトではBIツールとしてRedashを採用しており、データの可視化を行っています。
今回は、クエリやダッシュボードの作成時に直面した課題やその解決方法を共有したいと思います。

## はまってしまった話

### 文字列検索のシングルクォーテーション問題

Redashでは、`{{}}`で囲んだ部分をパラメータとして利用できます。
ただし、文字列検索においては、クエリ中のパラメータをシングルクォーテーションで囲む必要があります。これを忘れると検索が正常に動作しません。

- **シングルクォーテーションを囲んでいない場合**（検索が失敗）
  ![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/0db345e9-37cc-be0e-a155-79207c0d0e9a.png)

- **シングルクォーテーションで囲んだ場合**（検索が成功）
  ![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/9d0da446-97c4-c11b-8489-e552e92463f9.png)

Redashでは、パラメータとして渡された値にシングルクォーテーションを自動補完してくれない仕様です。そのため、文字列検索の場合は、`'{{hoge}}'`のようにクエリ内で手動で囲む必要があります。

### ダッシュボードでの検索パラメータが統一される問題

クエリを作成後、ダッシュボードでウィジェットとして追加して使用することができます。しかし、この際、検索パラメータがすべてのウィジェットで共通化されてしまい、個別の検索ができないという問題が発生しました。

#### 解決方法

ウィジェットを追加する際、`Parameters`欄で`Value Source`の設定を変更できます。

- **共通のパラメータを使用する設定**（変更せずにそのまま追加）
  ![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/d833a0e6-ca8a-318d-41a4-d8c73ddb8fae.png)

- **個別のパラメータを使用する設定**（`Widget parameter` を選択）
  ![img5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712998/4dea0b39-c639-248a-6f63-ba81f07bb400.png)

この設定により、各ウィジェットごとに異なる検索パラメータを使用できるようになります。

グラフ表示やテーブル表示を複数組み合わせて利用する場合、この方法で検索パラメータの競合を防ぐことができました。

## まとめ

Redashを使用してクエリやダッシュボードを作成する際、以下の2つのポイントに注意が必要です。

1. **文字列検索のシングルクォーテーション**
   - クエリ内でパラメータを利用する際、文字列検索の場合はシングルクォーテーションでパラメータを囲む必要があります。
   - シングルクォーテーションがないと検索が正しく動作しません。

2. **ダッシュボードでの検索パラメータの統一問題**
   - ダッシュボードにウィジェットを追加する際、`Parameters`の`Value Source`を`Widget parameter`に設定することで、各ウィジェットで個別の検索が可能になります。

## エンジニア募集

Gakken LEAPでは、教育のアップデートに取り組むエンジニアを絶賛募集中です！
ぜひお気軽にカジュアル面談にお越しください！

https://gakken-leap.co.jp/recruit/
タスクのスケジューリング（連載第12回/25回）

# はじめに
Linuxでは、定期的なタスクや一度だけ実行するタスクをスケジューリングすることができます。ここでは、`crontab` と `at` の基本的な使い方を紹介します。

# コマンド説明
#### `crontab` - 定期的なタスクのスケジューリング

`crontab` コマンドは、ユーザーごとに定期的なタスクをスケジューリングするために使用されます。`cron` は、システム上の定期的なタスクを管理するデーモンです。

***主な書式***
分（0-59）
時（0-23）
日（1-31）
月（1-12）
曜日（0-7、0と7は日曜日）

```powershell
# 例
crontab -e
# 毎日午前3時にバックアップを実行：
0 3 * * * /path/to/backup.sh
# 毎週月曜日の午前6時にレポートを生成：
0 6 * * 1 /path/to/report.sh
```

#### `at` - 一度だけ実行するタスクのスケジューリング
`at` コマンドは、指定した時間に一度だけ実行するタスクをスケジューリングします。at デーモンは、スケジュールされたタスクを適切な時間に実行します。

***主なオプション***
-f : コマンドを記述したファイルを指定
-m : タスクの完了後にメール通知を送信

```powershell
# 例
at [オプション] 時間
# 1時間後にスクリプトを実行：
echo "/path/to/script.sh" | at now + 1 hour
# 特定の日時にコマンドを実行：
echo "ls -l /var/log" | at 10:00 AM 12/31/2023
```

応用例
```powershell
# 毎月1日にシステムメンテナンスを実行
# この設定は、毎月1日の午前0時に maintenance.sh を実行します。
0 0 1 * * /path/to/maintenance.sh
# 特定のファイルを午後2時30分に一度だけ削除
echo "rm /path/to/file" | at 2:30 PM
# 毎日午前1時にログファイルをクリーンアップ
0 1 * * * /path/to/cleanup.sh
# 1週間後にリブートをスケジュール
echo "sudo reboot" | at now + 1 week
```

# おわりに
これらのコマンドを使うことで、タスクのスケジューリングが効率的に行えます。
次の記事では、シェルスクリプトについて説明します。

https://qiita.com/yu1016/items/21b6d5cbc21526054b2c

一覧

https://qiita.com/advent-calendar/2024/pig
リモートサーバーの管理（連載第11回/25回）

# はじめに
リモートサーバーの管理は、リモートでのシステム管理やファイル転送を効率的に行うために重要です。ここでは、`ssh`、`scp`、`rsync` の基本的な使い方を紹介します。

# コマンド説明
#### `ssh` - リモートサーバーへの接続
`ssh` コマンドは、リモートサーバーに安全に接続するためのツールです。SSH（Secure Shell）は、暗号化された通信を提供し、リモートでのシステム管理を可能にします。

***主なオプション***
-p : 接続ポートを指定

```powershell
# 例
ssh [ユーザー名@ホスト名またはIPアドレス]
# このコマンドは、ユーザー user として 192.168.1.100 のリモートサーバーに接続します。
ssh user@192.168.1.100
```

#### `scp` - セキュアなファイル転送
`scp` コマンドは、SSHを利用してファイルをリモートサーバー間でセキュアに転送するためのツールです。

***主なオプション***
-r : ディレクトリを再帰的に転送
-P : 接続ポートを指定

```powershell
# 例
scp [オプション] ローカルファイル ユーザー名@ホスト名またはIPアドレス:リモートディレクトリ
scp [オプション] ユーザー名@ホスト名またはIPアドレス:リモートファイル ローカルディレクトリ
# ローカルからリモートへファイルを転送：
scp file.txt user@192.168.1.100:/home/user/
# リモートからローカルへファイルを転送：
scp user@192.168.1.100:/home/user/file.txt ./
```
#### `rsync` - 高速なファイル同期
`rsync` コマンドは、ファイルやディレクトリを高速かつ効率的に同期するためのツールです。特に大規模なデータの転送やバックアップに適しています。

***主なオプション***
-a : アーカイブモード（再帰的にディレクトリを転送し、シンボリックリンク、デバイス、属性を保持）
-v : 詳細情報を表示
-z : データ転送時に圧縮
--delete : 同期先に存在しないファイルを削除

```powershell
# 例
rsync [オプション] ソース ディスティネーション
# ローカルからリモートへディレクトリを同期：
rsync -avz /path/to/local/ user@192.168.1.100:/path/to/remote/
# 特定のポートを使用してリモートサーバーに接続
rsync -avz user@192.168.1.100:/path/to/remote/ /path/to/local/
```
応用例
```powershell
# 特定のポートを使用してリモートサーバーに接続
# ポート 2222 を使用してリモートサーバーに接続します。
ssh -p 2222 user@192.168.1.100
# リモートサーバーからローカルディレクトリにファイルを転送
# リモートサーバーの /home/user/file.txt をローカルディレクトリに転送します。
scp user@192.168.1.100:/home/user/file.txt /local/directory/
# 圧縮しながらリモートディレクトリを同期
# このコマンドは、圧縮しながらローカルディレクトリをリモートディレクトリに同期します。
rsync -avz /path/to/local/ user@192.168.1.100:/path/to/remote/
```
# おわりに
これらのコマンドを使うことで、リモートサーバーの管理やファイルの転送が効率的に行えます。
次の記事では、タスクのスケジューリングについて説明します。

https://qiita.com/yu1016/items/95f7bb94205f53577542

一覧

https://qiita.com/advent-calendar/2024/pig
SDKMAN! - Java runtime & JDK & maven バージョン管理（WindowでSDKMAN!を使用する方法）

（日本語母語話者ではありません。誤字や伝えきれないところがあるかもしれませんので、ご了承ください。）

よく遭遇するほではないが、たまにローカル環境（あるいはテスト環境）のJAVAバージョンを切り替える必要がありますね。
今グーグルで出てくる方法はもう一切推奨しません！今日からSDKMAN!の信者になりましょう！

# インストール前

**パソコンにJAVA_HOMEとPATHの設定は済みましたか？**
まだ設定しない方は先に設定しといた方がいいです。必ずとは言えませんが、あとでSDKMAN! で設定を変わるとき、JDKが見つからない問題が発生するかもしれませんので。

# SDKMAN! インストール

URL： https://sdkman.io/

Unix系じゃない方は一番したの補足を見てください！！

1.  `curl -s "[https://get.sdkman.io](https://get.sdkman.io/)" | bash` でDL
2. `source "$HOME/.sdkman/bin/sdkman-init.sh"` で初期化する（ここでスクリプトで元の環境変数設定を変更）。ターミナルから「これRUNしてね！」のものすべて漏らずに実行してください。
3. ターミナルをリフレッシュ（閉じて再開でもおｋ）， `java -version` でJAVAの生存を確認。
4. Java Runtimeの生存が確認できたら、もう好きなバージョンをDLしていいよ！
JDKバージョン一覧： https://sdkman.io/jdks

# 基本コマンド

`sdk use バージョンコード` ：Java Runtime、JDK、あるいはMavenバージョンのして。
`sdk list` ：DL可能なバージョンを表示。

# アドヴァンス

SDKMAN! は...プロジェクトごとにJAVA環境の設定ができるよ！！

1. プロジェクトのディレクトリの下にCD，そして `sdk env init`を走る
2. プロジェクトルートの下に `.sdkmanrc`が生成されるはずです。このファイルを編集して、環境設定の行えます


# 補足　Windows環境でSKDMANを使用

1.  `powershell` を使って、 scoopをDL (まだDLしてない方は[こちらをご覧ください](https://www.notion.so/Scoop-10ea9f80224e80f9a90bffc802d3fd14?pvs=21)) : `scoop install 7zip`
2.  `git bash` の中で `curl -s "[https://get.sdkman.io](https://get.sdkman.io/)" | bash`を走る 
3. 指示通りに `sdkman`をインストール 
4. 完成!
ThingSpeakネタ

mruby on YABMなモジュールからThingSpeakを叩いてInternet of Testしてます。以前書いた簡単なスクリプトをアップデートしてみました。

Internetなので失敗する事もあり、成功率を計算してみました。

エントリー数と、mruby側のカウントの比較になります。

mrubyのスクリプトはこれです。

https://github.com/yamori813/mruby-yabm-samples/blob/main/iot/thingspeak.rb

Channel Settingsでfead dataをクリアして始めます。

MATLABはこんな感じです。

```MATLAB
% Channel ID to read data from 
readChannelID = xxx; 

% Channel Read API Key 
% If your channel is private, then enter the read API Key between the '' below: 
readAPIKey = 'naisyo'; 

% Humidity Field ID 
valueFieldID = 1; 

now = datetime('now');
t1 = now;
t2 = t1 - days(1);
total = 0;

while 1
data = thingSpeakRead(readChannelID,'Fields',valueFieldID,'ReadKey',readAPIKey,'OutputFormat','table','DateRange',[t2,t1]); 
[m,n] = size(data);
total = total + m;
if t1 == now
last = data.Timestamps(m);
current = data.FieldLabel1(m);
end
if m == 0
break;
else
fast = data.Timestamps(n);
t1 = t2;
t2 = t1 - days(1);
end
end

uptime = last - fast;

display(total,'total');
display(total / current * 100,'rate');
display(fast,'fast'); 
display(last,'last'); 
display(days(uptime),'days'); 
```

出力はこんな感じです。

```
total =

       72007


rate =

   99.9958


fast = 

  datetime

   07-Nov-2024 08:59:56


last = 

  datetime

   03-Dec-2024 14:35:00


days =

   26.2327
```
アーカイブと圧縮（連載第10回/25回）

# はじめに
ファイルやディレクトリのアーカイブおよび圧縮は、ストレージの節約やデータの転送に便利です。ここでは、`tar`、`gzip`、`zip` の基本的な使い方を紹介します。

# コマンド説明
#### `tar` - ファイルとディレクトリのアーカイブ
`tar` コマンドは、複数のファイルやディレクトリを一つのアーカイブファイルにまとめるために使用されます。

***主なオプション***
-c : 新しいアーカイブを作成
-x : アーカイブを展開
-v : 詳細情報を表示（verbose）
-f : ファイル名を指定

```powershell
# 例
tar [オプション] アーカイブファイル名 対象ファイル/ディレクトリ
# ファイルとディレクトリをアーカイブする。
# /path/to/directory を archive.tar にまとめます。
tar -cvf archive.tar /path/to/directory
# アーカイブを展開する：
# この例では、archive.tar を展開します。
tar -xvf archive.tar
```

#### `gzip` - ファイルの圧縮
`gzip` コマンドは、ファイルを圧縮します。圧縮されたファイルは .gz 拡張子が付きます。

***主なオプション***
-d : 圧縮を解除

```powershell
# 例
gzip [ファイル名]
# ファイルを圧縮する
# filename を圧縮して filename.gz を作成します。
gzip filename
# 圧縮を解除する
# filename.gz を展開して filename を作成します。
gzip -d filename.gz
```

#### `zip` - ファイルとディレクトリの圧縮
`zip` コマンドは、ファイルやディレクトリを圧縮して ZIP アーカイブを作成します。

***主なオプション***
-r : ディレクトリを再帰的に圧縮
-v : 詳細情報を表示（verbose）

```powershell
# 例
zip [オプション] アーカイブファイル名 対象ファイル/ディレクトリ
# ファイルとディレクトリを圧縮する：
# この例では、/path/to/directory を archive.zip に圧縮します。
zip -r archive.zip /path/to/directory
# 圧縮ファイルを展開する：
# この例では、archive.zip を展開します。
unzip archive.zip
```

応用例
```powershell
# 複数ファイルを一つのアーカイブにまとめて圧縮
# このコマンドは、まず tar でアーカイブを作成し、次に gzip でそのアーカイブを圧縮します。
tar -cvf archive.tar /path/to/files
gzip archive.tar
# アーカイブファイルを圧縮せずに作成
# 圧縮ファイルを展開
tar -cvf archive.tar /path/to/files
# まず gunzip で圧縮を解除し、次に tar でアーカイブを展開します。
gunzip archive.tar.gz
tar -xvf archive.tar
```

# おわりに
アーカイブと圧縮の基本的なコマンドを使用することで、ファイル管理が効率的に行えます。
次の記事では、リモートサーバーの管理について説明します。

https://qiita.com/yu1016/items/5ed44d554fcf05521f1f

一覧

https://qiita.com/advent-calendar/2024/pig