OmniAICreator/Qiita-1.07M huggingface dataset:
[salesforce]特定プロファイルのユーザ作成時に、「売上予測を許可」フラグを自動付与する

備忘。

# やりたいこと
特定のプロファイルのユーザ作成/更新時に、自動的に「売上予測の許可」がTrueとなるようにしたい。

# 実装方法
フローを使う。

- アプリケーションランチャに「フロー」と入力する
![0362c8a2-e0d5-2fa4-8c29-c68982a5e3db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160366/3cd6116d-978e-1a01-321d-d28339f3555d.png)


-  フローが立ち上がるので、画面右上の「新規」をクリック
- フロービルダーが立ち上がるので、「最初から開始」をクリック
- 「レコードトリガーフロー」を選択して「作成」をクリック
- 「開始を設定」 をクリックし、以下のように指定

| 項目| 内容|
| ---- | ---- |
| オブジェクト | ユーザー |
|トリガー|レコードが作成または更新された|
|エントリ条件|いずれかの条件に一致（OR）|
|項目|profileID|
|演算子|次の文字列と一致する|
|値|プロファイルIDを入力　<br>
||※プロファイル ID は設定＞プロファイル＞該当プロファイルをクリックした際の URL の「00e」から始まる 15 桁の英数字　です。|
|更新されたレコードでフローを実行するタイミング|特定の要件に一致するようにレコードを更新したときのみ|
|フローを最適化|「高速項目更新」を選択|


![スクリーンショット 2024-12-02 16.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160366/de7b2a5b-e6c8-360f-859c-7568c2eb3fa5.png)

- ➕（要素を追加）をクリックし、「レコードを更新」を追加する
![スクリーンショット 2024-12-02 16.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160366/b4e390b7-9245-ea86-0b85-cfff300100be.png)

- 以下のように入力

| 項目| 内容|
| ---- | ---- |
| 表示ラベル |　特定プロファイルのsalesforceユーザが作成/更新された時に、売上予測を許可する |
| API参照名 |　new_user_forcast_enabled |
| 説明 |　ForecastEnabled 項目（売上予測を許可項目）に対し、Trueの値を挿入します。 |
| 更新するレコードを検索してその値を設定する方法 |　フローをトリガーしたユーザーレコードを使用　を選択 |
| レコードを更新する条件の要件 |　なしー常にレコードを更新 |
| ユーザの項目値をレコードに設定 |　 |
| （項目）ForecastEnabled |　（値）True |


![スクリーンショット 2024-12-02 16.33.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160366/c3c81a74-123e-e4da-7f1e-6ee7b620c6d4.png)

- 右上のボタンからフローを保存、有効化すればOK。お疲れ様でした。

# 注意点・Tips
- 「売上予測を許可」フラグを付与するかどうかはプロファイルに依存するため、プロファイルを作成・変更した場合は本フローも変更が必要
- Salesforceライセンスが剥奪されると自動的に「売上予測を許可」フラグもOFFになるため、売上予測をFalseにするフローの別途作成は不要」
Terraformにおける条件分岐についてまとめた

# はじめに
この記事では三ヶ月ほどTerraformに触れてきた人間から見た、Terraformで条件分岐をしたくなった時のやり方と使い分けについて書いていく。

# Terraformにおける条件分岐処理
まず初めにTerraformには他の言語でいうif文のような命令型の条件分岐は存在しない。その代わりに三項演算子単体や、dynamicやcountと組み合わせて条件分岐を行うのがよくあるやり方だと思われる。

## 三項演算子の使い方
Terraformの三項演算子の使い方をまず説明していく。
基本的な構文は以下の通りで、conditionに条件式を書き、その結果がtrueだった場合にはtrue_valに書かれたものが結果として出力され、falseの場合にはfalse_valに書かれたものが結果として出力される。

```
condition ? true_val : false_val
```

実際に使ってみる。例えば環境によってインスタンスタイプを変えたい場合には以下のように実装していく。
```
instance_type = var.environment == "Production" ? "t3.large" : "t3.small"
```

ちなみに条件をいい感じに組み合わせて複雑な条件分岐を実現することも可能である。
```
instance_type = var.environment == "Production" ? (
  var.region == "ap-northeast-1" ? "t3.large" : "t3.medium"
) : "t3.small"
```

## count + 三項演算子で行う条件分岐
countと組み合わせることで、リソースの増減を条件分岐で制御することができるようになる。

例えば以下の例では環境ごとに作成するインスタンス数を分岐させることができる。

```
resource "aws_instance" "example" {
  count = var.environment == "Production" ? 2 : 1
  
  ami           = "ami-123456"
  instance_type = "t2.micro"
}
```

## dynamic + 三項演算子で行う条件分岐
dynamicと三項演算子を使うとcountよりも柔軟に条件分岐を行うことができる。
dynamicはリソース内の特定のブロックの数を制御することができるので、例えばセキュリティグループの複数ルールを作成する場合やロードバランサーのリスナー設定など、細かい設定の条件分岐を行う際にdynamicは効果的に働く。

以下はセキュリティグループのingress ruleを環境ごとに分岐して作成する例である。

```
resource "aws_security_group" "example" {
  name = "example"

  dynamic "ingress" {
    for_each = var.environment == "Production" ? [80, 443] : [80]
    content {
      from_port   = ingress.value
      to_port     = ingress.value
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    }
  }
}
```

## まとめ
この記事ではTerraformの条件分岐についてまとめた。
- Terraformの条件分岐は三項演算子で行う
- リソース自体を条件分岐させたい場合にはcountと組み合わせるのが効果的である
- リソース内の設定ブロックを条件分岐させたい場合にはdynamicと組み合わせるのが効果的である
Maker系イベント中心に、参加してイベントレポートを書き続けていたら、視点が結構変わった

これは、 [技術同人誌(以下略)](https://qiita.com/advent-calendar/2024/tech-doujinshi) アドベントカレンダー 2日目の記事です。

昨日(12/1) は、@Rhodium-Complex さんの『明後日からわかる有機化学』の執筆過程](https://note.com/_rhodium_/n/nd1b488f38d50) でした。


## はじめに

こんにちは。
(人によってははじめまして？)

ふれーむといいます。
※技術同人誌関連ではふーれむと表記するケースがあります。フレームワークでミーム汚染を起こす関係で……

技術同人誌界隈でそれとなくコミュニティ活動をしているものです。

アウトプットで一般的なものでいうと、ブログ(Qiita、Zenn、note)や、LTなどの登壇、技術同人誌などのアウトプットがまず思い浮かべられるだろうな　という気がします。どうでしょうか。

今回はそういった一般的なアウトプットからはすこし外れる話になるのですが、私はここ２年ほど [月刊I/O誌](https://www.kohgakusha.co.jp/io/) にて、中部以西のイベントを中心にイベントレポートを書かせていただく機会が多く、書き続ける中でレポートを書く際に気をつけている事が結構移り変わってきたなー　という実感について書いてみたいと思います。

## そもそものはじまり

私がイベントレポートを月刊I/Oに書き始めたのは2022年の大垣MiniMakerFaireからなのですが、書き始めた当時は

 * なんか面白そうなもの
 * キャッチーなもの
 * 取り組みがよさげだなと感じたもの
 * エンベデッドシステムスペシャリストとしてコツやポイントをお伝えできると、自作派の人を後押しできそうだな～と感じたもの

を中心に、作ったものの取材をさせてもらい、記事を構成していました。

## もともと最初から気にしていたポイント：制御や自作の急所みたいなものをお伝えしたい

これは上述の箇条書きの４つ目の話になるのですが、家や会社、開発・工作の拠点(ラボ)なんかだと、環境としては理想に近い条件へとどうしても近づくのに対し、たとえば Maker Faire などの外部の会場だと、いわゆる外乱（外部から機器の動作を妨げるもの）の影響が大きくなるケースなどがあります。

代表的なものでかつ、影響の大きいもの(実際にハマっているケースをよく見るもの)から順番にいうと

 * 直射日光が降り注ぐブースに配置されるケース
 * 会場のライトが白色光ではないケース
 * （それが起きる事は本来的にはあんまり良くないとされていますが）他の出展者が発生させたノイズの回り込みが起きるケース
 * 気温・湿度の変化

などがあり、気付いた場合は紙面である程度(特定の出展者さんを攻めたい気持ちは全くないため)ボカしながらも言及するようにしており、これは２年前からずっと変わらない感じです。

## １つ目の気付いたポイント：文章と写真にしたときにお伝えしきれないケースを避ける

実際に取材を進めて、いざ記事を書こうとすると 記事として文面や写真になった際、イベントや、その作られたモノの面白さ・楽しさ・興味深さみたいなのが方向性的に減る（というか、どうにも**紙幅などの関係や、私の力量の都合で**でお伝えしきれない）ケースがでてきました。

たとえばこれは**音を主軸にした展示**であったり、**動的な動きが面白い**展示であったり　というものです。
※最終的に静止した状態で面白さが伝わるのであれば、その形で写真を載せて書けば大丈夫なので、途中からは**そういう「楽しさを切り取れる」ポイント**を探すようになりました。

## ２つ目の気付いたポイント：冊子を手に取った時にキャッチーなものを入れたい

これは、店頭で月刊I/O誌が並んでいて、手に取った時に気づいたのですが、イベントレポートはカラー原稿となる事が多く、月刊I/O誌は最初の方にカラーページが入ります。

キャッチーなものが載ってると冊子を手にとって、そのまま買っちゃいません？

そういう事です。

## ３つ目の気付いたポイント：技術的に高度なものよりもアイデアが尖ったものを入れたい

基本的に何でもそうですが、特定のコミュニティやイベントで、エキスパートから初学者までの構成人口比を示すと、ピラミッド型になり、**エキスパートほど人数が少なく、初学者ほど人数が多い**傾向が現れます。

![ピラミッドパワー！](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144657/d01132d4-0949-035e-cf9b-5ca5d546a501.png)

私の個人的な考えとして、どんなムーブメントや文化でもそうですが、**裾野が広くならないと山が高くなっていかない**ものだと考えていて、こういったイベントレポートを見て **「作ってみたい！」** や、 **「イベントに出てみたい！」** と思ってもらえると嬉しいな　という前提で記事を書くようになりました。

その結果、裾野が広がるような良いアイデアと感じたものを基本的にはイベントレポートに書きつつ、技術的な話を最初にお伝えしたポイント「制御や自作の急所」を中心に担保して幅を出す　といったように、両輪でバランスを取るような形でレポートを書く感じに、最近は着地しています。

## 結果

結果、雑誌という形でMakerムーブメントを切り取って記事に書かせて貰う際には、出展物のいいとこ探しをひたすらイベントでしつづける　という形になりました。

きっと、それでよいのです。作って楽しんで交流するのがMakerムーブメントなので。

来年も色んなイベントに出没して、引き続き「書く」事でMakerムーブメントを盛り上げていければな～　と思っています！

おわり。
「DataOpsハンズオンの設計と構築」の設計と構築

# この記事について
- この記事は[datatech-jp Advent Calendar 2024](https://qiita.com/advent-calendar/2024/datatech-jp)の12月2日分として記載しています。

# 主題となるスライドとそのイベントについて

- データカタログを使ったハンズオンをどのように設計、構築したのか、というネタを、2024年の8月にdatatechjpでLTとして発表しました。
    - connpass:[みんなの考えた最強のデータ基盤アーキテクチャ2024前半おまとめ拡大版SP！ ](https://datatech-jp.connpass.com/event/319827/)
    - ![スクリーンショット 2024-12-02 16.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/275f5a1d-2d76-ead6-a842-c779c0df848a.png)
    - Youtube:[みんなの考えた最強のデータ基盤アーキテクチャ2024前半おまとめ拡大版SP！](https://www.youtube.com/live/7F1QY7zpfuw?si=pSksrryzPneVghNV&t=1271)
    - ![スクリーンショット 2024-12-02 16.30.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/7aa5c4d0-eb30-62d3-8149-d6fe7fc2cd0c.png)

     - スライド：[DataOpsハンズオンの設計と構築 / Design and build about DataOps hands-on](https://speakerdeck.com/shumpei3/design-and-build-about-dataops-hands-on)
     - ![スクリーンショット 2024-12-02 16.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/cb179e81-bc1c-2dd6-a7f3-95a1a5b8b6ea.png)



# 元ネタについて

- 上記LTの元ネタしてあるのが、2023年の11月、会社のイベントで主催したDataOpsのハンズオンです。
    - 会社のイベント：[TechXchange Japan Conference 2023](https://community.ibm.com/community/user/storage/blogs/tomohito-kanno/2023/12/04/techxchange-japan)
    - ハンズオン用スライド：[始めようかデータカタログ。カタログ利用者目線でどんなことが出来るのかをハンズオンで体験。](https://speakerdeck.com/shumpei3/shal-we-start-data-catalog-with-ibm-knowledge-catalog)
    - ![スクリーンショット 2024-12-02 16.32.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/24444216-3afe-de23-a760-eeb2a3e48220.png)

        - なお、このハンズオンのタイトルですが、当初の案は以下でした
            - 「始めようかデータカタログ。2分後に管理者が来なくとも」
        - 色々と指摘があり「2分後に管理者が来なくとも」の部分は削除しました
        - ご存知の通り、Bump of Chickenの「天体観測」の以下の歌詞のパロディです
            - 「始めようか天体観測。2分後に君が来なくとも」
        - 2分後に管理者が来なくとも、データカタログがあれば自力でデータを探せるよ、というメッセージも込めたタイトル案でした


# LTで発表をするにあたって、色々と考えた事

- 当初は、以前記載した別なブログ（[DataOpsで実現される、データが整備された世界(vol97-0020-ai) ](https://community.ibm.com/community/user/japan/blogs/provision-ibm1/2021/11/12/vol97-0020-ai)）を解説するようなネタを考えていました。
- ![スクリーンショット 2024-12-02 16.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/8817ccbe-6cf9-5655-8756-bf782491c3de.png)
- しかし運営側よりベンダー色があるのは控えてほしい、というご意見がありました。確かに、上記のブログでは後半に製品の紹介が入ってくる構成になっていました。
- そこで、LTとして、あくまでハンズオンをどのように設計・構築するか、という一般化可能な考え方についての知見をまとめた形で行う事にして、[こちらのスライド](https://speakerdeck.com/shumpei3/design-and-build-about-dataops-hands-on)にまとめて発表する事としました。

# 反響
- スライド自体は、イベントから約4ヶ月経った2024年12月現在で、おおよそ1000回程度は見られたようでしたので、そこそこ見ていただいたように思われます。
- Youtubeで配信していた際には、Twitterでの反響も好意的な内容が多いように思われました。
[Rust]Cargoを使ったパッケージ管理

## `cargo add`でパッケージを追加しよう

Cargoの役割の一つに依存関係の管理があります。誰か（自分でも良い）が作ったRustのコードを自分のプロジェクトでも使いたいときに「このプロジェクトはこのコードを利用します（＝依存します）」という関係を依存関係と呼びます。

Rustでは、外部から利用できるようにビルドされたものを「パッケージ」と呼びます。他のパッケージを利用したい場合は、以下のコマンドを実行して追加します。

```bash
cargo add <パッケージ名>
```

例えば、乱数を扱うときに便利な`rand`というパッケージがあります。これを利用したい場合は、以下のコマンドを実行します。

```bash
cargo add rand
```

実行すると、プロジェクト内の`Cargo.toml`の`[dependencies]`にその依存関係が自動的に追加されます。

```toml:Cargo.toml
rand = "0.8.5"
```

:::note
`cargo add`を使うと、
- パッケージのインストール
- `Cargo.toml`への追記

の両方を同時に実行できます。
先に`Cargo.toml`へ手動で追記しておくことも可能で、その場合は`cargo build`などのコンパイル時に自動でインストールされます。
:::

:::note
このあたりは、Node.jsでいう`npm install`や`package.json`の関係に似ていますね。
:::

## パッケージを使ってみる

追加したパッケージは、`<パッケージ名>::<使いたい関数など>`のようにアクセスします。

```rust
use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    let random_number: u8 = rng.gen_range(1..=100);
    println!("ランダムな数: {}", random_number);
}
```

## パッケージの実体はどこにあるのか？

Rustのプロジェクトで依存パッケージを追加すると、そのパッケージの実体はどこに保存されるのでしょうか？ 

Rustでは、外部パッケージは通常、プロジェクトのディレクトリ内ではなく、グローバルなキャッシュに保存されます。依存パッケージの実体は、以下の場所に保存されます。

- `~/.cargo/registry`（Linux/macOSの場合）
- `C:\Users\<ユーザー名>\.cargo\registry`（Windowsの場合）


これらのディレクトリには、`Cargo.toml`で指定されたパッケージのソースコードが格納されており、依存関係が解決されると、Cargoが必要なパッケージをここから取り出してビルドします。

プロジェクトのディレクトリではなく、グローバルなキャッシュの領域にパッケージをダウンロードしておくことで、効率かつ高速な依存関係の解決が可能です。

:::note
ここはNode.jsのモジュールシステムに無い利点（というかNode.jsのほうが欠点が多い）ですね。
筆者はちょっとしか触っていませんが、Go言語もこっちの思想を持っている認識です。
余談ですがNode.jsに代わるJSランタイムであるDenoもこちらの方式を採用しています。
:::
mindの研究 その89

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
新年の挨拶を、読み上げよ。

# サンプルコード

```

出力ファイルは　ファイル。

エラー検査は
　エラー？　ならば
　　エラー文字列で　重大エラー
　つぎに
。


メインとは
　「si.vbs」で　出力ファイルを　新規オープンし　エラー検査し
　「CreateObject("SAPI.SpVoice").Speak "あけましておめでとうございます。共に、世界平和を求めましょう。"」で　出力ファイルに　一行書き込み　エラー検査し
　出力ファイルを　クローズし　エラー検査し
　「cscript si.vbs」を　プログラム実行
　「ok」を　一行表示
。


```

以上
SQL Collection by Workatoのindex速度検証をしました～検索編～

## 背景
株式会社出前館で情シスとして働いています、二宮と申します。
Workatoを使い始めたばかりで試行錯誤しています。

公式のドキュメントには日々助けられていますが、一方でドキュメントに書かれていない細かい仕様が気になることもしばしば…
今回はindexについて検証してみようと思います。

## SQL Collection by Workato

`SQL Collection by Workato` ではindexの指定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947738/219c31f7-b10c-deb6-9f12-047a47e6547a.png)

indexがあるとパフォーマンスが向上すると注釈がついています。どれくらい向上するのか気になるところです。

Workatoの内部DBはSQLiteだそうですが、SQLiteのドキュメント [SQLite のパフォーマンスに関するベスト プラクティス](https://developer.android.com/topic/performance/sqlite-performance-best-practices) を見ても、速度や件数についての具体的な情報はありません。
ケースバイケースすぎて書けないものと思います。

では、試してみます。

## テストデータについて
データランダム生成のツールを使いました。
https://tm-webtools.com/Tools/TestData

テストツールで設定した内容はこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947738/43b7608e-f7cc-7312-aab3-e2ac8dda6621.png)

件数は `SQL Collection by Workato` の最大件数である5万件です。
[公式ドキュメント](https://docs.workato.com/ja/features/collection.html)で上限件数の記載を見つけられなかったため、Create List画面の注釈を情報源としています。
>Creates a table like structure in a collection. Select list pill as source. Collections support a maximum of 50,000 list entries or 10 MB size limit.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947738/e13b68d5-3b35-25c7-02ae-0e7eaa0dbfb7.png)


## 処理内容について
ツールで作成したCSVファイルをGoofleドライブに配置し、Workatoから読み込むことにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947738/5c594626-fcb4-e9fd-53b2-8a92fc5b3141.png)

読み込んだテストデータに対して以下2種類の処理を実施することとしました。
- 処理1　任意のNoを指定してユーザーを取得する
- 処理2　性別でグルーピングして人数をカウントする

indexあり・なしそれぞれで経過時間を計測します。
indexありの場合は`Primary index`を`No`、`Secondary index`を`性別`とします。
それぞれプライマリキーとビットマップインデックスのイメージで、実際のDB設計でもよくあるパターンだと思います。

## レシピ
レシピはこのようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947738/a20c541b-254a-cd8e-14ea-aac30f60c2b2.png)

Step11のログ出力で結果時間が分かるようにしてあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947738/56eda809-a413-de40-7148-52b120818ac5.png)


## 結果
ばらつきがあるかもしれないので、3回ずつ試しました。

|||処理1 ユーザー取得|処理2 性別カウント|
|:-----------|------------:|:------------:|:------------:|
|インデックスなし|1回目|0.028542726秒|0.038733526秒|
||2回目|0.02299516秒|0.048323399秒|
||3回目|0.028468306秒|0.045365163秒|
|インデックスあり|1回目|0.013266355秒|0.024370533秒|
||2回目|0.016906614秒|0.03071054秒|
||3回目|0.016027537秒|0.027085606秒|

速くなっていますね。処理時間が半分以下になっているケースもありますが…
もともとが速いので、速度向上を人間が体感することはなさそうです。

## 今回分からなかったこと
- indexを設定した状態での追加・更新・削除はどれくらい遅くなるのか。
→機会があれば試してみようと思います。
- Workatoで「任意の範囲のランダムな整数」を返す方法。
→分からなかったのでPythonで書いてしまいました。（Step5）

----
最後に…
出前館では、一緒にWorkatoを推進していくコーポレートエンジニアを募集中です！
カジュアル面談もできますので、ご興味があればお気軽にお声がけください。

株式会社出前館 採用情報 > コーポレートエンジニア
https://hrmos.co/pages/demaecan/jobs/1938469226560745501

----

以上です。お読みいただき、ありがとうございました！
Amazon EC2 がインスタンス起動後の CPU の最適化をサポート

# 変更点
インスタンス起動後もvCPU 数の変更や停止中のインスタンスのハイパースレッディング無効化が可能。
変更時はインスタンスを停止している必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/cf6b2685-b324-c4e5-6a0f-06ad50b2ba10.png)


停止後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/889a2a1b-8810-0615-8fca-b3013213b36e.png)


インスタンスタイプ以上に増やせるわけではない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/9c11b1f3-7e99-ca86-be46-aff3a93912a6.png)

つまり **インスタンスタイプで使用できるvCPUのうち、任意の数を休止できる機能** ってことですね。


最大数は2vCPUですが、任意の数を指定して利用できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/cdefd84c-f341-cc70-7c60-8f70d698760d.png)



T系インスタンスはサポートされていない点に注意（バースト機能との兼ね合い？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/647076e4-7854-f638-c0a4-85436661a3d5.png)



## インスタンスタイプ変更後も CPU オプションが維持される。
変更前は c5a.large 1vCPU 1コア に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/d43c3af3-4312-5ee7-16f2-cb537d8ec6eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/7f58c862-ef51-13f4-e1fe-c6b7e45e85f3.png)

c5a.xlarge へ変更
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/b1d1ca15-9df3-9ed4-ff13-33fa14b7269f.png)

カスタマイズオプションが引き継がれることをしっかり警告してくれます
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/58483ab9-9009-1cd1-ee11-cea16dd7a0c8.png)

 インスタンスタイプ変更画面でもCPUオプションを変更可能
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/658b5785-38b9-6796-0310-3fe4afe96812.png)
しっかり設定が引き継がれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531208/df66a7bf-02cb-b397-c48c-eae29b535919.png)



 


## vCPU ベースのライセンスコストを削減可能。
SQL Server などの時間当たりのvCPU使用量によってコストが変動するライセンスのサービスを使用する場合はメリットが享受できそうです。
停止中しか変更できないので、EC2事態のコスト削減に生かすのは難しそうですかね？
サクラエディタはマクロで決まる！作業効率化革命！

皆さん大好きsakuraエディタ

https://sakura-editor.github.io/

# 何それな人向け

https://qiita.com/advent-calendar/2024/sakura-editor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/972012ff-a0a7-be03-44b3-834ddb8faf67.png)

# デフォルトで組み込み済みの便利機能がたくさん

例えば、全国の主要野菜収穫量の表があったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/49be87a0-49f1-336a-7704-90fbd6a3d587.png)

## 便利機能その１　ソート

地域列を取得して、ソートができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/3a90e114-44d2-57e4-45f0-d14b1d30aabe.png)

じゃん！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/b87b58c6-6bbc-981e-0237-bd849a18b85b.png)

## 便利機能その２　データ集約（重複排除）
先ほどソートしたデータから重複レコードを排除できます

:::note warn
【注意】事前にソートが必要です
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/c80a247e-dfc6-7b25-5b34-f242f74e0970.png)

じゃん！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/cdfca4ea-286e-c716-b207-f658a127e276.png)

## 便利機能その３　ひらがな→カタカナ変換

ひらがなをカタカナに変換したり、半角全角を変換できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/c4852f67-13b0-b820-f9ca-248c39d46d18.png)

じゃん！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/2c4a2d7a-a32c-68b7-f0d7-334e9aefa522.png)

# いっきにやりたい

野菜と、天気と、感染者数と・・・と複数データで同様処理が必要な場合、
何度も上記作業を行うのは面倒ですよね。

そこでマクロ登録！

## マクロ記録手順

今の作業をする前に記録開始ボタンを押す
ツール＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/6c24e411-3d42-e717-462a-53053e073fcc.png)

ファイル名に記録中と表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/d571edc6-2413-fa5e-08a1-408166f0da30.png)

記録したい作業実施後に、記録を任意のフォルダに保存します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/d6e0b7c6-3a51-c3e9-1cdb-62865f8783c3.png)

## マクロ呼び出し手順

先ほど保存したファイルを読み込み実行できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/45573d70-7f9c-d29d-18ad-ccf5bee883c1.png)

# まとめ

これ以外にももっとたくさんの便利マクロやショートカットがあります。

今回のマクロをヘッダーに固定したり、、これとても便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/b8bc8873-9432-224b-0376-1bb8f90ce316.png)

気が向いたら追記していこうと思います！
WSL2+ROS2でRvizやGazeboが黒い人へ【NVIDIA GPUを使っている方へ】

# この状態を直す
![名称未設定 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/710848/c5ddb7e8-7854-42b3-d792-73aa55ac9374.png)

# 結論
`$ sudo apt install -y mesa-utils`
`$ export MESA_D3D12_DEFAULT_ADAPTER_NAME="NVIDIA"`
`$ glxinfo -B`
で、Device: D3D12 (NVIDIA GeForce ...) (0xffffffff)　と出ればよい。

# 私のPC構成
- Windows11 + WSL2
- ROS2 Humble
- Intel Core Ultra
- 内蔵GPUのIntel Arc / Geforce RTX4050 Laptop
# 考察
私はNVIDIA + IntelArcが搭載されたラップトップを利用しています。 `nvidia-smi`というコマンドを入力した場合、正しくNVIDIAが認識されています。この状態で上の黒塗りバグが出ていました。
しかし、上記の方法を試すと正しく画面に3D表示がされました。

自分でも結局なぜこの方法で直るのかわかっていないのですが、
`export MESA_D3D12_DEFAULT_ADAPTER_NAME="NVIDIA"`
というコマンドを入力する前に `glxinfo -B`をしたら、Intel Arcのグラボが選択されていました。
けれども、WSL2上で使用されるグラボはNVIDIA。要はNVIDIAのグラボを見つけたいのに、参照できないみたいなことになっていたのかもしれないです。
有識者、情報がございましたら教えてください。
VS code のターミナル　Git Bushに変更

## はじめに
こんにちは。私は、未経験からエンジニアを目指していて、某スクールで学んでいます。
現在、20代前半です。資格取得が好きで、とにかく新しい知識を入れるのが大好きなので向いているのかなと思い転職活動中です。
夢は<font color=red>**以下の資格を全制覇することです**</font> ~~絶対無理だけど、、~~

[資格一覧](https://jpsk.jp/)

今回は、**VS code上のターミナルをGit Bushに変更する方法**についてです。
あくまで、自分の理解を残しておくものなので、未完成です。ご容赦ください。

## 前提

日本語に変更する拡張機能をインストールしている前提で話を進めます。
この拡張機能のインストール方法はこちらで解説しておきます。
（url後日貼る）
また、Windowsを前提とします。

## 流れ
### 1. VS codeを開いてターミナルを開く
以下の画像部分まで開きます。（画面左上）
そして、「**新しいターミナル**」を選択します。
![qiita01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910144/f72fb4ba-d021-4cac-5fee-bacda9675776.png)

### 2. Git Bashをターミナルから選択
画面右下に以下のような画像部分が出てくると思います。
PowerShellになっているかと思いますので、Git Bushを選択すれば完了です。

![qiita02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3910144/2235eacb-b8e1-1744-131a-5215370f57b0.png)

**画面下にGit Bushが出てきたら完了です**！！


## 更新記録
2024.12.02 執筆
一年の振り返り

初めまして、イノベーション本部オルターロックチームに所属している徳田と申します。業種としてはセールスマネージャーとなり、国内・外の代理店様との業務連絡だったり国内・外のイベント出展、ＳＮＳ業務、インフルエンサー起用と多岐にわたります。要は何でも屋ですね。

初めて会社のアドベントカレンダーなるものの執筆に挑戦してみるにあたり、当該ブログの読者の方の殆どがIT業界出身と推察されるので普段あまり関わり合いが無い他業界について、ここ一年の業務経験等も交えて軽く触れられたなと思います。

AlterLockチームが関わっている業界は大まかに分けて二つあります。一つはスポーツサイクル業界、そしてもう一つはオートバイ業界です。主な業務は営業なのですが実際に行う職務は営業、イベント管理、SNS運営、マーケティングと多岐にわたります。

まず、営業ですが、基本は代理店営業です。各業界共に名の知れた代理店様にAlterLockを販売していただいており、今年は大きく売り上げを伸ばす事が出来ました。近年はECの台頭により代理店の有用性等を問う人たちも少なくないですが、自転車業界とオートバイ業界に限って言えば決してそのような事はありません。乗り物という特性上ジャストインタイム納品がエンドユーザーから強く求められるので問屋の数千種類に及ぶ膨大な在庫なしでは到底実現できません。そんな代理店様のご要望やご意見を吸い上げて事業改善につなげるのも営業職の職務でもあります。

AlterLockでは様々なイベントに出展してユーザーへの認知度向上に勤しんでおります。その中でも今年参加した最大規模は台湾の台北サイクルショー、そしてドイツのユーロバイクでしょう。どちらも元々はB2B色の強いイベントでしたが近年はマーケティング体系の変化も影響してか半分B2B、半分コンシューマーショーな側面も持つようになってきました。

![240306090234329.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945075/6ffd52d9-1958-2c5e-000c-5d249258c552.jpeg)
台北サイクルショーは世界最大規模のB2B展示会です。ここに来れば自転車を製造する為に必要な部品の全てが手に入るといっても過言ではありません。世界中のバイヤーが集まる場所であり、販路を世界に伸ばす際の登竜門の一つとも言える場所であります。

![Eurobike05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945075/b53110c8-cb09-7ebd-f7b8-430e51cafb50.jpeg)
ユーロバイクショーはヨーロッパ圏で最大規模のB2Bショーです。以前はフリードリッヒスファーヘンというドイツでも南の方で行われていたのですが数年前からフランクフルトへと移転、様相も自転車オンリーからモビリティショーといった形態へと変わっていきました。

どちらのショーも参加目的は代理店の模索。ここ数年の業界不振といった事情からの困難もありますがAlterLockno商品力は世界規模で見てもピカイチだなと実感と手ごたえは感じられるイベントでした。遠方の会場で開催する際には困難も多くあります。ブースデザイン、備品の手配、搬入出、等々…両ショーから繋がったご縁や話が予想外の広がり方を見せたりとイベント出展からしか得られないモノも多かったりします。

皆さん、SNSはやっていますか？という問いは愚問になるレベルで社会へ各SNS媒体は生活と密着するものとなっています。と同時に、近年の商品マーケティングはSNSとは切って切り離せないものとなってきています。インフルエンサーさんの起用、各種キャンペーン、市場調査なと多岐にわたる運用をしていますがまだまだだなと常に力不足を感じるフィールドでもあります。まさに沼…正解あるんでしょうか？と泣き言を飲み込んで取り合えずはやってみるか！と挑戦の連続でもあります。

営業職というとルート営業だったり新規だったりを想像される方が多いと思いますが、AlterLockのような少人数のチームで運営している部署はメンバー一人一人がマルチプレイヤーになる必要がありとてもやりがいを感じています。今までの仕事だったり経験が生きてきており、月並みな表現ではありますが過去の挑戦に無駄はないなと思う一年でした。

本当にサラッとですが、AlterLock事業に携わった一年の業務内容をご紹介させて頂きました。ここ一年は本当にいろんなことに携わり、各々深堀していては永遠に終わらないぐらいの体験をさせてもらってとてもありがたく思っております。今後ももっと多くの人にAlterLockと商品がもたらす安心感をお届けしたいと思います。
外部サービス選定時の手順

# 前提
社内に日程調整サービス導入を検討していて、初めてサービス選定から触れることがあって、結構貴重な経験だと感じ、メモとして残そうと思います。今回私が関わっていたのが日程調整サービスの導入でしたので、日程調整サービスを例とします。

# 要求確認
まずは要求の確認からです。どのような目的でサービスを導入しようとしているのを確認しないといけないです。
今回導入しようとする日程調整サービスに対し、主な要求は以下の4点となります。

・日程調整サービスから直接Outlookや他のカレンダーサービスに連携できるかどうかとのことです。

・面談時Teamsを利用することが多いので、teamsとの相性が大事になります。日程調整サービス上オンラインなのか対面なのかを設定することができるかどうかとのことです。

・現在所属している会社も自社サービスを提供しているので、日程調整サービスページやリンクを自社サービスにも連携できるかどうかとのことです。

・サービスによって、開放される機能によって料金変わるサービスもありますし、機能が全部利用できますが、人数制限によって料金が変わるサービスもあります。料金は安い方が良いという前提で、利用料金も気をつけないといけないです。

また便利機能として、SSO対応、通知メールのカスタマイズなどを検討項目に入ってました。

# 選定
### 検索
まずは検索エンジンで日程調整サービスをピックアップしました。
できるだけ網羅的にサービスをピックアップしてみました。

### 資料請求
資料を請求し、サービスの特徴を把握した後、要求に対して合うかどうかを判別し、最初のフィルタリングを行いまいした。

### トライアル
要求に合うサービスに対して、サービスをトライアルし、使用感を把握していきました。主に日程を作成する、社内と、日程を登録するお客さん側の操作しやすさに対して、評価し2回目のフィルタリングを行いました。

### 説明会
トライアルと被ったり、前後する可能性はありますが、サービスのより詳しい使い方、注意点や料金に対して、サービスを提供する会社の方に伺います。

# 社内選定
社内選定するために以下のような表で資料をまとめてました。

| サービス名           | サービスA  | サービスB  | サービスC  |
|----------------------|------------|------------|------------|
| 企業名               | 企業A      | 企業B      | 企業C      |
| 資本金               | 10億円     | 5億円      | 3億円      |
| 創立                 | 2020年     | 2018年     | 2019年     |
| 料金                 | ¥1,000/月  | ¥2,500/月  | ¥3,000/月  |
| ページ数(設定パタン) | 10ページ   | 8ページ    | 12ページ   |
| 画面分かりやすさ     | ★★★★☆     | ★★★☆☆     | ★★★★☆     |
| Outlookとの連携      | ○          | ×          | ○          |
| SSO対応              | ○          | ○          | ○          |
| 他サイトへの埋め込み | ○          | ×          | ○          |
| カレンダー機能       | ○          | ○          | ○          |
| 連絡メールのカスタマイズ | ○        | ×          | ○          |
| 特徴                 | 高速同期, 簡単設定 | AI活用, セキュリティ | 法人向け特化型 |
| 使用画面             | PC/スマホ対応 | PC/スマホ対応 | PC専用    |
| 動画資料             | 動画LINK   | 動画LINK   | 動画LINK   |
| トライアル状況       | 利用可能   | 利用不可   | 利用可能   |


# まとめ
どれほど優秀のサービスで要求に対して応えられなかったら意味がないと思います。要求に対して応えるのが一番大事なポイントであり、その上、サービスの使いやすさ、見やすさは今回私が気にしているポイントでした。
Redshift Provisioned（暗号化なし）のスナップショットを、別アカウントのServerlessで復元する

# はじめに
Redshiftには、スナップショット機能（自動/手動）があり、これを使うことでバックアップや復元などが簡単に行えます。

また、この機能はクラスター間の移行にも使うことができますが、タイトルの条件の場合に少しハマったので記事にしておきます。

今回は、アカウントAからアカウントBにデータを移行する場合を考えます。

# 前提条件
- 移行元
    - アカウントA
    - Redshift Privisioned
    - DC2タイプ
    - 暗号化なし
- 移行先
    - アカウントB
    - Redshift Serverless

# 実施方法

## アカウントAのクラスターのスナップショットを取得
ここは、通常の手動スナップショット取得手順でOKです。

クラスター詳細画面から、右上「アクション」→「スナップショットを作成」をクリックし、識別子と保持期間を入力して作成をクリックします。

## スナップショットをアカウントBに共有
ここが**注意ポイント**です。

まずは、左メニューから「クラスター>スナップショット」をクリックして一覧を表示させ、先ほど取得したスナップショットにチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/14a1a67a-fc18-a467-e35d-f9568fafc93a.png)

その後、右上の「アクション」→「サーバーレスアカウントへのアクセス許可」をクリックし、共有したいアカウントIDを入力、「変更を保存」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/d950596a-d9cf-f385-0eac-bf73061e2fb1.png)

これで、別のAWSアカウントのRedshift Serverlessへのスナップショットの共有ができました。

## アカウントBのServerlessに復元
ここも一般的な手順でOKです。

アカウントBの方にログインしなおして、Redshift Serverlessのコンソールの「データバックアップ」に先ほど共有したスナップショットが表示されていることを確認します。

その後、そのスナップショットをクリックして、右上の「アクション」→「サーバーレス名前空間への復元」をクリックし、名前空間を選択して「復元」をクリックで完了です。

# 注意
- 今回の手順がそのまま使えるのは、**暗号化なし**の場合です。暗号化している場合は、暗号化に使われているKMSキーも別アカウントに共有しないといけません
    - 共有=キーポリシーで許可するということなので、CMK（カスタマーマネージドキー）でのみ可能となります。AWSマネージドキーを使っている場合はキーポリシーの編集ができないため、**スナップショットの共有ができません**
- 今回、スナップショットの共有の際に「サーバーレスアカウントへのアクセス許可」を実施しました。共有の方法は、これ以外にも「手動スナップショットの設定」から「アクセスを管理」でアカウント追加もできますが、**この方法だとサーバーレスに復元することが出来ません**
    - 以下のようなエラーが出ます

```
AccessDeniedException
Cannot find resource policy for snapshot: arn:aws:redshift:ap-northeast-1:999999999999:snapshot:test-dc2-2/snapshot-dc2-20241201
```

- 復元するとき、名前空間すべてを上書きしてしまうので、必要なデータがある場合は退避させておきましょう

# おわりに
スナップショットの共有と復元ですが、意外とやってみると詰まることが多かったです。パターンも結構ある（暗号化あり/なし、プロビジョンド/サーバーレスなど）ので、ご自身のパターンで一度試しておくことをお勧めします。
ローカル開発で GitHub 用 SSH キーをプロジェクトごとに分けて接続する方法

# ローカル開発でGitHub用SSHキーをプロジェクトごとに分ける方法

このドキュメントでは、MacOSでGitリポジトリごとにSSHキーを分けて接続する方法を説明します。

## 事前準備

次の GitHub 公式ドキュメントを参考に SSH キーを生成してください：

[SSHキーの生成](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key)

## GitHub に公開鍵を登録

SSHキーを生成したら、公開鍵の内容をクリップボードにコピーして:

```bash
pbcopy < ~/.ssh/YOUR_PUBLIC_KEY
```

[GitHubにその公開鍵を登録](https://github.com/settings/keys)します。

## ssh-agentを（再）起動

次のコマンドでssh-agentを起動します：

```zsh:zsh
eval "$(ssh-agent -s)"
```

## SSH設定ファイルの編集

カスタムのホスト名を `YOUR_HOST` とし、SSHキー `YOUR_KEY` を追加する場合は、`~/.ssh/config` に以下を追加します：

```ssh:~/.ssh/config
HOST YOUR_HOST
 AddKeysToAgent yes
 UseKeychain yes
 HostName github.com
 User git
 IdentityFile ~/.ssh/YOUR_KEY
```

この設定で、GitHub用のカスタムSSH設定を有効化します。

## SSHキーをキーチェインに追加

次のコマンドでSSHキーをmacOSのキーチェインに追加します：

```zsh:zsh
ssh-add --apple-use-keychain ~/.ssh/YOUR_KEY
```

次のコマンドでSSHエージェントにキーが追加されていることを確認します：

```zsh
ssh-add -l
```

## 接続テスト

次のコマンドでSSH接続が正しく設定されているかテストします：

```bash:zsh
ssh -T git@YOUR_HOST
```

成功すると次のメッセージが表示されます：

```zsh:zsh
Hi YOUR_OWNER! You've successfully authenticated, but GitHub does not provide shell access.
```

## プロジェクトをクローン

GitHubアカウント `YOUR_OWNER` のリポジトリ `YOUR_REPO` をクローンするには、以下を実行します：

```zsh:zsh
git clone git@YOUR_HOST:YOUR_OWNER/YOUR_REPO.git
```

クローンが成功したら、プロジェクトのルートディレクトリに移動します。

```zsh:zsh
cd YOUR_REPO.git
```

## プロジェクトのリモート origin を変更

リモートのURLをカスタムホスト名を使った形式に変更します：

```zsh:zsh
git remote set-url origin git@YOUR_HOST:YOUR_OWNER/YOUR_REPO.git
```

## デプロイキーを使用する場合

デプロイキーを設定している場合、Gitユーザー情報を次のコマンドで設定します：

```zsh:zsh
git config user.name YOUR_OWNER
git config user.email YOUR_EMAIL
```

これにより、コミット時に適切なユーザー情報が使用されます。

以上の手順で、リポジトリごとに適切なSSHキーを使ってGitリポジトリのクローンや管理することができます。
Rコードにお決まりのlibrary(tidyverse)を簡便に記載する方法

### はじめに

Rな人たちにはtidyverse信者が多いと感じております。私もそんな1人です。パイプ(%>%,|>)を使えるようになるという面が大きいのでしょうか。とにかく、Rコードの最初に"library(tidyverse)"と書きたい病が発症している皆様（私？）のためにlibrary(なんちゃら)を直打ちしなくてもよい簡単な方法をご紹介します。

```higeme.R
library(conflicted)
library(tidyverse)
conflict_prefer("filter", "dplyr")
```

ちなみに私はこの3行を必ず記載しています。1行目はボブさん（@bob3bob3)のレクチャーで会得したものです。これにより複数のライブラリが使っている関数の場合はどちらのライブラリ関数なのか明確にする必要があり、コードの曖昧さを排除します。また同時に下記の警告文が表示されなくなります。ただ、このままだと頻出のfilter()関数がconflicted package errorになってしまいますので、単にfilter()と表記したときはdplyr::filter()のことだよ、ということを指定するのが3行目のコードです。

```
── Conflicts ──────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package to force all conflicts to become errors
```

### 2つの方法

1. .Rprofileを使う
1. スニペット機能を使う

1.の方法の方が優秀で、例えばRstudioを起動した時点で上記"higeme.R"の3行が実行された状況から始まります。自動化の面ではより進んでいますが、環境により設定方法がやや異なり初期設定に苦労することがあること、他人とコードを共有する場合は、結局あとでlibrary(tidyverse)を追記しなければならないことなどデメリットもあります。今回はより簡便で間違いの起こりにくい2.の方法についてのみ触れます。

### スニペットとは

詳しい説明は他のページをgoogle検索してご参照ください。基本的には、「よく使う長いコードブロックを、ショートカット名を作って記憶しておく」という説明が一番わかりやすいでしょうか。

## スニペットを使って簡単に入力する方法（Rstudio篇）

1.  RStudioの「Tools > Global Options > Code > Edit Snippets」から設定します
![スクリーンショット 2024-12-02 143830.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015152/3edab168-3432-eb15-fc9d-25874eb6f48c.jpeg)
1.  "Edit Snippets"画面に遷移しますので、下のように入力します。この例はスニペット名（本記事ではスニペットのショートカット名、prefix名を「スニペット名」と表記します）として"mazuha"を設定しています
```edit snippets.
snippet mazuha
	library(conflicted)
	library(tidyverse)
	conflict_prefer("filter", "dplyr")
 ```
3.この設定をsaveして、Source Paneに"mazuh"までの先頭5文字を入力するとスニペット選択肢が出てきます。これを選択すると、指定の3行が入力されるという仕組みです

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015152/34b1e109-0a75-a7be-10b5-ae5bbe4420ea.png)

 あるいは"mazuha"と入力しtabボタンを押せば、同じく3行が入力されます。

## スニペットを使って簡単に入力する方法（Visual Studio CodeやPositron篇）

実は私は普段Rstudioではなく[Positron](https://github.com/posit-dev/positron/releases)を利用しています。PositronとVSCodeのスニペット設定は同じ方法となります。

1.   コマントパレットを開きます
1.   "Snippets: Configure Snippets"を開きます。"snip"あたりまで入力すると、選択できるはずです
1.   新規スニペットを作成し、下記.jsonのように入力し、saveします。なお、prefix:がスニペット名となります
```.json
{
  "Insert libraries": {
    "prefix": "mazuha", 
    "body": [
      "library(conflicted)",
      "library(tidyverse)",
      "conflict_prefer('filter', 'dplyr')"
    ],
    "description": "Insert commonly used libraries"
  }
}
```
実行方法はRstudioの場合と同じで、選択肢の中からクリックするか、スニペット名+tabキーで入力できます。

### スニペット名のTips
Rstudioの初期設定では、5文字以上入力しないとこのように関数やスニペットの選択肢が出てきませんので、選択肢を見てから確定したい方はスニペット名を5文字以上にするとよいでしょう。逆に"スニペット名+tab"の方法を使いたいという方は、むしろスニペット名を5文字未満の短い名前にするとよいでしょう。
オークファングループ（開発部）のご紹介 2024

# はじめに
お疲れさまです。もしくは、初めまして。
オークファングループ開発部 @aucfan-nodake です。

今年で、この場を用意するのも 7年目となりました。

ただ今回、一部現場から悲鳴があがり、業務優先としております。
このため、上がる記事の数が少なくなってしまう・・・とかしばらく白いままかと思いますが、そういうこともあるもんだ、と大目に見て頂けると助かります。

尚、この心持ちは今年も変わっておりません。
> この場がメンバーにとって、定期的なアウトプットの場となると共に、
> 組織外の人たちにとって、何かしら参考になる情報を拾える場になれば幸いです。

# オークファングループとは
「オークファングループ」は、ネットショッピングやオークションの相場、統計価格比較サービス オークファン を運営する会社「オークファン」と、国内最大級のBtoB卸売仕入れプラットフォーム NETSEA を運営する会社「シナビズ」を中心としたグループです。
事業としてそれぞれ「ソリューション事業」と「プラットフォーム事業」を行っている感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377233/2ec5d06d-b1ce-8a1e-9759-a5ff71107a1f.png)

最近では、会社の境界なくグループ全社をあげて、海外展開を視野に入れた投資や、新規事業的な立ち上げもちょこちょこあり、先に述べたようにバタバタしております。

今年一年を振り返ると、会社としては、海外事業への投資が加速し、色々挑戦をしている中で開発も一部その流れに引っ張られる印象が強いでしょうか。

<details><summary>個人的に海外事業に関わる中で</summary>
開発が関係する案件に関わり続け、ヒアリングはさっぱりで、全然話せるようにはなってませんが
チャットツールや、プロジェクト（課題/バグ）管理ツールによく登場する簡体字の単語や表現などは翻訳ツールを挟まなくてもある程度分かるようになったりしています。

話せないので実際あまり議論などでは役にたたないですが、新たな時間や経験が積み上がった一年にも思います。

対応力とか上がってるといいなー
</details>

会社の公式な資料からその辺について持ってくると、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377233/63175bba-18c3-063a-12c9-e2617700afdf.png)

### 開発部は
そんな会社の事業を応援する形で。海外や新規事業など手を出しつつも
サービスを守り育てるために、日々システムの運用保守を行なっている 30～40 名ほどの部署となります。

上記で、大きく2つの事業を挙げましたが、実際のところ中や横にサービスがいくつかあり、サービスごとの担当チームや、ある程度専門とすることで分かれてたりもするため、全部で10ほどチームを抱えるような構成となっています。

このため、実際の活動としては、小さなチームの動き、責任範囲や裁量が大きくなりがちだったりしています。
また、事業会社なので、会話する相手はエンジニアだけに限定されず、事業側の人たちの方が多く、会社に来ると開発会社とは違う空気かと思います。
まぁ、リモートで引きこもってることも多いので。人によっては、今月何人と話したか簡単に数えられるかもしれませんが。

### 今年/今回は
この扉ページも、12/1 から遅れての設置となっていたりしますが。
一旦、埋まっていないところからのスタートとなります。

少しずつ、話したいこと、共有したいことなどで、埋まっていけば良いな、と思っています。
そして、それを機に、良い何かに繋がれば幸いです。

何かしら機会がありましたら、また、そのときに。
この場はこれにて失礼いたします。
ちょっとした型定義の改善をしてみた

## はじめに
Reactアプリケーションの開発において、適切な型定義は非常に重要です。特に、複数のコンポーネント間でPropsやステート管理を行う場合、型の一貫性を保つことは保守性と開発効率に大きく影響します。
最近、個人プロジェクトで複数のコンポーネント間の型定義が散在し、少しでも改善できないかと考えました。この記事では、その問題をどのように解決したのか、具体的な実装例と共に解説します。

## 変更前

```‎client/features/chat/Chat.tsx
export const Chat = ({
  setKeyword,
  resetChat,
  setResetChat,
}: {
  setKeyword: (keyword: string) => void;
  resetChat: boolean;
  setResetChat: (reset: boolean) => void;
}) => {
```
```client/features/news/News.tsx
export const News = ({ query }: { query: string }) => {
```
```client/hooks/useChat.tsx
export const useChat = ({
  setKeyword,
  resetChat,
  setResetChat,
}: {
  setKeyword: (keyword: string) => void;
  resetChat: boolean;
  setResetChat: (reset: boolean) => void;
}) => {
```
```client/hooks/useNews.tsx
export const useNews = ({ query }: { query: string }) => {
```
上記は変更前の実装で、カスタムフックとコンポーネントで同様の型定義をしています。この方法では、コードが冗長で見にくく、一貫性がありません。これを以下のように修正しました。
## 変更後

```‎client/features/chat/Chat.tsx
import type { ChatProps } from 'utils/types';
import React from 'react';

export const Chat: React.FC<ChatProps> = ({ setKeyword, resetChat, setResetChat }) => {
```
```client/features/news/News.tsx
import React from 'react';
import type { NewsProps } from 'utils/types';

export const News: React.FC<NewsProps> = ({ query }) => {
```
```client/hooks/useChat.tsx
import type { ChatProps } from 'utils/types';

export const useChat = ({ setKeyword, resetChat, setResetChat }: ChatProps) => {
```
```client/hooks/useNews.tsx
import type { NewsProps } from 'utils/types';

export const useNews = ({ query }: NewsProps) => {
```

```client/utils/types.ts
export interface NewsProps {
  query: string;
}
export interface ChatProps {
  setKeyword: (keyword: string) => void;
  resetChat: boolean;
  setResetChat: (reset: boolean) => void;
}
```

このように実装することで
- Props型定義の一貫性の確保
- React.FCを活用した型安全性の向上
- 保守性と可読性の改善
- 重複する型定義の削減

React.FCをわざわざimportしているのは、コンポーネントとして明確にするためであり、個人的な好みでもあります。

## さいごに
まだまだ知らないことばかりですが、少しずつでもこのようにアウトプットしていくことが大切だと感じています。さらに改善点や間違いなどがあれば、気軽にコメントをお待ちしております！
Workato：ノーコードで文字列置換を実現するコネクタのご紹介

# はじめに

昨年のアドベントカレンダーにて、次の記事を公開していました。

https://qiita.com/tabimoba/items/96f8a04a7ff84c064449

当社では、Workatoをご利用のユーザーの皆様が、スキルを問わずWorkatoを活用できるよう、様々なユーティリティコネクタをコミュニティライブラリ上で提供しています。

その中より、今回は文字列置換コネクタである「Smart value replacer」をご紹介します。既にWorkatoのコミュニティライブラリ上にリリース済ですので、インストールしてすぐにご利用いただけます。

# インストール

以下のリンクよりご利用中の環境へインストールが可能です。（無料でインストールが可能です）

※データセンターは現在の契約に合わせて選択してください。
※本コネクタの動作は無保証とします。各自の責任のもとでご利用ください。なお、当社より契約いただいているお客様については、この限りではなく、当社のサポートサービスの範囲においてサポートいたします。

USDC（USデータセンター）

https://app.workato.com/custom_adapters/508909/details?community=true

JPDC（日本データセンター）

https://app.jp.workato.com/custom_adapters/508909/details?community=true


# 利用方法
## アクション
このコネクタには２つのアクションがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/b29f6534-a683-6bcc-3694-9e3922151298.png)

### Replace multiple value

複数フィールドの文字列を一度の処理でまとめて置換します。
リスト内の値の置換にも対応していますので、例えば、リストで取得した値の正規化等に活用いただけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/43d7724d-b553-cf7f-96a7-96c5c3b94ba6.png)


### Replace value

単一フィールドの文字列を置換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e71042fa-bb94-4bc7-13d9-d88ae0cd1224.png)


## 条件設定

入力された文字列に対する置換条件を指定することができます。
なお、置換条件は複数指定することができます。複数条件指定した場合は、条件１→条件２・・・の順で置換処理が適用されます。（条件２では、条件１の処理結果に対して置換処理を行います）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/1a876722-ca86-9ada-a024-c0d756594873.png)

- Replace from ・・・ 置換対象の文字列
- Replace to ・・・ 置換する文字列
- Use RegExp　・・・　正規表現利用有無（Yesを選択した場合、正規表現を利用可能）
- Remove leading whitespace ・・・ Yesを選択した場合、文字列先頭の空文字（スペース等）を除去
- Remove trailing whitespace　・・・　Yesを選択した場合、文字列末尾の空文字（スペース等）を除去

# 最後に

今回は、文字列置換コネクタである「Smart value replacer」を紹介させていただきました。
本コネクタを利用することで、関数やコードを書くことなく、スキルに関係なくWorkatoのユーザーインターフェース上で簡単に置換処理を実現することが可能です。

文字列の置換処理は、関数やコードを利用することで実現できるものですが（このようなコネクタが無くても文字列置換は可能ですが）、非エンジニアの方にとっては関数やコードを利用して処理を実装することが、Workatoを活用する上でのハードルになってしまうものと思われます。

また、個人的には、ノーコードプラットフォームを標榜しているからには、エンジニアにとってのツールではなく、非エンジニアも開発に関与できるツールであってほしい、そして非エンジニアの方々自らが課題解決できるツールであってほしいと思っています。

当社ではエンジニア・非エンジニアを問わず、Workatoユーザーの皆様が自らの力で使いこなし、課題解決できるよう、今後もこのようなツールをリリースしてまいります。
IGCSE（International General Certificate of Secondary Education）

## IGCSE（International General Certificate of Secondary Education）

IGCSEのについてまとめたのでここに記録しておく
STEM 関連であれば大学のCompurter Scence等に近いかも

> IGCSE（International General Certificate of Secondary Education）はイギリスの義務教育修了資格になり、ケンブリッジ国際中等教育修了証とも言われています。国際的に中等教育を修了した証明の国際資格になります。
イギリスの教育制度は、5～11歳の6年間が初等教育、11～18歳の7年間が中等教育となっており、大学進学希望者は、通常16歳でGCSE（General Certificate of Secondary Education）を受験して当該資格を取得します。IGCSEはGCSEをベースに国際的に通用するようにアレンジされた海外向けのGCSEになり、インターナショナル生はIGCSEを受験し資格を取得します。

https://joi-school.jp/qualifications/igcse/

IGCSE（International General Certificate of Secondary Education）のカリキュラムは、非常に柔軟で多様な科目から構成されています。以下に、IGCSEの主要な科目を表形式でまとめました。

| **科目グループ** | **科目例** |
| --- | --- |
| **言語** | 英語（第一言語、第二言語）、フランス語、ドイツ語、中国語など |
| **数学** | 数学、追加数学 |
| **科学** | 生物、化学、物理 |
| **人文・社会科学** | 歴史、地理、経済学 |
| **クリエイティブ・技術・職業** | 音楽、美術、演劇、ビジネススタディ、デザイン技術 |
| **情報技術** | コンピュータサイエンス、ICT |

## **IGCSEのカリキュラム概要**

- **対象年齢**: 14歳から16歳（日本の中学2年生から高校1年生に相当）
- **選択科目数**: 生徒は通常9から12科目を選択し、必修科目として英語、数学、科学が含まれます。
- **試験回数**: 年に2回（5月・6月と10月・11月）実施されます。

## **特徴**

- IGCSEは世界中で広く認知されており、多様なバックグラウンドを持つ生徒に対応しています。
- 各科目には異なるレベルがあり、生徒は自分の能力や興味に合わせた選択が可能です。

このように、IGCSEは国際的な教育環境での学びを重視しており、生徒に多くの選択肢を提供しています。

IGCSEの数学と情報技術（ICT）について、詳細な内容を以下にまとめました。

## **数学（Mathematics）**

## **概要**

IGCSE数学は、数学的な原則や概念を理解し、問題解決能力を養うことを目的とした科目です。生徒は基礎的な数学スキルを身につけ、さらに高度な数学的思考を発展させることが求められます。

## **主なトピック**

| **トピック** | **内容** |
| --- | --- |
| **数（Number）** | 整数、分数、小数、割合、指数法則などの基本的な数の操作と概念。 |
| **代数（Algebra）** | 代数式の操作、方程式の解法、不等式、関数の理解など。 |
| **形と空間（Shape and Space）** | 幾何学的な図形の性質、面積、体積、三角関数など。 |
| **確率と統計（Probability and Statistics）** | 確率の計算、データの整理と分析、平均・中央値・モードなどの統計的手法。 |

## **評価方法**

- **試験形式**: 通常、2つの試験が行われ、それぞれが全体の成績に50%ずつ寄与します。試験は選択肢に応じて「コア」と「拡張」の2つのレベルがあります。
- **コアレベル**: 基本的な問題が中心で、全ての生徒が受講可能。
- **拡張レベル**: より難易度の高い問題が出題され、高度な数学的思考が求められます。

## **情報技術（ICT）**

## **概要**

IGCSE情報技術は、生徒にコンピュータとその利用方法についての知識とスキルを提供することを目的としています。この科目は、情報処理能力やデジタルリテラシーを向上させるために設計されています。

## **主なトピック**

| **トピック** | **内容** |
| --- | --- |
| **コンピュータシステム（Computer Systems）** | コンピュータの基本構造、ハードウェアとソフトウェアの役割。 |
| **データ管理（Data Management）** | データベースの設計と利用、データ入力・処理・出力に関する技術。 |
| **プログラミング（Programming）** | 基本的なプログラミング概念やアルゴリズム設計、簡単なプログラム作成。 |
| **インターネットとその利用（The Internet and its Uses）** | インターネット技術、ウェブサイト作成、安全なオンライン行動について。 |

## **評価方法**

- **試験形式**: 実技試験と筆記試験が組み合わさった評価が行われます。課題やプロジェクトも評価に含まれる場合があります。
- **コースワーク（Coursework）**: プロジェクトや課題を通じて実践的なスキルを評価します。


## **Reference**
https://www.cambridgeinternational.org/programmes-and-qualifications/cambridge-upper-secondary/cambridge-igcse/
AWS SSO Credential Helper

# AWS SSO Credential Helper

AWSの認証を、AWS SSO (IAM Identity Center)を使って組織のユーザーディレクトリと連携されているケースは多いのではないでしょうか。  
また、SSOでの認証後、各プロダクト・プロジェクト毎の専用ロールへスイッチロールが必要な場合も多いかと思います。

pythonからAWS環境の操作を自動化したい場合に、このSSOの認証が面倒ですよね。　

AWS SSO Credential Helperは、AWS SSOを通した認証と、その後のスイッチロールでの一時認証情報の取得を助けます。  

- 実行時には、必要に応じてブラウザにて認証確認を求められますので、許可して下さい。  
- AWS SSOの認証tokenはファイルにキャッシュし、有効期間内であれば再利用します。  
- キャッシュはホームディレクトリにファイルとして保存し、Credential Helperを使った複数のプログラムで共有して利用することができます

## Pypi
https://pypi.org/project/aws-sso-credential-helper/

## Usage

### 1. Create Instance
```python
from aws_sso_credential_helper import CredentialHelper

credential_helper = CredentialHelper(
    start_url="d-xxxxxxxxxx.awsapps.com/start",
    region_name="ap-northeast-1"
    )
```
 - start_url : AWSアクセスポータルのURL
 - region_name : 対象とするIAM Identity Centerのリージョン

### 2. Get Credentials
```python
credentials = credential_helper.get_swrole_credentials(
    sso_account_id="123456789",
    sso_role_name="ssoRoleName",
    sw_role_arn="arn:aws:iam::123456789012:role/sw-role-name"
    )
```
 - sso_account_id : アクセスポータルのあるAWSアカウントID
 - sso_role_name : SSOでログインするロール
 - sw_role_arn : SSOでログイン後、スイッチロールする先のロールのARN

### 3. Create boto3 client with credentials
```python
lambda_client = boto3.client(
    "lambda",
    region_name="ap-northeast-1",
    aws_access_key_id=credentials["AccessKeyId"],
    aws_secret_access_key=credentials["SecretAccessKey"],
    aws_session_token=credentials["SessionToken"],
    )
```
### Credentials
```python
{
    'AccessKeyId': 'XXXXXXXXXXXXX',
    'SecretAccessKey': 'YYYYYYYYY',
    'SessionToken': 'ZZZZZZZZZZ',
    'Expiration': 有効期限,
}
```

## How to install

install from pypi
```python
pip install aws-sso-credential-helper
```
【個人メモ】Ruby on Rails チュートリアル第14章

Ruby on Railsチュートリアルで学んだ内容を個人的なメモとして簡単にまとめたものです

# 個人メモ
- 外部キー
データベースの２つのテーブル　を繋ぐid
Railsは、デフォルトで外部キーの名前を <class>_id というパターンでクラス名を推測してくれる
ex) foreign_key: "follower_id"
-  has_many trough
モデル名（単数系）に対応する外部キーを探索する
-  Hotwire
SPAを実装できる
-  respond_to
書かれている2行のうち、どちらかしか実行しないif-elseifみたいなメソッド
format.turbo_stream で <アクション名>.turbo_stream.erb というファイルを探索する
-  turbo_stream.updateメソッド
CSS idを受け取り、そのidに対応する要素を、メソッドに渡されたERBのブロックを評価した結果で置き換えを行う
これにより、要素の一部分のみを変更できる
- N+1クエリ問題
- １つのクエリが発行された際に、その結果によりN回の追加のクエリが発行されてしまう問題
- eager loading
N+1クエリ問題を解決する手法
データベースからデータを取得する際、それに関連するデータも取得することにより、発行するクエリを減らす
windowsから同一ネットワークのデバイス名一覧を取得するコマンド

## やること
windowsから192.168.0.0/24 ネットワークに接続しているローカルホスト名（デバイス名）を取得するコマンドです
powersheellで実行してください。

```
# スキャン範囲の設定
$networkPrefix = "192.168.0."

# 1〜254までのIPアドレス範囲をループ
1..254 | ForEach-Object {
    $ip = "$networkPrefix$_"
    
    # デバイスに ping を送信
    $pingResult = Test-Connection -ComputerName $ip -Count 1 -Quiet
    
    if ($pingResult) {
        try {
            # 名前解決を行い、IPアドレスとホスト名を取得
            $hostEntry = [System.Net.Dns]::GetHostEntry($ip)
            $hostName = $hostEntry.HostName
            Write-Output "$ip - $hostName"
        } catch {
            # 名前解決できなかった場合
            Write-Output "$ip - Hostname not found"
        }
    } else {
        Write-Output "$ip - No Response"
    }
}

```
IPアドレスからMACアドレスを取得する。MACアドレス一覧表を作成する。


D:\Users\user\Videos ここにmactableというフォルダ作る
mactableの中にmac.py作る


mac.py　　↓
```
from scapy.all import ARP, Ether, srp
import ipaddress
import csv
from datetime import datetime

def scan_network(network):
    # 結果の辞書
    results = {}
    
    # 指定のネットワークの全IPを取得
    for ip in ipaddress.IPv4Network(network):
        # ARPリクエストパケットを作成
        arp_request = ARP(pdst=str(ip))
        ether = Ether(dst="ff:ff:ff:ff:ff:ff")
        packet = ether / arp_request
        
        # パケットを送信して応答を待つ
        result = srp(packet, timeout=1, verbose=0)[0]
        
        if result:
            # 応答があればMACアドレスを取得
            mac = result[0][1].hwsrc
            results[str(ip)] = mac
        else:
            # 応答がなければ"Notfound"
            results[str(ip)] = "Notfound"
    
    return results

# スキャン対象のネットワーク
network = "192.168.0.0/24"
mac_addresses = scan_network(network)

# 現在の日時を取得してファイル名を作成
current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
csv_filename = f"mac_scan_{current_time}.csv"

# CSVファイルに結果を書き出し
with open(csv_filename, 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['IP Address', 'MAC Address'])  # ヘッダー行を書き込み
    for ip, mac in mac_addresses.items():
        writer.writerow([ip, mac])

print(f"結果は {csv_filename} に保存されました。")

```
ターミナル行く


d:
cd D:\Users\user\Videos\mactable

python -m venv myenv 初回のみ
myenv\Scripts\activate

pip install scapy
python 3 mac.py

csvに書き出されます。
特徴量エンジニアリング 一日目

これは

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

２日目の記事です。

titanic tutorialを終了すると、qiitaの記事でも多くの選択肢が提示されていますが公式のtutorialの流れに沿って進めると次におすすめするのは

https://www.kaggle.com/learn/feature-engineering

です。このコースでの目標は２つ、特徴量を自分で作成することと回帰分析をできるようになることです。実際にチャレンジしてみましょう。

日本語化されたものも存在していますが情報についてもとと違う部分がありそうです。

https://www.kaggle.com/code/hatokgl/houseprice-eda-and-visualization

https://www.kaggle.com/code/hatokgl/statics-regression-japanese

英語版に従って解いていき、日本語版は参考に読むのが良いかと思います。






カテゴリ変数をdummy変数に置き換え（titanicと同様に）
新しく特徴量を作り
それらを回帰分析にかける

の流れとなりますが、実際のkernel（サンプルコード）を見ると新しく多くの関数が表示され圧倒されます。新しく出た関数についてコメントと参考コードを載せておきます。
tutorialが複数partに分かれているため、記事を連続したものを作ることで対応します。

https://www.kaggle.com/code/ryanholbrook/mutual-information

最初のpartのtutorialでは、MI（相互情報量）について軽く触れています。高校数学の相関係数の応用と捉えることで納得できるでしょう。より正確な理解をするには、web上で相互情報量についての資料を探す必要がありますが、tutorialの簡単な説明を理解しておけば十分です。

困りそうな点
 pandas.factorize()関数：
 カテゴリデータを整数データ（離散データ）に置き換えます。前の記事のpandas.get_dummies()と似ていますが0と１の二値化ではありません。

 ```
    name    food
0   田中    ラーメン
1   佐藤    カレー
2   鈴木    ラーメン
3   山田    寿司
4   高橋    カレー
 ```
 を
  ```
    name   food_code
0   田中    0
1   佐藤    1
2   鈴木    0
3   山田    2
4   高橋    1
 ```
に変換するイメージですね。
 

mutual_info_regressionについて
各特徴量がターゲット変数に対して持つ相互情報量（MI）を計算することになります。どの特徴が重要なのかを調べるためです。
 ```
from sklearn.feature_selection import mutual_info_regression

# X: 特徴量のデータ
# y: ターゲット変数
mi = mutual_info_regression(X, y)
 ```
生成AI(LLM)導入はすべて自社で実施したほうがよいという話

不幸な話を耳にしたのでポエムです。

## 大金払っているのに？回答間違うのか？
と、生成AI導入したら偉い人に言われてしまいました、と。

LLMは常に正しい情報を回答するという誤解。ITリテラシーが低ければ低いほどその傾向にあると思います。

出入りのベンダーを巻き込んでLLM導入して、OpenAIのAPIを使ったとしても、間違った回答が導きだされた場合など、目の前のベンダーの責任にされてしまうことがあります。経営層でITに疎かったりするとその傾向が強くなると思います。ベンダーからすれば、LLMの精度という話になりますが、そのLLMを選択したのも、そのベンダーの問題と言われてしまったりも。

そういうった不幸な状況を生み出さないようにするためにも、生成AI導入は自社で実施しましょう。
「砂時計の科学」紹介

この記事は[物理学アドベントカレンダー2024](https://adventar.org/calendars/10569)４日目の記事です。
約３０年前に「[砂時計の七不思議](https://www.chuko.co.jp/ebook/2007/10/512638.html)」という本を中公新書から出させてもらいました。これは光栄にも講談社出版文化賞科学出版賞（現在は講談社科学出版賞）を頂きました。ですが、すぐに絶版になってしまい、その後はずっと電子書籍だけで提供されていました。
今回、光栄にもその本を「[砂時計の科学](https://www.hanmoto.com/bd/isbn/9784065382677)」というタイトルで講談社学術文庫から再度出版してもらえることになりました。内容は３０年前そのままなのですが、今回、改めて内容紹介を書こうと思いました。
砂時計の七不思議は、内容的には粉粒体の動力学を物理学の観点から考察した一般向けの書物です。ただ、当時はいわゆる非線形非平衡多自由度系の研究が数値計算の発展も相まって非常に盛んだった時代でもあり、単に粉粒体の動力学にとどまらず、カオス、フラクタル、パターン形成などの入門にもなっています。最近[遺伝研の所長に就任された近藤滋先生](https://www.nig.ac.jp/nig/ja/about-nig/directors-welcome)の[熱帯魚の縞の研究](https://kaken.nii.ac.jp/ja/grant/KAKENHI-PROJECT-08878136/)なども紹介しています。そういう今の時代にも通じる、古びない内容が評価されたのかな、と思っています。講談社学術文庫っていうと往年の名著で絶版になってしまったものが収録されるというイメージだったので、拙著を選んで頂いたことはとても光栄に思っています。同時に、３０年経っても価値があるような一般向けの本をこれからも書けたらいいな、とも思っています。
以下では目次と共に内容を簡単に紹介します。

# はじめに
粉粒体の動力学とは砂とか米粒みたいな、粒々の集団運動を問題にするものです。この「はじめに」では、粉粒体は単に砂とかをモデル化するだけのものじゃなく人間集団を扱うこともできるみたいなことを書いてあります。要するに掴みです。

# 第一章　流れ落ちる
旧題の「砂時計の七不思議」は粉体工学の分野では「ホッパーの七不思議」として知られていました。ホッパーというのは漏斗みたいな装置のことでこれで粉粒体を容器に詰めたりするのです。この章の内容を読んだ編集者の方がタイトルを「砂時計の七不思議」とされました。賞を取るにはこの命名は大切だったと思います。

# 第二章　吹き飛ばされる
砂丘や風紋の運動を扱います。ここはパターン形成に関係ある章でこの章で上述の近藤先生の業績も触れさせて頂きました。

# 第三章　かき混ぜられる
ここは多分にカオスと関係する部分です。流体の混合と粉粒体の混合がいかに違うかを議論しました。

# 第四章　吹き上げられる
粉体の層に下から気体を勢いよく吹き込むと流動層と言って液体のような状態になります。その中で泳ぐこともできますよ。

# 第五章　ゆすられる
これはそもそもの僕の出世作の研究で、粉体層を上下に激しく揺すると対流が生じる現象がありこれをいち早く数値計算で出せたので一躍有名になれました。結果、粉粒体の他の分野のレビューなどもすることになってそのおかげで今の職があったようなものです。

# 第六章　粉粒体とは何か
かなり哲学的な内容です。

# おわりに
さらに哲学的になって物理とは何か、みたいな話になってます

# 参考文献ガイド
当時の文献

# 学術文庫版へのあとがき
ある意味、３０年経って、あとがきで書いたことは正しかったのかの答え合わせ。

# おわりに

以上です。読んでくれたらうれしいかな。
sortedを用いた複数条件での並び替えとその挙動

業務にて詰まった部分とその解決方法を簡単に紹介
## 発生した問題
特定の値を基準にして昇順・降順に並び替える方法として **package:collection** の **sorted** がとても役に立ちます
例えば、以下のようなMap型の値が存在していたとします
``` dart
final targetValue = [
  {'value1': 1, 'value2': 5, 'value3': 3},
  {'value1': 5, 'value2': 4, 'value3': 9},
  {'value1': 2, 'value2': 4, 'value3': 5},
  {'value1': 4, 'value2': 3, 'value3': 7},
  {'value1': 3, 'value2': 3, 'value3': 1},
];
```
これを **value1** の値を基準として昇順に並び替えたい場合は以下のように記述します

```dart
targetValue.sorted((a, b) => a[value1].compareTo.b[value1]);
```
結果はこのようになります
```dart
[
  {'value1': 1, 'value2': 5, 'value3': 3},
  {'value1': 2, 'value2': 4, 'value3': 5},
  {'value1': 3, 'value2': 3, 'value3': 1},
  {'value1': 4, 'value2': 3, 'value3': 7},
  {'value1': 5, 'value2': 4, 'value3': 9},
];
```
こういった使い方なら意図した順番に並んでくれるでしょう
でも、**value2** を基準にした場合はどうでしょうか
```dart
targetValue.sorted((a, b) => a[value2].compareTo.b[value2]);
```
結果はこうなります
```dart
[
  {'value1': 4, 'value2': 3, 'value3': 7},
  {'value1': 3, 'value2': 3, 'value3': 1},
  {'value1': 5, 'value2': 4, 'value3': 9},
  {'value1': 2, 'value2': 4, 'value3': 5},
  {'value1': 1, 'value2': 5, 'value3': 3},
];
```
同じ数値がある場合、その順番は入れ替えないので、もしかしたら意図しない順番になってしまうかもしれません

## 解決策
``sorted`` の挙動と ``compareTo`` の仕様をうまく利用して複数の条件を設定することで求めている順番に並び替えることができます
**value2** で比較した後に、同じ値だったら **value3** を参照するという指定をする場合は以下のように記述します
```dart
targetValue.sorted((a, b) {
  final result = a[value2].compareTo.b[value2]);
  if (result = 0) return result;
  return a[value3].compareTo.b[value3]);
});
```
結果は以下の通り、**value2** が同値の場合は **value3** を基準にして並び替えられています
```dart
[
  {'value1': 3, 'value2': 3, 'value3': 1},
  {'value1': 4, 'value2': 3, 'value3': 7},
  {'value1': 2, 'value2': 4, 'value3': 5},
  {'value1': 5, 'value2': 4, 'value3': 9},
  {'value1': 1, 'value2': 5, 'value3': 3},
];
```
このような処理になる理由として、``sorted`` と ``compareTo`` の挙動を見ながら確認していきましょう
1.``sorted``は指定した値リストから２つの値(a,b)を取り出す
2.``a.compareTo.b``でaとbの値を比較し、以下の条件で値を返却する
- aの方が大きかった場合 → 1
 - bの方が大きかった場合 → -1
  - aとbが同じだった場合 → 0
  
3.返却した値を元に順番を入れ替えて１巡が終了、次の値を準備して１へ戻る

このように処理しています
つまり、最終的に``1``,``0``,``-1``のどれかを返却することができるなら、条件は**いくつあってもいい**ということなのです

その条件を追加するために判定として ``0`` を利用します

``0`` が返却されているということは、同じ値が比較されているということなので、その状態の時に追加の条件で比較するように設定します
追加の条件でも比較が完了しない可能性があるリストの場合は、同様にその下に何行でも条件を追加することができるのです

とても便利に使うことができるので挙動も込みでぜひ覚えておいてください