OmniAICreator/Qiita-1.07M huggingface dataset:
limaにIntelliJ IdeaからSSH接続してVisualStudioCodeみたいにする

# はじめに
Lima等のCUIしかない仮想環境上でコードを書くときに、VSCodeのRemoteDevelopmentはとても便利ですね。
でも私普段からAndroid Studioを使っていることもあり、Jetbrainsのエディターも試してみたくなりました。
IntelliJIDEAでVSCodeのRemoteDevelopmentみたいなのができないか調査した結果です。

# 環境
Intel macでOSはSonoma 14.1、IntelliJIDEAのバージョンはIntelliJ IDEA 2023.3 (Ultimate Edition)です。

# やり方
## SSHの設定
LimaのSSHの設定は~/.lima/{lima上の環境名}/ssh.configに書かれています。
（lima上の環境名はlimactl listで確認できます。）
ターミナルから以下のコマンドを実行してください。

>vi ~/.lima/lima/ssh.config

ここで出てきた情報はあとで使うのでターミナルは開いたままにしておいてください。
多分こんな感じのが出ているはず
```
# This SSH config file can be passed to 'ssh -F'.
# This file is created by Lima, but not used by Lima itself currently.
# Modifications to this file will be lost on restarting the Lima instance.
Host lima-rocky-9
  IdentityFile "/Users/user/.lima/_config/user"
  IdentityFile "/Users/user/.ssh/hogehoge"
  IdentityFile "/Users/user/.ssh/hugahuga"
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  NoHostAuthenticationForLocalhost yes
  GSSAPIAuthentication no
  PreferredAuthentications publickey
  Compression no
  BatchMode yes
  IdentitiesOnly yes
  Ciphers "hogehogehugahuga.com"
  User user
  ControlMaster auto
  ControlPath "/Users/user/.lima/hoge.sock"
  ControlPersist yes
  Hostname 111.111.111.111
  Port 123456
```

## IntelliJ IDEA側の設定
まずはIntelliJ IDEAを開いて、左側のタブからリモート開発を選びます。
その後SSH接続の下に書いてある新規接続をクリックします。
![](https://storage.googleapis.com/zenn-user-upload/dc9e1e8e1019-20231212.png)

次に接続の一番右側にある歯車マークを押してSSH構成の設定画面に飛びます。
![](https://storage.googleapis.com/zenn-user-upload/163945c1fd72-20231212.png)

この画面に、先ほどのターミナルで確認した情報を入力していきます。
- ホストには`Host`の後ろに書いてあるlimaの環境名を入力します。
- ユーザー名には`User`の後ろに書いてあるユーザー名を入力します。
- 認証タイプはキーペアを選択します。
- 秘密鍵ファイルには`IdentityFile`の後ろに書いてあるパスのうち、ファイル名がidで始まるものを入力します。
- パスフレーズは適当に入力します。（あとで使うので覚えといてください。）

全て入力し終わったら接続のテストを押して確認してください。
「正常に接続されました！」と出ればOKです。

右下のOKボタンを押してSSH構成のダイアログを閉じてください。

戻ってきた画面で`接続`の欄に先ほど作った接続設定が入っています（もし入っていなかったらプルダウンから選択してください）

`接続を確認して続行`を押してください。

![](https://storage.googleapis.com/zenn-user-upload/da2e2aa2824b-20231213.png)
こんな感じの警告が出るかもしれませんが一旦無視で大丈夫。

SSH接続が完了したら、IDEのバージョンとプロジェクトディレクトリを選ぶ画面が出てきます。
IDEのバージョンは適当で良いのですが、プロジェクトディレクトリは下の画像の矢印のところを押して選んでください。
これ適当にするとプロジェクトとして認識してくれないので注意してください。
![](https://storage.googleapis.com/zenn-user-upload/858b71a0ba9e-20231213.png)

`IDEを起動して接続`を押してください。

Jetbrains Gatewayが開きます。
先ほど入力したパスフレーズを入力してください。

以上で完了です。

それでは楽しい開発ライフをお送りください〜
![](https://storage.googleapis.com/zenn-user-upload/5062d592da5a-20231213.png)
NewRelicでCSPM (Cloud Security Posture Management)

## CSPMとは
CSPM(Cloud Security Posture Management/クラウドセキュリティ態勢管理)とは、イベントの可視化、監査・監視、脅威検知、ポリシー違反是正の自動化など、クラウド環境全体の構成のミスやセキュリティリスクの特定と修正を自動化する仕組みのことです。

## 代表的な監視観点
||発見的統制|予防的統制|
|---|---|---|
|監視内容|セキュリティイベントをいち早く検知|セキュリティポリシー違反を監査|
|主要なデータソース|Cloud Trail|AWS Config|

# AWSだけで実装する場合の問題点
AWSにもSecurityHubを使うことで発見的統制や予防的統制を管理することができますが、大量アラートが発生することも多いことが実情です。また、セキュリティイベントという性質上、かんたんに無視できず運用負荷になりがちです。

【問題点】
* アラートチューニングに適していない
ログ検索のプラットフォームとの連動に作り込みが必要で、日々のセキュリティイベントの件数の分析などが難しく、件数を減らすためのチューニングが困難です。
* 独自ルールの設定ができない
AWSのベストプラクティスに則ったルールが適用されますが、社内のルールなど独自ルールを導入しずらく、統制の観点で要求レベルを満たさない場合があります。
* アカウントを横断して管理しにくい
このような監査基盤はCCoEなど全社横断の組織が管理することが多く、マルチアカウントの管理が必要となります。

## NewRelicで実装した例
このCSPMをAWSの設定とNewRelicを使って実装してみました。
※一部マスキングしています。

* 発見的統制

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631758/042d22ad-af34-73a5-78d3-5352a97f66fd.png)


|No.|内容|
|---|---|
|1|セキュリティイベントの件数と内容を日次、週次、月次で表示|
|2|イベントのログを表示|

* 予防的統制

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631758/f94130af-c2ff-8fdf-2a1a-7174483ba79f.png)

|No.|内容|
|---|---|
|1|セキュリティルールの順守と違反の件数を表示|
|2|セキュリティルールの順守と違反の割合を表示|
|3|セキュリティルールの改善状況を統計的に表示|
|4|違反ルールの内容を表示|

## ダッシュボードの考え方
* 発見的制
  * 現状を把握する
    * 件数と内容をリアルタイムに把握する
  * 異変に気づく
    * 日次、月次、週次を集計して表示して変化を把握する
    * 前週との比較などで異変に気付く

* 予防的統制
  * ルールの順守状況を視覚的にわかりやすく
    * 準拠は緑、違反は赤
  * ルール準拠率を割合で示す
  * 推移を見せることで徐々に改善している状況を可視化
    * 改善のやる気アップへ

## 苦労したポイント
* AWS Organizationsの設定
  予防的統制ではAWS Configの設定はAWS Organizationsでガバナンスの設定を行いますが、その部分のIaC化やデプロイで苦労しました。
* EventBridgeの連携設定
  Configのルールの状態変化を検知するため、EventBrdgeを活用した仕組みを実装しましたが、イベントの特定などで骨が折れました。

## さいごに
[New Relic 使ってみた情報をシェアしよう！ by New Relic Advent Calendar 2023](https://qiita.com/advent-calendar/2023/newrelic)
に賛同してこの記事を書きました。
具体的な監査ルールに関する考え方などの詳細は改めて[Cloud Arch お役立ちコラム](https://www.ogis-ri.co.jp/feature/cloudarch/column.html)に近日掲載しますのでお楽しみに！

それでは皆さん良いクリスマスを！
docker container run でのエラー対処方法

### Docker　バインドマウント

スペースを含むパスを利用すると以下のようになった
~~~
docker container run -it -v C:/Users/｛スペースのある名前｝/Desktop/docker/my-dir:/app ubuntu:20.04
~~~

エラー
docker: invalid reference format.


修正
~~~
docker container run -it -v "C:/Users/｛スペースのある名前｝/Desktop/docker/my-dir:/app" ubuntu:20.04
~~~

もしくは、
~~~
docker container run -it -v "$(pwd)/my-dir:/app" ubuntu:20.04
~~~
消せないコード

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の5日目の記事です。

# 人力変更履歴

gitやsubversionがなかった時代、誰がいつどう直したかを人力で記録しなければいけませんでした。
ソースコードの修正があった場合は、元のコードは消さずに必ずコメントアウト。
**いつ誰が何のために**修正したかもコメントに記載する必要がありました。

```java
/**
 * FizzBuzz
 * @auther 株式会社キータ 木板太郎
 * @version 2003/12/5
 * @param end FizzBuzzを終える数。
 */
public static void useForLoop(int end) {
    for (int i=1; i<=end; i++) {
        if (i%3==0 && i%5==0) {
            /* 2003/12/6 仕様変更 No.123 株式会社キータ 木板太郎 ここから */
            //System.out.println("Fizz Buzz");
            System.out.println("Fizz Buzz　Yeah!!!");
            /* 2003/12/6 仕様変更 No.123 株式会社キータ 木板太郎 ここまで */
        } else if (i%3==0) {
            System.out.println("Fizz");
        } else if (i%5==0) {
            System.out.println("Buzz");
        } else {
            System.out.println(i);
        }
    }
}
```

そのため、仕様変更やバグの多いコードはコメントアウトの嵐になり、**1万行あるコードの9割がコメントアウト**という事態も珍しくはありませんでした。

可読性悪すぎるので、「不要なコメント消しましょう！」と勇気のある若手社員が進言したとしても、「会社のルールだから」と言われて一蹴されます。

なお、納品物としてのソースコードはこれらコメントは全て削除されます。

gitがある今でも、この文化を残してある会社は意外と多いかもしれません。
watsonx assistantを外部サーバーと連携してみる


watsonx assistantのCustom Extensionを用いて外部サーバーとの連携を行います。
(今回は自前でホストしたサーバーと連携する想定で進めていきます。)

以下、具体的な手順を見ていきます。
Integration -> Buil custom extensionをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641091/c81106ff-ccbd-87a4-059b-b996d1b17971.png)

Buil custom extensionをクリックすると、Custom Extensionのセットアップ方法について表示されるので、
Nextボタンを押して次ページへ移動します。

"Basic Information"ということで、extensionの名前を要求されるので、適当な名前を入れてNextをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641091/e4f18ffd-bbd3-ba27-d589-d37b1383b748.png)

"Import OpenAPI"というページが出てくるので、今回は以下のデータをImportします。(一部中身を変えています。)


```OpenAPI.yaml
#要約：
#POST /messages エンドポイントに、最大300文字のJSON形式のcontentを送信し、同様にJSON形式でcontentデータを受領する。
{
  "openapi": "3.0.0",
  "info": {
    "title": "Message Exchange API",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://mytest./api/v1"#自前のサーバーのURLに変更ください。
    }
  ],
  "paths": {
    "/messages": {
      "post": {
        "summary": "Send a message",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Message"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Message sent successfully",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Message"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Message": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "description": "Message content",
            "maxLength": 300
          }
        },
        "required": [
          "content"
        ]
      }
    }
  }
}
```

Importが完了すると、Review extensionのページが表示されるので、
問題なければ、Finishをクリックします。

Integrationのページに先ほど作成したExtensionが表示されるので、"Add+"をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641091/7b4d3c9c-c2f2-83c5-f9fe-da62dd59fe19.png)

諸々のチェックを要求されるので、チェックを完了させると、表示が「Open」に変わります。
これでExtensionの作成が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641091/0caaedca-6e11-0247-4511-81b2c71ec9ee.png)

後はActionで呼び出すだけです。
Action編集画面で、「And then」から「Use an extension」を選択します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641091/4ef8f099-0cf4-4a25-29a2-38b411865a89.png)

Use an extensionをクリックすると、Extensionのセットアップ画面が表示されるので、

①どのExtensionを使うか
②どのOperationを使うか
③どのParameterを使うか
を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641091/2fa5ec72-1134-582a-77ce-c5e791dcb0d5.png)

ここまで出来れば、外部サーバーとデータの連携ができるようになります。

なお、外部サーバーとの連携ができるようになることで以下が可能になります。
・社内のデータベースやシステムにアクセスし、必要な情報をリアルタイムで取得できる。
・在庫データにアクセスし、チャットボットを通じて在庫状況の確認や更新を行える。
・ユーザーからのフィードバックを収集し、サーバーに保存する。

以上。ありがとうございました。
自宅に10Gbpsのネットワークを引いたが環境構築に意外と苦労した件

ジョブカンアドベントカレンダー19日目の枠をいただきました。
ジョブカンでセキュリティ担当をしています「77a5b7」と申します。
業務とは全く無関係ですが、自宅のインターネットを10Gbps契約にしましたので、環境紹介させてください。

## TL;DR
- 10Gbpsの自宅インターネットを整えた。
- 10Gbpsの機器はちゃんと高価。
- 場当たり的に構築していくと、出費が思ったよりかさむ。
- ちゃんと設計しよう。

## はじめ
今年の4月にジョブカンメンバとして入社させていただきました。
その際に引越した関係で、自宅のネットワークを新規に契約する必要があり、各プロバイダを検討していたところ、賃貸まで10Gbpsを引き込めることがわかり、興味本位で契約しました。
当時は10Gbpsで利用されている要素技術をよく把握せずに、「おもしろそう」だけで契約したため後ほど、構成を考えるのにとても苦労しました。

## 最終構成(2023年12月現在)
![NetworkConfigurationChart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626424/f739748a-ba60-901f-e177-ae114cc8f404.png)
![NetworkConfigurationChart2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626424/f10e10dd-e8b6-a0a4-c944-1c83ac7ec02b.png)

## ネットワークスペック(2023年12月現在)

対インターネット(メインPC → インターネット / fast.comを利用)
| 日時 | 下り | 上り | ping |
| --- | --- | --- | --- |
| 12/12(火) | 2.1 Gbps | 760 mbps | 4 ms |
| 12/13(水) | 2.2 Gbps | 720 mbps | 4 ms |
| 12/14(木) | 2.1 Gbps | 1.0 Gbps | 4 ms |

対LAN内(サーバPC→メインPC / iperf3を利用)
| 日時 | 下り | 上り |
| --- | --- | --- |
| 12/12(火) | 4.96 Gbits/sec | 6.06 Gbits/sec |
| 12/13(水) | 4.82 Gbits/sec | 6.08 Gbits/sec |
| 12/14(木) | 4.44 Gbits/sec | 8.46 Gbits/sec |


## 契約した時点で構築したかった環境スペック

- メインで利用している5台のマシンが収容可能であること(下記、5台の内訳)
    - メインで開発等に利用している「メインPC」(10Gbps接続必須)
    - ファイルサーバと汎用サーバとして利用している「サーバPC」(10Gbps接続必須)
    - ゲームをメインで利用している「ゲームPC」
    - 出先で開発に利用する「macbook」(Wi-Fi)
    - セキュリティ検証目的で利用する「ノートPC」(Wi-Fi)
- 外出環境↔自宅環境間のVPN接続が可能であること
- 信頼済みの機器とそうでない機器でネットワークセグメントを分け、場合によってはセグメント間の通信を切断できること
- 10Gbpsの性能をできる限り活かすこと。

## 困ったこと/大変だったこと

### 10Gbpsの機器は超高価

ネットワークを構築するにあたり、以前の会社で運用経験のあったYamahaのRTXシリーズにて構築したいと考えておりました。

RTXシリーズで10Gbpsに対応した機器は当時「RTX1300」しかなかったため、こちらの導入を決定しました。(執筆時に確認したところ、現在は上位機種の「****RTX3510****」が発売されたようです。)

ただ、RTX1300は10Gbpsに対応したポートが2つしかなく、インターネット側の接続に1ポート利用するため、 RTXの単独運用だと配下の機器としては1機器しか10Gbpsに対応できません。

(ポートとしては4ポート10Gbpsに対応していますが、内2ポートが排他制御されるため利用可能は2ポートとなります)

そのため、別途スイッチングハブを購入する必要がありましたが、10Gbps機器は基本的に事業所向けのためどれも高価で選定に非常に困りました。

結果として、Allied-Telesisの「AT-X510-28GTX」を中古で購入し運用することとしました。
(運用時の空冷ファンの爆音でまた困ることになるのですが、、、)


### VPN構築が面倒

サーバPC内にてファイルサーバを運用しており、このファイルサーバを外出先から確認できるようにするため、VPNの構築を検討しました。

残念ながら固定IPの取得はプロバイダの関係上実施できなかったため、IPv6を利用したVPNを構築しようと考えておりましたが、現在利用しているdocomoのモバイル回線では、場所によってはまれにIPv6を付与されない場合があるらしいのです。

さらに残念なことに、外出先で主に利用するであろう何ヶ所かが当時v6付与されないエリアであったためv6での接続は断念することとしました。

結果的には自宅のネットワークがMAP-E※に対応していたため、利用できるポートを調査の上、v4のIPアドレスをにてVPN接続を待ち受ける形で接続できるようにしました。

※ MAP-E : 「IPv4 over IPv6」の接続方式の一つ。1つのグローバルIPv4アドレスを複数の契約者で共有する方式。利用できるポート番号に制限はあるものの、グローバルIPv4アドレスがルータに割り当てられるため、今回のような利用が可能。

## 感想
- 業務では絶対にやらない(できない)ような場当たり的なネットワーク構築をしました。
- 半年ほどでゆっくり作っていたので、若干の嘘が混じっているかもしれません。
- 機会があれば、もう少し詳細に書きたいです。

## 終わりに
DONUTSでは新卒中途問わず積極的に採用活動を行っています。
詳細はこちらをご確認ください。

https://www.donuts.ne.jp/recruit/
MCP9701で遊ぶ(表引き)


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

MCP9701で遊ぶ(表引き)


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



![o_cop852.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0bea9be1-be59-d334-8ce2-62bdb6a437d2.jpeg)




プログラム


```c++:S_SER_9701_O4_031_1



//S_SER_9701_O4_031_1

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


//定義
char ss[][3] = {
  "#9", "#9", "#9", "#8", "#7", "#7", "#6", "#5", "#5", "#4", "#3", "#3",
  "#2", "#1", "#1", "#0", "-9", "-9", "-8", "-7", "-7", "-6", "-5", "-5",
  "-4", "-3", "-3", "-2", "-2", "-1", "-1", " 0", " 1", " 1", " 2", " 2",
  " 3", " 4", " 4", " 5", " 6", " 6", " 7", " 8", " 8", " 9", "10", "10",
  "11", "12", "12", "13", "14", "14", "15", "16", "16", "17", "18", "18",
  "19", "20", "20", "21", "22", "22", "23", "24", "24", "25", "26", "26",
  "27", "28", "28", "29", "30", "30", "31", "32", "32", "33", "34", "34",
  "35", "36", "36", "37", "38", "38", "39", "40", "40", "41", "42", "42",
  "43", "44", "44", "45", "45", "46", "47", "47", "48", "49", "49", "50",
  "50", "#0", "#0", "#0", "#0", "#0", "#0", "#0", "#0", "#0", "#0", "#0",
  "#0", "#0", "#0", "#0", "#0", "#0", "#0", "#0"
};


//初期化
void setup()
{

  delay(3000); //not delete

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

} //setup


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

  //アナログ値の読み込み
  int s = analogRead(PB7);   // PIN1

  //s=250;

  //温度の表示
  Serial.println( ss[(s >> 2) & 0x7f] ); // 小数点以上

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

} //loop




```
windows パス(path)を通す

#Windows のあれこれ

皆さんこんにちは。今回はWindowsのちょっとしたいたずらや機能についてやっていきたいと思います。

まず初めに、プログラミングをしたーいって思ってパソコンを買ってc言語をコンパイルしようとすると...
![キャプチャ 2023_12_11 17_27_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635169/0e2b44b7-d9de-fa5c-3a0f-d236748c52c1.png)

このようなエラーが出たのではないでしょうか??
こちらのサイトに飛んでここからMin-GWをダウンロードしてください↓
https://github.com/niXman/mingw-builds-binaries/releases
![ホーム 2023_12_11 17_36_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635169/ece0598b-3ec9-0ed4-f295-b4ea92d10205.png)
そしたらこちらをクリックしてダウンロードします。
そしたらダウンロードしたファイルを解凍して解凍後のファイルをcドライブなどに移動させます。そうしたらMINGWの中にあるBINファイルのパスを覚えと来たりコピーしときます。![Releases · niXman_mingw-builds-binaries - Google Chrome 2023_12_11 17_46_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635169/c2e11b92-2de2-e852-70dc-83d031824273.png)
そしたら![「」を編集 - Qiita - Google Chrome 2023_12_11 17_48_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635169/57b9582c-b93d-2850-eb2d-581962691dcb.png)
環境変数と入力したら開きまして。![システムのプロパティ 2023_12_11 17_54_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635169/f6be9417-406a-0ecb-93be-224e6d678cee.png)環境変数を選択
![キャプチャ 2023_12_11 17_57_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635169/aa58d6c4-0bbd-9253-00be-d5e434e4a704.png)
Pathを選んで編集
![システムのプロパティ 2023_12_11 17_58_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635169/a7de3a7c-c78d-abd3-2724-b16e04cee4c8.png)
新規→さっきのパスを張り付けて→OKを押す
そうすると...![「」を編集 - Qiita - Google Chrome 2023_12_11 18_01_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635169/b4350f02-c2f3-049c-e80d-cd65ef4b82f4.png)
コンパイルが通りましたーー!!

#パスを通す例
環境変数をいじればパスを通せます。
例えばAndroidユーザーで内部ストレージが少ないからsdカードを内部ストレージとして扱いたいときやプリインストールされているアプリを消したいとかそういう時にADB(Andoroid Deveroper Bridge)というものを使うのですが、これを使うときもADBのpathを通さないと使えないんですよね、、

以上が　パスを通すということでした。
Meta社は新しい強化学習フレームワークをリリース

皆様、こんにちは、Furious Green合同会社の代表者、ソアレスと申します。
私たちFurious Greenは、先端のAI技術とデータ分析技術のトレーニングを提供し、エンジニアの皆様の成長とキャリア開発をサポートしています。このブログでは、そのような最新情報を定期的に共有し、皆様の知識と技術の向上に貢献することを目指しています。

本日はFacebookやInstagramの親会社であるMeta社が「Pearl（パール）」という新しいリインフォースメントラーニングAIエージェントライブラリを発表しました。このオープンソースライブラリは、限られたオブザーバビリティ（可観測性）、まばらなフィードバック、高い確率性を持つ環境でAIエージェントの開発を容易にすることに焦点を当てています。Pearlは、即時の反応よりも長期的な累積フィードバックを優先するように設計されています。そのモジュラー構造により、研究者や実務家が、推薦システム、オークション入札、クリエイティブ選択など、さまざまな用途に合わせてエージェントをカスタマイズすることが可能です。パールの特徴は、動的アクションスペース、オフライン学習、安全な意思決定などです。詳細なドキュメントと例は公式パールウェブサイトでご覧いただけます。

### 強化学習（Reinforcement Learning - RL）？
強化学習は、環境からのフィードバックを基にして最適な行動を学ぶAIの一種です。目的は、与えられた問題に対して最大の報酬を得る行動を見つけることです。この学習方法は、自動運転車、推薦システム、ロボット工学など、多岐にわたる分野で応用されています。リアルタイムでの意思決定が求められる状況や、複雑な問題を解決する場面で特に重要です。強化学習は、AI技術の発展において重要な役割を担っており、今後もその応用範囲は広がることが予想されます。

### Pearlと他のライブラリの比較: 特徴と機能
Pearlは、ReAgent、RLLib、SB3、Tianshou、Dopamineなどの他のライブラリと比較して、いくつかの重要な特徴で際立っています。エージェントのモジュラリティ、動的アクションスペース、安全な意思決定などのユニークな機能を提供します。また、オフラインRLやインテリジェントな探索をサポートしています。履歴の要約に優れ、他のライブラリでは広く提供されていないデータ拡張リプレイバッファーを含んでいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12194/c66f816f-7c45-9fd6-2084-38cd6ac8b5ad.png)

Furious Greenは、AIの世界で最新の情報を提供し、お客様に最高品質のサービスを提供することに注力しています。技術の進歩に合わせて最新のトレンドや知識を追求し、クライアントのニーズに応えるための包括的なサポートとトレーニングを行っています。Furious Greenは、エンジニアのスキルアップとキャリアの成長を支援し、AI分野での成功を目指しています。
MCP9701で遊ぶ(表引き)(チェック)


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


オンラインコンパイラーで動作確認




```c++

#include <iostream>
using namespace std;
int main(void){
    char ss[][3]={
    "#9","#9","#9","#8","#7","#7","#6","#5","#5","#4","#3","#3",
    "#2","#1","#1","#0","-9","-9","-8","-7","-7","-6","-5","-5",
    "-4","-3","-3","-2","-2","-1","-1"," 0"," 1"," 1"," 2"," 2",
    " 3"," 4"," 4"," 5"," 6"," 6"," 7"," 8"," 8"," 9","10","10",
    "11","12","12","13","14","14","15","16","16","17","18","18",
    "19","20","20","21","22","22","23","24","24","25","26","26",
    "27","28","28","29","30","30","31","32","32","33","34","34",
    "35","36","36","37","38","38","39","40","40","41","42","42",
    "43","44","44","45","45","46","47","47","48","49","49","50",
    "50","#0","#0","#0","#0","#0","#0","#0","#0","#0","#0","#0",
    "#0","#0","#0","#0","#0","#0","#0","#0"
    };
    printf("\nSTART\n");
    double v;
    double t;
    for(int s=0;s<(1024);s++){
        printf("\t");
        printf("[%d]\t",s);
        v = ((double)(s)) * ( ((double)(3300)) / ((double)(1024)) );
        printf("[%lf]\t",v);
        
        t = (v -  ((double)(400))  ) * ( ((double)(10)) / ((double)(195)) );
        printf("[%lf]\t",t);
        
        printf("[%s]\t",ss[(s>>2) & 0x7f]);
        
        printf("\n");
    }
    
}


```


```

...

	[243]	[783.105469]	[19.646434]	[19]	
	[244]	[786.328125]	[19.811699]	[20]	
	[245]	[789.550781]	[19.976963]	[20]	
	[246]	[792.773438]	[20.142228]	[20]	
	[247]	[795.996094]	[20.307492]	[20]	
	[248]	[799.218750]	[20.472756]	[20]	
	[249]	[802.441406]	[20.638021]	[20]	
	[250]	[805.664062]	[20.803285]	[20]	
	[251]	[808.886719]	[20.968550]	[20]	
	[252]	[812.109375]	[21.133814]	[21]	
	[253]	[815.332031]	[21.299079]	[21]	
	[254]	[818.554688]	[21.464343]	[21]	
	[255]	[821.777344]	[21.629607]	[21]	
	[256]	[825.000000]	[21.794872]	[22]	
	[257]	[828.222656]	[21.960136]	[22]	
	[258]	[831.445312]	[22.125401]	[22]	
	[259]	[834.667969]	[22.290665]	[22]	

...

```
SAC（SAP Analytics Cloud）の構成どうする？

## はじめに

SAC（SAP Analytics Cloud）を開発する上でどういった構成がよいのか迷っている方の参考になればと考え、こちらの記事を投稿します。

## 概要

 SACを導入する方で一番多いのは、SAPを導入済の方、または、導入する予定で、BIも付随して導入予定で検討している方が多いのではないでしょうか？
 そういった中で候補に挙がってくる構成が、下記になります。
 それぞれ、一長一短ございますが、どちらを選択すればよいかを検討していきましょう。
 ①S/4 HANA(CDS-VIEW)、SACの構成
 ※S/4 HANAの中で作成するCDS-VIEWと連携して、SACでレポート等を表示する構成。
 
 ②S/4 HANA、Datasphere、SACの構成
 ※S/4 HANAからデータをDatasphereに連携して、Datasphereを経由して、SACでレポート等を表示する構成。

 ③CSV、SACの構成
 ※S/4 HANAや別データベースからCSV形式でデータを連携して、SACでレポート等を表示する構成。

## １．S/4 HANA(CDS-VIEW)、SACの構成
①S/4 HANAの中で作成するCDS-VIEWと連携して、SACでレポート等を表示する構成。
S/4 HANAの中で作成するCDS-VIEWを使用するため、開発の知識が求められます。
また、SACのメリットであるノーコード・ローコートの部分を活用したい方は、ベンダーに発注することによる費用を抑えたいやユーザ自身が取得したいレポートを表示したいという要望があると思います。
そのため、CDS-VIEWを開発する知識をユーザ自身に持たせるのは難しいかと思いますので、ベンダーに発注して開発してもらう形になります。
ベンダーへの開発費用は他のものよりかかりますが、その分、他の構成よりリアルタイムのデータ参照が可能であったり、細かな要望・仕様に対して対応できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/942df0f6-2162-7884-c5c8-a1a15fe382de.png)

## ２．S/4 HANA、Datasphere、SACの構成
①S/4 HANAからデータをDatasphereに連携して、Datasphereを経由して、SACでレポート等を表示する構成。
Datasphereは、CDS-VIEWを使用する構成よりも開発の知識が少なくても開発が可能です。
また、SACのメリットであるノーコード・ローコートの部分を活用したい方は、ベンダーに発注することによる費用を抑えたいやユーザ自身が取得したいレポートを表示したいという要望があると思います。
そのため、DatasphereとSACの導入は、要望と適合しております。
Datasphere導入には、ライセンス費用がかかるものの、他の構成よりユーザ独自で開発することが可能です。
最初は、ユーザのみでは難しいこともあるかもしれませんので、ベンダーを導入しつつ、ベンダーからの知見を吸収しつつ、徐々にユーザ開発を進めていくのがよいかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/8a7b19c4-229a-3b23-dbf5-2f2a024c5d70.png)


## ３．CSV、SACの構成
①S/4 HANAや別データベースからCSV形式でデータを連携して、SACでレポート等を表示する構成。
CSVでの構成は、どんなデータベースからの連携でもSACにCSVを連携させればよいため、網羅できる範囲が広いです。
ですが、CSVの連携のため、連携のさせ方にもよりますが、リアルタイムにデータを参照することは難しいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/d49518b0-f509-e689-0907-e228093b0114.png)

## ４．メリット・デメリット：比較
それでは、構成のメリットとデメリットの比較を表形式でしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/4c219551-2fc2-c406-41c9-86501bca66fa.png)


## まとめ

メリット・デメリットを紹介しましたが、結果的には、どういった企業にあっているのかということですが、下記のようになります。
実際導入していくとなると複合させて、導入する構成も十分に考えられますが、各企業で最もあった構成で導入しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830694/0b10337a-ba97-9905-b3d4-afd344ecdc28.png)

S4/HANAを導入するだけも大きな転換期ですが、SACのBIレポートや予実管理、予測機能等を使って、より効果的な導入を図りたいと思うのが当然かと思います。
今回の記事を読んで少しでもお力添えできればと思います。
GCPでDuet AI使ってみた

# はじめに

これは[RetailAI Adventurers Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rai-adventurers)の14日目の投稿です。

https://qiita.com/advent-calendar/2023/rai-adventurers

昨日は@oga7091さんの記事「[Metamask Unity SDKを使ってWallet接続してみる](https://qiita.com/oga7091/items/4f9908d67279659a6315)」でした。

この記事では、少し前に耳にしていた、Duet AIを取り上げます。
Duet AIはGoogleCloudのドキュメントやサンプルコード、ベストプラクティスなどに基づいて特別にトレーニングされたAIコラボレータであり、開発においてGoogleCloudを活用する機会も多いため使ってみたいと思います。

# Duet AIとは？
自然言語のチャットインターフェースを介して、お馴染みのChatGPTと同じような感覚で質問に対しての回答を得ることができます。
Google Cloud ConsoleやIDE(Visual Studio Code,IntelliJなど)から利用可能なものです。

https://cloud.google.com/duet-ai?hl=ja

# Duet AIセットアップ方法
Google Cloud Consoleでのセットアップです。思ったより楽！
①Cloud AI Companion APIの有効化
②Duet AIのIAMロールを割り当て

https://cloud.google.com/duet-ai/docs/discover/set-up-duet-ai

# プロンプトしてみた
簡単に最近GoogleCloudで開発中に調べたことをDuet AIに聞いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024825/e4840f34-3343-66ee-c47c-5be58a11fccc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024825/fbaaf45a-1810-3abb-935a-863111744990.png)
開発中はドキュメント探しや読み込みに時間がかかった印象でしたが、AIを使えばすぐに回答してくれました。

# ChatGPTとの回答比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024825/350ac19a-bb62-ccef-7b06-757e49f12b19.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3024825/108f74ad-618f-2689-35d9-75cd8d7cc3f7.png)
ChatGPTでは2022 年 1 月までのデータで回答しているようです。
Duet AIと同じ質問ですが、少し内容の違う回答が得られました。
ChatGPT Plusを使えばまた違うかもしれませんが。

# まとめ
Duet AIはGoogleCloudに特化してトレーニングされているようなので、ChatGPTよりGCPに関する回答の精度は良く、欲しい回答をより少ない質問数で得られるかつドキュメントのリンクも提供されて使いやすい印象でした。
今後の開発にもAIは必須になりそうです。

明日は@takurUNさんの担当です。お楽しみに！

https://qiita.com/advent-calendar/2023/rai-adventurers

# 参考
https://www.reqtc.com/column/google-cloudduet-ai.html
資金力のないプロジェクトがクラウド転送量破産を避ける3つの案

# クラウドはデータ転送量が高い！

[STUDIOがデータ転送料金で苦慮](https://studio.design/ja/whats-new/20231212-info)されています。サイトをみると画像ドメインが`storage.googleapis.com`なのでおそらくGCPで展開されていると想像します。

大手クラウドはスケールしやすい反面、データ転送量に応じた課金があるので、本当にユーザーが急増すると無慈悲に資金を圧迫します。

あと無料サービスだと特に、**想像を絶する使い方をする人**がときどき現れます… データ転送料リスクには常に備えるべきです。

この **「帯域幅が広く、AWSやGCPより安い方法は何か」** について私が普段、検討する代替案を3つ紹介します。他にもいろいろ知見があると思うのでコメント等で教えてください。

## AWSとGCPのトラフィック料金

配信先の地域によって違い、また利用料が増えると単価も下がります。あとリクエスト料金もあります。ここでは単純化のため、日本を対象に1GiBあたり次の単価とします($1=145円で計算)。

- AWS $0.114/GiB 16.53円
- GCP $0.09/GiB 13.05円 

# 1. さくらのウェブアクセラレータ

https://www.sakura.ad.jp/services/cdn/

さくらインターネットのCDNです。1GiBあたり5円なので大手クラウドの1/3くらいです。為替リスクがないのも安心ですね。

私がSTDIOの中の人だったら、まず画像などの静的ファイルをこちらに逃すことを検討するかなと思いました。

数年前、まさに **「VPSを束ねてオレオレCDNを作る(そしてAWS料金を節約する)」** という試みをしたとき、他社と比べてさくらさんのネットワークが安定してました。それ以来、信頼してます。

# 2. Web Arena Indigo Pro

https://web.arena.ne.jp/indigopro/

VPSで10Gbps(共有)の帯域幅を提供しているのはこちらだけ？と思います。月額5,200円(税込)からプランがあり、月間転送量は6TBを目安に設定されているようです。**これはAWSで言えば約10万円相当の転送量**です。

弊社でも[Ranklet4](https://ranklet4.com/)というサービスで月間数億リクエストに対応していますが、このIndigo Proを使って定額化しています。これをもしAWSだと、うちもクラウド転送量破産してたかもです。

# 3. Vultr

https://www.vultr.com/

東京リージョンのある海外VPSです。例えばメモリ4GBのプランだと$40でBandwidth 4TBとあるので、1GiBあたりの転送料金は1.45円。大手クラウドの約1/10です。

何年か前に、[SPEEDTEST® CLI](https://www.speedtest.net/ja/apps/cli)でいろいろなVPSのネットワーク通信速度を測ったとき、このVultrがぶっちぎりで速かったです(今はどうか不明ですが)。

機能もとても豊富で、無料のKubernetesコントロールプレーンを提供してます。私がSTDIOの中の人なら、nginxのリバースプロキシでクラスタを組んで静的ファイルを逃すことも考えるかな、と思います。

日本にDCがあるという点では[Linode](https://www.linode.com/ja/)もよいかもしれません。

いかがでしょう。感覚的な評価も多いですが参考になれば幸いです。
Typstの空白について

## はじめに
Typstは、最近流行りの組版ソフトウェアです。この記事ではTypstで若干複雑な空白の扱いについて解説します。

この記事において、「空白」という単語はRustの`char::is_whitespace`が`true`になる文字、つまり[Unicode Character Database](https://www.unicode.org/reports/tr44/)における`White_Space`カテゴリに属する文字を指します。例えば半角スペース、全角スペース、**改行**は空白です。

:::note warn
この記事の内容はTypst 0.10.0のソースコードを基にしています。バージョンが異なると仕様が違う可能性があります。
:::

## Typstのコンパイル
まずコンパイルの全体像を見てみましょう。Typstのコンパイルには4つの段階があります([ソースコード](https://github.com/typst/typst/blob/main/crates/typst/src/lib.rs))。

1. **Parsing**: 入力ファイルからトークン列を作成し、構文木にパースする。構文木に型をつける。
1. **Evaluation**: マークアップを評価し、変数とコンテンツの組であるモジュールにする。
1. **Layouting**: モジュールのレイアウトを行い、ドキュメントを作る。ドキュメントは要素の位置が指定されたフレームから成る。
1. **Exporting**: フレームをpdfにする。

空白の取り扱いに大きく関係するのはParsingです。以下ではパーサの動作について解説します。

## パーサのモード
Typstのパーサには3つのモードがあります。

1. **Markup**: 文章とマークアップ
1. **Code**: プログラムのコード
1. **Math**: 数式

ファイルの先頭はMarkupモードから始まります。Markupモードで`#`が現れると、直後の1つの式(ブロックでもよい)がCodeモードで読み取られます。またMarkupモードで`$`が現れると、次の`$`までがMathモードで読み取られます。

また、Codeモードで`[]`で囲まれたコンテンツブロックを使うと、その中はMarkupモードになります`{}`で囲まれたブロックでは、その中はCodeモードのままです。

## Markupモードにおける空白
Markupモードでは、空白の列に改行がいくつ含まれるか[^1]が重要です。

- 改行を1つ以下だけ含む空白の列は、1つの半角スペースと等価です。
- 改行を2つ以上含む空白の列は、改段落`parbreak`になります。

この仕様により、行の先頭の空白は無視されます。

## Codeモードにおける空白
### 識別子の区切り
Codeモードでは、空白は識別子の区切りとしての意味しかありません。ただしCodeモードでの識別子における`-`の扱いとの兼ね合いで問題が起こることがあります。

Typstの識別子は基本的には[UAX31](http://www.unicode.org/reports/tr31/)で規定されているものです。つまりアルファベットや漢字、ひらがな、カタカナから成るような文字列は識別子になります。ただしCodeモードでは`_`で始まる文字列や`_`,`-`が2文字目以降にある文字列も識別子として許可されています。このため`-`の前後に空白があるかによって識別子のパースが変わります。
```typst
#let x = 6
#let x-1 = 42

#str(x-1)     // 42
#str(x - 1)   // 5
#str(x -1)    // 5
//#str(x- 1)  // これは`x-`という識別子がないのでエラー
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603264/6b7e035a-5033-7221-15cb-fd0a05e86daf.png)

引き算の意味で`-`を使うときは、両端にスペースを入れたほうがよいでしょう。

### `#`の後の空白
また、MarkupモードやMathモードから`#`でCodeモードに入った際、元のモードに戻るために空白を用いると、スペースが挿入されます。`;`を使えばスペースを挿入せずに元のモードに戻ることができます。
```typst
#let te = "te"

#te xt

#te;xt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603264/847941d1-99b0-22b2-c6a5-e826b74f974f.png)


## Mathモードにおける空白
### 識別子の区切り
MathモードでもCodeモードと同じく基本的に数式中の空白には識別子の区切りとしての意味しかありません。ただしMathモードでは識別子に`_`,`-`を含めることが認められておらず、`-`は常に引き算または負の符号の意味で用いられます。よって識別子についての問題はありません。
数式中で`_`,`-`を含む識別子を使いたいときは`#`を使ってCodeモードに移る必要があります。

### 数式がブロックになるか
ブロック数式とインライン数式の区別は空白で行われます。数式に入る`$`の後に空白があり、数式から出る`$`の前に空白がある数式はブロック数式になります。それ以外の数式はインラインになります。
```typst
$x^2+1$    // インライン

$ x^2+1$   // インライン

$x^2+1
$          // インライン

$ x^2+1 $  // ブロック

$ x^2+1
$          // ブロック

$
x^2+1
$          // ブロック
```
数式の前後に何があるかは関係ありません。

### `|`の前後の空白
`|`の前後の空白は特別に意味を持ちます。
```typst
$
x | y \
x|y
$
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603264/11ab9b8c-ecd9-442b-49e3-4db19d7c1e01.png)

## おわりに
空白の扱いは若干面倒ですが、見た目に直結します。規則を理解して正しく使えるようにしましょう。

[^1]: `\r`,`\n`,`\r\n`はどれも1個の改行として数えます。
BigQueryのユーザー定義関数をterraformで管理する

以下の記事のようなことをUser Defined Functions(UDF)に対して行ってみます。

https://qiita.com/shiozaki/items/71272a71c5a2b6bba93a

UDFを格納するディレクトリ構造は以下のようにします。

```plaintext
udfs
├── データセット名1
│   ├── UDF名1.sql
│   └── UDF名2.sql
├── データセット名2
│   └── UDF名3.sql
└── データセット名3
    └── UDF名4.sql
```

そして、それぞれのSQLファイルには以下のようなcreate function文を書いておきます。

```sql
create function `プロジェクトID.データセット名.UDF名`(引数1 型, 引数2 型) returns 型 as (
  -- UDFの本体をここに書く
);
```

create functionだけではなく、create procedureにも対応しているので、ストアドを管理することもできます。

そして、以下の気合に満ち溢れたterraformファイルをapplyすれば、SQLファイルの追加に連動してUDFが反映されます。
google_bigquery_routineは関数の引数を可変個argumentsブロックで渡す必要があるため、気合に満ち溢れた正規表現で該当箇所をパースしてリソース内に展開しています。

```terraform
locals {
  extract_udf_from_arg_and_def_regexp = <<-EOT
  (?i:CREATE)\s+(?P<routine_type>(?i:FUNCTION|PROCEDURE))\s+
  `?[-_\w]+`?\.`?(?P<dataset_name>[-_\w]+)`?\.`?(?P<function_name>[-_\w]+)`?\s*
  \((?P<arguments>[\w_,\s]+)\)\s+
  (?P<returns>(?i:RETURNS)\s+\w+\s+)?
  (?P<as_or_begin>(?i:AS\s+\(|BEGIN\s+))
  (?P<definition>(?s:.+))
  (?P<end>(?i:\)|END))
  ;?
  EOT

  format_regexp = join("", [for line in split("\n", local.extract_udf_from_arg_and_def_regexp) : chomp(line)])
}

resource "google_bigquery_routine" "udf" {
  for_each = fileset("${path.module}/udfs", "*/*.sql")

  dataset_id   = split("/", each.value)[0]
  routine_id   = trimsuffix(split("/", each.value)[1], ".sql")
  routine_type = upper(regex(local.format_regexp, file("${path.module}/udfs/${each.value}"))["routine_type"]) == "FUNCTION" ? "SCALAR_FUNCTION" : "PROCEDURE"
  language     = "SQL"
  dynamic "arguments" {
    for_each = [for argument in split(",", regex(local.format_regexp, file("${path.module}/udfs/${each.value}"))["arguments"]) : trimspace(argument)]
    content {
      name          = split(" ", arguments.value)[0]
      argument_kind = split(" ", arguments.value)[1] != "ANY" ? "FIXED_TYPE" : "ANY_TYPE"
      data_type     = split(" ", arguments.value)[1] != "ANY" ? jsonencode({ "typeKind" : upper(split(" ", arguments.value)[1]) }) : null
    }
  }
  definition_body = regex(local.format_regexp, file("${path.module}/udfs/${each.value}"))["definition"]

  lifecycle {
    # ディレクトリ構成に反する関数名がcreate文に書かれていた場合にエラーにする
    precondition {
      condition     = split("/", each.value)[0] == regex(local.format_regexp, file("${path.module}/udfs/${each.value}"))["dataset_name"] && trimsuffix(split("/", each.value)[1], ".sql") == regex(local.format_regexp, file("${path.module}/udfs/${each.value}"))["function_name"]
      error_message = "The dataset or function name does not match the file path."
    }
  }
}
```


参考: 

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/bigquery_routine
食べ放題の忘年会での経験

# はじめに
- 忘年会で食べ放題の店(韓国料理店)に行ったのですが、QRコードをスマホで読み取って誰からでも注文できるシステムだった
- この前担当するシステムのエラーを調べてたらこ、これは・・・となった
# 問題
- 食べ放題終わり際に7皿ほどのチーズキンパ（巻きずし？）が届いた
- 親-子-孫のテーブル構成で、親からも子からも孫テーブルに対して関連テーブル削除をしようとして下記エラーをはいてた
~~~
ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection
~~~
# 解決方法
- 複数からのアクションはやめて一つに絞ろうねっていう話
# おわりに
~~食べ放題でもう無理ってなったときはタバコを吸いに店外に行くのがいい~~
複数個所から同一のものにアクションをする際はいろいろ気を付けないとダメだねっていう話

# 参考
GCP OrganizationレベルでGoogle Cloud Storageの公開を禁止する

Google Cloud Storage(GCS)やAmazon S3などのクラウドストレージは便利ですが、簡単にデータをパプリック公開できるためにうっかり公開してしまうことによる事故のリスクもあります。

そのため、以下のようにGCSにはバケット単位でパブリックアクセスを禁止する設定もあります。
しかし、この設定はバケット単位でしか効果がないので、この設定をせずにバケットを作成してしまった場合には、リスクは依然として存在し続けます。

```terraform
resource "google_storage_bucket" "bucket" {
  name     = "バケット名"
  location = "リージョン"

  uniform_bucket_level_access = true
  public_access_prevention    = "enforced" # パブリックアクセス禁止
}
```

そのため、プロジェクトレベル・フォルダレベルOrganizationレベルでパブリックアクセスを禁止したいです。
Organization Policyを活用して禁止設定を入れてみます。

```terraform
data "google_organization" "org" {
  domain = "ドメイン"
}

resource "google_organization_policy" "storage_public_access_prevention" {
  org_id     = data.google_organization.org.org_id
  constraint = "storage.publicAccessPrevention"

  boolean_policy {
    enforced = true
  }
}
```

これによってOrganization内のすべてのプロジェクトに対して、GCSのパブリックアクセスが禁止に設定されます。

参考:

https://cloud.google.com/storage/docs/public-access-prevention?hl=ja
ToFセンサー for SPRESENSE を使ってみよう！

# 初めに

本当は、今日のカレンダーの内容は、WiSUNのネタを書こうと思ったんだけど、
間に合わなくって、今回は、すでに作ってたSpresense向けのToFについて書きます。


# 用意するもの

SpresenseはMainボードだけで良いです。

[**SPRESENSEメインボード[CXD5602PWBMAIN1]**
https://www.switch-science.com/catalog/3900/](https://www.switch-science.com/catalog/3900/)
<img src="https://d2air1d4eqhwg2.cloudfront.net/images/3900/500x500/42ccd153-3e89-4f7c-921c-775bc7de996d.jpg" width="200">


Spresense向けのToFセンサーは、MM-S50V。

[**ToFセンサーボード(SPRESENSE用)【MM-S50MV】**
https://www.marutsu.co.jp/pc/i/1558728/)
<img src="https://www.marutsu.co.jp/contents/shop/marutsu/img/goods/020/1558728/1558728_2.jpg" width="200">


なんと、値段が上がっていますね。

これだけです。

# ブログ（元ネタ）
この記事は、以下のブログに過去に投稿したもののまとめです。

[ToFセンサー for SPRESENSE を使ってみよう！
http://spresense.livedoor.blog/archives/34265597.html](http://spresense.livedoor.blog/archives/34265597.html)


# Arduino向けライブラリ

MM-S50Vは、データーシートも、昔は公開されていたのですが、
今は取得に、登録が必要になっています。
このライブラリは、その時の公開情報に基づいて作成しました。

https://github.com/Interested-In-Spresense/MM-S50MV

※かなりプリミティブなものですみません。

こちらは、Arduino ライブラリにも登録しているので、
ライブラリの検索すれば、ライブラリマネージャからinstallできます。

<img src="https://livedoor.blogimg.jp/spresense/imgs/a/b/ab367024.png" width="600">

# サンプルプログラム

この中の単純な距離測位のサンプルの紹介をします。
こちらは、距離を計測し、それに合わせてモジュールが持っているLEDの色を変えるものです。

examples/OneDMesure/OneDMesure.ino

※もともとサンハヤトさんが公開していたものです。

まずは、setupでの初期から、

```c
void setup()
{
  Serial.begin(115200);
  MMS50MV.begin();

  MMS50MV.skip(256);
  delay(500);
  MMS50MV.set(MMS50MV_CMD_MODE, MMS50MV_MODE_SYNC);  // sync mode.
  delay(500);
  MMS50MV.skip(256);
  MMS50MV.sync();                                    // sync.
  MMS50MV.set(MMS50MV_CMD_MODE, MMS50MV_MODE_NOMAL); // normal mode. 
  delay(500);

  MMS50MV.set(0x10, 0); // 256frames/s
  delay(500);
  MMS50MV.skip(256);
}
```

デバイスは、仕様上256バイトを捨てるようになっているので、一旦、256バイト破棄した後、
同期モードにし、同期モード中にsyncで同期をとります。
その後、計測のモード（MMS50MV_MODE_NOMAL）、フレームレートを設定します。
設定後、仕様上256バイトを捨てるようになっています。

```c
void loop()
{

  int32_t dis = MMS50MV.get();

  MMS50MV.led(ledr,ledg,ledb);
  printf("dis=%ld(mm)\n",dis);

```

後は、loopで、getを呼ぶと距離が取得できるので、それに合わせてLEDを光らせるだけです。
非常に簡単に使えます。


<img src="https://www.marutsu.co.jp/contents/shop/marutsu/img/goods/020/1558728/1558728_6.jpg" width="600">

※サンハヤト提供の写真です。

その他、8x4だけど、実質4x3ぐらいの面での距離も計測ができるので次回はそちらを書こうかな。
子要素の型定義はPropsWithChildrenが便利

PropsWithChildrenというものを知りました。
この記事では利用方法について伝えます！

## PropsWithChildrenどんな型？
コンポーネントの子要素で受け取る型を定義する方法です。

通常、子要素を受け取るコンポーネントを定義する際にはPropsの型を定義する必要があります。
例えば以下のように記述します。

```typescript
type Props = {
  children: ReactNode;
};

function Component({ children }: Props) {
  // ...
}
```


しかし、この方法では毎回childrenをPropsに書く必要があります。
`PropsWithChildren`を使用すると、以下のように記述できます。

```typescript
import { PropsWithChildren } from 'react';

function Component({ children }: PropsWithChildren) {
  // ...
}

```

## PropsWithChildrenと一緒に定義したPropsを利用する

propsがchildren以外にもある場合は任意で定義したPropsの型と一緒に利用することもできます。

```typescript
import { PropsWithChildren } from 'react';

type Props = {
  label: string;
};

function Component({ children, label }: PropsWithChildren<Props>) {
  // ...
}
```

## PropsWithChildrenの中身は？

PropsWithChildrenの定義は以下のようになっています:

```typescript
type PropsWithChildren<P = unknown> = P & { children?: ReactNode | undefined };
```

PropsWithChildrenはジェネリック型Pと子要素childrenを持つオブジェクトの交差型です。
子要素はReactNodeかundefinedであることが期待されます。

:::note info
交差型というのは`&`で結合されて利用する型のことを言います！
:::

## 【子要素の型定義はPropsWithChildrenが便利】まとめ
typeを利用して一つずつ定義するのも良いのですが、すでに定義されている`PropsWithChildren`のような型を利用することで簡潔に型安全なコンポーネントを作ることが可能です。

`Omit`なども併用すること自身で定義しなくても型の定義はできてしまうので積極的に利用していくのが良いと考えます！

`Omit`については別の記事で紹介したのでよければご覧ください。

https://qiita.com/tanimoto-hikari/items/9cfd4d390493e9e3f0dd
Rspecを実行するとin `<top (required)>': uninitialized constant  NameErrorが発生する

# はじめに

すぐに解決できなかったのでまとめます

# 問題

Rspecを実行すると以下のエラーが出ました

```
rspec

Bullet settings loaded.
=== Bullet settings loaded. ===
[ddtrace] Unable to patch Datadog::Tracing::Contrib::ActionMailer::Integration (Available?: true, Loaded? true, Compatible? false, Patchable? false)
/apps/spec/controllers/api/internal/v1/dmappings_controller_spec.rb:4:in `<top (required)>': uninitialized constant Api::Internal::V1::MappingsController (NameError)
	from /usr/local/bundle/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load'
	from /usr/local/bundle/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `block in load_spec_files'
	from /usr/local/bundle/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `map'
	from /usr/local/bundle/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load_spec_files'
	from /usr/local/bundle/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:22:in `run'
	from /usr/local/bundle/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:69:in `run'
	from /usr/local/bundle/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:8:in `block in autorun'
```

# 解決方法

コントローラーのファイル名が間違っていました

```
mappings.rb
↓
mappings_controller.rb
```

controllerをつけるのを忘れていました

# おわりに

ファイル名間違えは地味に気づきにくいので最初にこころがけたほうがいいですね
単一化変数の話をしよう

https://twitter.com/nazonodesigner/status/1734573831258357924/photo/1

型推論、型再構築は静的型付け言語の記述を簡潔にしてくれる素晴らしい機能です。
型推論をするには単一化 (Unification) の概念を理解する必要があります。
この単一化を最初から型推論の文脈で理解しようとすると、なんだかややこしい話になるのは型推論の仕組みに苦しんでインターネット上の資料を探し回った経験がある方ならご存知でしょう。

操作的意味論や型理論で用いられる型付け規則でも単一化を使った図式が使われていますが、関数型言語やRustを使ってもパターンマッチはあるけど単一化は言語機能としてないので理解に苦しむことになります。

正規表現を理解するには、JavaScriptの正規表現リテラルを使って覚えるとネイティブ感が身につきます。
オブジェクト指向を理解するには、Java、RubyやPythonなどをつかうといいでしょう。
単一化が機能としてある言語処理系を使えば、単一化に付いてのネイティブ感がつくはずです。

単一化変数がある処理系を探すとあります。Prologです。
また、Prologか。Prologなんて、AIといえば機械学習の時代に古い。終わっている。と考える気持ちもわかります。
:-みたいな演算子使うのおかしいでしょ？関数がネストできない言語なんて、、、。
変数が大文字とか今どきの言語とは逆で古臭い。
様々なネガティブな気持ちが湧いてくるのはわかりますが、ちょっと待ってください。

今回は型推論で使われる単一化のネイティブ感を身につけるためにPrologの単一化変数を使うだけです。他の要素は扱いません。

## インストール

Linux,WindowsのWSLで

```
apt install swi-prolog
```

Macなら

```
brew install swi-prolog
```

などコマンド１つでインストールできます。

## SWI-Prologの使い方

```
% swipl
Welcome to SWI-Prolog (threaded, 64 bits, version 9.0.4)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.

For online help and background, visit https://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).

?- 
```

swipl コマンドでインタプリタが起動します。

## 終了の仕方

```
?- halt.
```

halt. と入力するとhalt/0 述語が動いて終了できます。

ああうざいと ctrl+c を押すと

```
?- ^C
Action (h for help) ? 
```

と表示されるので `e` を押すと終了できます。

## 単一化変数を使ってみる

では単一化変数を使ってみましょう。

```
?- A=1.
A = 1.
```

```
?- A=1,B=A.
A = B, B = 1.
```

```
?- A=[1,2],B=A.
A = B, B = [1, 2].
```

```
?- A=[1,2],B=A.
A = B, B = [1, 2].
```

ここまでは単なる代入できる変数と同じように思えます。

```
?- A=1,A=2.
false.
```

単一化変数は内容を入れ替えることができません。mutableなのかな？

パターンマッチもできます。

```
?- A=[1,2],[B,_]=A.
A = [1, 2],
B = 1.
```

```
?- A=[1,_],A=[_,2].
A = [1, 2].
```

mutableではないな。バインドされてない穴にうめることはできる。

ここからが単一化変数の凄いところです。

```
?- A=[1,2],A=[B,_].
A = [1, 2],
B = 1.
```

パターンマッチは１方向に対して飲みデータが移動しますが、単一化は双方向にデータが移動します。
左から右にデータが流れている点がパターンマッチより凄いところです。
型推論でも同じことが起きるわけですが、一般的に単一化変数はパターンマッチより凄いことがおきます。

```
?- [[1,2,3],[A]]=[B,[2]].
A = 2,
B = [1,2,3].
```

より双方向性がわかる例ですね。構造化されたデータも単一化でまとめられます。


```
?- A=B,B=1,C=D,D=A,B=C.
A = B, B = C, C = D, D = 1.
```

```
?- A=B,B=1,C=D,D=A,B=C,writeln(A).
1
A = B, B = C, C = D, D = 1.
```

Aは1になります。

## まとめ

型推論で使われる単一化は難しく感じる概念です。
難しい概念は使ってみることでネイティブ感を身につけられます。
単一化変数をもつPrologを使えば単一化変数のネイティブ感を知識ではなく教養として身につけることができます。
単一化変数のネイティブ感を身につけると単一化は難しいことではなくなります。
【全人類必須】生産性爆上げブラウザ 「SideKick」を知らない人は人生1からやり直しましょう。

# はじめに
みなさんSidekickというブラウザをご存知ですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/7ed93f27-d762-a8e8-c604-c097fe1898ec.png)


Sidekickとは、GoogleChromeで使われているChromiumというものをベースに開発されたもので、仕事の生産性向上に特化したウェブブラウザです。

基本的な設計はGoogleChromeと全く同じで、Chromeの拡張機能も使えます。

[※ まだ入れていない人はただちにこちらからダウンロードしましょう](https://join.meetsidekick.com/niwio)

# Sidekickの魅力
#### 1. とにかく速い
AIが使っていないタブを自動的に認識してメモリの消費を抑えてくれたり、Ad blockerが標準で搭載されているため不必要な広告を目にすることなく生産性を高く保って仕事することができます。

#### 2. ブラウザ内に画面分割機能がついている
Sidekickでは、最大3つのタブを同時に表示することができます。

ブラウザを2つ開けばよい話ですが、ウェブブラウザ内で分割することで、ウェブブラウザを2つ開く手間やメモリの使用量を削減することができます。

画面のサイズも自由自在に変えられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/7517fbe1-7610-9c97-c15e-ab1217100262.png)

使い方は、こちらのアイコンをクリックするか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/71473bc6-9826-4ddb-0d26-36df70563429.png)

ショートカットキーでmacならopt+b、windowsならalt+bで使うことができます！

#### 3. ブラウザ内にサイドバー機能がついている
よく使うアプリケーションをサイドバーに設置でき、左側に常に表示させることができます。

開きたくなった時に高速でアクセス！
集中したい時はこちらのサイドバーを隠すこともできます！

1回数秒の操作ですが、塵も積もれば山となるというように、積み重ねると大きな時間を生み出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/1f558edd-a2e8-b205-7852-1d934d15417f.png)

#### 4. 前に見ていたタブへ戻るためのショートカットキーがついている

Macでは「opt+z」で、windowsでは「alt+z」で前に見ていたタブに移動することができます。

さっきどのタブを見ていたっけ・・・？ってなることよくありませんか？

このブラウザを使ってから私はそんなことなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/e9774e66-5c3e-a0c4-3a55-3e595010bfed.png)


そのほかにもたくさんのメリットがあります！詳しくは公式サイトをご確認ください！↓

https://join.meetsidekick.com/niwio



# 最後に
Microsoft EdgeやGoogle Chrome等の長く使われているブラウザがある中で、急遽現れたSidekickは人気を博しています。

2020年11月にローンチされた新しいブラウザにも関わらず、MicrosoftやUber、SlackやMeta等の大手のIT企業にも採用されているそうです。


無料でダウンロードでき、フリープランでも申し分ないくらい生産性が爆上がりするので、試してみてはいかがでしょうか？

▼ こちらからダウンロードできます。

https://join.meetsidekick.com/niwio
曜日の列から曜日フラグを作成する(SPSS Modeler データ加工逆引き1-15)

# 曜日の列から曜日フラグを作成する

![スクリーンショット 2023-12-11 17.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a47d6498-ae4e-1443-f086-ae19525e2ff7.png)

日付から曜日の列を作成する場合には逆引き1-3を参照ください。

## 1.想定される利用目的

・曜日の持つ目的変数への重みの算出
・回帰モデルによる時系列予測作成のための説明変数作成
　→統計モデルのダミー変数として利用する場合には注意事項参照

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/weekday_flg.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-12-11 17.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/aac6475c-f199-f615-c765-3e072bddd712.png)

a.対象データは以下の通りです。

![スクリーンショット 2023-12-11 17.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/24b48e90-536c-29ff-e23b-fe07f7ae3ea1.png)

日付から曜日を算出するaまでのプロセスは逆引き1-3を参照ください。

https://qiita.com/416nishimaki/items/1c9f1e1ebe7f14f6f79f

b.[データ型]ノードを編集します。[値の読み込み]ボタンを押して後続処理で利用する曜日のメンバーを認識させます。
![スクリーンショット 2023-12-11 17.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b9468563-9723-abd6-7aaf-3507c7ab6295.png)

c.[フラグ作成]ノードを編集します。[セット型フィールド：]を　[曜日]にして[利用可能なセット値]から　黄色矢印で右の変数ボックスに移動します。[集計キー]はブランクのままにします。
![スクリーンショット 2023-12-11 17.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0ec3cd7c-9c15-7cfe-98e3-33df91d03272.png)

[テーブル]を表示します。

![スクリーンショット 2023-12-11 17.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8f214cae-6c13-bc7c-08b8-4c5e717f7285.png)

#### 注意事項

曜日フラグの７つをそのまま回帰モデルに投入すると多重共線性の影響を受けるため、どれかひとつの曜日フラグを外して６つのフィールドを入力変数にします。

## 4.参考情報

#### 祝日マスタを日付で割り当て休日フラグを作成する

https://qiita.com/416nishimaki/items/19f91717c2df52211f81

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
BigQueryのテーブルっぽいものを種類を問わずにDROPできるストアド

BigQueryでテーブルを削除するためには `DROP TABLE` 文を使います。
一方で、VIEWなどのテーブルっぽい振る舞いをするもののテーブルではないものは `DROP TABLE` では削除できません。

![スクリーンショット_2023-12-13_8_59_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/ecca10db-7aeb-8b7f-f151-93101e376d1d.png)

VIEWを削除するためには、 `DROP VIEW` という別のDDL文を実行する必要があります。

削除する対象によってDDLを変更するのは面倒なので、テーブルっぽいものであれば同じ記法で消せるストアドを作成してみました。

```sql
create procedure `プロジェクトID.データセットID.drop_any`(project_id string, dataset_name string, table_name string)
begin
  declare table_type_query string default format("select table_type from %s.%s.INFORMATION_SCHEMA.TABLES where table_name = '%s';", project_id, dataset_name, table_name);
  declare table_type string default '';
  declare drop_type string default '';
  declare drop_statement string default '';

  execute immediate table_type_query into table_type;

  if table_type is null then
    raise using message = "tablish object not found.";
  end if;

  case table_type
  when "BASE TABLE" then
    set drop_type = "table";
  when "SNAPSHOT" then
    set drop_type = "snapshot table";
  when "VIEW" then
    set drop_type = "view";
  when "MATERIALIZED VIEW" then
    set drop_type = "materialized view";
  when "EXTERNAL" then
    set drop_type = "external table";
  when "CLONE" then
    raise using message = "table clone is not supported yet.";
  else
    raise using message = format("unknown table type: %s.", table_type);
  end case;

  set drop_statement = format("drop %s `%s.%s.%s`;", drop_type, project_id, dataset_name, table_name);
  execute immediate drop_statement;
end;
```
デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第2回) "バッチ検査ってそういうこと！？"

# デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第2回)
## バッチ検査ってそういうこと！？

こんにちは！京セラコミュニケーションシステムの大山です。
[前回に引き続き](https://qiita.com/kccs_susumu-oyama/items/7d758f524b0bbfb1b3e0)デモ機製作の連載2回目となります。
バッチ検査で調べてもロット生産の説明しか出てこないモヤモヤ感。筐体のポンチ絵を見せて説明をした時のコレジャナイ感。
そして理想に近づこうとすると見えてくるオカモチ感。
2023年7月から製作をした外観検査AIパッケージのデモ機の製作風景をいろいろな感情を抱えつつおとどけします。
ということで理解と失敗の第2回スタートです。

## 連載記事一覧
[デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第1回)](https://qiita.com/kccs_susumu-oyama/items/7d758f524b0bbfb1b3e0)

**デモ機製作の舞台裏を覗く - ラズパイとNode-REDでポータブルなデモ機を作る(第2回)**
**"バッチ検査ってそういうこと！？"　★本記事★**

## この記事の対象者
Node-REDでRaspberryPiのGPIOを制御したい方
Node-REDのダッシュボードを使ってみたい方
RaspberryPiでリレー制御してみたい方
フィッシャーテクニックを動かしてみたい方

## 前回作成した筐体のイメージを見せて・・
前回作成したポンチ絵をAIチームに見せてご意見いただいたところ、
対象ワーク1個に対していろいろな角度から見る装置ではなく、複数個のワークを一度に見て画像を推論したいとのことでした。
そもそもバッチ検査の事を製造業系の用語と思っていたのが間違いの始まりで、生産ライン外での撮像機による検査ということで、品質検査の時などに抜き取り検査をするオフライン検査のようなものと思っておりました。
ですが、改めて話を伺うと複数の検査対象を一度に撮像し、同時に推論して複数の画像データをまとめて処理する検査で、AIや機械学習に関連する用語のバッチ推論のことでした。
最初の打合せの時に話が何かかみ合ってないような感じがしていたのですがやっと理解できました。

ということで改めて今回バッチ検査で求められる要素は以下の通りです。
　・撮像の際、周囲の環境の影響を受けないこと
　・持ち運べる大きさ・重さ
　・ペットボトルキャップ20～25個位を一度に撮像できる

## カメラの画角が・・・
一度の撮像で20～25個位見れればとのことだったので購入したカメラ「ELP―USB500W05G-SFV(5-50)」の画角がどれくらいか調べてみました。

![Q-0101_カメラ画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/cef51070-fb7d-171f-7e8f-9fbf0fe3127d.jpeg)

仕様が見つからなかったためカメラの表示範囲で確認したところ、
カメラから200㎜くらいの距離で縦85㎜横155㎜くらいの範囲が撮影できたため大体横42度、縦23度位の画角がある事が分かりました。
そこで30mmのキャップ25個以上を撮影するにはどれくらいの高さが必要か検討したところ

![Q-0101_カメラ撮影範囲.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/523a3fb1-cf41-11aa-9856-79eb006dd7e2.png)

大体305㎜の高さが必要そうということが分かりました。
そしてワークからの高さ＋カメラ長さ＋フレーム厚みを足してできた筐体がこちら！

![Q-0101_オカモチ筐体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/750ac07f-f8a5-4985-9910-41293b8e1887.png)

でかい！・・・元々の検討していた筐体も小さいとは言い難いですが、
今回430㎜とラーメン4杯位収納できるオカモチサイズまで大きくなってしまいました・・・
さすがにここまで背が高いと持ち運びには不向きなのでなんとかせねば・・・
ということで今回はここまで、大きくなった筐体サイズをどこまでコンパクトにできるのか！
次回「救世主あらわる・・だが？」お楽しみに。
駆け出しエンジニアが読んだ「世界一流エンジニアの思考法」

# はじめに
私はエンジニア歴5ヶ月です。
先日、購入して読んでみた「世界一流エンジニアの思考法」を駆け出し目線から感じたことをアウトプットしてみようと思います！

# この本を読もうと思った理由
　2つあります。1つ目は先輩の紹介です。他の先輩方も読んでいて
 「本当に参考になった。」、「新卒段階から読んでいたら、もっと成長できた。」という声が多かったため、どんな本なんだろうと興味が湧きました。

2つ目は、ネットの記事を読んで衝撃を受けたからです。先輩の紹介もあり、興味本位でその本について調べていた所、その記事のタイトルの中に
>「試行錯誤は悪である。」

と書かれていました。（具体的な記事は忘れてしまいました。申し訳ありません。）

当然、私の頭の中は「？？？？？」です。

アメリカで働くエンジニアは試行錯誤する必要がないレベルのつよつよなの？と思いましたが、著者は、自分の事を「三流」と述べています。

もっと中身を深く知ることで、自分の仕事の参考になるのではないかと感じた私は購入し、読んでみることにしました。

結論、駆け出しの私にも参考になる事が沢山書かれており、読んで本当によかったと思っております。

今後に生かすためにも印象に残った部分を、自分の過去の行動と照らし合わせながらまとめてみたいと思います！

# 事実をもとに仮説を立ててから作業することで作業効率が上がる。

「試行錯誤は悪である」という項目が一番気になったので、真っ先に読んでみました。

著者は、事実をもとに、目的を達成するにはどのような手順を踏む必要があるのか、ということを順序立てて考えてから、手を動かすことが生産性や作業効率の向上に繋がると述べていました。

私の悪い癖で、何かエラーや課題に遭遇した際には、闇雲にどの部分が原因なのかを片っ端から試行錯誤してしまいます。

結果、先輩へ質問しに行った際に、エラーを解決する目的（どのような状態に持っていきたいのか？）を認識できていなかったり、
目的に向けてどの手順を踏むべきかを逆算して考えることができていなかった事も多々あります。
この項目は、自分の作業が非効率だということを改めて深く認識する機会にもなりました。

これから意識していきたいこととして

**１、目的をしっかり認識すること**

大前提として、課題やエラーを、どのような状態に持っていきたいのか（ゴール）を認識しないと、逆算して必要な情報を集めたり、解決策を考えたりすることができません。

しかし、私自身、闇雲に調べていくうちに、何の目的を達成するために調べているのかが抜け落ちてしまい、調べることが目的になってしまっている事があるため、まずは目的をしっかり認識する事の大切さを理解することができました。

**２、事実（ファクト）を集める**

これは先輩にも口酸っぱく言われて来ており、改めて大切さを再確認できました。

例えば、Webアプリケーションの外部APIの実装の時、処理がどこまで通っていて、どこで止まっているのかを確認できているのか、解決したい目的に対して、現状どのような情報が足りないのかを認識できているのか。
仮説を立てるために、事実をきちんと集める事の重要さをこの本を読んで振り返るきっかけになりました。


# 理解に時間をかける

「理解」の定義として、著者は

>- 人に説明できること
>- いつでも即座に使えること
>- その知見をもとに応用できること

と述べています。

振り返ってみると、周りの先輩エンジニアや技術力の高いエンジニアの方々は、私の質問に対して、私が理解できるレベルまでしっかり噛み砕いて説明してくださいます。

一方、私が人に技術や実装の理由（なぜその方法で実装したのか）について説明しようとする際、相手に伝わるような説明ができず、理解不足を露呈する場面が多いなと振り返ります。


実際、業務内だと、タスクの期限があるため、タスクが進まないと焦ってしまい、ググったサイトの情報やChatgptのヒントをコピペし、技術や知識の理解に手が回らない時も多々あります。

そんな時こそ、ドキュメントをしっかり読みこむ、時間が許す限り、分からない部分をきちんと理解できるまで調べることが、最終的に自分の身になり、業務の生産性向上に繋がるのかなと思いました。

とにかく、1つでも多くの知識、技術を「理解する」ことを重視して作業していきたいです。

# 感想

他にも「Be lazy」のマインドセットや、情報量を減らすコミュニケーションなど、この本から学びになった事はいくつもありましたが、特に自分がこれから大切にしていきたい要素として2つピックアップさせていただきました。「偉大な習慣を身につけたエンジニア」になれるよう少しでも日々の行動に学んだことを取り入れていきたいと思いました！！