OmniAICreator/Qiita-1.07M huggingface dataset:
＊＊＊お店と本社の困ったを解決したい!    LINE Botがサポートする方法＊＊＊教えてChatGPT!!

最近はすっかり朝と夜が冷え込むようになってきましたが、皆様風邪予防は万全ですか？
どうにか今の所は無事に過ごせている**市川**です。
![秋LINE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/cbdbe64c-e0bc-748e-600e-76b6c03e3aa4.png)
今回は、お店と本社が共通して抱える問題を解決する方法について考えてみました。
## 困っている点（お店も） ##
毎日本社で電話を受けていると良くあるのが**どこに聞けばわからないんだけど**から始まる問い合わせ:worried:<br>自分の部署は全体の窓口のようになっていて、分かっていればすぐにお答えできるんですが分からないと、可能性がある部署にとりあえず確認へ走ります:runner_tone3:<br>その間の待つ時間と待たせる時間・・・かなりもったいない:timer:
### どちらも助かる解決策は？
そこで、LINE Botに特定のキーワードから担当の部署名と電話番号を返す仕組みを作り、この「もったいない」な時間を解決できないか考えました。最近ChatGPTを学んだので、ChatGPTに作成方法や設定方法を尋ねることで簡単にできるのではないかと考えました。:thinking:

## まずはやってみよう ##
### 使用したもの ###  
1.Googleスプレッドシート<BR>2.[make](https://www.make.com/en)
3.LINE Bot<BR>4.[ChatGPT](https://chat.openai.com/)
### まずは情報をまとめる  ###
自分で把握している担当部署の一部を簡単にまとめました。![スクリーンショット 2023-10-30 002518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/54185607-8ed5-31e2-b199-3a4c7f71e9c9.png)
### LINE Botの準備 ###
こちらは[公式](https://developers.line.biz/ja/)をぜひ参考に！！
### makeでスプレッドシートから必要な情報を返してくれるフローを構築する ###
ここで***問題発生！***
エラーで先に進めない！！<br>色々な記事を参考に作成しましたが、既読はつくものの返答が来ない:sob:返ってきたと思ったものは期待していたものと違っていた:sob: 
### 教えてChatGPT ###
こんな時こそChatGPT！きっとフローの構築方法を教えてくれるはずです！期待して返ってきた答えが![スクリーンショット 2023-10-30 013433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/4755a8e5-f865-0e20-336c-4a890c5a1705.png)
うん・・・すいません:disappointed_relieved:私のレベルでは全く理解できませんでした:weary: 質問の仕方が悪かったのか、結局先輩方の記事を参考にしてなんとか構築してみました。
![スクリーンショット 2023-11-06 225644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/16cc799b-9605-38c0-960d-800450894178.png)
それぞれの設定です。
![スクリーンショット 2023-11-06 231205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/5a08740f-e060-ed01-6414-d81639923a22.png)

![スクリーンショット 2023-11-06 231254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/0337c965-5ffc-d758-618c-0f09fede042a.png)

### やっと完成! ###
必要な情報をスプレッドシートから返してくれる仕組みができました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/1e290633-4f48-4800-23cd-be86f9e8380b.jpeg" width="200" height="150">

### ChatGPTはパソコン初心者には難しいのか？ ###
今回はChatGPTでフローの作成が簡単にできるのではないかと考えましたが、理解できなかったため自力で作成しました。 ***ChatGPTは使えないのか？***
そんなことはありません！
実際、この記事のタイトルの代案を考えさせたり、リンクをクリックして飛べるようにしたり、挿入した画像のサイズを調整したりするのに大いに役立ちました。
![スクリーンショット 2023-10-30 084908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533975/bc7f2203-ce3e-b0ff-2aa0-6d3fb18d43d4.png)
出力されたコードをコピーして一部変更するだけで実現できます。これだけでもかなり時間が短縮されます。この短縮された時間を使って、スプレッドシートの情報をもっと分かりやすく整えることができました。

### あとがき ###
今回、ChatGPTを使って体験した機能の多様性に触れ、その実現可能な範囲の広がりを感じました。まさにニーズに応える素晴らしいアプリです。今後も積極的に活用していきたいと思っています。
VimからVSCodeまで: Doom Emacs/Spacemacsキーバインドのまとめ

Emacs、Vim/Neovim、Visual Studio Code、IntelliJ IdeaをはじめとしたJetBrainsのIDE、開発環境の基盤となるこれらは、いずれもVim流のキーバインドが提供されており、エディタは同じ手触りで操作できるようになっています。

そこで、ふと考えました。

もしエディタ以外の箇所も、同様に統一されたキーバインドで操作できれば、これらをフラットに扱えるのではないか。どれか1つに縛られずに、固執せずに済むかもしれません。

調べたところ、Doom EmacsやSpacemacsのキーバインド体系は他の環境でも提供されていました。  
以下はそのまとめになります。

## Doom Emacs

https://github.com/doomemacs/doomemacs

### Visual Studio Code

https://github.com/VSpaceCode/community-configs/tree/master/doom

VSpaceCodeはVSCodeをSpacemacsのようにする拡張パックです。このプロジェクトでは、他にもいくつかの設定を配布しており、その中の1つにDoom風のキーバインドを実現するものが含まれています。拡張をインストール後、`settings.json`に設定を追加することで、Doom風のキーバインドを利用できます。

### JetBrains IDE

https://github.com/sei40kr/idea-doom-emacs

[IdeaVim](https://plugins.jetbrains.com/plugin/164-ideavim)が必要です。`.ideavimrc`にこちらのリポジトリで提供されるファイルをインポートすることでDoomっぽくなります。

### Neovim

https://github.com/doom-neovim/doom-nvim/

Luaで書かれた、Neovim専用の設定フレームワークです。
`go`モジュール、`linter`モジュール、`dap`モジュールなど、ある程度まとまった機能をモジュールとして提供しています。ユーザーは、どのモジュールを有効にするかや、モジュールにどのような設定をするかによって、お好みの開発環境を構築できます。まさにNeovim版のDoom Emacsと言えるでしょう。

## Spacemacs

https://www.spacemacs.org/

### Visual Studio Code

https://vspacecode.github.io/

先述の、VSCodeをSpacemacsっぽくする拡張パックです。Doom化する場合は設定ファイルに記述を足すという追加の手順が必要でしたが、こちらは拡張をインストールするだけです。

### JetBrains IDE

https://github.com/MarcoIeni/intellimacs

こちらも[IdeaVim](https://plugins.jetbrains.com/plugin/164-ideavim)が必要です。`.ideavimrc`にこちらのリポジトリで提供されるファイルをインポートすることでSpacemacs化しようというプロジェクトです。

### Vim / Neovim

https://gitlab.com/SpaceVim/SpaceVim

Vim/Neovim版のSpacemacsです。こちらはVim scriptで書かれており、VimとNeovim両方で利用できます。
リンカ(linker)とは

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# リンカとは
リンカ(linker)とは、名前の通り(link＝繋げる)、__繋げる__ ために使用するソフトウェアツールです。具体的に言うと、`コンパイラによって生成された成果物(オブジェクトファイル)を結合し、実行可能なファイルを生成するためのツール`です。

# リンカの役割
### ①シンボル解決
シンボル解決とは、あるオブジェクトファイルの関数や変数を、別のオブジェクトファイルで使用したり、呼び出したりするために、アドレスを教えてあげることです。
### ②ライブラリのリンク
プログラムが外部ライブラリを使用している場合、リンカはこれらのライブラリをプログラムに結合し、必要な関数やリソースを提供することができます。

### ③不要なコードの削除
リンカは、実行可能ファイルに含まれるが使用されていないコードを、ファイルサイズの削減や、パフォーマンスの向上のために削除することがあります。
削除対象となるコードの例を以下に挙げます。
- 未使用の変数や関数
- コメントアウトされたコード
- 実行フロー外のコード

# 静的リンク/動的リンク
リンクには、静的リンクと動的リンクの2種類があります。
### ■静的リンク
`コンパイル時に全てのオブジェクトファイルを、動かしたいオブジェクトファイルの中に静的にコピーする`やり方です。
プログラムがコンパイル時に必要なライブラリや依存関係を実行可能ファイルに組み込むため、実行時にリンク関連のエラーが出ることがない一方で、ファイルサイズが大きくなります。
### ■動的リンク
`プログラムが、実行時に必要なライブラリをロード`します。実行可能ファイルは、ライブラリへのリンク情報だけを持ち、ライブラリはシステムの共有ライブラリとして提供されます。
特徴としては、静的リンクの真逆となるため割愛します。

# 終わりに
リンカは、プログラムの骨格を形作る重要なツールです。プログラミングの世界において、リンカの役割を理解し、適切に活用することは、効率的なソフトウェア開発と最適化につながります。

最後までお付き合いくださりありがとうございました。
秋月のst7789(spi)で遊ぶ2(コマンド一覧


x カラー液晶は、 ST7789 ST7789V2 ATM0130B3 の事

目的
カラー液晶は、
コマンドとそれに続くデータ(オプション)で構成されている

今回つかうのは、主に
ソフトウエアリセット(0x01)
スリープ　アウト(0x11)
画面のオン(0x29)
カーラーの並び BGR　→  RGB(0x36)
16ビットモード(0x3a)
リバース(0x21)

書き込みモード(0x2c)


原文

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/unit/lcd/ST7789V2_SPEC_V1.0.pdf

覚えている範囲

![o_cop721.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e32a11f2-060d-5b58-2d20-e665263baf0b.jpeg)



![o_cop722.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/df631ae4-d1a1-4c3c-f41e-a0a3441ea8b2.jpeg)



![o_cop723.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fe6d70f3-cc1e-f8d2-e66e-ffffa0370f62.jpeg)



![o_cop724.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/16c6f90c-f3fa-b51e-936f-a2a830d463a6.jpeg)



![o_cop725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cd5d4562-4046-906f-e4c5-4a3e2d832ca1.jpeg)



![o_cop726.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2b76249f-d1d2-9152-231f-3cdc485cadcc.jpeg)



![o_cop733.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9eccf6e7-f972-74c7-3bec-d20c62990bd9.jpeg)




![o_cop728.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ad3de022-d026-8f28-2632-5179b23141a9.jpeg)



![o_cop729.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/56708a44-c242-d884-ec2e-67755ad8aca6.jpeg)



![o_cop72A.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ec797d66-1a20-dbe6-9120-6b1de82fc158.jpeg)



![o_cop72B.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/765f4ffc-acfb-3450-8f07-279a747c8d06.jpeg)



ほぼ、イメージ

![o_cop707.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7862edfc-d77a-0dc9-2b7b-8c92185a7e94.jpeg)

![o_cop708.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4d3e471b-262b-cb85-b6a7-40bda88c22fc.jpeg)

![o_cop709.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5ef7726f-71fb-a342-dca4-143be753b27a.jpeg)

![o_cop710.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2abc4e0d-a42f-2dc0-16a8-94d809fe45ec.jpeg)

![o_cop714.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e2cb7107-d40a-1fea-1ef3-9f9535749ea3.jpeg)

![o_cop712.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a6065b3d-8912-05df-06b8-b0bbd147adf4.jpeg)
[Flutter]ユニットテストの実装について学んだ。

## はじめに

こんにちは。
今回は、ユニットテストについて学んだことを共有できればと思います。
間違いやご指摘があればコメントいただければ幸いです。

## ユニットテストとは？

ユニットテストとは、**プログラムを構成する小さな単位(関数やメゾッド)で、
個々の機能が正しく動作するのか確認するため**に実施するテストを指します。

## ユニットテストの担当範囲

ユニットテストは、主にビジネスロジックが意図した挙動通り動作するかを確かめるものなので、
ビジネスロジックに関した関数、クラス、メゾット、モジュール単位（~~言い方違うだけ~~）で実装します。

**APIのPOST,GETなどは、結合テスト**で、
**WIdgetのUIなどはWidgetテスト**でそれぞれ行うのが通常です。

これはまた後日記事にさせていただければと思います。


## 実装方法

#### パッケージ

以下のテストパッケージを使用します。

https://pub.dev/packages/test

以下のどちらかのコマンドをプロジェクトルートで叩いてください。

```dart:パッケージインストール
dart pub add test --dev
///dart
flutter pub add test --dev
///flutter
```

#### テストファイルの作成

まずは、プロジェクトのルートでtestディレクトリを作成します。
その上で、テストディレクトリ内にテストしたいファイル名の後ろに、
_testをつけて、新規にプロジェクトファイルを作成します。

例えば、sample.dartファイルに対するテストファイルを作成したい場合は、
以下のように、sample_test.dartを作成します。

```dart
project_app/
  lib/
    sample.dart
  test/
    sample_test.dart
```

#### 階級を合わせる。※注意点

テストコードを書きたいファイルと同じディレクトリ構成で作成しなければいけない。

```dart
project_app/
  lib/
    controller/
       sample.dart
  test/
    controller/
       sample_test.dart
```

## テスト実装

以下がテストコードのテンプレです。

```dart
test("テスト名", () {
  // 前処理
  // クラスのインスタンスを生成したりなどする
  expect("処理や変数", "処理による結果や変数の期待値");
});
```

実際にコードを見てみましょう。
```dart
 test('first test', (){
    var calu = 2 + 3;
    expect(calu, 5);
  });
```
## テスト実行

プロジェクトのルートディレクトリで以下のコマンドを叩きます。

```dart
flutter test
//全てのテストコードを実行するコマンド

flutter test test/sample_test.dart
//特定のテストファイルを実行するコマンド
```

#### 結果
成功していた場合↓↓
```
~~~@~ プロジェクト名 % flutter test
00:10 +2: All tests passed!   
```

失敗していた場合↓↓
```
flutter test
00:02 +0 -1: /Users/~/StudioProjects/プロジェクト名/test/sample_test.dart: first test [E]          
  Expected: <6>
    Actual: <5>
  
  package:matcher            expect
  test/sample_test.dart 7:5  main.<fn>

```


## Mockを用いる。

Mockを用いてtestを実行する方法は今後追記するか、別記事にして書こうと思います。

## 参考記事

https://qiita.com/ikedaS-06/items/690ce3d93a48c5491325

https://zenn.dev/ncdc/articles/flutter_unit_test_mock

https://blog.pentagon.tokyo/2387/

## 最後に

最後まで読んでいただきありがとうございました。
何かご指摘等あればコメントいただけると大変励みになります。

ありがとうございました。
Wi-FiカードのBlueTooth USBケーブルをマザーボードの9ピンUSBヘッダーへ接続するには

# はじめに
先日、Wi-Fiカードを購入し、現在、稼働しています。しかし、付属のBlueTooth USBケーブルはまだ、接続していません。マザーボードをよく探してみましたが、それらしき空きUSBヘッダー(マザーボード上の9ピンUSBソケット)が見当たりません。そこで、ネットでパソコンの取り扱い説明書を探し、じっくり見てみました。すると、ありました。この後、その接続について調べたことを記述します。
# BlueToothケーブルの接続
Wi-Fiカードはtp-linkの<strong>AX1800 Wi-Fi6 Bluetooth 5.2 PCIe Adapter</strong>というものです。
このカードでBluetoothも使えるようになるようです。今のパソコン(<strong>Dell Inspiron620s</strong>)には、Bluetoothが付いていません。そのため、これで使えるようになればありがたいです。

#### (1) どのようにすれば接続できるのか
このパソコンのマザーボードでは、Wi-FiカードのBluetooth USBケーブルを差し込める<strong>空きUSBヘッダー(マザーボード上の9ピンUSBソケット)が無い</strong>ことがわかりました。そこで、ネットで調べたところ、<strong>USBヘッダーの増設アダプター</strong>があることがわかりました。
例えば、「<strong>Kalolary 9ピンUSBヘッダー 増設 オス1〜4メス延長ケーブル カード マザーボード USB2.0ヘッダー 2分配ハブ HUB 9Pin コネクタ アダプタ ポートマルチコネクタ</strong>」という製品があります。
この製品だと<strong>9ピンUSB 2.0ヘッダーを4つまで増設</strong>できます。
<strong>取り付け方法</strong>
マザーボードにUSB 9ピンヘッダーがあり、すでに使用されていますがそれを外し、増設アダプターの9ピンコネクターを差し込みます。外した元の9ピンコネクターは増設の9ピンヘッダーに差し込みます。すると9ピンヘッダーの空きが3つ残りますので、その一つにWi-Fiカードの9ピンコネクター差し込めば接続できることになります。
この製品はまだ、購入していませんが、以上の方法で接続できると思います。
#### (2) USBヘッダーは、PCI-E増設カードのそばにありました。
このUSBヘッダーは、PCI-E増設カードのそばにありました。すでに接続されていますので、それを外して、その間に購入した増設アダプター(4口等)を挿入することになります。見つけにくいかもしれませんが、<strong>ボードの縁</strong>にありました。

#### (3) USB 9ピンヘッダーの形状
マザーボードの縁あたりに以下のような形状のソケットがあります。ここに9個のピンが立っています。すでにコネクターケーブルが差し込まれているかもしれません。サイズは12mmx5mm程度です。

![9ピンヘッダー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198006/a2fd332d-5de3-443e-9f5e-472c3eea1d99.png)
# 後日、購入してセットアップしました。
#### (1) 製品が届きました。
早速、パソコンのカバーを外し、マザーボードにある使用中のUSBヘッダーのコネクターを外して、購入したアダプターを接続しました。
アダプターにある4つのヘッダーの内、2つを使用して、Wi-FiカードからUSBコネクターケーブルと元々挿してあったUSBコネクターケーブルを接続しました。
#### (2) Bluetoothのインストール
Wi-Fiカードに同梱された3インチのCDを使用してインストールしました。手順は同梱の説明書にあります。
#### (3) ここで、問題が発生しました。
縦置きのパソコンのため、DVD装置も縦にセットされています。そのため、3インチCDはうまくセットしないと落ちやすくなります。
案の定、インストールを終了して、取り出そうとしたら、CDが出てこなく、扉を開けて中をみても見当たりません。大変なことになりました。小さいCDのため、DVD装置の隙間へ落ちたのかもしれません。
ここで、落ち着いて、何とか取り出そうと、電源も外してパソコンを横にしたり、縦にしたりして、DVD装置の中のCDを何とか取り出すことができました。反省点は、スリム型のパソコンの場合、3インチCDのような小さいCDは縦置きにすると外れやすいため,その場合は、<strong>パソコンを横にしてCDが落ちないようにすることが肝心</strong>と思いました。

# あとがき
先の製品は1430円ほどで購入できます。これで、Bluetoothが使用できれば安いものです。これで、DEll Inspiron 620sパソコンがBluetooth対応に生まれ変わります。
(補足)
Bluetoothは、パソコンとスピーカを接続するのに使用します。スピーカーはCDコンポのスピーカーを利用しています。スピーカーはコンポのスピーカーなので、左右それぞれ4本のケーブルが出ています。それぞれに大小のスピーカーがあります。オーディオアンプ(Nobsound)の出力側はスピーカーで、入力側がパソコンです。パソコンとオーディオアンプをBluetoothで接続しています。
15Wx2のスピーカーをオーディオアンプ(最大50Wx2)で増幅して使っています。
AWS SAA(C03) 勉強ログ2

# 主に自分用のメモです。情報の共有を目的としていません。

https://www.udemy.com/course/aws-knan/

模擬問題の復習をつらつらと書き連ねていく
##
WebサーバーとDBインスタンスでサブネットが分かれていて、WebサーバーにAutoScailingが設定されている場合、DBインスタンスの**インバウンド通信ルールにはIPアドレスではなく、セキュリティグループのIDを指定すると、Webサーバーの増減でIPアドレスが変わっても、変わらずに通信ができる** ようになる。
##
EC2インスタンスにELBやRoute53を構成していると、特定のEC2インスタンスに障害が発生した際に、ダウンタイムを最小にして待機系インスタンスに切り替えることができます。その際にホスト名を待機系のIPアドレスに向け直すと、DNS情報が伝播するまでに一定のダウンタイムが発生する可能性があります。
これを防止するためには、**IPフローティングを利用してElastic IPアドレスをフローティングすることで即時に別のEC2インスタンスへとトラフィックを切り替えることができます。** これによって、障害発生時には稼動系からElastic IPアドレスを外し、待機系インスタンスに割り当て直すことで瞬時にトラフィックの向け先を変更できます。
##
異なるAWSアカウントが有するリソースへのアクセスを委任する方法として、**クロスアカウントアクセス許可とIAMロールを設定**することが必要です。これによって、特定のアカウントにある特定のリソースを別アカウントのユーザーと共有します。**クロスアカウントアクセスを設定することで、利用者はアカウントごとに IAM ユーザーを作成する必要がなくなります。**
##
EC2で本番環境と開発環境で開発者に異なる権限を与えたいとき、例えば**開発環境は削除権限を与えるが、本番環境には与えない、といったときにはタグを活用**する。
タグによって「本番インスタンス」と「開発インスタンス」を定義するメタデータをインスタンスに追加します。次に、ユーザーに対してIAMポリシーによってアクセス権限を付与する際に、これらのタグに基づいて開発者の利用範囲を分けます。これによって、タグベースで本番用インスタンスを操作するユーザーと、開発用インスタンスを操作するユーザーに権限を分割することが可能となります。
**IAMポリシーはサービス単位**でアクセス権限を拒否するため、開発者が開発用インスタンスも削除できなくなってしまいます。
##
**ステートフル**処理用のインスタンスは、クライアントとWebサーバー間の接続時にはセッションがアクティブである限りデータベースが使用されたままになるため、**分散システムに適していません**。

## 暗号化を自動的に実行しているサービス
AWS Storage GatewayとS3(Glacier)
### しないサービス
Amazon RDS, Lambda, ECS
##
Amazon Aurora は、標準的な MySQL データベースと比べて最大で 5 倍、標準的な PostgreSQL データベースと比べて最大で 3 倍高速化することが可能なリレーショナルデータベースです。 したがって、**Amazon RDS for MySQLよりも、Amazon Aurora for MySQLの方が高可用性やスケーラビリティを高めることが可能**
##
リザーブド購入オプションは以下のようなものがあります。
・EC2リザーブドインスタンス
・RDSリザーブドインスタンス
・ElastiCacheリザーブドキャッシュノード
・DynamoDBリザーブドキャパシティ
・Redshiftリザーブドノード

## VPC間の接続の違いについてはこちら
1.VPC peering
2.AWS Transit Gateway
3.Software Site-to-Site VPN
4.Software VPN-to-AWS Managed VPN
5.AWS Managed VPN
6.AWS PrivateLink

https://dev.classmethod.jp/articles/whitepaper-vpc-conectivity-options-02/

## VPCエンドポイントとAWS PrivateLinkの違い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/dc9b3bfb-37e1-62a1-e0e5-a3b80eb92a85.png)

https://dev.classmethod.jp/articles/aws-vpcendpoint-privatelink-beginner/

## Config Inspector GuardDutyの違い

## AWS WAF, AWS Shield, and AWS Firewall Manager の違い
https://docs.aws.amazon.com/waf/latest/developerguide/what-is-aws-waf.html
【GitHub】VScodeからGitHubへソースをプッシュする

# はじめに
GitHubに新規リポジトリを作るところから、VSCodeのソースをプッシュするところまで、久々すぎてやり方を忘れていたため、備忘録として書きます。

# VSCode側の準備

git initで作業ディレクトリ配下に.gitディレクトリを作成する。
ここを忘れていたため、この後のgit remoteでエラーが出た。

VSCodeのターミナルを開く
作業ディレクトリまで移動して以下のコマンド実行
```
$ git init
Initialized empty Git repository in 作業ディレクトリ/.git/
```

このように.gitディレクトリが作成されればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/fb027401-6239-c815-7f83-54891a8e0cbf.png)

続いてソースをコミットする。
```
$ git add .
$ git commit -m "初期作成"
```

# GitHubで新規リポジトリ作成
サイトにアクセスして、新規リポジトリを作成する。

Repository name⇒リポジトリの名前
Public or Private ⇒リポジトリを公開するか非公開にするか
Add a READE file⇒後からでも設定できるので、今回はチェックボックスはOFF

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/430545e2-d481-be05-8c71-9107fe0d7b17.png)

# GitHubとVSCodeの連携
リポジトリのHTTPSをコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/cb865cce-1349-76b1-09a0-b6ad26751ccf.png)

次にリポジトリをclone。ソースのプッシュを行う
VSCodeのターミナルを開く
```
$ git remote add origin [リモートリポジトリのHTTPSのcopy]
$ git push origin master 
```

ここで.gitディレクトリが無いと以下のエラーが発生するので、git initをする
```
fatal: not a git repository (or any parent up to mount point /mnt)        
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
```

# 終わりに
GitHubの草を沢山生やすのが今の目標です。
沢山アウトプットしよう
エンジニアはどこまで健康になればよいのか - 朝ランと個人的生産性への考察

## エンジニアと健康

不摂生は職業病 … であってよいはずはありません。

[ITエンジニアと健康](https://zenn.dev/mattn/articles/cac1a9048c3935)
[ITエンジニアのための健康づくり](https://zenn.dev/flutternyumon/articles/bbca1afe5de766)
[生産性を上げる。プログラマによる個人的健康管理術。](https://zenn.dev/yumainaura/articles/qiita-2016-06-10t23_50_55-09_00)

## 走り始めた

毎朝走ることにしました。本気で走ることを意識し始めたのは 8 月の終わり。今年 2023 年は 9 月に入ってもずっと暑かったですね。朝 5 時台でも 25 度とかザラにありました。そう、朝起きぬけに走っているのです。家のチビッコも寝ているし人も少ないからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/123e390a-a3fd-ef99-e131-0f59c7e8a533.png)



## きっかけ

結論から書くと最終的に危機的異常は無かったのですが、きっかけは健康診断です。要精密検査判定をもらったためです。大きな病気もなく標準体重、山も谷も無い標準的な健康体を自負していましたが、思い当たる節があるとしたらそれは唯一、私がお酒を好きなことです。その蓄積は内臓にきておりました。反省です。人生初めて MRI というやつをやりました。初めて自分の身体のために大学病院に行きました。

これはアカンやろ。私は長生きしたい。ましてや意識してもしすぎることは無いくらい身体に悪い、身体が衰えるこの職業。仕事を続けたければ、生活習慣を改めよというお天道様からのお告げだと思いました。

## 具体的方法

- Fitbit を装着しました。何事も推測の前に計測です。([アクティビティ記録デバイスなどの情報が得られる Fitbit オフィシャルサイト](https://www.fitbit.com/global/jp/home))
- 家の周り・公園・駅までの大通り往復 を東西南北方向に気分により使い分け 1 日合計 5 km 程度を目標に走ることにしました。 
- Spotify で Podcast を聴きながら走ることにしました。
- ピクミン ブルームを攻略しながら走ることにしました。([Pikmin Bloom 「ピクミン ブルーム」 - ピクミンとおでかけ](https://pikminbloom.com/ja/))
- 雨の日はベランダでラジオを聴きながら足踏みすることにしました。

これを朝 5 ～ 6 時台に行います。調子が良いとこれだけで 1 万歩に近づくことがわかりました。加えて毎日 (週末 OR 平日飲み会) 以外 の断酒を敢行しました。


## 結果

3 か月ほど続けたことになります。端的には体調が良くなり、集中力が向上しました。腰痛が消えました。これまでお酒で補われていたと思われた仕事に対する鈍感力が正しい方法で補給できるようになった気がします。以下データ。

2023 年 10 月の記録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/d8c4b008-49bc-5a4a-9e5e-057ccf4ba3fd.png)

2023 年8 月からの軌跡
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/8cfbb67b-da62-2a25-c82a-62f2b27963bd.png)

Fitbit の性能を疑う方も出るのではと心配ですが、壊れたわけではありません。私は走っているのです。

睡眠:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/64bdceae-0ac7-c835-f7a7-f8a6f7d61804.png)

睡眠はまだまだ改善の余地ありです。が、動いた日ほど寝られている気はします。個人的に驚いたのが、これまで「時間が無くて運動する暇なんかないよー」だと思っていたことが、運動することにより「これもやれそう、あれもやる元気がある、ついでにこれも」という前向きなスパイラルが生まれることです。資料をまとめる元気、コードを読むモチベーション、人と話すエネルギーが湧きました。結果的に運動は余力を生み出し、生産性を向上させる効果があったと感じています。

また走りながら聴く Podcast でアイディアが生まれます。私が聴くのは主にお笑いですが、それでも新しい視点やアイディアが生まれることもあります。もう少し余裕が生まれたら英語、技術、骨太な題材に挑戦してもいいのかもしれない。

あと、ピクミン ブルームもとても良いです。コレクション熱を刺激されます。ピクミン ブルームのために休暇取って昼間走りに行くのも良いかもしれないとも思う。ともかく何をやっても楽しみになるのは良いことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/30ef7d91-1246-b7b5-aa6a-0b7859a95ae3.png)


## まとめ

運動はいいぞ。

引用: [ITエンジニアと健康](https://zenn.dev/mattn/articles/cac1a9048c3935#%E5%81%A5%E5%BA%B7%E3%81%A7%E3%81%84%E3%81%A4%E3%81%A5%E3%81%91%E3%82%8B%E7%82%BA%E3%81%AB)

>元々、腰の持病を解決する為に走り始めましたが、今では毎日走らないと気持ち悪く感じるくらいランニングが日々のルーティーンになってしまいました。
>僕はガチのランナーになるつもりは全くなくて

>**楽しく**
>効率的に
>そして安く
>健康状態を維持できればいいなと思って走り続けています

体験してみて分かりました。共感します。そしてこれを続けることにより「習慣化」は学びにもすべてにも、やはり大事なのだなと身をもって理解しました。



## ほか参考

[「エンジニアはどこまで」学びとキャリアの目次 #ポエム - Qiita](https://qiita.com/e99h2121/items/50d51b05f110425115a5)
mrubyでI2C液晶

FreeBSD/mipsのmrubyでストロベリーリナックスの安価なI2C液晶モジュール(SB0802G)を使ってみました。

```ruby
#!/usr/local/bin/mruby
# SB0802G display script

LCDADDR = 0x3e

LCD_CLEARDISPLAY = 0x01
LCD_RETURNHOME = 0x02
LCD_ENTRYMODESET = 0x04
LCD_DISPLAYCONTROL = 0x08
LCD_CURSORSHIFT = 0x10
LCD_FUNCTIONSET = 0x20
LCD_SETCGRAMADDR = 0x40
LCD_SETDDRAMADDR = 0x80

t = BsdIic.new(0)

t.write(LCDADDR, [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c])
usleep 200_000
t.write(LCDADDR, [0x38, 0x0d, LCD_CLEARDISPLAY])
usleep 2_000

arr = [0x40]
arr += "Hello".bytes
t.write(LCDADDR, arr)

if ARGV.size == 1 then
  t.write(LCDADDR, [0x00, LCD_SETDDRAMADDR | 0x40])
  usleep 2_000

  arr = [0x40]
  arr += ARGV[0].bytes
  t.write(LCDADDR, arr)
end
```

![写真（2023-10-30 6.00）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/13d54be4-dbdf-c019-fb03-97fb6ee0b0d4.jpeg)

mruby on YABMのI2Cメソッドの引数と返り値をBsdIicに合わせてみたので、メソッド名は違いますが同じような処理で表示できるようになりました。

https://github.com/yamori813/rtlbm-mruby/blob/master/samples/i2c_demo.rb
Arista の vEOS を VMware Workstation 17 Playerに入れてみる


1. Arista にユーザアカウントを作成します。

2. [Arista の Download](https://www.arista.com/en/support/software-download) ページを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/dea51b03-5af3-d027-e709-a577088a8ba6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/7564b3d0-70aa-bdf7-b63a-07e43702f21a.png)
この中から Aboot-veos-8.0.1.iso と、vEOS64-lab-4.31.0F.vmdk, vEOS64-lab-4.31.0F.vmdk.json をダウンロード。


VMplayer で仮想マシンを作成します。
インストーラ ディスク イメージ ファイルは、先程ダウンロードした「Aboot-veos-8.0.1.iso」
ゲスト OS　Linux CentOS 8 (64ビット) [このへん](https://cn.teldevice.co.jp/_cms/wp-content/uploads/2018/03/bcddb05a529fb57b0e8ba1d23f2b3cde.pdf) によると Fedora だそうです。
仮想マシン名を指定
必要な CPU, メモリ, ディスクは以下の通り
[VMware ESXi Minimum Server Requirements](https://www.arista.com/jp/cg-veos-router/veos-router-using-the-router-on-kvm-and-esxi)
```
・Ethernet NICs must be SR-IOV capable
・BIOS / System Firmware support for SR-IOV
・8 GB free disk space
・16 GB RAM
・4 cores running a minimum 2.4GHz or greater and 16 GB memory
・Intel VT-x and VT-d support
```
ディスクは先程ダウンロードしたものと差し替えるので適当に。(単一ファイルとして格納で)

ネットワークアダプタは必要なだけ追加。
一つ目のネットワークアダプタのみ Manage に接続するため NAT とかに繋ぎ、残りは「カスタム MVnet2」とかに繋いでおく。(DHCP とか使わないし、セグメントが違えば通信できないので)

一旦起動して、電源を切ると以下の所にディレクトリができるので ～.vmdk を差し替える。
%USERPROFILE%\Documents\Virtual Machines\仮想マシン名\仮想マシン名.vmdk
～.vmx の最後の行に ```ulm.disableMitigations="TRUE"``` を追加しておく (やらなくても良い)

起動するとユーザ名 admin、パスワード なし、でログインできるので煮るなり焼くなりお好きなように。

↓からどうぞ。
https://changineer.info/network/arista_eos/arista_eos_operation_basic.html

### 実際にログインしてみると CentOS でした

```shell:
vEOS-11#bash

Arista Networks EOS shell

[admin@vEOS-11 ~]$ cat /etc/os-release
# os-release generated by Eos-release-4.31.0 for platform x86_64_el7

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

[admin@vEOS-11 ~]$
```
[ROS] WARNING: cannot create log directory への対処

# はじめに
最近、業務でRosとDockerの連携をやりはじめましたが、中々同じ問題にあったている人がいなかったので、ここで共有しようと思います。ちなみにDocker初心者です。。
# 問題
Dockerで.ros/logをバインドマウントをしていたのですが、rosclean直後にコンテナを立ち上げてしまい、roscoreが立ち上がらなくなりました。
```shell-session:
$ roscore
WARNING: cannot create log directory [/home/username/.ros/log/logdir]. Please set ROS_LOG_DIR to a writable location.
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
```
# 解決策
結論から言うと、以下のコマンドで解決します。基本usernameとgroupnameは一緒です。
```shell-session:
$ sudo chown -R username:groupname /home/username/.ros/log
```
# 原因
Dockerでバインドマウントの対象のディレクトリがホストマシン側に存在しない場合、コンテナを立ち上げるとそのディレクトリがホストマシン上に自動的に作成されるそうです。そのため、roscleanを実行した直後は.ros/logディレクトリは存在しないので、コンテナを立ち上げる際にこのディレクトリも作成されます。

ここで問題が生じるのは、このディレクトリ内のファイルの所有者が作成者であるコンテナのユーザーになる点です。そのため、ホストマシン側でroscoreを立ち上げようとしても、権限がなくlogディレクトリを作成できないために立ち上がりません。
# 終わりに
今回みたいな問題に当たるとLinuxの仕組みを理解する機会にもなって面白かったです。「ワタシハリナックスチョットデキル」ようになりたいです...笑
Node.js　Error: EPERM: operation not permitted, mkdir の対応

このエラーについて同じような方が複数いましたので、私が行った解決方法を残しておこうと思います。

#  概要
Node.jsインストール後vscodeでファイル、フォルダの作成、削除を実行すると権限がありませんという「Error: EPERM: operation not permitted, mkdir 」このようなエラーが表示される。

# 解決策
結論から言うと、[公式ホームページ](https://nodejs.org/en)からではなく、nvmからインストールすることで解決しました。

[nvmのインストール方法、使い方はこちらを参照ください](https://ralacode.com/blog/post/install-nodejs-on-windows/)

#  試したこと
１．バージョンを変えて再インストール
２．キャッシュの削除
３．フォルダそのものの権限の確認
４．nvmでインストール
### 1.バージョンを変えて再インストール

[公式ホームページ](https://nodejs.org/en)からLTSをインストールしていたのですが、ここからインストールするとエラーが出ました。バージョンなどを変えてみたのですが、それでもうまくいきませんでした。

### 2.キャッシュの削除

キャッシュが溜まっていてエラーが起きているという記事もありましたので下記のコードも実行しましたが、npm5以降はキャッシュをあまり残さないらしいので意味ありませんでした。
```
npm cache clean
```
このコードであらゆるキャッシュを全削除できるらしいが推奨はされてないみたい
```
npm cache clean --force
```
### 3.フォルダそのものの権限の確認
そもそもフォルダに編集する権限が付与されていないのでは？と思い確認しましたが、普通に権限が付与されていました。
[権限の確認方法はこちら](https://ascii.jp/elem/000/001/461/1461932/)

### 4.nvmでインストール
nvmでもNode.jsをインストールできることを知り、この方法を試したところうまくいきました！！
インストールの方法は[こちら](https://ralacode.com/blog/post/install-nodejs-on-windows/)を参照ください！

# さいごに
公式ホームページからインストールするのとnvmからインストールするのいったい何が違ったのでしょうか、いまだに原因はよくわかりません、、
この記事が誰かの役に立てれば幸いです
Flutter Provider/Consumer による状態管理

# Provider/Consumerを利用した学習コードの作成
- ChangeNotifierを実装したCartModelを作成。
- ChangeNotifierのメソッド一覧を見ると、addListenr,removeListener,notifyListenersが羅列されている。Javaで言うところのEvent Listenerのようなものとなんとなく理解。
- 状態管理するモデルのデータを反映したいツリーの１つ上の階層で、Providerとして登録（設定）すると、配下のツリーにデータ更新時のイベントが通知される仕組みのようだ。
- 状態更新を受け取る側(Widget)をConsumerで囲ってあげることで、対象のWidgetで通知を受け取ることができる。
- Consumerは上位ツリーで受け取ることもできるが、Widgetのrebuildにも影響があるため、また更新が必要なWidgetに範囲を狭めた方が可読性もあり良いとのこと。

# 「shuffle」ボタンを押下する度に表示データが再描画されるコード
なんとなくの感覚で書いたので、より詳しく調べて学んでいく必要がある。listenをtrueにすると実行時エラーが発生する。ドキュメントをろくに読んでいないので、通知を受け取るとループするとかそんな感じなのか。
```dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class CartModel with ChangeNotifier {
  List<int> values = [1, 2, 3, 4, 5];
  void shuffle() {
    values.shuffle();
    print(values);   //デバッグ用
    notifyListeners();//通知発火
  }
}

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    //Providerの登録
    //Provider１つの登録なのでMutiProviderを使う必要はないが、書きやすかったのでこちらを利用。
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<CartModel>(
          create: (context) => CartModel(),
        ),
      ],
      child: const MaterialApp(
        home: Home(),
      ),
    );
  }
}

class Home extends StatelessWidget {
  const Home({super.key});
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            //CartModelの値が更新されたらRow内の再描画を行いたいので、ここでConsumerを設定
            Consumer<CartModel>(
              builder: (context, CartModel model, child) => Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  //CartModelに保存された数字を順番にTextオブジェクト化
                  ...List.generate(
                    model.values.length,
                    (int index) => Text(model.values[index].toString()),
                  ),
                ],
              ),
            ),
            ElevatedButton(
              child: const Text('shuffle'),
              onPressed: () => {
                //登録されたProviderのうちCartModel型のものを取り出し、shuffleメソッドを実行。
                Provider.of<CartModel>(context, listen: false).shuffle(),
              },
            )
          ],
        ),
      ),
    );
  }
}

```
HTTPリクエストの送り方

# Abstract
HTTPリクエストの送り方を説明する
# HTTPリクエストを送る方法
主に6つある:
- curlコマンド利用
- HTML（formタグ）利用
- Python（requestsライブラリ）利用
- Python（requestsライブラリ）利用　【セッション管理したいver】
- JavaScript（XMLHttpRequest）利用
- JavaScript（Fetch）利用

解説は以下の記事と、続きの記事を参照すると良い:
https://zenn.dev/n_nishino/articles/d21a61df114fdd
# 付録
HTTPリクエストそのものの概要については、以下を参照すると良い:
https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf
Jetpack Compose Navigationで気をつけるべきこと

# はじめに
今回、自分がJetpackComposeNavigationを使っていて可読性や、挙動の観点から気をつけるべきだと感じたことを紹介していきます
### 本文
***基盤画面***
Launcher画面からアプリを起動した際や、他アプリから起動した際に戻るボタンや上へボタンを押していったときに必ず最後に表示される画面があるべきという考え方です。
これは公式ドキュメントにも記載があるので実装をしていく際に気を付けておきたいですね

***/を含むデータの受け渡し***
これは、実際に実装してみるとエラーが発生するので、絶対的に修正しなければならないことですが、/が入ったデータをString型などで渡そうとするとAndroid側が遷移用のパスの区切りと勘違いしてしまいエラーが発生してしまいます。
この時はUri.EncoderでString型を一度エンコードすることで引き渡すことができます
### 最後に
遷移周りは特にデータの取り回しなどで気をつけたい部分なのでどなたかのお役に立てれば幸いです
【Ruby】productメソッドとmapメソッドの組み合わせ

productメソッド
productメソッドは、配列と他の一つ以上の配列（または同じ配列）の全ての組み合わせを生成し、それらを新しい配列に格納して返します。

    a = [1, 2]
    b = ['a', 'b']
    result = a.product(b)
    p result  # => [[1, "a"], [1, "b"], [2, "a"], [2, "b"]]
この例では、配列aと配列bの全ての組み合わせを生成しています。

mapメソッド
mapメソッドは、配列の全ての要素に対してブロック内のコードを実行し、その結果を新しい配列に格納して返します。

    numbers = [1, 2, 3, 4]
    squares = numbers.map { |number| number * number }
    p squares  # => [1, 4, 9, 16]
この例では、配列numbersの各要素を二乗して、結果を新しい配列squaresに格納しています。

productとmapを組み合わせる
productとmapを組み合わせると、複数の配列から全ての組み合わせを生成し、それぞれの組み合わせに対して特定の操作を行うことができます。

    SUITS = ['Hearts', 'Diamonds', 'Clubs', 'Spades']
    NUMBERS = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
    
    cards = SUITS.product(NUMBERS).map { |suit, number|"#{suit}の#{number}" }

    puts cards
この例では、SUITSとNUMBERSの全ての組み合わせを生成し、それぞれのカードを文字列として新しい配列に格納しています。例えば、"Heartsの2"、"Heartsの3"といった形式です。

このように、productとmapを組み合わせることで、複雑な操作も簡潔に書くことができます。


最後に、productとmapを使わないで同じ結果を得るためには、ネストされたループを使用することができます。以下に例を示します。


    cards = []
    SUITS.each do |suit|
      NUMBERS.each do |number|
        cards << "#{suit}の#{number}"
      end
    end
    
    puts cards

以上、productメソッドとmapメソッドの組み合わせに関する記事でした。
お役に立てれば幸いです。
続・クマなどの獣害関連のデータをもっと登録しやすくなるようなWEBサービスをつくってみたよ

## 前回からの続き

https://qiita.com/tonytani37/items/d874d3defbcc70a19648

前回、クマなどの獣害関連データの位置情報をもっと簡単に記録・登録できないかって考えた結果、ぼちぼち作ってみたサービスなどについて投稿しました。

その時「いま自分がいる場所の近辺でクマなどの目撃情報の有無が確認できればいいな」と書きましたが、それを実現するためにほぼ２年ぶりにソースコードを開いてロジックを追いつつ、ずいぶん怪しいjavascriptの扱いに苦労しながら、なんとなくそれっぽい機能を追加しましたので報告します。

## これが画面だ！

初期画面にいま自分がいる場所と近辺のクマ情報を地図にプロットした画面表示ボタンを追加しました。

![IMG_2064.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739706/5b8dda1e-f221-fa67-e14d-4b7b46892063.png)

色使いとか位置関係とかデザインに対する指摘はナシということで。とりあえず動けばオーケー主義です。

上画面の「いまいるところ」ボタンを押すと、自分の居場所とその近隣でのクマ目撃情報が下の画面のように地図上に表示されます。

見知らぬ場所で心配になった時、サービスに接続後に「いまいるところ」ボタンを押せば、近所で目撃例等があるかどうかを確認出来ます。
さまざまなブラウザや端末で確認してみたところ、位置情報取得を不可にしている場合には動かない場合がありますが（許可する？ってメッセージが出て利用できたりもしますが）、そんな場合は画面したの電話番号に電話してね、っという柔軟な（いいかげんな）対応で最低限なんとかなりゃいいや的な主義ですので。

![IMG_2062.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739706/4da28ccd-ad81-621f-1acc-93e98cb170cb.png)

赤丸に「現在地」と書いてあるところがスマホから取得した位置情報です。
上の画像データはちょっと加工しているので、そうはなっていませんが、スマホの画面に表示された地図の真ん中が自分の位置で、その周りでの目撃情報をクマの足跡マークで示しており、アイコンをクリックすると報告日時とコメントが表示されたりします。

## まとめ

様々な自治体がクマなどの目撃情報を地図上にプロットして公開していますが、そのどれもが庁内GISサービスの一部を利用しているためか機能がてんこ盛りなサービスで操作が重かったり、また自分が何処にいるのかは地元の人じゃないとわからないという具合で正直使いづらいなー、なんて思ってます。

で、簡単な機能でいいので、その周辺に観光にやってきたとか引っ越し直後でそのあたりの地理には疎いといった人のために、スマホで簡単に確認出来るサービスがあればと作ってみたのが今回のものです。

決して高機能ではないし、いたずら対策などセキュリティ面ではヘロヘロなのですが、そこはシロートのわたしがこんなものを作ったってことで刺激を受けたスーパーハッカーな人たちがステキなサービスを立ち上げてくれることを期待しならがら今回はここまで。

## おまけ

同じコンセプトで災害時の避難所や給水所などの場所と自分の今いる場所を表示するサービスがあれば便利なんじゃないかと。それってこのくま情報サービスを流用すればすぐにでも作れるんじゃないかって思いますので、もしかしたら私が作るかもしれないし、作らないかもしれない。

Google Mapの使い方も見様見真似なもので、本来ならば画面表示された地図からGoogle Mapアプリなどへ画面上のデータはそのままに遷移させて、あとはGoogle先生よろしくお願いします的な展開のほうが便利でオシャレな気もしますが。それは今後のお楽しみ。
【SwiftUI】Xcode15におけるプレビューの基本

# この記事は何？

Xcode15から、SwiftUIフレームワークを使ったアプリ開発のプレビューでSwiftマクロが利用されるようになった。
これによって、以前の方法で作成されるプレビューよりもコード量が大幅に削減された。
Swiftマクロによるプレビューの作成方法について、基本を解説する。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
> また、Swiftプログラミングを基礎から動画で学びたい方には、Udemyコース「[今日からはじめるプログラミング](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwii1qTuj_2BAxV4hlYBHbj5BqEQFnoECBYQAQ&url=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fstart-programming-today%2F&usg=AOvVaw2vs4Sccq-bpfA4ZD2rCyNm&opi=89978449)」をお勧めします。

# プレビューのイニシャライザ

`#Preview(body: () -> View)`

つまり、`body`パラメータには「ビューを返すコード」を指定する。

```swift:
// パラメータを省略しない呼び出し方
#Preview(body: {
    ContetnView()
})

// 末尾クロージャ形式
#Preview {
    ContetnView()
}
```

# 複数のプレビューを作成する

キャンバス内で、2つのプレビューを選択できるようになる。

```swift
#Preview {
    LandmarkRow(landmark: landmarks[0])
}

#Preview {
    LandmarkRow(landmark: landmarks[1])
}
```


# 名前をつける

プレビューの選択肢に「任意の名前」が表示されるようになる。

```swift
#Preview("Turtle Rock") {
    LandmarkRow(landmark: landmarks[0])
}

#Preview("Salmon") {
    LandmarkRow(landmark: landmarks[1])
}
```

# プレビューを並べて比較する

キャンバスに、複数のプレビューを並べる。

```swift
#Preview {
    Group {
        LandmarkRow(landmark: landmarks[0])
        LandmarkRow(landmark: landmarks[1])
    }
}
```

# 明示的にビューを返す

「ビューを返すコード」以外を記述した場合、`return`ステートメントを明示する必要がある。

```swift
#Preview {
    let landmarks = ModelData().landmarks

    return Group {
        LandmarkRow(landmark: landmarks[0])
        LandmarkRow(landmark: landmarks[1])
    }
}
```

# プレビューに固定値を渡す

プレビューに、暫定的なバインドを渡す。

```swift:
struct FavoriteButton: View {
    @Binding var isSet: Bool
    
    var body: some View {
        // some views
    }
}

#Preview {
    FavoriteButton(isSet: Binding<Bool>.constant(true))
}
```
ターミナル基礎

## はじめに

dockerってめちゃいい開発環境らしいです。めっちゃいい開発環境ってなんだってこどで勉強を始めました。dockerを使う時はターミナルやiTermからコマンド操作を行うのでその際使うコマンドの備忘録として残します。基礎の基礎なのでおおまかなものになってます。

### lsコマンド
```言語:ターミナル
ls #カレントディレクトリ内にあるファイルの表示を行う
```

### pwdコマンド
```言語:ターミナル
pwd #今いるディレクトリの表示を行う
```

### cdコマンド
```言語:ターミナル
cd 移動したいディレクトリのパス #入力したディレクトリのパスまで移動する
```

### mkdir
```言語:ターミナル
mkdir ファイル名 #入力したファイル名のフォルダを作成
```
### touch
```言語:ターミナル
touch ファイル名 #入力したファイル名のファイルを作成
```

### echo
```言語:ターミナル
echo '入力したい文字列' > 入力したいファイル名 #ファイルに文字列を書き込む
```

### cat
```言語:ターミナル
cat ファイル名 #ファイルの中身を出力
```

### less
```言語:ターミナル
less ファイル名 #ファイルの中身を全画面で出力
```

### mv
```言語:ターミナル
mv 元のファイル名　変更後のファイル名 #ファイル名の変更
```

### rm
```言語:ターミナル
rm 削除したいファイル名 #ファイルの削除を行う
```


## おわりに
以上が自分が学んだターミナルの基礎コマンドです。gitとかでも使うかもだった気もしないこともないかもしれないんで覚えて損はないですね。ではまた〜
初めに

ソフト＋エレクトロニクスの人になりたい電気電子工学の学士卒業～修士修了した35歳の中年です。
学士のGPAは3.9です、GPAは単位あたりの成績で4が最大です。ほとんどの単位で最高点をとりました。
エレクトロニクスについては上述の通りで、ソフト面だと好きな言語はC++です。15年前に「C++の設計と進化」を読んでJavaよりC++だなと思いました。ノー勉強でPaiza Aランクをとりました。Sランクは適切な処理削減が必須だと気づき、諦めました。アルゴリズムの勉強は、パターンに当てはめるより閃いたほうが楽しかろうと思ったのでやってません。
その他の触った言語はPython, Java, VBA, C#, Javascriptなど。
機械学習系だと強化学習に興味があります。Pythonと時代遅れのKerasで勉強しました。

最近Arduinoの学習を始めました。実機はELEGOOのArduino UNO R3です。
UdemyのArduino For Beginners - 2023 Complete Courseを視聴しつつ、Qiitaでメモ程度にアウトプットする予定です。
英語は得意ではなく、Google翻訳と自作のUdemy字幕ソフトを用いて学習を進める予定です。
上述のコースのIntroを見た感じTinkerCADで進めていくかもしれません。

当面(2023/10/29)の目標は冬期の足元温度と天井温度を計測することです。

職探しも兼ねているので、良い求人があればお声がけください。
興味分野は電動化とIoTです。興味は主に2つ合あります。
・学歴と趣味的に、電動化について、PMSMの効率化に携われたら良いなぁと思っています。
・職歴的にスマートファクトリーのIoTに携われたら楽しそうだなぁと思っています。

生涯学習どんとこい。よろしくお願いします。
Static Method / Instance Method として呼び出されたときの挙動を変える

# どうすれば良いか

`self` に初期値を設定してあげると、インスタンス関数をクラスから呼び出したときもエラーが出なくなる。

```.py
from typing import Self


class A():
    def A(self: Self | None = None):
        if self is None:
            print("I am static method A")
        else:
            print("I am instance method A")


A.A()
# >>> I am static method A

A().A()
# >>> I am instance method A
```

便利だと思うか、分かりにくいと思うかはあなた次第。
SQSに複数Lambdaトリガーが設定して、メッセージが入ってきた場合これってどうなる?

# 概要
AWSにはメッセージキューサービスとしてSimple Queue Service(SQS)が存在します
またSQSで管理しているキューに対してメッセージが入ってきたとき、処理させるLambdaを設定できます

ふと気になってい見てみると1つのキューに対して複数のLambdaが紐付けると知りました。
とはいえ実際にメッセージを処理させるのは1種類のLambdaである方が都合が良いと思いますが複数のメッセージが入ってきたときにどのような挙動になるか見ていきましょう



## テスト用の処理
1. ログ出力するLambdaを作成
2. SQS作成
3. SQSのトリガーに作成したLambdaを紐つける

Lambdaの関数名、同時に処理するSQSのメッセージ数、処理しているメッセージの中身をそれぞれ出力させます

```js:handler.js
exports.handler = async (event, context) => {
  console.log(context.functionName)
  console.log(event.Records.length)
  event.Records.forEach((record) => {
    console.log(record.body)
  })
}
```

SQSも合わせて作成し、CloudShellからメッセージを送信して見ましょう

```sh
$ aws sqs send-message-batch --queue-url https://sqs.ap-northeast-1.amazonaws.com/[AWSアカウントID]/[SQSのQueue名] --entries \
'{"Id":"1","MessageBody":"Message 1 content"}' \
'{"Id":"2","MessageBody":"Message 2 content"}' \
'{"Id":"3","MessageBody":"Message 3 content"}' \
'{"Id":"4","MessageBody":"Message 4 content"}' \
'{"Id":"5","MessageBody":"Message 5 content"}' \
'{"Id":"6","MessageBody":"Message 6 content"}' \
'{"Id":"7","MessageBody":"Message 7 content"}' \
'{"Id":"8","MessageBody":"Message 8 content"}' \
'{"Id":"9","MessageBody":"Message 9 content"}' \
'{"Id":"10","MessageBody":"Message 10 content"}'
```


## 実際のログ出力
今回はLambdaの名前は`my-serverless-app-dev-processMessage1|2`と作成しました
1つ目の画像が`processMessage1`のログ、2つ目の画像が`processMessage2`のログとなっています

![スクリーンショット 2023-10-29 23.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199819/a9ea3520-339d-3980-7d0d-1a214c008ca6.png)

![スクリーンショット 2023-10-29 23.42.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199819/493fdcfb-884a-8624-67a7-4562f6489654.png)

このことからSQSに複数のLambdaトリガーを設定すると
「**どれか1つのLambdaで処理がされた場合、他のLambdaが実行されない**」ということが確認できました。
そもそもとして複数のLambdaで処理させる必要があるケースならSQSではなくSNSを使えばうまくいきそうな感じがします :eyes:

またメッセージ処理を早める目的であればLambdaがメッセージの同時に処理できる数を上げるほうが適切ですね

## まとめ
- SQSでは複数のLambdaトリガーを設定できる
- 複数のLambdaを設定した場合、メッセージ単位でどのLambdaに処理させるか決めることはできない


また、複数のLambdaトリガーを設定する事による活用法など知っていればぜひ教えてください :pray:

## 参照
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs.html
https://dev.classmethod.jp/articles/compare_sns_with_sqs/
【Next.js】ロード画面を表示する方法

## ページを作成する

`page.tsx`を以下のように作成します。

```tsx:page.tsx
async function getData() {
  const res = await fetch('https://api.example.com/...')

  return res.json()
}
 
export default async function Page() {
  const data = await getData()
  if (!data) {
    notFound()
  }
 
  return <main></main>
}
```

## ロード画面を作成する

`pages.tsx`と同じ階層に`loading.tsx`を作成します。

```tsx:loading.tsx
export default function Loading() {
  return <p>Loading...</p>
}
```

上記のように記述すると`page.tsx`の`getData()`の処理が完了するまで`page.tsx`の代わりに`loading.tsx`が表示されるようになります。

特定のコンポーネントのみローディング状態を表示させたい場合には以下のように`<Suspense></Suspense>`で括ります。

```tsx:page.tsx
import { Suspense } from 'react'
import { PostFeed, Weather } from './Components'
 
export default function Page() {
  return (
    <section>
      <Suspense fallback={<p>Loading feed...</p>}>
        <PostFeed />
      </Suspense>
      <Suspense fallback={<p>Loading weather...</p>}>
        <Weather />
      </Suspense>
    </section>
  )
}

```
modの逆数

<!--
2023/11/3
-->
[picoCTF][Cryptography][basic-mod2]


# Writeup
* またしても解法が書いてあるので、翻訳ソフトで翻訳。
DeepLって分かりやすい日本語に変換してくれます。
![screenshot 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/a4b385c7-ecfb-ecbf-e19f-6f505a472a8f.png)
![screenshot 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/3ff69877-2dec-e0bb-05bc-a7dd92632214.png)
<br>

* またしてもプログラムをBingChatに作ってもらった。
ただBingChatのプログラムは、そのままだと回答にならなかった。
~~~:python
# 数値と文字セットを定義
numbers = [432, 331, 192, 108, 180, 50, 231, 188, 105, 51, 364, 168, 344, 195, 297, 342, 292, 198, 448, 62, 236, 342, 63]
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'

# モジュラ逆数を計算する関数
def mod_inverse(a, m):
    for x in range(1, m):
        if ((a % m) * (x % m)) % m == 1:
            return x
    return -1

# 各数値のモジュロと逆元を計算
mod_numbers = [num % 41 for num in numbers]
inv_numbers = [mod_inverse(num, 41) for num in mod_numbers]

# 文字にマッピング
message = ''.join([charset[num-1] for num in inv_numbers])

print('picoCTF{'+message+'}')
~~~
* 修正部分を探す力が必要でした。
![screenshot 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/78d6d215-d4cc-39d7-a32a-d81c5d6b4f14.png)
<br>

* 以上です。
package.jsonでフォルダ作成やファイルコピーなど普通にはできないみたいだったので解決してみた

## 起きたこと
ビルドツールをシェルとかで使おうと思ったがいろいろあってcliコマンドだけで全て出来るようにしようと思ってpackage.jsonのscriptsの中にフォルダ作成やファイルコピーコマンド入れてみたら、「コマンドの構文が誤っています。」と出てきた。はい？？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/b2b147e1-b66c-3745-7f3a-85ef1e8991e9.png)

調べてみたら、package.jsonのscriptsセクションにコマンドを追加する際には、Windows、Mac、Linuxなどの異なるオペレーティングシステムで正しく動作するように注意する必要があるみたい。

まあたしかにlinuxコマンドをwindowsで使えないからな。package.jsonにはたしかにOSに依存するようなことを書くことは無かったなと

# 解決方法

なのでググってみたら、
package.jsonでフォルダ作成やファイルコピーなど出来るようにするモジュールがあることを見つけた

## まずはフォルダ作成できるようにする
※元ネタ
https://stackoverflow.com/questions/38746535/creating-a-sub-folder-in-package-json
- インストール
```
npm install --save-dev mkdirp
```

- 使い方。mkdirpコマンドが使えるようになる
```
mkdirp ./build/images
```

## ファイルのコピー
※元ネタ
https://maku77.github.io/nodejs/npm/npm-run-copy-file.html

- インストール
```
npm install --save-dev cpx
```

- 使い方
staticフォルダにあるファイルを全てbuildフォルダに持ってくる
```
cpx -C static/** build
```

これで、上記やったあとにビルドツールのコマンドやってやりたいことができた。

## 注意点
ローカルだと問題なく動作するのにAWS環境にデプロイしたらこのコマンドで無効的なエラーが出ることがある。その場合はNodeかシェルで対応
オブジェクト指向はソフトウェア開発を楽にするための技術


https://bookplus.nikkei.com/atcl/catalog/21/S00180/

書籍「オブジェクト指向でなぜつくるのか 第３版」の第一章を読んで参考になったポイントをまとめています。

---

## オブジェクト指向はソフトウェア開発の総合技術

オブジェクト指向としてひとくくりにされる技術

* JavaやPythonのようなプログラミング言語
* 要求仕様や設計内容の図式表現
* 再利用可能なソフトウェア部品群
* 優れた設計のノウハウ集
* 業務分析や要件定義の効果的な進め方
* システム開発を柔軟に進めるための開発手法

これらの技術は、個別に見るとそれぞれ随分に違うもので、あえて共通点を探すと、ソフトウェア開発に関する技術であるということ。

:::note
このためオブジェクト指向を一言で表現すると、「**難しいソフトウェア開発を楽に行うための総合技術**」と言える。
:::

#### オブジェクト指向が普及する前　「機能中心」

* 「機能中心」の開発手法
* 対象となるシステム全体の機能を、段階的に詳細化して、より小さな部分に分解
* 仕様変更や機能追加の際に修正範囲が広範囲になりやすく、再利用が難しいという課題があった

#### 「モノ中心」でソフトウェアを組み上げる開発手法
オブジェクト指向は英語の*object oriented*の略語。直訳すると「モノ指向」「モノ中心」。

オブジェクト指向プログラミングを利用することで、それまで不可能だった**大規模なソフトウェアの再利用部品群を作ること**が可能になった。

* 再利用部品群のことを**クラスライブラリ**や**フレームワーク**と呼ぶ
* お決まりの設計のアイデアを**デザインパターン**
* ソフトウェア構造を図式表現する方法をUML
* オブジェクト指向プログラミングの考え方を上流工程にも応用した**モデリング**や、システム開発全体を柔軟に進めるための**アジャイル開発手法**も考案された
Tailscale CLI をjailbroken iOSで動かす

## はじめに
TailscaleはWireguardベースのVPNソフトウェアで、Windows, MacOS, LinuxやAndroidに公式で対応しています。もちろんiOSにも対応していますが、最低要求バージョンは15.0となっています。当方の環境はiPhoneX iOS14.3ですので、アプリは利用できません。よってソースからビルドしようというわけです。下記の手順は自己責任でお願いします。

## iOS向けにBuildは可能か
TailscaleはGo languageで書かれています。  
<a href="https://github.com/tailscale/tailscale">README</a>に従って
~~~
GOOS=darwin GOARCH=arm64 ./build_dist.sh tailscale.com/cmd/tailscale  
GOOS=darwin GOARCH=arm64 ./build_dist.sh tailscale.com/cmd/tailscaled
~~~
ここでのポイントはMシリーズのMac向けにビルドすることです。  
まず、前提としてiOSとOSXはともにdarwinカーネル上で動作します。Apple Mシリーズはarm64アーキテクチャであり、これはiPhone5s以降のシリーズと共通しています。よって理論上はMシリーズMac向けにコンパイルされたバイナリはiOSで利用可能です。

## Binaryの実行
buildしたバイナリを実機に移して実行してみます。
~~~
./tailscale
dyld: Library not loaded: /usr/lib/libSystem.B.dylib
  Referenced from: /private/var/mobile/tailscale_tools/./tailscale
  Reason: mach-o, but not built for platform macOS
Abort trap: 6
~~~
はい、エラーです。  
重要なのは4行目、iOS向けにビルドされていないことを示しています。  ということで、Mach-oバイナリのヘッダにあるロードコマンドを見ていきましょう。
~~~
otool -l tailscale
*略*
Load command 6
      cmd LC_BUILD_VERSION
  cmdsize 24
 platform 1
    minos 11.0
      sdk 11.0
   ntools 0
*略*
~~~
dyldはplatformの値を読み取り、適したバイナリかどうか判断しています。platformに対応する数字は、SDKのmach-o/loader.hに定義されています。iOSに対応するのは"2"ですから、バイナリを直接編集して変更します。
## 書き換え&実行
platformの値を01から02へ変更して保存、そしてresignして実行してみます。(\*1)
~~~
ldid -S tailscale
./tailscale
dyld: Library not loaded: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
  Referenced from: /private/var/mobile/tailscale_tools/./tailscale
  Reason: image not found
Abort trap: 6
~~~
一筋縄ではいきません。iOSではCoreFoundationのpathは`/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation`ではなく、`/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation`となっていますので、変更します。(実体はdyld_shared_cache)  
また、Security.frameworkに対しても同様の処理をしておきます。
~~~
llvm-install-name-tool -change /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation tailscale
llvm-install-name-tool -change /System/Library/Frameworks/Security.frameork/Versions/A/Security /System/Library/Frameworks/Security.frameork/Security tailscale
~~~
これでOKです。resignして実行します。
~~~
ldid -S tailscale
./tailscale version
1.51.0
  track: unstable (dev); frequent updates and bugs are likely
  tailscale commit: ef596aed9b9b7b27e6a1d8e15a5a5ce9abf413b5-dirty
  go version: go1.21.3
~~~
見事実行できました。この一連の処理をtailscaledにも適用すれば、目標達成です。  
あとはtailscaledを実行後、公式の手順通りに`tailscale up`を実行してsigninすればアクセス可能になります。
## まとめ
ポイントはロードコマンド内のplatformを1から2へ変更でした。また、今回はバイナリを直接編集しましたが、xcode付属のvtoolでも変更できるようです。
## 最後に
ご質問や訂正すべきポイント等あれば是非お知らせください。ここまで読んでいただき大変ありがとうございました。<br>

### 補足
\*1) unc0ver環境ではこれでresign出来ますが、他の環境(checkra1nなど)では`ldid -S/usr/share/entitlements/ld64.xml tailscale`のようにentitlementの指定が必要となる可能性があります。
DiscordにPythonやShellやGASから投稿する方法

# 概要
- サーバー内Webhookを使ってサーバー内限定のbotを作る方法と、Discordの開発者向けポータルのアプリ作成画面で独立したbotを作る方法の2種類がある
    - Webhookを使ったbot
        - DiscordのWebhook URLを使って外部からDiscord APIにリクエストを送って操作する方法。
        - 簡易だが、特定のサーバーと紐づいて作成されるbotであり、DMを送ることはできないなど、自由度が低い
    - アプリとして作成するbot
        - botトークンと呼ばれるbotを動かすためのトークンを発行すればAPIを使える
        - 任意のチャネル(付録参照)について、そのチャネルIDを使ってチャネルにメッセージを送信できる

# 具体的な方法は以下の記事を参照すればよい
## 記事1
discordというPython用のdiscordライブラリを使ったbotとWebhookの解説

https://zenn.dev/karaage0703/articles/926f18ba04e093

## 記事2
py-cordというPython用のdiscordライブラリを使ったDiscord bot作成

https://qiita.com/ukwhatn/items/c3abfbbd447f5802afa3

## 記事3
curlを使ってDMチャネルを開設する方法

https://scrapbox.io/discordjs-japan/POST%E3%81%A7%E3%83%9C%E3%83%83%E3%83%88%E3%81%8B%E3%82%89DM%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B
## 記事4
任意のチャネルにメッセージを送る方法

https://scrapbox.io/discordjs-japan/POST%E3%81%A7Discord%E3%83%9C%E3%83%83%E3%83%88%E3%81%8B%E3%82%89%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B

## 記事5
Pythonでdiscord botを作るコンパクトな案内。
Pythonそのものの基礎から応用まで説明した素晴らしい入門サイトへのリンクもある。

https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f

## 記事6

https://discordbotportaljp.github.io/DiscordBotPortalJP/docs/discordpy/developer-roadmap.html

## 記事7
Discord WebhookとGASを使ったbot作り

https://comcent.co.jp/blog/archives/1985/

## 記事8
これもDiscord WebhookとGAS

https://zenn.dev/tamfoi/articles/18c4a815cc3449

## 記事9

https://qiita.com/sizumita/items/9d44ae7d1ce007391699

# 付録
### チャネル
Discordにおけるすべてのやり取りは「チャネル」という概念で管理され、これは「部屋」のことである。やり取りが行われるたびにチャネルが生み出される。サーバーで作成したチャネルだけでなく、誰かにDMをすると「DMチャネル」が作成されるし、グループDMを開始すると「グループDMチャネル」が作成される。開発者モード(ユーザー設定から変更可能)になった状態で、任意のチャンネルのアイコンで右クリックすると「チャンネルのIDをコピー」する項目が現れ、ここから「チャンネルID」を取得できる。これとAPIを使うと、コマンドラインから投稿できる。

## GASとPythonを接続する方法

https://www.odndo.com/posts/1628829322483/

https://monoblog.jp/archives/5861

## GASとPythonの使い分けについて

https://www.acrovision.jp/service/gas/?p=330

https://life-table.com/python-gas-study/
Ruby初心者　初投稿

# Ruby初心者ブラックジャック作成

2023年7月からプログラミング勉強し、今回Rubyでブラックジャックを作成しました。
多少覚悟はしましたが、かなり苦労しました。
正直大変で家族の支えがないと期間内提出は困難でした。

　反省点
 -
- 勉強時間が少ない
- 勉強中のルールを決めてなかった
- 自分だけで考え込みすぎている
- タスクに追い込まれすぎて、チーム会全然開催できなかった
- 基礎が全く身についていない

　改善点
 -
- 朝の時間の有効活用！朝から戦いは始まっている！
- 1時間おきに5分のリフレッシュタイムを設けて、集中力を持続させる
- チームの人達に質問してみる！
- チーム会自分から提案してみる！
- 次SQLでも引き続きチェリー本の理解を深める！
GBDTの推論を高速化する

KaggleでGBDTを使う際のTips。

## 高速化の方法
### 1. データを`pd.DataFrame`ではなく`np.ndarray`で渡す

これだけでも早くなる。

```python
X = ...  # pandas DataFrame
pred = model.predict(X)  # そのまま渡す
pred = model.predict(X.values)  # np.ndarrayにして渡す、こっちの方が早い
```

### 2. Treelite

[Treelite — Treelite 4.0.0-dev documentation](https://treelite.readthedocs.io/en/latest/index.html#)

Treeliteは、C++アプリケーション上でツリーベースモデルを共通のフォーマットで利用するためのツール。モデルをTreelite形式に変換することで、推論が早くなる効果も得られる。

```python
import treelite
import treelite_runtime

bst = lightgbm.train(params, dtrain, 10, valid_sets=[dtrain], valid_names=['train'])
model = treelite.Model.from_lightgbm(bst)

X = ... # numpy array
pred = treelite.gtil.predict(model, data=X)
```

LightGBM以外にもXGBoostやsklearnもサポートされている（ドキュメント見る限りではCatBoostはなさそう）。

## 検証
適当なテストデータに対してLightGBMで1000回ずつ推論を行った際の推論時間の比較（ガイド線は平均値）。Treelite、`np.ndarray`で渡す、`pd.DataFrame`で渡す、の順で早くなっている。

![inference_time.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988692/c34ee22f-31aa-8070-268d-bc5134f7f60f.png)


## 参考
- [Treelite — Treelite 4.0.0-dev documentation](https://treelite.readthedocs.io/en/latest/index.html#)

- [Predict Student Performance from Game Play](https://www.kaggle.com/competitions/predict-student-performance-from-game-play/discussion/420217)

- [[JaneStreet] Faster Inference by XGB with Treelite](https://www.kaggle.com/code/code1110/janestreet-faster-inference-by-xgb-with-treelite)