OmniAICreator/Qiita-1.07M huggingface dataset:
複合リテラルによる構造体の初期化（C99 ～）


# 概要
C 言語で構造体を初期化する方法には、

- 一つずつ代入
- 複合リテラルを使う
- `memset()`

の三つがあるとのこと。

memset() では浮動小数点型やポインタ型のメンバに対して保証がないとのことなので、複合リテラルを使用する方法の検証を行った。

### Ref:
[構造体の全メンバを 0 で埋める | Programming Place Plus　Ｃ言語編　逆引き](https://programming-place.net/ppp/contents/c/rev_res/struct000.html#way2)

# 複合リテラル
## 複合リテラルとは
複合リテラルとは、構造体や配列のリテラルのこと。リテラルとは「値をソースコードなどにべた書きしたもの」なので、複合リテラルとは「構造体や配列の中身をソースコードにべた書きしたもの」となる。

C99 から追加された機能なので、C95 以前のコンパイラでは動かないとのこと。

## 記法
複合リテラルの記法は↓のカンジ。 
```C
(型名){数値}
```

0 で初期化する方法は↓の通り。
```C
typedef struct{
    int hoge;
    int fuga;
} piyo_t;

// ------------------

piyo_t foo;
foo = (piyo_t){0}; // 初期化.
```

## 追記（2024/7/3)
**変数は定義と同時に初期化しよう、ヨシ！**
コメント下さった方々、ありがとうございます :bow: 
```C
typedef struct{
    int hoge;
    int fuga;
} piyo_t;

// ------------------

piyo_t foo = (piyo_t){0}; // 初期化.
```

# 実施例
実際にやってみる。

```C
# include <stdio.h>
# include <string.h>


typedef struct {
    int first;
    double second;
    int *third;
} numbers_t;

void zero_set_memset(){
    numbers_t num;
    printf("-------case of memset------\n");
    
    memset(&num, 0, sizeof(numbers_t));
    printf("first: %d, second: %lf, third: %p\n", num.first, num.second, num.third);
    if(num.third == NULL){
        printf("num.third is NULL\n");
    }
}

void zero_set_fukugo_literal(){
    numbers_t num;
    printf("-------case of literal------\n");
    
    num = (numbers_t){0};
    printf("first: %d, second: %lf, third: %p\n", num.first, num.second, num.third);
    if(num.third == NULL){
        printf("num.third is NULL\n");
    }
}

// 追記（2024/7/3）.
// main() は int で定義するのが一般的.
void main(){

    zero_set_memset();

    printf("\n");

    zero_set_fukugo_literal();

}
```

実行すると↓のようになる。
```
hoge@fuga-VirtualBox:~/tmp$ gcc -o ./fukugo_liretal ./fukugo_literal.c 
hoge@fuga-VirtualBox:~/tmp$ ./fukugo_liretal 
-------case of memset------
first: 0, second: 0.000000, third: (nil)
num.third is NULL

-------case of literal------
first: 0, second: 0.000000, third: (nil)
num.third is NULL
hoge@fuga-VirtualBox:~/tmp$ 
```

複合リテラルでも問題なく初期化できることが確認できた。

# まとめ
構造体の初期化には、念のため複合リテラルを使用しよう、ヨシ！
Valgrind によるメモリリークチェックのメモ

# 概要
**Valgrind** というツールを使うことで、`malloc()` の `free()` 忘れによるメモリリークなどを防止できるとのこと。

このページでは、Valgrind の基本的な使用方法をメモする。

## Ref：
- [1] [新・標準プログラマーズライブラリ C言語 ポインタ完全制覇](https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-C%E8%A8%80%E8%AA%9E-%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87-%E5%89%8D%E6%A9%8B-%E5%92%8C%E5%BC%A5/dp/477419381X)

# メモリチェックとは？
## 動的メモリ確保とヒープメモリ
`malloc()` 関数などで動的にメモリを確保する時は、**ヒープ**という領域のメモリを使用する。
`malloc()` で確保したメモリは `free()` 関数で解放されるまで確保され続ける。そのため不用意に `malloc()` などを使いまくり、なおかつ `free()` をサボっていると、ヒープを圧迫し、最悪クラッシュしてしまう（らしい）。こうした `free()` 忘れを、**メモリリーク**という（とのこと）[[1]](https://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87-%E6%A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E5%89%8D%E6%A9%8B-%E5%92%8C%E5%BC%A5/dp/4774111422)。

## Valgrind によるメモリチェック
動的メモリ確保に関連するバグは、デバッグが非常に困難であるため、できるだけ避けたい。Linux 環境であれば、こうしたバグの解析に有用なツールである、**Valgrind** を使うことができる。Valgrind は、`malloc()` で確保した領域を超えた読み書き、メモリリーク、重複 `free()` などを検出してくれる[[1]](https://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87-%E6%A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E5%89%8D%E6%A9%8B-%E5%92%8C%E5%BC%A5/dp/4774111422)。

Valgrind は以下のように使用する。
```
$ Valgrind hoge
```
ここで `hoge` は、解析対象の実行バイナリである。

また、以下のコマンドを使用することで、より詳細な情報を取得できる。
```
--leak-check=full
```

なお解析対象の実行バイナリをビルドする際には、`-g`、`-O0` オプションを付けるべし。


# Valgrind の使用例
## 基本的な使い方
![Inkedvalgrind1_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124381/93ef6aac-ac09-6d13-7c04-518368856600.jpeg)


## HEAP SUMMARY の読み方
![valgrind2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124381/c7fa7838-4059-2f19-da8d-74b2b0b5d86c.png)

↑は `-g`, `-O0` オプションを付けてビルドした実行ファイルを、`--leak-check=full` オプションを付けて valgrind で解析した時に、HEAP SUMMARY の下に出てくる情報。
確定的な（？）解放漏れの箇所を教えてくれる。
例えば
```
hoge bytes in 1 blocks are definitely lost in loss record ~
	at ~~~~~~: fuga (in piyo.so)
	by ~~~~~~:
	by ~~~~~~:
	by ~~~~~~:main (foo.c :bar)
```
の場合、foo.c の bar 行目でメモリ解放漏れがあり、元をたどると piyo.so の fuga でメモリが確保されている、みたいな感じだと思う。たぶん。知らんけど。

# 注意
Valgrind を十全に活用するためには、実行バイナリにデバッグ情報がついていることが重要となる。また、最適化の度合いが深いと、デバッグに苦労する場合があるらしい。リンクさせるライブラリも含めて、ビルド時には `-g`、`-O0` オプションを忘れずにつけておきたい。

# まとめ
Valgrind を活用してメモリリークを予防しよう、ヨシ！
[Go / Echo] Middleware におけるエラーハンドリング時の注意点

## 前段
ミドルウェアのエラーログハンドリング周りの処理が複雑で、いくつか問題が発生していました。
その対処を行う過程で自分が得た知見を簡単にご紹介します。

## ミドルウェアの処理順序
まず Echo の Middleware における注意点は、その処理順序です。

仮に、A・B という Middleware があったとします。
それを、下記のように順に呼び出します。

```
echo := echo.New()
echo.Use(echo.MiddlewareFunc(middlewares.NewA()))
echo.Use(echo.MiddlewareFunc(middlewares.NewB()))
```
そして、上記 A・B のそれぞれの Middleware の中では下記のように処理しているとします。
```
func NewA() echo.MiddlewareFunc {
    return func(next echo.HandlerFunc) echo.HandlerFunc {
        return func(c echo.Context) error {
            fmt.Println(`A:before`)
            err := next(c)
            fmt.Println(`A:after`)
            return err
        }
    }
}

func NewB() echo.MiddlewareFunc {
    return func(next echo.HandlerFunc) echo.HandlerFunc {
        return func(c echo.Context) error {
            fmt.Println(`B:before`)
            err := next(c)
            fmt.Println(`B:after`)
            return err
        }
    }
}
```

そうしますと、出力結果は下記となります。
```
A:before
B:before
B:after
A:after
```

つまり、`next(c)`記述箇所の前後で処理が分けられ、入れ子構造のようになって順々に次の Middleware が呼ばれていくことになります。

```plantuml
A --> B
B --> A
```
なお単純化のために A・B の 2 つで書きましたが、更に複数の Middleware があれば、この階層はどんどん深くなっていきます。

（コチラの記事も参照ください：[Try Golang! EchoでオリジナルのMiddlewareを作ろう！](https://medium.com/veltra-engineering/echo-middleware-in-golang-90e1d301eb27)）

## *echo.HTTPError.Internal を活用して内部的なエラーを設定 & 取り出し
### 前段
DataDog の Trace 用パッケージである [dd-trace-go / func Middleware](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1@v1.65.1/contrib/labstack/echo.v4#Middleware) の処理中に下記のようなコメントがあります。
`// Any error that is not an *echo.HTTPError will be treated as an error with 500 status code.`

つまり上記メソッドの処理が実行されるタイミングでエラーを`*echo.HTTPError`型として定義しておかないと、全て 500 エラーとして返されてしまいます。

### 本題
上記対処のため、特定の Middleware 内の処理で [func echo.NewHTTPError](https://pkg.go.dev/github.com/labstack/echo/v4@v4.11.1#NewHTTPError) を用いてエラーを`*echo.HTTPError`型に変換してから return しているとします。
```
echo.NewHTTPError(400, error.Error())
```
引数には、ステータスコードと、エラー条件の値を渡しています。
しかし、これをすることで`error`情報を部分的に取り出したり別の情報を付加して返すことになるので、元々の`error`情報から"変質"してしまいます。

その対処として、[func (*HTTPError) SetInternal](https://pkg.go.dev/github.com/labstack/echo/v4@v4.11.1#HTTPError.SetInternal) を用いることができます。
```
echo.NewHTTPError(400, error.Error()).SetInternal(error)
```

上記により、元々あった`error`情報を内部的に保持することができますので、その後の Middleware で扱いやすくなります。

下記のように取り出すことができます。
```
error.Internal.Error()
```

## echo.Context / Error メソッドについての注意点
echo における [type Context](https://pkg.go.dev/github.com/labstack/echo/v4@v4.11.1#Context) の中に`Error(err error)`メソッドが存在し、下記のように説明があります。

```
// A side-effect of calling global error handler is that now Response has been committed (sent to the client) and
// middlewares up in chain can not change Response status code or Response body anymore.
```

つまりこのメソッドが呼ばれると、クライアントにエラーレスポンスを返してしまうので、以降は Midleware 内でエラー内容を変更することができなくなってしまいます。

`c`が`echo.Context`型だとして、実行は下記のようになります。
```
c.Error(error)
```
なおどのタイミングでこの実行を行うかは、上述の内容も踏まえた上での検討が必要です。

ここに至るまでに適切なエラーハンドリング処理を行なっていないと、例えばエラーステータスが全て 500 として返される、などといったことが起き得るので注意が必要です。

下記のようにレスポンスを取り出せます。
```
c.Response()
```
巨大なCSVファイルを開く色々な方法

## はじめに
Pythonで巨大なCSVファイルを作成する方法を前回紹介しました。

https://qiita.com/EveSquare/items/67552dbccb3a7c326703

今回は、巨大なCSVファイルを読み込む方法を紹介します。
FinderのクイックルックやVSCodeのプレビュー機能では、巨大なCSVファイルを開くことができません。
その場合は、以下の方法を試してください。

### 先頭から数行だけ読み込む

#### 1. `head`コマンドを使用する

`head`コマンドは、ファイルの先頭部分を表示するためのコマンドです。数行だけ見たい場合にはこれが便利です。

```bash
head -n 10 <CSVファイル名>.csv
```

このコマンドは、先頭10行を表示します。

![head-n10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/9c7a8abf-2169-1d9b-f2ea-74ada669fcae.png)

#### 2. `less`コマンドを使用する

`less`コマンドは、ファイルの内容をページ単位で閲覧するためのコマンドです。大きなファイルでも快適に閲覧できます。

```bash
less <CSVファイル名>.csv
```

`q`キーを押すと、`less`から抜けることができます。

![less.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/1b2e7f98-f04c-3eaa-36ec-bf52c0b4a6ad.png)

#### 3. Pythonを使用する

Pythonを使用してCSVファイルを開くこともできます。以下はPythonスクリプトの例です。

```python:main.py
import pandas as pd

# CSVファイルの最初の数行を読み込む
df = pd.read_csv('<CSVファイル名>.csv', nrows=10)
print(df)
```

このスクリプトは、`<CSVファイル名>.csv`の先頭10行を読み込み、それを表示します。Pythonスクリプトを実行するには、ターミナルで以下のコマンドを使用します。

```bash
python main.py
```

![python_line_number.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/0ea8bdc7-d38a-7ffb-358f-412165687e17.png)

### 特定の行を読み込む

特定の行を見る方法について説明します。以下に、特定の行を表示するためのいくつかの方法を紹介します。

### 1. `sed`コマンドを使用する

`sed`コマンドを使って、特定の行を表示できます。例えば、10行目を表示する場合は以下のようにします。

```bash
sed -n '10p' <CSVファイル名>.csv
```

![sed-n10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/c9ca7d60-f7c0-eddb-a08e-643100070555.png)

複数の特定の行を表示するには、カンマで範囲を指定します。例えば、10行目から20行目を表示する場合は以下のようにします。

```bash
sed -n '10,20p' <CSVファイル名>.csv
```

![awk10-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/1ba34c0e-7848-dbf6-3c10-a026f9510d4a.png)

### 2. `awk`コマンドを使用する

`awk`コマンドを使って、特定の行を表示することもできます。例えば、10行目を表示する場合は以下のようにします。

```bash
awk 'NR==10' <CSVファイル名>.csv
```

![awk10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/306bd113-4248-7e44-48ae-7ca32a4e2705.png)

10行目から20行目を表示する場合は以下のようにします。

```bash
awk 'NR>=10 && NR<=20' <CSVファイル名>.csv
```

![awk10-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/1ba34c0e-7848-dbf6-3c10-a026f9510d4a.png)

### 4. Pythonを使用する

Pythonを使用して、特定の行を表示することもできます。以下に例を示します。

```python:main.py
import pandas as pd

line_number = 10
df = pd.read_csv('<CSVファイル名>.csv', skiprows=line_number - 1, nrows=1)
print(df)
```

このスクリプトは、10行目を読み込み、それを表示します。

![python_line_number10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/64709d35-fc7b-c425-4ac6-b630897bfb99.png)

## さいごに
利用用途に合わせて利用してみてください
PostgreSQL: CSV ファイルの export と import

データベース　city
ユーザー  scott
とします。

## テーブルの状況

```text
$ psql -U scott city
psql (16.3 (Ubuntu 16.3-0ubuntu0.24.04.1), server 14.8 (Ubuntu 14.8-0ubuntu0.22.10.1))
Type "help" for help.

city=# select * from cities;
  id   |  name  | population |  date_mod  
-------+--------+------------+------------
 t3461 | 広島   |      25176 | 2003-09-24
 t3462 | 福山   |      47935 | 2003-05-15
 t3463 | 東広島 |      28654 | 2003-02-08
 t3464 | 呉     |      83152 | 2003-10-09
 t3465 | 尾道   |      42791 | 2003-08-04
 t3466 | 竹原   |      35687 | 2003-01-21
 t3467 | 三次   |      81296 | 2003-07-23
 t3468 | 大竹   |      21764 | 2003-10-26
 t3469 | 府中   |      75423 | 2003-12-15
(9 rows)

city=#
```

## export

```sql:export.sql
copy public.cities to '/tmp/cities.csv' with csv header force quote *;
```

実行コマンド

```bash
psql -U scott city < export.sql
```

実行結果

```text
$ psql -U scott city < export.sql
COPY 9
```

作成されたファイル

```text:/tmp/cities.csv
d,name,population,date_mod
"t3461","広島","25176","2003-09-24"
"t3462","福山","47935","2003-05-15"
"t3463","東広島","28654","2003-02-08"
"t3464","呉","83152","2003-10-09"
"t3465","尾道","42791","2003-08-04"
"t3466","竹原","35687","2003-01-21"
"t3467","三次","81296","2003-07-23"
"t3468","大竹","21764","2003-10-26"
"t3469","府中","75423","2003-12-15"
```

## テーブル内のデータを消去

```text
city=# delete from cities;
DELETE 9
```

消去されたことを確認

```text
city=# select * from cities;
 id | name | population | date_mod 
----+------+------------+----------
(0 rows)
```

## import

```sql:import.sql
copy public.cities from '/tmp/cities.csv' with csv header;
```

実行コマンド

```bash
psql -U scott city < import.sql
```

実行結果

```text
$ psql -U scott city < import.sql
COPY 9
```

結果の確認

```text
city=# select * from cities;
  id   |  name  | population |  date_mod  
-------+--------+------------+------------
 t3461 | 広島   |      25176 | 2003-09-24
 t3462 | 福山   |      47935 | 2003-05-15
 t3463 | 東広島 |      28654 | 2003-02-08
 t3464 | 呉     |      83152 | 2003-10-09
 t3465 | 尾道   |      42791 | 2003-08-04
 t3466 | 竹原   |      35687 | 2003-01-21
 t3467 | 三次   |      81296 | 2003-07-23
 t3468 | 大竹   |      21764 | 2003-10-26
 t3469 | 府中   |      75423 | 2003-12-15
(9 rows)
```

## テーブルの定義とコラムの順が異なる csv ファイルの入力

入力の csv ファイル

```text:/tmp/cities2.csv
id,name,date_mod,population
"t3461","広島","2003-09-24","25176"
"t3462","福山","2003-05-15","47935"
"t3463","東広島","2003-02-08","28654"
"t3464","呉","2003-10-09","83152"
"t3465","尾道","2003-08-04","42791"
"t3466","竹原","2003-01-21","35687"
"t3467","三次","2003-07-23","81296"
"t3468","大竹","2003-10-26","21764"
"t3469","府中","2003-12-15","15423"
```

```sql:import2.sql
COPY public.cities (id, name, date_mod, population)
from '/tmp/cities2.csv' with csv header;
```

実行コマンド

```bash
psql -U scott city < import2.sql
```
スプレッドシートの変更通知（メール）

# はじめに

スプレッドシートの内容が変更された場合にメールで通知することができるので、その機能を使ってみました。

詳細は以下の通りです。

https://support.google.com/docs/answer/14099459?hl=ja&ref_topic=9055295&sjid=7558174891442013989-AP

# 設定

スプレッドシートを開き`ツール`→`条件付き通知`を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/a4066038-a44d-b5a7-4840-13d10048d627.png)

ルールを設定します。
・どのセルが変更された場合に通知するか（特定の条件を満たした時に通知することもできます）
・通知先のメールアドレス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/8cd9f3b7-bfac-0567-8f04-c777b86d27ef.png)

複数のルール設定ができ、トリガーの成功・失敗なども確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/d4f8e3a6-00c2-0d12-1727-da285818708e.png)

# 実際に届いたメールの内容
変更してから実際にメールが届いたのは10分後でした。すぐに通知して欲しいといった用途では使えないかもしれないですが、便利です。同時に複数の変更があった場合は、内容をまとめたメールが届く場合もあるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/7a1bfb21-3d66-fb5a-7064-77a90359864c.png)
【PAD】該当機器にログイン後、キャプチャを取得する。

![スクリーンショット 2024-07-02 133305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/0d025ca5-4056-8616-e269-03d07d223a4e.png)
上記のPADを作成すると、NW機器にログイン後該当箇所のキャプチャを取得する。

下記のバッチとVBAを必要とする。

●VBA
https://qiita.com/lyusan/items/51bdfb15ec931ebd829e

●ファイル名の変更
https://qiita.com/lyusan/items/44abadf383138a6a501a

●ファイル移動
https://qiita.com/lyusan/items/e147a7495f2f9bc3a754
型アサーションよりユーザー定義型ガードを。

## 型ガード
型ガードとは`if(typeof value === 'string')`のように型による条件分岐や`in`演算子などによってブロック内の型を絞り込む機能のことです。

この絞り込み部分を実装者（ユーザー）が関数の形で作成して、型ガードとして利用するのがユーザー定義型ガードです。
## ユーザー定義型ガード
ユーザー定義型ガードは、関数が`true`を返したときに、その引数として渡した変数の型をユーザーが設定した型として扱う機能です。
`as`による型アサーションによっても変数の型を別の型として扱うことはできますが、ユーザーの設定した型が正しいものであるかを関数で検証する点で型アサーションと異なっています。

`as`による型アサーションや`any`型と同様にTypeScriptの型安全性を破壊しうる危険な機能ではありますが、確認すべき範囲が`as`や`any`に比べて狭く、関数の中に限定されることから、これらの機能をやむを得ず使用する場合にはユーザー定義型ガードの使用が推奨されています。
## `引数 is 型`によるユーザー定義型ガード
関数によって型の絞り込みを行いたい場合には、ユーザー定義型ガードが使用できます。
とくに、`unknown`型の値を扱うのに便利な機能となっています。

引数が数値か文字列の場合に`true`を返す、以下のようなコードを考えてみます。
```ts
function isNumberOrString(value: unknown){
  return typeof value === 'number' || typeof value === 'string' 
}

const value: unknown = "314"
if(isNumberOrString(value)){
    //'value' is of type 'unknown'.(18046)
    console.log(value.toString())
}
```
上のコード例のように関数による型の条件分岐を行なっても、型の絞り込みが認識されずに型エラーとなってしまいます。
そこで、以下のように`value is string | number`とつけることで、関数が`true`を返した場合にはコンパイラに`value`は`string | number`型であると認識させることができます。
ここの実装を間違えると誤った型をコンパイラが認識したままの状態になり、型安全性が損なわれるので注意が必要です。
```ts
function isNumberOrString(value: unknown): value is string | number {
  return typeof value === 'number' || typeof value === 'string' 
}

const value: unknown = "314"
if(isNumberOrString(value)){
    //const value: string | number
    console.log(value.toString())// 314
}
```
## `asserts 引数 is 型`によるユーザー定義型ガード
関数が例外を投げて終了しない可能性がある場合には、`asserts 引数 is 型`の構文によるユーザー定義型ガードが使えます。
こちらは関数が`true`を返した場合に型を強制するのではなく、関数が最後の処理まで到達した場合に型を強制します。
```ts
function isNumber(value: unknown): asserts value is number {
  if (typeof value !== 'number') {
    throw new Error()
  }
  return;
}

const value: unknown = 314
try {
  // const value: unknown
  console.log(value)// 314

  isNumber(value)

  //const value: number
  console.log(value.toString(16))//　"13a" 
} catch (error) {
  console.log('error occurred')
}
```
`try`ブロック内では`isNumber`以降の箇所での`value`の型が`number`型として扱われています。
ユーザーが「`isNumber`が正常終了しているのならば`value`の型は`number`型である」と保証しているわけですが、ここの保証の部分、つまりユーザー定義型ガードの実装に誤りがあると型安全性は大きく損なわれてしまうため、慎重に使用する必要があります。
`any`や型アサーションに比べると、ユーザーが責任を負うべき箇所が明確なので、やむを得ない場合にはユーザー定義型ガードの使用を先に検討することが推奨されているわけですね。
開発生産性カンファレンスの参加セッションの発表資料のまとめ

開発生産性カンファレンスの２日目に参加しました。
参加したセッションの発表資料をまとめて残しました。

# 参加セッションの資料と参加録


## LeanとDevOpsのためにE2Eテストができること
https://speakerdeck.com/magicpod/leantodevopsnotamenie2etesutogadekirukoto

## 組織横断支援チームによるFour Keys計測基盤の構築と活用に向けた取り組み
https://www.docswell.com/s/r4mimu/KEN6J6-2024-06-29-164917?utm_source=twitter&utm_medium=social&utm_campaign=singlepage

## Metrics-informed development; theory and practice
[atalog.us-east-1.prod.workshops.aws/event/dashboard/en-US](https://speakerdeck.com/findyinc/mastering-developer-experience-a-roadmap-for-success-kai-fa-sheng-chan-xing-conference-2024)


## 「開発生産性を上げる改善」って儲かるの？に答えられるようにする
https://speakerdeck.com/i35_267/is-development-productivity-profitable

## アーキテクチャレベルで考える開発生産性
https://speakerdeck.com/minodriven/architecture-and-productivity

## freeeにおけるスモールスタートを意識した開発生産性向上の実践事例
https://speakerdeck.com/hikarumiyazawa/small-start-conscious-development-productivity-improvement-practices-at-freee

## 開発生産性の観点から考える自動テスト
https://speakerdeck.com/twada/automated-test-knowledge-from-savanna-202406-findy-dev-prod-con-edition
angularのV17アップデートについて

初めまして！
普段はしがないSESとしてフロント業務を行っているタンクと申します。

初めての投稿で分かりにくい文章があるかと思いますが、angularを触っていた案件で学んだことをアウトプットしていければなぁと思います。当記事はangularというよりangular materialの記述に比重が偏っています。
なぜかって？・・・レイアウト修正に苦労してその分メッチャ調べたからです・・・

# angular V17のアップデートについて

angularのバージョンをv17以降にアップする作業について、以下の公式サイトに則って作業をする必要があるかと思います。

https://angular.dev/update-guide

しかし現実には、上記サイトに取っている対応だけではどうにもならない問題があると思います。

angular v17以前からv17にバージョンアップした場合、すぐに気づくと思いますが、v17は以前のバージョンより結構変わっていると思います。

https://zenn.dev/suhyoenbae/articles/935db133ed58b8

上記リンクに色々と書かれていますが、私がいた現場で行った対応のほとんどが
```
*ngIf → @if
*ngSwitch → @switch
*ngFor → @for
```
とかでした。
また、現場によっては明示的に処理を記載していない現場も多い事でしょう。そんな現場ではv17にした途端、ビルドエラーが発生するはずです。
どうやらangular V17に至るまでのバージョンで明示的ではないコードに対してビルドエラーが発生するようになるとの事です。もしそうなっている場合、明示的に処理を変更する必要があるかと思います。
# angular material V17について
レイアウトでangular materialを使用しているプロジェクトでは今回のバージョンアップでレイアウトが木端微塵に破壊されている事に絶望するかもしれません。

なぜこのような事態になっているのか？
それは、angular materialで使用しているmat-dialogが勝手にmat-mdc-dialogに代わっているからです。

mdcとは「material component web」の略称で、以前のangularでは適応されていなかったコンポーネントです。
この変更のおかげで開発者ツールから適応されているCSSを探そうにも、以前のバージョンと違い、大量の意図しないCSSが20個～30個ぐらい適応されていて本当に修正する箇所がどこなのか分からなくなっているはずです。この場合、以下のいずれかの修正方法を行ってください

## 【方法１：機能に適応されているCSSの要素内にいらないCSS設定を打ち消すセレクターを追加する】
・この方法で作業をする場合、まず悪さをしているmdc由来のセレクターを探します。見つけたセレクターの名前を修正したい機能に適応されているCSSファイルに記載して、スタイルを打ち消す構文を書く方法です。提示している修正方法の中で一番被害が少なく、かつ安全な作業です

## 【方法2：style.cssとかが記載されてる共通部品に対して、適応されているmdc由来のセレクターを追加して打ち消す】
・この方法は全ファイルで共有されているcssを書き換えることになるのでお勧めはしません。
しかし、修正するレイアウトによっては共通のcssファイルを参照しているものも多いと思います。その場合は他の意図しない機能にスタイルの変更が適応されていないか確認しつつ修正する必要があります。(この修正を行ったことによる横確認に時間を費やすので注意してください)

## 【方法3：style.cssに記載されてる共通部品に対して、適応されているmdc由来の設定を強制的に追加して打ち消す】
・この方法はcssのスタイル適応を強制するためのものなのでおススメはできません。現場でも(コードに詳しくない人がいない環境を除いて)反対される対応なので、それ相応の理由がある場合にのみ、この方法を試してみてください。
この方法はmdc由来の処理が要らない場合、機能のcssファイルに対して、! importantやng-deepを使ってスタイルを強制する方法です。特にng-deepはangular公式から非推奨らしいので使用には十分に注意する事。
オーバーライドとオーバーロードの例

C#には、オーバーライド（Override）とオーバーロード（Overload）という重要な概念があります。これらは、メソッドの定義や使用に関する異なる技法であり、正しく理解することでコードの柔軟性と再利用性を向上させることができます。

:::note info
勿論本内容はC#限定ではありませんが、今回は私のC#でのまとめとして投稿いたします
:::

### 目次

1. オーバーライド（Override）の概念と例
2. オーバーロード（Overload）の概念と例
3. オーバーライドとオーバーロードの使い分け
4. まとめ

### 1. オーバーライド（Override）の概念と例

オーバーライドは、基底クラス（スーパークラス）のメソッドを派生クラス（サブクラス）で再定義することです。これにより、基底クラスのメソッドを派生クラスで特定の動作に変更できます。

**特長:**

- 同じ名前、同じ引数、同じ戻り値の型でメソッドを再定義する。
- 継承関係にあるクラス間で行われる。
- 基底クラスのメソッドを上書きして、新しい動作を定義する。

**例:**

基底クラス：

```c#
public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Some generic animal sound");
    }
}
```

派生クラスでオーバーライド：

```c#
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Animal myDog = new Dog();
        myDog.MakeSound(); // 出力: "Bark"
    }
}
```

### 2. オーバーロード（Overload）の概念と例

オーバーロードは、同じクラス内で同じ名前のメソッドを複数定義することです。ただし、引数の数や型が異なる必要があります。これにより、同じメソッド名で異なる動作を実現できます。

**特長:**

- 同じ名前のメソッドを異なる引数リストで定義する。
- 同じクラス内で行われる。
- メソッドの引数リストによって異なる動作を実行する。

**例:**

```c#
public class MathOperations
{
    public int Calculate(int a, int b)
    {
        return a + b;
    }

    public double Calculate(double a, double b)
    {
        return a + b;
    }

    public int Calculate(int a, int b, int c)
    {
        return a + b + c;
    }
}

class Program
{
    static void Main(string[] args)
    {
        MathOperations math = new MathOperations();
        Console.WriteLine(math.Calculate(5, 3)); // 出力: 8
        Console.WriteLine(math.Calculate(5.5, 3.2)); // 出力: 8.7
        Console.WriteLine(math.Calculate(5, 3, 2)); // 出力: 10
    }
}
```

### 3. オーバーライドとオーバーロードの使い分け

**オーバーライドを使う場合：**

- 継承関係にあるクラスで、基底クラスのメソッドの動作を変更したいとき。
- 基底クラスの汎用的なメソッドを、派生クラスで具体的な動作に変更する場合。

**オーバーロードを使う場合：**

- 同じクラス内で、同じメソッド名を使って異なる引数リストに応じた動作を定義したいとき。
- メソッドの引数の数や型に応じて、異なる処理を行いたい場合。

### まとめ

オーバーライドとオーバーロードは、メソッドの多態性を実現するための重要な概念です。オーバーライドは継承関係にあるクラスでメソッドを再定義することを指し、オーバーロードは同じクラス内で引数の数や型が異なるメソッドを複数定義することを指します。これらの概念を正しく理解し、適切に使い分けることで、柔軟で保守性の高いコードを書くことができます。

C#の具体例を通じて、オーバーライドとオーバーロードの違いを理解できたと思います。これらの手法を活用して、コードの可読性と再利用性を向上を目指します。
MySQLでデータ以外の構造情報をダンプする

次の方法はいずれも適切な権限を持っていない場合、実行途中でエラーとなるので注意すること。

## 方法1: 一つだけのデータベースの場合

```shell
mysqldump <your_database_name> \
--skip-lock-tables --no-data \
--triggers \
--events   \
--routines \
--skip-add-drop-table \
--skip-add-drop-trigger
```

出力されるSQLにはデータベースの指定はないため、 `mysql` コマンドでインポートする場合には明示的にデータベース名を指定する必要がある。

エクスポート元とインポート元のデータベース名に違うものを使用したい場合に便利。


## 方法2: 複数のデータベースの場合

```shell
mysqldump --databases <your_database_name1> <your_database_name2> \
--skip-lock-tables --no-data \
--triggers \
--events   \
--routines \
--skip-add-drop-table \
--skip-add-drop-trigger
```

出力されるSQLにはデータベース名が記録される(`USE <your_database_name1>`, `CREATE DATABASE`)ため、 `mysql` コマンドでインポートする場合には、エクスポート元のデータベース名がそのまま使用される。


## 参考

### 公式ドキュメント

https://dev.mysql.com/doc/refman/8.4/en/mysqldump.html
Rustlingsを遊んでみた感想とか


https://github.com/rust-lang/rustlings/

導入方法は上記のとおりです

わたしはWindows環境で、Rust環境はインストール済みであったため、
https://github.com/rust-lang/rustlings/?tab=readme-ov-file#windows
をコピペして、無事インストールできました


# 始める

https://github.com/rust-lang/rustlings/?tab=readme-ov-file#doing-exercises

```
rustlings watch
```

インストールが終わると、`rustlings watch`コマンドで、エクササイズを確認できます

すると、1回目は以下のような出力が出てきます
最近のプログラミング関係は、Astroとかもそうですが、CUIで遊び心がいっぱいですね

```
Progress: [------------------------------------------------------------] 0/96 (0.0 %)            ✓ Successfully ran exercises/intro/intro1.rs!

🎉 🎉  The code is compiling! 🎉 🎉

Output:
====================
Hello and
       welcome to...
                 _   _ _
  _ __ _   _ ___| |_| (_)_ __   __ _ ___  
 | '__| | | / __| __| | | '_ \ / _` / __| 
 | |  | |_| \__ \ |_| | | | | | (_| \__ \ 
 |_|   \__,_|___/\__|_|_|_| |_|\__, |___/ 
                               |___/      

This exercise compiles successfully. The remaining exercises contain a compiler
or logic error. The central concept behind Rustlings is to fix these errors and
solve the exercises. Good luck!

The source for this exercise is in `exercises/intro/intro1.rs`. Have a look!
Going forward, the source of the exercises will always be in the success/failure output.

If you want to use rust-analyzer, Rust's LSP implementation, make sure your editor is set        
up, and then run `rustlings lsp` before continuing.

====================

You can keep working on this exercise,
or jump into the next one by removing the `I AM NOT DONE` comment:

14 |  // hint.
15 |
16 |  // I AM NOT DONE
17 |
18 |  fn main() {
Welcome to watch mode! You can type 'help' to get an overview of the commands you can use here.  
```

:::note info
このエクササイズはうまく動くぜ。残りのエクササイズはコンパイルエラーとかロジックエラーがあるから、見つけて直してね！

このエクササイズのソースコードは`exercises/intro/intro1.rs`にあるから見てみてね！
:::

みたいなことが書いてあります

後、`rustlings watch`で表示している状態で、エクササイズのソースコードを書き換えると、変更が反映されます（出力がリロードされる）

適当にprintln!で表示しているメッセージを変えてみたり、コンパイルエラーを仕込んだりして、挙動を確認してみました


さて、で、`exercises/intro/intro2.rs`から実際の作業を開始します

```
// intro2.rs
//
// Make the code print a greeting to the world.
//
// Execute `rustlings hint intro2` or use the `hint` watch subcommand for a
// hint.

// I AM NOT DONE

fn main() {
    println!("Hello {}!");
}

```

これを以下のように変更して、

```diff
-    println!("Hello {}!");
+    println!("Hello {}!", "World!");
```

以下の通り、出力結果を得られました
エクササイズはこれの繰り返しのようです

```
Output:
====================
Hello World!!

====================
```

エクササイズが終わったら、コメント文の`// I AM NOT DONE`を削除します
すると、`watch`出力が次のエクササイズへと移行します


# まとめ

RustlingsをOptions付近まで遊んでみました

まだまだRustについての知見がないため、だいぶてこずったところが多かったです

ですが、ライブラリの使い方がわからない、ライブラリのメソッドに何があるかわからないという状態が多く、ここら辺は慣れでなんとかなるかなと思いました

開発環境、勉強環境とも充実しており、とっつきやすい言語だなという印象です

これから心がけることは

- Rustを書くのに慣れるため、Exampleを実際に入力していく練習をする
- ライブラリのリファレンスの調べ方を身につける

以上です
IBM i Services Directory : QSYS2.IFS_Object_Lock_Info 表関数

IFSオブジェクトをロックしているジョブの情報を表示します。

## 概要
■表関数名：QSYS2.IFS_OBJECT_LOCK_INFO
■カテゴリ：Javaサービス
■サポート：IBM i 7.3 SF99703 Level 16以降
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-ifs-object-lock-info-table-function

## 使用例

```
SELECT * FROM TABLE(QSYS2.IFS_OBJECT_LOCK_INFO(PATH_NAME => '/home/GOMA/test.txt'))
```

実行例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/6322d675-9c9a-c7dd-7585-0aabe363d61c.png)

JOB_NAMEに表示されているジョブは、5250からEDTFコマンドでIFSのテキストファイルを編集しているジョブです。

3カラム目以降を見ると、このジョブがI/Oした件数も取得できるようです。マニュアル記載を見ると下記になっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7a1bbbf9-7a78-1878-c4a8-2f59405b1a96.png)

5250のEDTF画面でいくつか操作してみましょう。

### 元の状態

TEST.TXTの中身は下記のような内容です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1d7478ce-fd39-e75e-c898-3542fb0ac4ba.png)

下記のように1行変更してPF2キーで保管します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/cb432fe0-93f4-c4bf-2abc-87c61a968544.png)

再度、IFS_Object_Lock_Infoをselectすると、、


テストの仕方が良くないのか、上手く値が上がりませんでした。。。

それとこちらはバグ？値が全く帰らないことが頻発しました…(IBM i 7.4, 7.5で）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f0e69723-699c-4965-940c-56ffcba3720d.png)

調べてみたいと思います。。
mysqlのロール

# アカウントを作成
```
mysql> create user mou@<ipアドレス> identified by '<パスワード>';
Query OK, 0 rows affected (0.02 sec)
```
```
mysql> select user,host from mysql.user
    -> ;
+------------------+---------------+
| user             | host          |
+------------------+---------------+
| mou              | %             |
| mou              |<ipアドレス>     |
| mysql.infoschema | localhost     |
| mysql.session    | localhost     |
| mysql.sys        | localhost     |
| root             | localhost     |
+------------------+---------------+
6 rows in set (0.00 sec)
```
```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample_development |
| sys                |
+--------------------+
5 rows in set (0.01 sec)
```
# 作成したユーザーでmysqlにログイン
```
mysql -u mou -p -h <ipアドレス>
```

# ロールを作成
```
create role app_dev;
grant all on sample_development.* to app_dev;
```
### 気づき
app_devと言うロールにsample_developmentのデータベースの全権をつける

# 作成したロールを確認
```
mysql> show grants for app_dev;
+-----------------------------------------------------------------+
| Grants for app_dev@%                                            |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_dev`@`%`                             |
| GRANT ALL PRIVILEGES ON `sample_development`.* TO `app_dev`@`%` |
+-----------------------------------------------------------------+
2 rows in set (0.00 sec)
```
# アカウントにロールを付与する
```
grant app_dev to 'mou'@'<ipアドレス>'
```
# アカウントのロールを確認
```
myql> show grants for 'mou'@'<ipアドレス>';
+----------------------------------------------+
| Grants for mou@<ipアドレス>                 |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `mou`@`<ipアドレス>`      |
| GRANT `app_dev`@`%` TO `mou`@`<ipアドレス>`     |
+----------------------------------------------+
2 rows in set (0.00 sec)
```
# ロールを有効にする
```
set role app_dev;
set defalt role app_dev to 'mou'@'<ipアドレス>'
```
### 気づき
set roleをだけだとmysqlを再起動すると無効になる

# 出典
https://www.shoeisha.co.jp/book/detail/9784798161488

# 感想
内容がうろ覚えだがこれでできたような気がする。
このような流れでアクセスできた。
mysqlポートを開く方法は思い出すことができない。いつの間にかできた。
Proxy下でDefault Embeddingsによるchromadb.HttpClient実行

# 問題概要
Proxy内でEmbeddings算出のため、chromadbを使用したい。Default Embedding FunctionによりEmbeddingsを算出したいが、
https://chroma-onnx-models.s3.amazonaws.com/
にアクセスできないエラーとなる。また、
us-api.i.posthog.com
へのアクセスもできないためこちらもエラーとなる。

# 背景情報
## ネットワーク環境
* proxy環境下でコンテンツフィルターがあり、us-api.i.posthog.com、chroma-onnx-models.s3.amazonaws.comへのアクセスが禁止されている。
## 実行環境
* Ubuntu
* Python 3.12.3
* chromadb version 0.5.3

# 解決策の概要

https://chroma-onnx-models.s3.amazonaws.com/all-MiniLM-L6-v2/
からonnx.tar.gzを取得し、以下にコピーする。
```
~/.cache/chroma/onnx_models/all-MiniLM-L6-v2/
```
上記フォルダでtar xzf onnx.tar.gzなどとして展開すると、
```
~/.cache/chroma/onnx_models/all-MiniLM-L6-v2/onnx
```
に必要なファイル群が配置される。
またHttpClientを作成するときに、Settingsでanonymized_telemetryをFalseにする。
```
import chromadb
from chromadb.config import Settings

config_settings = Settings(anonymized_telemetry=False)
chroma_client = chromadb.HttpClient(host='xxx.xxx.xxx.xxx', port=xxxx, settings=config_settings)
collection = chroma_client.get_or_create_collection(name="my_collection")
```
# 手順
* posthogへの対策を実施してchromaサーバーを所定のホスト、ポートで起動しておく。
* クライアント側でpip install chromadbをして、pythonプログラムを作成する。onnx.tar.gzの措置とanonymized_telemetryの措置を実施しておく。
* 続きは、お好きなように。HttpClient経由で、collectionにたいしてquery/addなどできます。

# 結果
Proxy下でもchromadbを使用したdefault embedding functionでEmbeddingsを算出したりaddしたりできました。
次は独自のembedding functionを使用して使うことを検討します。
ev3devでpipが使えたんですの！？

ev3devでpipコマンドが使いたいなと思ったことがあります~~よね~~。
しかし、通常のDebianのように`apt install`でインストールしようとしてもpipは素直にインストールできません。apt内に登録されていないんですね。

前提としてev3dev導入済みでWifiドングルを使ってネットが使える状態とします。

# 手動インストール
早速インストールしていましょう。pipを入れる別の方法として`get-pip.py`を使っていきます。

ev3devに標準搭載されているPythonのバージョンは`3.5`です。

:::note
もしあなたがPython`3.5`以外を使っている猛者だったら、下のサイトからご自身のバージョンにあったものを選んでください。（バージョンを変える方法教えてください）

https://bootstrap.pypa.io/pip/
:::

実際にやることは以下のコマンドを実行するのみです。
ev3devにSSH接続して以下のコマンドを実行します。

ev3devのVSCode拡張機能を使っているのであればロボットのメニューから「Open SSH Terminal」で開くことができるはずです。
```bash
$ wget https://bootstrap.pypa.io/pip/3.5/get-pip.py
$ python3 get-pip.py
```
これにてpipコマンドの導入は完了です。
# 使ってみる
実際にpipから`numpy`をインストールしてみます。
```bash
$ pip3 install numpy
```
はい、ターミナルに何も変化がないですね。これはev3devのスペックだとpipコマンドが死ぬほど重いことが原因です。
しばらく待てば、インストールの進捗が表示され始めじわじわと進んだ後、インストールが完了します。

# 代替案
結局pipでは不便すぎるので、代替案を書きます。どちらも標準でインストールされている方法です。どちらもまあまあな速度は出るので、実用上問題ないです。
## apt
安定した選択肢だと思います。下手に怪しいことするぐらいならaptを使ってやりましょう。
```bash
$ sudo apt install python3-numpy
```
## easy_install3
古代のPythonライブラリインストールツールです。今では非推奨ですが、ev3devでは選択肢になると思います。
```bash
$ sudo easy_install3 numpy
```

# 参考文献

https://wellknowledge.org/linux-pip/

https://github.com/ev3dev/ev3dev/issues/1273

https://nullhacker.hatenablog.com/entry/20100820/1282236244
【Word】ダミーテキストを出す（隠し機能）


## rand()

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/69edc4b8-bf05-96cb-6cd7-22bb308807f2.png)


Wordで`=rand()`を打ち込んでEnterを押すと……。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/80505540-1567-f9bc-63b3-fe5a7dfab690.png)

日本語のWordの説明文が表示されます。
これは、いわゆるダミーテキストです。
レイアウトなどを確認するときに、長い文章を気軽に出すことができるんですね！

ちなみに引数で、段落数を指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/464425ef-5846-1ed4-5f42-a61ccc0620b2.png)


## lorem()
同じように、`=lorem()`と打ち込んでエンターを押すと……。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/26e91bcb-dfe9-fd14-d0a1-1a55b338c3be.png)

Lorem ipsumが表示されます。ラテン語のダミーテキストです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/3e8a7f54-d8f0-fa6b-7fd0-48421e72b4b5.png)

古代ローマの哲学者キケロの著作からということです。
日本の古典みたいな感じなのかもしれない。

https://ja.wikipedia.org/wiki/Lorem_ipsum

Excelならいざ知らず、Wordで関数を使ったことがなかったのでこういう関数を使えることを知って驚きました。
これらは、Wordの隠し機能のようですね。

https://techcommunity.microsoft.com/t5/microsoft-365/rand-in-word/m-p/325554

# いろいろなフォントのダミーテキスト

私にとってはダミーテキストでぱっと浮かぶのが「あのイーハトーヴォの～」であります。

>あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。

https://www.aozora.gr.jp/cards/000081/files/1935_19925.html

Undertaleの非日本語訳で、演出として使われていたので脳に焼き付いたんですが、Macでフォントを追加する時に表示されるそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/f34ba0b9-23f1-0d11-2dcb-736fd66623ff.png)

フォントから、パソコンに入っているフォントを眺めることができます。
どういう文章でサンプルを表示しているのかにもフォントの個性が出ますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439672/7ef307bb-a4da-40a3-10fb-75511b6f0cc1.png)


「大きくなったら、僕はペンギンを飼いたい」など、意味ありげな文字列には、何か元ネタがあるのだろうか？
独自のもののようで、古典などからの引用ではないようです。フォントを作ったら自分で決められるのかな。
風景、動物ネタが多い。

## 余談：メタ構文変数

プログラマーはよく意味のない文字列として、`abcd`とか`hogehoge(日本)`とかを説明に使いますが、これにも名前があります。メタ構文変数というそうです。

https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0

# 参考

こちらの記事がべらぼうに面白いです。

https://apricot-design.com/staffblog/staffblog-17667/
AWS RDS - DBクラスタ / インスタンスをTerraform管理下から外す ->  import するコマンド例

# DBクラスタ


Terraform管理下から外す

```
terraform state list
terraform state rm aws_rds_cluster.default
```

既存のDBクラスタを import して Terraform 管理下に置く


```
terraform import aws_rds_cluster.default <DBクラスタ識別子>
```

# DBインスタンス

Terraform管理下から外す

```
terraform state list
terraform state rm aws_rds_cluster_instance.default
```

既存のDBインスタンスを import して Terraform 管理下に置く

```
 terraform import aws_rds_cluster_instance.default <DBインスタンス識別子>
```
Javaの利用状況についてのトレンドを知ろう！「 Javaエコシステムの現状」レポート概説 (2024年版)

# 「Javaエコシステムの現状」レポートとは？
「<strong>Javaエコシステムの現状（State of the Java Ecosystem Report）</strong>」レポートは、ITシステムにおけるJavaの利用状況についての調査結果をまとめたもので、New Relicが概ね年次で公開しているものです。日本を含む全世界のJavaの利用に関するトレンドが把握できるものになっています。

2022年, 2023年もレポートが公開されていますが、なんと2024年のレポートはユーザー登録なく見ることができます！

今回は、2024年のJavaエコシステムの現状から読み取れる動向についてざっくり解説していきます！！ 詳細はレポート本体👇をご覧ください。

:::note info
[「2024年 Javaエコシステムの現状」レポートはこちらから
](https://newrelic.com/jp/resources/report/2024-state-of-the-java-ecosystem-jp)
:::

※なお、本レポートのデータはNew RelicのエージェントをJavaのアプリケーションに導入している環境に関するものであり、すべてのシステムを対象にしているわけではありません。

# Java 17/21の割合が増加、新しいバージョンほど導入スピードが早い
下図は年別のJavaバージョンごとの導入割合ですが、2023年はまだJava11の割合が大きかったものの、2024年はJava 17（約35%）が最も多く、21も増えてきています。

過去のバージョンに比べて新しいバージョンは採用スピードが早いようです。

現在、約35%のアプリケーションで利用されている<strong>Java 17は、1年間で約300%の成長率</strong>で導入が伸びましたが、Java 11がそこまで導入されるまでには何年もかかりました。

また、Java 21はリリース後6ヶ月の利用率は1.7%とまだ低いものの、Java 17の時は同じ期間で0.37%だったので、<strong>新しいバージョンへの移行のスピードが早まっている</strong>ことが伺えます。

構築やアップデートのしやすいコンテナのような技術を使っているところほど、新しいバージョンを利用している/利用しやすい傾向があり、それが導入スピードを加速する要因になっているということが言えるかもしれません。

![1_nr_chart_long_term_support.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/4b531f91-8819-6ece-acd5-d0e13db24e7e.png)


# 平均的な割り当てコア数は減少傾向
下図はJavaのアプリケーションに割り当てられているプロセッサ（コア）数を表しているものですが、若干ではあるものの、<strong>コア数の割り当てが全体的に少なくなっている</strong>傾向がみられます。

これはクラウド移行やリアーキテクト、マイクロサービス化などによって、大量のコアを必要とするモノリシックで重厚長大なアプリケーションの割合が減り、コンテナで動く軽量のマイクロサービスが増加傾向にあるということが言えるかもしれません。

![2_nr_chart_logical_processors.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/02dab3c5-d1d4-bd19-d8d7-4cc6d64ef40a.png)


# 最も多く使われているログライブラリはLog4j
下図はアプリケーションが利用しているログライブラリの割合です。かなりのアプリケーションでLog4jが使われていることが伺えます。なるほど。

![3_nr_chart_popular_logging_frameworks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/096751d0-8a7e-f051-337d-6ef2f60a377e.png)


# まとめ
今回は2024年度版の「Javaエコシステムの現状」からいくつかのトピックを抜粋してご紹介しました。よく利用されているJavaのバージョンや関連ライブラリが何か、またそれを後押しする市場動向・技術動向との関係が透けて見えるのは非常に興味深いです。Javaを利用されている方は自社の環境と比較してみると面白いかもしれません。

「Javaエコシステムの現状」レポート本体には今回ご紹介したもの以外に以下のようなトピックが含まれています。是非ご覧ください。
- <strong>よく利用されているJDK</strong>
- <strong>よく利用されているGC</strong>
- <strong>よく利用されている暗号化用ライブラリ</strong>
- <strong>よく利用されているDBMS</strong>
- <strong>アプリケーションに割り当てられるメモリ量の分布</strong>
- <strong>Javaアプリケーションの観測に関するFAQ</strong>




来年のJavaエコシステムはどのような変化が起きているでしょうか。ではまた来年👋

:::note info
[「2024年 Javaエコシステムの現状」レポートはこちらから
](https://newrelic.com/jp/resources/report/2024-state-of-the-java-ecosystem-jp)

[「2023年 Javaエコシステムの現状」レポートはこちらから
](https://newrelic.com/jp/resources/report/2023-state-of-the-java-ecosystem-jp)

[「2022年 Javaエコシステムの現状」レポートはこちらから
](https://newrelic.com/jp/resources/report/2022-state-of-java-ecosystem)
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
googleMapのurlから住所を取得するpythonコード

nominatimというものが使えるらしいです。
以下ソースコードです。

```python
import requests
import json

def urara(url):
  url_split = url.split('?q=')[1].split(',')
  latitude = url_split[0]
  longitude =url_split[1]
  url = f'https://nominatim.openstreetmap.org/reverse?format=json&lat={latitude}&lon={longitude}'

  headers = {
      'User-Agent': 'urara'  # ここにあなたのアプリケーション名を入れてください
  }

  response = requests.get(url, headers=headers)
  print(response)
  data = response.json()

  if 'error' in data:
      print('Address not found')
      return "URARA!"
  else:
      address = data['display_name']
      print(f'Address: {address}')
      return address

url = "https://maps.google.com/?q=35.618651,139.731943"
urara(url)
```
React初学者がFirebaseにアプリをデプロイする

# はじめに
React学習を始めて1ヶ月少し経ちました。最近本業が忙しく、Reactの学習が滞りがちです。仕事もしながら子育てもしながら学習していると、土日は全く時間とれないし、平日も朝か夕方しか時間がとれず、進みが遅いのですがコツコツやっていきたいと思います！

前回まで進めていたTodoアプリをローカル環境からFirebaseにデプロイして、webアプリとして動くところまで作ることができたので今回はその開発について投稿します！


## 前回までの開発

https://qiita.com/Shun_P/items/0e2d6b4694f320b1f7d9

・学習記録Todoアプリの画面開発
・学習記録を一覧で見られる
・ユーザーは記録を登録できる
・勉強時間の累計を見ることができる

・こんな画面まで作りました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502843/125b2232-8d22-131c-dbd1-9ca989162cd9.png)

## 今回のお題(開発内容)

```
前回作成した学習記録アプリの欠点が見つかりました
それはデータが永続化していないこと。リロードするとすべてのデータが消えてしまうのです
あなたはデータを永続化してあなたのスマートフォンから実際にサービスを利用できるよう取り組むことにしました
```

MVP1
・Viteで作ったReact+JavaScriptの環境で開発すること
・DBはSupabaseを使うこと
・学習アプリを読み込んだ際に1度データベースから情報を取得してユーザーはみることができる
・Supabaseのクライアント設定や.envでシークレット情報管理
MVP2
・学習記録を追加する際にデータベースにも記録する
MPV3
・登録したデータを削除できる
MVP4
・アプリをデプロイしてスマホから利用できる
・Firebaseにデプロイする
・makeコマンドでデプロイできるようにする

その他
・ chakra ui でUIをリッチに（作っていてモチベーション下がってきたので、見た目をそれっぽくして自分のテンションをあげるため課題に自分で追加。）


## 開発を進めた状態の画面

![chapter1課題2MVP3-2-_1_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3502843/5085f80a-5d81-05f5-d20c-80bdbfe116f2.gif)


## 大変だったこと
・Vite環境の構築
・Firebaseにデプロイするところ。2-3日（実際には数時間ですが）詰まりました。ローカルではうまくいっていたSupabaseの読み込みが、Firebaseにデプロイするとうまくいかなかったり、Viteの設定でハマったり、落とし穴がたくさんありました

## 所感と反省
これらを細切れに開発してリリースしていきました。集中してやれば初心者でも2-3日で終わると思うのですが時間をなかなかとれず3週間以上かかってしまいまして、反省。もっとサクサクやっていけばリズムにのって進むのですが一回中断するたびに、アレ？どこまでやったっけ？ 状態で進みが遅くなってしまいました。

プログラミングコーチング以外で、仕事用にPythonとJavascriptでコードを書いていることもあり、脳のリソースをほぼ全部そっちに吸い取られてReactまでパワーが回ってきませんでした。7月はギアを少し上げて学習していきたいと思います。

ノーコードやローコードツールではなく、自分でUIのあるWEBアプリ作るとテンション上がりますね！頑張っていきます。
unexpected PLT reloc type 0x00 についてメモ

メモ程度
```
Editing error while loading shared libraries: unexpected PLT reloc type 0x00
```

## 原因
動的ライブラリのシンボル解決に関係する問題が原因であることが多い。

遭遇した原因：
1. リンクされた動的ライブラリとの位置関係が、本体のビルド時と異なっていた
2. 動的ライブラリとリンクした時に、シンボル間で名前の衝突が発生した
3. 存在しないシンボルを指定した

## 1. 位置関係
例えば、libhoge.so を使う fuga.c を以下の位置関係でビルドしたのに、
```
---/lib/libhoge.so
 |
 ---/fuga.c
```
実行環境では同じディレクトリに入れられていた、とか（だった気がする）


## 2. 名前
ライブラリ内で定義されている関数と同名の関数を、本体のコードでも定義していた、等、シンボル間で名前の衝突が発生した場合。

### chatGPT に聞いてみた
はい、おっしゃる通りです。「`./fuga: error while loading shared libraries: unexpected PLT reloc type 0x00`」というエラーは、動的ライブラリのシンボル解決に関連する問題が原因で発生する可能性が高いです。この種のエラーは、通常、実行時のリンク処理における問題を示唆しています。

#### シンボル解決に関するエラーの原因

1. **動的ライブラリのリンクの問題**: プログラムが依存する動的ライブラリの一つまたは複数が適切にリンクされていない、または見つからないことが原因で、シンボル解決に失敗している可能性があります。

2. **互換性のないライブラリ**: プログラムが依存しているライブラリのバージョンがプログラムの期待するものと異なる、または異なるアーキテクチャ用にビルドされている場合、シンボル解決の問題が発生することがあります。

3. **シンボルの不足または名前の衝突**: プログラムが期待する特定のシンボルが動的ライブラリ内に存在しない、またはシンボル名が他のライブラリ内のシンボルと衝突している場合、シンボル解決に失敗することがあります。

#### ソースコードの改修とエラーの関連性

ソースコードの改修がこの種のエラーの原因になり得ます。特に次のような変更が関連している可能性があります。

- **新しいライブラリの使用**: ソースコードで新しい動的ライブラリを使用するように変更した場合、そのライブラリのリンクやシンボル解決に問題があると、このエラーが発生する可能性があります。

- **既存ライブラリの使用方法の変更**: 既存の動的ライブラリの使用方法を変更した場合（例えば、異なる関数を呼び出すようにした場合）、そのライブラリ内の特定のシンボルが見つからない場合にエラーが発生することがあります。

- **リンカーの設定変更**: リンカーの設定やコンパイルオプションを変更した場合、それがシンボル解決に影響を及ぼす可能性があります。

このエラーを解決するためには、動的ライブラリの依存関係やリンクの設定を詳細に検証し、ソースコードの変更履歴を見直して、最近の変更がエラーの原因になっていないかを確認することが重要です。また、実行環境での動的ライブラリの配置やバージョンにも注意を払う必要があります。

## 3. 存在しないシンボル
関数の名前を間違えたとか。

例えば以下のようなミスは、"unexpected ~" エラーの原因になる。
```C
sizeof(hoge); // 正
// ~~~~~~~~~~~~~~~~
size(hoge);  // 誤
```
IT 初心者向けクラウド入門ウェビナー ’Cloud for Beginners | モジュール 0 & 1 | ウェブサービス

## １．ウェブサービスとは
- ネットワークを通じて利用できるサービス
#### キーワード
- アーキテクチャ
- サーバ
- ストレージ
- データベース
## ２．サーバ
#### ● ハードウェア
- CPU - 命令を実行する装置
- メモリ - 命令やデータを記憶する装置
#### ● ソフトウェア
- OS
- ミドルウェア
- アプリケーション
#### ● 仮想サーバ
- 物理ホスト
- ハードウェア（CPU・メモリ）
- ハイパーバイザー - 物理的資源の割り振り

## ３．ウェブサービスが持つべき性質（１）
#### ● 可用性（Avalability） - サービスが継続的に使えること
#### ● 冗長性（Redudancy） - 障害に備えて機材や回線などを複数用意して備えること
#### ● 耐久性（Durability） - 障害が起こってもデータが失われないこと
 
## ４．ウェブサービスの公開
#### ・データセンター
- インフラストラクチャ
- デプロイ
## ５．ウェブサービスが持つべき性質（２）
#### ● 拡張性（Scalability） - 必要な時にすぐにリソースを拡張/縮小できること
#### ● 弾力性（Elasticity） - 拡張/縮小を自在に実行できること
## ６．ウェブサービスの運用管理
#### ● ヘルスチェック
#### ● モニタリング
#### ● スパイク
#### ● メトリクス
- CPU使用率
- メモリの空き容量
- レイテンシ
- アクセス数
#### ● 日々のメンテナンス
- バックアップ
## ７．ウェブサービスの安定稼働のために
#### ● キャパシティプランニング 
- アクセス数が増加して負荷が高まり、システムダウンしないようリソースを確保しキャパシティ（Webサービスの処理能力）を超えないように計画すること
- スケーリング

| 項目 | 説明 |
| :--- | :--- |
| スケールアップ/ダウン | 性能を上げる/下げる |
| スケールアウト/イン | 台数を増やす/減らす |

## ８．スケーリング
- 垂直スケーリング
・一つの重い処理
・物理的な限界
- 水平スケーリング
・小さい処理の同時実行
・アーキテクチャの変化
## ９．負荷分散（ロードバランス）
・冗長構成にしたサーバに通信を振り分ける
・可用性を高め、スケールアウト（イン）に対応する

## キーワード一覧
- ウェブサービス / ネットワーク / システム / サーバー / アーキテクチャ
- CPU / メモリ / リソース
- 仮想サーバー / 物理ホスト / ハイパーバイザー
- データセンター / デプロイ / インフラストラクチャ
- ヘルスチェック / モニタリング / メトリクス / レイテンシ / バックアップ
- キャパシティ / スケーリング（垂直スケーリング / 水平スケーリング）
- ロードバランサー
sigtimedwait() サンプルコード（備忘録）

# 概要
C 言語における `sigtimedwait()` 関数の使用方法をメモ。

# サンプルコード
```C
#define TIME_OUT_MS (3000) // タイムアウト時間.
#define SIGNAL_HOGE (SIGRTMIN+3) // 送受信するシグナル.

// ------------略----------------

    sigset_t sigset;
    siginfo_t siginfo = (siginfo_t){0};
    struct timespec timeout = (struct timespec){0};
    int timeout_ms = TIME_OUT_MS; // タイムアウト時間（ミリ秒）.

    sigemptyset(&sigset);
    sigaddset(&sigset, SIGNAL_HOGE);


    // tv_nsec には 1,000,000,000 以上の値が入ってはならない.
    // この例では timeout_ms がミリ秒なので、↓のように処理しておく.
    if(timeout_ms >= 1000){
        timeout.tv_sec = timeout_ms / 1000;
        timeout.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
    }
    else{
        timeout.tv_sec = 0;
        timeout.tv_nsec = timeout_ms * 1000 * 1000;
    }


    // シグナル待機.
    // シグナル受信 or タイムアウト時間経過まで、処理はここでブロックされる.
    if(sigtimedwait(&(sigset), &siginfo, &timeout) < 0){
        if(errno == EAGAIN){
            printf("sigtimedwait timeouted in %s, line %d, file %s\n", __func__, __LINE__, __FILE__);

            // タイムアウト.
            // タイムアウトの場合の処理を書く.
            
        }
        else if(errno != EINTR){
            fprintf(stderr, "sigtimedwait for SIGNAL_HOGE failed with errno: %d, in func %s, line %d, file %s\n", errno, __func__, __LINE__, __FILE__);
            exit(EXIT_FAILURE);

            // タイムアウトと割込み以外のエラーはここではじく.
            // Ctrl-C の時の動作がわからんかったので EINTR 以外としたが、EINTR を除外しなくてもいいかも？　わからん.

        }
    }
    else{
        printf("SIGNAL_HOGE received in %s, line %d\n", __func__, __LINE__);

        // シグナル受信.
        // シグナルを受信した場合の処理を書く.
    }
```
Pythonでベクトルの計算を行う方法

numpyを用いることにより、ベクトルを求め、なす角や内積を求めることができる。

### 理論
以下のようなベクトルがあった場合を考える。
```math
\vec{x} = 
\begin{pmatrix}
a \\
b \\
\end{pmatrix}
,
\vec{y}=
\begin{pmatrix}
c \\
d \\
\end{pmatrix}
```

ベクトルのなす角は以下の式で求めることができる
```math
\theta = \arccos \frac{xy}{|x||y|}
```
ここの```xy```は2つのベクトルの内積である。
内積は以下の式で求めることができる。このθがなす角である。
```math
xy = |x||y|\cos \theta = ac + bd
```

### Numpyを使用し、なす角を求める
```python
import numpy as np
def get_angle_vec(vec1:np.ndarray,vec2:np.ndarray):
    '''
    2つのベクトルからなす角を求めて返す
    Arges:
        vec1,vec2:ベクトル np.array([1,0])のような形式
    '''
    #内積を計算
    dot = np.inner(vec1,vec2)
    
    #各ベクトルの長さを計算
    s = np.linalg.norm(vec1)
    t = np.linalg.norm(vec2)

    #なす角の計算
    theta = np.arccos(dot/(s*t))

    return theta

x = np.array([5,0])
y = np.array([0,1])
theta = get_angle_vec(x, y)
print(theta)#出力 1.5707963267948966 ラジアン
```
出力結果はラジアン(弧度法)になっているため、度数法に変換するには以下のようにする

```diff_python
  import numpy as np
+ import math
  def get_angle_vec(vec1:np.ndarray,vec2:np.ndarray):
    '''
    2つのベクトルからなす角を求めて返す
    Arges:
        vec1,vec2:ベクトル np.array([1,0])のような形式
    '''
    #内積を計算
    dot = np.inner(vec1,vec2)
    
    #各ベクトルの長さを計算
    s = np.linalg.norm(vec1)
    t = np.linalg.norm(vec2)

    #なす角の計算
    theta = np.arccos(dot/(s*t))

    return theta

  x = np.array([5,0])
  y = np.array([0,1])
  theta_rad = get_angle_vec(x, y)
+ theta_deg = math.degrees(theta_rad)
  print(theta)#出力 90.0
```

今回は2次元ベクトルで考えたが、3次元以上でも同じようにしてなす角を求めることができる。
Illegal instruction (core dumped) の対処メモ

# 概要
アホなミスで数時間詰まったので備忘録。

C でマルチスレッドのプログラムを作成し、実行したところ、
```
Illegal instruction (core dumped)
```
というエラーが発生した。

原因は、存在しないスレッドのハンドルを取得しようとしたためだった。

具体的には、定義していない関数のポインタを、`pthread_create()` に渡していたことが原因であった。定義したら直った。

# 詳細
## スレッド作成について
`hoge` という関数のスレッドを作成する時は、↓の手順を踏む。
```C
pthread_t hoge_thread; // pthread_create に渡すヤツ.

void *hoge(void *fuga); // プロトタイプ宣言.

// 定義.
void *hoge(void *fuga){
   int i = 0;
   while(i < 10){
      printf("fuga\n");
      sleep(1);
   i++;
   }
   return NULL;
}

// スレッド作成.
if(pthread_create(&hoge_thread, NULL, hoge, NULL)){
   perror(hoge_thread create failed\n);
   exit(EXIT_FAILURE);
}


if(pthread_join(&hoge_thread, NULL)){
   perror(hoge_thread create failed\n);
   exit(EXIT_FAILURE);
}
```

## 問題発生時
`Illegal instruction (core dumped)` とやらが発生した時は、上記サンプルコードにおける「定義」が抜けていた。

この状態で gdbserver によるデバッグを実行すると、
```
Cannot get thread handle for LWP 505: generic error
```
というエラーが発生した。

スレッドの定義をしていないのだから、ハンドラの取得に失敗するのも当然である。

## 解決
関数を定義したら出なくなった。

やったー！

# まとめ
マルチスレッド時は、エディタ上で関数のプロトタイプ宣言部分を確認し、関数が未定義のままじゃないかチェックしよう、ヨシ！

ちなみに未定義だと↓のようになんか点線が入る。

![247942504-9157870d-3904-47e3-8c7b-fbef97a2de5d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124381/e7b751f7-2bdb-38c0-ce94-82ff687b9d70.png)
Salesforceでオブジェクトの項目を必須に変えるとプロファイルのメタデータのデプロイに失敗する

「XXX プロファイルの設定 必須項目 XXX__c.XXX__c にはリリースできません」
とのエラーになる

必須項目になった時点でプロファイルから消す必要があるので
当該プロファイルのメタデータから当該箇所(以下の5行)を消す
```XXX.profile-meta.xml
    <fieldPermissions>
        <editable>true</editable>
        <field>XXX__c.XXX__c</field>
        <readable>true</readable>
    </fieldPermissions>
```