OmniAICreator/Qiita-1.07M huggingface dataset:
Java for, 拡張for文, 二重ループ, while etc...

## for文
```java
for (int i = 0; i < 11; i++)
```
* 条件式がtrueを返す限り、繰り返し処理をし続ける
条件式：繰り返しの上限を決めている
↑ i < 11

* 初期化式で、for文の中で使う変数を宣言し、その変数を初期化する
初期化式：最初の値を決めている
↑ int i = 0

* 遷移式で、次の繰り返しに入る前に行う後処理をする
遷移式：後処理をする
↑ i++
```
for (初期化式　; 条件式　; 遷移式){
　繰り返し実行したい処理
}
```
初期化式、条件式、遷移式の間は；で区切る

## 初期化式、条件式、遷移式の省略
* 初期化式の省略
```java
public static void main (String [] args){
  int i=0;
  for (; i <11; i = i + 2){
    System.out.println(i);
  }
}
```
初期化式を省略すると、for文内で使う変数iが宣言されていない
→for文の外で変数を宣言している

省略しても；は必要

* 全式の省略
```java
public static void main (String [] args){
  int i=0;
  for (; ;){
    System.out.println(i);
  }
}
```
これは無限ループになる

## ２重ループ
```java
public static void main(String[] args){
  for (int j = 0; j < 3; j++){
    for (int i = 0; i < 3; i++){
      System.out.print("*");
    }
    System.out.println();
  }
}
```
表示↓
```
***
***
***
```
##### 動き方

* jの値が０の時
  * 表示（iの値０）
  * 表示（iの値１）
  * 表示して内側のループを抜けて改行（iの値２）

* jの値が１の時
  * 表示（iの値０）
  * 表示（iの値１）
  * 表示して内側のループを抜けて改行（iの値２）

* jの値が２の時
  * 表示（iの値０）
  * 表示（iの値１）
  * 表示して内側のループを抜けて改行（iの値２）

:star: ↓を表示させるには？

```
*
**
***
```

答え

```java
public static void main(String[] args){
  for (int j = 0; j < 3; j++){
    for (int i = 0; i < j + 1; i++){
      System.out.print("*");
    }
    System.out.println();
  }
}
```
条件式を変更する

## while文
* 条件式がtrueを返す限り、繰り返しを行う
→繰り返しの回数が決まっていないときに使うと便利
```
while (条件式) {
　繰り返し処理
}
```
##### 条件式
・true/falseそのものを記述する
・真偽値を戻す式でないといけない
##### while or for
- while
```java
int i = 0;
while(i < 2){
  System.out.println("i = ' + i);
}
```
- for
```java
for (int i = 0; i < 2; i++){
  System.out.println("i = " + i);
}
```

###### →繰り返す回数があらかじめ決まっているならforを使うといい


## do-while
```
do {
　繰り返し処理
}while(条件式);
```
* 繰り返しの回数が決まってない時に使うと便利
* 条件式が最後にある

→必ず1回はdoブロック内の処理が行われる
  1回はdoブロック内の処理が行われるの意味
```java
do {
  SYstem.out.println("Hi");
} while (false);
```
↑の場合は、１回 Hiって出てくる
```java
while(false){
  System.out.println("Hi");
}
```
↑の場合は、何も出てこない


## break
* break
→繰り返し処理を中断し、処理がループから抜け出すようにする

二重ループの内側にbreakがあった場合
そのbreakが属する繰り返し処理を抜けるという意味

## continue

* continue
→繰り返し処理の最中に、処理をスキップさせる

for：遷移式
while：条件式
に戻って処理を続けるかどうか判断
Java 配列

## 配列
配列：要素と呼ばれる値の集合
→同じ型の集合だけを扱うことができる

配列型変数：複数の値を一度に扱える
要素の値には添え字を使ってアクセス

☆復習
- 変数：変数一つにつき一つの値を扱う
- 配列：一度に複数の値を扱える
- 配列を扱うときは
１、配列を扱うための変数を宣言
→このときにデータ型は配列型
```
型名[] 変数名;
```
[]が配列の宣言をしている

プリミティブ型配列ではint, long, doubleなどの型名を指定する
配列型変数では[]を使う
配列の特徴
・同じ型の集合だけを扱える
・扱える数は後から変更できない
・値には添字を使ってアクセス

EX)int型だけを扱う配列の場合
```
int[] array;
```
のように使う
```
int[] array;
int array[];
```
これは同じ意味↑

EX)コンパイルエラーの例
```
int[] array = 10;
```
↑これはエラー
理由：[]の前にある記述はどの型の集合だけを扱うかを宣言している
　　　→扱える集合に対する制約
　　　配列型とint型に互換性はない
```
制約[]　変数名;
```

## 配列を作る

- 配列型変数：配列（値の集合）が入るための変数
　　　　　　→値の集合を扱えない
- 配列：集合そのものを扱う

配列の作成↓
```
new 型名[要素数];
```
・配列を作るときは、扱える上限数を指定する
```
new int[3];
```
・配列型変数の宣言と組み合わせると...
```
int[] array = new int[3];
```
配列型変数arrayの宣言　＝　int型の要素３つを扱う配列の作成

##### 配列の要素数は後から変更できない


## 配列の要素にアクセス
```
1    int [] array =  new int[3];
2    array[0] = 10;
3    array[1] = 20;
4    array[2] = 30;

5    for (int i = 0; i < 3; i++){
6     int val = array[i];
7     System.out.println(val);
    }
```

１、　　int型の要素３つを持つ配列作成
２−４、 添字番号０−２の要素に値を代入
５、　　添字番号が０−２の間繰り返す
６、　　取り出した値をint型の変数valに代入
７、　　valの値をコンソールに表示

## 配列の要素数を数える
```
配列型変数.length
```

## イニシャライザ
```
int[] array = {10, 20, 30}; 
```
→カンマ区切りで値を列挙すると、この要素を持った配列ができる
要素に値を代入してくれる
[Flutter] Speech to Textの使い方。

# はじめに
FlutterのSpeech to Textを使用する流れを、簡単にまとめておきます。

# やること
１．マイクボタンの作成
２．ios(Info.plist), Android(AndroidManifest.xml)に 音声認識とマイクを許可するようにコードを追加
3.iosの場合、マイクボタンを押した時のサウンドがないので追加（pubspec.yamlのassets以下に音声データのパスを追記）
４．各音声メソッドの初期化など

# 実装例
１．マイクボタンの作成
```dart:sample1.dart
floatingActionButton: FloatingActionButton(
    // マイクボタンを押した時、音声認識をスタートさせる
    onPressed: () async {
      if (await speechToText.hasPermission && speechToText.isNotListening) {
        await startListening();
      } else if (speechToText.isListening) {
        await stopListening();
      } else {
        initSpeechToText();
      }
    },
    child: Icon(Icons.mic),
  ),
```

２．ios(Info.plist), Android(AndroidManifest.xml)に 音声認識とマイクを許可するようにコードを追加。
```Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!-- 音声とマイクの許可のため、以下の４行を追加 -->
    <key>NSSpeechRecognitionUsageDescription</key>
    <string>For use sound input with ChatGPT</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>For use sount input with ChatGPT</string>
```

```AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.takuya.voistant.voistant">
    <!-- 音声とマイクの許可 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
    <!-- AndroidSDKを30以降にしている場合、以下のqueries句を追加する必要がある。 -->
    <queries>
    <intent>
        <action android:name="android.speech.RecognitionService" />
    </intent>
    </queries>
```

３．iosの場合、マイクボタンを押した時のサウンドがないので、追加してやる。（pubspec.yamlのassets以下に音声データのパスを追記）
※ 音声データは以下のリンクから

https://github.com/csdcorp/speech_to_text/tree/main/speech_to_text/example/assets/sounds
```pabspec.yaml
assets:
  - assets/sounds/
```

４．各音声メソッドの初期化など
```dart:sample2.dart
class _HomePageState extends State<HomePage> {
  // 音声入力の設定
  final speechToText = SpeechToText();
  String lastWords = "";

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    initSpeechToText();
  }

  Future<void> initSpeechToText() async {
    await speechToText.initialize();
    setState(() {});
  }

  /// Each time to start a speech recognition session
  Future<void> startListening() async {
    await speechToText.listen(onResult: onSpeechResult);
    setState(() {});
  }

  Future<void> stopListening() async {
    await speechToText.stop();
    setState(() {});
  }

  void onSpeechResult(SpeechRecognitionResult result) {
    setState(() {
      lastWords = result.recognizedWords;
    });
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    speechToText.stop();
  }
```

# 参考
https://pub.dev/packages/speech_to_text
Windows10×EPGStation(v2.5.0)

# 環境
Windows10
Node.js v14.18.3
EPGStation(v2.5.0)

# 躓いたところ
Mirakurunのアップデート同時にEPGStationを現時点最新バージョン(v2.6.20)にしたところサービスが起動できなかったのでダウングレード対応を行いました。
インストール時にCloneを行う際にバージョンを指定してインストールして無事にサービス起動できました。
```c
git clone https://github.com/l3tnun/EPGStation.git -b 2.5.0 --depth 1
```
# 参考にさせて頂いたサイト
https://github.com/l3tnun/EPGStation/tree/v2.5.0
https://till0196.com/post4156#toc4
https://qiita.com/Daigorian/items/4895233acc893955b45d
https://fumidzuki.com/knowledge/4533/
Windows10×Mirakurun-3.9.0-rc.3-

# 躓いたところ　
127.0.0.1:40772にアクセスできない

# 環境
Windows10  
node.js v14.13.8  
Mirakurun-3.9.0-rc.3-  

# 解決策
管理者で npm install glob@8.1.0 -g でパッケージをインストール  
C:\Users\aaa\AppData\Roaming\npm\node_modules に glob パッケージが配置されるglobフォルダそのままコピーして  
C:\Users\aaa\AppData\Roaming\npm\node_modules\mirakurun\node_modulesのglobフォルダに上書きしてサービス再起動  

# 参考にしたサイト　
https://mevius.5ch.net/test/read.cgi/avi/1666581918/l50
>272 Mirakurun の続きの日記
あきらめきれずに とりあえずWebUI の様子だけでも確認したいと思い VMWare 上で Ubuntu 突っ込んで導入を試みたが
まったく同じエラーで止まっちゃうのでどうも環境のせいではない
Mirakurun が依存している glob とやらのパッケージ更新がここ2か月で入っている
今最新は 9.2.1 だけど こいつを8.1.0 あたりにすればうまく動きそう
管理者で npm install glob@8.1.0 -g でパッケージをインストール
C:\Users\unko\AppData\Roaming\npm\node_modules に glob パッケージが配置される
多分お作法的には正しくないけど glob フォルダそのままコピーして
C:\Users\unko\AppData\Roaming\npm\node_modules\mirakurun\node_modules
のglobフォルダに上書きしてサービス再起動
でやっとhttpが上がってきた
こういうの誰に報告すればいいの
AWSのゲートウェイたち

# AWSのゲートウェイたち
AWSでは、多様な __ゲートウェイ__ が提供されていて、それぞれがどんな使い道なのか、初心者にはぱっと見て混乱しがちかと思いました。
そこで、私自身の備忘録でもあり、ここにざっくりと記載して誰かのお役に立てればいいなと思います。

## Direct Connect ゲートウェイ
Direct Connect は、AWSの専用線サービスです。
Direct Connect ゲートウェイは、Direct Connect でのコンポーネントの一つです。
Direct Connect ゲートウェイの使い方は、主に以下の３つがあります。
+ __リージョン間で__、専用線を利用したい場合
（A リージョンの`仮想プライベートゲートウェイ`と、B リージョンの`仮想プライベートゲートウェイ`との間の中継装置になる）

+ __他人のアカウントと__、専用線を利用したい場合
（他人のアカウントの`仮想プライベートゲートウェイ`と、自分のアカウントの`仮想プライベートゲートウェイ`との間の中継装置になる）

+ __Transit Gateway と__、連携して専用線を利用したい場合
（Transit Gateway と`トランジット仮想インターフェイス`との間の中継装置になる）

## 仮想プライベートゲートウェイ
近日記載予定

## Transit ゲートウェイ
近日記載予定

## カスタマーゲートウェイ
近日記載予定

## インターネットゲートウェイ
近日記載予定

## Egress-only インターネットゲートウェイ
近日記載予定

## NAT ゲートウェイ
近日記載予定

## キャリアゲートウェイ
近日記載予定

## おまけ
近日記載予定
【Slack】ワークスペースの名前や URL、アイコンを変更する全手順（アプリ版 & Web版）

## 概要
Slackのワークスペース `ワークスペース名.slack.com` の先頭部分を変更する方法をよく忘れるので、備忘録。
ついでに、ワークスペースとしての表示名やアイコンを変える方法も紹介。

**❶ Slack アプリ上から変更する方法**（こっちが簡単）
**❷ Web 版の管理ページから変更するする方法**

の２つがあるので、どちらも紹介する。

### 前提
Slack の管理者権限を持っているアカウントで操作すること

:::note warn
**注意点**
ワークスペースの URL を変更すると、そのURLは **"空き状態"** となり、**他の人が利用できる状態** になる。
空き状態の URL を他の人に取られてしまうと使えなくなるので、ワークスペースの引越し等で名前を付け替える際には、迅速に作業すること。
また、変更した場合は、念の為にワークスペース利用者に周知した方が良い。
:::

## 手順（Slack アプリから変更）
まずは、簡単な方から紹介。

Slack アプリのワークスペース名を選び、一番上のワークスペース名の部分を選択
![ワークスペース設定_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2b23f3f2-73d0-ccb0-7132-462cb6123825.png)

すると、**「ワークスペース名」「URL」** をどちらも変えられるので、ここで変更するだけで完了👍✨
尚、アイコンはここで **「ワークスペースアイコンを編集する」** を選択すると Web 版の管理ページに移動し、そこで変えられます。
![ワークスペース設定_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/8cc7bbb6-4040-8ce1-2fe8-a831ef3cc6b4.png)

保存が完了すると、URL やアイコン等の変更は自動で反映される。

## 手順（Web 版の管理ページから変更）
アプリ上ではなく、Web の管理ページから変更する方法も、一応紹介しておく。

### Slack のワークスペースにログインする
Web 版の管理ページにアクセスする方法は２つある。

- 方法❶ サインインページからサインインする
    - `https://slack.com/intl/ja-jp/workspace-signin`
- 方法❷ アプリの Slack から Web の管理ベージを開く
    - ワークスペース名を選び、メニューから **「ワークスペースの設定」** を選択

![ワークスペース設定_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/41e7e3ce-68ca-9d85-c2df-9ed9c5ee8d9e.png)

### 設定変更する

管理ページで、左のメニュー欄から **「設定と権限」** を選択すると、以下のページになる
![ワークスペース設定_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/e97228df-bfa3-5751-87ff-94d1a2af33b8.png)

下の方にスクロールすると以下の表示になる。
「ワークスペースのアイコン」の **「アイコンをアップデートする」** のボタンを押せば、アイコン画像をアップロードして変更できる画面になる。
![ワークスペース設定_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/10c9beb9-4522-9750-353a-9df11ff9b65c.png)

上記で、**「ワークスペース名や URL を変更する」** のボタンを押せば、以下のようにワークスペース名と URL を変更できる画面になる。
![ワークスペース設定_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2f5c7c27-db93-d401-c122-221174026ad4.png)

保存が完了すると、URL やアイコン等の変更は自動で反映される。
【備忘録】車体に設けたSWの操作により車体を制御する方法

車体に設けたSWの操作により車体を制御する方法についてまとめます。
Autopilot（Cubepilot）がSW操作を受け付ける事により非常停止等の機能を付加することが可能です。

:::note
補足
設定により最大4個のスイッチ入力に対応することが可能です
:::

## 対応
1. 機能を有効にする
2. 機能を設定する
3. 入力PINの仕様を設定する
4. 出力端子を設定する
5. 出力端子の仕様を設定する

## 1．BTN PIN を有効にする
|パラメータ|設定値|備考|
|-|-|-|
|BTN_ENABLE|1|1に設定することでBTN PIN 機能が有効となる<br>（設定後Autopilot再起動）|

## 2．機能を設定する
|パラメータ|設定値|
|-|-|
|BTN_FUNC1|[参照](https://ardupilot.org/rover/docs/parameters.html#btn-func1-button-pin-1-rc-channel-function)|
|BTN_FUNC2|[参照](https://ardupilot.org/rover/docs/parameters.html#btn-func2-button-pin-2-rc-channel-function)|
|BTN_FUNC3|[参照](https://ardupilot.org/rover/docs/parameters.html#btn-func3-button-pin-3-rc-channel-function)|
|BTN_FUNC4|[参照](https://ardupilot.org/rover/docs/parameters.html#btn-func4-button-pin-4-rc-channel-function)|

:::note
例：SWが押された時に車体を止める場合は以下の様に設定を行う
・BTN_FUNCxx = 154(hold)
・BTN_FUNCxx = 81(Disarm)
:::

## 3．入力PINの仕様を設定する
|パラメータ|設定値|
|-|-|
|BTN_OPTIONS1|PWM Input:0/Invert Input:1|
|BTN_OPTIONS2|PWM Input:0/Invert Input:1|
|BTN_OPTIONS3|PWM Input:0/Invert Input:1|
|BTN_OPTIONS4|PWM Input:0/Invert Input:1|

:::note
備考
MissionPlannerではチェックボックスが表示されるのでどちらかを選択する
:::

## 4．出力端子を設定する
|パラメータ|設定値|備考|
|-|-|-|
|BTN_PIN1|以下参照|AUX1～6のどれかを選択する|
|BTN_PIN2|以下参照|AUX1～6のどれかを選択する|
|BTN_PIN3|以下参照|AUX1～6のどれかを選択する|
|BTN_PIN4|以下参照|AUX1～6のどれかを選択する|

端子割り当て
|端子|設定値|
|-|-|
|Disable|-1|
|AUXOUT1|50|
|AUXOUT2|51|
|AUXOUT3|52|
|AUXOUT4|53|
|AUXOUT5|54|
|AUXOUT6|55|

## 5．出力端子の仕様を設定する
|パラメータ|設定値|備考|
|-|-|-|
|SERVOxx_FUNCTION|-1|-1に設定することでGPIOが有効となる|

:::note
SERVOxx_FUNCTIONのxxの部分を出力したい端子に割り当てます
:::

## 参考
https://ardupilot.org/rover/docs/common-buttons.html
https://ardupilot.org/rover/docs/parameters.html#btn-parameters
https://qiita.com/srs/items/aeb85ebb6528e89a14ef
いい生活で数ヶ月長期インターンさせていただいたので振り返ってみた

## 概要
　2022年11月〜3月まで約5ヶ月間にわたって [いい生活](https://www.e-seikatsu.info/careers/) で長期インターンをさせていただきました。本記事はインターン参加の経緯や具体的にどのようなことをしたのか、そして最後に感想について書いていきたいと思います。

## インターン参加の経緯
　いい生活のサマーインターンに参加させていただいたことがきっかけです。そのインターンで長期インターンをする学生を募集しているとお聞きし、ちょうど他社のインターンが終わったところでインターンを探していたため、参加しようと思いました。

## インターンの業務内容
　[いい物件One](https://www.es-service.net/service/rent/)  といういい生活でも長く使われているアプリケーションの保守・開発を経験させていただきました。具体的な募集要項は[こちら](https://e-seikatsu.snar.jp/jobboard/detail.aspx?id=573Bar2cR0I)をご覧ください。

## 使用技術
- C#, xaml
- GitLab
- Jenkins
- Slack

## 苦戦したこと
### C#
　募集要項では、「C#の開発経験が必要である」とあります。しかし、私はC#はおろかフロントエンドの言語の経験がほとんど皆無でした。ですので、最初はコードの意味を探るのに苦戦しました。
　また、大規模なサービスのコードを読み解くことに関しても難しかったです。具体的には、アプリのこの部分がコードのどの部分に対応しているのかということを理解するのに時間がかかりました。

### Git操作
　本格的なチーム開発経験があまりなかったので、Git操作には苦労しました。特に以下のような操作。
- `git rebase [ベースとしたいブランチ名] (反映したいブランチ名)` 
- `git checkout [コミット番号] [コミットを戻したいファイル・フォルダ]`
- `git rebase -i HEAD^(戻したいコミットまでの数)`

　という感じで、ブランチ内容を修正・更新するような動作に関しては最初は何度も間違えました。

### 不動産用語の意味
　いい生活は不動産ITの企業なので、アプリ内に出てくる不動産用語に関しては最初の方は暗号に見えました笑。だんだん意味を覚えてきたのですが、数ヶ月経った今でもわからない領域は多いです。

### Slack 上でのコミュニケーション
　開発チームでSlackを使ってコミュニケーションをとっていました。わからないところをメンターの方が親切にサポートしてくださったのですが、最初はそれを文字ベースで伝えることに苦労しました。

## 学んだこと
　3ヶ月以上のインターンは初めてだったため、本インターンでは多くのことを学べました。特にためになったことをピックアップして2つ挙げます。
- チーム開発の進め方
　Git操作や先輩の社員さんからのレビューとその対応については個人開発では経験できないことなので、いい経験になりました。

- わからないことの効果的な共有の仕方
　基本的にエンジニアはテキストベースのコミュニケーションをとることが多いので、技術的にわからない部分がある場合は、どのようにしたら自分の欲しい解答が他の仲間から得られるかを質問の段階から考える必要があるなと思いました。具体的には、〇〇がわからないだけではなく、〇〇に関しては〇〇〇〇だと調べた上で考えたのですが、実装がうまくいきませんという感じです。

## インターン全体の感想
　本インターンはC#という初学の言語を用いて開発するということで最初はすごく不安に感じていました。しかし、メンターの方をはじめとして優しく丁寧に教えていただいたので、どうにかやっていけました。今まで経験したことのない環境に飛び込むのはとても勇気のいることですが、自分が適切に努力してやっていくという意志を示せばどうにかやっていけるとわかりました。これからも精進していきたいと思います。
Java if, switch

## 構造化プログラミング
- 順次：上から下に向かって順番に書く
- 分岐：条件を指定して、プログラムの流れを分岐する
- 反復：条件を指定して、条件に合致する間プログラムを繰り返す

## if文
```
if (条件) {
　条件に一致したいときに実行したい処理
} else if (条件２){
　条件２に一致した時に実行したい処理
else {
　条件に一致しなかった時の処理
}
if < boolean型
```
→true falseで返ってくる


参考
```
Console console = System.console();
```
↑画面から文字列を入力して、それを受けとる
```
String str = console.readLine();
```
↑その文字列を実際に取り出す
```
int num = Integer.parseInt(str);
```
↑数字を数値に変換する（数値リテラルと比較演算をするため）
```
　String→intにする
int num = Integer.parseInt(console.readLine());
```
↑入力された文字列を受け取り、受け取った数字を数値に変換するまでのコードを1行で書く

## ショートサーキット演算子
ショートサーキット演算子：左辺の式の結果によって右辺を実行するか変えることができる
→論理演算子の｜や＆を２つ重ねて記述
EX)
```
public static void main(String[] args){
  int a = 1;
  int i = 4;
  if (a == 1 | i++ < 5){     ←①
     // do sth
 }
   System.out.println(i);    ←②
 }
```
①  左辺の比較演算の後に右辺を実行しiの値は５、その後条件全体の結果を返す
②５を表示
＜解説＞
変数aは１で初期化されているから、左辺のa == 1 がtrueを返す
→右辺の結果にかかわらずtrueを返す
```
public static void main(String[] args){
  int a = 1;
  int i = 4;
  if (a == 1 || i++ < 5){     ←①
     // do sth
 }
   System.out.println(i);     ←②
 }
```
① ||に変更することで右辺は実行されない
②４を表示

シンプルにすると↓
```
public static void main(String[] args){
  int a = 1;
  int i = 4;
  i++;                        ←①
  if (a == 1 || i < 5){       ←②
    
 }
   System.out.println(i);     ←③
 }
```
①論理演算の外にインクリメントを出しておく
②左辺がtrueを戻し、右辺の演算は省略
③５を表示


## if文{}省略できるらしい
条件に合致した時の処理がひとつしかない時は省略できる
→処理対象は条件式直後にあるステートメントだけ
EX){}省略した時
```
if (10 < a)
  System.out.println("大きい");    ←実行される
  System.out.println("sth");      ←実行されない
```

## switch文
- 値によって処理を振り分ける（ifの時は条件式）
- 値が合致するcaseがない場合のデフォルト処理にはdefaultを使う
- breakをつかってswitch文から脱出させる

```
switch (式) {

 case　値 :
　　値に合致した時の処理
 case　値 :
　　値に合致した時の処理
}
```
フォールスルー：breakを書かずに次々と順番にcase処理をすること


## ifとswitchの使い分け

### if
・式の結果がある程度の範囲を持っている
・式の結果が特定の値に絞り込めないような場合

### switch
・特定の値の時に何らかの処理をしたいとき
・式の結果の種類が少ないとき

実際のソフトウェア開発では
特定の値に絞り込めるよりも、ある程度の範囲を持った条件のほうが多い
→ifのほうがよく使う
ストレスが溜まらない麻雀ゲームの仕様を考える


## 前書き

麻雀というゲームは運の比重が大きい。
そのため実力を図るためには数百単位のゲームをしなければいけない。

しかし、それを理解していたとしても一回一回の負けは非常に辛いものだ。
一回でも辛いラスを連続で引いてしまったときは発狂ものである。

こんなストレスの貯まるゲーム、麻雀を仏の心で遊べるようにする仕様を考える。

## 提案

前提としてレーティングのような仕組みがあるとして話を進める。

負けたときにストレスが溜まる原因のひとつとして、
負けたことでレートが（目に見える値として）下がってしまうことが考えられる。

運が悪かったから負けた。
誰がやっても勝てなかった。
どうしようもない運のせいでレートが下がるのは納得がいかない。

このような思考が**負けるたび**に発生してしまうのは健全ではない。
ではどう対策するかというと、
1ゲームが終了した時点でレートを変化させず、
100ゲーム（※）での結果でレートを変化するようにすればよい。

※ 100ゲームと書いたが、レートが上がるほどそのゲーム数が増えるようにし
レートが下がるほどそのゲーム数が少なくなるようにしたほうがよいかもしれない。
（アカウント作りたてのときはさっさとレートを上げたく、
逆にレートが高くなればそれを長く維持していたいと思う人が多いと予想されるため。）

このように、ストレスとなる要因が発生する回数を減らすことにより
仏の心で麻雀が遊べるようになると考える。

## おまけ

https://qiita.com/mogamoga1337/items/c2c1469dba3939fe5c58
Windows10×Minecraft1.19.4×MinecraftDiscordChatSync1.2.2

# 参考にしたサイト  
[・Gakuto1112/MinecraftDiscordChatSync: マインクラフトとDiscordのチャット等を相互的に送受信できるDiscordのBotです。 ](https://github.com/Gakuto1112/MinecraftDiscordChatSync)  
[・PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル hoge.ps1 を読み込むことができません。となったときの対応方法](https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f )  

# 環境
Windows10  
Node.js v16.13.11  

# 躓いたところ  
ts-node MinecraftDiscordChatSync.tsを実行したところ下記のエラーが発生  
ts-node : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\nodejs\ts-node.ps1 を読み込  
むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照  
してください。  
発生場所 行:1 文字:1  
ts-node MinecraftDiscordChatSync.ts  
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException  
    + FullyQualifiedErrorId : UnauthorizedAccess  

# 解決方法  
_実行ポリシーを確認する_  
C:> Get-ExecutionPolicy  
Restricted   

_実行ポリシーの変更_  
(書き方)Set-ExecutionPolicy -ExecutionPolicy <実行ポリシー> -Scope <スコープ>  
C:> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process  
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック  
(https://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?  
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y  

_実行ポリシーを確認する_  
C:> Get-ExecutionPolicy  
RemoteSigned  

# 以下 setting.json  

```c
{
    "minecraftVersion": "1.19.3",
    "pathToLogFile": "../logs/latest.log",
    "logEncode": "utf-8",
    "timeOffset": 9,
    "embeds": {
        "advancements": true,
        "playerJoin": true,
        "playerLeave": true
    },
    "rconPort": 25575,
    "rconPassword": "任意",
    "token": "任意",
    "botSendChannels": [
        "任意"
    ],
    "botWatchChannels": [
        "任意"
    ],
    "discordMessageDisplay": {
        "ignoreBots": true,
        "displayRoleColor": true,
        "showChannelName": true,
        "useRichText": true,
        "showAttachments": true
    }
}
```
StyleCIを無料プランに変更する方法

## StyleCIとは
https://styleci.io/

## Webからのプラン変更
できません。問い合わせてくれ、とメッセージが表示されます。

## サポート対応
最悪です。無料プランに変更したいと連絡しても、メール＆チャットどちらも全く返事無し。

## それでも解約（無料プランへの変更）するには
決済にPaddleを使っているので、そちらに問い合わせます。
有料プランを利用していると「Your StyleCI subscription receipt」なる決済完了メールが届いているはず。
![スクリーンショット 2023-04-10 9.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121353/5f4a7f96-964f-796e-61e9-1cb32ffa79b4.png)
Paddleにアクセス、リンクに契約も紐づいているので、そのままPaddleのチャットボットに、
i want to cancel this plan.
と伝えればキャンセルしてくれます。

お疲れ様でした。二度と使いません！
【Ruby on Rails】LaravelをずっとやってきたエンジニアがRuby On Railsを独学で (1)

## what is this ?

言語間の違い（関数の作り方とか）は置いといて、開発環境づくりやルーティングで詰まったところをただ書いていく記事です。

## 今回は何を書いてる？

Dockerで詰まったこと書いてます。

## Docker環境で詰まる

いつもはこんな感じでDocker環境を作っていた。DockerとLaravelはきっちり分けて、かつdocker-composeで使う`Dockerfile`も各イメージごとに分ける感じで。ディレクトリ階層は深くなるけど、これが仕事でも趣味でもしっくりきてた。

```
foobar-app
    > docker
        > php-apache
            > Dockerfile
        > mariadb
            > Dockerfile
        > ... etc
        > docker-compose.yml
    > src
        > ここにcomposeから作ったLaravelのファイルがいっぱい
```

最初はこれと同じようにRubyOnRailsの環境を作ろうとした。なので`Gemfile`と`Gemfile.lock`を`src`の中にいれてビルドしたけど、`Dockerfile`の`ADD`や`COPY`は自身よりも上？の階層のファイルを参照できないため、やるとしたら自身と同じ階層か、同じ階層にいるディレクトリ内に入れるしかなかった。

けど、そこに入れちゃうと`Gemfile`が２つできてしまい、かつ同期しないといけないというすごくめんどくさいことになったので、渋々`src`の中に格納。そしてビルドしたら成功した。

LaravelからRubyOnRailsに変更したらDockerの環境というか作り方もけっこう変わるのね。そりゃまあそうか。

おわり。

## どうでもいいこと。

... ところで、なんでソースコードとか置くディレクトリが`src`なんだろ。まったく気にしてなかったけど、今になって気になった。

## (2)は書くの？

~~気が向いたら。~~
Go言語に浮気しちゃったのでたぶん書きません。 (2023/07/04)
subdomain / virtual environment をffufで確認する

忘備録：CTF等でsubdomainを確認する方法。Kaliで動かしています。

まず、以下のコマンドを実行

```bash
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt  -H "Host: FUZZ.stocker.htb" -u http://stocker.htb 
```

すべてのコンテンツでワードサイズは6だったので、再度以下を実行。

```bash
ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt  -H "Host: FUZZ.stocker.htb" -u http://stocker.htb -fw 6  
```

ワードサイズによって、-fwの値を変えます。

詳細はこのあたりを参照してください。
https://medium.com/quiknapp/fuzz-faster-with-ffuf-c18c031fc480
The -fw flag is used to filter by the amount of words.

ハッピーハッキング
2023/05/09までにAppStoreの価格平準化システムへの対応をしよう！

皆さんこんにちは。withでiOSアプリの開発を行っている長尾（ @zrn-ns ）です。

先日、Appleから↓のニュースが配信されました。

https://developer.apple.com/jp/news/?id=dbrszv62

この記事で述べられているのは、下記のような内容になります。

- AppやApp内課金（買い切り商品）で使えるプライスポイントが約10倍に増えるよ
- （これまで米国基準となっていた価格帯の概念がなくなり、）任意の国/地域の通貨を基準として設定し、他の国の価格はそれにしたがって平準化された価格を提示できるようになるよ
- 各App内課金を、国や地域ごとに配信するか/しないかを設定できるようになったよ

今回のメイントピックは2つ目の**価格平準化システム**についてです。
価格平準化について、私たちデベロッパーが気にすべきことと、実際に行うべき対応について、ざっくりまとめます。

# AppStoreの価格平準化とは

**地域ごとの価格差が大きくなりすぎることがないよう、各種価格を自動的に価格を調整してくれるAppStore Connectの機能のこと**です。

これまでもAppStoreConnectでは価格の自動調整機能は提供されていました。これは米国ドル基準のTier（価格帯）に基づき、各商品の価格を `Tier1(0.99ドル)`　のように定めるものです。各Tierには各国の通貨ごとの金額が定められており、この金額は為替などの変化に応じてAppleにより調整が行われていました。

このTierには、「米国ドル」が基準なので、各国の通貨に変換したときに不自然な価格に見えることや、AppleによるTier価格の見直しのタイミングで、課金価格が変化してしまうなどの問題がありました。

これらの問題を解消するため価格平準化が導入されたものと思われます。**価格平準化においては、ベースの地域（通貨）を定めることができ、ベース地域以外の価格については自動で調整を行う事ができるようになります**。

日本をメインのターゲットにしているアプリであれば、日本をベース地域に設定することで、日本円価格が定期的に変化してしまうような自称を防ぐ事ができるということですね。

# 価格平準化対応をしないとどうなるのか

価格平準化の初回実行は2023/5/9となっており、これまでに開発者側は必要に応じて対応を行う必要があります。
では対応を行わない場合、なにが起こるのでしょうか。

結論としては、 **米国がベース地域となり、アプリ価格やアプリ内課金の日本価格が定期的に変動するようになります。**

個人の開発者の方であれば困らないかもしれませんが、大規模なアプリを運用している会社では、アプリやアプリ内課金の価格が定期的に変動してしまうのは困りますよね。

# 開発者が必要な対応

対応方法については、↓に公式のガイダンスがあります。

https://developer.apple.com/jp/help/app-store-connect/manage-app-pricing/set-a-price

基本的には、日本の開発者であれば、日本円をベース通貨に設定し、日本円価格をベースに他国価格が自動更新されるように設定するのが良いと思います。

その場合、基本的に設定は非常に単純で　**「アプリ本体価格のベース地域と価格を設定する」だけ**で済みます。

アプリ本体価格のベース地域を設定することで、、アプリ本体価格の全てのアプリ内課金のベース地域も更新されます。
アプリ本体価格を設定するときにアプリ本体価格の変更を行った場合、アプリ本体価格については即時反映されますが、各アプリ内課金については、5/9の初回の平準化まで更新は行われません。

具体的な手順については、上記ページの「App における基準国または基準地域の編集」セクションが詳しいので、そちらを御覧ください。

# その他

今回、価格平準化システムの対象となるのは、アプリの本体価格と、買い切りのアプリ内課金商品だけとなっております。
自動更新サブスクリプションは平準化の対象ではないので、その点はご注意（ご安心？）ください。

- アプリ本体: **対象**
- 買い切りの商品: **対象**
- 非更新サブスクリプション: **対象**
- 自動更新更新サブスクリプション: **対象でない**

# 参考情報

https://developer.apple.com/jp/news/?id=dbrszv62
https://developer.apple.com/jp/help/app-store-connect/manage-app-pricing/set-a-price
NoSQL Authentication BypassとXSSからのSSRF


認証のバイパスは、SQLInjectionだけではなく、NoSQLからも可能。
https://book.hacktricks.xyz/pentesting-web/nosql-injection

```bash
#in URL
username[$ne]=toto&password[$ne]=toto
username[$regex]=.*&password[$regex]=.*
username[$exists]=true&password[$exists]=true

#in JSON
{"username": {"$ne": null}, "password": {"$ne": null} }
{"username": {"$ne": "foo"}, "password": {"$ne": "bar"} }
{"username": {"$gt": undefined}, "password": {"$gt": undefined} }
```
このあたりは要注意。

ウェブサービスでPDFが生成される時は以下の脆弱性を確認すること。

MicroStrategy SSRF through PDF Generator (CVE-2020-24815)
https://www.triskelelabs.com/blog/extracting-your-aws-access-keys-through-a-pdf-file


BurpでXSSが可能かどうか確認し、SSRF攻撃を実施。/etc/passwd や /etc/hostsが取れる可能性あり。

```html
<script> document.write(document.location.href); </script>
```
や
```html
<iframe src=/etc/passwd></iframe>
<iframe src=/etc/passwd height=1000 width=1000></iframe>
``` 
を試そう。
老頭児のruby on rails 

# 仕事に必要になるまで触らない技術
ruby on rails については遠巻きに見ていたのだけれど、
もう仕事で使えないというのも何だから試してみた。
私は怠け者だという自覚しかない。

# ubuntu に入れる

簡単スピーディ、使い回しが効くレシピの大事さ。
手順を書くまでもないが手短に。

* sqlite3 あるか調べる。
* ruby あるか調べる（というか普通に入ってない）
* apt install ruby ruby-dev
__"ruby-dev" も要る。__
入れないとこうなる。
<pre>
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/3.0.0/gems/websocket-driver-0.7.5/ext/websocket-driver
/usr/bin/ruby3.0 -I /usr/lib/ruby/vendor_ruby -r ./siteconf20230410-29129-2wi14.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

</pre>

* rails コマンドが使えるか調べる。
```
$ rails --version
Rails 7.0.4.3
```
* おもむろに blog とか作る（これチュートリアルだ）

```
$ rails new blog
      create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru

... 略 ...
        run  bundle install
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will
break this application for all non-root users on this machine.
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies....

... 略　...
        run  bundle install
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will
break this application for all non-root users on this machine.
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies....
... （終わりまで略) ...
```
* ビルドインサーバの様子をみる
```
$ cd blog
$ ls
Gemfile       README.md  app  config     db   log     storage  tmp
Gemfile.lock  Rakefile   bin  config.ru  lib  public  test     vendor
$ ./bin/rails server
=> Booting Puma
=> Rails 7.0.4.3 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.6.5 (ruby 3.0.4-p208) ("Birdie's Version")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 35466

```
# 今日のところはここまで。
こんなもん __誰でも__ 出来るから書くまでもないんだが、怠け者ってのは記録すらしないんで
怠惰の習慣を少し拭き取っておく。
Ruby 3.1 + Rails 7 + MySQL 8 + Docker 環境構築

Ruby 3.1 + Rails 7 + MySQL 8 + Docker で環境構築する方法を紹介します

# 1. 5つのファイルを作成する
用意するファイル
- Dockerfile
- docker-compose.yml
- entrypoint.sh
- Gemfile
- Gemfile.lock


```Dockerfile:Dockerfile
FROM ruby:3.1
ARG RUBYGEMS_VERSION=3.3.20
RUN mkdir /rails_practice
WORKDIR /rails_practice
COPY Gemfile /rails_practice/Gemfile
COPY Gemfile.lock /rails_practice/Gemfile.lock
RUN bundle install
COPY . /rails_practice

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
```

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/rails_practice
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
volumes:
  mysql-data:
    driver: local
```

以前のバージョンの MySQL ではデフォルトで使用していた認証プラグインがmysql_native_password でしたが、 MySQL 8.0 以降は caching_sha2_password に変更となりました。
今回はmysql_native_passwordを使用しています。
(Railsはcaching_sha2_password未対応？)

```sh:entrypoint.sh
#!/bin/bash
set -e

rm -f /docker_rails/tmp/pids/server.pid

exec "$@"
```

```Gemfile:Gemfile
source 'https://rubygems.org'
gem 'rails', '~>7.0.4'
```
Gemfile.lockという空ファイルを作ります
```sh
touch Gemfile.lock
```

# 2. Rails アプリケーション新規作成

```bash
docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker
docker-compose build

```

# 3. データベース接続

```yaml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
  host: <%= ENV.fetch("MYSQL_HOST", "db") %>

development:
  <<: *default
  database: rails_practice_development
```
```sh
docker-compose run web rake db:create
```

# 4. 実行
```sh
docker-compose up
```
実行できたら成功です。
![スクリーンショット 2023-04-10 7.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254871/954d28b1-3440-250b-d003-315e0b87060e.png)


## PS. 失敗してリセットする魔法

作成したdockerコンテナをすべて削除する
```sh
docker-compose down --rmi all --volumes --remove-orphans
```
画面フローで独自の選択リストの値を構成する


私はハンドで値を追加できる方法を提案したけど、納得いかなかったようです。
ほかにどんなやり方があるかは知らん。

[Screen Flow on Address compound field](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JglwR)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ba606c42-e601-13d6-52da-03c5987e57d9.png)

addState : ここで値をテキストのコレクション変数に追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/782c4378-b9dc-3181-dc4e-16714af7fea2.png)

loop_text_collection : 上記コレクション変数でループします

add_record_value : 上記テキストの値をレコード変数にセットします。(ラベルと値に相当します）

add_record_collection : 上記レコード変数をレコードのコレクション変数に追加します。

スクリーンフローでは　コレクション選択セットを使います。これの元は先ほど作ったコレクション変数です。
TERASOLUNAの開発環境をVSCodeとDevContainerで整えたい件

## 動機
- Java 久しぶりにさわる
- すっかり VSCode派になってる
- Qiita や Zenn に記事見当たらないなぁ
## 結果
- [[VSCode 公式 Java 開発ドキュメント - code.visualstudio.com](https://code.visualstudio.com/docs/java/)] が整理されている
- DevContainer 組み合わせたらハマった
- 良い方法かは知らんけど動いたので、公開してみる
    - もっと良い方法がコメント貰えたら嬉しいな
- [[出来上がったもの - github.com](https://github.com/kfjt/terasoluna-vscode)]
## ゴール
- [[2.3. はじめてのSpring MVCアプリケーション — TERASOLUNA Server Framework for Java (5.x) Development Guideline 5.7.2.RELEASE documentation](http://terasolunaorg.github.わーくすぺすio/guideline/5.7.2.RELEASE/ja/Overview/FirstApplication.html)]
## 自分で課した制約
- Java 8 をつかう
- ゆくゆくは Spring 5 と iBatis 2 を検証したい
- いったん Terasoluna Server Framework 5 を動かす
- 近頃ローカルを汚さず DevContainer で頑張ってるので出来れば今回も
## やったこと
### Java の選択
- 非 Java 生活をしている間に Oracle の印象がうっすらわるくなっているので避ける
- DevContainer 公式でも Java イメージを出してる
- けどいざの時に世間に広く情報がある方が嬉しいので eclipse-temurin で進めてみる
- [Terasoluna は Gradle サポートしない](https://github.com/terasolunaorg/terasoluna-gfw/issues/625)ので Maven も必要
- Maven 公式イメージ [maven:3-eclipse-temurin-8](https://hub.docker.com/_/maven/tags?page=1&name=3-eclipse-temurin-8) を採用
## Tomcat 連携
- [[Working with Application Servers in VS Code - code.visualstudio.com](https://code.visualstudio.com/docs/java/)] に沿って
- [[Community Server Connectors extension](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-community-server-connector)] を入れても 'Java が古い' と怒られるので
- これ用に Java 17 を アプリ用 Java 8 と競合しないように導入する
## Maven 拡張が認識しない in DevContainer
- DevContainer 内で `mvn archetype:generate` して見たけれど
- DevContainer ワークスペース下に Generate したフォルダを VSCode の Maven 拡張機能が認識しない...
- サブディレクトリがダメぽく Generate したフォルダを VSCode で開きなおしたら 認識した
- `.vscode/settings.json` の位置になやむ、Generate したフォルダ下だけにするか、ワークスペース下にも設けるか
- はたまた Docker 的に WORKDIR で調節するか、要検討
## Tomcat 10 では動かない
- Community Server Connectors でアプリケーションサーバを作るとき Tomcat 9 を選びます

以上
IM920　距離に応じて速度を変えながら通信する

RL78を使った無線センサを5年ほど使ってます。
割と過酷な環境で使ってますが、故障することも無く順調に動作しています。

このセンサに使用している無線モジュールIM920の設定などを書いてみました。
通信距離に応じて速度を変えることで、通信距離を延ばすことが可能になります。

Markdownに慣れてないので[こちら](https://yokaton.com/mcu-202304-im920/)に書きました。
本体の無線センサの記事は[こちら](https://yokaton.com/mcu-rl78-rsen/)です。
[リンクテキスト](URL "タイトル")
【Swift】CocoaPodsの導入

# １，CocoaPodsとは

[CocoaPods](https://cocoapods.org/)は、iOSアプリ開発で使用するライブラリの管理を簡単にするためのツール(依存関係マネージャー)。

# ２，CocoaPodsのインストール・セットアップ

CocoaPodsをMacにインストールし、使えるようにする手順。
※既にインストール済の場合は、この過程はスキップ。

### STEP.1　ターミナルを開く

Command＋スペースバーで Spotlight を開き、「ターミナル」と検索してアプリを開く。

### STEP.2　CocoaPodsをインストール
```
sudo gem install cocoapods
```
パスワードの入力が求められるので入力する。

### STEP.3　セットアップ
```
pod setup
```
インストールとセットアップ完了

# ３，CocoaPodsを使ってライブラリを導入

### STEP.1　ターミナルでプロジェクトに移動
```
cd ~
```
~ は入力しなくても導入したいプロジェクトをドラッグ＆ドロップで自動入力できる。

### STEP.2　Podfileの作成
```
pod init
```
### STEP.3　Podfileを開く
```
open Podfile
```
### STEP.4　ライブラリを導入

Podfileが開けたら、
\# Pods for CocoaPodsTest と end の間に、
追加したいライブラリを以下のように入力する。
***
\# Pods for ~(プロジェクト名)

<font color="YellowGreen">pod ‘RealmSwift’</font>

end
***
（上記の例ではRealm）

### STEP.5　保存してPodfileを閉じる

command + s で保存し、ファイルをバツ閉じする。

### STEP.6　pod indtall する

以下のインストールコマンドを実行
```
pod install
```
赤文字が表示されなければ完了。

### STEP.7　プロジェクトを確認
プロジェクトを閉じていなかった場合、一旦閉じてFinderからプロジェクトを確認する。
元々あったプロジェクト(~.xcodeproj)とは別に、白いプロジェクト(~.xworkspace)がある。
白いプロジェクトにライブラリが導入されているので、以降はそれを使う。
元のプロジェクトは開かない。
Ubuntu 20.04でマウスホイールが使えない

Ubuntu20.04にアップグレードしたらマウスホイールが使えなくなりました。

次を実施したら再び使えるようになりました。
1. lsusbを実行
1. usbreset VID:PIDを実行。VIDとPIDはステップ1で表示されたマウスのVIDとPIDに置き換える

因みに、マウスホイールの上下が反対の場合は「設定」ー「マス素タッチパッド」の「まちゅらるスクロール」を有効／無効にすると直りました。

以上
【iOS】読み上げ機能を用いて、読み上げた回数をカウントする実装

SwiftUIで、特定の数字から、０までカウントダウンする挙動を繰り返しおこない、繰り返した回数をセット数としてカウントする際に、どのように実装するかを悩んだのでここに書き留めておく。

##### 1.読み上げ機能に関連するデリゲートの説明
##### 2.読み上げ機能を行うクラスファイルを作成
##### 3.クラスファイルにデリゲートを設定する。

## 1.読み上げ機能に関連するデリゲートの説明

読み上げた回数を数えるためには、AVSpeechSynthesizerDelegateを用いる必要があり、
デリゲートにより、
１読み上げが始まった
２読み上げが一時停止した
３読み上げが終わった
タイミングで処理を行う。

```swift:Speaker.swift

extension Speaker: AVSpeechSynthesizerDelegate {

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
            // １読み上げが始まったときに処理される
    }

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance: AVSpeechUtterance) {
            // ２読み上げが一時停止したときに処理される
    }

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
            // ３読み上げが終わったときに処理される
    }

    // etc...

}
```

## 2.読み上げ機能を行うクラスファイルを作成

このデリゲートに準拠するクラスが必要であり、そのためにSpeakerクラスを作成する必要がある。
以下を作成した。

```swift:Speaker.swift
final class Speaker: NSObject, ObservableObject {

   // 止まっているか、一時停止しているか、読み上げているかを管理するプロパティ
    @Published var state: State = .inactive
    enum State: String {
        case inactive, speaking, paused
    }

   // 読み上げた回数を管理するプロパティ
    @Published var countSpeech: Int = 0

    //　以降は読み上げ機能を実装している。
    private let synth: AVSpeechSynthesizer = .init()
    override init() {
        super.init()
        synth.delegate = self
    }
    func speak(word: String,language: String,rate: Float, pitch: Float) {
        let utterance = AVSpeechUtterance(string: word)
        utterance.voice = AVSpeechSynthesisVoice(language: language)

        utterance.rate = rate
        utterance.pitchMultiplier = pitch
        synth.speak(utterance)
    }
    func stop() {
        synth.stopSpeaking(at: .immediate)
    }
}
```
## 3.クラスファイルにデリゲートを設定する。
上記のクラスにデリゲートを設定する実装していく。

```swift:Speaker.swift
extension Speaker: AVSpeechSynthesizerDelegate {

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
        //　読み上げが始まった際に実行され、状態を管理するプロパティに代入
        state = .speaking
    }

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance: AVSpeechUtterance) {
        //　読み上げが一時停止した際に実行され、状態を管理するプロパティに代入
        state = .paused
    }

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
        //　読み上げが終了時点で処理が実行されるため、この関数内に読み上げ回数を管理している
        //　プロパティに＋１を行う。
        countSpeech += 1
        //　読み上げが終了した際に実行され、状態を管理するプロパティに代入
        state = .inactive
    }

    // etc...

}
```

以上で、読み上げた回数を管理することが可能になりました。

UIkitは、ViewContollerにデリゲートを設定していたが、SwiftUIはContentViewにデリゲートを設定できず、モデル部分にデリゲートを設定して、管理していく必要があるんですね。

他にも良い方法があれば、コメントいただけると大変うれしいです。
良かったと思ったら、いいねやTwitterのフォローよろしくお願いいたします！

https://sites.google.com/view/muranakar
個人でアプリを作成しているので、良かったら覗いてみてください！


以下を参考にしました。
https://stackoverflow.com/questions/61248666/avspeechsynthesizerdelegate-implementation-in-swiftui
【GPT】アーキテクチャが参考になるアプリケーションまとめ

はじめまして、sonesuke( [https://twitter.com/sonesuke](https://twitter.com/sonesuke) ) です。 LLMのニュースを追っかけ続けたので、これからキャッチアップする人用にまとめておきます。

ここで、取り上げているものは、これから流行っていくアプリケーションというよりは、アーキテクチャとして参考になるものなので、ぜひコードレポジトリを見てみることをお勧めします。

# アプリケーション

## textSQL

自然言語からSQLに変換するというアプリケーション。フロントエンドはReact, バックエンドはFlask (Python)でできています。

自然言語のプロンプトから、まずテーブルを選択したのち、プロンプトをFew-shotで補強しながら、SQLを生成、実行していくというアーキテクチャをしています。いきなり、SQLに変換するのではなく、何段か噛ませることで出力を安定させています。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/461fdc94-f194-ec8e-5255-b07f27c0012a.png)

https://github.com/caesarHQ/textSQL

## GPT4-pdf-chatbot-langchain

LangChain(LLMフーレムワーク), Pinecone(ベクトル検索), OpenAI(LLM), Next.js(フロントエンド)でできた、PDFドキュメントをベースに会話をできるシステムです。

ウォーレンバフェットAIで有名。

https://www.youtube.com/watch?v=Ix9WIZpArm0

https://github.com/mayooear/gpt4-pdf-chatbot-langchain

## Tabby

Github copilotのOSS版を作ろうというプロジェクト。まだ、alpha版。

学習部分は、LoRAによるファインチューニングで、RLHFによる補正も行うみたいです。実際の補完をやってくれる部分は、単純にLLMによるコード生成みたいですね。動かすにはGPUが必要です。

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3879/d178fd31-bf68-ab6d-79f5-5222877b9e95.png)

https://github.com/TabbyML/tabby

## ChatGeoPT

探している場所を質問すると、地図上でその場所を示してくれます。

中身的には、質問をGPT-3でOpenStreetMapのAPIに変換、それを叩いて地図表示という流れ。

200行のPythonでできていて、その中核がプロンプトというアプリケーション。LLM時代を感じます。

https://github.com/earth-genome/ChatGeoPT

作者による開発ブログがこちら。

https://medium.com/earthrisemedia/chatgeopt-exploring-the-future-of-talking-to-our-maps-b1f82903bb05

## Paper-QA

PDFに対してユーザーが質問できるアプリケーション。イメージとしては論文自体と会話する感じです。埋め込みとLLMとしてOpenAI、ベクトル検索エンジンとしてFAISS、LangChainを使用しています。

1. 事前にPDFをOpenAIで埋め込み表現 → ベクトル検索エンジン FAISSに突っ込む
2. ユーザーからの質問を埋め込み表現にして、似たチャンクを検索。コンテキストに追加してLLM

https://github.com/whitead/paper-qa

## Book-GPT

本に対してユーザーが質問できるというアプリケーション。考え方としては、上記のPaper-QAと同じ。完全Typescript製だったので、取り上げました。

フロントエンドとしてReact, 埋め込みとLLMはOpenAI, ベクトル検索エンジンとしてPinecone, LangChain(Typescript)を使用しています。

https://github.com/fraserxu/book-gpt

## SiteGPT

厳密にはソースコードや設計を公開していないので正確なところはわからないのだけれど、先のPaper-QAやBook-GPTのPDF取り込み部分をWebクローラーにしたら作れるなーと。

https://sitegpt.ai/#how-it-works

## Baby DORA

ドラえもんの萌芽がこんなところに・・・・・

というのはさておき、会話の履歴を、コンテキストに組み込むことで、会話を継続させています。OpenAIを生で使っているので、LLMは、davinci-003でしょうか・・・

https://github.com/ttizze/BabyDORA

## Cheetah

面接中に音声文字起こしして、ChatGPTに聞くことで、リモート面接を有利に進めようというもの。冷静に考えると、これは応用例として、別に営業訪問でもよいですし、全く同じ技術で使い方次第で、邪悪な感じではなくなるアプリケーションです。音声文字起こしとしてWhisper.cppを使用しています。

https://github.com/leetcode-mafia/cheetah

## Taxy AI

ブラウザの自動運転をするアプリケーション。

DOMから、入力フィールドやボタンを抽出し、LLMに操作手順計画を立てさせて、ページを遷移させていきます。新しいRPAのカタチが見えてきます。

https://github.com/TaxyAI/browser-extension

## 逆瀬川さんの記事

最近作ったものを読んでいくだけで、「あ、そんなこともできるのか」と思えるほどの創作量。

いつも勉強させていただいています。

https://zenn.dev/sakasegawa/articles/47e99a6777c4ef

# まとめ

いかがだったでしょうか？

私は、調査中、アプリケーションのバリエーションは色々あるものの、意外とアーキテクチャのバリエーションとしては、多くはないと思いました。もちろんこれから、どんどん、新しいものが出てくるとは思いますが、OSSライブラリ界隈などをウォッチしていくことでキャッチアップしていくことができそうです。

https://qiita.com/sonesuke/items/56a6e4b6532eafa104f4
脆弱性の色々について知ろう

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回は具体的なシステムの脆弱性の色々について更に詳しく調べてみましょう！
![インスタスライド_2023031708.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/b21ed293-105f-39ab-0036-c60e4551744f.gif)


# プロトコルの脆弱性
-SMTPに関する脆弱性
　スパム･メールの中継。

・HTTP、TELNET、POP3、IMAP4、FTP、PPPのログイン認証時の脆弱性
　ユーザー認証時に平文のまま通信。

・HTTP、TELNET、POP3、IMAP4、FTPのデータ送受信時の脆弱性
　ログイン後のデータが平文のまま通信。
　HTTP ⇒ SSLを使用。

# その他の脆弱性
・社会工学による脆弱性
　人間の心理的な錯覚や間違いをを悪用。　
　ソーシャルエンジニアリング（覗き見、盗み見、ゴミ箱あさり、なりすましで聞き出す）

・開発システムの脆弱性
　セキュリティを考慮した設計がされているか？（ID,PWの使用やデータの置き場所）　　　
・システム設定の脆弱性
　サーバーOSやソフトウェアのデフォルト設定に脆弱性。
・システム運用の脆弱性
　ユーザーIDやパスワードの運用。
　物理的な警備不備。

# まとめ
ー通信プロトコルの脆弱性がある
ー社会工学、開発システム、システム設定、システム運用の脆弱性がある

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
2023/4/10主にITとかセキュリティの記事

Apple、「iOS 16.4.1」配信　「悪用された可能性がある」脆弱性にも対処(4/8)
https://news.yahoo.co.jp/articles/3c0d9cda5b3cda22b87b411335593c1d15af228b?source=rss

Apple、複数の不具合とWebKitなど2件のゼロデイ脆弱性を修正した「iOS/iPadOS 16.4.1 (20E252)」をリリース。(4/8)
https://applech2.com/archives/20230408-ios-16-4-1-fixed-two-zero-days.html

イタリアがChatGPTを「即効で」禁止した理由。次に続く国は？(4/8)
https://news.yahoo.co.jp/articles/6757727e1a293b03a6691418f6b1161fc220f88f?source=rss

新人プログラマ応援特集！歴代いいね数TOP100(4/7)
https://qiita.com/Qiita/items/1bd1a4c97bc390fa7cc5

全日空のシステム不具合「サーバーへの負荷が原因」(4/8)
https://news.yahoo.co.jp/articles/bf4049bb30563a0fbcd4358ba0052f3b501b7614

サイバー捜査員の採用苦戦…「給与では民間に勝てない」、あの手この手でリクルート(4/8)
https://news.yahoo.co.jp/articles/27f0954ed700b2fc3744d7cc66b5511eb528e51a

校務員が生徒情報を流出　就学援助状況など、大阪(4/7)
https://news.goo.ne.jp/article/kyodo_nor/region/kyodo_nor-2023040701001302.html
CentOSの仮想マシンに何故かIPアドレスが割り振られなかった問題 

# 目次
- 概要
- 経緯
- 原因
- 対処
- 感想
- 参考文献

# 概要
UdemyでLAMP環境構築のためのお勉強でCentsOS入れて設定していたら
何故か動画では普通にenp0s3にinetが表示されているにもかかわらず、自分の画面だと表示されずに詰みかけた。

振り返ってみれば大した問題じゃなかったのだが、こいつのせいで1日以上悩んだので備忘録として残す。

備考として、筆者はLinux触るのがほぼ初めての素人です。

# 経緯
- LAMP環境作るためにまずCentOS7をVirtualBoxにインストールして設定　→　Apacheの設定をやっているところだった。
- Apacheはyumで落としてきて、Webサイトの通信のためにファイヤーウォール設定を弄ってhttp通信のためポート80、https通信のため443を開けたところだった。
```
#httpの穴開け(successと返されれば成功）
sudo firewall-cmd --permanent --zone=public --add-service=http

#httpsの穴開け
sudo firewall-cmd --permanent --zone=public --add-service=https

#設定の反映
sudo  firewall-cmd --reload

```

- 上記設定後にApche動作確認のため静的なWebページを表示しようとip aでipアドレスを調べたところ、inet部分が無くて詰んでしまった。



下図赤枠部分がそもそも表示されなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326656/ebcf33af-61f8-5049-ded0-6d7ceb77ad59.png)



# 原因
直接的な原因はわからないが、ググってみていくと
恐らく「enp0s3」という仮想マシンにIPアドレスがそもそも割り当てられていない状況であることがわかった。
（この時点で「enp0s3」というのが何なのかもわかっていなかった）

# 対処
- 「"IPアドレスがない”ってことは”これから割り当てられる”ってことやん」ということで「CentOS　IPアドレス　割り当て方」みたいなワードでググっていく。

- すると”設定しとけばDHCPサーバーがホストOSと通信できるIPアドレスをその仮想マシンに振ってくれる”ということだったので、その路線で解決を図る。
（「DHCPサーバー！基本情報のお勉強で見たやつだ！参考書の中だけの存在じゃなくて実在するんだ！」とちょっと感動した）

以下のようにコマンドを打ち込む

```
#DHCPサーバーによるIPアドレスの自動割り当ての有効化
nmcli connection modify enp0s3 connection.autoconnect yes
```

これで自動的にアドレスが割り当てられるようになったはずなので、いったん再起動して再確認

まずマシンの接続状態をnmcli devで見る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326656/963cd524-38de-609c-d756-757fe72c81f8.png)
ステータスがconnectedになってるヨシ！


じゃあIPアドレスもちゃんと表示されるはず………ということでip aもういっちょ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326656/b80e8ada-fef4-b361-889a-258c6ce40832.png)

inet表示されるヨシ！ということで解決

# 感想
こんなものに1日弱もかけてしまったために自分の知識不足を痛感しつつ自尊心に大きな傷を負った。

それはそれとして解決に至るための情報はネットのあちらこちらに落ちていたので、先人たちには感謝しかない。

# 参考文献

- KOYO DIGITAL WOEKS
https://click.jp/knowledge/1176/
Power Automate for desktopでいろんなテクニックを覚える

こちらの記事の内容は、以下の書籍の勉強の記録です。
書籍の内容を合わせてご確認いただくと、分かりやすいものと思われます。

https://www.amazon.co.jp/%E3%81%A7%E3%81%8D%E3%82%8BPower-Automate-desktop-%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%81%82%E3%83%BC%E3%81%A1%E3%82%83%E3%82%93/dp/4295015938/ref=sr_1_6?keywords=power+automate+%E6%9C%AC&qid=1680744459&sprefix=Power+Automate%2Caps%2C163&sr=8-6

基本的には、私の勉強記録ですので気楽にご覧いただければと思います。
最初からご覧になりたい方はこちら。▼

https://qiita.com/inaho3517/items/c1e702f763631d3fd081

# 勉強内容の確認

書籍について公開されている目次は以下の通りです。

　＜基本編＞
　　　第１章　[Power Automate for desktopの基本を学ぼう](https://qiita.com/inaho3517/items/c1e702f763631d3fd081 "Power Automate for desktop を勉強する話")
　　　第２章　[業務の自動化に必要な基本操作を覚えよう](https://qiita.com/inaho3517/items/d5f770c3e278d6b626e1 "Power Automate for desktop の基本操作を覚える")
　＜活用編＞
　　　第３章　[Excelの作業を自動化しよう](https://qiita.com/inaho3517/items/490fe4e36b981ea2b135 "Power Automate for desktopでExcelの作業を自動化してみる")
　　　第４章　[Webフォームへの入力を自動化しよう](https://qiita.com/inaho3517/private/3eb2edd276b9c8222f97 "Power Automate for desktopでWebの操作を自動化してみる")
　　　**第５章　業務シーン別のテクニックを覚えよう**　　　◀ 本日はこちら！

今日は、シーン別の活用方法を覚えていきます！💪

# メインの自動化にもう一工夫したい
自動化したいとご要望の多い、ExcelとWebの自動化の最低限のつくり方を学びましたが、使っているうちにもっと条件を追加したくなります。
自動で日付の計算をしたい、特定のお客様の場合は処理方法を変更したい……挙げて言ったらキリはありませんが、これらのニーズに関しても紹介している書籍はフォローしてくれています。

今日は、いろんなわがままを聞いてくれるロボット……作ってまいります😁
# 本日の勉強メモ
本日も書籍にそって勉強開始です！
## 作成フローの確認
作業の全体像を解説してくれています。
以前自動化した処理のどの部分にどういった処理を追加するのか、頭の整理ができるよう構成されています。

自動化のための要件定義をしても、あとで「この処理も追加してほしい」と後出しされることは往々にしてあるので、実際の作成シーンにも沿っていますね👍
## 要望された処理の追加
簡単なんだけど面倒……な作業も、ロボットにお任せして作りこんでしまえばOK！
そんなよくある要望をロボットではこう実現する、ということが学べる章でした。
特に驚いたのはWebスクレイピングですね～。こんなに簡単にできるとは……！手順さえ知ってしまえばかなり便利な機能だと思いました！😆
# 本日のまとめ
いろんな便利な処理について学ぶことが出来ました。
色々組合わせたら面白い処理が出来そうです♪

書籍での勉強は以上になります。
最後までご覧いただき、ありがとうございました！😄
Ender5Pro+SKR3+OctoPrint+Klipperの設定【ディスプレイ編】

# 記事一覧
[その他の3Dプリンタ記事はこちら。](https://qiita.com/tanutanup/items/be6a6166d814a5882c7f)

# タブレット・スマホ
適当なタブレットやスマホを3Dプリンタ付近に常設する方法です。OctoprintのWebページを常時開いておく運用となります。なんのひねりも無い運用ですがわかりやすいですね。

# [klipper screen](https://moonraker.readthedocs.io/en/latest/)
Klipper用WebAPIの[Moonlaker](https://moonraker.readthedocs.io/en/latest/)を経由してGUIを提供するソフトです。この方式では3Dプリンタと接続しているコンピュータ(例：RaspberryPi)にディスプレイを直接接続します。タッチスクリーンを前提としたインターフェースなので操作しやすそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/5025ec54-47ce-5bd4-cfe0-7ee75fe08c53.png)
ただ、OctoprintとMoonlakerが干渉する気がするのでまだ試していません(Mainsailを使っている場合はこれ一択でしょう)。

# LCDボード
販売されている3Dプリンタ同様にマザーボード側にLCDを接続する方法です。

## 購入
元々[bigtreetech TFT35 E3 V3.0](https://biqu.equipment/products/btt-tft35-e3-v3-0-display-touch-screen-two-working-modes)を使っていましたが、どうやら[klipperはタッチスクリーンモードをサポートしていない](https://github.com/Klipper3d/klipper/issues/2546)し、今後もサポートする予定は無いらしい。
従来の~~ダサい~~表示のLCDとして元々のEnder5Proに付属していたLCDを取り付けたものの、ピン配置が異なるらしく動作せず。泣く泣く[標準的なLCD](https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller)を購入。

## 設定
printer.cfgに設定を追記すればサクッと動くはずです。
[公式が自分が使うボード用のピン配置を設定してくれている場合](https://github.com/Klipper3d/klipper/tree/master/config)、下記の項目を追加すれば動くはずです。
（参考：https://github.com/Klipper3d/klipper/blob/master/config/sample-lcd.cfg）

```printer.cfg

######################################################################
# "RepRapDiscount 128x64 Full Graphic Smart Controller" type displays
######################################################################

[display]
lcd_type: st7920
cs_pin: EXP1_4
sclk_pin: EXP1_5
sid_pin: EXP1_3
encoder_pins: ^EXP2_3, ^EXP2_5
click_pin: ^!EXP1_2
#kill_pin: ^!EXP2_8

[output_pin beeper]
pin: EXP1_1
```

## 動作確認
確かに動作はしましたが、表示がおかしいです。原因究明中。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/c780a42f-2490-7982-ea4e-b4e22f492e35.png)

# 今後
ディスプレイ表示の乱れを修正する予定です。
NeurIPS2022の量子化論文 (4)

# 概要

この記事では、[NeurIPS2022](https://nips.cc/)の量子化論文を紹介します。[^1]
([その1](https://qiita.com/kyad/items/5138306b021299ae4ad2) [その2](https://qiita.com/kyad/items/e6207213ae9d3513d8fd) [その3](https://qiita.com/kyad/items/2259ebffa8dbe9b1a2d4))

[^1]: 画像や数式は論文から引用しています。

# BiT: Robustly Binarized Multi-distilled Transformer

https://openreview.net/forum?id=wYgRIJ-oK6M

- 概要：Transformerの2値化
- 研究機関：Meta
- 新規性：Transformerを実用的に2値化したものは初(画像では以前にあった)
- キモ：蒸留とSTE
- 評価：BERT, GLUEで評価した


# ZeroQuant: Efficient and Affordable Post-Training Quantization for Large-Scale Transformers

https://openreview.net/forum?id=f-fVCElZ-G1

- 概要：大規模NLPモデル向けPTQ
- 研究機関：Microsoft
- 新規性：大規模NLPモデルをFP16からINT4/INT8に精度維持で高速化した
- キモ：(1)Ampare向け Group-wise量子化 (2)レイヤ毎に蒸留 (3)CUTLASSで行列積
- 評価：BERT等で評価


# UDC: Unified DNAS for Compressible TinyML Models for Neural Processing Units

https://openreview.net/forum?id=ZJe-XahpyBf

- 概要：UDC. Unstructuredで圧縮可能なTinyMLモデルを探すNAS
- 研究機関：Meta, NVIDIA, Tenstorrent, Arm, Qualcomm
- 新規性：従来より速く精度高い。ネットワークのアーキテクチャ、ビット幅、量子化、Sparsityを最適化できる。
- キモ：量子化、Sparsityの効果をモデルサイズで押さえられること。これでロス関数を定義して最適化する
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/2c5b0308-ea07-2a09-6b50-b00607341aa4.png)
- 評価：NPUを使用したTinyMLでSOTA
AmazonLinux2でmysql5.7クライアントをインストールする方法

## 環境
OS：AmazonLinux2
DB：RDS for MySQL (エンジンバージョン5.7)

## MySQL5.7クライアントをインストール

AmazonLinux2のリポジトリにはmysqlが存在していないのでmysqlのリポジトリを追加する。
追加した段階ではmysql8.0のリポジトリが有効化されているので、mysql5.7のリポジトリを有効化する。

```
# mariadbをアンインストール
yum list installed | grep mariadb
yum remove mariadb-libs.x86_64

# mysqlのリポジトリを有効化
yum locainstall https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm

# mysql8.0のリポジトリを無効化
yum-config-manager --disable mysql80-community

# mysql5.7のリポジトリを有効化
yum-config-manager --enable mysql57-community

# mysql5.7クライアントをインストール
yum install -y mysql-community-client.x86_64

# mysql5.7のインストール確認
mysql --version
```