OmniAICreator/Qiita-1.07M huggingface dataset:
第2回　StreamlitとLangChainとLM studioを使って自分専用LLMウェブアプリを作りたい！

# 第2回！　簡単な実装編

# 初めの一歩

ここではLM StudioでローカルLLMサーバーを立て、そこにアクセスすることで動く簡単なChatBotを作成しました。

プログラムの内容はほぼ以下のURLと同じです。
https://blog.streamlit.io/langchain-tutorial-1-build-an-llm-powered-app-in-18-lines-of-code/

変わった点はOpenAI APIを使用せず、ローカルLLMに繋いだ点のみです。

プログラムはGitHubにもあげました。
https://github.com/s1932072/LangChain-tutorial-1-Build-an-LLM-powered-app-in-18-lines-of-code

```Python:main.py
import streamlit as st
from langchain.llms import OpenAI

st.title('🦜🔗 Quickstart App')



def generate_response(input_text):
    # ローカルのLLMエンドポイントに接続するための設定
    llm = OpenAI(base_url="http://localhost:1234/v1", api_key="not-needed", temperature=0.7)
    st.info(llm(input_text))

with st.form('my_form'):
    text = st.text_area('Enter text:', '日本の首都はどこですか?')
    submitted = st.form_submit_button('Submit')
    # OpenAI APIキーのバリデーションをコメントアウト
    # if not openai_api_key.startswith('sk-'):
    #     st.warning('Please enter your OpenAI API key!', icon='⚠')
    if submitted:
        generate_response(text)
```

# 実際の画面![スクリーンショット 2023-12-31 17.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631067/47bfe13b-3e9f-95f7-d9f3-665dd18700f0.png)

このような形でテキストを書き込んでsubmitを押せば実行できます。

これでLLMとwebブラウザで会話できるようになりました。

# 次回の予定
この調子でstreamlitの記事をLocal LLMで実施できるようにしていきます。
反響があればLM Studio の話や使用しているLLMmodelの話をしようと思います。
CarrierWaveでアップロードした画像を絶対パスで返す設定

CarrierWaveで画像アップロード機能を実装していたのですが、
レポジトリをバックエンドとフロントエンドで分離していて、バックエンド側に仮で画像を保存したかった際、
バックエンドから返ってくるpathがデフォルトだと相対パスで少しつまづいたので
相対パスの絶対パスにする方法を残しておきます。

# image_uploader.rbの設定
デフォルトだと以下のようになっているかと思います。
これだけだと相対パスが返されます。
```ruby:image_uploader
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
```
絶対パスにするには、image_uploaderにhostのpathの設定を追加します。
```ruby:image_uploader
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  //追加
  def asset_host
    return "http://localhost:3001"(バックエンド側で割り当てているhost url)
  end
```

以上、CarrierWaveで相対パスを絶対パスで返す方法でした。

# 参考
https://stackoverflow.com/questions/27897832/carrierwave-full-url-for-default-image
Pleasanter Tips: 他者へのデータ公開をコントロールする

# はじめに
Pleasanterのサポートをしている中で多い質問が、他者への自分のデータの公開をコントロールする方法です。 
以前アクセス権限による方法を記事で掲載しましたが、今回はもう少し簡単に公開設定するする方法の記事になります。 

# サンプル画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/50b281cb-0d46-73ef-a40b-070cb837b7e9.png)
基本的に入力したデータは他者には公開しません。 
公開するにチェックを入れると公開されます。

# 設定
追加した項目
|項目|名称|
|:--|:--|
|CheckA|公開する|

# サーバスクリプト
次のコードを「ビューの処理時」で設定します。
```
var data = {
  "Owner": `["${context.UserId}"]`,
  "CheckA": true
}
view.Filters.or_filter01 = JSON.stringify(data); 
```
Orフィルターを使用して、自分のデータとCheckAがTrue（公開する）を表示するようにしています。

# 最後に
Pleasanterでは、レコードのアクセス権など設定することができます。このアクセス権はユーザーやグループ、組織に対する設定でデータの内容によりアクセスを制限する方法になります。 
今回以外の方法として、OnSelectingWhere（拡張SQL）で設定する方法があります。 
状況に応じてお使いください。
Specification for CANXL driver, AUTOSAR 1014, R23-11 CP

Specification for CANXL driver 
https://www.autosar.org/fileadmin/standards/R23-11/CP/AUTOSAR_CP_SWS_CANXLDriver.pdf

R22-11
Specification for CANXL driver functionality to provide additional required interfaces
https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_SWS_CANXLDriver.pdf

# Release Overviews

3つの分類があります。Foundation, CAN, OSEK/VDXのClassic Platform, Ethernet/TCP/IP, POSIXのAdaptive Platform.

Foundation Release Overview, AUTOSAR 781, R23-11, FO
https://qiita.com/kaizen_nagoya/items/f249bdb8c313d8bff883

Classic Platform Release Overview, AUTOSAR 0, R23-11, CP
https://qiita.com/kaizen_nagoya/items/8468435185e109189ead

Adaptive Platform Release Overview, AUTOSAR 782, R23-11, AP
https://qiita.com/kaizen_nagoya/items/13a104606a34fe24fcf7

# Qiita 記事一覧

Autosar Foundation R23-11 一覧
https://qiita.com/kaizen_nagoya/items/c30674cb2dac2fcbbd04

AUTOSAR Adaptive Platform R23-11一覧
https://qiita.com/kaizen_nagoya/items/1dece8799a730367b0dc

Autosar Classic Platform R23-11 一覧
https://qiita.com/kaizen_nagoya/items/f770f6c2906e1dcbf180

## 用語(term)

|Abbreviation / Acronym|Description|
|:--|:--|
|XLFF|XL Frame Format
|SDU type|service data unit type
|retransmit counter|Feature of some CAN XL controllers that allows to send a CAN frame multiple times in a row in case the ACK slot is not set on the bus. The counter gives the maximum number of transmissions.

## 参考(Reference)

[1] CiA 610-1 version 1.0.0 (DSP) - CAN XL specifications and test plans - Part 1: Data link layer and physical coding sub-layer requirements http://www.can-cia.org
[2] CiA 611-1 version 1.0.0 (DSP) - CAN XL higher layer functions - Part 1:Definition of service data unit types
http://www.can-cia.org
[3] Glossary AUTOSAR_FO_TR_Glossary
https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_TR_Glossary.pdf
[4] General Specification of Basic Software Modules AUTOSAR_CP_SWS_BSWGeneral
[5] Specification of CAN Driver AUTOSAR_CP_SWS_CANDriver
[6] Specification of CAN XL Transceiver Driver AUTOSAR_CP_SWS_CANXLTransceiverDriver
[7] Specification of CAN Interface AUTOSAR_CP_SWS_CANInterface
[8] Specification of Ethernet Interface AUTOSAR_CP_SWS_EthernetInterface
[9] General Requirements on Basic Software Modules AUTOSAR_CP_SRS_BSWGeneral
[10] Requirements on CAN AUTOSAR_CP_SRS_CAN
[11] ISO 11898-1:2015 – Road vehicles – Controller area network (CAN)
[12] Specification of Ethernet Driver AUTOSAR_CP_SWS_EthernetDriver


## 補足資料（Additions）

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.


# 文書履歴(document history)
ver. 0.01 初稿 　20231231
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
配列の操作（Java Silver勉強）

# 最初に
この記事は、以下の書籍を通じてJava silverの合格に向けて自分が学んだ内容を体系的にアウトプットする記事である。（目指せ年内合格！）
[徹底攻略Java SE 11 Silver問題集[1Z0-815]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625/ref=asc_df_4295007625/?tag=jpgo-22&linkCode=df0&hvadid=342700130622&hvpos=&hvnetw=g&hvrand=9715255718806805548&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009303&hvtargid=pla-830348236008&psc=1&mcid=e12ce628cc5a33b29a77da3a85a6cdf0&th=1&psc=1)

# 勉強記録
## 配列の操作

### 要素を一つも扱わない配列インスタンスの挙動

- [ ]  以下のコードを実行した場合の結果はどうなるだろうか？

```clike
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        int [] a = new int[0];
        System.out.println(a);
        System.out.println(a[0]);
        String [] b = new String[0];
        System.out.println(b);
    }
}
```

- [ ]  結果は以下である。

```clike
[I@2626b418
[Ljava.lang.String;@5a07e868
```

- [ ]  なぜこうなるか？
    - 配列は、そもそも参照型でObjectクラスを継承
    - printlnメソッドにより、参照先のtoStringメソッドが呼ばれる
    - ObjectクラスのtoStringメソッドは、以下の定義となっているため
        
        ```clike
        public String toString(){
        	return getClass().getName() + "@" + Integer.toHexString(hashCode());
        	// クラス名とインスタンスを一意に分けるためのハッシュコード
        }
        ```
        

### 配列の宣言

- 配列の[]は、変数の後につけても、型の後につけても良い。
    - 他言語との互換性のため。

```clike
// 以下すべてコンパイルエラーとならない。
int[]a;
int b[];
int [][]c;
int c[][];
int []c[];
int [][]d[];
```

### 配列のデフォルト値

- 配列インスタンスを生成しただけでは、要素の中身は作られることはない
- なので、生成後に要素の値を代入する必要がある
- ただし、生成直後は以下のデフォルトの値が格納されている

| 型 | デフォルト値 |
| --- | --- |
| 整数型 | 0 |
| 浮動小数点数型 | 0.0 |
| 真偽型 | false |
| 文字型 | ¥u0000 |
| オブジェクト型 | null |

### 配列の初期化子「{}」

- 配列インスタンスの生成と同時に要素の値を初期化したい場合に使用
- 変数宣言と同時にしか使用できない

```clike
//以下はOK
int [] a = {};
int [] b = {1,2};

//以下はNG
int [] c;
c = {2,3};
```

- newと初期化子の両方を使って配列のインスタンス生成と初期化を同時に行う場合、要素数は自動で算出されるので、大括弧の中に要素数は指定できない。

```clike
//以下はOK
int [] a = new int[]{1,2};

//以下はNG
int [] b = new int[2]{1,2};
```

## 感想

- 配列の初期値などを意識して使ったことがなかったが、初期値を代入し忘れていてバグ発生するとかありそうだなと感じた。（要素を一つも扱わない配列インスタンスも同様にありそう。）
Webサーバのバージョン隠ぺいの方法及びメリット。

# 概要

Webサーバのバージョンを全世界に公開してしまっていると、セキュリティ上よくない。
例えば、機器の脆弱性は色々なサイトから公表されているが、（以下はZabbix）

https://support.zabbix.com/browse/ZBX-23388

該当のバージョンに対応する脆弱性を検索されてそれを実行されてしまうという恐れがある。

*上記の例だと、ZabbixAgentのバージョンが外から見れてしまうと問題になりそう。
そのため、各サービスのバージョン情報は外部から見れないようにするとよい。
今回は、**apacheとphpのバージョン情報をcurlで見れないようにしていく**手順を記載する。

## 事前確認
対象のWebサーバ宛てにcurlコマンドを実行する。

```
curl  -v --head url
```
何も対処していないと以下のようにバージョンが表示される。
200OKのすぐ下に、Apacheのバージョンが表示されているのが確認できると思われる。

```:出力結果
PS C:\Users\daigo.ito> curl -v --head https://sample.hoge.co.jp
略
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Wed, 25 Oct 2023 02:33:08 GMT
Date: Wed, 25 Oct 2023 02:33:08 GMT
< Server: Apache/2.2.3 (CentOS)
Server: Apache/2.2.3 (CentOS)
< Last-Modified: Fri, 21 Jan 2011 08:11:11 GMT
Last-Modified: Fri, 21 Jan 2011 08:11:11 GMT
略
```

## httpd隠ぺい作業

これではよくないため、以下の操作をして隠ぺいを行っていく。以下のファイルを編集する。
```
sudo vi /etc/httpd/conf/httpd.conf
```
その後、以下の内容を追記する。ない場合は新たに追記する。
`*Enablesendfile`の後に記載し、`include`の前に記載するとよい。
```
ServerTokens ProductOnly
ServerSignature Off
```
その後、httpdを再起動させる。
```
sudo systemctl restart httpd
```
この状態でcurlを実行すると、apacheのバージョンは見えなくなる。

```:実行結果
略
< HTTP/1.1 200 OK
< Date: Wed, 25 Oct 2023 02:41:31 GMT
< Server: Apache　（ここ）
< Content-Length: 481
< Content-Type: text/html;charset=ISO-8859-1
<
略
```
## php隠ぺいサイト

次にphp分がある場合は、以下のように記載する。
```
sudo vi /etc/php.ini
```
そして、以下の記述を追加する。
```:編集内容
expose_php = Off
```
phpはモジュールであり、再起動は不要。

## それぞれのパッケージのアップデート
これが済んだら、update作業を行っていく。
以下のコマンドを実行し、apacheをupdateする。
```
sudo yum update httpd
```
updateが終わった後httpdは一度落ちるため、再度`systemctl start`させる必要がある。
```
sudo systemctl start httpd
```
phpのアップデートが必要な場合は実行する。ただい、phpはバージョンアップにより仕様が変わって動かなくなることがあるので、もし行う場合は事前に検証を入念に行う事。
```
sudo yum update php
```

# 参考サイト

https://httpd.apache.org/docs/2.4/ja/server-wide.html

https://www.php.net/manual/ja/security.hiding.php
応用情報技術者試験に合格したお話について

2023/10/8（日）に実施された秋季応用情報技術者試験に合格したので
受験に抜けての勉強方法や対策、学習して役立った内容等をまとめたいと思います。
~~受験料が高いので１発合格できたことは財布にも優しくてよかったです。~~


## 学習期間
2023/7/1 ~ 2023/10/7 の３ヶ月間


## 学習方法
学習方法は独学です。
以下の参考書を使用しました。
■令和5年度　応用情報技術者 合格教本（技術評論社）
![81dBSosvHsL._SY522_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638444/b16222f4-5504-9e53-93d5-7bd0e557be16.jpeg)

■令和5年 応用情報技術者 パーフェクトラーニング過去問題集（技術評論社）
![51OurApImpL._SY445_SX342_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638444/1211fdc1-e456-cfd1-5ad6-8bb4caf425df.jpeg)

午前問題対策は以下のスマホアプリも使用しました。
■2024年版 応用情報技術者試験問題集Lite（にしむら工房）


## 学習の流れと対策
#### 2023/7/1 ~ 2023/8下旬まで
シラバス記載事項に関する知識が不足していたため
**応用情報技術者 合格教本**の読み込みを行いました。
同時進行で午前試験対策も行いました。
午前試験の約半数は過去問から出題される傾向であることから
**応用情報技術者試験問題集Lite**をメインに学習しました。

#### 2023/8下旬 ~ 2023/10/7まで
**応用情報技術者 パーフェクトラーニング過去問題集**を使い
午後試験の対策をメインに学習しました。

#### 午前試験対策について
試験合格を目的とする場合、過去問をやりこむ事が最短かつ現実的かと思います。
（シラバス記載の要求知識の範囲がとても広く過去問なしでは膨大な対策時間が必要となるため）
本来であれば知識の定着と拡大が当試験を受験する目的となるため
参考書やIPA発行の各種資料に書かれている内容を読み込み理解する事も大事かと思います。

#### 午後試験対策について
設問１のセキュリティに関しては回答必須であるため必ず対策しましょう。
設問２以降は選択式となり、全部で４つの設問を選び回答することになります。
まずは過去数年間の問題を解き、自分に向いている設問が何かを洗い出しましょう。
洗い出しができたら、再度過去問を解き設問ごとの傾向を掴む、不足している知識を補う等の対策をひたすら行いましょう。
午後試験は問題に対して字数制限付きで回答を求められる問題もそれなりにあったので
簡潔に回答をまとめる訓練も必要になってくるかと思います。
（問題文に書いてあることをベースに簡潔にまとめることがコツかと思います。）
参考までに私が受験した時は以下設問を選択しました。
`セキュリティ、データベース、組込システム開発、情報システム開発、システム監査`


## 試験前日〜当日の注意点
試験室に時計がない可能性があるため、時計は必須となります。
受験票に顔写真貼り付けが必須です。忘れやすい点かと感じたので注意したいところです。
あとは試験当日に頭が回らないと意味ないので前日はしっかり睡眠を取っておきましょう。
余談ですが、1日で午前試験・午後試験を受けるのは頭が疲れたので
午前試験免除制度を活用してみても良いかもしれません。

## 今後のことについて
実務に直結する内容ばかりでない事は確かですが、知識があって損する事はないので
今回学んだことを忘れないよう定期的に振り返りして行きたいです。
余力ができたら高度情報処理技術者試験にも挑戦してみたいです。
AWSで作成できるNW機器とかミドルウェア製品の環境

## はじめに
私、jimbot3はクラウドエンジニアとして日々精進しています。私は後輩を大事にしているタイプ（個人的な見解）ではあると思うのですが、実際、私が後輩に教えられることなんて限られています。そんな私が、クラウドエンジニアとしてNWエンジニアの後輩に多少なりとも貢献できたことを記載してます。

・**後輩が困っていたポイント**
NW機器の設計/構築を行っていたのですが、昨今の半導体不足でNW機器の納品が遅れたりで、詳細設計、構築手順、単体テスト仕様書などがスムーズに作成できない。

・**私の気持ち**
クラウド環境でのNW設計はあるけどNWアプライアンス機器は、Cisco機器の運用くらい。。。でも何とか力になれたらなぁ

**ここで私は1つひらめきました**
「AWS環境でNW機器のEC2を作って、そこで慣れてもらえれば学習にもなるし、構築とかテストのポイントなどわかってくるかも!」　と。そして学習環境としてNW機器を提供して慣れてもらいました。
（その子は、外れ値なくらい頭が良かったので、そのようなものが無くてもすべてを期限に達成できた気もするけど）

という事で、今回はAWS上で行えるNW機器とかミドルウェア製品の環境作成について記載します。MarketPlaceからEC2作るだけではあるのですが、周りにこういう使い方している人もいなかったり、AWS経験しててもこういう使い方をできることを知らなかった人もいるので。

**この手順で作れる製品**
■サーバ/ミドルウェア系
・Red Hat JBoss Web Server on Linux
・Red Hat Enterprise Linux
・SUSE
など他にもたくさん

■NW系
・Palo Alto
・F5 BIG-IP
・Fortigate
などなど他にもたくさん

■その他
Cisco系はAMIは見つからなかった（BYOLじゃない版）のですがシミュレータ であるPacket Tracer をインストールすれば十分学習できます。


# NW機器とかミドルウェア製品の作り方

①. EC2のダッシュボードから、「インスタンスを起動」を押下

![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/7604b27b-dde7-0fe5-afb3-0ce97e9f401a.png)

②. 「その他のＡMIを閲覧する」を押下
![002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/d4cea678-654f-6467-2e36-14a67c5d0e62.png)

③. ここがポイント👆　検索フィールドで対象の機器を入力します。そしてStarting from \\$0.XX hr or from ~ となっているものを選びます。AMIには2パターンあってBYOLというライセンスを購入してそれを割り当てるパターンとライセンス料もEC2の料金に含まれているものがあります。tarting from \\$0.xx hr or from～は後者でありベンダーの製品購入のような手続きをしなくても利用できます。


![003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/9fb04171-a851-42cc-3424-9ea555de30f4.png)


④. 選択した後は、以下のように通常のEC2と同じ画面手順での作成となります。
![004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/5d860752-c3b4-e909-5f04-8ed92090d021.png)

⑤. インスタンスを作成時には以下のようなライセンスのサブスクリプションに時間がかかってますのような画面が出ますが、作成は問題なくされます。

![005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/7295357a-799e-606d-f5c4-186402bb7c37.png)
※作成に時間を要してますの画面

![006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/03675522-0680-ee3e-e15a-fb93e86fe4df.png)
EC2本体の完成!

⑥. Fortigateへのログインなのですが、Fortigateの場合は初期ログインはユーザが[admin]でパスワードが[インスタンスID]になります。
![008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/dbfb4fab-6886-d8c2-8bdc-e6d9dae84dee.png)
初回ログイン後にパスワード変更画面が出てきますがそこは割愛します。
![009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/273cf714-cc4e-288e-f736-1756efce5182.png)

⑦. 完成!
![011.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/b2367e24-250d-56e9-5909-32713c35d2e4.png)


# おわりに（感想）
この記事を書いているときに、7年前くらいに転職活動の際に面接官から、「あなたが考える、AWSなどのクラウドのメリットは、何ですか？」という質問が来て。私が「世界中の人々がどこからでも手の届く～」みたいな、わけのわからん回答をしたら、その面接官が、「私が思うのは、個人でも簡単に環境が手に入ること。誰でも簡単にLinux環境の勉強ができるってすごいこと」と言っていたのを思い出しました。
Datadogによる稼働中のプロセス情報の取得

**概要** 
---------------------------------------
Datadogを使用した、AWS上のEC2インスタンス上のプロセス監視(閾値監視)を行う。
その前提として、DatadogによるEC2インスタンス上で稼働しているプロセスの情報取得が必要となる。
今回、プロセス情報の取得方法について説明する。

<br/>

注) Datadogコンソール上でのモニター設定(監視閾値設定)については別途説明する。(ここでは取り扱わない)


**プロセス情報の取得について** 
---------------------------------------
監視製品の中には、監視Agentが稼働しているOS上のプロセス情報を初期状態の時点で取得するものがある。(例: IBM Tivoli Monitoring)
一方、Datadogの場合、初期状態では監視Agentが稼働しているOS上のプロセス情報を取得しない。明示的に情報を取得するための設定が必要となる。


**Datadogでのプロセス情報の取得について** 
---------------------------------------

まず、Datadogのプロセス情報の取得方法について整理する。
手法は2つで、ライブプロセス(Live Process)とプロセスチェックである。
両者共に、リアルタイムにプロセスの状況を取得する事が可能であり、それぞれの特徴は以下である。


*  ライブプロセス(Live Process)
    OS上で稼働しているプロセスの情報をまとめて確認できる。(除外項目を除く)
    Datadog Agent側にプロセス情報を取得するパラメーターを有効化する必要がある。
    ただし、ライブプロセス(Live Process)の利用にはEnterpriseのライセンスが必要となる。

<br/>

* プロセスチェック
    個別のプロセスに対する状況を確認(監視)できる。
    そのために、Datadog Agent側に情報を取得したいプロセスを個別に指定する必要がある。
   

Enterpriseのライセンスを所有しているのであれば、ライブプロセスを利用するのが妥当と考える。
理由は、プロセスチェックを利用した場合、プロセス監視の対象追加が発生した場合、都度Datadog Agentの構成ファイルに監視対象となるプロセスを指定する必要があり、運用としての手間を要することになるためである。

**ライブプロセス(Live Process)を使用したプロセス監稼情報の取得**
---------------------------------------

以下の手順を実施することでプロセス監視情報を取得することが可能になる。


* Datadog Agentのインストール 
監視対象にDatadog Agentをインストールする。
インストール手順についてはここでは割愛する。

<br/>

* ライブプロセス(Live Process)の有効化

ライブプロセス(Live Process)の設定はdatadog.yaml(/etc/datadog-agent/datadog.yaml)内にあり、初期値は無効になっている。ここを有効に変更する必要がある。



例
process_configにあるprocess_collectionの設定値をenabled: trueにする。

```ruby:/etc/datadog-agent/datadog.yaml
process_config:
  process_collection:
    enabled: "true"
```

※設定値はコメントアウトされているのでコメントアウトを外す。

注) yamlファイルなので、インデントの位置が重要。単にコメントアウトを外すと、Agent起動エラーになることがある。気になる場合は、Datadogの公式URLにある記載をコピー&ペーストするのが無難


<br/>

パラメーター変更後はDatadog Agentの再起動が必要。(再起動することで変更したパラメーターが反映される)

<br/>

* 取得されたプロセス情報を表示

Datadogコンソールで確認対象のホストを選択し、Processesタブをクリックする。
すると、Datadogで取得されているプロセスやサービスの情報一覧が参照可能。
プロセス単位のCPU使用率やメモリ使用率も表示されている。

![スクリーンショット 2023-12-31 17.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3019894/96f019a1-80bb-2475-9ee8-7354b3b66d7b.png)




**参考にした情報** 
---------------------------------------



[ライブプロセス](https://docs.datadoghq.com/ja/infrastructure/process/?tab=linuxwindows#installation)

[料金](https://www.datadoghq.com/ja/pricing/?product=infrastructure#products
)

[プロセス](https://docs.datadoghq.com/ja/integrations/process/)

[Datadogのライブプロセス(Live Process)を使った監視設定手順纏め](https://www.tama-negi.com/2023/04/22/datadog-live-process/)


[Datadogのプロセス、サービス監視設定手順纏め](https://www.tama-negi.com/2021/01/11/datadog-agent-azure-vm-process/)
Minecraft軽量化MODの間違った使い方 ～PCの寿命～

この記事は１０分で読めます。

# はじめに
軽量化MOD使ってますか？私は使ってます。
この記事では軽量化MODの間違った使い方について説明します。

# 軽量化MODとは？
Minecraftの動作を変更／拡張するために使うMODを利用して、ゲームに必要な機能を最適化し、不要な機能を除外することで、ゲームのパフォーマンスを安定化させたり、向上させたりするものです。
主に低スペックなPCでも軽量化MODによって快適にマインクラフトを遊ぶことを目的にして作られています。

# ハイスペックPCに軽量化MODを入れる理由は？
マインクラフトは非常にシンプルなボクセルアートで構成されたゲームですが、ゲーム内で多くの事ができる分、ハイスペックPCを使ってより凄いことをしたくなるのがゲーマーの性です。
特に大量のエンティティを生成するトラップタワーや、超巨大な装置や、超広範囲のアートや、超美麗な影MODなどを使うと、現時点で最高のゲーミングPCであってもカクカクするようなこともマインクラフトではできてしまいます。
そんなときに軽量化MODを入れることで、より安定したFPSで影MODを有効にできたり、大量のエンティティを画面内に描画したりできるようになります。そのためハイスペックPCであっても軽量化MODを使っている人は多くいます。

# 軽量化MODの勘違い
軽量化MODを使うとゲームのパフォーマンスが安定して、PCの負荷も軽くなる。これは間違った認識です。「因果の逆転」というやつですが、正しくは、軽量化MODを使うとPCの負荷が軽くなるため、安定してゲームのパフォーマンスが向上する。の順番です。
結果、PCの余力を更に使い切ることでPCの負荷が逆に高くなることがあります。なぜそのようなことが起きるかというと、これのせいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/c3fa1d87-5910-1010-76fb-cd0304a883bd.png)

低スペックPCの方はなんとか60FPSを出したいがために、描画範囲を狭くしたり、霧をオフにしたり、パーティクルをオフにしたり、垂直同期をオンに、最大フレームレートは60に、などと制限をかける方向で頑張るためPCの負荷も基本的には一定に落ち着きます。そもそも低スペックたるボトルネックがどこかにあるので一定以上の負荷がかからないことが多いです。

一方で、ハイスペックPCの人の一部には軽量化MODを入れてパフォーマンスを最大化することを目的にしているため、上のような設定にしてしまうことがありますが、これはかなり危険な設定です。軽量化MODによってCPUに余力ができてしまった場合、よりGPUを消費することができるようになります。仮に夏場にこのような設定で１日仮に放置しようものなら運が悪ければその日のうちにPCが壊れるレベルです。
マインクラフトは超高FPSで弾を有利に避けて喜ぶようなゲームではないので、基本的にはFPSの上限を設定してください。90FPSや60FPSで十分だと思います。

# PCの寿命
おまけです。
BTOで購入できるお手軽ゲーミングPCはグラフィックボードを空冷のファンで冷やすことが多いですが、下の画像のようにGPUが100%近くで長時間稼働すると、ファンの回転数が上がりかなりでかい音が鳴りだします。それ自体は正常な動作ですが、

（無制限のときのGPUの使用率）
![gpu02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/c338e446-7054-ef43-7a17-e4bafc41e6fe.png)

（60FPSのときのGPUの使用率）
![gpu03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/c3929d20-e2de-ad94-54b7-0418a19a8261.png)

GPUの使用率が高い状態で放置すると空冷での冷却が間に合わず、GPU温度が一定値を超えた状態で長時間稼働することになります（CPUが空冷の場合も同様です）。
だからといってすぐに壊れることはないですが、ファンのような稼働パーツは回転数が寿命に直結し、異音が発生したり、埃がたまって冷却能力が低下したりします。冷却能力が低下していると気づかないうちにGPUの寿命が縮むことになります。
GPUはゲーミングPCの中で最も高価なパーツです。なるべく労わってあげましょう。

ハイスペックPCの方はフレームレート無制限にはせず（するとしても利用用途を限るなど工夫する）、たまにはGPU使用率を確認するなどしながらマイクラを楽しんでください。

![gpu04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172479/115007e1-0093-4a0a-e9fc-71a379fdc92d.png)

# まとめ
PCを大切に。
【読書感想】世界一流エンジニアの思考法

年末に落ち着いて読書する時間が作れたので、
まあ、あまりに良書だったので、是非アウトプットして記憶に定着させたいということで、記事として残しておくことにした。

X（旧Twitter）では章ごとに感想をまとめるようにしていたので、こちらでは総評として記しておく。

## 世界一流エンジニアの思考法

Amazonセール中にたまたま目に入って、技術書っぽくないやつが読みたいところだったので、評判とかは特に見ずにタイトルだけでポチりました。

https://bookmeter.com/books/21616153

米マイクロソフトのシニアエンジニアである牛尾さんが、現地で共に働く一流エンジニアたちから吸収し、実践して効果を得た生産性を上げる為のアプローチや、日本とインターナショナルにおけるマインドの違いなどについて語られている内容となっています。

## 以下、ざっくり感想
270ページほどの内容で、2日にかけて読みましたが、各章で学びがあり、読了時にはちょいとした感動がありました。

これは思考法の本なので、生産性を上げる小手先の技術的な話ではなく、「メンタルモデル」や「マインドセット」を形成すると良いという話が書いてあります。なんか直近1年の自分を振り返った時にこれがめちゃめちゃ刺さったんですよねー。

FEもBEもインフラも、DevもOpsも、ドメイン知識も必要で、正直どれも中途半端な理解になってしまって、手応えを感じ辛く、完璧に理解しなきゃとあれこれに手を出しては不完全に終わるというループに陥ってる感に疲弊していました。そんな中で結果を出さなきゃとするので、一つ一つの理解が疎かになるのですが、まあこれが原因なので、「完全に理解した」と言えるものを少しずつ増やしていくのが結局近道なのよ、一流の人でもそうなんだからと言ってもらえた気がしてこれが刺さったんですよという話。

元々、記憶力はある方なのですが、理解できているから憶えてられるはそれはそう。あまりそういう考え方はしなかったけど、合点が入った感じがしました。

WIP1は常日頃、チームでも一つずつ高速にやっつけていこうぜって話はしている。問い合わせ対応とか、会議とか様々な横槍がある中で、うまくコンテキストをアレしてやるのは難しいがでも、やっぱりマルチタスクは敵なので、そこはセルフコントロールしていきたいと思いました。

そして何より、批判や否定をしないことの重要性については同意しかないですね。ただ心理的安全が欲しいだけなんじゃあ〜という気持ち。これを意識するだけで、個人の生産性爆あがりやろと思う。結構、建前としてチャレンジを否定しないとか、批判しないようにというのはどこでも言うけど、改めて自分がリードするチームではその辺を実践していきたいと感じました。
【Android】センサーを使うときに端末の電池の消費を抑える【Kotlin】

# はじめに
センサーを使った記事を最近よく書いていますが、センサーを使っていると端末が熱くなり 電池の消費が速くなっていると感じます。そこで、端末の消費電力を抑える方法を調べたので記事に残しておこうかと思います。

# 取得取得時間を指定する

センサーのリスナーを指定するregisterListenerを使う際に第４引数に
**maxReportLatencyUs**（古いものだとmaxBatchReportLatencyUsとなっている）を指定することでセンサーの値の取得間隔を指定することができます。
センサーが動く度に値を取得するとより多くの電池を消費してしまうので、必要な時だけ取得するように取得間隔を指定すると電池の消費を抑えられるでしょう。


```
registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs, int maxReportLatencyUs)
```
　# 参考

 https://developer.android.com/reference/android/hardware/SensorManager
【備忘録】.gitignoreファイルについての説明や書き方を簡単にまとめる

あれ、どうやって書くんだっけ。とふと思ったので、備忘録がてらまとめました。

### **.gitignore について**
Git で管理されないファイルの事を言う。
ignore とは、「**無視する、黙殺する、聞きながす、気付かないふりをする**」などの意味がある。
よって、管理したくないファイルなどは、.gitignore というテキストファイルを使うのが良い。

## 書き方

:::note info
sample ディレクトリに .gitignore が置かれているとしたケース
sample
　-- test_01.txt
　-- test_02.txt
　-- test_03.txt
:::

- ファイル名を直接指定する

```bash
test_01.txt
```

- ディレクトリの指定（以降にあるファイルやフォルダも全て対象となる）

```bash
sample/
```

- 例外を使って、test_02.txt だけは除外したい場合

```bash
!/sample/test_02.txt
```

- 拡張子を指定したい場合

```bash
*.png
```

- コメント

```bash
# 「#」でOK
```


以上。
「フロントエンド開発のためのテスト入門」 10章での開発環境構築エラー解消 ( User `root` was denied access on the database `app-db.public` )

## エラー内容

「フロントエンド開発のためのテスト入門」 10章で開発環境構築をしていたら以下のエラーが生じた

```bash
$ npm run prisma:migrate 

> frontend-testing-book-nextjs@1.0.0 prisma:migrate
> prisma migrate dev

Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "app-db", schema "public" at "localhost:5432"

Error: P1010: User `root` was denied access on the database `app-db.public`
```

rootでアクセスできないというその通りのエラーだが、本の通りにはやっていたので記録として残す


## エラー解消方法

```sql
// 実際にDockerでたてているpostgresにpostgresユーザでログインする
$ psql -h localhost -p 5432 -U postgres

// postgres内でroleを確認すると、rootがない
postgres-# \du
                                     List of roles
  Role name   |                         Attributes                         | Member of
--------------+------------------------------------------------------------+-----------
 osaosa       | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 postgres     | Superuser                                                  | {}

// rootユーザを以下のコマンドで作成
postgres=# create role root with superuser login password 'password';

// rootユーザが作成されていることを確認
postgres=# \du
                                     List of roles
  Role name   |                         Attributes                         | Member of
--------------+------------------------------------------------------------+-----------
 osaosa       | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 postgres     | Superuser                                                  | {}
 root         | Superuser                                                  | {}
```


マイグレーションできるのを確認
```bash
$ npm run prisma:migrate 

> frontend-testing-book-nextjs@1.0.0 prisma:migrate
> prisma migrate dev

Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "app-db", schema "public" at "localhost:5432"

PostgreSQL database app-db created at localhost:5432

Applying migration `20221017012748_init`

The following migration(s) have been applied:

migrations/
  └─ 20221017012748_init/
    └─ migration.sql

Your database is now in sync with your schema.

✔ Generated Prisma Client (4.6.0 | library) to ./node_modules/@prisma/client in 124ms


Running seed command `ts-node --compiler-options {"module":"CommonJS"} prisma/seed/index.ts` ...
Start seeding ...
Seeding finished.

🌱  The seed command has been executed.

```


## 参考
https://qiita.com/IzumiSy/items/6879ae9eb181b5e43087
RealSenseからIMUの情報を取得する方法

Intel RealSenseの一部には、内蔵されたIMUがあり、これを使用して加速度とジャイロスコープ（物体の角度、角速度、各加速度）のデータを取得することができます。本記事では、Pythonを使用してRealSenseからIMUの情報を取得する方法について取り扱っていきます。

↓実行結果
![スクリーンショット 2023-12-31 182106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632959/94b09926-4526-6df0-22b2-bd00cc140d95.png)

必要なもの
対応しているRealSenseデバイス: 例えばD435iなど、IMUが内蔵されているモデル。
RealSense SDK 2.0: 動作確認用に[Intelの公式サイト](https://www.intelrealsense.com/sdk-2/)からRealSense SDK 2.0をインストールしてください。(なくてもOK)
Python: Pythonがインストールされていることを確認してください。
pyrealsense2: Python用RealSenseライブラリをインストールしてください。
```
pip install pyrealsense2
```
## 1: ライブラリのインポート
```
import pyrealsense2 as rs
```
## 2: IMUストリームの設定
加速度センサーとジャイロスコープのストリームを有効にします。

```
# パイプラインの設定
pipeline = rs.pipeline()
config = rs.config()

# 加速度センサーのストリームを有効にする
config.enable_stream(rs.stream.accel)

# ジャイロスコープのストリームも有効にする場合
config.enable_stream(rs.stream.gyro)

# ストリーミング開始
pipeline.start(config)
```
## 3: 加速度データの取得と表示
加速度センサーからデータを取得し、それを表示します。

```
try:
    while True:
        # フレームセットを待機
        frames = pipeline.wait_for_frames()

        # 加速度センサーフレームを取得
        accel_frame = frames[0].as_motion_frame()
        if accel_frame:
            accel_data = accel_frame.get_motion_data()
            print("Accel:", accel_data.x, accel_data.y, accel_data.z)

        # ジャイロスコープフレームも取得する場合
        gyro_frame = frames[1].as_motion_frame()
        if gyro_frame:
            gyro_data = gyro_frame.get_motion_data()
            print("Gyro:", gyro_data.x, gyro_data.y, gyro_data.z)

finally:
    # ストリーミング停止
    pipeline.stop()
```
上記のコードは、加速度センサーからのX, Y, Z軸のデータをリアルタイムでコマンドプロンプトに出力します。また、ジャイロスコープのデータも同様に取得して出力しています。


## 注意点
・すべてのRealSenseデバイスが内蔵IMUを持っているわけではないので、使用しているデバイスがIMUをサポートしているか確認してください。
・加速度センサーとジャイロスコープのデータは生データであり、使用する際には適切に処理する必要があります。
Tailwind CSSのunknownAtRulesエラーの解消法（VSCode利用時）

## 事象

Next.jsプロジェクトでTailwind CSSを利用する際に、globals.cssに以下のコードを記述すると、unknownAtRulesの警告が表示されることがあります。この警告は、Tailwind CSSのディレクティブがVisual Studio Codeによって未知のルールとして扱われるために発生します。この記事では、その警告を解消する方法を紹介します。

```src/app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
  * {
    @apply border-border;
  }
  body {
    @apply bg-background text-foreground;
  }
}
```

添付のスクリーンショットでは、「@tailwind」や「@apply」のルールが警告の対象となっています。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2700356/41be0436-7f65-bf68-b931-d4d88a8d5f8f.png)

## 対処法

### 方法1: Tailwind CSS IntelliSenseのインストール
1. Tailwind CSS IntelliSense をVisual Studio Codeの拡張機能としてインストールします。この拡張機能は、Tailwind CSSに関連するコードをより正確に認識し、エディタの補助機能を提供します。

2. Visual Studio Codeの設定ファイル（settings.json）に以下の設定を追加します。この設定により、CSSファイルがTailwind CSSとして適切に解釈され、警告が減少します。

```.vscode/settings.json
{
  "files.associations": {
    "*.css": "tailwindcss"
  }
}
```

### 方法2: 警告の無視
1. もし警告が機能的な問題を引き起こさない場合は、Visual Studio Codeの設定ファイル（settings.json）に以下の設定を追加して、これらの警告を無視することもできます。

```.vscode/settings.json
{
  "css.lint.unknownAtRules": "ignore"
}
```

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
【Django】TemplateSyntaxErrorが出た

DjangoGirlsの練習で、post_detailを実装している際に以下のエラーに遭遇した。
結論、原因はhrefのurl指定で ```{% tag %}```を使用すべき箇所に```{{ var }}```を使用していたことであった。

>TemplateSyntaxError at /
Could not parse the remainder: ' 'post_detail' pk=post.pk' from 'url 'post_detail' pk=post.pk'

```
{% extends 'blog/base.html' %}
{% block content %}
  {% for post in posts %}
    <div>
      <h2>
        <a href="{{ url 'post_detail' pk=post.pk }}">{{ post.title }}</a>
      </h2>
      {% if post.published_date %}<p>{{ post.published_date }}</p>{% endif %}
      <p>by {{ post.author }}</p>
      <p>{{ post.text }}</p>
    </div>
  {% endfor %}
{% endblock %}

```
Requirements on Charging Manager

Requirements on Charging Manager
https://www.autosar.org/fileadmin/standards/R23-11/CP/AUTOSAR_CP_RS_ChargingManager.pdf


# Release Overviews

Classic Platform Release Overview, AUTOSAR No.0 ,R23-11, CP
https://qiita.com/kaizen_nagoya/items/8468435185e109189ead

Foundation Release Overview, AUTOSAR 781, R23-11, FO
https://qiita.com/kaizen_nagoya/items/f249bdb8c313d8bff883

Adaptive Platform Release Overview, AUTOSAR 782, R23-11, AP
https://qiita.com/kaizen_nagoya/items/13a104606a34fe24fcf7

# Terms
|Short Name(Abbreviation / Acronym)|Description|
|:--|:--|
ChrgM|Charging Manager
V2GTP|Vechile to Grid Transport Protocol
EXI|Efficient XML Interchange
EV|Electric Vehicle
EVSE|Electrical Vehicle Supply Equipment
EVCC|Electric Vehicle Communcation Controller
SECC|Supply Equipment Communcation Controller
HLC|High Level Communcation


＃ References
[1] Standardization Template AUTOSAR_FO_TPS_StandardizationTemplate
[2] Glossary AUTOSAR_FO_TR_Glossary
 https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_TR_Glossary.pdf
[3] Specification of Socket Adaptor AUTOSAR_CP_SWS_SocketAdaptor
[4] Specification of TCP/IP Stack AUTOSAR_CP_SWS_TcpIp
[5] ISO 15118-2:Road Vehicles – Vehicle to Grid Interface – Part 2:Network and Ap- plication Protocol Requirements
[6] Specification of Crypto Service Manager AUTOSAR_CP_SWS_CryptoServiceManager
[7] Specification of Key Manager AUTOSAR_CP_SWS_KeyManager
[8] Specification of RTE Software AUTOSAR_CP_SWS_RTE

## 補足資料（Additions）

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 20231231
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
JestでTypeScriptのテストを書く(Step3:API検証)

## はじめに
表題通り、JestでTypeScriptのテストを書きます。
下記StepでJestの学習を進めていきます

[Step1: Jest(環境構築から実行まで)](https://qiita.com/koji0705/items/258166f4f281efbb2c46)
[Step2: Jest(Matcherを利用する)](https://qiita.com/koji0705/items/2049d581fe7d343d58d3)
[Step3: Jest(API検証)](https://qiita.com/koji0705/items/1f7099600a97f3a9b328)←今回はここ
[Step4: Jest(StubとMockとSpy)](https://qiita.com/koji0705/items/191a48e51b9eebb81db1)

## API通信

```shell:ディレクトリ構成
~/develop/react/jest_ts$ tree -I node_modules 
.
├── jest.config.js
├── package.json
├── src
│   ├── __tests__
│   │   ├── api.test.ts
│   │   ├── sample.test.ts
│   │   └── sum.test.ts
│   ├── api.ts
│   └── sum.ts
├── tsconfig.json
└── yarn.lock

3 directories, 9 files
```

```ts:src/api.ts
import axios from 'axios';

export const fetchData = async (url) => {
  try {
    const response = await axios.get(url);
    return response.data;
  } catch (error) {
    throw error;
  }
};

```


```ts:src/__tests__/api.test.ts
import axios from 'axios';
import { fetchData } from '@/api';

// axios.get を手動でモックに設定
axios.get = jest.fn();

describe('fetchData', () => {
  it('fetches successfully data from an API', async () => {
    // mockを準備
    const data = { data: 'some data' };
    (axios.get as jest.Mock).mockResolvedValue({ data });

    await expect(fetchData('https://example.com')).resolves.toEqual(data);
  });

  it('fetches erroneously data from an API', async () => {
    // mockを準備
    const errorMessage = 'Network Error';
    (axios.get as jest.Mock).mockRejectedValue(new Error(errorMessage));

    await expect(fetchData('https://example.com')).rejects.toThrow(
      errorMessage
    );
  });
});

```

## 実行結果
```shell:テスト実行
~/develop/react/jest_ts$ yarn test api.test.ts 
yarn run v1.22.19
$ jest api.test.ts
ts-jest[config] (WARN) message TS151001: If you have issues related to imports, you should consider setting `esModuleInterop` to `true` in your TypeScript configuration file (usually `tsconfig.json`). See https://blogs.msdn.microsoft.com/typescript/2018/01/31/announcing-typescript-2-7/#easier-ecmascript-module-interoperability for more information.
 PASS  src/__tests__/api.test.ts
  fetchData
    ✓ fetches successfully data from an API (2 ms)
    ✓ fetches erroneously data from an API (2 ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.599 s, estimated 1 s
Ran all test suites matching /api.test.ts/i.
✨  Done in 1.15s.
```
【備忘録】WSLがシャットダウンできない時の対応方法

## TLDR;

以下を実行する。

```powershell
taskkill /f /im wslservice.exe
```

## メモ

WSL(Windows Subsystems for Linux)で使用メモリ量がいっぱいになったままハングアップしてしまった。具体的には、Docker上でJupyter Notebookを使用し、コンテナの立ち上がり後にNotebook Serverが起動するように設定していた。

正攻法では、以下でWSLをシャットダウンさせると思うが、それも受け付けない。

```powershell
wsl --shutdown
```

PC自体を再起動させても、WSLの立ち上げ後に上記でシャットダウンできないまま。

この問題は[Issue](https://github.com/microsoft/WSL/issues/8529#:~:text=tricodon%20commented%20on%20Sep%2030%2C%202022)に上がっており、紹介されている方法でWSLをシャットダウンすることができた。
【C#】nameof(T)という罠

# nameof(T)は罠

nameofにT(Generic型)を渡してはいけない(戒め)


例えばこんな感じのコードがあったとします。
```cs:getName.cs
public static string getName<T>()
{
    return nameof(T)
}
```
こんな結果が返ってきてほしいです。
```cs:nameofの願望.cs
// stringが返ってきてほしい
Console.WriteLine(getName<string>());

// intが返ってきてほしい
Console.WriteLine(getName<int>());

// floatが返ってきてほしい
Console.WriteLine(getName<float>());
```
しかしnameofはコンパイル時にこれらはすべてTとして解釈されてしまいます。
```cs:T、お前返ってくんな.cs
// Tが返ってくる
Console.WriteLine(getName<string>());

// Tが返ってくる
Console.WriteLine(getName<int>());

// Tが返ってくる
Console.WriteLine(getName<float>());
```
指定した型の名前を取得したい場合はtypeofでTypeを取得してからNameプロパティを取得しましょう。
```cs:getName.cs
public static string getName<T>()
{
    return typeof(T).Name
}
```
これでちゃんと返ってくるはずです。
```cs:やったー.cs
// stringが返ってくる
Console.WriteLine(getName<string>());

// intが返ってくる
Console.WriteLine(getName<int>());

// floatが返ってくる
Console.WriteLine(getName<float>());
```
(なんで1年の最後にこんな記事書いてるんだろう)
制御構造（Java Silver勉強）

# 最初に
この記事は、以下の書籍を通じてJava silverの合格に向けて自分が学んだ内容を体系的にアウトプットする記事である。（目指せ年明け合格！）
[徹底攻略Java SE 11 Silver問題集[1Z0-815]対応]()

# 勉強記録
## 4章 制御構造

### ラベル

- ラベルとは
    - 多重ループをしていた場合、内側のループ文ではなく、外側のループ文からも抜けたい場合などに使用するもの

```clike
sample:
for(int i=0; i<10; i++){
	for(int j=0; j<10; j++){
		if(3<j){
			// ラベルsampleのループを抜ける
			break sample;
		}
	}
}
```

- コードブロックやif文・代入式など、さまざまな箇所に使用できる
- ただ、コードの制御がさまざまな箇所に移り可読性が悪くなるので、多用するべきではない

### 他

- do whileやwhileでも、中括弧{}を省略できる
    - if文と同様に、次の1文のみ繰り返し処理として扱う
- for文
    - 初期化文で複数の変数を宣言する場合、変数は、同じ型でないといけない
    - 複数記述できるのは、初期化文と更新文のみ（条件文は、複数不可）
    

## 感想

- ラベル、多用するべきではないという言葉通り、自分の開発経験では出会ったことがなかった。（多重ループを抜けたい場合などは便利だなと思うが）
- 初期化文で複数の変数を宣言する場合、変数は、同じ型でないといけないという制約はなぜなのだろう？（それくらいできても良い気がするが）
    - chatGPTに聞いたら、可読性とコンパイラの処理の効率の良さって返ってきた。なるほど。
電気代を通知するLINEBotの開発【Part.1】

# 電気使用量を通知してくれるLINEbotを作ってみる

## 経緯
2023年8月、諸事情で引っ越しするにあたり、
[Octopas energy](https://octopusenergy.co.jp/friend/pure-duck-140)という電力会社に変更しました。  
電気代支払いのためマイページにアクセスしたところ、開発者用APIを公開してくれていることを発見しました。  
オクトパスエナジーの利用者の大半はこのことを気にも留めていないとおもいますが、  
折角公式に提供してくれているので使ってみようと思います。  

## 概要
今回は電気使用量(電気代)を通知してくれるLINEbotを作成したいと思います。  
近頃、電気代の高騰で家計にダメージを受けているので、可視化することで少しでも節約を意識できるようするため
（と言うのはあくまで建前で単に面白そうだから作ってみたいだけ...）

## 開発環境
```
Python: 3.8
Flask: 2.2.5
GraphQL: 3.4.1
line-bot-sdk: 3.1.0
```
## やりたいこと
1. オクトパスエナジーから情報を取得する
    1. 認証トークンの発行
    2. 日付を取得してAPIを投げる
    3. 取得データから電気使用量、電気代を抽出する
2. LINEbotをRenderにデプロイする
3. LINEbotで取得したデータを通知する(Part2で記載予定)

https://github.com/Herb0310/EcoWatcher


## 参考

https://qiita.com/kim_t0814/items/d7346d19529ca2315fe3

https://qiita.com/kakiuchis/items/0225664568ece7b7b08b


## 最後
本記事を最後まで読んでいただきありがとうございます。  
[リンク](https://octopusenergy.co.jp/friend/brave-deer-879)からオクトパスエナジーを契約していただくと契約者様と僕に5000円のボーナスがもらえます！
電力会社を検討中または、上記APIを使ってみたい方、一緒にボーナスを受け取りましょう！
【OpenAPI】Swaggerで書いたAPI仕様書をVSCODE でプレビューする


## Swaggerとは
Swagger UIは、Web APIのドキュメントを表示するためのオープンソースのユーザーインターフェース（UI）です。Swagger UIは、Swagger（現在は OpenAPI Specificationとして知られる）と呼ばれるAPI設計ツールの一部であり、APIの仕様書を視覚的かつインタラクティブな形式で表示することができます。

参考サイト: [Swagger UI とは](https://apidog.com/jp/blog/how-to-use-swagger-ui/)

## 注意
このページではswaggerの書き方については言及しません。

## 環境
- windows11
- Visual Studio Code (VSCODE)

## VSCODE でSwaggerで書いたAPIをプレビューする方法

### 必要な拡張機能

下記２つ(見るだけならSwagger ViewerだけでOK)をインストール

#### Swagger Viewer

Swaggerを表示するための拡張機能

■ 拡張機能情報
Name: Swagger Viewer
Id: Arjun.swagger-viewer
Description: Swagger Viewer lets you preview and validate Swagger 2.0 and OpenAPI files as you type in Visual Studio Code.
Version: 3.1.2
Publisher: Arjun G
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=Arjun.swagger-viewer

#### Spectral

Swaggerを編集する際に文法ミスを指摘してくれる拡張機能
（Swaggerを見るだけなら不要）

■ 拡張機能情報
Name: Spectral
Id: stoplight.spectral
Description: JSON/YAML linter with OpenAPI and custom ruleset support.
Version: 1.1.2
Publisher: Stoplight
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=stoplight.spectral

### プレビュー方法

上記の拡張機能をインストールした上、Swagger 記法で書かれた `.yaml` のファイルを開き、
`Shift + Alt + P` でプレビュー画面が開く

## Swaggerで書いた`.yaml`を`.html`に変換する

- node.jsを使用する

参考サイト : [SwaggerでOpenAPI仕様書を作成、HTMLやMarkdownに変換する](https://zenn.dev/dozo/articles/1e0f542ea59244)

■ 手順
1. node.jsは入っている前提
2. `npm i -D redoc-cli`
3. `npx redoc-cli build reference/User.yaml -o dist/User.html` 
   ファイル名は適せん変更。一つ目が変換元のyamlファイル。二つ目が出力のhtmlファイル

## 終わりに

参考になれば幸いです。
Node.js環境(Typescript)でJestを使用してテストを行う

## 使用環境
 - windows11
 - Node.js v18.17.1
 - Visual Studio Code(VSCode)

Node.js環境は構築済みのところからの記事になります。
(`npm init`などは終了してプロジェクトが作成されている状態)

## フォルダ構成
```
─ project rootフォルダ
    ├ scr/ : テストするTypescriptファイル用フォルダ
      ├ sample.ts : テスト対象ファイル
    ┝ test/ : テストコード用フォルダ
      ├ sample.test.ts : テストファイル
    ┝ packege.json
    ┝ jest.setup.ts
    ┝ jest.config.js
    ┝ tsconfig.json
    ┝ node_modules
```
## 必要なパッケージをインストール
### Typescript環境用
- ts-node
- typescript
- @types/node

```Typescript
// パッケージをインストール
npm -D i "ts-node" "typescript" "@types/node"
```

Typescript環境を構築済みの場合はスキップ

### テスト用パッケージ（Jest）
 - `jest`
 - `@types/jest`
 - `ts-jest`

```Typescript
// パッケージをインストール
npm -D i "jest" "@types/jest" "ts-jest"
```

これでテストを行うためのパッケージの準備は完了です

## jestのセットアップファイルを作成
下記２つのファイルを編集します。ない場合はpackage.jsonと同じフォルダ内に作成してください。

#### jest.config.js
- テストの実行環境などを指定

```Typescript:jest.config.js
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports ={
    preset:'ts-jest',
    testEnvironment:'node',
    setupFilesAfterEnv:["./jest.setup.ts"]
}
```


#### jest.setup.ts
   - このファイルはテストのオプション設定なので、なくてもテストは可能です 
```Typescript:jest.setup.ts
// テストで使用したい環境変数を定義
process.env.HOGEHOGE = "env_hoge"
process.env.FUGAFUGA = "env_fuga"

// テストのタイムアウトを設定
jest.setTimeout(30000)
```

#### tsconfig.json
- VSCodeでの文法エラーの検知などを回避する設定を追加

```json:tsconfig.json
// 一部抜粋
{
  "compilerOptions": {
      "target": "es2016",
      "module": "commonjs", 
        "types": ["jest"], 
    },
     "include": ["**/src/**/*","**/test/**/*"] 
}
```

## サンプルコードを準備

src/sample.tsにサンプルコードを記述

```Typescript:sample.ts
export const handler = async (event: any) => {
  const env_hoge = process.env.HOGEHOGE
  console.log(env_hoge)  
  return "finish"
};
```


## テストコードを準備
 test/sample.test.tsにテストコードを記述

 ```Typescript:sample.test.ts
import { handler } from "../src/sample";

 describe("正常系",()=>{
    test("環境変数をログ出力",async()=>{
        // こちらでも環境変数が取得できる
        const testEnvFuga = process.env.FUGAFUGA
        // 環境変数が取れていることを確認
        expect(testEnvFuga).toBe("env_fuga");
        
        const event = ""
        const response = await handler(event)

        // レスポンスが"finish"になっていることを確認
        expect(response).toBe("finish");
    });
});
 ```

 ## テストを実施
下記コマンドでプロジェクト内のテストコードをすべて実施する
 
```shell
 npx jest
 ```
すると下記みたいな感じでテスト結果が出力されます
```shell
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        10.821 s
```



 ## 終わりに

 以上がTypescript環境でテストを実行するまでの基本的な流れになります。
 参考になれば幸いです。
ResNetは深層が実現できたから性能向上した訳でない

**原論文**
Residual Networks Behave Like Ensembles of Relatively Shallow Networks
https://arxiv.org/pdf/1605.06431.pdf


**日本語解説**
ResNet なんて全く理解していないだけの人生だった(破)
https://qiita.com/kenmaro/items/07d72feac966008af034

# 結論
ResNetは浅い層のアンサンブル効果で性能向上したと考える．



# 概要
下図はResNetのスキップ接続を使用したモデル構造であり，(a)の構造図を展開すると(b)の構造図とも書くことができる．3層あるため，8パターンのルートが存在し，出力はその8ルートを合わせて計算する．各ルートが層数を↓に示す．

０層：1ルート
１層：3ルート
２層：3ルート
３層：1ルート

3層あるが，実際に3層を計算してるルートは1つしかない．ほとんどのルートは1層か2層しか計算しない．ResNetは，従来手法と比較して飛躍的に層数を増やすことが可能になり性能向上したが，その成功の秘訣は層を増やしたことなのか？

(b)の図は平均して1.5層の8ルートがあり，それぞれが合わさって出力値となる．これは，8つのアンサンブル学習の特徴と同じである．ResNetの成功の秘訣は，浅い層のアンサンブル効果なのかもしれない．


![スクリーンショット 2023-12-31 14.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/93b7bb69-6903-25da-f726-38ed5d7e296f.png)





# 接続部分の切断
上図(b)のモデルの接続部分をランダムに複数切断する．すると青で示すResNetのエラー率はほぼ変化ない．しかし，オレンジで示すVGGのモデルでは，エラー率が低下しない．これは，アンサンブルの1つのルートが使えなくとも他ルートで補完する効果が確認できる．

![スクリーンショット 2023-12-31 15.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/b348c050-39f4-b709-f1b2-1f92053c850c.png)



# 層の削除とシャフル
ResNetの層をランダムに削除(a)，ResNetの構成ブロックをシャフル(b)しても，誤差は緩やかに増加して，致命的なダメージを負わない．これも，アンサンブルから得られる恩恵と似ている．

![スクリーンショット 2023-12-31 14.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/56d6d09d-e672-b8e1-eb8a-286f6106e2fd.png)


# 貢献してるルート

ResNet50の場合(a)は各ルートの総数のカウントである．0~10，40~50層のルートは極端に少なく，25層あたりのルートが大半を占める．
(c)では，学習の際に，どのルートのものが学習により貢献しているのかを示す．結果として，比較的浅い層のルートが貢献する傾向にある．ResNetは深い層を実現しているけど，本来はゴールまでのルートが長くなっているのではなく，層をふっとばしてるので，本来は浅い層で学習して性能向上している．

![スクリーンショット 2023-12-31 15.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/82586862-3222-ddd9-0db4-9600d19bf088.png)


# まとめ
ResNetは深層が実現したことにより性能向上できたと思っていたが，実際は，深層ルートの関与は少なく，多くの浅い層で得られた情報を集めて，アンサンブル効果により性能向上したと考えられる．
Gmailのメール送信者のガイドライン対応に不備があったらどうなるの？

gmail送信者ガイドラインへの対応方法はこの1ヶ月で多くの記事が出てきましたので、そちらを参考に。
今回は、対応に不備があった場合に何がおこるかと、不備の有無の確認方法についてについてまとめました。

## まとめ
- 2024年2月時点では、まだメールは届くよ。
- DMARCレポートは確認しようね。
- 2024年2月から対応不備の有無を計測しよう。
- 2024年4月からメールが届かなくなり始めるよ。
- 2024年6月までにはワンクリック配信停止も（必要なら）対応しようね。

## Googleが提示している今後のタイムライン
いつから影響出るかはGoogleから提示されています。
[What is the timeline for enforcement of sender guidelines |Google Workspace Help](https://support.google.com/a/answer/14229414?hl=en#zippy=%2Cwhat-is-the-timeline-for-enforcement-of-sender-guidelines)

- 2024年2月：ガイドラインの一般的な電子メール送信慣行に従う必要があります。
- 2024年2月：一括メール送信者はメール認証を含む強化された要件を満たさないメッセージの一部で、一時的なエラーが発生し始めます。
- 2024年4月：準拠していないメッセージは拒否され始めます。
- 2024年6月：プロモーションメールやコマーシャルメールはワンクリック配信停止を実装する必要があります。

## DMARCレポートの解析をまず始めましょう
DMARCのレポートの解析は早々に始めましょう。様々な不備に気づきやすくなります。
DMARCのDNSレコードにレポートの送信先を設定しましょう。複数宛先を設定可能です。

```
v=DMARC1; p=reject; rua=mailto:noc1@exmaple.com,mailto:noc2@exmaple.net,mailto:noc3@exmaple.net; ruf=mailto:noc1@exmaple.com,mailto:noc2@exmaple.net;
```

下記の2つを両方とも設定することをお勧めします。
- 自ドメインのメール宛に送ってレポートデータを取得・蓄積
- DMARCレポート解析サービス（１つもしくは複数）へ送る

　解析サービスは複数試用しましたが、無料で継続利用できるサービスでは、[Valimail monitor](https://www.valimail.com/products/monitor/)がおすすめです。また、cloudflareでドメインを管理している場合は無料のDMARC Managementも良いです。（cloudflareのEmail routing機能不使用でも利用できます。）
　有料ではより良いサービスが様々ありますので試してみてもいいと思います。

また、自分で取得したデータは、mxtooboxなどへアップすると解析することが可能です。
[DMARC Report Analyzer \- DMARC Email XML Parser \- MxToolbox](https://mxtoolbox.com/DmarcReportAnalyzer.aspx)

## 2024年2月から何が起こりますか？

何か設定に不備があった場合、一部のメールで一時エラーが発生します。エラーコードは4xxと考えられます。この場合、ほとんどのメール送信システムでは自動的に一定時間後リトライされて相手に届きます。
2月の時点では拒否されたり届かなくなることはないようです。
参考）[Gmail の SMTP に関するエラーとコード \- Google Workspace 管理者 ヘルプ](https://support.google.com/a/answer/3726730?hl=ja)

### 上記を踏まえて2024年1月中に行うべきこと

1月から行うべき事は、4xxエラーの発生頻度のモニタリングやメール配達遅延が起こっていないの確認です。
これらが2月になっても何も変化しない場合は、Googleの新しい送信ガイドラインに基本的に準拠できた（ワンクリック配信停止を除く）と考えていいでしょう。
もしもエラーや遅延の頻度が2月から急に増加した場合は、ガイドラインに準拠できていない箇所が残っている可能性があります。
また、googleのpostmaster toolsも必ず登録しておきましょう。gmailでの迷惑メール率やレピュテーションなど重要な指標が確認できます。
[Postmaster Tools を使ってみる \- Google Workspace 管理者 ヘルプ](https://support.google.com/a/answer/9981691?hl=ja&visit_id=638395997679564234-1559159120&rd=1)

### ワンクリック配信停止について
下記の記事などを参考に。他のルールより猶予期間が長いですが、忘れず対応しましょう。
[Gmailと米国Yahoo\!のあれ\(2024年2月\) \- /var/lib/azumakuniyuki](https://azumakuniyuki.hatenablog.com/entry/no-auth-no-entry-starting-from-feb-2024)
opencvでの画像の前処理からndarray変換を並列処理で高速化する。

# はじめに

## 自己紹介
　大学2年生で情報系の学科にいます。AIに興味があって、AIエンジニアのインターンをしたり、NLPの研究をちょっとしたりしています。もし記事に不備があればコメントで教えていただけると幸いです。

## 背景
　6万枚以上のtif画像から、データの前処理をする際に並列処理で高速化できないかなと思って調べながら実装してみました。

# 並列処理とは?
　非同期処理、並行処理、並列処理の3つはかなり混同しやすい概念ですが、参考文献[\[1\]](https://qiita.com/Toyo_m/items/992b0dcf765ad3082d0b)、[[2]](https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac)の記事がわかりやすいなと思ったので、並列処理自体の話は下記のサイトにお任せします。

# 実装
## pythonにおける並列処理の記述
 pythonで並列処理を記述するにはconcurrent.futuresとmultiprocessingの2つの標準ライブラリが使えます。今回はmultiprocessingを使用しており、concurrent.futuresには触れません。なお、multiprocessingを使用したのは、

 > そのため、IO関係での待ち時間が結構ある場合にはProcessを使ったほうが速くなるケースがある・・らしい。

と[\[1\]](https://qiita.com/Toyo_m/items/992b0dcf765ad3082d0b)に記載があったためです。今回は画像の読み込みが律速になりそうだったのでProcessを採用することに決めました。

## 並列で処理したい関数
　今回は単純化のために単なるresizeのみとしますが、仮に以下の関数の処理を並列化したいとします。わざわざimg_npでndarrayとして画像を保存していく目的はデータセットとして以後扱う際にデータサイズを落とす（画像のメタ情報を削ぎ落とす）ためです。
```python
def preprocess(img_paths: list[str]) -> None:
    img_np = np.empty((0, new_height, new_width))
    for path in img_paths:
        img = cv2.imread(path)
        img = cv2.resize(img, (new_width, new_height))
        img_np = np.vstack((img_arr, img))
```

## 並列処理のスクリプト
```python
import cv2
import numpy as np
from multiprocessing import shared_memory

def multiprocess_img_preprocess(img_paths, shared_mem_name, shape):
    existing_shm = shared_memory.SharedMemory(name=shared_mem_name)
    img_np = np.ndarray(shape, dtype=np.uint8, buffer=existing_shm.buf)

    for i, path in enumerate(img_paths):
        img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
        img = cv2.resize(img, (shape[2], shape[1]))
        img_np[i, :, :] = img

if __name__ == "__main__":
    img_paths = [] # 画像のパスのリスト
    height = # 画像の高さ
    width = # 画像の幅
    array_shape = (len(img_paths), height, width)
    shm = shared_memory.SharedMemory(create=True, size=np.prod(array_shape) * np.dtype(np.uint8).itemsize)
    images = np.ndarray(array_shape, dtype=np.uint8, buffer=shm.buf)

    p = Process(target=multiprocess_img_preprocess, args=(img_paths, shm.name, array_shape))
    p.start()
    p.join()


    images = np.ndarray(array_shape, dtype=np.uint8, buffer=shm.buf)

    # 共有メモリの解放
    shm.close()
    shm.unlink()
```

### 共有メモリの作成
```python
    array_shape = (len(img_paths), height, width)
    shm = shared_memory.SharedMemory(create=True, size=np.prod(array_shape) * np.dtype(np.uint8).itemsize)
    images = np.ndarray(array_shape, dtype=np.uint8, buffer=shm.buf)
```
並列処理するプロセス間でデータを共有するには、共有メモリを使う必要があります。multiprocessingにはValue, Array, RawValue, RawArrayという共有メモリ上でデータを保持するためのクラスが用意されています。しかしながらいずれのクラスにおいても[ctypes](https://docs.python.org/3/library/ctypes.html#module-ctypes)オブジェクトしか保持できません。ですので今回はshared_memory.SharedMemoryクラスを用いて適切な大きさのメモリを確保し、np.ndarrayのbuffer引数で行列を共有メモリ上に配置する形で実装しました。

 # 参考文献
 [\[1\]その並列処理待った！　「Python 並列処理」でググったあなたに捧ぐasync, threading, multiprocessingのざっくりとした説明](https://qiita.com/Toyo_m/items/992b0dcf765ad3082d0b)

 https://qiita.com/Toyo_m/items/992b0dcf765ad3082d0b

  [\[2\]Pythonの並列処理・並行処理をしっかり調べてみた](https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac)

https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac