OmniAICreator/Qiita-1.07M huggingface dataset:
【Flutter】今年触れた技術について〜isar〜

今回はFlutterでの内部保存DBで有名なisarについて記載したいと思います。

### 環境
Mac OS:Sonoma14.1.2
Android:33
Android Studio:Android Studio Giraffe | 2022.3.1 Patch 4

## isarとは
内部DBとして使用でき、またデバッグなども簡単にできるのでFlutterで人気があるライブラリです。

https://pub.dev/packages/isar

また下記のような特徴があります。
1. 同期・非同期両方のサポートをしている。
1. Android・iOSに限らず多くのプラットフォームで使用できる。
1. 現在のDBの中身をブラウザー経由で確認できる。(個人的に一番嬉しい！！)

https://pub.dev/packages/isar#isar-database-inspector

## 書き込みと読み込みについて

```Dart
// 書き込み例
// ここではid、name、deadline、isNotifyという情報を持つitemクラスがあると仮定している。
final item = Item()
      ..id = id
      ..name = name
      ..deadline = deadline
      ..isNotify = isNotify;

    await _isar!.writeTxn(() async {
      await _isar!.items.put(item);
    });
```

```Dart
// 読み込み例
final emails = await isar.emails.filter()
  .titleContains('awesome', caseSensitive: false)
  .sortByStatusDesc()
  .limit(10)
  .findAll();
```

上記以外にも便利なメソッドが沢山あります。使う際は以下を一度見てみるといいと思います。

https://isar.dev/ja/schema.html

以上、また明日〜！！
dirtyの由来を調べてみた


この記事は [ドワンゴ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dwango) 12日目の記事です。

# きっかけ

ドワンゴの教育事業本部でフロントエンドエンジニアをしているむらさきです。
みなさんはエンジニアリングをしていてdirtyという単語を目にしたことはありませんか？

例えば僕は普段フロントエンドの開発をしていますが、FormikやReact Hook Form
といったフォームを扱うライブラリでdirtyという単語を目にすることがあります。

https://formik.org/docs/api/formik#dirty-boolean

https://react-hook-form.com/docs/useform/formstate

Gitのdocumentではdirty stateという言葉やステータスとしてdirtyが使われていたり、

https://git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning

他にはDBのトランザクションにおいてある処理中に他のコミットされていないデータを読み取ってしまうことをdirty readと言ったりするそうです。DBやメモリ周りで使われている方がよく見るかもしれません。


では、dirtyという単語の意味はなんでしょうか。Googleで調べてみた結果は以下です。

> 汚い，汚れた，不潔な, くすんだ

上述したフォームライブラリでのdirtyは、「変更されたどうか？」というフラグとしての機能を持ちます。



「dirtyは言い過ぎじゃない？」

そう思った僕はこの単語が使われる由来を探す旅に出ました。

# whatwgでは


formについての記載を眺めているとdirtyが含まれている文を発見しました。

https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#a-form-control's-value

> input and textarea elements have a dirty value flag. This is used to track the interaction between the value and default value. If it is false, value mirrors the default value. If it is true, the default value is ignored.

「input要素とtextarea要素はdirty valueというフラグを持ち、valueがデフォルト値ならfalse、そうじゃなければtrueである。」といったことが書いてありました。ライブラリの挙動そのままですね。

言及はあったものの、dirtyという言葉が当たり前のように使われていて、起源や由来まではわかりません。

# Stack Exchangeにて

自分と同じ疑問を質問している人がいました。

https://softwareengineering.stackexchange.com/questions/410262/whats-the-origin-of-the-term-dirty-in-regards-to-unsaved-progress

とても参考になる回答があり、一部要約、翻訳したものを以下にまとめさせていただきます。

- 1973年の特許にて、[dirtyを述べている資料](https://patents.google.com/patent/US3800294A/en)がある
- 文献や特許の情報によればdirtyとは、dirty copyという言葉として元々紙の世界から来たのだろう
- dirty copyとは、使い古されてはいるもののまだ使用できる (つまり媒体が使い古されている)コピーのこと
- 技術的な意味において、汚い（使い古されている）というのは信頼性の言葉として有用な抽象である



# おわりに
由来を調べた結果、かなり昔から使われ普及してきた言葉であることがわかりました。

当初感じた「言い過ぎでは？」という疑問はまだ少しだけありますが、背景を知った結果から技術的な言葉として使われることには納得できました。

こういった、普段目にする言葉の由来を調べるのは楽しいですね。最近だと、index.(js|ts)でexportするモジュールを管理するbarrel patternという言葉のbarrelという単語の由来も気になっているので、どこかで調べてみようと思います（知っている方がいたらぜひ教えてください）。
[JavaScript]スコープについて

どうも、豆腐メンタルです。

内容としては、JavaScriptの記述内における「スコープ」について触れていきたいと思います。

## 前提知識
まず、スコープとは何なのか。どの言語においても使われる言葉なので、自身の備忘録も兼ねて記載。

スコープというのは、**実行中のコードから値と式が参照できる範囲のこと**を言います。

具体的に、コードで表すと...
```js
function a (){
    const b = 1;
    console.log(b);
    <!--関数bの中なら変数bは呼び出せる-->
}

console.log(b);
<!--関数bの外なので、変数bは使えない-->
```

大変ざっくりしているが、以上のイメージ。
関数内で宣言した変数は、関数の中では使えるけど、関数外では使えませんよという感じですね。。

## 本題
ここからが本題。JavaScriptのスコープについてもう少し詳しく見ていきます。
スコープ、と一口に言っても実は様々な種類があります。

例えば、上記で例を挙げたもの。

```js
function a (){
    const b = 1;
    console.log(b);
}
```
こちらの関数ないで宣言した変数は、関数内で使えず、外では使えない。
その範囲を**関数スコープ**と言います。
メジャーな使われ方をしているのはこちらではないでしょうか？

ただ、実はこのスコープ...我々が知らないうちに働いているスコープもございます。

それが、**グローバルスコープ**と**スクリプトスコープ**です。

簡単ですが、以下をご覧ください

```js
let a = 0;
var b =1;

console.log(b);
1と表示される
```
よく見るJSの記述ですが、既にこの記述の中にスコープは働いています。

こちらを検証ツールで実行してみると...そのまま、「0,1」と表示されるはずです。
この時点で何が起こっているか

結論から言いますと
まず、letの変数ですが、こちらはスクリプトスコープとして扱われます。また、letだけでなくconstでも同じようにスクリプトスコープとして扱われます。

次に、varの変数。また、関数の場合はグローバルスコープとして扱われます。

## 一体何が変わるのか？

実は、グローバルスコープ...varの変数、関数で宣言したものは、ウィンドウオブジェクトのプロパティとして値が保持されるのです。

どういうことか？
例えば、jsで以下の記述を見たことがあると思います。

```js
window.alart("警告")
```
この記述をすることによって、ブラウザ上で警告文が出てくるアレです。
「window」というのが元々備わっている機能(ウインドウオブジェクト)で、varや関数を宣言すると
このウインドウプロジェクト内に保管されるという認識です。

更に、この「ウィンドウオブジェクト」自体が大きな巨大なグローバルスコープになっています。

ここまで書いておいてなんですが、言うなれば「すごい巨大なスコープの親元、親分」というイメージでしょうか...?

また、スクリプトスコープもグローバルスコープも使い勝手は変わらないので、まとめて「グローバルスコープ」と呼ばれます。

駆け足気味の文章でしたが、以上です。
正直パンパンな状態(ブログも久しぶりに)でほぼほぼ書き殴りでしたが、この辺りで締めたいと思います。
随時修正、更新していく所存でございます。

以上、ありがとうございました。
Security as Code

<a href="https://www.amazon.co.jp/Security-Code-English-Sarthak-Das-ebook/dp/B0BRM2Z5BV/"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/be6b4816-494b-681f-a40c-d866f1de1306.png" width="200" alt="Security as Code書影" /></a>

Security as Codeは、DevSecOpsをテーマにした入門書です。DevSecOpsは、DevOps + Securityと説明されますが、2023年末時点では、クラウドベンダおよびCI/CDパイプライン提供事業者主導で、その必要性が喧伝されているような状況に思えます[^1]。
他のDevSecOps文献をあたっても理念はしっかり書かれているものの、実装例テストのシフトレフトのコンセプトに基づいて、CI/CDパイプラインに、セキュリティテスト、かつほとんどコンテナスキャンやインフラのコンフィグスキャンばかりで、「えっ、それだけ？」感が拭えません。

> 開発者は、セキュアコーディングの原則を理解し、セキュリティエンジニアリングを日常業務の一部とするように方向転換しなければならない

と、そもそも普通の開発現場では普通にやっていることへ「方向転換」と言ってる前提も違いそうです。

ということで、取り立ててDevSecOpsには新しい話題はなさそうなのですが、自動化を軸にプロセスとツールが整理されるのは良いことかもしれません。

![DevSecOpsのプロセス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/a7552fdc-25f5-e5e5-328e-a401f1118d78.png)

図は、各フェーズで、どういう観点でセキュリティチェックおよびテストを行い、その分野でどういうツールがあるかを示したものです。各用語の定義は以下のとおり。

* ソースコンポジション分析(SCA): 依存関係やライブラリに脆弱性がないかをチェックする。
* 静的アプリケーションセキュリティテスト(SAST): 静的コード解析し、XSSやSQLインジェクション、バッファオーバーフローなどのセキュリティ上の弱点があるかを判定する
* 静的アプリケーションセキュリティテスト(DAST): 外部からアプリケーションやサービスに侵入しようとする方法と同様の方法で攻撃をシミュレートする
* インタラクティブアプリケーションセキュリティテスト(IAST)： 実行中のアプリケーションにエージェントとセンサーを配備することで、アプリケーションを計測し、テストによってシミュレートされる実行時間中のアプリケーションの動作を分析する
* IaC Scanning: インフラに関するSAST 
* ランタイムアプリケーション自己保護(RASP): RASPツールが潜在的な脅威を検出したら、脅威に対処するためのアクションを自動的に実行する

このうちSCAでやっている依存ライブラリの脆弱性検出は、近年急成長している分野ですが、この予防策にはトレードオフがあるので、少し掘り下げてみたいと思います。

## 依存ライブラリのバージョンアップ戦略

依存ライブラリが古いままだと、それだけ脆弱性の影響を受ける可能性も高まり、また検出時の対応が大幅なコード修正を伴うようになることがあります。一方で、こまめにバージョンアップしていくのも、明確なベネフィットがなくそのコストを支払うことになります。

![バージョンアップ戦略](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8475/a8072a75-8120-ff4d-8b92-fa2296ffe48a.png)

ということで戦略を分類すると上図のようになります。現実的には、以下のどれか基本戦略とし、場合によってはライブラリ個別に別の戦略も取り入れるになるかと思います。

### プロアクティブ

常に最新バージョンを取り込んでいく。

* メリット
    * 1回の作業量は少なくなり、脆弱性発生時の対応も速くなる。
    * バグレポートなどでOSSへの貢献ができる。
* デメリット
    * 他の依存ライブラリとの関係で、単にバージョンアップできない場合がある。
    * メジャーバージョンアップ直後など、バグを踏む確率が高い。

### LTSドリブン

プロアクティブの一部だが最も消極的。フレームワークや主要なライブラリはLTS(Long-Time Support)バージョンが存在する。

* メリット
    * バージョンアップのタイミングを計画しやすい
    * 比較的問題が起きにくい
* デメリット
    * 次のLTSにバージョンアップするときに、変更箇所が多くなる。

### 脆弱性ドリブン(リアクティブ)

脆弱性発生検知のタイミングで、バージョンアップする

* メリット
    * (平時の)バージョンアップにかかる工数を最小化できる
* デメリット
    * 古いバージョンのセキュリティパッチバージョンが出なくて、大幅なバージョンアップを余儀なくされることがある。


[^1]: 本書もGoogleとAWSの中の人の共著のようです。
ATOM Mate for toio を使って障害物回避するときの M5AtomS3 の実装

## 本記事について

この記事は [M5Stack Advent Calendar 2023](https://qiita.com/advent-calendar/2023/m5stack) の14日目の記事です。

https://protopedia.net/prototype/4990

ATOM Mate for toio についている距離センサを利用して、障害物を回避するロボットを作りました。本記事ではこの作品における M5AtomS3 の実装について紹介します。

## 前提

以下については別記事を参照ください。

- Bluetooth 関連単語
- 距離センサの値の取得方法

https://qiita.com/Teach/items/629c338da05a3134a1eb

https://qiita.com/Teach/items/9bdada744244e6174731

## ATOM Mate for toio とは

https://www.switch-science.com/products/8500

[toio™ コア キューブ](https://www.switch-science.com/products/6300)と連携するために作られた M5ATOM 用拡張ベースです。

バッテリーと距離検出センサ (VL53L0X) が搭載されています。

## システム構成

```
M5AtomS3(Peripheral) <-> Unity(Central) <-> toio(Peripheral)
```

M5AtomS3 と toio は直接通信していません。
M5AtomS3 の役割は 顔の表示と距離センサの値の取得・送信であり、それを使ってどう動くかは Unity で制御しています。

本記事では Unity 側の実装については触れません。

以下が M5AtomS3 のプロジェクトです。

https://github.com/teach310/ToioFaceM5

この役割・機能は本作品の「ランダム移動」「障害物回避」に特化していない汎用的なものです。
そのため別の作品にそのまま使うことも可能ではあると思います。

## 通信仕様

[BLE.cpp](https://github.com/teach310/ToioFaceM5/blob/main/src/BLE.cpp)

Unity と M5AtomS3 の通信は Bluetooth Low Energy (BLE) を使っています。
以下のように独自で設計しました。

### 距離センサー

|プロパティ|値|補足|
|:--|:--|:--|
|Characteristic UUID |`29C2D1B2-944A-4FBA-AFCD-133E09532556`|独自UUID|
|Properties|Read, Notify|

Notify の頻度は 100ms ごとで決めうちしました。

#### 距離センサー情報

|データ位置|データ型|内容|
|:--|:--|:--|
|0|UInt16|距離 (mm)|

### Avatar

[m5stack-avatar](https://github.com/meganetaaan/m5stack-avatar/tree/master) の表情を変更

|プロパティ|値|補足|
|:--|:--|:--|
|Characteristic UUID |`29C2D1B2-944A-4FBA-AFCD-133E09532557`|独自UUID|
|Properties|Read, Write|Read ついてますが使っていません|

#### 表情書き込み

|データ位置|データ型|内容|例|
|:--|:--|:--|:--|
|0|UInt8|表情ID|0x00 (Happy)|

ID は enum で定義された値をそのまま使っています

[m5stack-avatar Expression](https://github.com/meganetaaan/m5stack-avatar/blob/master/src/Expression.h#L9)

## 通信仕様の改善点

今回の作品では十分でしたが以下のようにすると良くなりそうだと思っています

- 距離センサの Notify の頻度を可変にする
- 現状だと Avatar の表情以外を変更しづらいため、データ位置の最初はデータの種類 (表情、口の開ける度合い、目の開ける度合いなど) を表すようにしたほうが良かったかもしれません。
- Avatar の表情を変更するときに、時間のパラメータを追加しても良さそうです.(0なら無期限)

## 接続、非接続時の動作変更制御

FSM で実装しています。

[main.cpp](https://github.com/teach310/ToioFaceM5/blob/main/src/main.cpp)

```.cpp
enum class State
{
    Start,
    Ready,
    Idle,
};

class BaseStateBehavior
{
public:
    virtual void onEnter() {}
    virtual void onUpdate() {}
    virtual void onExit() {}
};
```

接続してない時は Ready で、接続したら Idle になります。(動いてるのに Idle はいかがなものかとは思いましたが他の名前思いつきませんでした。)

再 Advertise が非常にわかりやすく書けたのが良かったかなと思っています。

```.cpp
class ReadyStateBehavior : public BaseStateBehavior
{
public:
    void onEnter() override
    {
        BLEDevice::startAdvertising();
    }

    void onUpdate() override
    {
        if (ble.isConnected())
        {
            setNextState(State::Idle);
        }
    }

    void onExit() override
    {
        BLEDevice::stopAdvertising();
    }
};
```

## おわりに

ATOM Mate for toio で障害物回避をすることは非常に王道な使い方だと思います。
しかし、UIFlow で開発されている場合がほとんどなようです。GitHub Code Search で検索しても ATOM Mate for toio を使っているプロジェクトは1件しか見つかりませんでした。
非常に面白くて魅力的な製品だと思うためもっと流行って欲しいと思っています！
本記事が ATOM Mate for toio を使う上での参考になれば幸いです！
【Ruby Gold3.1詰まったシリーズ】アクセッサメソッドについて

# はじめに
今回はアクセッサメソッドに関する内容です。アクセッサメソッドは最初見た時なんだこりゃとなったのでまとめてみます。

# 確認してみた
環境はruby2.5.3です。
[こちら](https://qiita.com/yoshimitsu_g/items/5f174ff74d8e8b15b0be)の記事より抜粋させていただきます。
アクセッサメソッドは3つの種類があります。
~~~
attr_reader #read（読む）
attr_writer #write（書く）
attr_accessor #access(読むと書くの両方)
~~~
ということで、アクセッサメソッドを試してみます。
まず最初にattr_readerとattr_writerを記述したコードです。
~~~ruby
class Cls
    attr_reader :hoge
    attr_writer :hoge

    def initialize
        @hoge = 1
    end
end

x = Cls.new
x.hoge = 10
x.hoge
~~~
上記を実行すると、
~~~
irb(main):001:0> class Cls
irb(main):002:1>     attr_reader :hoge
irb(main):003:1>     attr_writer :hoge
irb(main):004:1> 
irb(main):005:1>     def initialize
irb(main):006:2>         @hoge = 1
irb(main):007:2>     end
irb(main):008:1> end
=> :initialize
irb(main):009:0> 
irb(main):010:0> x = Cls.new
=> #<Cls:0x00005623d3e36ca8 @hoge=1>
irb(main):011:0> x.hoge = 10
=> 10
irb(main):012:0> x.hoge
=> 10
~~~
x.hoge = 10で@hogeに10を書き込み、x.hogeで書き込んだ10を読み出せています。

次にattr_accessorを記述したコードです。
~~~ruby
class Cls
    attr_accessor :hoge

    def initialize
        @hoge = 1
    end
end

x = Cls.new
x.hoge = 10
x.hoge
~~~
上記を実行すると、
~~~
irb(main):001:0> class Cls
irb(main):002:1>     attr_accessor :hoge
irb(main):003:1> 
irb(main):004:1>     def initialize
irb(main):005:2>         @hoge = 1
irb(main):006:2>     end
irb(main):007:1> end
=> :initialize
irb(main):008:0> 
irb(main):009:0> x = Cls.new
=> #<Cls:0x00005592a4239df8 @hoge=1>
irb(main):010:0> x.hoge = 10
=> 10
irb(main):011:0> x.hoge
=> 10
~~~
x.hoge = 10で@hogeに10を書き込み、x.hogeで書き込んだ10を読み出せています。

最後に、アクセッサメソッドを使用しないパターンのコードです。
~~~ruby
class Cls
    def hoge
        @hoge
    end
    def hoge=(hoge)
        @hoge=hoge
    end

    def initialize
        @hoge = 1
    end
end

x = Cls.new
x.hoge = 10
x.hoge
~~~
上記を実行すると、
~~~
irb(main):001:0> class Cls
irb(main):002:1>     def hoge
irb(main):003:2>         @hoge
irb(main):004:2>     end
irb(main):005:1>     def hoge=(hoge)
irb(main):006:2>         @hoge=hoge
irb(main):007:2>     end
irb(main):008:1> 
irb(main):009:1>     def initialize
irb(main):010:2>         @hoge = 1
irb(main):011:2>     end
irb(main):012:1> end
=> :initialize
irb(main):013:0> 
irb(main):014:0> x = Cls.new
=> #<Cls:0x000055b1fbbcf9c8 @hoge=1>
irb(main):015:0> x.hoge = 10
=> 10
irb(main):016:0> x.hoge
=> 10
~~~
x.hoge = 10で@hogeに10を書き込み、x.hogeで書き込んだ10を読み出せています。
上記の3つのコードは全て同じ結果を得ています。

# おわりに
確認した結果、アクセッサメソッドは attr_reader(読む)、attr_writer（書く）、attr_accessor（読むと書くの両方） の3つの種類があることが分かりました。また、アクセッサメソッドを使用することにより、読み出し用と書き込み用のメソッドをわざわざ作成することなく、読み出し書き込みでき非常に楽だなと感じました。
もし誤っていたらご指摘いただけると助かります！

# 参考
https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1

https://qiita.com/yoshimitsu_g/items/5f174ff74d8e8b15b0be
あと4ヶ月でリタイアする資格に挑戦してAWSのデータ分析基盤を学ぶ─AWS認定DAS-C01資格試験合格体験記

先日、[AWS認定Data Analytics - Specialty](https://aws.amazon.com/jp/certification/certified-data-analytics-specialty/)資格試験（DAS-C01）に合格しました。その折の学習方法をまとめておきます。

ただしタイトルにもある通り、この記事を執筆している2023年12月現在、この資格はあと4ヶ月後（2024年4月）にリタイアします。そして一方で [AWS Certified Data Engineer - Associate](https://aws.amazon.com/jp/certification/certified-data-engineer-associate/?ch=sec&sec=rmg&d=1)（AWS認定データエンジニア - アソシエイト）の資格試験がベータ段階にあり、今後正式に展開、日本語での配信も始まるものと思われます。

したがってこのこの記事に何か「自慢」以上の意味があるとすれば、来るべきデータエンジニア資格試験の正式開始に備えてお勉強しておく上での参考ということになると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/d023ab55-115e-ad51-9d4d-d8283987a35f.png)

# 前提

* 受験した試験バージョンは __DAS-C01__。バージョンが変わらずとも出題内容は徐々に変わっているようなので、あまり意味がないかなと思いつつも一応。
* 受験時点で __五冠達成済み__（SAA、DVA、SOA、SAP、DOP）。これらの資格試験は参考書やEラーニング教材の揃いが比較的よく、そこで学んだこと（とくにSAP）がANSにも活かせる部分が多々ある。このため __五冠達成ののちに受験することをオススメ__。ここまで、ANS-C01、SCS-C02、DBS-C01と進み、今回 DAS-C01に取り掛かった。
* 私自身は実務でAWSの管理コンソールやCLIを利用する機会がほとんどなく、ここ2ヶ月ではじめてがっつりAWSを舞台にした案件に関わる機会を得たような状態。いわんやデータ分析基盤はさらに縁遠くオンプレミスでも接点はほとんどなかった。とはいえ、他のAWS資格同様、出題範囲は広範に及ぶから、 __「実務経験があること」を武器にすることも、「実務経験がないこと」を受験しないことの言い訳にすることもできない__。つまり経験のないことは大した問題ではない！

# 学習方法

受験準備期間は1.5ヶ月ほど。

1. Udemyで配信されている模擬試験問題集 _"Practice Exams | AWS Certified Data Analytics Specialty"_ （Stephane Maarek氏とAbhishek Singh氏） の 演習テスト1（10問）をこなした。
出題傾向をなんとなく知っておきたかったため。正答率50％。不合格！
1. Udemyで配信されている講義 _"AWS Certified Data Analytics Specialty 2023 - Hands On!"_ （Frank Kane氏とStephane Maarek氏）をセクション1〜6まで受講。
 AWSが提供するデータ分析基盤構築のための主要サービスや機能について知ることができた。
1. あらためて、_"Practice Exams | AWS Certified Data Analytics Specialty"_ の演習テスト2（65問）をこなした。
これはもちろん理解度を計りつつ、解説で理解不足を補うため。正答率53％。。不合格！！

で、この時点で試験当日の朝8時でした。。。😱
さいわい眠いので危機感はあまりありませんでした。試験センターにGoです。
結果、800点ちょっとでなんとか合格。

# 学習方法の補足

今回参考書は利用しませんでした。これまでSAA、DVA、・・・、SAP、DOP、ANS、SCS、DBSとAWS認定資格に順番に挑戦してくる中ではすべて、まず参考書を通読してから模擬試験問題という順序できました。ただその過程で専門分野系（Specialty系）の参考書はお守り程度と理解。「要点整理から攻略する」シリーズはAWS認定資格のカバー範囲は素晴らしいのですが、個々のテキストの内容としてはあまり「要点整理」を感じず。
SAAやSAPで身につけた一般的な知識は本当に応用が効くので、これを土台にAWS　SkillBuilderやUdemyといったEラーニング教材でより詳細な知識を付け加えるというので十分かも、と考えるに至りました。

そのEラーニング教材についても、AWS　SkillBuilderではDAS-C01資格試験の対策コースが模擬試験問題しかなかったため、結局利用するのはUdemy一本に絞りました。

他の資格試験では同じUdemyのコースでも Neal Davis氏が配信する講義や模擬試験問題を利用してきた。そちらのほうが私と感覚ではより解説がよかった印象のため。
ですが、Neal Davis氏が配信するコースはDAS-C01資格試験をカバーしておらず。そのため前述の2つのコースを利用しました。

# 所感

実際受けてみて感じたこと：

* 他の方もおっしゃられていますが、本資格のターゲットはデータアナリストではなく、データアナリストのために基盤を構築・運用するITエンジニア。
このため _Data Analytics_ と聞いて非常に専門性の高い領域と身構える必要はなし。試験を実際に受けてこの点を実感。
* 講義や模擬試験問題でもそれなりに取り上げられていたが、 MSK（Amazon Managed Streaming for Apache Kafka）やAmazon Kinesis Data Analytics for SQL ApplicationsはAWSが考えるデータ分析基盤において重要なピースである模様。
* データレイクは「組織内のデータやそれらのデータアクセスをする人間を管理するもの」というイメージだったが、「データレイク間の（したがって比較的大きな組織間の）データの共有も管理するもの」という一面も持つことは、本試験を通じて気づかせられた点。
信頼できるUSBメモリー・SDカードを使おう

本記事は、[めんどい太郎の Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mendoitarou_first_calendar) 13日目の記事です。

# はじめに

この記事は初心者が書いています。

皆さんはUSBメモリーやSDカード、使ってますか？

外付けHDD・SDDを使っている方や、最近はクラウド使っている方もいらっしゃると思いますがそれでもUSBメモリーやSDカードは使われていると思います。

今回はやっすいUSBメモリー・SDカードを買って失敗した話をしていきます。

(たまたまハズレを引いた可能性があるのでメーカー名は伏せておきます)

# SDカードでの経験

私は昔、SDカードの信頼性とか何も考えずに安いからこれでいいやといった感じでやすいものを購入していました。

もちろん、安いSDカードの中にも当たりはありますが信頼性というのは非常に大切です。

容量詐欺などの調べればわかることに加え、耐久性といった問題もあります。

この耐久性。非常に大切です。

昔、安いSDカードに音楽やそこそこ大事なファイルを保存して使っていました。

しばらくの間は普通に使えていたんですよ。

しかし。その日は突然やってきます。

**急にSDカードが認識されなくなった**のです。

絶望です。

バックアップを取っていなかったことを非常に悔やんでいます。

データ復旧業者にいつか頼めるかも...!とSDカードは念のため廃棄せずに残していますが、結果として保存されていたデータはすべて消えてしまいました。

なんせ、SDカード自体が認識されないのですから...

その時からSDカードなどの信頼性を重要視するようになりました。

これは余談なのですが、安いSDカードは電子辞書が認識してくれません。

ダイソーで最近500円で売られているSDカードと同じメーカーのSDカードを指しましたが認識せず、TranscendのSDカードを指したところ認識してくれました。

有名どころのものを使っておけば間違いないですね。

# 信頼性

信頼性は非常に大切です。

性能はもちろん、耐久性などのわかりにくい面も安心できます。

信頼というのは企業によるたくさんの努力によって築き上げられるものです。

有名メーカーのものは信頼性が高いことがほとんどです。

データを収集・分析しているサイトがあったりするのではないでしょうか。

今回は信頼できるであろう(少なくとも私が信頼している)メーカーをご紹介いたします。

## SanDisk

超有名メーカーです。

SDカードと言えば``SanDisk Extreme Pro``と言われるぐらいではないでしょうか。

私のメインスマホにはSanDiskのSDカードが入っています。``Extreme Pro``を買ったはずですがちょっと覚えてないです()

SanDiskのそこそこのSDカードを買っておけば間違いないのですが、高いです。

## Transcend

そこそこ有名なメーカーです。

信頼性が高く、品質もいいです。

ゲーム機のSDカードがたしかTranscendのSDカードだったはずです。

価格も比較的安く買いやすいです。

## KIOXIA

旧東芝メモリです。

信頼性が非常に高いです。

KIOXIAのUSBメモリーを2個持ってます。

性能もよく価格も安めだと思います。

たしか日本製だった気がします。すごい。

# 終わりに

皆さんに同じような思いをしてほしくないので記事にしました。

しかし、信頼できるものを使っていたとしても**バックアップを取るのは忘れずに！**

バックアップは偉大です。
(Python)今更すぎるQRコード生成

## はじめに
思い立って即興で作ったので備忘録として投げとく
画面のボタン押す→ポップアップしてQRコード出てくる
って感じで

## コード
画面
```
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テスト</title>
</head>
<body>

<button onclick="openPopup()">表示</button>

<script type="text/javascript">

function openPopup() {
	let option = 'width=300,height=300,left=200,top=200';
	let newwin = open('qr.py','mywindow', option);
}
</script>

</body>
</html>
```
ボタンが付いてるだけ
もはやスクショ張る意味あるんか...?
![スクリーンショット 2023-12-11 000332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3225408/9bff453a-69b3-d24c-7d6f-997d56fb6a95.png)

Python
```qr.py
#!/usr/local/bin/python3.9

import pyqrcode
import sys
import tempfile

class QR:

	def __init__(t):

		#qrコード生成
		t.qr = pyqrcode.create('https://www.google.com/')
		t.make()

	def make(t):

		#tmpDIR内で作業
		with tempfile.TemporaryDirectory() as td:
			#配置、大きさはお好みで
			t.qr.png(td + 'test.png', scale=5)
			#バイナリモードで読み込んで取得
			with open(td + 'test.png', 'rb') as f:
				b = f.read()
		QR.out(b)

	def out(t):

		#出力
		print('Content-Type:image/png')
		print('Content-Disposition: inline; filename="test.png"')
		print("")
		sys.stdout.flush()
		sys.stdout.buffer.write(t)
		exit()

#インスタンス化
QR()
```
ボタン押すとこんな感じ
![スクリーンショット 2023-12-11 000227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3225408/2b7354e9-8834-9748-9a06-e2e0b60b282d.png)

## 所見
・そもそもpyqrcodeモジュールの選定って妥当なのか
・一時ディレクトリでの作業、もうちょっとスマートにできなかったのかね


## 参考文献
https://www.javadrive.jp/javascript/webpage/index2.html#section1
p5.js と Tween24.js を組み合わせたアニメーション・イージングのお試し【完走賞ゲット-12】

:::note info
※ [Qiita の完走賞をゲットするための条件は「単一／複数のカレンダーに投稿した記事が合計25」です](https://twitter.com/Qiita/status/1593441648796524545)
:::

この記事は、「[完走賞ゲットのため小ネタ 25記事を投稿しようとチャレンジ v2 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/youtoy)」の 12日目の記事です。

## 今回の内容
今回の内容は、p5.js と Tween24.js　を組み合わせて使ってみた、という話です。

### Tween24.js とは
今回、描画ライブラリの p5.js と組み合わせる「Tween24.js」は、メソッドチェーンでアニメーションが書けるライブラリです。

●新感覚！メソッドチェーンでアニメーションがスラスラ書ける「Tween24.js」を作りました - ICS MEDIA
　https://ics.media/entry/210409/
●a24/tween24js: Tween24 for JavaScript
　https://github.com/a24/tween24js

#### 過去に使ったアニメーションライブラリ
過去に、自分が使ったことがあるアニメーションライブラリには、主に anime.js と p5.tween の 2つがありました。

anime.js については、以下など試した内容を Qiita の記事にも書きました。

- [p5.js と anime.js を組み合わせた Tweenアニメーション【その2：キーフレームを使ってみる】 - Qiita](https://qiita.com/youtoy/items/61c6d57dff822c055b46)
- [p5.js と anime.js を組み合わせた Tweenアニメーション - Qiita](https://qiita.com/youtoy/items/361282f1113d88ff5f05)

また、p5.tween を試した時の X のポストは、以下のとおりです。

https://twitter.com/youtoy/status/1439744317283713024

#### Tween24.js を試そうと思ったきっかけ
Tween24.js自体は、上で掲載していた内容を試す前の調査で見かけていました。

そして、いつか試してみようと思っていたのですが、試すことないまま時間が流れていていたのですが、最近以下の記事を見かけて、手をつけてみようと思いました。

●Tween24.jsでアニメーションを実装してみたので解説 #虎の穴ラボ Advent Calendar 2023 - 虎の穴開発室ブログ
　https://toranoana-lab.hatenablog.com/entry/2023/12/10/100000

## Tween24.js を使う
### p5.js と Tween24.js を組み合わせる
まずは、 p5.js と Tween24.js を簡単に組み合わせられるかを試してみます。

それを試す環境としては、Web上でコーディングと作ったものの実行が簡単に行える p5.js Web Editor を使います。

#### Tween24.js を読み込む
CDN から読み込めると便利かなと思って、「Tween24.js CDN」というキーワードで調べてみました。

そうすると、以下を使うと良さそうなことが分かりました。

https://www.jsdelivr.com/package/npm/tween24

#### p5.js Web Editor で簡単に試す
p5.js Web　Editor上で、上記の CDN経由でのライブラリの読み込みをやってみます。

まずは簡単なコードで動作確認を行ってみます。
流用できそうな情報を探してみたところ、公式の以下が活用できそうでした。

![パラメータのイージング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/2e5f42e2-dd43-73ee-5269-f5bdfd8543e3.png)

以下のコードを実行することで、DOM を対象に指定するのではなく、パラメータを指定した処理を実現できそうです。

```javascript
let tweenData, tween;

function setup() {
  createCanvas(500, 400);

  tweenData = { progress: 0 };

  tween = Tween24.tween(tweenData, 1, Ease24._Linear, { progress: 1 });
}

function draw() {
  background(220);

  const x = tweenData.progress * width;
  circle(x, height / 2, 100);
}

function mouseClicked() {
  tween.play();
}
```

実際に動作をさせてみたのが以下です。

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

無事、画面の一方の端から他方の端へ動くのが、想定通りの動きになりました。

#### イージングの指定について（デフォルトの内容とそれを変更する話）
今回、上記でのイージングは `Ease24._Linear`　を使いました。
こちらは、公式の記事を見ていると、イージングの種類を省略しても、同じ `Ease24._Linear`　が設定されるようです。

このデフォルトで設定されるイージングの種類は、 `Tween24.setDefaultEasing()` を使うことによって、変更もできるようでした。

![デフォルトの変更](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/98ca7609-14ab-426b-bf93-3b69f85df715.png)

## おわりに
今回、今まで使ったことがなかったアニメーションライブラリを使い、イージングの処理を簡単に試してみました。

ひとまずベースはできあがったので、さらに Tween24 を使ったアニメーションと p5.js の組み合わせを試していければと思います。
システム開発の速度を上げるポイントと順番

# 最短距離を目指す
書きたくなったので書く。ポエム。
システム開発の速度を上げたいなら、まずは最大瞬間風速をあげていく。どうしたら速くなりますか？ではなく、縮められる箇所を積極的に縮めにかかる。
順番も大事で、そもそもの前提から改善する。順当な部分を縮めるのには時間がかかる。

## ①道具を使いこなす
まずは道具を見直す。最も手っ取り早く、最も効果が高い。必要な金はかける。
PCが重いとかモニターが足りないとかマウスがないとか寒いとか乾燥してるとか、そんなことでもやもやしている暇はない。

## ②道具に触る時間を減らす
同じものを作るのに、キーボードやマウスを触っている時間は短ければ短いほど良い。
ので、タイピングは早い方がいいしショートカットキーは当然使うし必要な情報やツールは取り出しやすいようにしておく。

## ③先にやっておく
声がかかる前にスタートする。早く取り掛かれば取り掛かるほど調整が効く。少し余裕があるのなら、数日後に取り掛かる仕事をざっと見て先に要件を整理しておく。基本的には数日ほど前倒しでサイクルが回るようにスタートを調整する。
集中すべき作業に集中できるタイミングを作る。逆に集中できていないときに進めるタスクも用意しておく。「何やろうかな？」の時間を作らない。
そのためにも、同じ作業は二度やらなくて済むように整備しておく。やらなくていいことはやらずに済むように整備する。

## ④必要十分なものを思い描けるようになる
手を動かす前にまずは最短経路を組む。
新規機能ならまず根幹を作ってから細部を仕上げていく。バグの修正であれば再現→原因特定を最優先に取り掛かる。
細かいことに気を取られだすと開発は終わらない。ど真ん中の2割をまず仕上げることで進捗は8割になり、残り8割の細部は状況によっては減っていく。そのためにもど真ん中を外さないように確認する。

## ⑤思っていたものを作れるようになる
新規開発だろうとバグの修正だろうと、「こう書けばこう動くな」は一発で仕留めたい。
日々扱っているプロダクトであれば、ソースコードと機能の両面から仕様を理解する。一度見た仕様は、覚えるか引っ張り出せるようにしておく。

## ⑥手戻りを起こさない
作っている機能について一番詳しいのは、作っている最中のあなたである。翌日他人にバグを見つけてもらった時には数割忘れているので、思い出すことに時間を割かねばならなくなる。
なので、一番詳しいうちに十分に確認する。要件を満たしているか、バグがないか、記述は合理的か、パフォーマンスは十分か、脆弱性はないか、見た目は悪くないか、使い心地は及第点か、他の機能に影響を出さないか、など。一度で全ての観点を確認できればいいが、そうもいかないので必要な回数だけ確認する。
可能であれば十分な確認が終わったその場でリリースしてしまった方が良い。

## ⑦速くなったと言う
実際に速くなったら周りにその事実を伝える。きっと周りから褒められて自信がつき、ここまでのことをさらに大胆に行うことができ、より速くなる。開示による底上げ。術式と同じ。

# 以上ポエムでした
理想はこう。
そうもいかないときは、どこを縮められたかを案件ごとタームごとに考えて削っていく。
あと、下積みのターンと縮めにかかるターンは交互に必要なので、自分がいまどちらのターンかは考える。
【Ruby】最近使い方がわかってきたメソッド5選

# はじめに
最近使い方がわかってきたメソッドを5つまとめました。
5選と言いつつ、丁度5つしかありません。

# values_at

引数で指定されたキーに対応する値の配列を返します。

```ruby
h = {1=>"a", 2=>"b", 3=>"c"}
p h.values_at(1,3,4)               
#=> ["a", "c", nil]
```

例えば、ユーザーのプロフィール情報がハッシュに格納されていて、特定の情報（例：名前、年齢、住所）だけを取得したい場合などに使います。

```ruby
profile = {name: "Taro", age: 20, address: "Tokyo", job: "Engineer"}
p profile.values_at(:name, :age) #=> ["Taro", 20]
```

https://docs.ruby-lang.org/ja/latest/method/Hash/i/values_at.html

# max
maxは、配列の要素から最大値を返すメソッドです。
引数がない場合、配列の中から最大の要素を返します。
引数がある場合、引数で指定した数だけ最大の要素を降順の配列で返します。

```ruby
sample = [5, 8, -6, 15]
result = sample.max # resultには15が返されます
result = sample.max(2) # resultには[15, 8]という配列が返されます
```
https://docs.ruby-lang.org/ja/latest/method/Array/i/max.html

# min
min、配列の要素から最小値を返すメソッドです。
引数がない場合、配列の中から最小の要素を返します。
引数がある場合、引数で指定した数だけ最小の要素を昇順の配列で返します。

```ruby
sample = [5, 8, -6, 15]
result = sample.min # resultには-6が返されます
result = sample.min(2) # resultには[-6, 5]という配列が返されます
```

個人的には引数で与えるのではなく、配列で比較するように使うと便利でした。

https://docs.ruby-lang.org/ja/latest/method/Array/i/min.html

# transform_values
transform_valuesは、ハッシュの全ての値に対してブロックを呼び出し、その結果で置き換えた新しいハッシュを返します。

```ruby
h = { a: 1, b: 2, c: 3 }
h = h.transform_values {|v| v * v + 1 } # hは{ a: 2, b: 5, c: 10 }になります
```
ハッシュの全ての値に対して同じ操作を適用したい場合に便利です。
例としては、商品の価格がハッシュに格納されていて、全ての価格に対して税を適用したい場合などに使えそうです。

```ruby
prices = {apple: 100, banana: 200, orange: 150}
prices_with_tax = prices.transform_values {|price| price * 1.1 }
p prices_with_tax #=> {:apple=>110.0, :banana=>220.0, :orange=>165.0}
```
https://docs.ruby-lang.org/ja/latest/method/Hash/i/transform_values.html



# tap
tapは、レシーバ（呼び出し元のオブジェクト）を引数としてブロックを評価し、その後でレシーバを返します。

```ruby
value = 10
value = value.tap{|x| p x * 2 } # 20が出力され、valueは10のままです
```

tapメソッドはレシーバをそのまま返すため、メソッドチェーンの途中で変数の値を確認するなどのデバッグに利用できます。

```ruby
[1, 2, 3, 4, 5].tap { |x| puts "original: #{x.inspect}" }.select { |x| x.even? }
# original: [1, 2, 3, 4, 5] => [2, 4]
```

https://docs.ruby-lang.org/ja/latest/method/Object/i/tap.html
温度センサーMCP9701で遊ぶ改(固定小数点16,16)(わかりやすく)


x MCP9701-E/TO 販売コード 103199

温度センサーMCP9701で遊ぶ改(固定小数点16,16)(わかりやすく)


目的
温度センサーのテスト

温度係数 19.5mV
中心電圧 400mV(-20.5℃する)

参考


https://qiita.com/caa45040/items/bc0214a096f7663e00ce


![o_cop851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/50f6d843-176a-ff22-d93d-f9a756682e4f.jpeg)



プログラム


```c++


//S_SER_9701_O3_031_1

//インクルド
#include <Arduino.h>
#include <HardwareSerial.h>


//定義
//固定小数点　乗算、除算
#define MUL(q,w) ((int)( (((long long)(q)) *  ((long long)(w)))>>16 ))
#define DIV(q,w) ((int)( ( (((long long)(q))<<16) /  ((long long)(w))) ))
//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)


//初期化
void setup()
{

  delay(3000); //not delete

  //シリアルの初期化
  Serial.setTx(PA2_ALT1);
  Serial.setHalfDuplex();
  Serial.begin(9600);

} //setup


//メインループ
void loop()
{

  //アナログ値の読み込み
  analogReadResolution(12); //adc 12bit mode
  int s = analogRead(PB7);   // PIN1

  //s=1024;

  //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
  s = MUL( s << 16 , DIV((3300 << 16), (4096 << 16)) ); //電圧を求める
  s = s - (400 << 16) ; //-400mVする
  //電圧を10で温度係数19.5mVを割る
  s = MUL( s , DIV( (10<<16) , (19 << 16) + 0x8000 ) );
  s = s>>16; //桁をずらす

  //温度の表示
  Serial.print( DIV10(s) );            // 小数点以上
  Serial.print(".");
  Serial.print( s - (DIV10(s) * 10) ); // 小数点以下
  Serial.println();

  //1秒の待ち
  delay(1000);

} //loop


```
【脱怠惰】振り返りの質を改善し、改善アクションの精度を高める

# 本記事の想定読者
以下に当てはまる方に役立つのではないか？と思っています。
- 作成するプルリクがなかなかマージされずに苦労している
- 自分が書いたコードを見直そうと考えているもののなかなか手をつけられていない
- 「全然上記に当てはまらないわ、自分対象者じゃないわ」と思った方

# レビューコメントにじっくり向き合う時間がない（のは僕の言い訳でした...）
エンジニアの仕事の中で、**プロダクトの品質を高める**ための仕事があります。

皆さんお察しの通り、**PRレビュー**です。

我々エンジニアは日々、プロダクト品質向上を目指し、レビューという行為をもってしてコードに向き合っているのではないかと思います。
僕が所属するチームも例外ではなく、僕自身日々多くのレビューコメントを頂いています。

そんなレビューコメントですが、かくいう私は現在新卒一年目ということもあり、他の方よりも知見が少ないこともあったりして、レビューコメントもその分増えるわけです。

正直なところ、レビューがなかなか通らなかったりすることもあります。
その際は、発狂とまではいかないまでも、心の叫びがtimesに飛び交うこともしばしばあったりします。
![スクリーンショット 2023-12-11 21.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239086/46e54114-ffd0-3c1d-deae-aa9a8a30e657.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239086/5db66b0c-5cbd-8018-d0fc-3bbb0d3307fd.png)


# 日々の振り返りのハードルを高めている要素は何か

色々考えてみたのですが、これは紛れもなく**自分の怠惰さ**しか考えられませんでしたｗ

時間は有限です。
僕たちは限られた時間の中で、よりプロダクトを発展させるために、素早く成長することが求められます。


成長するためには、何が必要か？
PDCAPDCAPDC.....


日々課題を抽出し、仮説を元にアクションを実行し続けるほかありません。

「誰しもがそんなことはわかっているんだ。」

わかっているのですが、人間とは怠惰なもので、**一度失われた習慣を取り戻すためには膨大なエネルギーを要します。**

最初のうちは振り返りを行っていたのですが、一瞬仕事に追われる期間があってからはその習慣はどこへやら...
気づいたときには、プルリクエストの山は増え、コメントも膨大になっていました...

ここから一つ一つコメントを追っていくのは正直得策じゃないなと思いつつ、時間だけが過ぎ去っていったのです。

本当に、「その都度学習しろよ」という感じですよね...

ちょうどアドベント・カレンダーのネタを探していたところ、そういえばプルリクのコメント抽出して分析したいと思っていたことを思い出し、今にいたります。

人間の怠惰を技術の力で解決していきます。

# 定期的にレビューコメントを収集、分類し、結果を可視化する
今回作成したものとしては以下です。
repo: https://github.com/fqqk/pull-req-comment-collecter

:::note alert
 もしこちらのスクリプトの利用を検討していらっしゃる方は一度踏みとどまって考えてください。こちらは最終手段としてご利用ください。日々の継続的な振り返りをすることを推奨いたします。
:::

スプリント期間内（SUPERSTUDIOでは2週間を1スプリントとしています）で作成した自分のプルリクエストに寄せられたレビューコメントを抽出してスプレットシートに貼り付けるということをしています。
スプシでやりたかった理由としては以下の通りです。
- コメントをカテゴリ分けして自分のコードの特徴を可視化したかった
- 改善の様子を時系列で追っていきたかった
- API触ったことがなかったので興味本位で

また、振り返りを定期的に行えるよう、スプシへの書き込み完了をトリガーとしてslack通知をしています。
![スクリーンショット 2023-12-19 10.47.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239086/4c31b59c-d709-f6fe-3a4f-5a1ca7270aab.png)




実際に取得した結果はこんな感じで、まあなんともシンプルな完成形です。
![スクリーンショット 2023-12-19 10.51.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239086/c732a7f6-adce-417f-ee60-2ebc18747d7f.png)

カテゴリ欄は振り返り時にコメントと向き合って主観的に記入していく感じです。（僕はchatGPTにコメントを流して意図を聞いたりして言葉を補ったりしました。）

（カテゴリの自動分類も機能に追加しようかと思ったのですが、自分の振り返りの機会が失われそうだなと思ってやめました。）


埋めたカテゴリ列をグラフ化するとこんな感じです。
![スクリーンショット 2023-12-11 20.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239086/b123bff5-f514-f272-a0a3-e0a22789bb62.png)
結果から、僕の現状のコードには
1. 無駄
1. 命名
1. 対応漏れ

という特徴が目立つことがわかります。
改善アクションとしては、まずはこのことを認識するところからスタートです。
認識さえしていれば、次の開発時には

「無駄なコードになってないかな？」

「命名迷って仮決めしたけど、そもそもこのメソッドでやりたいことが多すぎやしないか？」

「対応漏れしないようにするために対応することリストでも作るか」

のようなことが頭に浮かぶようになります。

これだけでもだいぶ仕事がうまく進む可能性は高まることが期待できそうです。（認知は非常に大事）


# まとめ

振り返りは適切な単位で定期的に行うのがベストです。
これからも振り返りを大切にしつつ、プロダクトをより良くするべく鍛錬していきたいです。

作ったからには、ちゃんと運用して振り返りを継続的にやっていきたいと思います。
読んでいただきありがとうございました！
生活と欲求と節約

# 　お金がない
みんなの悩みでしょう。私もかつてお金がなくて大変困ったことがあります。私のノウハウをお伝えします。

## 生理欲求
睡眠欲とか性欲とかそう言うのは置いておいて、日々突発的に起きる、我慢が許されない欲求に対する対応を書きます。

### 食欲
これは下手だが以下の二つに頼っていた
- もやし（半額になっているものを大量に買って湯通し、漬物にして日持ちさせる。主に安いキムチの素で漬けて食べてた）
- 乾麺パスタ（1キロ100円などのものがたまにあった。1キロあると3日は食べれるし、茹でるお湯に塩を入れれば味もつく）

そして困った時のマヨネーズ（1キロ単位で売ってるやつは安い）だった。
飲み物は基本水道水である。パックのお茶など買ったことはあるが、安物はとにかく不味くてまだ水道水の方がマシ、となることが多い。
闇金ウシジマくんで金のない債務者が乾麺のパスタを食べていたのはとてもリアルに感じた。
パスタを食べ続けるのも飽きると思うのでふりかけを何種類か買ってローテーションするのも良いと思う。私はたらこふりかけとのりたまをたまにパスタにかけて食べていた。これも大きな袋のものを買えば1ヶ月は持つので日割りなら2〜3円程度ですむ。

### 排泄
これは本当に困っていた。何に困るかというとトイレットペーパーで、1日の食費を数十円に抑えなければいけない時期には気軽に買える値段じゃなった。なので主に以下の施設に頼った。

- 公園の公衆トイレ

コンビニという手はあるのだが、遠いというのと、何よりもたどり着いた時に「他の誰かが入っている」と言うリスクが大きすぎる。施設のランクが落ちても人がまずいない公園で済ませるのが安全である。フールプルーフを前提としたフェールセーフ設計である。なによりトイレットペーパーを買わなくて済むのだからそれだけで御の字だ。もやしとトイレットペーパーのどっちを買うか本気で悩んでもやしを買った経験から思いついたシステム設計である。

## 生活インフラ
### 家賃
どうしようもない。とにかく安いところ探すくらいしかない。
私の時は練馬で3万円という物件があったが下の階に住む大家さんが精神病で物音を立てると怒鳴り込んでくる、と説明を受けたので諦めた。
代わりに大家が裁判中で負けたら競売へかけられ、追い出されるリスクがある代わりに家賃が安いという物件（駅から徒歩25分）に住んだ。

### 電気代
家にいるだけでかかる。特に困るのが夏や冬で、暑さと寒さが耐え難いが空調は電気代が高い。対策としては
- 公共施設（図書館や役所など、これが本命。でもなかなか近くにない）
- 商業施設（近くにないことも往往にしてある）

などにいることである。特に図書館は金がないけど色々あるので時間が潰せる。私は本の在庫を探すシステムで検索をして気を晴らしていた。

でも深夜帯はそう言った施設もなくてなんとか耐える方法を探す必要がある。がこれは失敗に終わった。
私は夏は裸になり、冬はとにかく厚着をして耐えたのだが、夏はなんとか耐えれたものの冬は風邪をひいて余計に金がかかった（病院に行ったので）。失敗である。

###  水道
これはトイレと同じく公園を主に頼る。と言うより水道を使うのはトイレが殆どで、ついでに公園では水も飲める。住居が公園に近いと言うのはとても重要である。
シャワーに関しては私が皮膚病なので体を洗わないことにはどうしようもないので諦めるしかなかった。肌が強ければもっと他に節約法あるかも


## 行政
年金とか社会保険料とか住民税とかそういうやつ。
これはどうしようもない。役所に行ったけど相談にもまともに乗ってくれない。年金と住民税がマジで辛かった。食費等で数百円浮かせたところでここで全部持っていかれる。すげえ辛かった。
健康保険も出費を浮かせるために入らなかったが、帯状疱疹が出てしまったので自力治癒は無理だろうと言って入った。これも高くて苦しかったが顔半分にヘルペスが出た以上仕方なかった。この1回ならば10割負担で一回払った方が安かったのかもしれないが、先述した様に冬には風邪もひいてしまったのでどうしようもなかった。


##  持っておくといいもの

### キャリーカー
　数百円のものでもあるとよい。1キロのパスタを買うにしても家まで持って帰るってなるとすげえ辛い。1回30袋くらいを無理やり手で持って帰って辛かった。キャリーカーがあると3時間くらいかけて行ったスーパーで買ったものも何とか持って帰ってこれる。
今だとダイソーでも売ってるんですね。
https://jp.daisonet.com/products/4550480038841

### 自転車
値段が高いので躊躇するのだが、あるとやはり便利。徒歩で3時間かけて行くスーパーも1時間程度で行って帰ってこれる。ただ、持ち運べる用量が少ない。

#### 先人はすごい
上記を踏まえると、西成や寿町にいるドヤの爺さんが自転車の荷台を板とかで拡張しているのは理にかなっているなと思う。

##  その他些細な話
### 常に下痢
常に腹を下していた。今思えば水とパスタともやしが主食なので当たり前な気がする。

### ゴミに虫が湧く
ゴミ袋買う金が勿体無いので半月から1ヶ月ゴミを袋にためて捨てていたが、小蝿が孵化していた。今考えるとアホだなと思うんですが1日の食費が数十円とかだとゴミ袋一枚(2円)程度でも死活問題に感じちゃうんですよね。

### 10円でも安ければ電車じゃなくバス
これは出勤の話で、10円あればもやし食えるので少しでも安くする方法を考える。収入が増やせない以上はそれしかなし。都会だとチケットショップで切符が安く売ってたりもする。もちろん歩いて行けるなら歩く。

### 靴のサンキめちゃ靴安い
当時200円〜300円で一足買えた気する。金がない分とにかく歩くのでここで運動靴を買って履き潰していた。今は売ってないのかな？

##  今でも思い出すこと
夏の暑さに耐えかねて意を決して買ったガリガリ君が、店出て開けた瞬間道路に落ちた。その場で1分くらい叫んだ。

##  そもそも何でこんなことに
就職がリーマンショックに直撃。
東京で就職難なので田舎の地元に求人などあるわけもなく、
職歴に穴を開けないためには安給料でも東京に縋るしかなかった。
当時第二新卒って言葉ありましたけど、普通に新卒取るでしょと思う。
当時は4次受け5次受けで自分の会社の名刺出せないとかあたりまえだったよね。
ミーティング中を検知して周囲の人間に知らせる(2)

# ミーティング中を検知して周囲の人間に知らせる(2)

今回はGoを利用して、LEDを光らしていく―――
予定だったのですが、以前作成したRaspberryPI開発用のDockerではPythonでしかGPIOをエミュレートできなさそうでした。
なので、今回はPythonを利用してLEDを光らしていきます。
（また番外編でGo+DockerでGPIOをエミュレートするのに挑戦したいと思います）

## 構成

PythonでWebサーバーを立ち上げ、GETリクエストでLEDをON/OFFする

## 回路

以下回路図です。
誰がなんと言おうと回路図です。

![image-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213727/660f930c-2cd9-e24f-a1f4-d42064d3dff3.png)

ラズパイから1000Ωの抵抗を挟んでLEDに通しているだけです。

## コード

さすがPython、直感的でスマートですね。

``` python
from gpiozero import LED
from http.server import BaseHTTPRequestHandler, HTTPServer
import threading

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/led/on':
            led.on()
            self.send_response(200)
            self.end_headers()
            self.wfile.write(b"LED ON")
        elif self.path == '/led/off':
            led.off()
            self.send_response(200)
            self.end_headers()
            self.wfile.write(b"LED OFF")
        else:
            self.send_response(404)
            self.end_headers()
            self.wfile.write(b"Not Found")

def run_server():
    server_address = ('', 8000)
    httpd = HTTPServer(server_address, RequestHandler)
    httpd.serve_forever()

led = LED(17)

server_thread = threading.Thread(target=run_server)
server_thread.daemon = True
server_thread.start()

print("Server started at http://localhost:8000")
print("Send GET request to http://localhost:8000/led/on to turn LED on")
print("Send GET request to http://localhost:8000/led/off to turn LED off")

server_thread.join()
```

## 動作確認

上記で建てたサーバーに以下の感じでCURLでリクエストするとLEDが光ります。

``` bash
curl http://localhost:8000/led/on # LEDオン
curl http://localhost:8000/led/off # LEDオフ
```

![IMG_2971.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213727/b0486975-5c55-c1aa-cf7b-95eb35fc1d03.gif)

きれいですね。

## 終わり

Goで全部やれると思っていたが、甘かった。
必ずリベンジしてやる、、、
並べ替え（JS）

## ➀ageで並べ替え
```js
const user = [
	{ name: "a", age: 21 }, 
	{ name: "b", age: 30 },
	{ name: "c", age: 19 }
]

const result = user.sort((a, b) => {
	return (a.age < b.age) ? -1 : 1  //昇順
})

console.log(result)
```
```
[{ name: "c", age: 19 },
 { name: "a", age: 21 }, 
 { name: "b", age: 30 }]
```

## ➁ageで並べ替え
```js
const user = {
	0: { name: "a", age: 21 }, 
	1: { name: "b", age: 30 },
	2: { name: "c", age: 19 }
}

const result = Object.keys(user).map((key) => {
	return user[key]
}).sort((a, b) => {
	return (a.age < b.age) ? -1 : 1  //昇順
})

console.log(result)
```
```
[{ name: "c", age: 19 },
 { name: "a", age: 21 }, 
 { name: "b", age: 30 }]
```
cargoのRegistryについて

CargoのRegistryについて解説します。

# Registryとは？

Cargo,crateの文脈で言うとRegistryはcrateを配信するAPIです。
有名、というか公式のcrates.io以外の知名度はないに等しいので実質crates.ioだと思ってくれていいです。
Registryの役割はCargo向けにcrateをダウンロードできるようにしたり、アップロードできたり、所有者を変えたり、crateの情報を取得で来たりします。

# crateのダウンロード方法
CargoがRegistryからcrateを取得する手段は以下の通りです。
1. CargoがRegistryからindexを取得する
1. indexの情報を基にcrateファイルをダウンロードする

## index

indexには、crateの情報が保存されています。
決められたディレクトリ構成に則って配置されたjson"もどき"のファイルを保存してあります(内部はjsonのobjectを配列にせずに結合した形のファイル)。
中身の情報はほとんどCargo.tomlと同じです。
違いは、
- yanked (取り下げられているか)
- checksum (.crateファイルのSHA256 checksum)
くらいでしょう。
またindexにはcrate情報のほかにconfig.jsonがあります。
ここにはレポジトリのdl先やapiのURLが載っています。

index取得には二種類の方式があります。

### git

gitはその名の通りgitでindexを取得します。
indexの全ファイル(!)が入ったレポジトリからclone,pullして取得します。
よって"遅い"です！
crates.ioの場合 https://github.com/rust-lang/crates.io-index にあります。
ディレクトリ構成としては基本的には
```{1,2文字目}/{3,4文字目}/{crate名}```
のファイルが置いてあります。例えばserdeなら https://github.com/rust-lang/crates.io-index/blob/master/se/rd/serde です。
4文字未満のcrateにはまたルールがあるのですが割愛…。

### sparse

Rust 1.68で安定化🎉、1.70からデフォルト🎉🎉になった方式です。
必要なindexだけをHttpで取得してくれます。
パスはgitと同じです。
crates.ioからserdeを取得するならば https://index.crates.io/se/rd/serde でできます。

余談ですが、private registryのURLを設定する際に`sparse+https://` のような形にしないといけないですが、あくまで設定する際の表記であって、内部ではただの`https`から始まるURLでアクセスしてくれます。(勘違いしてた…)

## crateのダウンロード

こちらは単純に指定された名前でダウンロードされるだけです。

indexに配置する`config.json`のdlのkeyのURLから取得します。
基本的には`{dlの値}/{crate}/{version}/download` (serdeなら`https://crates.io/api/v1/crates/serde/1.0.193/download`)
でダウンロードできますが、下の/{crate}以下はdlにpathを指定することで変更することもできます。

# Web API
`config.json`に`"api"`のキーで保存されたurlがあるとそこに対してcargoがapiを実行できるようになります。

例えば以下のような機能が生えています。
- publish: Registryにアップロードする
- yank: crateのバージョンを取り下げ(yank)することができます。
- search: crateを検索する
- me: login用に誘導する

# Authentication

認証です。crates.ioから引っ張てくるだけでは無用ですが、
自前でRegistryを立てる場合の認証を担います。
最近(1.74で)安定化されました！🎉
詳しくは別記事を作る(予定)です！


# おわりに


ほとんどここを読めばわかるよ！
https://doc.rust-lang.org/cargo/reference/registries.html
【初心者】Svelte案件に落ちたので書いてみた　〜Svelteとのファーストコンタクト〜

どうもダメ人間です！Qiitaアドベントカレンダー12日目に登録させていただいた記事です。
アドベントカレンダーの使い方をわかっておらず、「とりあえず登録すりゃ書くだろう」という気持ちで登録しました。(25日分全部書くとQiita猫のノベルティーももらえるらしいので来年は猫を捕獲したい)

自分が「Svelte」を知ったきっかけはSvelte案件の面談を受けたことがきっかけです。(そして落ちました)
初めて聞いた時、「フランス人が考えた名前なのか？」と思う名前だったため、その辺から記載したいと思います。


# 読み方 〜notすべすべ〜
<<スベルト/スヴェルト/ˈsvɛlt/>>
これはGifの「ジフ・ギフ」、PNGの「ピング・ペング」、WebPの「ウェッピー・ウェブピー」に及ばず、どう転ぼうが「スベルト」のようだ。

## 英単語svelte
英単語”svelte”(フランス語由来)には「すらりとした，すんなりとした」という意味がある。らしい。
	EX　)  super-svelte：超薄型の、とても薄い
	用法 ) (薄型のPC所持者に)「そのPC、スーパースベルトですね」

## 美容用品SVELTE
[@コスメなるサイトの21年前の口コミ](https://www.cosme.net/reviews/300011844/) によると、フランスのファッションブランド「ディオール(Dior)」なるものが以前「DIOR SVELTE」という名称で「スリミングジェル」なるものを販売していたらしい。

ここまでで、スベルト＝「なんか細い、スタイリッシュ、おしゃれなやつ」という認識が醸造されてきた。

そしてその通りのやつなのかもしれない。

だがしかし。
ロゴは丸っこく、ミニカーを無限に走らせたくなるデザインなのはなぜなのだろう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/fc0f0051-582d-3d28-5a7f-f902e58dc829.png" width="50%" alt="スベルトロゴ"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/66ea2e17-6818-e1e4-7c47-6054149043f7.png" width="50%" alt="遊び">
画像参照： [Svelte GitHub](https://github.com/sveltejs/branding/blob/master/svelte-logo.pdf)、[PhotoAC](https://www.photo-ac.com/main/detail/27159455&title=%E3%80%90PSD%E5%88%87%E3%82%8A%E6%8A%9C%E3%81%8D%E3%80%91%E3%82%AB%E3%83%A9%E3%83%95%E3%83%AB%E3%81%AA%E8%87%AA%E5%8B%95%E8%BB%8A%EF%BC%96%E5%8F%B0)

■ Svelte公式ページのフォントが洒落ているため観察してみた

https://qiita.com/dameNingen_ganbaru/items/b4c7b36c972259f348b9


# Svelteとは　
ざっくりとした認識としては、Svelteは「JavaScriptのフレームワークの一つ」で良さそう。
同じJavaScriptフレームワークであるReactとVueでは、Vue寄り。らしい。
小規模アプリを個人開発したい人におすすめ([by Udemyメディア](https://udemy.benesse.co.jp/development/app/svelte-js.html))　とのこと

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/9dc1aed6-ac44-26a2-447b-66aa1e311af9.png">


## Svelteのメリット・デメリット
【メリット】
①少ない記述でUIを構築できる
　　Vue.jsやReactと同じ処理の機能を実装した場合でもSvelte.jsのほうが圧倒的に記述量を抑えられます。
②無駄を取り除いてくれる
　　DOM操作やオーバーヘッドが少なく、コンパイル時は値が変化したところだけを検知して反映しファイルを作成

 
【デメリット】
①日本語ドキュメントが少ない
②拡張性が低い

# "JavaScriptに毛が生えたやつ"の認識でいいのか
毛の濃度にもよる気がする。
“Svelte”の語感的には「毛なんて認めない。全身脱毛してるわ。無駄は嫌い」という気配を感じる。

そのため、Svelteの名誉のためにも「毛が生えた」という表現は回避したいところだ。
表現としては「JavaScriptが全身脱毛したやつ」として覚えたい。(全力土下座)

そのスマートさ、簡潔さからikeaなどでも使われたりしたらしい([YouTube](https://youtu.be/OkQxx7kdZLA?si=HDy2fDBk3zy7m8MR
))

# 感想
今回の記事に取り組んで、Svelteは認知度が低く、日本語のドキュメントが少ないことを痛感した。
そして、どんな言語にも共通するかもしれないことなのだが、この言語の作者は、「ないなら作ろう」「不便なら変えよう」と行動できて、具現化できて、帽子100枚くらい脱ぎたくなった。(語彙力)


# 参考にした記事
■ Svelte.jsとは？手軽に開発ができるJavaScriptフレームワークを解説！ (Udemyメディア)

https://udemy.benesse.co.jp/development/app/svelte-js.html

■ SvelteとReactの違いを徹底比較（機能、パフォーマンスなど）

https://kinsta.com/jp/blog/svelte-vs-react/)(kinsta

■ Rich Harris on why he created Svelte (YouTube)

https://youtu.be/tfwQl6dXFig?si=ZrJP5CVmDQGseRw4

■ Svelte (Wikipedia)

https://en.wikipedia.org/wiki/Svelte#

■ Svelte をはじめる

https://developer.mozilla.org/ja/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_getting_started
Svelte公式ページのフォントが洒落ているため観察してみた

![スクリーンショット 2023-12-11 9.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/fed5ff6c-87cf-1210-5339-8135c579be46.png)
参照： [SVELTE公式ページ](https://svelte.jp/)

[svelteの公式ページ](https://svelte.jp/)を読んで初めて思ったのが、
「このフォント何じゃ？」でした。

それほどインパクトがあり、シンプルで洒落ていると感じさせる装い(中身読んでない)。
そのフォントについて少しと、svelteと同じJavaScriptのフレームワーク仲間であるVue.jsとReactの公式ページのフォントを記載してみた。

予想としては「Vue.jsの人はフォントめちゃくちゃこだわってそう」です。



# Overpass
SVELTE公式ページで使われているフォントの正体は[「Overpass」](https://fonts.google.com/specimen/Overpass?preview.text=SVELTE%20Font,%20Wonderful%20Yeah!&query=Overpass)なるものでした。

> Overpassは、米国連邦道路局用に描かれたFHWA シリーズハイウェイ ゴシック標識アルファベットに基づいたデジタル書体です。デルブ・ウィズリントンとデイブ・ベイリー、トーマス・ジョッキンによって設計されました。
https://en.wikipedia.org/wiki/Overpass_(typeface)
発売日	2015 年 8 月 28 日

大きく目を引くデザインだったのは、道路標識に利用されていた、ということが原因なのかもしれない。

![Overpass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/6c82b283-1e7a-b07b-33ee-c2041696a2d1.png)

# Vue.jsとReactページの使用フォントも調べてみた

<table>
<tr>
    <th>Svelte</td>
    <td>Overpass</td>
    <td><a>https://svelte.dev/</a></td>
</tr>
<tr>
    <th>Vue.js</td>
    <td>Inter var</td>
    <td><a>https://ja.vuejs.org/</a></td>
</tr>
<tr>
    <th>React(旧サイト)</th>
    <td>system-ui</td>
    <td><a>https://ja.legacy.reactjs.org/</a></td>
</tr>
<tr>
    <th>React(新サイト)</td>
    <td>Optimistic Display</td>
    <td><a>https://ja.react.dev/</a></td>
</tr>
</table>

Vueのサイト自体はパリピでウェイウェイしていたものの、フォント自体はシンプルだった。

![スクリーンショット 2023-12-11 21.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/9fbf3708-0add-9a2b-17a2-a82637c65c17.png)

フォントのことをもっと知りたいと感じた。が今日はここまで。


# 参考にした記事

■ Overpass (Wikipedia)

https://en.wikipedia.org/wiki/Overpass_(typeface)

■ 「フォント図鑑、Google Fonts編 vol.5」、note、(2019年5月2日)
→デザイナーさんの普段使いフォントならば失敗ない！(何もしないが)と強く感じました。

https://note.com/prefixdesign/n/n6f45e4b2127d

■ SVELTE公式サイト

https://svelte.jp/


■ Vue.js公式サイト

https://ja.vuejs.org/

■ React旧サイト

https://ja.legacy.reactjs.org/

■ React新サイト(2023/03~)

https://ja.react.dev/blog/2023/03/16/introducing-react-dev
Splunkの画面表示不具合の報告が5分で済んで思ったより楽だった件

## はじめに
- Splunk製品を触っていて、日本語がくずれて表示されたりバグっぽい事象を見つけた
- 手っ取り早くサポートにエスカレーションする方法を発見
- 重い腰をあげて実際にサポートケースを作成してみた

## How to
- Splunk製品のコンソールにアクセスし、ヘルプから**バグを報告**を選択
![スクリーンショット 2023-12-11 15.55.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/61f57bf8-486f-b983-e548-2469dee28bd6.png)

- 別ブラウザタブが起動し、自身のSplunkアカウントでログイン
- ログイン後のサポートポータルのイメージ
![スクリーンショット 2023-12-11 15.57.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/60fc2446-be8e-2ed0-0005-f18390325c9f.png)

- まずSupportをチェックして、該当プロダクトと問い合わせ種別を選択
    - 不具合系は「General Issues - xxx」
![gamen.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/92a49430-c255-49f7-2410-38c6bda6e7b0.gif)

- あとはDeepLやGoogle翻訳を使って日本語で問い合わせ内容を作成し、自動英訳
- 実際にサポートに起票した時の例

```
Priority: P3

Subject: 
RBA Threat Topology cannot show when using Japanese locale(ja_jp)

Description: 
This issue was discovered by SE while conducting a demo, so it is not a direct support escalation from the customer. 
However, it is critical when demonstrating to Japanese customers because it is difficult to convey value

In Splunk ES 7.2, when viewing the threat topology screen for RBA functionality, the content displayed differs between en-us and ja-jp.

1. When the Splunk UI is accessed using en-us, the screen is displayed correctly.
2. When the Splunk UI is accessed in ja-jp, it is not displayed.

Please support the behavior in ja-jp as well.
```

- 問題の再現手順がわかっている場合は「Step to Reproduce」に記載する

:::note warn
なお、再現手順の確認が取れていればサポートのやり取りは非常にスムーズになります。これがないと再現方法を確認するためにサポートからの質問が飛んでくるため時間がかかることがしばしば。。。
:::
- Priorityは[Splunk Support](https://www.splunk.com/en_us/customer-success/support-programs.html)の**Understanding our support levels**参考に選定
    - 今回は「Any other case where a feature of purchased Splunk software is not operating as documented」（その他、購入した Splunk ソフトウェアの機能がドキュメント通りに動作しない場合）に相当したのP3を選択している

- 必要情報を入力してSubmitで完了
- 更に画面のスクリーンショットなどのファイルをアップロードする画面が表示されるので、なるべく英語名のファイルタイトルにしてアップロードしておく
![スクリーンショット 2023-12-11 21.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/b25387eb-d7eb-e44e-67c0-20b50ca20524.png)

- サブミットが完了すればメールが届きます
![スクリーンショット 2023-12-11 21.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/c7e989e3-1d98-82fd-2df8-a2fb2b35d997.png)


## ２度手間３度手間を防ぐためのポイント
- サポートに上げる前に不具合事象が発生した際には以下ポイントを整理して残しておくことを推奨します。

:::note 
1. Diagを取得しておく。方法は[こちら](https://community.splunk.com/t5/Splunk-Search/Splunk%E3%81%AEDiag%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E4%B8%8B%E3%81%95%E3%81%84/m-p/214513)
1. 発生した事象が環境依存の問題でないことをクリアにしておく
    1. 特定のSplunkインスタンスだけの問題ではない？
    1. Splunk製品外の影響（自社のネットワークなど）の可能性はない？　など
:::
【コラボフロー】限定された範囲から承認者を選択する

**コラボフロー Advent Calendar 2023**　11日目！

今日は**限定された範囲から承認者を選択する方法**をご紹介します。

コラボフローは決まった承認者だけではなく、申請する段階で承認者を追加したり、変更したりすることが可能です。

承認者追加する際には、コラボフローに登録している全ユーザーから選択できるようになっているので、**役職者の中から選びたい**、**所属部署の中から選びたい**、お客様からこんなお声をいただきます。

ボタンでポチっと範囲指定はできないのですが、
**マスタ**と**フォーム内指定**、この二つを使えば、限られた範囲の中から承認者を指定できます！！

大まかな設定の流れはこちらです。
①役職者のみのマスタを作成
②申請書の中に承認者を選択する項目を作成
③マスタ連携パーツで役職者のマスタと連携し、承認者を選択できるようにする
④承認フローでフォーム内指定の設定

①マスタの作成
※マスタの作り方は[こちら](https://collaboflow.zendesk.com/hc/ja/articles/360001475616)から

役職、名前、ユーザーID等を登録します。
![スクリーンショット (447).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632108/8f15e9c3-44b2-ec64-61dd-fbf254994db8.png)

②申請書に項目作成
承認者を選択する項目を設定します。
ここで申請部署の項目を持っておけば、③のマスタで所属部署の役職者のみを選択する形に絞り込むことが可能です:bulb:
![スクリーンショット (448).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632108/e05e9b95-e248-233a-8042-37006f9c281b.png)

③マスタ連携パーツで役職者マスタと連携
申請部署の項目を作成しているので、絞込も利用します。
![スクリーンショット (449).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632108/2d3f90d9-cbdf-fe8d-6fc9-feec11cf582e.png)

④フォーム内指定の設定
経路アイテムでフォーム内指定アイテムを選択します。
このアイテムを利用すれば、パーツの内容によって選出される承認者が変わります。
![スクリーンショット (451).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632108/64eacad8-3d74-560e-0716-4d6a869373ac.png)

設定はこれで完了です！


今回は限られた範囲から承認者を選択する場合に**マスタ**と**フォーム内指定**を利用しましたが、例えば、職務権限表から承認者を選出する場合でもこの２つで対応できます:ok_woman_tone1:

この機能とこの機能を組み合わせたら対応できるのでは？と考えるのも結構楽しいですね。

それでは、１２日目以降の記事もお楽しみください:sunny:
数値と数字

初心者向け（?）の記事で print() の例を示すとき，わざわざ

```Python
price = 180
print("バナナ" + str(price) + "円")
```

と書くのは，数値と数字の違いを注意喚起しているからなのだろうか？とてもそうだとは思えない。
なぜわざわざ str（） を使っって，しかも文字列連結 + を使って...
自分がそう思い込んでいて，それを他の人にも善意で教えると...

```Python
price = 180
print("バナナ", price, "円")
```
あるいは

```Python
price = 180
print(f"バナナ {price} 円")
print(f"バナナ{price}円")
```

でいいじゃないか。

price の前後に空白が置かれるかどうかの違いではあるが，空白を置くほうが好ましいと思うがなあ。

ちなみに，`print("バナナ", price, "円")` みたいなので price の前後に空白が置かれるかどうかはデフォルトで決まっていたりして，空白が置かれないのがデフォルトの言語もある。

あっ，めんどくさ...
Astroのチュートリアルが神すぎる

:::note info
Qiita全国学生対抗戦 Advent Calendar 2023の12日目の記事です。
:::
# はじめに
:::note alert
チュートリアルしか進めていない人が書いているので、書いていることが浅いです。
間違っている内容があれば、コメントまたは、編集リクエストをお願いします。
:::
最初はPythonが好きなので、Pythonについて書こうと思っていましたが、
昨日Astroのチュートリアルを触った時にとても楽しかったので、
まだにわかですが急遽変更しました。
迷惑がかかってしまっていたらすみません。

# Astroとは
まだ自分は浅いので簡単なことしか言えませんが、
パフォーマンスがとても高いフレームワークです。
また、静的サイトを作るのが得意です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581223/f7f8aeb1-40f9-5384-5f13-697c495b0d1b.png)


# どのようなところが神か
自分はAstroに出会うまで一度もチュートリアルを最後まで進めたことがありません:sob:
ですが、Astroのチュートリアルは最後まで進めることができました。
その理由は沢山ありますが、今回は6つ紹介します。

## 日本語に対応している
まだ、チュートリアルにおいては1つ目(ブログ)にしか対応していませんが、
翻訳の変な日本語ではなく、自然な日本語でチュートリアルを勧められるのは、とても楽で、楽しいです！

## チェックリスト
Astroのチュートリアルには項目ごとにチェックリストが存在します。
その項目でできたこと、できなかったことが自分の中で確認できて楽しいです。
自分はチェックリストが一番楽しかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581223/6b7c1c03-686a-53b8-f19d-358d3360f746.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581223/231ecf4e-8b28-849c-4bb6-f4e36df68ac0.png)

## 最初から最後まで丁寧に説明している
よく、最初の方は楽しく進められていても、途中からどのファイルにどのコードをどの行に追加するのかわからなくなったりして、詰むことが**自分は**よくあります。
今の所5個ぐらいのチュートリアルをやったら2個ぐらいの確率詰んでいます。
その点、Astroは最初から最後まで丁寧に説明しているため、問題が発生しても、
5分ほどで修正できました。(大体は自分のコピペミスです)

## ほぼ全てコピペでも理解できる
ほぼ全てコピペでもできるようになっていて、普通はコピペだけでは理解が浅そうに見えますが、
その分、分かりやすい説明が入っているので私は、簡単に、楽しく、深く理解できました！

## コードはDiffになっている
追加のコードや、削除するコードは全てDiffになっているので、どのコードをどういう意図で追加するのかが分かりやすかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581223/e4d7d85c-082b-de94-0c2c-353975fbabf4.png)

## ゲーム感覚で楽しめる
これが一番大事ですね。
チェックリストや、紹介していませんが、クイズ、「やってみよう」(実際に自分で書いてみる)なども存在していて、
楽しく、理解を深めることができるように工夫がされています。


# 最後に
最後まで読んでいただいてありがとうございました。
この記事を読んでAstroに興味を持っていただけたら幸いです。

# 参照
https://astro.build/

https://docs.astro.build/ja/tutorial/0-introduction/