OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLでテーブルを別のデータベースに移動してみる

## はじめに
MySQLは別のデータベースにテーブルを移すことができます。今回はその方法を試してみました。

## 別のDBにテーブルを移す方法
まずはmysqlにログインします。
```sh
mysql -u root -p
```

データベースを確認します。
```bash
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| app_development    |
| app_test           |
| information_schema |
| mydatabase         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)
```

今回は、app_developmentのusersテーブルを別のデータベースに移します。

second_databaseを作成します。
```bash
mysql> create database second_database;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| app_development    |
| app_test           |
| information_schema |
| mydatabase         |
| mysql              |
| performance_schema |
| second_database    |
| sys                |
+--------------------+
8 rows in set (0.00 sec)
```

app_developmentのusersテーブルをsecond_databaseに移します。
```bash
mysql> RENAME TABLE app_development.users TO second_database.users;

Query OK, 0 rows affected (0.03 sec)
```

しっかりと移動しているか確認します。
```bash
mysql> use second_database;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------+
| Tables_in_second_database |
+---------------------------+
| users                     |
+---------------------------+
1 row in set (0.00 sec)
```

中身も確認します。
しっかり中身のレコードも新しいデータベースに移っています。
```
mysql> SELECT * FROM users;
+-----+----------+------------------+------+----------------------------+----------------------------+
| id  | name     | email            | age  | created_at                 | updated_at                 |
+-----+----------+------------------+------+----------------------------+----------------------------+
|   1 | ?????1   | test1@test.com   |    1 | 2024-07-08 13:20:59.774423 | 2024-07-08 13:20:59.774423 |
|   2 | ?????2   | test2@test.com   |    2 | 2024-07-08 13:20:59.786474 | 2024-07-08 13:20:59.786474 |
|   3 | ?????3   | test3@test.com   |    3 | 2024-07-08 13:20:59.792206 | 2024-07-08 13:20:59.792206 |
|   4 | ?????4   | test4@test.com   |    4 | 2024-07-08 13:20:59.797279 | 2024-07-08 13:20:59.797279 |
|   5 | ?????5   | test5@test.com   |    5 | 2024-07-08 13:20:59.800999 | 2024-07-08 13:20:59.800999 |
|   6 | ?????6   | test6@test.com   |    6 | 2024-07-08 13:20:59.805134 | 2024-07-08 13:20:59.805134 |
...省略
```

## 終わりに
データベース名を間違ってしまったので名前だけ変更したい場合や、特定のテーブルを別のデータベースに移行したい場合などに使えそうです。
便利なので、覚えておいて損はないです。

## 参考
以下の記事を参考にさせていただきました。
こちらの記事では、複数のテーブルを一度に変更するコマンドを生成するためのSQLが載っています。とてもに便利です。

https://qiita.com/whisper0077/items/06add22b692a25bd19b5
Planetscaleを使っていて焦ったこと

# PlanetScaleを使っていて焦ったこと

こんにちは、皆さん！データベースを扱うときに「焦った瞬間」ってありませんか？今日は、僕が仕事で使っているPlanetScaleというDBで経験したヒヤリハットを共有します。

## PlanetScaleとは？

PlanetScaleは、MySQL互換の分散データベースです。高性能でスケーラブルな点が魅力です。

## ある日データ不整合が発生

ある日、データ不整合が発生してしまい、SQLで対応する必要がありました。こんな感じでUPDATE文を書いていたんです。

```sql
UPDATE Admin SET name = 'adminName' WHERE id ='clstv1nic000008l43e7r9zaa';
```

> 一般的なイレギュラー対応です。

トランザクションをかけて実行し、下記のように無事に実行されたと思いました。

```plaintext
[2024-07-09 00:05:19] 1 row affected in 37 ms
```

よしOK！と思ってもう一度確認してコミットしたら…。

```plaintext
[2024-07-09 00:07:00] [HY000][1105] target:xxxxxx.-.primary: vttablet: rpc error: code = Aborted desc = transaction 1719844899129891398: ended at 2024-07-08 15:05:40.334 UTC (exceeded timeout: 20s) (CallerID: nf8q2t4ya6l4keiftfrh)
```
:::note warn
本番だったので焦ってました....
:::

## 焦った瞬間

焦りました。調べたらトランザクションのエラーだと分かりました。Planetscaleのドキュメントを読んでみると…。

```plaintext
Per-transaction timeout 20s
```

って書いてあるじゃないですか。ちゃんとドキュメントは読もう、と心に誓った瞬間でした。



## まとめ
何事もドキュメントを読むことが大切です。僕のように焦ることがないように、しっかりと準備して使ってくださいね。

## 参考記事
- [Planetscale公式ドキュメント](https://planetscale.com/docs)
- [MySQL公式ドキュメント](https://dev.mysql.com/doc/)
【Go言語】Go100Tips1~4をまとめてみた

# はじめに

Go 100 Tipsの 1〜4 をまとめました。

スライドもあります。

https://speakerdeck.com/tomo1227/goyan-yu-100tips-no-dot-1-5-matome

また、Tip.3に関しては、別の記事にしました。

https://qiita.com/twrcd1227/items/6e7079d16fd27a7c7d6e

# シャドーイング

シャドーイングとは、異なるスコープで同じ名前の変数が使用されたときに、異なる変数として扱われること。ちなみに、同じスコープ内だと再宣言となり、コンパイラエラーとなります。

```go
func main() {
	n := 1
	if true {
		n := 999 // シャドウイングされる
		fmt.Println(n) // 999
	}
	fmt.Println(n) // 1
}
```

`:=`ではなく、代入演算子`=`を使うとシャドウイングされません。

```go
var n int
func main() {
	n := 1
	if true {
		n = 999
		fmt.Println(n) // 999
	}
	fmt.Println(n) // 999
}
```

気をつけないといけないのは、以下のように関数が複数返す際に、片方の変数が宣言されていなければ、`=`を使うとコンパイラエラーになるとき。エラーになるので、`:=`にしてしまう人がいるのですが、シャドーイングが発生してしまいます。

```go
func main() {
	n := 1
	if true {
		n, err := f() // 代入演算子 = にするとエラーが出る
		if err != nil {
			return
		}
		fmt.Println(n) // 999
	}
	fmt.Println(n) // 1
}

func f() (int, error) {
	return 999, nil
}
```

## 解決法1

一時変数格納してから、元の変数に入れる

```go
func main() {
	n := 1
	if true {
		tmp, err := f() // 代入演算子 = にするとエラーが出る
        n = tmp
		if err != nil {
			return
		}
		fmt.Println(n) // 999
	}
	fmt.Println(n) // 999
}

func f() (int, error) {
	return 999, nil
}
```

## 解決法2

前もってスコープ外で宣言していれば、代入演算子を使用できます。

```diff_go
func main() {
	n := 1
	var err error
	if true {
		n, err = f() // 代入演算子 = にするとエラーが出る
		if err != nil {
			return
		}
		fmt.Println(n) // 999
	}
	fmt.Println(n) // 999
}

func f() (int, error) {
	return 999, nil
}
```

# メンタルコードモデルを形成する

以下の3つを守ることで可読性を高め、メンタルコードモデルを形成します。

* ネストさせない　→ 早期returnで返す
* ハッピーパスを左側で揃える(elseは使わない)
* ノンハッピーパスは条件を反転して、ハッピーパスにする

以下はハッピーパスで揃えた例である。

```go
	if s1 == "" {
		return "", errors.New("s1 is empty")
	}
	if s2 == "" {
		return "", errors.New("s2 is empty")
	}
	if err != nil {
		return "", err
	}
	if len(s2) > max {
		return "", nil
	}
```

# getterとsetterの使い方

データのカプセル化 : オブジェクトの値や状態を隠すこと。
getterとsetterは、公開されていないオブジェクトのフィールドに対して、公開されたメソッドを提供することによって、カプセル化を可能にする手段。


```go
timer := time.NewTimer(time.Second) // 1秒後に発火
<-timer.C // 1秒後に通知
```

`C`は直接修正できるが、イベントを受け取れなくなる。

## getterとセッターを使用する利点

* フィールドの取得や設定に関連する動作をカプセル化し、後から新たな機能を追加できるようにする。(フィールドを検証したり、計算による値を返したり、フィールドへのアクセスをミューテックスで保護したりする)
* 内部表現を隠蔽することで、公開するものを柔軟に変更できる
* 実行時にプロパティが変更された場合のデバッグ用ブレイクポイントを提供し、デバッグを容易にする

また、前方互換性を保証するユースケースの可能性が予想されるときに有効である。
balanceというフィールドでgetter,setterを使用する場合、

* getterメソッドの名前は`Balance`にする(❌GetBalance)
* setterメソッドの名前は`SetBalance`にする

```go
currentBalance := customer.Balance() // getter
if currentBalance < 0 {
    customer.SetBalance(0) // setter
}
```

構造体のgetter,setterが何の価値もないのであれば、使うべきではない。

# 参考文献

1. [Japanese Version - 100 Go Mistakes and How to Avoid Them](https://100go.co/ja/)
EmacsのI-searchがIMEからの入力で失敗するのを回避

Windows版GNU Emacsの`I-search`（インクリメンタルサーチ）でIMEから文字列を入力すると、最初の1文字がヒットしたところで `[Symbol' s function definition is void: nil]` となって終わってしまう。

しかしこれは最初の1回だけで、それ以降はIMEからの入力でもちゃんと検索できる。

そこで`~/.emacs/init.el`にこう書いてみた。

```
(setq default-input-method "W32-IME")
(w32-ime-initialize)
;; I-searchでIMEから入力しても失敗しないためのおまじない
(activate-input-method "W32-IME")
(deactivate-input-method)
```

うまくいきました。

なお、私は [tr-ime](https://github.com/trueroad/tr-emacs-ime-module) を使わせていただいております。
もうこれ以上、家に傘の置き場が無いんだ

# 家にビニ傘が増えていく
お出かけする前日は天気予報気にするけど、日常ではさほど気にしない。
結果、朝起きて雨が降っていたりすると早く家を出なきゃと焦ったり、出先で突然雨が降ってくる度にビニ傘を購入し、自宅に在庫が増えていく。それでも日常で、前もって天気予報を確認しておくマメさは私にはない。

# 次の日雨だったら、LINEでお知らせしてもらおう
そこで、iPaaSを活用した超簡単なお知らせツールを作ってみた。
iPaaSとは、Integration Platform as a Serviceの略で、誰でも簡単にツールを作ることができるノーコードに分類されるクラウドサービスである。様々なサービスを簡単に繋げることができ、こんな機能欲しいなと思ったらすぐに作ることができるという優れものだ。
今回は、[IFTTT](https://ifttt.com/explore)を使ってみた。

# IFTTT①（天気の条件と場所）
日本のセントラルパーク「代々木公園」を指定。(
もし、明日「雨」だったら・・・
![スクリーンショット 2024-07-08 23.09.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772350/773786a7-4e5b-5dbf-06e4-bfa7c19abb6e.png)

# ②IFTTT（何のツールでお知らせして欲しいか）
今回はLINEでお知らせしてもらいたいので、LINEを設定。
ちなみに、Gmailなども設定できる。
![スクリーンショット 2024-07-08 23.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772350/917f1b67-6bce-d4ed-4fef-078d5d8b879b.png)

# おしまい
え？！これだけ？
簡単に設定が完了した。
![スクリーンショット 2024-07-09 0.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772350/a926b1fe-c404-bf29-4894-1405fda165b7.png)

# その後
早朝に「天気予報が雨に変わったぜ！」とお知らせが来た！
英語なのと、華氏表記で少し分かりづらいが、イラストで想像できる。

和訳
「2024年7月11日の天気予報は、最高気温約31度、最低気温は約24度で、所々雷雨があります。」
![データ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772350/84126da5-b0f6-e34e-a60c-36644542c08a.jpeg)

よし、折りたたみ傘を持って出かけよう！
Elixir Image で画像を減色する

## はじめに

Elixir の Image モジュールで減色処理（画像に使う色の種類を減らす処理）を実行します

印刷コストの削減などを目的として使われる処理です

どんな処理なのかは実行結果を見るのが分かりやすいので、読み進めてください

https://github.com/elixir-image/image

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/vix/reduce_colors.livemd

## セットアップ

必要なモジュールをインストールします

```elixir
Mix.install(
  [
    {:image, "~> 0.52"},
    {:kino, "~> 0.13"},
    {:scholar, "~> 0.3"},
    {:exla, "~> 0.7"}
  ],
  config: [
    nx: [
      default_backend: EXLA.Backend,
      default_defn_options: [compiler: EXLA]
    ]
  ]
)
```

- [Image](https://github.com/elixir-image/image): 画像処理
- [Kino](https://github.com/livebook-dev/kino): Livebook の UI/UX
- [Scholar](https://github.com/elixir-nx/scholar): 機械学習ツール
- [EXLA](https://github.com/elixir-nx/nx/tree/main/exla): 行列演算の高速化

減色処理には Scholar モジュールが必須です（コード上出てきませんが、内部的に使用しています）

また、そのままでは時間がかかりすぎるため、 EXLA をインストールして設定を追加しています

## 画像の準備

任意の画像を読み込みます

ただし、透過画像だと上手く処理できないため、不透明度 = アルファチャネル(RGBA の A)を分離します

```elixir
{puppies_img, _} =
  "/home/livebook/vix/puppies.png"
  |> Image.open!()
  |> Image.split_alpha()

puppies_img
```

![スクリーンショット 2024-07-08 23.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/0982d827-241e-adf1-1c4d-d39d78e10ecb.png)

## 減色処理

`Image.k_means!` で K 平均法によって色をクラスタリングします

画像に含まれる色をグループ分けして、いくつかの色だけに絞り込むことになります

```elixir
Image.k_means!(puppies_img)
```

実行結果は以下のように RGB の配列（16色）になります

```elixir
[
  [23, 25, 25],
  ~c"14=",
  [57, 82, 22],
  ~c"LQZ",
  [92, 129, 34],
  [96, 107, 131],
  [106, 127, 87],
  [129, 142, 168],
  [135, 144, 123],
  [138, 180, 59],
  [163, 172, 185],
  [191, 177, 138],
  [193, 197, 208],
  [200, 222, 71],
  [219, 228, 159],
  [229, 229, 220]
]
```

:::note warn
たまたま数値が文字コードに合致したもの（`~c"14="` など）は文字リストとして表示されています
:::

`:num_clusters` で色数を指定できます

どんな色なのか画像にして見てましょう

```elixir
Image.k_means!(puppies_img, num_clusters: 8)
|> Enum.map(fn color ->
  Image.new!(100, 100, color: color)
end)
|> Kino.Layout.grid(columns: 8)
```

![スクリーンショット 2024-07-09 0.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/df1d8f01-df82-84e7-ae0b-2251a81c7abf.png)

黒い犬と白い犬の毛色や芝生の色が抽出されていることが分かります

`Image.reduce_colors!` によって画像を減色できます

```elixir
Image.reduce_colors!(puppies_img)
```

デフォルトでは 16 色に減色され、以下のような画像になります

![スクリーンショット 2024-07-09 0.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/00cae794-4662-a64d-10c2-b173e9b8412c.png)

色数を減らしていくとどうなるか見てみましょう

```elixir
[
  puppies_img,
  Image.reduce_colors!(puppies_img, colors: 10),
  Image.reduce_colors!(puppies_img, colors: 8),
  Image.reduce_colors!(puppies_img, colors: 6),
  Image.reduce_colors!(puppies_img, colors: 4),
  Image.reduce_colors!(puppies_img, colors: 2)
]
|> Kino.Layout.grid(columns: 3)
```

色数が少ないと、はっきり減色されたことが分かりますね

![スクリーンショット 2024-07-09 0.12.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7645971b-8f44-92a8-74cf-00e46102e80a.png)

4 色の画像は初代ゲームボーイを思い出します

## まとめ

Image モジュールで減色処理が実行できました

レトロな感じに画像を加工したい場合や、画像の情報量を少なくしたい場合などに使えそうです
UE勉強日記　ID自動付与

actorをインスタン化するたびに、
インスタンス化した回数と同じようにID自動付与する

.h
```
static int32 NextID;
```

.cpp
```
int32 AActor::NextID = 1;

AActor::AActor()
{
     ID = FString::Printf(TEXT("%d"), NextID++);
}
```
Qiitaの記事をGithubのREADMEに掲載して定期更新する

# 読み飛ばしてください

おはようございます、しなもんです。
熱波で溶けそうです。でも梅雨明けてないらしいよ。

# 本題

https://github.com/CinnamonSea2073

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/592c759a-dad1-453b-a61c-320556800e52.png)

**コレをやります！**
readmeでもゴリゴリのQiitarアピールをしよう！

:::note info
使わせていただくworkflowは[こちら](https://github.com/gautamkrishnar/blog-post-workflow)です。
:::

# 概要

Readme.mdに記事のリストを入れる箇所を指定
↓
Github Actionsにworkflowを登録
↓
1時間おきにQiitaのRSSを見に行って更新してくれるようになる

# やってみよう

## 1. Readme.mdを下拵えする

Qiitaの記事を掲載したい箇所に以下の感じでマークを入れます
```md
## Qiita

以下のリストは定期的に自動更新されます！

<!-- BLOG-POST-LIST:START -->
<!-- BLOG-POST-LIST:END -->
```

push直後の最初から記事を掲載したい場合は、人力で入れておくこともできます。

```md
## Qiita

以下のリストは定期的に自動更新されます！

<!-- BLOG-POST-LIST:START -->
- [GPT-4しか知らないあなたの知識はもう古いらしい](https://qiita.com/CinnamonSea2073/items/892f2e46d97c30ccaa5b)
- [【Python】プロパティの便利な使い方5選](https://qiita.com/CinnamonSea2073/items/f14fe8f39e8c9fe13519)
- [コレを読めば理解できる！const、let、varの違い](https://qiita.com/CinnamonSea2073/items/1ffe792b025d878cbda6)
- [ユーザーかOrganizationが記事が投稿したらDiscordに通知する](https://qiita.com/CinnamonSea2073/items/68abbce0c377a19beedb)
<!-- BLOG-POST-LIST:END -->
```

このようにしてもActions実行時にはちゃんと上書きされるので大丈夫です。

書けたら忘れずにpushしてgithubに反映させましょう。

## 2. workflowを登録

フォルダを用意します。

```diff_markdown
  .
+ ├─.github
+ │   └─workflows
+ │      └─blog-post-workflow.yml
  └─readme.md
```

yamlファイルを書きます。

```yaml:blog-post-workflow.yml
name: Latest blog post workflow
on: 
    schedule:
        - cron: '0 * * * *'
jobs: 
    update-readme-with-blog: 
        name: Update this repo's README with latest blog posts
        runs-on: ubuntu-latest
        steps: 
            - uses: actions/checkout@v2
            - uses: gautamkrishnar/blog-post-workflow@master
              with: 
                max_post_count: "5"
                feed_list: "https://qiita.com/{username}/feed"
```

**忘れずにfeed_listの`{username}`を自分のQiitaのIDに書き換えておいてください。**

:::note info
max_post_countの値は、記事の最大掲載数です。
5では物足りない方は調整しておくと良いでしょう。
:::

これもgithubにpushしておきます。

## 3. リポジトリの設定を変更

workflowがちゃんと実行されるように設定を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/2ab14d0c-c296-d72c-0526-c6a7ebebb793.png)

リポジトリの設定の`Actions`の中にある`General`を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/5c06ed79-320c-cec8-e4d7-48c3c6324e5a.png)

下の方にある`Workflow permissions`の項目内で、
`Read and write permissions`を選択しましょう。

これでリポジトリ内にあるworkflowを実行してくれるようになります。

## 4. 完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1927831/3635005e-bf6f-e32b-c06d-480dd96644c4.png)

あとで見に行くとちゃんと1時間おきに確認しに行ってくれてます！

# おまけ

このworkflowではほかにも詳しく設定ができるようですので、
こちらから確認してみてください！

https://github.com/gautamkrishnar/blog-post-workflow?tab=readme-ov-file#options
【Git】サブモジュールの変更を取り込む方法

以下のコマンドを実行することでサブモジュールの変更を取り込むことができます。

```shell
git submodule update --remote
```

上記の場合にはすべてのサブモジュールの変更を取り込みますが、特定のサブモジュールのみの変更を取り込みたい場合には以下のように実行します。

```shell
git submodule update --remote <submodule_path>
```

https://arc.net/l/quote/lssbbcvw
GrapeでGETのクエリパラメータにArray[Integer]のTypeを使いたいときのメモ

# 概要
- GETのクエリパラメータにArray[Integer]を設定してみたがうまく動作しなかった
- そのときのメモ


Grapeはこれ

https://github.com/ruby-grape/grape?tab=readme-ov-file


# 結論

* `collectionFormat: 'multi'` を追加する

```ruby
requires :xxx, type: Array[Integer], documentation: { desc: 'メモ', type: 'integer', param_type: 'query', collectionFormat: 'multi' }
```


この辺にドキュメントがある

https://github.com/ruby-grape/grape-swagger?tab=readme-ov-file#collection-format-of-arrays-


# 困ってたこと

* フロントエンドでGrapeが生成するyamlファイルを元に、ApiClientを生成していたが、リクエストすると `xxx[]=1,2,3`とリクエストしてしまい通らなかった
* 通常GETのクエリパラメータでArrayを利用するには、`xxx[]=1&xxx[]=2&xxx[]=3`とする必要がある

こんな感じのTypeScriptが生成されていた

```typescript
if (xxx) {
  localVarQueryParameter[
    'xxx[]'
  ] = xxx.join(COLLECTION_FORMATS.csv)
}
```

パラメータ修正するとこれになった

```typescript
if (xxx) {
    localVarQueryParameter['xxx[]'] = xxx
}
```

# 雑感

とりあえずできた
jQuery　勉強（DOM操作）

お疲れ様です。

今日はjQueryのDOM操作について勉強したので、自分用にまとめます。

DOM操作で使用したメソッド
**.text()**…指定した要素のテキストを取得できる。あとから自由に変更も可能。
**.append()**…指定した要素の「末尾」に追加。
**.remove()**…指定した要素を削除。
**.show()**…指定した要素を表示。
**.hide()**…指定した要素を非表示。
<br>
.append
ボタンを押すとliの末尾に1つずつ要素が増えていくコード
![81.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/acd22ced-6591-cb6a-6725-f2e796f696f3.png)
![82.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/04c20848-9b2b-b88d-b298-0809ecf798cc.png)
<br>
.remove
ボタンを押すと要素が1つずる減っていくコード
（要素がなくなったら、変数を0にする）
![83.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/87d0a06f-831e-5ec7-db6d-d44fa63c28cb.png)
![84.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/d9c0b0ff-312d-6480-4e72-db5d21906c00.png)
<br>

.show　.hide
ボタンを押すと要素が表示&非表示されるコード
![85.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/c223886e-a6e0-dbd1-6d35-3e0b99982cdb.png)
![86.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/909f554d-a9c2-3a16-714f-c33273c14ff6.png)
Sequence Makerで自動保存機能を実現する方法

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerは測定器の自動制御が可能なので、長時間のデータ収集などでも活用できます。しかし、Sequence Makerにはブックを自動保存する機能が無いため、万が一データ収集中にExcelが強制終了してしまったりすると、それまで取得したデータが消えてしまうことになります。これは大変に悲しい事です。この記事では自動保存機能をVBAによって実現する方法を解説します。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## VBA
まずはVBAで保存機能を作成します。と言っても、VBAエディタを起動し、標準モジュールを追加し、保存の機能を書くだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/b7293c6e-2d45-a025-515d-3d70edcb991d.png)

```vb
Option Explicit

Sub AutoSave()

    ThisWorkbook.Save
    
End Sub
```

Excelのブックはマクロ有効ブック形式（.xlsm）で保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/e73ba1da-500f-b7b5-b31b-f5f5bff7e2d4.png)


## Sequence Makerから保存処理を呼び出す。
Sequence MakerはVBAのサブルーチンを呼び出して実行することが可能です。

https://qiita.com/sequencemaker/items/2c13cd388cede0fe9234

Sequence Makerで保存したいタイミングで先ほど作成したサブルーチンを呼び出します。

以下のように書けば呼び出せます。

```
#MACRO(AutoSave)
```

実際には、何か一連の処理が終わったあたりで、適宜呼んであげれば良いと思います。
繰り返し測定を行うような場合は、1回の繰り返しの最後とか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/767e8857-5e66-c468-8bbe-a71886da345f.png)

これで適宜自動保存されるようになります。

## まとめ
今回はSequence MakerとVBAを組み合わせて自動保存を実現してみました。Sequence Makerには無い機能をVBAで拡張できるのはなかなか便利です。

## おまけ
実は新しめのExcelには自動保存の機能が・・・あるのでそちらを使うでもヨシ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/885e481f-011d-ba89-abeb-2f5f4a2e3dc5.png)

その場合は保存先をOneDriveにする必要がありそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/241be820-8866-23aa-00aa-e0a27fe25e9f.png)
VSCodeでぬっこ🐈と幸せコーディング生活初めてみませんか？

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。（同担OKです😉）

皆さん、VSCodeでコーディングする時メンタル管理どうしてますか？😇
ずっとコーディングしてると、結構頭も使うししんどくなってきますよね。。。

今回はそんなあなたにオススメする、ぬっこ🐈とほのぼのコーディングできる拡張機能をご紹介します！
動物と一緒にコーディングして、心を回復させましょう🥹

# ぬっことコーディングできる拡張機能「Bongo Cat Buddy」
https://marketplace.visualstudio.com/items?itemName=JohnHarrison.bongocat-buddy

**自分のタイピングに合わせてぬっこが一緒にタイピングしてくれる**というほのぼのほんわか拡張機能です😍

使い方はとっても簡単！！
**1. VSCodeのExtentionsタブで、「Bongo Cat Buddy」と検索**
![スクリーンショット 2024-07-07 16.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/c1c63aa7-e703-95ef-72d3-ae3d2fbec5e7.png)

ちなみに、上のBongo Catの方は**ステータスバー内でタイピング**してくれます。
ひっそりと楽しみたい方は、こちらをインストールしてみてください😊
![スクリーンショット 2024-07-07 16.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/31a8639f-8db5-27d6-1f36-f720b97a9620.png)
**2. 「Bongo Cat Buddy」をインストール**
**3. Command(Ctrl) + Shift + Pでコマンドパレットを開き、「Bongo Cat」と入力**
![スクリーンショット 2024-07-07 16.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/fa37df33-e9a3-63ba-805f-7e92fce31786.png)

**4. 「Bongo Cat」を選択**
すると、画面右側にぬっこが。。。！！！
![スクリーンショット 2024-07-07 17.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/af73726b-2894-87c2-fad6-68c6a6d05e1a.png)

か、かわええ〜〜〜！！！🥳🥳🥳

**5. 後はタイピングするだけ！**
![bongo_cat_buddy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653241/7959835b-a0ca-56e5-97b5-8cb98914f6bf.gif)

このように、タイピングすると一緒に手を動かしてくれます！
VSCode内に癒しを提供してくれる素晴らしい拡張機能ですね！😎

# おわりに
Bongo Cat Buddyという素晴らしい拡張機能はいかがでしたでしょうか？
日本語入力になると動作が上手く行かないので課題ではありますが、アルファベットは問題なく動作するので是非入れてみてください！🤩

最後までご覧いただきありがとうございました！
以上、センリツでした。🤓
React での配列の更新方法

## React での配列更新方法
本記事は以下記事での配列更新方法についての続きです。

https://qiita.com/axoloto210/items/cb93a3aebc3521cace3f

## `useState`に検知される配列更新の方法
配列が更新されたことを`useState`に検知させるには、**更新後の配列を新しい配列として**set 関数に渡す必要があります。

## 新たな配列を返す更新方法
### `Array.prototype.map()`
`map()`は与えられた配列の各要素それぞれに対して、`map()`の引数の関数を適用し、その値を要素とする新しい配列を返します。

配列の各要素を２倍に更新する例を考えてみます。
```ts
const array = [1, 2, 3]

const doubleNum = (num: number) => 2 * num

const newArray = array.map(doubleNum)

console.log(newArray)
// [ 2, 4, 6 ]

console.log(Object.is(array, newArray))
// false
```

`Object.is(newArray, array)`が`false`となっていることから、`newArray`と`array`が別の値であることが`useState`のset 関数によって検知可能であることがわかります。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map

## 元の配列を直接更新してしまう方法
### `Array.prototype.splice()`
`splice()`は配列に対して、直接要素の削除や追加、置き換えを行うことができます。
返り値は削除された要素の配列で、削除された要素がない場合には空の配列`[]`が返されます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

### 要素番号を指定しての更新
配列`array`について、要素番号を指定して値を更新することも避けるべきです。
こちらも配列を直接操作しているため、set 関数では検知できません。
```ts
const array = [1, 2, 3]

// forEach自体は常にundefined を返します。
array.forEach((element, index)=>{
    array[index] = 2 * element
})

console.log(array)
// [ 2, 4, 6 ]
```

元の配列が変更されてしまう方法を使いたい場合には、元の配列をコピーした配列を新たに用意し、その配列に対して更新を行えば問題ありません。

[1^]: `splice` は「接合する、より継ぎする」の意。
某データセンターでループを作って落としてしまった話

この記事は、
[しくじりエンジニア！私みたいになるな！](https://qiita.com/official-events/fd39ed8cc0dcc9829621)
への投稿記事です。

皆さん如何お過ごしでしょうか！？
しくじっちゃうことは仕方ないこと、
その後の処置と対応によって、
しくじりが繰り返されないことを願います。

# 簡単にやらかしたこと
ネットワークループを作って、
某データセンター内の通信を一部落としました。


# 結論
上が「お前ならやれる」といっても、
自分の専門じゃない分野で有識者への相談なしにやると
やらかす可能性が高いです。
やらかしの影響範囲がクリティカルじゃない場合は
チャレンジしてもいいですが、
やらかしで影響が大きくなる場合はきちんと「無理」と言うか、
有識者をつけてもらいましょう。

# 背景
今から10年くらい前、
私が初めてのインフラ構築作業のときに、
某データセンター内作業で、
初めてネットワーク機器を設定して入れたときのトラブルです。

# やべーバックグラウンド
私、そもそもソフトウェア系のエンジニアなんですが、
何故かそのときは
・ネットワーク機器の設定
・ネットワーク配線の設置
を任されました。
私、若かったし、
それまでそんなにやらかしたことなかったので、
やったことなかったけれど、
上から言われたことを全力で達成しようとしました。
「あなたならやれるでしょ？」と言われたので、
やれると思って対応しました。
思えばこれがやばかったです。

## ネットワーク有識者の不在
私、ソフトウェア系なんです。
ネットワーク初めてなんです💦

## インフラ有識者の不在
私、ソフトウェア系なんです。
ネットワーク機器のテストやったことないんです。
でも、データセンターでインフラ構築します。
そんなものですね💦
ちなみに、ツーマンセルでついた方も、
LAN構築初めての方でした。

## 無駄な自信
今まで割とやれてたことも合って、
上がやれると判断したことは
私が頑張ればミスなくやれると思っていました。


# やらかしたこと
ループを作って、
某データセンターの一部環境を見事に落としました。

## やらかし方

### 検証不十分
ネットワーク機器のポートに対して、
コマンドでVLANを切ったつもりだったのですが、
結局VLAN切れてなかったです。
さらに、有識者がいなかったため、
・VLANを切った（つもりの）作業をした
でOKが出ましたが、
きちんと
・物理的にVLANが切れていることの検証をできていなかった
ことが検出できていなかったことが
後日の検証で問題点として明らかになりました。

### 検証不十分機器、データセンターへ
上記の検証不十分機器が、
データセンターへ入りました。

### ループ発生
LANを繋いだ際に、当然のごとくループが発生しました。

### サブネットマスク問題
さらに、上記の設定は、
サブネットマスクの絞りが不十分でした。
テンションとしては、
・サブネットマスク：255.255.255.0
だと通信できない機器が出るから、
・サブネットマスク：255.0.0.0
にしたら通信できるやんというテンションでした。

### そして伝説へ
はい。
割と影響大きめでループ出ました。


# 惨劇はなぜおこってしまったのか

・ソフトできるからインフラできるやろ
という担当者（ワイ）、上司の慢心だったと思っています。
特に、
・ソフトはエラー出てもやり直し聞くからトライアンドエラーでやればいい
という意識でインフラをやると、
「他人にまで迷惑をかける」
という意識・認識が全体的に足りていなかったと思います。

# 惨劇を起こさないためにできること

解決方法：自分だけで処理せずに有識者に助言を求めましょう。

自分が全てのレイヤーの考え方と課題感を意識できていて、
それに対処できれば問題は出ないのですが、
そんなことをできる人はいません。

特に、若いときは「デキる」と判断しがちですが、
レイヤーが違うとそもそもの判断基準が違うということを知ることが大切です。

よく、
・ハードウェア
・インフラ
・ソフトウェア（アプリ）
と階層分けされていますが、
周辺への影響度の違いも含めて階層分けされていると思うので、
若い方はそれぞれのレイヤーで影響が出た場合の影響範囲とリカバリ方法を
真摯に検討してから業務に挑む必要があると思います。
特に、レイヤーを超える場合は、
影響の出方やリカバリ方法のポリシーが違うので、
有識者の方へ相談したほうがいいと思います。

また、上司が理解してくれない場合は、
他のレイヤーの有識者の意見をいれてきちんと
リスクの説明を行いましょう。
（メリットとリスクの判断は上司の責任です）
投稿 8 スーパースカラ　スーパーパイプライン　2024/07/08

本日の勉強時間　2H

CPU プロセッサの高速化について二つ。


パイプライン処理を複数個並列させて処理する方式を「スーパースカラ」と呼びます。
マイコンのサイズそのものは大きくなりますが、高機能を実現できます。


スーパーパイプライン処理とは、命令の各ステージを更に分割をして、分割したステージ単位で並列処理をする方式です。 図では、1つのステージをそれぞれ２分割しています。 その分割されたステージが終わると、次の分割されたステージの処理をするのと並行して、別の命令の分割されたステージを並行処理しています。
【プロジェクトマネジメント】品質計画と品質管理

# 概要
[情報処理教科書 プロジェクトマネージャ 2024年版](https://www.shoeisha.co.jp/book/detail/9784798185750)
の品質計画と品質管理の章を要約

# 品質計画	
- ユーザにより要求される品質事項が定義される			
- そのもとで、作成が必要なドキュメントごとに**レビュー実施の計画**を立てる
    - レビュー方法を決める。方法の例は以下。	
        - 要求事項が達成されているかをチェックリストなどで確認する	
        - プロトタイプを作成して成果物の品質を検証する	
    - レビューに要する工数や期間を見積もる	
    - レビュー参加者を決める		
	
 - さらに、テスト計画を立てる。すなわち、**誰が、いつ、どのようにテストを実施するか**をプロジェクトマネージャ(PM)が定義する。ただし、詳細なテストの設計はシステムアーキテクトなどが行う。		

# 品質管理

- 品質保証のための大まかなステップは、
モニタリング→課題発見→原因分析→課題解決		

## モニタリングする	
- メンバーの品質保証のための活動をモニタリングする。	
- レビューやテスト計画の妥当性をチェックする
- テスト結果やレビューの報告内容からシステムの品質をチェックする
- レビュー、テスト結果の進捗が予定通りかというプロセスの品質もチェックする
- このように品質を評価するためには、指標を使用する。例：信頼度成長曲線(バグ曲線)、テスト期間を測定するための尺度：テストに実際にかかった時間/予定時間。
    - その評価のための指標は**計画段階**で定める必要がある。
品質：解決された障害件数/全体の障害件数
    - 指標に対して品質の合格点つまり**基準値**を設ける。この値は、所属企業に開発標準があればそれに従う。ない場合は過去の類似プロジェクトを参考に決定する。ただし、標準に盲目に従うのではなくプロジェクト固有の性質を加味し、標準をテーラリングしたうえで基準値を決めるべき。
- 基準値と実績を比較する。基準値の例は、評価基準やテストなどの終了判定基準である。
- **許容範囲外の値をとった場合**、問題が起きたと察知する。
- そして**根本原因分析**を行う。すなわち、「どうしてその値になったのか」の状況について情報を収集し、原因を分析する。この分析のためには、QC7つ道具が役立つ可能性がある。
- 原因が判明したら、原因を解消するための**打ち手**を検討する。打ち手の例は、体制見直し、要員交代、顧客との調整など。この打ち手をPMが実行する。一方、テスト方法改善などは、チームリーダへ改善を指示する
				
				
## レビュー	
- レビューとは**作成したドキュメントに不備がないかをチェックする作業**のこと		
- ウォーターフォール型のシステム開発の場合、レビューで欠陥を除去することはテストで除去するよりも望ましい。なぜなら、スケジュール面でもコスト面でも、無駄が少なく済むからだ。		
### 種類
- **インスペクション**
以下の役割を定めて行うレビュー。	
モデレータ：レビュー進行の訓練を受けた責任者。欠陥への対応や修正の確認を確実に行うことが責務。
レビューア：成果物に対して評価する能力がある人
会議で誤っている部分を発見し、分析する。さらに解決策も決定する。
- **ウォークスルー**
開発者自身が自主的に会議を開く。そして誤りの検出を行う。原則、管理者は出席しない。
さらに、誤りの発見は行うが、解決策は検討しない。(意識が解決策の検討に向かうと、誤りの発見に支障が出ることが考えられるため)
- **ラウンドロビン**	
参加者全員が順番にレビュー責任者を務めながらレビューを行う(なぜなら、参加者の参加意欲が高まることが期待されるため)。

# テスト	
## 信頼度成長曲線
- これは横軸に実行したテストケース数、縦軸に検出されたバグの数をとったグラフ。		
- 何が嬉しいのか
    - レビューやテストの進捗状況、品質を把握したり、完了基準に使える。	曲線の傾きを見て、状況を把握する。傾きが水平に近くなればバグが検出されにくくなっていることを意味する。それを完了基準と出来る。	
    - 標準的な曲線と比較することで相対的な品質を把握する。例えば、傾きが急であれば品質が悪いかテストケースの検出力が高いと考えられる。逆に標準よりもなだらかだと、品質が良いかテストケースの検出力が低いとなる。要は仮説を立てて情報を集め、状況を把握する。それをもとにPMが判断を行う。
	
 # 品質管理ツール
 
 QC7つ道具と新QC7つ道具がある。

 ## QC7つ道具
 - パレート図	
横軸に問題の原因を種類ごとに並べ、縦軸に問題(バグが埋め込まれた工程)を置く。
     さらに、問題の多さの順に左から棒グラフを並べる。加えて、累積問題数を線グラフで書く。		
- 散布図	
2種類の変数の間の相関関係を可視化できる		
- 特性要因図
ある事象(特性と呼ぶ)と、それを引き起こす要因を対応付けた図。特性と要因は矢印で結びつける。	
何が嬉しいか。問題への解決策を検討する際に要因に意識が向きやすくなる。リスク特定のために用いると、網羅的にリスク対応策を検討する事が出来る。	
			
- ヒストグラム	
データを種類ごとに分類して積み上げたもの。平均値とそのばらつき(裾野の広さ)を把握しやすくなる。	

- チェックシート	
作業項目を書き、完了したらチェックマークで完了を示せるもの。	
- グラフ		


## 新QC7つ道具	
- 連関図	
原因と結果を表現した図	
参考サイト：https://www.i-juse.co.jp/statistics/product/func/nqc/rdiag.html
- 親和図	
ブレーンストーミングの結果をグループ化したもの	
- 系統図	
目的と手段を並べた図。階層構造をしている。	
参考サイト：https://www.exseal.co.jp/blog/taxonomy-10/6130/
- アローダイアグラム	
タスクの依存関係を表現できる図	
- PDPC法		
順調に物事が進む場合のシナリオをワークフロー風に表現する。さらにそれに対して起こりうる障壁を追加し、対策を考える方法。
参考サイト：https://takuminotie.com/blog/quality/%ef%bd%90%ef%bd%84%ef%bd%90%ef%bd%83%e6%b3%95/
Substance Painterにログインできない時

# 概要
Substance Painterにログインする時、認証のポップアップが開いて指示に従って進めていくと「セキュアなブラウザではありません」とエラーが表示されて進行できなくなる時があります。
![スクリーンショット 2024-07-08 232249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/324d4728-b88d-a779-55a7-3c547d2b0a5d.png)
# 本文
この場合は、Adobe Creative Cloudを起動して認証後、SubstancePainterを起動すれば問題を回避できます。

![スクリーンショット 2024-07-08 232354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/efb41da4-11ac-eb74-5176-7df3bfefdc58.png)

:::note info
一度この手順でログイン出来たら、次からは直接Substance Painterから起動できるようになります。
:::
【自分用】内包表記の書き方（リスト、辞書、集合）

# この記事を書いたきっかけ
Pythonでプログラミングの練習をしています。一般的なリストや辞書を書くことには慣れてきましたが、内包表記にはなかなか慣れません。内包表記を使ってリストや辞書をうまく書くには、その構造をよく理解して何度も練習する必要があります。

そこで、内包表記の書き方を簡単にまとめたいと思い、記事にしました。
***
**オススメの記事**

https://note.nkmk.me/python-list-comprehension/

https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions

https://qiita.com/puchi2121/items/4163d177f54f80d913f3

# 内包表記とは
内包表記とは、Pythonにおいてイテラブル（例えばリスト、辞書、集合など）から新しいイテラブルを簡潔に生成するための構文です。読みやすいコードを簡単に書くことができます。

## 1. リスト内包表記
リストから新しいリストを作成する際に使います。条件を加えてフィルタリングや要素の変換ができます。

**コード例**　

```python
# 0から9までの数値の二乗をリストにする
squares = [x**2 for x in range(10)]
print(squares)  # 出力: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
```

**条件付きの例**

```python
# 0から9までの偶数の二乗をリストにする
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares)  # 出力: [0, 4, 16, 36, 64]
```

## 2. 辞書内包表記 
辞書やリスト、タプルなどから新しい辞書を作成する際に使います。

**コード例**

```python
# 0から9までの数値とその二乗のペアを持つ辞書を作成
square_dict = {x: x**2 for x in range(10)}
print(square_dict)  # 出力: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
```
**条件付きの例**

```python
# 0から9までの偶数とその二乗のペアを持つ辞書を作成
even_square_dict = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_square_dict)  # 出力: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
```
## 3. 集合内包表記
イテラブルから新しい集合を作成する際に使います。重複を自動的に排除します。

**コード例**

```python
# 文字列内の文字を大文字に変換し、重複を排除して集合にする
unique_chars = {char.upper() for char in "hello world"}
print(unique_chars)  # 出力: {'L', 'O', 'E', 'R', 'H', 'W', 'D'}
```
**条件付きの例**

```python
# 文字列内の母音を大文字に変換し、重複を排除して集合にする
vowels = {char.upper() for char in "hello world" if char in 'aeiou'}
print(vowels)  # 出力: {'O', 'E'}
```


# ネストした内包表記
## 1. ネストしたリスト内包表記
2次元リストのような複雑なデータ構造を平坦化する場合や、ネストしたループで新しいリストを作成する場合に使用します。

**コード例**

```python
# 2次元リストを1次元リストに平坦化する
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)  # 出力: [1, 2, 3, 4, 5, 6, 7, 8, 9]
```
**条件付きの例**

```python
# 2次元リストから偶数だけを取り出して1次元リストに平坦化する
even_flattened = [num for row in matrix for num in row if num % 2 == 0]
print(even_flattened)  # 出力: [2, 4, 6, 8]
```
## 2. ネストした辞書内包表記
辞書のキーと値を複雑な変換を行いたい場合や、ネストしたループを使用して新しい辞書を作成する場合に使用します。

**コード例**

```python
# ネストした辞書を作成
nested_dict = {(i, j): i * j for i in range(3) for j in range(3)}
print(nested_dict)  # 出力: {(0, 0): 0, (0, 1): 0, (0, 2): 0, (1, 0): 0, (1, 1): 1, (1, 2): 2, (2, 0): 0, (2, 1): 2, (2, 2): 4}
```
**条件付きの例**

```python
# 条件を満たすペアのみを含むネストした辞書を作成
filtered_nested_dict = {(i, j): i * j for i in range(3) for j in range(3) if i != j}
print(filtered_nested_dict)  # 出力: {(0, 1): 0, (0, 2): 0, (1, 0): 0, (1, 2): 2, (2, 0): 0, (2, 1): 2}
```
## 3. ネストした集合内包表記
ネストしたループで新しい集合を作成する場合に使用します。

**コード例**

```python
# 2次元リストの全要素を集合に変換
matrix = [[1, 2, 2], [3, 4, 4], [5, 5, 6]]
unique_nums = {num for row in matrix for num in row}
print(unique_nums)  # 出力: {1, 2, 3, 4, 5, 6}
```
**条件付きの例**

```python
# 2次元リストから偶数のみを取り出して集合に変換
even_unique_nums = {num for row in matrix for num in row if num % 2 == 0}
print(even_unique_nums)  # 出力: {2, 4, 6}
```


# まとめ
この記事は内包表記をうまく書けるようにするために書きました。ただ、何度も練習しないと内包表記を書けるようになりません。
内包表記を練習してみて、よくわからなくなったら、この記事やリンクのオススメの記事を見直したいと思います。
Goのヒープとスタックについて

# Goのヒープとスタックについて

## はじめに
Go言語では、メモリ管理が自動的に行われ、プログラマが直接メモリを管理する必要はありません。しかし、ヒープとスタックの違いを理解することは、効率的なプログラムを書くために重要です。この記事では、Goのヒープとスタックについて説明し、それぞれの特徴、利点、注意点について解説します。

## 目次
1. [ヒープとは](#ヒープとは)
2. [スタックとは](#スタックとは)
3. [ヒープとスタックの違い](#ヒープとスタックの違い)
4. [Goにおけるメモリ管理](#goにおけるメモリ管理)
5. [ヒープとスタックの使い分け](#ヒープとスタックの使い分け)
6. [まとめ](#まとめ)

## ヒープとは
ヒープは、動的にメモリを割り当てるための領域です。ヒープに割り当てられたメモリは、プログラムの実行中に動的に確保され、必要がなくなるまで保持されます。ヒープメモリは、ガベージコレクタによって自動的に解放されます。

### 特徴
- **動的メモリ割り当て**: 実行時に必要なメモリを動的に確保します。
- **長寿命**: メモリはガベージコレクタによって解放されるまで保持されます。
- **柔軟性**: 任意のタイミングでメモリを確保できます。

### 利点
- **柔軟なメモリ管理**: 動的にメモリを確保できるため、柔軟なメモリ管理が可能です。
- **大きなデータの管理**: 大きなデータ構造や長期間保持するデータに適しています。

### 注意点
- **パフォーマンスの低下**: ヒープメモリの割り当てと解放にはオーバーヘッドが伴います。
- **ガベージコレクション**: ガベージコレクタが動作する際に一時的なパフォーマンス低下が発生することがあります。

## スタックとは
スタックは、関数の呼び出しやローカル変数の管理に使用されるメモリ領域です。スタックに割り当てられたメモリは、関数の呼び出しが終了すると自動的に解放されます。

### 特徴
- **自動メモリ管理**: 関数の呼び出しとともにメモリが確保され、関数の終了とともに解放されます。
- **高速**: スタックメモリの割り当てと解放は非常に高速です。
- **短寿命**: メモリは関数のスコープ内でのみ有効です。

### 利点
- **高速なメモリ管理**: スタックメモリの割り当てと解放は非常に高速です。
- **簡単なメモリ管理**: メモリの確保と解放が自動的に行われるため、プログラマが管理する必要がありません。

### 注意点
- **制限されたサイズ**: スタックのサイズは限られており、大きなデータ構造には適していません。
- **短寿命**: メモリは関数のスコープ内でのみ有効であり、関数が終了すると解放されます。

## ヒープとスタックの違い
| 特徴 | ヒープ | スタック |
|------|--------|----------|
| メモリ割り当て | 動的 | 静的 |
| メモリ解放 | ガベージコレクタ | 自動 |
| パフォーマンス | 低い | 高い |
| メモリサイズ | 大きい | 小さい |
| 寿命 | 長い | 短い |

## Goにおけるメモリ管理
Go言語では、メモリ管理が自動的に行われます。Goのコンパイラとランタイムは、変数がヒープに割り当てられるかスタックに割り当てられるかを自動的に決定します。一般的に、ローカル変数はスタックに割り当てられ、長期間保持されるデータや大きなデータ構造はヒープに割り当てられます。

### 例: スタックメモリの使用
```go:例
package main

import "fmt"

func main() {
    a := 10
    b := 20
    fmt.Println(a + b)
}
```
この例では、変数 `a` と `b` はスタックに割り当てられます。

### 例: ヒープメモリの使用
```go:例
package main

import "fmt"

func main() {
    a := new(int)
    *a = 10
    fmt.Println(*a)
}
```
この例では、変数 `a` はヒープに割り当てられます。

## ヒープとスタックの使い分け
- **短期間のデータ**: 関数内でのみ使用される短期間のデータはスタックに割り当てられます。
- **長期間のデータ**: 関数の外でも使用される長期間のデータや大きなデータ構造はヒープに割り当てられます。

## まとめ
Go言語では、スタックは高速で自動的にメモリ管理が行われるため、短期間のデータに適しています。一方、ヒープは柔軟で大きなデータ構造や長期間保持するデータに適しています。Goのコンパイラとランタイムは、これらのメモリ管理を自動的に行うため、プログラマはメモリ管理の詳細を気にせずにプログラムを書くことができます。
JavaScriptの文法アウトプット②

業務でJavaScriptを使用しているので知識の定着を目的としてアウトプットします。
第二弾です。

# 変数
値を格納する箱、入れ物のこと。

## 変数の種類

<table>

  <thead>
    <tr>
      <th>タイプ</th> <th>再宣言</th> <th>再代入</th> <th>スコープ</th> <th>初期化</th>
    </tr>
  </thead>
  <tr>
    <td> let </td> <td>×</td> <td>○</td> <td>ブロック</td> <td>×</td>
  </tr>
  <tr>
    <td> const </td> <td>×</td> <td>×</td> <td>ブロック</td> <td>×</td>
  </tr>
  <tr>
    <td> var </td> <td>○</td> <td>○</td> <td>関数</td> <td>undefined</td>
  </tr>
</table>

### 再宣言
let, constでは同じ変数名で再度値を宣言しようとするとエラーになる。
```
let i = 0
let i = 1
```

### 再代入
let, varでは同じ変数名で値を再代入することが出来る。
constは定数として扱われるので同じ変数名で値を再代入することは出来ない。

```
let num = 0;
num = 10;
```

```
const num = 0;
num = 10; ←　エラーになる
```
Whisperモデルの誤変換を実測してみる

Whisperモデルは文字起こしエンジンとしておそらく世界最強ですが
実際の変換を見てみると、それでも誤変換が目につくことが有ります。

今回実測してみました。

---

https://platform.openai.com/docs/api-reference/audio/verbose-json-object

によれば、
Whisperモデルの変換結果のJSONには
* no_speech_prob
* avg_logprob
* compression_ratio
の3種類の失敗に関連しそうな出力があります。

```
    avg_logprob, number
    
    Average logprob of the segment. If the value is lower than -1, consider the logprobs failed.  
    
    compression_ratio, number
    
    Compression ratio of the segment. If the value is greater than 2.4, consider the compression failed.
    
    no_speech_prob, number
    
    Probability of no speech in the segment. If the value is higher than 1.0 and the avg_logprob is below -1, consider this segment silent.  
   
``` 

no_speech_prob　が無音らしさで、
avg_logprob　が有音らしさ
compression_ratio　が圧縮率（文字数 / セグメントの時間）

のようなのです。
リファレンスにはそれぞれ
no_speech_prob　1
avg_logprob　-1
compression_ratio  2.4

というしきい値が書いてありますが、
その前提の上である程度はドロップされたJSON出力がでていると思うんですが、
これ自分でドロップしないといけない？？

この閾値のあたいって、実際どんなもんなんってのが今回の課題です。

---

ちょっと2時間くらいの音声を変換して、
出力結果をヒストグラムにしました。

## (1) no_speech_prob

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812996/6c6f15ca-67de-dab7-5045-4f028690830c.png)

概ね0.3くらいにおさまっています
ただ、0.2くらいでもデタラメに変換されていることもあり、
0.8程度でも正しく文字起こしされているケースも有りました。

    0.20024192333221436 もちろん станов木曽明さんさんの思った。
    0.20024192333221436 あの19ニW Systemであるくらい書いている。
    0.20024192333221436 で、教育委託の 누나 Duke Inouyeさんの世界からの活動をお見せ
    0.20024192333221436 いただか н Ramen lnio 分 meg助一郎様と出舌もizi

デタラメの一例。日本語音声なのに、英語ハングルキリル文字ごちゃまぜです。もちろん意味も通らない。

**無音らしさ＝元音源の音量と考えたほうが良さそうです。**

今回変換した音声では0.15未満は流石にOKでした。

## (2) avg_logprob


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812996/264bfdfb-f842-1f44-01ec-1645c58f77a5.png)

avg_logprobは、概ね−１〜０におさまっていました。

-2.5より小さくなるとデタラメでした。

    -3.2664102903554135 それも術ism、
    -3.2664102903554135 5籠と去� show では、
    -3.2664102903554135 中造型樹脂繃脛 2020.03. sexual assault

雑音をむりやり変換してこうなってしまう場合があります。
術イズムってなんやねん。

## (3) compression_ratio

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812996/bbe2732d-f8a7-258d-8f70-9bf0df09e145.png)

こちらは仕様書の通り2.4より大きなセクションがほとんどありませんでした。
音声データの最後の、３０秒単位に足りない端数だけ、圧縮率が5.3くらいになっていました。

---

結局誤変換をどう落とせばよいか、


* no_speech_probがpythonのデフォルト値0.6(あるいは実測値の0.15)よりおおきく、
  かつavg_logprobが-1(あるいは実測値の-2.5）より大きい
* compression_ratio が2.4より大きい

の条件でdropするのがまずは良さそうです。


Whisperの精度をチョイ足しであげたい場合にお試しください
【Mermaid】Mermaid で作成した図を Github の readme に組み込んだ

## 記事の背景
今まで Github の Readme は文字しか入れてきませんでしたが、この度は　Mermaid で作成した図を組み込みました。

## Mermaid とは
Mermaid はダイアグラムやフローチャートなどをコードで記述して生成するツールです。

https://mermaid.js.org/

記述方法などは公式がチュートリアルを出しているので、興味のある方は試してみてください。

## 作った Android アプリ
今回私が作ったアプリは JSON ファイルから観光地の名前と簡単な説明を取得し、それを jetpack compose で作った画面の上にリストとして表示させるアプリです。

viewModel を使用しており、MVVM アーキテクチャに従ってアプリを作成しています。

まだまだ、未実装の機能が多いためこれからも実装を進めるつもりです。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/47470767-bfc6-3a7d-1078-25e9200d6f21.gif width=400>

ちなみに使用した JSON ファイルは GPT-4o に作成してもらいました。ファイルの中身を全くいじらなくても使用できます。

このアプリについての記事は後日掲載します。

## Mermaid 記述時のツール
コードの記述は VSCode で行い、拡張機能をダウンロードしてプレビューをチェックしながら編集を行いました。

使用した拡張機能は以下の２つです。

- Markdown Preview Enhanced
    - https://shd101wyy.github.io/markdown-preview-enhanced/#/ja-jp/
- Mermaid Markdown Syntax Highlighting
    - https://marketplace.visualstudio.com/items?itemName=bpruitt-goddard.mermaid-markdown-syntax-highlighting

この２つの拡張機能により Mermaid の記述効率が大幅に向上します。

プレビューが本当に便利なんです！

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/e86a5ea8-5937-95f5-5995-506c0569fbed.gif width=450>




## Github 上で確認する
エディタ上で完成した図を Github 上でも確認しましょう。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/d1c79acb-2184-7c39-62c9-9cbe0b5b3738.png width=500>

このように Github 上でも図が表示されていることが確認できました。

リンクを貼っておきますので、よろしければ確認してみてください。

https://github.com/jtakumi/jetpackList

## Mermaid に触れた感想
最初は、Mermaid 独特のコード文法が慣れず使いこなすために時間を要しましたが、慣れてくると自動で図を綺麗にまとめてくれるのがとてもありがたく感じました。

今後もこのツールは実装前にアプリのイメージを固めるために使おうと思います。
Elixir Image で透過画像の背景を塗りつぶす

## はじめに

Elixir の Image モジュールで透過画像（PNG や SVG など）の背景（透明になっている箇所）を塗りつぶします

https://github.com/elixir-image/image

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/vix/flatten.livemd

## セットアップ

必要なモジュールをインストールします

```elixir
Mix.install([
  {:image, "~> 0.52"},
  {:req, "~> 0.5"},
  {:kino, "~> 0.13"}
])
```

- [Image](https://github.com/elixir-image/image): 画像処理
- [Req](https://github.com/wojtekmach/req): HTTP クライアント
- [Kino](https://github.com/livebook-dev/kino): Livebook の UI/UX

## 画像の準備

ElixirConf EU のロゴ画像をダウンロードしてきます

```elixir
original_img =
  "https://www.elixirconf.eu/assets/images/drops.svg"
  |> Req.get!()
  |> Map.get(:body)
  |> Image.from_binary!()
```

![スクリーンショット 2024-07-08 23.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/57c5db12-3974-06c7-cfdb-85cf8641a6f5.png)

## 背景の塗りつぶし

`Image.flatten` で背景を塗りつぶします

```elixir
Image.flatten!(original_img)
```

![スクリーンショット 2024-07-08 23.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/dd05264e-aca1-fcec-52dc-2190841ef78a.png)

第2引数のオプションで背景色を指定できます

```elixir
Image.flatten!(original_img, background_color: :blue)
```

![スクリーンショット 2024-07-08 23.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/c442f386-859e-003b-7c6f-707ba1fe5906.png)

## まとめ

以前 Image に関する記事を書いた頃は 0.35 だったのですが、もう 0.52 まで進んでいて驚きました

Image モジュールを使うと、多様な画像処理が簡単に実装できるのでオススメです
Visual Studio Code(version 1.91)が突然開かなくなった

## VScodeが突然動かなくなったので復旧方法を残しておきます

下のように一瞬起動するもすぐに落ちてしまう
![ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/7b53c564-6643-c836-abfe-e14ff23e09ef.gif)

## 解決方法
[VScode](https://code.visualstudio.com/)の公式ページから古いVScodeをインストールする

![スクリーンショット 2024-07-08 22.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/1c4c49c9-afc5-f618-30be-b91c232ca927.png)

私はmacOS11.6.5でversion 1.90をインストールしました
![スクリーンショット 2024-07-08 23.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/c009094f-1ecf-218c-3f4c-291667234624.png)


macの場合は既存のVScodeがあっても、今回ダウンロードしたVScodeをアプリケーションフォルダに「置き換える」で置けばOKです

無事version 1.91 -> 1.90にして動くようになりました。(バージョンのロールバックというらしい)

## 自動でアップデートしないようにする
自動アップデートでまた1.91にアップデートしてしまうと困るので、自動更新をオフにしておきます。
設定 > 検索で「更新」を入力 > Update: Modeをnoneに設定します
![スクリーンショット 2024-07-08 23.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/c2f2f8c1-f87c-0c0e-eb0c-1b7a420184e2.png)

## おまけ
調査方法も知ったのでおまけで書いておきます。
```/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code --verbose ```
codeコマンドを実行したときに出るエラーを見ることができる

setting.jsonの記述がおかしく、起動しない場合もあるようで、その際はsetting.jsonを消すまたはリネームすると良さそう
```/Users/.user/Library/Application Support/Code/User/settings.json```
ここにあります。
【Python】unicodedataのeast_asian_widthで半角か全角かを判断する

# 概要
連携される文字列が「半角なのか全角なのか」を判定させる必要があったので、pythonの`unicodedata`モジュールを利用してみました。サンプルコードを紹介します。

公式ドキュメントはこちら。

> unicodedata.east_asian_width(chr)
ユニコード文字 chr に割り当てられたeast asian widthを文字列で返します。


https://docs.python.org/ja/3.6/library/unicodedata.html


# サンプルコード解説
`unicodedata`モジュールの`east_asian_width`を利用すると、「東アジアの文字幅」のカテゴリーが返ってきます。
主に以下の4つがあります。

F (Fullwidth)：全角英数
W (Wide)：全角かな、漢字
H (Halfwidth)：半角カタカナ
A (Ambiguous)：特殊文字

https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85

Pythonで実際にそれぞれ見てみます。
すると結果は以下の通り。

```py
import unicodedata


def get_east_asian_width_first_char(s):
    return unicodedata.east_asian_width(s[0])

fullwidth_num = get_east_asian_width_first_char('２')
print(fullwidth_num)
# F

fullwidth_char = get_east_asian_width_first_char('Ａ')
print(fullwidth_char)
# F

kanji = get_east_asian_width_first_char('漢字')
print(kanji)
# W

hiragana = get_east_asian_width_first_char('あ')
print(hiragana)
# W

katakana = get_east_asian_width_first_char('ア')
print(katakana)
# W

halfwidth_katakana = get_east_asian_width_first_char('ｱ')
print(halfwidth_katakana)
# H

tokusyu_moji = get_east_asian_width_first_char('▲')
print(tokusyu_moji)
# A
```

また、
F, W, Aは全角なので2文字分、
H, Na, Nは半角なので1文字分
として扱われます。

参考

https://note.nkmk.me/python-unicodedata-east-asian-width-count/
Sequence Makerを同時に複数動かす方法！？

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence MakerはExcelと連携して動作するため、Sequence Makerの処理が動いているときはExcelが使えません（正確には中途半端に使える場合もあるのですが、動作がおかしくなったり、処理が止まったりするので終わるまでそっとしておくのが無難）。しかし、それではちょっと不便ですし、またSequence Makerの処理を複数同時に動かしたいなんてこともあるかも！？しれません。この記事ではSequence Makerの処理を複数同時に動かす方法について解説していきます。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 結論
Excelを「Alt」キーを押しながら別プロセスで起動すればOK！

## 実際にやってみる
### 普通にExcelを起動した場合
まずは普通にExcelを1つ起動します。
タスクマネージャーで確認すると、Excelのプロセスが1つ立ち上がっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/c582d5ed-01b4-f4e7-43c4-97c11f382699.png)

さらにExcelをもう1つ起動します。同じプロセスで2つめのExcelが起動しました。これだと片方のExcelでSequence Makerを実行すると同じプロセスの他のExcelは全て使えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/94f5de3f-7109-6e99-0dff-680bcffc35c7.png)

### 別プロセスでExcelを起動した場合
次に別プロセスでExcelを起動してみます。
まずはExcelを1つ普通に起動します。
その次に***ALTキーを押しながら***2つめのExcelを起動します。すると以下のようなメッセージが表示されるので「はい」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/6ab8e16b-d95d-f585-298b-6595ecfc75cc.png)

すると、先ほどと同じように2つ目のExcelが起動しますが、タスクマネージャーで見ると別プロセスになっていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/dfdf6065-8680-c4c9-9152-c4e8e800930f.png)

同じ手順を繰り返すと、いくつでも別プロセスでExcelを起動することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/8a61c509-2447-2e01-df51-0631885e06ff.png)

このようにして起動したExcelは別々に操作可能なので、Sequence Makerを複数動かすことが可能です。

## メモリーはたくさん必要
Excelを別プロセスで起動すると、それぞれのプロセスに対してメモリーが割り当てられます。メモリーはできるだけたくさん積んでおきましょう。

:::note
メモリーは多ければ多いほど良い。
:::

## まとめ
Altキーを押して別プロセスでExcelを起動することでSequence Makerを複数同時に動かすことが可能ですが、あまり複数動かすと訳が分からなくなったり、間違って停止してしまったりと事故が発生するリスクも増えていきますので、個人的にはあまりオススメはしたくありません。大切なデータを取得するような場合は、パソコンを複数台用意する方が安全です。
『エンジニアのための時間管理術』読書メモ

# 概要

[『エンジニアのための時間管理術』](https://www.oreilly.co.jp/books/9784873113074/)の読書メモ。
```
Thomas A. Limoncelli　著
株式会社クイープ　訳
発行年月日：2006年10月
ページ数：272
ISBN：978-4-87311-307-4
```
## なぜ読もうと思ったか。

タイムマネジメントについての考え方や手法を取り入れたいと思ったため。
(タイトルに釣られて…というのが本音🐟)

## 1章：タイムマネジメントの原則

- エンジニアはタイムマネジメントが難しい。
    - プロジェクトワークと割り込みが入り混じる職業。
- **外部からの割り込み**は生産性を低下させる。
    - 中断した作業に戻るには時間がかかり、エラーが紛れ込む可能性がある

## 2章：集中と割り込み

- 自身の身体活動と知的活動のピーク時を把握する。
    - 年齢や体調によっても変化する。
- 委任、記録、実行
    - **委任**：×「今忙しいので別の人にお願いします」○「xxxさんが詳しいので聞いてみましょう」→ xxxさんに繋ぐ。
    - **記録**：要求者に記録している様子を見せる。
    - **実行**：2分以内に対処できることは、その場で実行する。
- 1日の最初の1時間は最も重要なプロジェクトのために使う。
    - 邪魔が入らない時間帯。

## 3章：ルーチン

- 「一度だけ考え、何度も実行する」手段。
- 積極的にルーチン化できる作業を探していく。

## 4-7章：サイクルシステム

- 自分の記憶力を信用しない。
- オーガナイザーに記録する。
    - 物事を整理・管理する道具のこと。
    - 本書では、カレンダーと日々の予定を管理できるものを指している。
- 毎日の最初の10分をその日の計画に充てる。
    - 1日の業務の全容を把握する。
- １日の終わりには全ての項目が処理されているようにする。
- プライベートな作業も同じシステムを使って管理する。
    - 歯医者や資格勉強、Qiita書いたりなど。
- プライベートと仕事の予定を１つのカレンダーで管理する。
    - 手帳で一元化している。
    - カレンダーを確認する間、相手を待たせてしまうことを躊躇しない。
        - ダブルブッキングで再調整が必要になったほうが相手にとって不都合である。
- 目標の期日を決めつつ、オーガナイザーに書き留める。
    - 仕事/プライベートの両方で、**ひと月、1年、5年の目標**をリストアップする。
    - 定期的に目標を見直す。

## 8章：優先順位

- 顧客の期待に基づいて優先順位を決める。
    - 顧客がすぐに済むと考えている作業を先に行う。
    - 顧客は、小さな要求がすぐに処理されることを期待する。
- 上司からの要求は特別に優遇する。
    - 自身が気付いていない依存関係が付随していることが多い。
    - 上司と良い関係を築く。
        - マネジメントは一方通行ではない。
            - 上司の目標を理解し、その達成に貢献する。
                - 自身のキャリアのゴールに向かう支援をしてくれる。
                - 上司の権限が活かされる作業を、委任しやすくなる。

## 9章：ストレスの管理

- システム管理はストレスの多い仕事である。
    - ストレスをうまく対処するのもエンジニアの仕事。
- リラクゼーションを実施し、意図的にリラックスする時間を設ける。
- 休暇は用事を済ませるのに使うのではなく、リラクゼーションやストレス解消のために使う。
- 休憩すること。
    > P.145
    > **いまわの際の言葉が「もっと仕事の時間を増やせばよかった」という人はいない。リラックスしよう。たかが1と0のことではないか。**
    > 

## 10章：電子メールの管理

・SlackやBacklogでのやりとりが多いため割愛。

## 11章：時間の浪費

- 費やした時間に対する利益の割合が低い活動のことを指す。
    
    ```plaintext
    例）
    - 無駄な会議
    - 洗濯と掃除
    - ゲームなど誘惑してくるもの
    - 必要以上の業務に関係ないオフィスでの交流
    ```
    
- ルールを課す。
    - 例）10分後やめるために、アラームをセットする。
- 自動化できないか考える観点を持つ。

## 12章：文書化

- ドキュメントは、優れたタイムマネジメントツールである。
    - 作業を他人に委任しやすい。
    - 作業手順を思い出す手間を削減できる。

## 13章：自動化

- 作業の自動化は特別なご褒美。
    - 時間がかかるが、その努力が大きく報われる可能性が高い作業である。
- 「一度だけ行う難しい作業」と「頻繁に行う簡単な作業」は自動化に向いている。
    - 「頻繁に行う難しい作業」は市販パッケージを使用する方がうまく処理できる。

## おわりに

- 時間管理術によって生まれた「新しい」自由時間をどう使うか。
    - 時間の浪費しないでほしい。
    - 自身の趣味の時間や家族との時間に使ってほしい。
コマンドの結果を変数に格納

以下のようなシェルスクリプトを実行すると、出力は改行が含まれていない状態でされます。これは見にくいのであまり良くないです。
```
x=$(df -h)
echo $x
```

そんな時は以下のようにしてください。
```
echo "$x"
```

上記処理で改行が含まれた出力になります。
ディスク容量通知メール

以下のシェルスクリプトを実行することで、Linuxマシンのディスク容量を通知することができます。
```
disk="$(df -h)"
From="xxx@xxx"
To="xxx@xxx"
Subject="xxx"

sendmail -oi -t <<EOF
From:$From
To:$To
Subject:$Subject

$disk
EOF
```

上記シェルスクリプトを`cron`などに登録することで定期的にマシンのディスク容量を通知することができます。
本のバーコードを読み取ってNotionで図書館アプリ（検討中）

本のバーコードを読み取ってNotionをデータベースとして使う図書館アプリを検討しています。

### フロー

**貸出**
貸出者バーコードの読み取り
本のバーコード読み取り
貸出日の登録

**返却**
本のバーコード読み取り
返却日の登録

※２回目以降は情報の上書きを実施

### 項目
ISBN
貸出日
返却日
貸出者

参考文献
本のバーコードを読み取るアプリはこの記事が参考になりました。

https://zenn.dev/nyoroko/articles/6b6b58c044505e

↑上記で工夫が必要だった点
 ※GAS側でNotionデータベースのタイトルの指定が必要。
 ※GASのhtml上からgoogle.script.runでコード.gsのJavaScriptを呼び出すのに苦労した。
 ※カメラの位置を変えないとバーコードを読み込み続けてしまう。setTimeoutを長くする。
 
https://qiita.com/kaonaga9/items/6a4448253d340cb99802

https://mam-mam.net/javascript/js_quagga.html

https://zenn.dev/agdf/articles/131fa5eb565515
LeetCode挑戦日記：Day31

# はじめに

最近、業務で実装する時間よりも資料作成やレビューをする時間が多くなってきました。
このままでは自身のコーディング能力が落ちそうで怖いので、LeetCodeを始めてみました。

自身の学習の記録 & LeetCodeに興味のある人が挑戦しやすいように、記事に残していきます。
このような競技プログラミングをした経験がないので、ひよってEasyからやっていきます...

# [Easy] 206. Reverse Linked List

単方向リンクリストの先頭が与えられたとき、リストを反転させ、反転したリストを返します。

## 素直に解いてみる

### 考え方

1. 次のnodeのnextに1つ前のnodeを入れていく

### コーディング

```typescript
function reverseList(head: ListNode | null): ListNode | null {
    let prev = null;
    let now = head;
    while (now) {
        let next = now.next;
        now.next = prev;
        prev = now;
        now = next;
    }

    return prev;
};
```

### 結果

Runtime：43ms
Beats 99.90%

Memory：52.89MB
Beats 16.72%