OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity初歩】~ステージを作る~

# はじめに
プレイヤが移動できるようになったので、ステージを作っていきます。
また、ステージ移動の際にカメラがプレイヤに合わせて動くようにしたいと思います。

前回の記事

https://qiita.com/usomaru/items/fe76f652a950c51dec43

# ステージを作る

地面のPrefabを作ることで地面を量産していきます。
Prefabは、同じものをたくさん作りたい場合に使います。

原本の地面(base)をプロジェクトウィンドウにドラッグアンドドロップします。
すると、地面のPrefabが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/90a33c9a-a1e9-9cab-4ff0-1714914ad081.png)

作成された地面のPrefabをステージ(シーンビュー)に必要な数だけドラックアンドドロップします。
※ここでは消し忘れましたが、原本は削除して大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/feb0a8a3-7fbe-2353-d7b9-2dea04d47d64.png)

ジャンプをして地面に着地していくゲームっぽくなりました。
ですが、このままでは画面範囲外に移動してもカメラが追従しないため、🦀が消えてしまいます。

# カメラがプレイヤに追従するようにする

カメラもゲームオブジェクトの一種のため、スクリプトをかくことで動かすことができます。
ファイル名をCameraControllerとしてスクリプトを以下のようにかいてみました。

```c#
using UnityEngine;

public class CameraController : MonoBehaviour
{
    GameObject player;
    // Start is called before the first frame update
    void Start()
    {
        this.player = GameObject.Find("Kani");
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 pos = this.player.transform.position;
        transform.position = new Vector3(pos.x, transform.position.y, transform.position.z);
    }
}
```

プレイヤの座標を調べて(pos)、x座標をプレイヤに合わせて変更するようにしています。

スクリプトをカメラコントローラにアタッチして動かしてみると、カメラがプレイヤに合わせて動くようになりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201826/98296dd9-ec7f-a378-4284-3d83bdd9f4d6.png)


https://twitter.com/usomaru26/status/1733318225176474061

# おわりに
ステージを移動させていく処理をjavascriptで作成したときはめんどくさかったので、カメラにスクリプトを当てることでこんなに簡単に移動できるゲームが作れていいなと思いました。
Ubuntu22.04.3に簡単にCursorをインストールできるシェルスクリプトを発見

CursorのgithubのIssuesを見ていたら、Linuxに簡単にCursorをインストールできるシェルスクリプトを作成している人がいました。

https://github.com/getcursor/cursor/issues/844

ホームフォルダに`Applications`フォルダを作成し、ダウンロードした`.AppImage`ファイルと作成（少し修正）した`CursorDesktopIntegrator.sh`をそこに移動して、`CursorDesktopIntegrator.sh`を実行すれば、メニュへの登録・アイコンの登録を自動的に行うことができました。

修正したところは、`CursorDesktopIntegrator.sh`の16行目を
```diff_shell
-  curl -o $ICON_PATH "https://www.cursor.so/brand/icon.svg"
+  curl -o $ICON_PATH -L "https://www.cursor.so/brand/icon.svg"
```

36行目を
```diff_shell
-  chmod +x $DESKTOP_FILE_PATH
+  chmod +x $DESKTOP_FILE_PATH $LATEST_APPIMAGE
```

あと、Xubuntu22.04.3を最小インストールした環境だったので、`curl`のインストールを`CursorDesktopIntegrator.sh`の実行前に行う必要がありました。

ホームフォルダに`Applications`フォルダを作成し、今回ダウンロードした`cursor-0.18.6-build-231207ueqazwde8.AppImage`と作成した`CursorDesktopIntegrator.sh`をそこに移動した後、ターミナルを起動して
```shell
sudo apt install curl -y

bash ./Applications/CursorDesktopIntegrator.sh
```
これで、アイコン付きでメニューに登録されました。
ffmpegビルド用configureオプション2023年末：音声のみ、m4aとwavのみ、サイズ小さく

# オプションの例

今回のffmegビルドの要件
- m4aとwavファイル程度しか処理しない
- 音質はこだわらない
- 実行ファイルをできるだけ小さくしたい
- windows用
- ubuntuでビルド

この要件を満たすオプションが以下です。

```
./configure  \
  --arch=x86_64  \
  --target-os=mingw64 \
  --cross-prefix=x86_64-w64-mingw32- \
  --enable-cross-compile  \
  --enable-static \
  --disable-everything \
  --disable-network \
  --enable-autodetect \
  --disable-debug \
  --disable-ffprobe \
  --enable-gpl \
  --enable-version3 \
  --disable-libfdk-aac \
  --disable-libmp3lame \
  --enable-ffmpeg \
  --enable-decoder=aac*,mp3,ac3*,pcm*,wav,3g*,m4*,mj2,mov \
  --enable-encoder=aac,flac,mp3,wav,mp4,pcm* \
  --enable-parser=mpegaudio \
  --enable-demuxer=aac*,mp3,ac3*,pcm*,wav,mp4,m4a,3g*,m4*,mj2,mov \
  --enable-muxer=aac,ipod,flac,mp3,wav,mp4,pcm* \
  --enable-filter=aresample \
  --enable-protocol=file
```

生成されたffmpeg.exeは3.5MB程度。まだ無駄があるかもしれませんが。

なお、windows用のオプションは次の部分です。これを省けば、自機向けバイナリになります。
```
  --arch=x86_64  \
  --target-os=mingw64 \
  --cross-prefix=x86_64-w64-mingw32- \
  --enable-cross-compile  \
```

# 雑感

この記事の目的は個人的なメモです。すみません。
同じことを考えている人はあまりいらっしゃらないかなと思っています。

今回は、デコードはmp3,mp4,wavを受け付けるようにし、エンコードはm4a,wavぐらいで良いので、できるだけ小さいサイズのffmpegバイナリを作りたいと考えました。

とにかく、ffmpegは万能で、これ一つで何でもできる。しかも、使っていて勉強にもなる。
だけど、実行ファイルが巨大で120MBにもなったりするし、オプションを少し入れたバイナリは20MB程度。そして、`--disable-everything`を入れたバイナリは２MB程度。
ということで、ffmpegのサイズ下限は2MBなのだろうと思います。`--disable-everything`を入れなければ、20MB程度ですが、エンコードができないバイナリでした。`--disable-everything`ではない場合は何を入れているのか？が未だ疑問です。

ffmpegのビルドコンフィグには膨大なオプションがあります。案内は次で表示されるようです。
```
./configure --help
```
ただ、これを読んでも、私には目的を果たすオプションが判りませんでした。 chatGPTやBardにも聞いてみたのですが、目的のものズバリは答えてくれませんでした。(2023.12/8現在）

試行錯誤の方法を示すと、次のおとりです。

- 最終的にはクロスですが、まずは自機用にビルド
- コンフィグのオプションを変える
- make
- 実行でエラーが出ないかを確認

次の１行を書いて実行してました。
```
./configure (例のオプション) && make -j8 && ./ffmpeg -i in.mp3 -ar 16000 -ac 1 -c:a pcm_s16le out.wav && ./ffmpeg -i out.wav out.m4a
```

生成されたバイナリの実行は、次の２通りを行いました。
- mp3 → wav
- wav → m4a

最初は、mp3を読めないというエラーがほとんどでした。そのエラーが出なくなるためのオプションを思い着く限り書いて実行を繰り返します。成功したら本当に音声になっているかをチェックします。その後、wavに変換できないというエラー、m4aに変換出来ないというエラーに対してトライアンドエラーを繰り返しました。

本当は、mp3へのエンコードも試していたのですが、結局１日ではたどりつけず断念しました。きっと、mp3エンコードは`--enable-libmp3lame`するのが最も楽な方法だろうと思います。m4aの高音質化についても`--enable-libfdk-aac`だろうと思います。lameやfdk-aacは、それぞれクロスコンパイルして、生成された静的ライブラリをリンクさせてあげるとできるようです。なぜ、それをしなかったかというと、lameを使わなくてもmp3はデコードできるし、fdk-aacを使わなくてもm4aのデコードエンコードができるし、音質にはこだわらないためです。

勘の良い方はwavへの変換オプションを読んで気付くかもしれませんが、今回のffmpegは、ボイスレコーダを対象としており、某cppな音声認識ソフトに入れるための前処理用です。そちらのソースコードに手を入れることも考えたのですが、ffmpegを外部実行する方が早く目的に到達できると考えました。

ffmpegは使い始めて１０年以上は経つのですが、進化しているのを感じます。今後も色々と勉強していきたいと思っている次第です。
Terraformにて、実践的なOCIサイトインフラを作成する。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。
最近扱ったterraformについて、更に進めたOCIサイトインフラを作ってみました。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

構成図

![OCI構成図3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1877319/7435a211-4e18-831d-1f5d-66f24dbe02ae.jpeg)

OCIの2つのVNCにて2つのプライベートSubnetを作成しており、

そのうち2つのサブネットで仮想マシンを立ち上げ。

仮想マシンからはNAT Gatewayで外部へ接続可能。

VCN1からはFLBが設置されており、別途証明書作成したSSLで外部からのWebサイトアクセス可能。

家の環境からはVPNルータCisco891FJを使用し、仮想マシンアクセス可能。

構築時はある程度自動化できるようFLB,VPN以外はI2C(Terraform)を使用し建てています。

また、外部へのメール送信は外部のメールシステムを利用しています。

本構成でOCIのみで1日3.6円（１ヶ月約108円）ですみます。

## 前提

以下のページなどを参考に、terraform稼働環境を作成し、OCIでの適当なリソースが作成できる状態にあること。

[Terraformをdocker環境で立ち上げてみる。](https://qiita.com/naritomo08/items/7e5a9d1b7eaf18dc0060)

Dockerを使用しない場合、以下のコマンドを利用できている状態になっていること。

```bash
aws

brew
*Terraform導入時に必要

tfenv
*terraform稼働コンテナを利用しない場合は必要
```

### (コンテナ利用しない場合)指定バージョン(1.5.7)のterraformを導入する。

```bash
tfenv install
```

### 以下作成中

# おわりに

まだこれから作成してきますが、気長にお待ちいただきますようお願いいたします。
FileMakerServerからファイル挿入の代わりにURLから挿入スクリプトでオブジェクトフィールドに取り込む。

# FileMakerServerからファイル挿入の代わりにURLから挿入スクリプトでObjectに取り込む。
FileMakerServerのサーバーサイドスクリプトでは「ファイル挿入」スクリプトステップが使用できない。
サーバーサイドでObjectに入れられれば、凄く便利になる気がする。

**・今回利用するのは「URLから挿入」スクリプトステップ。**
URLから挿入スクリプトを利用していい感じに取り込めたら最高。

まず、サーバーサイドのドキュメントパスは以下となる。
環境がWindowsServerなもので...Macはこれじゃダメです。
C:\Program Files\FileMaker\FileMaker Server\Data\Documents\
これは、
```
ConvertFromFileMakerPath ( Get ( ドキュメントパス ) ; WinPath )
```
で上記の値が取得できる。

**・URLから挿入スクリプトで取得する場合は、前に"file:///"をつける必要がある。**

## 私はここから躓いた。

いつものようにURLから挿入スクリプトで「自動エンコードしない」にして頑張ってました。
頑張ってエスケープの問題か？とかファイル名がおかしいのか？とか色々試行錯誤してもダメ。
エラーコード「1630」、「100」の嵐。

**諦めかけたその時、"Program Files"と"FileMaker Server"にスペースが...**
スペースを一度%20に置き換えてみたら。サーバーサイドからファイルが挿入された。
### うわぁぁぁぁぁぁぁぁぁ。

うわぁぁぁぁぁぁぁぁぁ。
もう一度スペースに置き換えて、自動エンコードにチェックを入れて再度試してみる。
うわぁぁぁぁぁぁぁぁぁ。
俺が悩んでた時間はなんだったのか。

なんやかんやでURLから挿入スクリプトでファイルがとれました。
一応今後の誰かのために
```
変数を設定[$FilePath; 値:ConvertFromFileMakerPath ( Get ( ドキュメントパス ) ; WinPath )]
変数を設定[$FileName; 値:"ここはふぁいるめいがはいります"]
変数を設定[$Path; 値:"file:///" & Substitute ( $FilePath ; Char ( 92 ) ; Char ( 47 ) ) & $FileName]
変数を設定[$cURL; 値:"Optionをつけるならここ。例えばエラー、traceとか？"]
```
あとはURLから挿入でとってくだせぇ。
一応ローカル、サーバー共に検証して、できたので、大丈夫なはずです。
今後とも良い使い方したいですね。
【AWS】CloudFormation再デプロイ時の設定値とテンプレの不一致について

## はじめに

CloudFormation(以降 Cfn)を使用していて設定値を一部間違えた。
テンプレを更新し再デプロイしたけどリソースに反映されない。
上記のような経験はありませんか。

原因は Prameter 句をテンプレートファイルの更新だけで、
修正しようとしていることかもしれません。
本記事は Parameter 句の更新における躓きと解消方法を記載した内容となります。

## 結論

Paramete句の記載を修正する場合、
テンプ修正&再デプロイだけではなく CLI or コンソールからParamete値の修正が必要になる。

## Cfn の Parameter 句とは

Cfn テンプレートにおける構成要素の一つであり、
「スタック構築時にユーザーに指定させる値を指定」させることができる項目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/d66c1698-ee71-6912-2086-54dc9e2481bd.png)

ユーザーに指定と言ってもデプロイ時に毎回指定が必要になるわではなく、
以下のようにテンプレートファイル内に事前に値を設定してくことが可能。

```yaml:test.yaml
Parameters:
  VPCStack:
    Type: String
    Default: test
```
## 直面した問題

Cfn リソースデプロイ後にテンプレート内で繰り返し、
使用するタグ名を Parametr 句から参照しようとしたところ、誤字を発見。

```yaml
Parameters:test.yaml
    TagName:
        Type: String
        Default: hoga #正しくはhoge
        ～
```

直ぐに修正し再デプロイ

```yaml
Parameters:test.yaml
    TagName:
        Type: String
        Default: hoge
        ～
```

デプロイしたテンプレートは修正されているが、
生成されたリソースの値は修正前の状態となってしまっている。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/26395cfc-8370-6860-7e6e-1e39bd5db925.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/f8a6d5b3-c386-efd9-07fc-b82a8775680f.png)


:::note warn
そもそも変更点がParamete句だけでは更新点が無いため、再デプロイができない。
そのため、「一時的にタグを付与してデプロイ→付与したタグを削除してデプロイ」といった手間が必要になる
:::


## 原因

### AWS 公式ページで原因確認

> AWS CloudFormation により、各パラメータには、NoEcho 属性で宣言されたパラメータを除いて、スタックに現在設定されている値が入力されます

[スタックの直接更新](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-direct.html)に上記記載があった。
テンプレート更新時には、
初回デプロイ時に設定された Parameter 句の情報が存在している。

そのため、テンプレートファイルを更新して再デプロイしても、
初回デプロイ時に設定された値が優先されてしまっているということみたい。

## 解決方法

解決というより対応方法ですが、
CLI と GUI を用いて Parameter 句の更新が行えます。

### CLI を用いてデプロイする際の更新方法

```bash
aws cloudformation deploy --stack-name {スタック名} \
--template-file <value>
--parameter-overrides {変更したいパラメータ句}={変更値}
```
```bash:例
aws cloudformation deploy --stack-name test --template-file ./s3.yaml --parameter-overrides TagName=hoge
```
### コンソール を用いた更新方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/d03d082c-36bf-25b6-f784-1a496cd93abf.png)

## 補足
テンプレとリソースが不一致の状況で「ドリフト検出」を行ってみたところ、
ドリフトの検出がされなかった。
Parameter句の更新はCloudformation側にて更新箇所として検知されないみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/b31e1845-47f3-5d1d-c3a4-9752c547df75.png)

## 最後に

IaC だしコードがいつでも正と思っていると思わぬ落とし穴がありました。
本記事が誰かの役に立てば幸いです。
Milk-v duo搭載pinpongライブラリを使用するCPUにjh7100を搭載したボード

## はじめに
秋葉原ロボット部の有志で、milk-v duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

Milk-v duoは9ドルのrisc-vコンピュータとして知られています。
ハードウェアは以下の通りです。

1. CPUはCVITEKのCV1800B (C906@1Ghz + C906@700MHz)
1. 最高1 GHzで動作するデュアルRV64コア
1. 64 MBのラム
1. オプションのアドオンボードを接続すると10/100Mbpsの速度でイーサーネットに接続可能

Milk-v duoのPythonの利用するPinpongライブラリを利用するボードが複数あります。
今回、CPUにjh7100を搭載したボードである、「StarFive VisionFive JH7100 RISC-V シングルボードコンピュータ」を紹介します。

## StarFive VisionFive JH7100 RISC-V シングルボードコンピュータ
https://wiki.banana-pi.org/StarFive_VisionFive_JH7100_RISC-V_Single_Board_Computer
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/affd7a48-e0aa-e305-b71f-01d4192a0897.png)

このボードはLinuxが動作する手ごろな価格のRISC-Vボードの第1世代です。

仕様は以下の通り。
|||
| :-: | :-: | 
|スペック|詳細|
|プロセッサ|-RISC-V SiFive U74 デュアルコア 64-ビット RV64GC ISA SoC、2MB L2 キャッシュ@ 1.0GHz<br>-ビジョンコンピュート用ビジョンDSP Tensilica-VP6@ 600MHz<br>-NVDLAエンジン(設定2048 MACs @ 800MHz)<br>-ニューラルネットワークエンジン (1024MACs @ 500MHz)|
|メモリ|8GB LPDDR4|
|ワイヤレス接続|-2.4 GHz Wi-Fi (IEEE 802.11b/g/n)<br>-Bluetooth 4.2 (BLE)|
|ビデオプロセッサ|-2 x MIPI-CSI (最大4K@30fps), 1 x MIPI-DSI (最大4K@30fps)<br>-1 x HDMI 1.4 (最大1080p@60fpsディスプレイ)<br>-ビデオデコーダ (H264/H265) 最大4K@60fps; 2K@30fpsでのデュアルストリームでコードをサポート<br>-ISPのデュアルチャンネル, それぞれのチャンネルで、最大4K@30FPSをサポート<br>-ISPとAI処理の後のビデオ出力でMIPI-CSI TXをサポート<br>-JPEGエンコーダ/デコーダ|
|専用音声処理|-省電力音声認識|
|DSPとサブシステム|-オンチップオーディオDAC<br>-DMICとAMICをサポート, 最大4チャンネル|
|周辺機器|-4 x USB 3.0ポート<br>-40 GPIOピンヘッダ (28 x GPIO, I2C, I2S, SPI, UART)<br>-ギガビットイーサーネットコネクタ<br>-3.5 mmオーディオジャック(4極ステレオオーディオ出力)<br>-システム起動とデータ保存用マイクロSDカードスロット<br>-TRNGとOTPのサポート<br>-DMAC, QSPIや他の周辺機器をサポート<br>-リセットボタンと電源ボタン|
|電源|-最小 5 V / 1.5 A，-推奨: 5 V / 3 A|
|電源接続|-USB Type-Cポートか40ピンGPIOヘッダ|
|大きさ|100 mm x 72 mm|

ディストリビューションとして、Debianが用意されています。
Neovimでシステムのクリップボードと連携したい

Neovimでクリップボードとうまく連携したい。+もしくは*レジスタでコピーできるはずだと思ってたけど、うまく行かない。だから、設定が必要みたいだ。

nvimはシステムのクリップボードと直接連携していないそうで、シェルコマンドを通じてクリップボードを利用しているみたい。

以下が対応しているclipboardのツール。

> - pbcopy, pbpaste (macOS)
> - wl-copy, wl-paste (if $WAYLAND_DISPLAY is set)
> - waycopy, waypaste (if $WAYLAND_DISPLAY is set)
> - xclip (if $DISPLAY is set)
> - xsel (if $DISPLAY is set)
> - lemonade (for SSH) https://github.com/pocke/lemonade
> - doitclient (for SSH) https://www.chiark.greenend.org.uk/~sgtatham/doit/
> - win32yank (Windows)
> - termux (via termux-clipboard-set, termux-clipboard-set)
> - tmux (if $TMUX is set)

こちらをインストールすれば良い。どれをインストールすればいいだろうか。そもそもWaylandとはなんだろう、と思って調べてみたら、どうやらX11を代替するような立ち位置にあるものらしい。今使っているのはX Window Systemなので多分関係ないな。でも、ちょっと面白い。何が違うんだろう。

## ちょっと寄り道

Waylandは特にグラフィクス周りだけについての_アプリケーションとハードウェア間の通信_を効率化させるらしい。X Window SystemではX Serverを通じて、ウィンドウマネージャー・コンポジッターを経由して描画するのだけれど、Waylandではクライアントが直接Waylandに描画を依頼することができるらしい。それが、プロトコルを設定する利点ということかな。

閑話休題。

まあ、このシステムはX Window Systemを利用しているので、xclipというアプリケーションをインストールしようと思う。

```sh
sudo pacman -S xclip
```

そして、init.vimに以下の項目を設定すれば終わり。

```~/.config/nvim/init.vim
set clipboard=unnamedplus
```

この項目は、デフォルトで必ずシステムのクリップボードを利用するための設定項目のよう。明示的に+や*レジスタを利用することで、レジスタに対する感度を高めるようにneovimを使ったほうが良いかな、とも思ったけれど、やはりデフォルトでクリップボードを使えたほうが良いなあ〜と思う。

たったこれだけだけど、vimのクリップボードは奥が深いな。例えば大文字レジスタで追記ヤンクできる、みたいなこともあるし、効率化に限度はないというか夢が広がるな。
TiDBのイベント・LT一覧 2024年1月まで

一覧になっていると便利そうなので、ちょっとまとめておきます。WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。
（こんなのもあるよ！という方、記事にコメントください。追加します）

## 2023年12月

https://pingcap.co.jp/webinar-tidb-7-4-mysql-8-0-compatibility/

**[Webinar]** v7.4のMySQL8.0互換機能についての紹介ウェビナーです。スピーカーはPingCAP本田さん。
なお、v7.4はDMR（開発リリース）ですが、LTSのv7.5も公開されています。TiDB Playgroundで試して見てください!

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3311403014
Server version: 8.0.11-TiDB-v7.5.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 8.0 compatible
```

https://momentocommunity.connpass.com/event/302306/

**[オフライン]** 私bohnenが大阪で開催のMomentoミートアップで話します。TiDB ServerlessとMomentoを組み合わせたサーバレス何かについて話そうと思います。Momentoさんマジいい人しかいない。

## 2024年1月

https://fujiyama.connpass.com/event/303103/

**[Webinar]** Yugabyteさん and TiDBというPostgresql/Mysql互換の分散DB二つを一挙に聴けるイベントです。スピーカーはPingCAP林さん。

https://www.pingcap.com/event/tidb-docs-dash/

**[Virtual]** TiDBのdocsのソースもgithubに公開されているのですが、それを良くしよう！というイベント。みんなでPR送りまくります（意訳） 

https://pingcap.co.jp/webinar-tidb-7-5-lts-new-features/

**[Webinar]** TiDB v7.5ではついに接続したときのバージョン表記がMySQL 8.0.x になります。これも含めて新機能の紹介を行います。 PingCAP TSEの本田さんが話します。

https://tiug.connpass.com/event/303186/

**[オフライン]** つ・い・に！ TiDBのユーザーコミュニティが立ち上がりました。OSS版もTiDB Cloudもどんと来い。私も最新情報についてスピーチさせていただきます。
部分配列 Python3編

https://paiza.jp/works/mondai/array_primer/array_primer__partical_array

私が書いたのはこれ

```py
A,B,N = map(int,input().split())
S = list(map(int,input().split()))
for i in range(len(S)):
    if i + 1 >= A and i + 1 <= B:
        print(S[i])
```
ただ、rangeだと範囲指定ができるのでforループの部分を
下記のようにしてもよい
どっちかと言うと下がいいかも
ただ`range`関数の癖には注意かも
```py
for i in range(A-1,B):
        print(S[i])

```
Pydanticのバリデーション設定時、選択した文字列だけに制限したい場合

**注意**
未経験から転職した、一年目のエンジニアが、作成したものになります。
そのため、至らぬ表現や、誤った表現をしている場合があります。

経験豊富な先輩エンジニアの方々へ
もし、誤った情報を記載していた際は、大変お手数をおかけしますが、ご指摘いただけますと幸いです。

少しでも、皆様のお役に立てれば幸いです。

# 記事の内容

-   やりたいこと
-   なぜ行ったか
-   対処方法
-   参考文献

## やりたいこと

Pydantic でバリデーションを行う際に、特定の文字列かどうか？を判別したい

## なぜ行ったか

PullDown 等で値を取得した場合、得られる値は、特定の決まった値になります。<br>
その時に、無事に望んだ値が得られているか？を確認したい。

## 対処方法

1. 得られると想定されるデータを、リストにまとめ、変数に格納する
2. validator 関数を定義し、入力チェックを行う。<br>

**注意**
Pydantic のバージョンアップにより、@validator の代わりに、 <br>
@field_validator を使用することが推奨されているので、以下のコードは、@field_validator を使用しています。

```python
from pydantic import field_validator

nameList = ["taro", "koki", "takashi"]

class User(BaseModel):
    name: str
    age: int

    @field_validator("name") # 制限したいフィールド値を指定
    def nameCheckInGenderList(cls, name):  # 第一引数は固定。第２引数は上記で指定したフィールドの値に別名をつける
        if name in nameList:
            return name
        else:
            raise ValueError("選択された名前を入力してください")

```

余談ですが、in 関数は、リストの中の要素の中のいづれかと一致するか？を示したものです。

特定の値かどうかを判定するには、validator 関数か、正規表現を用いるしかないみたいです（正規表現は、今回の趣旨から外れるので割愛）

2/11 追記
このバリデーションならLiteralを使うことでも実現できますよ。
とのコメントをいただきました。
https://docs.pydantic.dev/latest/api/standard_library_types/#typingliteral
```
 flavor: Literal['apple', 'pumpkin']
```
文字列で選択式をそのまま表現できるため、上記のやり方が一番好ましいと思います！
@palu0707 さん、コメントありがとうございます！


もし、より良い方法がございましたら、ぜひコメントで教えて頂けきたいです。

少しでも、お役に立てれば幸いです。

## 参考文献

-   https://docs.pydantic.dev/2.0/migration/
-   https://qiita.com/uenosy/items/2f6b1aa258018d3db76c
正しい亥の子の打ち方

## はじめに
　こんにちは。Physics Lab. アドベントカレンダー9日目担当のAueslyです。突然ですが皆さん，**亥の子**を知っていますか?

　亥の子というのは旧暦10月の亥の日に行うお祭りのことです。お祭りといっても大々的なものではありません。主役となるのは地域の子どもたちです。寒くなってくると私は亥の子のことを思い出すのですが、理物の友人でこれのことを知っている人は1人もいませんでした。そこで今回はこの場を借りて亥の子の正しい打ち方について解説していこうと思います。

::: note
亥の子自体は西日本に広く見られるらしいのですが、実施形態や歌の歌詞(後述)にはローカル色が色濃く出るようです。しかし、以下の記事で解説される内容は全てうちの地域のものです。そのため、この記事の読者には経験者の方がいらっしゃるかも知れませんが、ご自身の経験とは大きく異なる可能性があります。あらかじめご了承ください。
:::

## 準備
### 参加者の募集
　亥の子に参加できるのは地域に住んでいる子どもだけです。子供というのも曖昧な言い方ですが、概ね小学生のことです。未就学児や中学生が参加することはレアだったと思います。また、当日子どもたちが巡る家も決める必要があります。回覧板を回して、行ってもいいかどうかを確認しましょう。ただし、新築の家がある場合必ずそこへは行きましょう。
### 準備物
　亥の子に必要なものは一つだけです。
　それは「藁の棒」です。正式名称があるのかも知れませんが少なくとも私は知りません。「棒」とか「亥の子の棒」とか呼んでいました。で、その藁の棒なのですが、規格が決まっていて、藁で編んだ棒の部分に取っ手を取り付けたような形をしています。なんで取っ手がついているのかというとこれは **地面に叩きつける**ためのものだからです。
　これは当日に絶対に必要です。去年のやつが残っていればそれでいいのですが、壊れていた場合(これは結構壊れます)また新しく作らなければなりません。そういうわけで、8月くらいに公民館で亥の子の棒をつくる催しが開かれます。頑張って頑丈なやつを作りましょう。またもし、去年のやつが残っておらず、作成の催しにも参加できなかったとしても公民館に行けばストックがあるのでなんとかなります。
## 本番
　Wikipediaによると旧暦10月の初めの亥の日に行うのが正しいらしいですが、うちの地域は適当だったと思います。とりあえず暑すぎも寒すぎもしない時期がベストです。行う時間帯は夜です。これも亥の刻(午後9時から11時)に行うのが正しいらしいのですが、うちの地域は午後7時くらいから始めていたように思います。子どもが夜ふかししないようにするための配慮でしょう。
　さて、この行事ですが参加者全員でぞろぞろと連れ立って町内会の家々を回ることで進みます。目的の家に着くと、その家のインターホンを押します。そこの家の人が出たらすかさず「亥の子です！」と言いましょう。家の方が家から出てきたらいよいよ本番です。藁の棒を地面に叩きつけながら大きな声で以下の歌を歌いましょう。ここは1番の見せ場です。町内会中に響かせるつもりで歌いましょう。
>亥の子　亥の子　お亥の子さんという人は
>1で　俵をふんまいて
>2で　にっこり笑って
>3で　酒を作って
>4つ　世の中良いように
>5つ　いつもの如くなり
>6つ　無病息災に
>7つ　何事ないように
>8つ　屋敷を建て広げ
>9つ　小倉を立て並べ
>10で　とうとう治めた
>この家繁盛せぇ！繁盛せぇ！

　終わるとその家の方が500円か図書カードを渡してくれます。ありがたく頂戴して次の家へ行きましょう。全部回り終えると終了です。家に帰って寝ましょう。

 ## で、結局これはなんなのか
　歌の内容から推察するにその家の繁栄を願うための儀式なのでしょう。とはいえ子ども時代はそんなことには考えが至らず、なんとなく楽しいからやるだけなのですが。そう、やってみるとわかりますがこれはめちゃくちゃ楽しいです。何せ、いまだに覚えていますから。
　そして成長して中学校に入学するともう亥の子には参加できなくなります。そして時期になると次の世代の子供たちの歌う歌を聴いて、懐かしい気持ちになるのです。東京に来て以来、当たり前ですが1度も聴いていません。再び聴きたいものです。

## おわりに
　お察しの通り私は地方の出身です。東大自体関東出身の方の方が多いと思いますが、理物においてもその傾向は顕著です。とはいえ同郷の人間がいないことに対して居心地の悪さを感じたことはありません。むしろ興味を持ってもらってありがたいと思っています。私自身も、学科民のの出身県のローカルネタを聞くのはかなり好きです。
　みなさんの出身地には、どんな風習がありましたか？
Kali Linux で Window 端末にRDP（リモート接続）してみる

# はじめに
Kali Linuxでセキュリティの勉強をしているとき、どうやってWindowの端末にリモートアクセスしたらいいのかちょっとわからなかったので、備忘録用としてまとめます。
環境
- Kali Linux
- Terminalを使用
- Windows端末のOSはWindwos 11
# RDPとは
RDP（Remote Desktop Protocol）とは、リモートデスクトップを実現するための通信プロトコルです。マイクロソフト社が開発したもの
# 具体的な方法
Terminal上で、次のコマンドを入力してください。

```example 1
xfreerdp /u:(username) /p:(password) /v:(Machine IP)
```
それぞれ自分がアクセスしたいWindowクライアントのユーザーネーム、パスワード、IPアドレスに変更してください。

例1
```example 1
xfreerdp /u:client /p:hogehoge /v:192.168.1.1
```
これでアクセスでいるはずです！
もっと詳しく知りたい人は参考文献から調べていただければ幸いです。

# 終わりに
Happy Hacking！

# 参考文献
- [How to RDP Into a TryHackMe Windows Machine With Your Kali VM](https://medium.com/@laupeiip/how-to-rdp-into-a-tryhackme-windows-machine-with-your-kali-vm-f637cf7422d1)
- [FreeRDP-User-Manual.markdown](https://github.com/awakecoding/FreeRDP-Manuals/blob/master/User/FreeRDP-User-Manual.markdown)
M5Stackでパラパラ漫画

M5StackをGopherくん基板にはめ込むものを作りました。M"Go"Stackです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146663/2e077d05-a895-1d45-8bd8-0891c3de17fd.png)

はめこんだM5stackでパラパラ漫画を作ります。
画像はmattnさんが作成したものを使わせてもらいました。

https://github.com/mattn/gopher

このレポジトリをgit cloneしてSDカードに画像をコピーします。
そして以下のようなスケッチを作成して書き込みます。

```
#include <M5Stack.h>

void setup() {
  // M5Stackの初期化
  M5.begin();
  M5.Lcd.clear(TFT_BLACK);
}

void loop() {

  M5.update();
  M5.Lcd.drawJpgFile(SD,"/dir1/out01.jpg", 60, 20);
  delay(10);
  M5.Lcd.drawJpgFile(SD,"/dir1/out02.jpg", 60, 20);
  delay(10);
  M5.Lcd.drawJpgFile(SD,"/dir1/out03.jpg", 60, 20);
  delay(10);
 
}
```

loop()のなかで表示する画像を切り替えているだけですね。
【Golang】Invalid go version '**': must match format ** の対処法

# はじめに
こちらは、go.modのパースに関するエラーです。
コマンド以外ではgo.modを触っていなかったために対処法が分からず苦労したので、バグレポートのような感じで残しておきます。

# 原因と対処法
原因は、go.mod内で記述するgoのバージョン指定方法に誤りがあるためでした。
``` go.mod
module hoge

go 1.21.3 // ここが原因（バージョン指定方法ミス）

require (
	...
)
```

そのため、以下の記述方法に変更します。
``` go.mod
module hoge

go 1.21 // 変更

require (
	...
)
```

そうすると、エラーが発生せずに動かすことができました。
【Vue.js Composition API】子コンポーネントで定義したメソッドを親コンポーネントから呼び出す

## はじめに

親コンポーネントに定義したメソッドを子コンポーネントから呼び出すのはよく見かける気がするのですが、逆はあまりないので、記録しておきます。

## 環境

- Vue.js 3.2
- Composition API

## サンプル

### 子コンポーネント

```vuejs:Child.vue
<script setup>
const childMethod = () => {
    console.log("childコンポーネントのメソッド")
}

// defineExposeを使い、親コンポーネントからの呼び出しを可能にする
defineExpose({ childMethod });
</script>
```

### 親コンポーネント

```vuejs:Parent.vue
<script setup>
import { ref } from "vue";
import Child from './Child.vue';

// 子コンポーネントの情報を受け取る
const childRef = ref();

const onClick = () =>  {
    // 子コンポーネントのメソッドを呼び出す
    childRef.value.childMethod();
}
</script>

<template>
    <Child ref="childRef" />
    <button @click="onClick()">ボタン</button>
</template>
```

クリック時ではなく、マウント時に子コンポーネントのメソッドを呼び出したい場合は以下のようにします。

```vuejs:Parent.vue
<script setup>
import { ref } from "vue";
import Child from './Child.vue';

// 子コンポーネントの情報を受け取る
const childRef = ref();

onMounted(() => {
    childRef.value.childMethod();
})
<script>
<template>
    <Child ref="childRef" />
</template>
```

## おわりに

公式サイトの`defineExpose`のサンプルが簡素だったので困りましたが、以下の参考サイトのおかげで助かりました。

今回書いたサンプルも誰かの役に立てばと思い、簡単ではありますが残しておきます。

## 参考にさせていただいたサイト

https://ja.vuejs.org/api/sfc-script-setup#defineexpose

https://qiita.com/mml/items/2be6b8df94d932e9a047

https://zenn.dev/yukination/articles/6b4ec61df6898b
JAWS UG 名古屋ハンズオンのためのクーポン配布システム作った

JAWS UG 名古屋の活動で、AWSハンズオンでのクーポン配布システムを2~3時間ぐらいで作っで効率化したことをシェアします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44367/e301a302-c162-ed5f-7cb5-c4c1e33af7e7.png)

これは、[JAWS-UG Advent Calendar 7日目](https://qiita.com/advent-calendar/2023/jaws-ug) の投稿です。（遅れてすいません）


# 背景

JAWS UG を運営している特典の一つとして、ハンズオンセミナーを開催すると、時々、AWSさんからクーポンをいただけることがあります（いつも、ありがとうございます！）

昔は1枚の A4 の紙に、Excel でいただいたクーポンコードを普通に印刷し、ハサミで1人1人に紙をちぎって渡していました（筒井さん、可知さん他感謝！）

ただ、印刷し、ハサミで切った上に、小さい紙に書かれたアルファベットで画面と睨めっこしながらの入力、そして余ったクーポンコードをきちんと返却する等、いろいろ手間がかかっていました。

![A man with scissors trying to cut a piece of paper into pieces. But he struggle a lot in Japanese cartoon illustration style..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44367/13a37ec4-a838-6255-0039-7946caf62565.png)


そして、コロナ渦、勉強会はオンラインのみになり、物理的にクーポンを配布してハンズオンの開催が不可能になりました。

ということで、簡単なクーポン配布システムを作成することにしました。実は2〜3年前のことです。

# 気をつけること

単純にフォームを作って公開するのだけでは、クーポンを不特定多数の人に配布してしまうことになります。

ですので、インチキが無いような仕組みにすることにしました。

# 仕様

- フォームの受付は勉強会開催時間+1時間に限定
    - 勉強会開始後のみ、QR コードで配布する (URL は参加しか分からない)
- 月末開催じゃなかったら、余りが無いように、クーポンの配布は希望者の数が確定してから AWS 沼口さんにお願いする
- 誰でも簡単に操作できるような仕組みにする

# できたもの

手前味噌ですが、Concrete CMS を使って作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44367/7ad48b6f-48de-2be9-7d0a-3c8d7531d386.png)

- フォームは CMS 標準のフォーム。
    - 「Express」と呼ばれるCMS の簡易リレーショナルDBに記録
- フォームの時限公開・停止は CMS 標準機能で表示・非表示を自動設定
- 名前、メールアドレス、使い方に同意してもらう
- Concrete CMS 標準のリレーショナルデータベースみたいな機能を使って以下のデータを扱う
    - 名前, メール, 同意チェック, クーポンコード, 有効期限
- 会社で作った CSV エクスポート・インポートツールを拝借
    - フォーム送信者の CSV 一覧をダウンロードし、Excel などで、クーポンコードをがっちゃんこ
    - CSV を再び CMS に読み込む ![couponadmin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44367/0ac9e216-5539-d172-6906-8b163703b503.png)
- Concrete CMS でカスタムプログラム作って、AWS SES を通じてクーポンコードをメールで配信 ![sampleemail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44367/faf65f88-1a35-710f-70ab-42e1da8d6e2a.png)
- 最後にデータを削除

JAWS UG 名古屋メンバー誰もが使えるように、ステップバイステップでの使い方のマニュアルも作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44367/fca9487d-adc1-906c-cfcb-0131ea9f8033.png)


## 技術スタック

- EC2 (Concrete CMS)
- AWS SES

シンプル！

# 今度してみたいこと

いつ時間ができるかどうかわかりませんが・・・

- Serverless で構築し直してみたい + CDK で管理したい
- CSV の出力・入力をせずともマージできるようにしたい

他の UG でクーポン配布システムを使ってみたい人は、 JAWS UG Slack (make-jawsug) の katzueno までお問い合わせください。
【Python】【小ネタ】WindowsのプロセスIDが生存しているか確認する方法

## 前提
プロセスIDの変数`pid`には`int`の他`None`がアサインされることもある。
`None`の場合は既にプロセスがkillされていると判断して`False`を返すことにする。
それ以外では、プロセスIDをなんらかの方法で用いて生存を判断する。

## 標準ライブラリ`subprocess`を使う場合

```py
import subprocess


def exists_task(pid: "int | None") -> bool:
    if pid is None:
        return False
    proc = subprocess.run(
        # chcp437指定でコマンドの言語を英語に切り替える。
        # これで実行環境が日本語でも`stdout`は英語バイト列になる
        ["chcp", "437", "|", "tasklist", "/fi", f"PID eq {pid}"],
        stdout=subprocess.PIPE,
        shell=True,
        # エンコードを指定すると`UnicodeDecodeError`が発生する時がある
    )
    # 判断基準はバイト列の比較でこと足りる
    return b"INFO: No tasks are running which match the specified criteria" not in proc.stdout

```

https://docs.python.org/ja/3/library/subprocess.html#subprocess.run

## `comtypes`を使う場合

```py
import comtypes.client


# Microsoft WMI Scriptingのモジュール作成
comtypes.client.GetModule("wbemdisp.TLB")
# WbemScriptingを静的import
# `WbemScripting = comtypes.client.GetModule(...)`でも実行時に動く(IDEによる静的解析はできない)
from comtypes.gen import WbemScripting


def exists_task(pid: "int | None") -> bool:
    if pid is None:
        return False


    wmi = comtypes.client.CreateObject(WbemScripting.SWbemLocator, interface=WbemScripting.ISWbemLocator)
    wmi_service = wmi.ConnectServer(".", "root\\cimv2")
    result = wmi_service.ExecQuery(f"SELECT * FROM Win32_Process WHERE ProcessId = {pid}")
    return bool(result.Count)
```

https://learn.microsoft.com/ja-jp/windows/win32/wmisdk/swbemlocator-connectserver

https://learn.microsoft.com/ja-jp/windows/win32/wmisdk/swbemservices-execquery

https://learn.microsoft.com/ja-jp/windows/win32/wmisdk/swbemobjectset

https://learn.microsoft.com/ja-jp/windows/win32/wmisdk/swbemobject
ネットワーク環境が不安定でpip installが失敗するときの対策

職場環境で`pip`によるインストールが頻繁に失敗するので試行錯誤した結果、下記でインストール成功したのでメモ。

`pip install インストールしたいライブラリ名 --timeout 300 --retries 10`


# パラメータ

`pip --help` によると
> --retries <retries>         Maximum number of retries each connection should attempt (default 5 times).
> --timeout <sec>             Set the socket timeout (default 15 seconds).
AWS Health Dashboard起点のイベント駆動を考える

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAWS Health Dashboardに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- AWS Health Dashboardとは
- AWS Health Dashboardの活用
- AWS Health Dashboardのベストプラクティス

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- AWS Health Dashboardがどういうサービスか説明できるようになりたい人
- AWS Health Dashboardを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# AWS Health Dashboardとは
AWS Health Dashboardは、AWSのサービスのステータスやイベント情報をリアルタイムで提供するサービスです。
AWSユーザーはこのダッシュボードを通じて、サービスの健全性やパフォーマンスに関する情報を把握できます。
AWS Health Dashboardで得られる情報には、サービスの障害、予定されたメンテナンス、およびその他の健康状態に関する通知が含まれます。

なお、AWS Health DashboardにはService HistoryとYour Accountの2つの区分が存在します。

[Service History](https://health.aws.amazon.com/health/status)はすべてのリージョン、すべてのサービスのサービス状況を一覧で見ることができます。
いわゆる大規模障害の時に情報が更新されるのがService Historyです。

一方、Your Accountは以前までPersonal Health Dashboardと呼ばれていたサービスです。
今でも検索するとPersonal Health Dashboardで出てくるAWS公式ページがありますが、正式にはAWS Healthの中のDashboardに統合されています。

Your Accountは自アカウントに影響のあるアラートが表示されます。
例えばEC2インスタンスのリタイアメント通知やLambdaのランタイムサポート切れなどが通知されます。

# AWS Health Dashboardの活用
AWS Health Dashboardを使用して、サービスに障害が発生しているかどうかをリアルタイムで把握し、迅速に対応できます。

1つ目の活用法がチャットへの通知です。
![](https://storage.googleapis.com/zenn-user-upload/be2e60be014e-20231209.png)

AWS Health DashboardはAmazon EventBridgeと連携することが可能です。
そのため、自アカウントに影響のある通知が来た際やリージョン障害が発生した際にEventBridge経由でLambdaを発火させ、チャットへ通知することができます。

ベストプラクティスは自動で通知に対する対応まで完了させることですが実プロジェクトでは報告して、対策を決定して、という場面も多くあります。
そこで、まずは通知を自動で受け取れるようにすることが大切です。

2つ目の活用法は自動での対応です。
すでに述べたように本来はAWS Health Dashboardの通知をもとに自動で対応し、対応完了するのがベストプラクティスです。

![](https://storage.googleapis.com/zenn-user-upload/edfafa37ee71-20231209.png)

例えばIAMのアクセスキーが流出した場合には自動でアクセスキーを削除すべきですし、EC2インスタンスのリタイアメント通知が来たら自動でメンテナンスウインドウ内の再起動を実施すべきです。

このように作業が定型化できる通知は自動対応まで組み込むことがベストプラクティスです。
ただし、自動化するためにかかる作業量と発生頻度の天秤は必ず考えるようにしましょう。

意味なき自動化は目的なきDevOpsにつながりアンチパターンにはまります。

# AWS Health Dashboardのベストプラクティス
AWS Health Dashboardのベストプラクティスは以下の通りです。

|ベストプラクティス | 説明|
|--- | ---|
|定期的なチェック | 定期的にAWS Health Dashboardを確認し、障害情報や通知を適切にチェックする。|
|通知の設定と適切なアクション | 通知の設定はユーザーごとに異なるが、重要なサービスに関する通知は受信し、迅速なアクションを取る。|
|EventBridgeを活用した統合 | AWS Health Dashboard for Advanceを使用する場合、EventBridgeを活用して自動化された統合を検討する。|

すでに述べたように、EventBridgeを活用した統合が最も大切です。
これを行うことで効率の良い運用かつ耐障害性の高い運用を実現できます。

# まとめ
この記事ではAWS Health Dashboardに関連する内容を超詳細にまとめました。

- AWS Health Dashboardとは
- AWS Health Dashboardの活用
- AWS Health Dashboard for Advance
- AWS Health Dashboardのベストプラクティス

次回はEC2のステータスチェックを超詳細解説します。
[Go]パート2

# はじめに
訳あってGo言語を勉強することになりました。
完全に自分のメモ用です。
馴染みのない書き方を中心にメモしていきます。

## 型に別名

```go:main.go
package main

import "fmt"

func main() {
	type UtcTime string
	var utctime UtcTime = "piyo"
	fmt.Println(utctime)
}

```
結果
```shell
piyo
```

```go:main.go
package main

import "fmt"

func main() {

	type UtcDate string
	type UtcTime string
	var hoge UtcDate = "20231208"
	var piyo UtcTime = "170000"

	piyo = UtcTime(hoge)
	fmt.Println(piyo)

}

```
結果
```
20231208
```
キャストも可能です。

## 配列

```go:main.go
package main

import "fmt"

func main() {

	hoge := [3]string{}

	hoge[0] = "coffee"
	hoge[1] = "apple"
	hoge[2] = "fish"
	// hoge[3] = "piyo"

	fmt.Println(hoge[0])
	fmt.Println(hoge[1])
	fmt.Println(hoge[2])

}

```
結果
```
coffee
apple
fish
```

## スライス

```go:main.go
package main

import "fmt"

func main() {

	hoge := []string{}
	hoge = append(hoge, "apple")
	hoge = append(hoge, "fish")
	hoge = append(hoge, "coffee")
	fmt.Println(hoge[0])
	fmt.Println(hoge[1])
	fmt.Println(hoge[2])

}

```

結果
```
apple
fish
coffee
```
サイズがわからない場合は、スライスを使用する。（JavaでいうListですね

```go:main.go
package main

import "fmt"

func main() {

	hoge := make([]string, 0, 1024)
	hoge = append(hoge, "apple")
	hoge = append(hoge, "fish")
	fmt.Println(hoge[0])
	fmt.Println(len(hoge))
	fmt.Println(cap(hoge))
}

```
結果
```
apple
2
1024
```
スライスを使用する場合は、あらかじめサイズを固定で指定しておいた方が処理が速いそうです。

## マップ
```go:main.go
package main

import "fmt"

func main() {

	hoge := map[int]string{
		1:  "apple",
		10: "fish",
		77: "coffee",
	}

	fmt.Println(hoge[1])
	fmt.Println(hoge[10])
	fmt.Println(hoge[77])

}

```
結果
```
apple
fish
coffee
```

（注意）要素の最後は絶対にカンマが必要です。
```77: "coffee",```

```go:main.go
package main

import "fmt"

func main() {

	hoge := map[int]string{
		1:  "apple",
		10: "fish",
		77: "coffee",
	}

	hoge[100] = "egg"
	fmt.Println(hoge[100])
	fmt.Println(len(hoge))

	delete(hoge, 1)
	fmt.Println(len(hoge))

}

```

結果
```
egg
4
3
```
マップに追加したり、削除したりできます。

以上。

https://qiita.com/mojapico/items/4f2ce6829d3bcaf2011f

https://qiita.com/mojapico/items/45ef9206d5a0778062ec

https://qiita.com/mojapico/items/019204b2aa77b15659cd
Google Cloud の登竜門

# はじめに
以前に[AWS](https://qiita.com/talomina/items/25d7c1dc8aedb499eb74) と [Azure](https://qiita.com/talomina/items/018daa74dcbecb5acf07) の入門資格を取得することが出来たので、クラウド三大天の仕上げとしてGoogleを攻略することにしました。Google Cloud Digital Leaderというタイトルの認定資格です。

https://cloud.google.com/learn/certification/cloud-digital-leader?hl=ja

## この資格のメリット

この資格に合格すると次のようなメリットがあります。
* 合格証とバッジがもらえる
* 同じ資格を持つ人のコミュニティに参加できる
* 次の試験の50%オフチケットがもらえる

# 試験への道のり

基本的には上記のサイトから登録を進めることでたどり着けます。Google Cloudの他の認定資格でも同じだと思うので思ったことをメモしておきます。

1. Web WebassessorのIDを取得する。kryterionという聞いたことのないサイトでIDを登録します。
1. 試験の申し込みを行う。何となく家で試験を受けるのに抵抗があるので、試験は会場派なのですが、他の三大クラウドに比べて試験会場が少ない印象です。そして申し込める日程が少ない。都内の会場でも土日に受験できるところは少ないようです。
1. 試験代は99USDですが、ドル建てのためクレジットカードには14,926JPYの請求が来ました。円安恐るべし！
1. 試験会場で試験を受ける。AWSのSAAを受験したことのある武蔵小杉の会場で受験しました。
1. 試験終了後にすぐに仮の結果発表。
1. ２～３日後に最終結果がメールで届きます。

# 勉強の仕方

あらゆる試験でお世話になっているUdemyですが、Google Cloud Digital Leaderの講座は（日本語版は）無いようです。次にAssociate Cloud Engineerを取得したいと思っているので、こちらのコース「Google Cloud認定 Associate Cloud Engineer（ACE）合格コース」を取得しました。

https://www.udemy.com/course/2022gcp-associate-cloud-engineer-google-cloud/

コースの内容説明パートとハンズオンがあります。ハンズオンは後でじっくり見ることにして、説明をひたすら流し見しました。概念は他のクラウドと変わらないので、サービスの名前と概要を覚えるということがメインです。

## おすすめしたい理由
この講師の方は、語りが落ち着いてAWSとの比較なども交えながら説明してくれるので、とても聞きやすかったです。他のGoogle Cloudのコースも作られているので、今後さらに勉強するなら推しだと感じました。

## 勉強したことメモ
いずれまた見返すこともあるかもしれないので列挙しておきます。
* Anthos を使用すると、アプリケーションを一度開発すれば、場所を問わず実行できます。
* Apigee は、Google Cloud のフルマネージド API 管理ソリューションです。
* Apigee には、企業が API のさまざまな側面についてレポートできるようにする分析サービスが付属しています。
* 機密情報をパブリック クラウドと共有すべきではありません。
* BigQuery は分析に使用されるデータ ウェアハウスです。
* Looker はビジネス インテリジェンス プラットフォームです。
* Cloud Storage はオブジェクト ストレージ サービスです。
* Dataflow はデータ処理サービスです。
* Recommendations AI は、高度にカスタマイズされたプロダクトのおすすめを広範囲に提供します。
* Document AI は AI を使用してドキュメントから分析情報を引き出します。
* AI Hub はプラグアンドプレイ AI コンポーネントのホストされたリポジトリです。
* Cloud Talent Solution は、求人検索機能と人材獲得機能に AI を使用します。
* ラベルはAWSでいうタグ。タグはもっと細かいもの。
* 画像AIはVision API
 
# おわりに

新しいことを勉強しようと思ったら、実際に触ってみるのが一番良いと思いますし、クラウドはそれができるのが魅力なのですが、今回はあえてハンズオンを封印してUdemyの視聴のみで挑んでみました。次はAssociateを目指そうと思いますが、ついにハンズオンを解放してしっかり身につけようと思います。

![image.png](https://api.accredible.com/v1/frontend/credential_website_embed_image/badge/88959027)

# 参考文献

参考にした記事など

### サービス名を見直すならこちら

https://qiita.com/Atsulabo/items/9d18f8fbf7bd1f0ffec8

https://qiita.com/ponnufu/items/528dcf51c5a7ea37d398

https://cloud.google.com/free/docs/aws-azure-gcp-service-comparison?hl=ja

### 有名な絵とその日本語説明

https://cloud.google.com/blog/ja/topics/developers-practitioners/where-should-i-run-my-stuff-choosing-google-cloud-compute-option

https://cloud.google.com/blog/ja/topics/developers-practitioners/your-google-cloud-database-options-explained

https://cloud.google.com/blog/ja/topics/developers-practitioners/bigtable-vs-bigquery-whats-difference

### 貴重な自宅受験の記録

こちらをみて、自宅受験恐怖症になりました。

https://qiita.com/mugaki/items/eec91f1c1833fedee06b

https://qiita.com/tkuribayashi/items/573f675b78be67bda549

### 勉強方法など

https://qiita.com/naoya040332315/items/31f676353a716fc2b6df
サーバレスDBのNeon(postgresql)にNode.jsで接続してみたメモ

## 概要
[前回、Hasuraの連携先としてNeonを選択](https://qiita.com/hibohiboo/items/68a3829e66e60b56ae5b)した。
今回は、GraphQLではなくNeonのDBを直接たたいてみる。

**※2024.12.28追記**
下記のロールの準備のGUIは古くなっている。
新バージョンでのロールの準備は次の記事「 [サーバレスDB(Postgresql : NeonDB ) の無料版にCloudflare Workers ( Node.js) から繋いだメモ](https://qiita.com/hibohiboo/items/e4809d6b63877010db4e) 」 を参照。

## ロールの準備
Neonにアクセスするためのユーザとパスワードを作成する。
[Manage database access](https://neon.tech/docs/manage/roles)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/b3aa0e27-4966-7296-9062-7f55bde1a16e.png)

New Roleをクリックして、ロールを新規作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/a2ffb177-0eb2-0217-e85f-782f1568235a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/f34c1955-4959-8f20-6af8-78a3f9211894.png)


.envをダウンロードすると、下記のようにパスワードが入っている。

```
PGUSER=kartagraph_from_lambda
PGPASSWORD=hoge
```

## 接続の準備
[@neondatabase/serverless](https://github.com/neondatabase/serverless)が接続に必要。
サンプルコードをダッシュボードから確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/3ab18772-6579-26b4-d4f8-77cd3212f40f.png)


下記のサンプルコードを取得できる。

```js
import { neon } from '@neondatabase/serverless';

const sql = neon('postgresql://kartagraph_from_lambda@fuga.us-west-2.aws.neon.tech/main?sslmode=require');

const posts = await sql('SELECT * FROM posts');

// See https://neon.tech/docs/serverless/serverless-driver
// for more information
```

## 接続文字列の編集
接続文字列にパスワードが足りていないので追加する。 postgresql://**user**:**password**の書式。

```js:test.js
import { neon } from '@neondatabase/serverless';

const sql = neon('postgresql://kartagraph_from_lambda:hoge@fuga.us-west-2.aws.neon.tech/main?sslmode=require');

const posts = await sql('SELECT * FROM posts');

console.log('posts', posts);
```

```
npm init -y
npm i @neondatabase/serverless
node test.js
```

postsテーブルをお試しで作って実行したところ、動作することを確認できた。
```
posts [
  { id: 'hoge', contest: 'ブログ1' },
  { id: 'hoge2', contest: 'ブログ2' },
]
```

## 参考
[sql-template-tags](https://neon.tech/blog/sql-template-tags)
Milk-v duo搭載pinpongライブラリを使用するハードウェア「Nezha」

## はじめに
秋葉原ロボット部の有志で、milk-v duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

Milk-v duoは9ドルのrisc-vコンピュータとして知られています。
ハードウェアは以下の通りです。

1. CPUはCVITEKのCV1800B (C906@1Ghz + C906@700MHz)
1. 最高1 GHzで動作するデュアルRV64コア
1. 64 MBのラム
1. オプションのアドオンボードを接続すると10/100Mbpsの速度でイーサーネットに接続可能

Milk-v duoのPythonで利用されるPinpongライブラリのディレクトリを見ると、他のボード用のライブラリもインストールされています。

本稿では、D1-H開発ボードとして知られる「Nezha」について解説します。

## Nezha
このボードは、AllwinnerのD1-Hチップを基にAWOLによってカスタマイズされたAIoT開発ボードです。
このボードは、64ビットRisv-VインストラクションセットとLinuxをサポートする、世界ではめて大量生産されたボードだそうです。
https://d1.docs.aw-ol.com/en/d1_dev/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/d2376ddc-b5de-2871-cd1f-e0dfbc8cafed.png)
仕様は以下の通り。

|||
| :-: | :-: | 
|CPU| Allwinner D1-H C906 RISC-V 1GHz|
|DRAM|DDR3 1GB/2GB|
|ストレージ|オンボード256MB spi-nand<br>容量拡張用にUSB 外部 U diskやSDカードをサポート|
|ネットワーク|ギガビットイーサーネットをサポート<br>オンボードアンテナ付き2.4G WiFiとBluetoothをサポート|
|ディスプレイ|MIPI-DSI+TPスクリーンインターフェースをサポート<br>HDMI出力をサポート<br>SPIスクリーンをサポート|
|オーディオ|マイクロフォンドータボードインターフェース x 1<br>3.5mmヘッドフォンジャック x 1 (CTIA)|
|ボードサイズ|長さ 85mm 幅 56mm 厚み 1.7mm|
|PCB層|6層|
|サポートLinux|Tina Linux，Linux 5.4カーネル|

Tina LinuxはAllwinnerテクノロジーによって開発されたLinuxカーネルを基にしたエンベッディドシステムです。
OpenWrt-14.07を基にしています。
IchigoJam で「こずめぐ」みたいなやつスロット

[IchigoJam](https://ichigojam.net/) で「こずめぐ」みたいなやつがスロット形式で出てくるやつを作ってみた。

※IchigoJamはjig.jpの登録商標です。

「こず」「めぐ」「つづ」「さや」「かほ」「るり」「さち」
の7種類からスロット形式で2種類を選び、「こずめぐ」みたいな文字列を作り出す。
同じものは選ばず、必ず2種類を選ぶようにした。

# プログラム

```
10 ' ｺｽﾞﾒｸﾞ ﾃｷﾅﾔﾂ ｽﾛｯﾄ
20 POKE #700,0,124,0,0,64,128,126,0,10,254,40,72,56,8,48,0,72,92,106,170,178,162,76,0,4,24,106,128,96,24,4,0,0,60,194,2,2,4,56,0,10,60,194,2,2,4,56,0,8,254,8,116,140,64,56,0
30 POKE #738,72,92,234,34,36,16,16,0,32,244,42,74,72,136,176,0,190,136,190,136,184,204,186,0,124,16,60,66,178,74,60,0,88,100,68,68,4,8,48,0,8,254,8,116,140,64,56,0,32,254,32,92,98,4,56,0
40 VIDEO 5:CLS
50 A=0:B=1:C=-1:D=-1:E=1:F=1
60 IF A<>C THEN LOCATE 2,2:PRINT CHR$(#E0+A*2,#E1+A*2);:C=A
70 IF B<>D THEN LOCATE 4,2:PRINT CHR$(#E0+B*2,#E1+B*2);:D=B
80 WAIT 1
90 K=INKEY()
100 IF K=SPACE AND E AND F THEN E=0:F=0
110 IF K=LEFT OR K=#5A OR K=#7A THEN E=1
120 IF K=RIGHT OR K=#58 OR K=#78 THEN F=1
130 IF E AND F THEN GOTO 80
140 IF E THEN B=(B+1)%7:B=(B+(A=B))%7:GOTO 60
150 IF F THEN A=(A+1)%7:A=(A+(A=B))%7:GOTO 60
160 A=(A+1)%7:B=(B+1)%7:B=(B+(A=B))%7:GOTO 60
```

このプログラムは、[CC0 1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja) でライセンスする。

# 操作方法

* スペースキー：スロットの回転を開始する
* 左矢印キー / Zキー：左側の回転を止める
* 右矢印キー / Xｋー：右側の回転を止める

# 実行結果例

<iframe width="640" height="480" src="https://www.youtube.com/embed/TyQy_aV3Osw?si=rsF4SH8HoqHj-pFp" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 解説

## 10行目：タイトル

`FILES` 対応のタイトルである。

## 20～30行目：フォント定義

[美咲フォント](https://littlelimit.net/misaki.htm) (美咲ゴシック第2) から、使う文字をピックアップしてキャラクターパターンとして登録している。

## 40～50行目：初期化

画面および状態の初期化を行う。
変数の役目は以下の通りである。

|変数|役目|
|:-:|---|
|A|左側で選択されている文字列を表す|
|B|右側で選択されている文字列を表す|
|C|左側で描画されている文字列を表す|
|D|右側で描画されている文字列を表す|
|E|左側の回転が停止中かを表す|
|F|右側の回転が停止中かを表す|
|K|入力されたキーを表す|

## 60～80行目：描画

選択されている文字列と描画されている文字列が異なる場合、描画されている文字列を更新する。

## 90～120行目：操作受付

キー入力を受け取り、対応する処理を行う。
IchigoJam ではデフォルトではUART経由で矢印キーが使えないので、ZキーおよびXキーでも停止操作をできるようにした。

## 130～160行目：回転制御

回転が停止中でない場合、次の文字列を選択する。
その結果選択が他方と被る場合は、さらに次の文字列を選択する。

# 関連記事

[ORANGE pico で「こずめぐ」みたいなやつスロット #BASIC - Qiita](https://qiita.com/mikecat_mixc/items/e6d9be27221cbf5c5d1f)
Power Apps の Copilot を日本環境で試す

# はじめに

Power Apps の Copilot が日本環境でも試せるようになったみたいです。

今回は、Japan Power Platform 2023 のハッカソンイベントでこちらを利用しようと思うため、手順をまとめます。

https://powerplatformconf.connpass.com/event/294851/


:::note warn
Power Apps 以外の Copilot を利用する場合、例えば、Power Pages の Copilot を試す場合は、現状米国環境にする必要がありそうです。そのため、米国環境を選択できるのであれば、米国環境にしていた方が無難かもしれません。
:::

# 日本環境の場合

まず、Power Apps から Power Platform 管理センターにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/082650f5-b40c-e8f7-4dbf-6df134fdcb21.png)

環境画面で、以下のような設定で環境を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5c049ee5-48ab-0356-7549-2c53edc24645.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6cd9e020-a212-fe1e-8ec5-4c244e286e18.png)

作成が完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/15a30269-b6f2-690e-6ad4-793ab1599990.png)

作成した環境を選択し、以下の設定をオンにします。日本環境の場合は、現状以下の設定を追加で行う必要があります。米国環境の場合は不要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/567f8913-6218-5c9c-232a-1acce6340805.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/97493a90-28cf-1a22-49f1-e30ef146c054.png)

Power Apps の画面に戻り、作成した環境を選び、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3bceffbe-0fd3-674e-d248-c97af9014131.png)

言語を English に変えます。
現状は、日本環境の場合においても、言語は English にする必要があります。こちらの切り替えさえ不要になるのが待ち遠しいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c1cf97a5-d472-7832-557d-dfa1b6188f48.png)

Power Apps の Copilot の画面が出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/383d6654-65cc-fb23-7324-e18012439c17.png)

# 従来通り米国環境の場合

一応の補足ですが、従来通り米国環境の場合は、開発者環境を作成する際、以下のように米国を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ebbec159-3f25-a0ef-cb7a-cdb056c959e1.png)

# まとめ

今回は、Power Apps の Copilot を日本環境で試す方法について紹介しました。日本環境でも試したいという方もいると思うので参考になれば幸いです。
Ruby + Rspec – テスト失敗のエラー時にアフターフック処理して赤文字でカスタムメッセージを標準出力する ( example単位 )

after each の中で exception を参照すれば検証失敗エラーのときだけに何らかの処理ができる

通常Rspecはどのように検証が失敗したかを丁寧に表示してくれるが
テストの構成上、標準出力で詳細が分かりづらい場合はアフターフックを仕込んで、何か標準出力させておくとデバッグがしやすいかもしれない

( たとえば Rails の Requestのテストの時に response body を標準出力するなど )


# 例


```rb
describe 'Test' do
  after(:each) do |example|
    if example.exception
      
      puts "\033[31m" # 赤字開始 - 標準出力で文字色を付ける 

      puts example.full_description # Test It Description
      puts example.description # It Description
      puts example.location # /path/to/spec.rb:15

      puts 'something' # 何か失敗時に見たいものを出力

      puts "\033[0m" # 赤字終了
    end
  end

  it 'It Description' do
    expect(true).to eq false
  end
end
```

# exampleの中身

`RSpec::Core::Example` のインスタンス


```rb
puts example
# <RSpec::Core::Example "is expected to eq false">
```

https://rubydoc.info/github/rspec/rspec-core/RSpec/Core/Example

# example.location

失敗したファイル・ファイル行数が分かる

例:


```
/path/to/spec.rb:15
```
# example.full_description

description や it の説明を合わせたフルの説明が入るようだ

# example.description

it の説明部分が入るようだ


# example.exception の中身

よく見るRspecの実行結果(失敗時)が入っているようだ

```rb
puts example.exception
# expected: false
#      got: true
#
# (compared using ==)
#
# Diff:
# @@ -1 +1 @@
# -false
# +true
#
# => nil

```

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
配列の要素の入れ替え Python3編

https://paiza.jp/works/mondai/array_primer/array_primer__array_elm_change

私が書いたのはこれ

```py
A,B,N = map(int,input().split())
S = list(map(int,input().split()))
for i in range(len(S)):
    if i + 1== A:
        tmp = S[B-1]
        S[B-1] = S[A-1]
        S[A-1] = tmp
        break

for i in S:
    print(i)

```

でもよく考えたら、
べつにif文なくてもそのまま変えたらいいだけだった。。。
答え見てわかってしまったorz
EndeavourOSでページを紙のようにスクロールしたい

EndeavourOSでスクロールを変更したい。今までMacOSのスクロールに慣れてきたので、webページを紙のように捉えるスクロールが恋しかった。メンタルモデルの一部になっていたので、それをEndeavour OSで設定しよう。linuxの世界に入り込むために。電子世界とつながるのだ。

# 簡易的なまとめ

## 1. deviceのidを確定

```sh
xinput list
```

タッチパッドのidが11だということを確認した。(タッチパッドのような記述を探した)

## 2. 11のdeviceに設定できる項目名をリストアップ

```sh
xinput list-props 11
```

## 3. 項目名を設定

```sh
xinput set-prop 11 "libinput Natural Scrolling Enabled" 1
```

## 4. i3の設定ファイルに永続化

```~/.config/i3/config
exec --no-startup-id xinput set-prop 11 "libinput Natural Scrolling Enabled" 1
```

---

スクロールを変更するということは、トラックパッドの設定を変更するということのようだ。

つまり、これを実行するためにはdeviceを検索して、そのdeviceがどういう設定をするかを知る必要がある。そのために使えるコマンドが`xinput`だ。xinputでdeviceを識別する。

まず、deviceのidを確定しよう。

```sh
xinput list
```

> ⎡ Virtual core pointer                    	id=2[master pointer  (3)]
> ⎜   ↳ Virtual core XTEST pointer              	id=4[slave  pointer  (2)]
> ⎜   ↳ ETPS/2 Elantech Touchpad                	id=11	[slave  pointer  (2)]
> ⎣ Virtual core keyboard                   	id=3[master keyboard (2)]
>     ↳ Virtual core XTEST keyboard             	id=5[slave  keyboard (3)]
>     ↳ Power Button                            	id=6[slave  keyboard (3)]
>     ↳ Video Bus                               	id=7[slave  keyboard (3)]
>     ↳ Power Button                            	id=8[slave  keyboard (3)]
>     ↳ Lid Switch                              	id=9[slave  keyboard (3)]
>     ↳ AT Translated Set 2 keyboard            	id=10	[slave  keyboard (3)]

この端末ではタッチパッドのidが11だった。

今度は11のdeviceに設定できる項目名が知りたい。

```sh
xinput list-props 11
```

> Device 'ETPS/2 Elantech Touchpad':
> 	...
> 	libinput Natural Scrolling Enabled (312):	1
> 	...

Natural Scrollingに関連する属性がちょうどあった。これをオンにすればよい！propを設定するには、xinputのset-propというコマンドを利用する。

```sh
xinput set-prop 11 "Natural Scrolling" 1
```

これでいいのかなって思ったけど、propの名前をフルで設定する必要があるらしい。libinputが入って、ようやくひとつのpropだそうだ。

```sh
xinput set-prop 11 "libinput Natural Scrolling Enabled" 1
```

よしよし、これで一時的に設定することはできた。永続化するためには、zshrcに設定すればいいかな。いや、違うな？起動時の設定をしないといけないんだ。i3-wmを使っているから、その設定ファイル~/.config/i3/configに入れてしまえばいいと思う。

```~/.config/i3/config
exec --no-startup-id xinput set-prop 11 "libinput Natural Scrolling Enabled" 1
```

これで今までの電子の世界に戻ってこれた。ばんざい。
読書感想：nginx実践入門

# 書籍名「nginx実践入門」
著者：
久保達彦
道井俊介

# 読もうと思った動機
nginxに苦手意識があり、それを改善するため

# 印象に残った部分

## nginxの機能

### HTTPサーバー
Webサーバとも
WWWを通じて受けた要求（HTTPリクエスト）に応じて、HTML文書をはじめとする情報を提供するシステム

https://www.weblio.jp/content/HTTP+server

### アクセス制御
IPアドレスの制限を行う。
社内ネットワークなどで利用する

### gzip

データ転送量を削減することで、データ転送時間を進める。
圧縮する部分はレスポンスボディ


### リバースプロキシ
ユーザのリクエストを受け取りそれを上位サーバに転送する機能。
ユーザごとのリクエストを分散して、負荷を

### URI Rewrite
リクエストに対して、ファイルを切り替える機能。

### ロードバランサー
２種類のロードバランサーがある
IPアドレスを対象にしたL4ロードバランサ
HTTPメソッドを対象にしたL7ロードバランサー

### ロードバランサとリバースプロキシの違い

nginxの公式
https://www.nginx.co.jp/resources/glossary/reverse-proxy-vs-load-balancer/

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/diff180load.html

用語|意味
-----|---
リバースプロキシ|Webサーバさんのパシリ。Webサーバさんの身代わりになってホームページを返してくれるコンピュータ
ロードバランサ|負担を軽くするために処理を振り分ける誘導係

## 基本設定
設定ファイル　/etc/nginx/nginx.conf 
設定ファイルのそれぞれの項目：ディレクティブ（命令）

```/etc/nginx/nginx.conf 
    root /var/www/html; # mainコンテキスト
    events{ #eventsコンテキスト　
    worker_connections 1024; #最大接続人数を指定する
}

http{ # httpコンテキスト
    include mine.types; # 
    default_type application/octet-stream; # Content-Typeを指定
    log_format main '$remote_addr [$time-local] "$request"' #ログのフォーマット
                    '$status $body_bytes_sent "$http_referer"'
                    '"$http_user_agent" "http_x_forwarded_for"';
    
    access_log logs/access.log main; # ログのファイルパス

    sendfile on; #ファイルの読み込みと[クライアント]への[レスポンス]の送信に[sendfile]を使うかを設定する
    tcp_nopush no; # FreeBSDでのTCP_NOPUSHソケットオプションをオフにする

    server{
        listen 80; #リクエストを受けるポート番号を指定
        server_name localhost; #ホスト名を指定

        
        root html # リクエストのルートディレクトリを指定
        index index.html index.htm; # index.htmlがない場合は index.htmを参照します。
                                    # 
    }
                
}
```
## 運用監視

### ステータスをモニタリング
統計情報：非トラブル時に扱われるパラメータ


### アクセスログ

問題が発生するときに活用されるパラメーター


### 扱うソフトウェア

ソフトウェア名|説明
-------------|-----
Fluentd|オープンソースのデータ収集ソフトウェア。nginxのログを収集する。必須
Norikra|ストリームデータ処理エンジン。複数のnginxがあるときに導入する。
GrowthForecast|APIをGUIで表示するクライアントソフトウェア。必須


ストリーム処理：イベントのついての情報を移動中に取得し、その場で処理する低遅延な方法
https://www.splunk.com/ja_jp/data-insider/what-is-stream-processing.html


# 実践できること or 感想


・nginx単体を検証できる環境を作る
→nginx on Dockerで環境構築する。
　chapter3「基本設定」,4「静的なWebサイトの構築」に取り組む

・Chapter7以降は後回し。今の私の手に余ると思いました。

大規模web開発からシステムパフォーマンスも扱っており実践できる内容が多い本だと思いました。