OmniAICreator/Qiita-1.07M huggingface dataset:
EC2にRailsアプリをデプロイ③ ~本番環境にデータベースを用意する~

##はじめに
これは前回の続きです。
データベースを本番環境に用意してあげてデータを保存できるようにします。

私はローカル環境でMySQLを利用してアプリケーションの作成をしました。


##MariaDBをインストール
MariaDBとはMySQLの派生として開発されているオープンソースソフトウェアです。今回使用しているAmazon Linux 2ではこのMariaDBを使用することとなっており、MySQLと互換性があります。

下記のコマンドでインストールします。
Amazon Linux 2を利用している場合yumコマンドでインストールできます。

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install  mariadb-server mysql-devel
```

**systemctlコマンド**というコマンドを使ってインストールしたソフトウェアを起動します。

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl start mariadb
```

起動しているかの確認を下記のコマンドで行います。

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl status mariadb

● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
   Active: active (running) since 土 2020-02-29 07:00:11 UTC; 7s ago
  Process: 5993 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
  Process: 5957 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
```

緑色で「acrtive(running)」と表示されていれば起動できています。

データベースのrootパスワードの設定をします。
yumでインストールしたMariaDBはデフォルトでrootというユーザーでアクセスできるようになっています。しかしパスワードが設定されていないので自分で設定する必要があります。

このパスワードは後ほど使うのでメモに残しておいてください。
**私はメモを残していなくて大変苦労しました！！**

下記のコマンドを実行しパスワードを設定します。

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo /usr/bin/mysql_secure_installation
```

実行したあと
①Enter current password for root (enter for none): 」と表示されたらEnterキーを押します。

②「Set root password? [Y/n]」と表示されたら「Y」を入力してEnterキーを押す

③「New password:」と表示されたら自身で決めたパスワードを入力
*※入力しても特に変化ありませんが文字はちゃんと入力されています*

④「Re-enter new password:」と表示されたら、同じパスワードを入力
*※入力しても特に変化ありませんが文字はちゃんと入力されています*

⑤　①〜④が完了したあとは細かい質問を4つほどされるので全て「Y」を入力してエンターしてください。


最後にちゃんとパスワードが使えるか確認をしてみます。下記コマンドを入力

```terminal:ターミナル
[ec2-user@ip-172-31-25-189 ~]$ mysql -u root -p
```

「Enter password:」と表示されたら先ほどのパスワードを入力してエンターを押します。

下記ように表示されればしっかり設定できています。

```terminal:ターミナル
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 142
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
```

「exit」を入力したら閉じられます。
これでデータベースを用意できました。
次回はいよいよデプロイしていきます。
はじめてReduxに触れるための基礎

## はじめに
Reactを使ってアプリの開発を行っているとReduxという単語を目にするようになった。
知らなくてもコードを書くことはできるが、開発をする上で知っておいた方がいいと思ったので調査した。  
手探りの状態で調査をしているので認識違いがあったら指摘していただけると幸いです。

## Reduxとは何か
Reduxとは、状態（state）管理フレームワークである。  
状態管理フレームワークはアプリケーション内におけるデータの流れを管理するものである。
状態管理フレームワークを導入することで、開発の規模が大きくなったときにデータの流れを見失いづらくすることができる。

Redux以外の方法で状態管理を行う手法として、

- [MobX](https://github.com/mobxjs/mobx)
- [Almin](https://github.com/almin/almin)

のようにライブラリを使ったものもあれば、

- ローカルステート(useState, useReducer等)を使った管理
- HooksAPIのuseReducer, useContextを使った管理

のようにReactの機能を使用して独自で実装するもの等がある。


## なぜReduxは登場したか
Reduxが登場した背景として、Facebookが提唱したFluxという設計思想の出現がある。  
FluxはMVCパターンの問題を解決するために提唱された。
MVCパターンで開発する場合、開発規模が拡大するとモデルやビューの依存関係が複雑化しデータの流れの管理が難しくなってしまう。  
Fluxではデータの流れを「Action→Dispatcher→Store→View」という単一方向の流れに限定することで管理をしやすくしている。

ただFluxという設計は特定の実装方法を強要するものではないため、Fluxを実現するために様々な手法が検討され、その一つとしてReduxが誕生した。

## Reduxの特徴
Reduxの特徴として、FluxにあったDispatcherが存在しない。(「Action→Store→View」)
ActionがStateを更新する際にはStore内のReducerと呼ばれる関数を使う。  

また以下の三原則が存在する。

- Single source of truth
  - アプリケーション全体の状態(state)を単独のオブジェクトとしてStoreに保存する。デバッグを容易にしたり、undo/redoの実装を容易にすることができる。
- State is read-only
  - stateは読み取り専用であり、stateを更新するにはActionをStoreにdispatchする必要がある。Viewから直接stateが変更されないことが保証されるため、テストやデバッグの際にオブジェクトであるActionを利用すればいい。
- Changes are made with pure functions
  - ReducerはActionとstateから新たなstateを作る純粋な関数である。

## Reduxのデメリット
- シンプルなアプリケーションの場合オーバースペックになる可能性がある。
  - データの流れが複雑でないアプリケーションでReduxを使用すると、不必要に複雑な実装になってしまう。
  - CustomHookを使えばより工数の少ないシンプルな実装をすることが可能な場合もある。

## 参考文献
1. [ベストな手法は？ Reactのステート管理方法まとめ - ICS MEDIA](https://ics.media/entry/200409/)   
1. [SPAにおける状態管理:関数型のアプローチも取り入れるフロントエンド系アーキテクチャの変遷 - エンジニアHub｜Webエンジニアのキャリアを考える！](https://eh-career.com/engineerhub/entry/2019/05/23/103000)
2. [アプリの状態管理を安全に行うためのFluxとRedux (1/3)：CodeZine（コードジン）](https://codezine.jp/article/detail/10751)
1. [Facebook の決断：MVCはスケールしない。ならば Flux だ。](https://www.infoq.com/jp/news/2014/05/facebook-mvc-flux/)
2. [Redux入門【ダイジェスト版】10分で理解するReduxの基礎 - Qiita](https://qiita.com/kitagawamac/items/49a1f03445b19cf407b7)
3. [結局FluxやらReduxやらって何なのか個人的なまとめ - Qiita](https://qiita.com/syossan27/items/7e1b2e07ac68b96bdaa7)
4. [無理してReduxを使わずに、Custom Hookで楽に状態を管理する](https://qiita.com/miyarappo/items/250ed4d094900ea46e21)
Swift初学者が自動販売機ロジックを書いてみたら1…（未リファクタリング）

今回は自動販売機ロジックについて学習したのでアウトプットします。
ちなみに私はMac触り始めて半年の者です。（ガチガチの初心者です）
初学者のアウトプット記事ですので、間違っている点など多々あるかと思いますが、暖かい目で見守っていただけますと幸いです。
#はじめに
現在、私はMENTAで、ヤマタクメンターにご指導いただいております。
ヤマタクメンターのURL　[https://menta.work/user/1840](https://menta.work/user/1840)

今回は課題として、自動販売機のロジックをXcodeのPlaygroundでコーディングしてみました。
簡単に言うと自動販売機の仕組みをコードで表現しましたみたいなことですね。

サンプルコードは一切見ずに、あーだこーだ言いながら作りました（笑）
初学者が作ったものなので、ツッコミどころ満載だと思いますがご容赦ください💦
ちなみに例外ケースは考えずに、とりあえず一発目のコードを掲載してます。
今後、改善するつもりです。
#仕様
・お金を入力する（0以上）
・飲み物は3種類（水100円、コーヒー150円、エナジードリンク200円）から選べる
・入力したお金が飲み物の値段より高ければ（お釣りが0以上だったら）、選択した飲み物とお釣りが出力される
・各飲み物の初期在庫数を5本とし、飲み物が買われたら、その飲み物の在庫数を-1する
・飲み物を選択しなかったら、”飲み物を選んでね”と出力
・飲み物が買えなかったら（お金が足りなかったら）、”お金が足りません”と出力
・在庫数に変化がなければ（減らなかったら）、”在庫変動はありません”と出力

:::note info
今後は
・在庫がなかった場合の挙動
・釣り銭切れの挙動
・使えないお金が入力された場合の挙動　
　
以上を追加していこうと思っています。
:::

#実装コード

```swift:qiita.swift
import UIKit

//入れるお金
var inputedYen:Int = 200
//飲み物を選択　※Drink.water,Drink.coffee or Drink.energyDrinkで選択する
var wantedDrink:Drink? = nil

//飲み物の種類
enum Drink{
case water
case coffee
case energyDrink
}

//飲み物の値段
var drinkPrice = 0
//お釣り
var change = 0

//各飲み物の初期在庫数
var stockOfWater = 5
var stockOfCoffee = 5
var stockOfEnergyDrink = 5

//飲み物の在庫を減らす関数
func reduceStock () {
    switch wantedDrink {
    case .water:
        stockOfWater = stockOfWater - 1
    case .coffee:
        stockOfCoffee = stockOfCoffee - 1
    case .energyDrink:
        stockOfEnergyDrink = stockOfEnergyDrink - 1
    case .none: break
    }
}

//飲み物の在庫数を確認する関数
func checkStock() {
    print("waterの在庫は\(stockOfWater)個です")
    print("coffeeの在庫は\(stockOfCoffee)個です")
    print("energyDrinkの在庫は\(stockOfEnergyDrink)個です")
}

//飲み物を選択した時に、その値段を決める関数。選択しなければ選ぶよう出力する
switch wantedDrink {
case .water:
    drinkPrice = 100
case .coffee:
    drinkPrice = 150
case .energyDrink:
    drinkPrice = 200
case nil:
    print("飲み物を選んでね")
    checkStock()
    print("在庫変動はありません")
}

//お釣りを計算する関数
func calculatedChange () {
    change = inputedYen - drinkPrice
}

//入れたお金が0円以上かつ、飲み物を選択した場合、お釣りと飲み物を出力
if inputedYen >= 0 && wantedDrink != nil{
    calculatedChange()
//お釣りが0円以上であれば飲み物とお釣りを出し、お金が足りなければエラーメッセージを出力
    if change >= 0 {
        print(wantedDrink!)
        print("お釣りは\(change)です")
        reduceStock()
        checkStock()
    }else{
        print("お金が足りません")
        checkStock()
        print("在庫変動はありません")
    }
}

```

#おわりに
最初は自動販売機ロジックってなんですか？？から始まり、ほんとに作れるのかと不安でしたが、やってみるとすごく楽しいんです！
自分の期待している挙動になるよう、もっとまとまったコードになるようにと、今まで読んだ参考書をめくりながら、試行錯誤しながら作りました。
まだ改善の余地はいっぱいあると思うので、頑張りたいと思います！
Sambaが止まっているはずなのにプロセスが使用中の場合の解決法

# エラー内容
```
$ sudo systemctl status samba-ad-dc.service
* samba-ad-dc.service - Samba AD Daemon
     Loaded: loaded (/lib/systemd/system/samba-ad-dc.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sun 2021-07-25 00:09:33 JST; 1s ago
       Docs: man:samba(8)
             man:samba(7)
             man:smb.conf(5)
    Process: 3465 ExecStart=/usr/sbin/samba --foreground --no-process-group $SAMBAOPTIONS (code=exited, status=1/FAILURE)
   Main PID: 3465 (code=exited, status=1/FAILURE)
     Status: "Starting process..."

Jul 25 00:09:33 ik1-442-53089 smbd[3480]:   ERROR: smbd is already running. File /run/samba/smbd.pid exists and process id 2092 is running.
Jul 25 00:09:33 ik1-442-53089 samba[3475]: [2021/07/25 00:09:33.107690,  0] ../../file_server/file_server.c:45(file_server_smbd_done)
Jul 25 00:09:33 ik1-442-53089 samba[3475]:   file_server smbd daemon died with exit status 1
Jul 25 00:09:33 ik1-442-53089 samba[3475]: [2021/07/25 00:09:33.107815,  0] ../../source4/smbd/service_task.c:36(task_server_terminate)
Jul 25 00:09:33 ik1-442-53089 samba[3475]:   task_server_terminate: task_server_terminate: [smbd child process exited]
Jul 25 00:09:33 ik1-442-53089 samba[3465]: [2021/07/25 00:09:33.164919,  0] ../../source4/smbd/server.c:370(samba_terminate)
Jul 25 00:09:33 ik1-442-53089 samba[3465]:   samba_terminate: samba_terminate of samba 3465: smbd child process exited
Jul 25 00:09:33 ik1-442-53089 systemd[1]: samba-ad-dc.service: Main process exited, code=exited, status=1/FAILURE
Jul 25 00:09:33 ik1-442-53089 systemd[1]: samba-ad-dc.service: Failed with result 'exit-code'.
Jul 25 00:09:33 ik1-442-53089 systemd[1]: Failed to start Samba AD Daemon.
```

## やり方
起動しているプロセスを終了させる

```
$ sudo killall smbd
```

もしくはプロセスIDが分かる場合はそれを使用する
※上記の場合はエラー内容にプロセスIDが書かれている。

```
$ sudo kill 2092
```
CROSS JOIN（クロス結合）を通したINNER JOINの考え方



※この記事は実務半年〜１年の方に向けた記事です。

SQLの結合を書く際、なかなか思い通りの結果が取得できずに結合条件に悩むことがあります。
ただ、とある現場でクロス結合を使えばだいぶ楽になることを学んだので、今回はその考え方を共有してきます。


まず、今回使用するテーブルは次の通りです。
![スクリーンショット 2021-07-25 19.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690469/ffffaccd-b1ea-3dd1-573b-daa1764714c0.png)

これを単純にクロス結合します。クロス結合とは、総当たりで結合するということです。

```sql
SELECT * FROM restaurant_name,restaurant_reputaion
```
![スクリーンショット 2021-07-25 19.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690469/7821e439-9a74-035e-cf7a-96dee387f724.png)

こうなります。これでも総当りの意味がいまいちつかめない人のために一部とりだすと、こういうことです（僕は最初そうでした）

![スクリーンショット 2021-07-25 21.54.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690469/d6f2d591-68ec-ef4b-4380-2dba77475e1c.png)


つまり、
①あくせる亭という一行に対して評判テーブルがすべてくっつき、
②総当たりのためあくせる亭が評判テーブルの行数分増えている
ということです。あとは同じことを左側のテーブル（ここではレストランテーブル）の行数だけ繰り返しているだけです。

ここまででクロス結合の考え方はつかめたはずです。
次に、クロス結合にある条件を付け足します。

```sql
SELECT * FROM restaurant_name,restaurant_reputaion 
WHERE restaurant_name.id = restaurant_reputaion.id
```

日本語にすると「レストランテーブルのidと評判テーブルのidが等しいものをくっつける」といったところでしょうか。
これを先程の画像を用いて説明します。

![スクリーンショット 2021-07-25 22.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690469/46c153c3-7749-6e25-1537-90f0afc8f23c.png)

まず先程同様あくせる亭に評判テーブルがくっつきます。
続いてwhere句をみると、「レストランテーブルのidと評判テーブルのidが等しいものをくっつける」ので、
id=1以外の行はくっつかずに消滅します。あとはレストランテーブルの行数分これを繰り返していきます。
すると結果が、


![スクリーンショット 2021-07-25 22.26.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690469/8aafbd1b-7cb4-8384-63b1-a4610af0a9aa.png)

となります。
今回はもう結果は貼りませんが、これはINNER JOINを使用したSQL文の

```sql
SELECT * FROM restaurant_name INNER JOIN restaurant_reputaion ON restaurant_name.id = restaurant_reputaion.id
```

と同じ結果になります。
INNER JOINでの結合条件が思いつかないときは、まずクロス結合で結果を表示してから、
絞っていくとわかりやすいかと思うのでぜひ試してみてください。
Sambaが同じポートを使用中で起動しない場合 -Port53

# システム構成

* OS
    * Ubuntu 20.04 LTS

* Samba Version
    * 4.11.6-Ubuntu

# エラー内容
```
$ sudo systemctl status samba-ad-dc.service
* samba-ad-dc.service - Samba AD Daemon
     Loaded: loaded (/lib/systemd/system/samba-ad-dc.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sat 2021-07-24 23:47:41 JST; 29s ago
       Docs: man:samba(8)
             man:samba(7)
             man:smb.conf(5)
    Process: 3200 ExecStart=/usr/sbin/samba --foreground --no-process-group $SAMBAOPTIONS (code=exited, status=1/FAILURE)
   Main PID: 3200 (code=exited, status=1/FAILURE)
     Status: "Starting process..."

Jul 24 23:47:41 ik1-442-53089 samba[3212]:   task_server_terminate: task_server_terminate: [smbd child process exited]
Jul 24 23:47:41 ik1-442-53089 samba[3200]: [2021/07/24 23:47:41.712654,  0] ../../source4/smbd/server.c:370(samba_terminate)
Jul 24 23:47:41 ik1-442-53089 samba[3200]:   samba_terminate: samba_terminate of samba 3200: smbd child process exited
Jul 24 23:47:41 ik1-442-53089 systemd[1]: samba-ad-dc.service: Main process exited, code=exited, status=1/FAILURE
Jul 24 23:47:41 ik1-442-53089 samba[3256]: [2021/07/24 23:47:41.781743,  0] ../../source4/smbd/service_stream.c:372(stream_setup_socket)
Jul 24 23:47:41 ik1-442-53089 samba[3256]:   stream_setup_socket: Failed to listen on 0.0.0.0:53 - NT_STATUS_ADDRESS_ALREADY_ASSOCIATED
Jul 24 23:47:41 ik1-442-53089 samba[3256]: [2021/07/24 23:47:41.781858,  0] ../../source4/dns_server/dns_server.c:648(dns_add_socket)
Jul 24 23:47:41 ik1-442-53089 samba[3256]:   Failed to bind to 0.0.0.0:53 TCP - NT_STATUS_ADDRESS_ALREADY_ASSOCIATED
Jul 24 23:47:41 ik1-442-53089 systemd[1]: samba-ad-dc.service: Failed with result 'exit-code'.
Jul 24 23:47:41 ik1-442-53089 systemd[1]: Failed to start Samba AD Daemon.
```

# 治し方
## ポート53を使用中のソフトを特定する
```
$ sudo lsof -i:53
```

## 特定したソフトを停止
```
$ sudo systemctl stop [ソフト名]
$ sudo systemctl disable [ソフト名]
```

例は参考にしたサイトがわかりやすいと思います！↓
参考にしたサイト→　https://www.ytyng.com/blog/ubuntu-samba-ad-dc-dns/
Raspi4 Case Fanを"きちんとPWM制御"するには？(その2, 調査段階)

#TL;DR `dtoverlay=pwm-fan`が作れそう、だったけど時間切れ

- CPU温度で段階的に制御するためのrpi-poe-overlay.dts
- PWM制御するためのpwm-overlay.dts 
- これを上手く合成できれば、、、ワンチャンありそうですね（残念ながら完成には至りませんでした）

#はじめに

さて、前回の調査でFAN制御をするためには`raspi-config`経由で起動時オプションを設定する、ということを確認した。

このraspberry piのFAN制御において、小さな疑問が生じた。

`dtoverlay=gpio-fan`

果たして、GPIO14を使ったFAN制御がなされる、というが、どこにデフォルトが書かれているのだろうか？この謎を追い求めるため、調査員はアマゾン…ではなくgithubを探索した・・・　が正攻法では見つからない。なかなか面白い問題にぶち当たった。

# それは単純な落とし穴だった（ファイル数が多すぎるので見つからない）

[gpio-fan-overlay.dts](
https://github.com/raspberrypi/linux/blob/rpi-5.10.y/arch/arm/boot/dts/overlays/gpio-fan-overlay.dts) というファイルが、arch/arm/boot/dts/overlays/以下にある。ここに確認したい情報の全てが入っていた。

しかしWebUIから表示しようとすると、"o"に達する前に読み込みが止まって見えない、おお、なんということだ！！ 

ということで、こちらを確認してほしい

> https://github.com/raspberrypi/linux/blob/rpi-5.10.y/arch/arm/boot/dts/overlays/gpio-fan-overlay.dts

```plaintext
 * Requires:
 *	- kernel configurations: CONFIG_SENSORS_GPIO_FAN=m;
 *	- kernel rebuild;
 *	- N-MOSFET connected to gpiopin, 2N7002-[https://en.wikipedia.org/wiki/2N7000];
 *	- DC Fan connected to N-MOSFET Drain terminal, a 12V fan is working fine and quite silently;
 *	  [https://www.tme.eu/en/details/ee40101s1-999-a/dc12v-fans/sunon/ee40101s1-1000u-999/]
 *
 *                   ┌─────────────────────┐
 *                   │Fan negative terminal│
 *                   └┬────────────────────┘
 *                    │D
 *             G   │──┘
 * [GPIO12]──────┤ │<─┐  2N7002
 *                 │──┤
 *                    │S
 *                   ─┴─
 *                   GND
 *                   
```

この図面の、2N7002は単純な「トランジスタ」である。

つまり一言で結論を言うと。

**FANを、GPIOでOn/Off制御することしか、考えられていない**

そう、もともと「これじゃ制御できないんじゃ・・・」という話、これは正解だった！！！ソフトの対応が足りておりません！！

# Kernelから制御するための救いは無いんですか? ⇒ （今のところは）ない。

では、pwm制御する手段はもう作れないのか？　そのものずばりな、pwm-fan.dts は無かったですね…。

その代わりに、overlaysを眺めていると、なかなかよさそうなものがあります…

## 救い1 POEのFAN制御

Raspberry piの 
[rpi-poe-overlay.dts](https://github.com/raspberrypi/linux/blob/rpi-5.10.y/arch/arm/boot/dts/overlays/rpi-poe-overlay.dts)

これは、RasPiのPower Over Ethernet HATについているFANを制御するためのoverlay。

## 救い2 PWM制御

[pwm-overlay.dts](https://github.com/raspberrypi/linux/blob/rpi-5.10.y/arch/arm/boot/dts/overlays/pwm-overlay.dts)

これは、RasPiのPWMを制御するためのoverlay。

ということは、これらを組み合わせれば、CPU温度に応じたPWMでのFAN制御がなんとかなりそうな気がするのですが。

というところで、4連休終了で、タイムオーバー！！もうちょっと！！もうちょっとなのですが。
【Git】チームから学ぶGitの使い方　Branch作成編

####My Profile
プログラミング学習歴②ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。　



#対象者

* チーム開発でのGitの使い方を学びたい方
* Branchの作成に関して知りたい方


#目的

* Branch作成をして作業場を分けて開発できるようにすること

#実際の手順と実例
###0.前回までの流れ

https://qiita.com/nao0725/items/a8ed365ba2aff655c31b



###1.Branchって、、、？

* Branchとは木の枝のこと。ブランチをうまく使って異なる作業を並行して進めることができます。
* 機能の追加やバグ修正を本番の環境ではなく、作業場となるBranchを準備して作業することで、不具合等をなくしていきます。


###2.実際のTerminalでのコマンド

mainBranchから新しいBranchを作ります

`````
$ git 　checkout -b develop
`````

```
$ git branch
 master
*develop
````

*がついている方が現在作業しているBranchになります。
上記のように本番環境になるmainでの作業は行わずに、作業後の変更点やバグ修正をpushするdevelopブランチを用意しました。

**⚠ブランチは機能・タスク・バグごとに切る（作成する）こと！！**

###3.作成したBranchをからコミットする
空コミットとは....
新規ファイルや修正ファイルがなくともコミットできる

下記ではまだ何も変更してない上に、チームメンバーがBranchを確認するために空コミットします

```
git add =A
```
これはオプション:-A = git add . + git add -uのあわせ技
新規作成、編集、削除したファイルの変更を追加する

````
$ git commit --allow-empty -m "コミットメッセージ"
```
--allow-emptyが空コミット部分です。

リモートリポジトリにpushする
```
$ git push origin develop
```

###4.統合Branch　をメンバーに反映する
ここから下はチーム開発のための作業です。
上記までを代表が実施し、下記をメンバーが実施します.


今回のdevelopのような立ち位置のBranchを統合ブランチといいます。いつも最新の状態に保っておくためのブランチで、安定した状態を保って置くことが鉄則です。

機能追加やバグ修正といったあるタスクを行うブランチをトピックブランチといいます。ここでは(maseterやdevelop)から分岐させ、ブランチ名をはっきりとどんな作業を実施したかわかるようにします。


````
$ cd アプリケーション
````

````
$ git checkout -b develop
````

````
$ git pull origin develop
````

筆者ははじめてのチーム開発でトピックブランチを使わないで実装を行ったのですが、結論として**タスクごとに分けるべき**です。理由としては上記にある通り、名前で判断できず、メンバーがやっていることがブラックボックス化してしまいました。。。
必ずこの作業を実施すべきです！
K8sにおけるHAとMicroK8sでのHA構成

# K8sにおけるHA構成とは？
## HAとは
High Availability(=高可用性)の略称
高可用性=システムが継続利用可能な状態

K8sには，Podのオートヒーリング機能がありPodが異常終了した場合でも自動的に復元してくれる機能がある．
しかし，Masterノードが落ちてしまうとクラスタの機能が停止してしまうのですべてのノードにMaster兼Workerの機能を持たせるのがK8sにおけるHA構成

シングルノードで動くMicroK8sを3台以上のノードでクラスタを構築すると自動的にHA構成をしてくれるようにアップデートされた．

# MicroK8s
https://microk8s.io/docs

<img width="1025" alt="image.png (23.5 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/06/08/60999/4ded2c13-2f2e-4e6e-bc13-c778a6b25f0e.png">

### クラスタに用いる環境
- Ubuntu 20.04 × 3 (ark-1,2,3)
    - CPU 4
    - メモリ 4GB
    - HDD 40GB
    - MicroK8s ver.1.21

#### install
MicroK8sのインストール
sudo snap install microk8s --classic --channel=1.21

Userがcdslの場合
グループに追加
sudo usermod -a -G microk8s cdsl
sudo chown -f -R cdsl ~/.kube

#### MicroK8sのHA(High Availability)構成
microk8s add-node

<img width="1077" alt="image.png (16.6 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/06/08/60999/305813d0-d59d-4c75-8e08-6f264dbdea5b.png">

トークンが生成されたコマンドが出力
microk8s join 192.168.100.77:25000/0055a33743542de02896e851411aeb46/e8fd0615ca6c

別ノード(ark-2,3)に
<img width="777" alt="image.png (8.2 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/06/08/60999/2b062b53-d375-4bd0-a792-48fb7b2e1d50.png">

<img width="492" alt="image.png (7.8 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/06/08/60999/011efb6f-0bb2-40a3-8ae2-9001f025d101.png">

<img width="749" alt="image.png (7.3 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/06/08/60999/7f8605f1-5455-42e5-8dce-e527120b729f.png">
webについての概要。

##webとは
英語ではクモの巣という意味です。
正式名称はWorld Wide Webです。
これは世界規模のクモの巣という意味で
その名の通り世界規模でクモの巣のように張りめぐらせれてる状態（仕組み）のことです。

概念的には、
インターネットを使ってwebページをつなぎ合わせた**仕組み**のことをいいます。
ここで大切なのはwebというのは仕組みのことだとまず理解しておくことだと思います。

では、何が張り巡らされているのでしょうか？
答えはwebページです。

##webページとは
webページとは画像や文章などの情報が表示されている文章の最小単位のことです。
そしてwebページが集まってできたものがwebサイトとなります。
webサイトとはwebベージを置く敷地（site）のことです。
イメージとしては家（webサイト）の中にたくさんの家具（webページ）が置いてあるイメージです。

###webページを繋ぐもの
またwebページとwebページをつなぐ役割をしているのがハイパーリンクです。これも英語の語源（hyper link）である、超越したリンクという意味の通りリンクという通路によって自分の領域を超えるというイメージです。そしてハイパーリンクが含まれている文章のことをハイパーテキスト（超越した文章）と言います。
ハイパテキストが線だとしたら、ハイパーリンクはその中の導線のようなイメージです。
例えばhttps://ja.wikipedia.org/wiki/オリーブ・オイル
という上の文字はオリーブオイルのwikipediaに飛ぶ文章（ハイパーテキスト）で
そこからwikipediaに移動する矢印のことをハイパーリンクと言います。

##インターネットについて
しかし、ハイパーリンクでwebページ同士を繋いでもwebページからwebページへは行き来することはできません。ではどうすればいいのでしょうか。
ハイパーリンクで繋いだ線を行き来できるようにしたのが**インターネット**です。
インターネットは、世界中のコンピュータなどの情報機器を接続するネットワークのことで、インターネットによって様々な通信のやりとりを行うことができます。

また、インターネット上でのコンピューター同士の通信はTCP/IP（規約やルールのようなもの）によって確立されています。
詳しくはこちらの記事をどうぞ。

https://qiita.com/ryutake459/items/a880c0c8a2ca89374a16



##＋α
webページはHTML（HyperText Markup Language）やCSS（Cascading Style Sheets）、JavaScriptなどで構成されています。



##まとめ
webページはこのようにしてさまざまな要素が組み合わさってできた仕組みなのです。
[シリーズ 全10回] PowerShell実践例

# はじめに

Windows PC で PowerShell を使って CI (自動テスト)を実現したときのコード抜粋です.

自宅で検討したコードを職場でも転用しているので、コード全文は載せられません.
そのため抜粋して載せています.

|コンテンツ|掲載時期|
|:--|:--|
|[[10] PowerShell実践例 ... GUIアプリケーションを画面上の指定位置に移動させる](https://qiita.com/robozushi10/items/9ba681d072b137c85b26)|2021/08|
|[[09] PowerShell実践例 ... プロセス情報から実行ファイル置き場を特定する](https://qiita.com/robozushi10/items/9ec506d9fb14aff7f14b)|2021/07|
|[[08] PowerShell実践例 ... 複数のPowerShellスクリプトを並列実行する](https://qiita.com/robozushi10/items/bf3b999bf3f07b74eafe)|2021/07|
|[[07] PowerShell実践例 ... GUIアプリの消極的自動操作](https://qiita.com/robozushi10/items/19c55f6eee158663ca4a)|2021/07|
|[[06] PowerShell実践例 ... curlコマンド](https://qiita.com/robozushi10/items/474d82d9b6b537fc6081)|2021/07|
|[[05] PowerShell実践例 ... デバッグ情報を充実させる](https://qiita.com/robozushi10/items/57cd1cf52b38b0173a19)|2021/07|
|[[04] PowerShell実践例 ... エラー終了させたい場合は素直に例外を使う](https://qiita.com/robozushi10/items/71bdcbcfda44acb7ea11)|2021/07|
|[[03] PowerShell実践例 ... 自動対話処理プログラム](https://qiita.com/robozushi10/items/2d9294bba85e86b04df4)|2021/07|
|[[02] PowerShell実践例 ... Samba 認証の自動化](https://qiita.com/robozushi10/items/4b5cca2e91b19bee86b2)|2021/07|
|[[01] PowerShell実践例 ... OpenJDK のインストーラを作ろう](https://qiita.com/robozushi10/items/00e956e50bf42effac54)|2021/07|
DBFluteハンズオン用データベースをDocker composeで起動する

# 目的

DBFluteハンズオン用データベースの構築を簡単にするため、Docker composeでMySQLを構築する方法をメモしておきます

http://dbflute.seasar.org/ja/tutorial/handson/section01.html#mysql

# 環境
MacBook Pro 2019年モデル。
CPUはIntel Core i9, OSはMac OS Catalinaです。

M1 MacでもBig SurでもないのでDockerの利用には特に問題ない状態です。

# 作ったもの
`docker-compose.yml` 

```yaml
version: '3.1'

services:

  db:
    image: mysql:8.0.26
    restart: always
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      MYSQL_TCP_PORT: 43376
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
      - ./mysql/data:/var/lib/mysql
    ports:
      - 43376:43376
```

## ポイント
DBFluteハンズオンに合わせた設定をしています

### docker-compose.ymlの配置先
DBFluteハンズオンのMySQL配置先は `dbflute-hands-on/localdb/mysql` 直下にしました。

Docker composeの慣例的にはプロジェクトルート直下が多い気がします。

### MySQLのポートを43376に変更
`MYSQL_TCP_PORT: 43376` と `ports: - 43376:43376` の部分

共通化のため実際は　`.env` に設定したほうがいいでしょう。今回はハードコードしています

### ハンズオン用のmy.cnfを読み込む
MySQLのDockerイメージの公式を参考に指定しています

### データフォルダを指定
`data` フォルダを作成して `localdb/mysql/data` を指定

### rootユーザのパスワードはいったんなしで
`MYSQL_ALLOW_EMPTY_PASSWORD: "yes"`

パスワードは必須の方が良いのでしょうが、初期構築上なしにしています


# 参考
- https://hub.docker.com/_/mysql
- https://dev.mysql.com/doc/refman/8.0/en/setting-environment-variables.html
モデルの作成・削除、カラムの追加・削除の仕方　[Ruby on Rails]

##データベース、テーブル、カラム、レコードの意味
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798471/f4271fe8-2fa0-f954-481c-e56cf7990b8d.png)
この画像にない**モデル**は、テータベースの設計図であり、テーブルの総称と考えていいでしょう。

>引用 : [Railsにおけるモデルについて](https://qiita.com/okamoto_ryo/items/f6be7ecc5cf5988c5773)


##モデル（テーブル）の作成

```ruby:terminal
$ rails generate model [モデル名] [カラム名:データ型 カラム名:データ型・・・] [オプション]
$ rails generate model User name:string email:string
#最後忘れずに更新
$ rails db:migrate
```
コマンドを実行すると以下の4つが自動生成されます。
・モデルのクラスファイル
・マイグレーションファイル
・モデルの自動テスト
・モデルの自動テストで使うfictureファイル
###データ型の種類
string : 文字列
text : 長い文字列
integer : 整数
decimal : 小数
datetime : 日時
binary : バイナリデータ
boolean : Boolean
##モデル（テーブル）の削除

```ruby:terminal
$ rails destroy model [モデル名]
$ rails destroy model User
#最後忘れずに更新
$ rails db:migrate
```
##カラムの追加
```ruby:terminal
#モデル名が複数形
$ rails g migration Addカラム名Toモデル名s　カラム名:データ型
$ rails generate migration AddNicknameToUsers nickname:string
#最後忘れずに更新
$ rails db:migrate
```
##カラムの削除
```ruby:terminal
#モデル名が複数形
$ rails generate migration Removeカラム名Fromモデル名s カラム名:データ型
$ rails generate migration RemoveNameFromUsers name:string
#最後忘れずに更新
$ rails db:migrate
```

>引用 : [Rails /テーブル作成、カラムの追加や削除[備忘録]](https://qiita.com/Toshimatu/items/66a7eefbae36e2fea8e5)
ExchangeからのAD産配布グループの見え方


#前書き
初回記事に続き、需要がないであろうメモ書き

ADで作成した配布グループのスキーマ値についてが主題
メモ書きといいつつ、仕様についてわかっていない点の方が多いので、
情報お持ちの方がいればご教示いただけると助かります。

#検証環境説明

AD機能レベル：Windows Server2016
Exchangeサーバ(メールボックスサーバ)：Exchange Server2016

#属性値確認
AD上で作成した配布グループがExchange管理センターで表示されてなかったから、
Exchange上で作成した配布グループと値を比べてみた。
※ADで作成した配布グループはGUIで作成、作成後メールアドレス手動入力
　値についても全て載せると膨大なため、一部のみ抜粋

ADで作成した配布グループ

    get-adgroup Distribution_fromAD -property *
    DisplayName                     : 
    DistinguishedName               : CN=Distribution_fromAD,OU=Maillist,DC=test,DC=local
    dSCorePropagationData           : {1/1/1601 9:00:00 AM}
    GroupCategory                   : Distribution
    GroupScope                      : Universal
    groupType                       : 8
    instanceType                    : 4
    mail                            : Distribution_fromAD@test.local
    ObjectCategory                  : CN=Group,CN=Schema,CN=Configuration,DC=test,DC=local
    ObjectClass                     : groupe
    SamAccountName                  : Distribution_fromAD
    sAMAccountType                  : 268435457

Exchange(メールボックスサーバ)で作成した配布グループ

    get-adgroup Distribution_fromMBX -property *
    DisplayName                           : Distribution_fromMBX
    DistinguishedName                     : CN=Distribution_fromMBX,OU=Maillist,DC=test,DC=local
    GroupCategory                         : Distribution
    GroupScope                            : Universal
    mail                                  : Distribution_fromMBX@test.local
    mailNickname                          : Distribution_fromMBX
    msExchArbitrationMailbox              : CN=SystemMailbox{1f05a927-fcfb-4d6d-b8eb-318bbefe03af},CN=Users,DC=test,DC=local
    Name                                  : Distribution_fromMBX
    ObjectClass                           : group
    proxyAddresses                        : {SMTP:Distribution_fromMBX@test.local}
    reportToOriginator                    : True
    SamAccountName                        : Distribution_fromMBX
    sAMAccountType                        : 268435457


msExch~は省略したけど実際にはもっと多くの属性値があった

AD産配布グループのDisplaynameとmailNicknameが未定義だったのが気になったので、
値を入れてみたところExchange管理センター上に名前が表示されたことを確認
(とはいえ、メールアドレスは表示されておらず…
 proxyAddressesが臭いとは思いつつもどうせ利用できる状態ではないため放置)


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1799081/34ca5dad-e282-c04f-8ff1-3d5f5e68acd0.png)

#AD産配布グループについて
Exchangeは導入するにあたり、スキーマ拡張が必要で主にmsExch~あたりの属性値はデフォルトのADのスキーマにはない。
よって、AD上での配布グループ作成(手動/コマンド)はExchangeでの追加スキーマに対応していないと考えているけど、
あっているかは不明(ご存じの方いれば教えていただけると助かります)

New-Adgroupコマンドレットも調べてみたけど特に指定できる値はなかった。

じゃあ、AD上で配布グループ作れる意味ってあるのかって思って調べてみたところ、サーバの追加機能にSMTPサーバがあることを発見
(Exchangeしか使ってなかったら気づかなかったよ…)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1799081/15102aa8-91d5-aa11-e3f9-8b6b24c58b10.png)


#後書き
WindowsサーバでSMTP機能使ったことないから暇があれば手を出してみようかと思っています。
OSやシステム志向の考えは卒業してもっと広い視点でものを見られるようになりたいと改めて思った。

メールボックスはADのアカウント参照して作れるのにメーリスはExchange上でADの配布グループを参照できないのはなんでなんだろうか。
(2019だと対応済みだったりする?)

#参考
https://docs.microsoft.com/en-us/powershell/module/activedirectory/new-adgroup?view=windowsserver2019-ps
ML-AgentsをMacbook M1(Apple Silicon)インストール時にエラー起きたときの対処法

Macbook M1 で先駆者の記事を参考にML-Agentsを導入しようとしたら、ライブラリインストール時にエラーが出ました。そのエラーにどんな対処したかの備忘録になります。
サンプル(3Dball)を動かすところまでしか試していません。

# TL;DR
- `grpcio`, `h5py`ライブラリをcondaでインストール
- PyTorch 1.8.0をインストール

# 最終目的
ML-Agents Release 18のインストールを行う。
その後、ML-AgentsのサンプルScene（Ball）の学習済みモデルでの推論、学習を行う。

# 自分の環境
- Macbook Air (M1, 2020)
- macOS Big Sur ver11.2.2
- Python 3.8.x (miniforgeで導入 参考: https://zenn.dev/karaage0703/articles/f3254b14898b4d)

# ML-Agentインストール手順
基本的には公式ドキュメントに従っていた。
https://github.com/Unity-Technologies/ml-agents/blob/release_18_docs/docs/Installation.md

# エラー発生箇所 1
ML-Agents用のAnaconda仮想環境に、ml-agentsとml-agents-envsのインストールを実行したところエラー発生。
> Advanced: Local Installation for Development
If you intend to make modifications to mlagents or mlagents_envs, you should install the packages from the cloned repository rather than from PyPi. To do this, you will need to install mlagents and mlagents_envs separately. From the repository's root directory, run:

```
pip install torch -f https://download.pytorch.org/whl/torch_stable.html
pip install -e ./ml-agents-envs
pip install -e ./ml-agents
```

エラー文章は長文だったので省略します。grpcio、h5pyインストール時にエラーが発生しているようでした。

# エラー対処法 1
エラーが発生したライブラリをcondaでインストールしました。
pip, condaを混同して使っています。環境壊れる可能性があるので、もっといいやり方あれば教えて下さい。

```
conda install grpcio h5py
```

# エラー発生箇所 2
エラー発生箇所 1と同様。
エラー内容は、
> ERROR: Could not find a version that satisfies the requiremet torch<1.9.0,>=1.6.0(from mlagents)(from versions: 0.1.2, 0.1.2.post1, 0.1.2 post2, 1.9.0
ERROR: No matching distribution found for torch<1.9.0,>=1.6.0

# エラー対処法 2
原因はPyTorch1.9.0をインストールしていたからでした。
対処法はPyTorch 1.8.0をインストールすることです。自分はwheelファイルからインストールしました。

謎の先人によってwheelファイルが作成されているので、以下からダウンロードして`~/Downloads`に配置しましょう。
https://drive.google.com/file/d/1e-7R3tfyJqv0P4ijZOLDYOleAJ0JrGyJ/view

その後、以下のコマンドで既存のPyTorchをアンイストールして、PyTorch 1.8.0をインストールしましょう。

```
pip uninstall torch
pip install ~/Downloads/torch-1.8.0a0-cp38-cp38-macosx_11_0_arm64.whl
```

# 参考
https://zenn.dev/karaage0703/articles/4a1c9b1c5185d4
【Docker】docker-compose.yml以外のファイルを利用してコンテナ環境を作成する

# 概要
docker-composeを利用する際には、基本的に`docker-compose.yml`という名前のファイルを作成し、利用することが一般的。
ただ、複数のdocker-compose.ymlを利用するなど、場合によっては`docker-compose.yml`名前以外のファイルを利用したい場合が存在する。
今回は別名で作成したyamlを利用してdocker-composeを利用する方法を記載する

# 別名のyamlファイルを作成した場合

```bash
$ docker-compose -f ［別名のyamlファイル］［オプション］
```
今回は例として、`sample.yaml` という名前のファイルを作成したとする。
内容はdocker-composeと同じで以下の通り、

```yaml:sample.yaml
version: "2"
services: 
  svelte:
    image: node:lts-alpine
    tty: true
    ports: 
      - 5000:5000
    entrypoint: >
      sleep 86400
```

```bash
$ docker-compose -f sample.yaml up -d
```
LinuxとLpicについて

##とにかくほめる！マウントなしのLT会に登壇した理由

- LTをして見たかった為
- 前回のLT会で、勇気を出してスピーカーとして登壇した方がいて僕自身こんな風になりたいと思った為

--- 

###LinuxOSとは
- オペレーティングシステム (OS) の1つ
- OSとは人間で言うと脳と同じ様な物
- キーボードで打った文字をファイルやディスプレイに出力したりなどの役割(ハードウェアを認識して使えるようにする)などをしている


---

##LinuxOSの種類（ディストリビューション)
Unixを参考に作られたLinuxはオープンソース（コードの中が自由に見れる）ソフトとして広まリました

- CentOSとUbuntu(ウブンツとかウブンチュと呼んだりします)の二つがよく使われます
- CentOSは、RedHat社が開発しているOSです
- UbuntuはDebianはボランティアが中心になって開発を進めているOSです
- いっぱいありすぎて、全部書き切れないくらい種類が多いです

CentOSとUbuntuは、設定ファイルのある無しが違っていたり、パッケージ管理に使うコマンドが違ってたりと言う違いがあります。
LPICではこの二つのOSに関する話が出てきます。

---

###LPICとは

Linux Professional Institute Certificationの略
カナダに本部を置く非営利組織のLinux Professional Institute (LPI) が運営しているLinux技術者の認定資格試験の事

---

###LPICの種類(グレード)と内容

レベル1
実務で必要なLinuxの基本操作とシステム管理が行えることを認定する資格

レベル2
メールサーバ、Webサーバー、ファイルサーバー、DNSサーバなど、ネットワーク環境におけるLinuxサーバの設計と運用管理について

レベル3
300試験
Sambaを利用した、Linux、Windows、Unixが混在するシステムを設計、構築、運用・保守について

303試験
セキュリティレベルが高いコンピュータシステム（サーバ）の設計、構築、運用・保守について

304試験
クラウドコンピューティングシステムをはじめとした、仮想化技術や高可用性システムの設計、構築、運用・保守について

---

###LPICレベル1の内容








###101試験

- ハードウェアやLinuxの起動までの流れなどアーキテクチャに関する問題
- ハードディスクやブートマネージャーのインストール、パッケージ管理の問題
- コマンドライン操作やviによる基本的なファイル編集
- デバイス、Linuxファイルシステム、ファイルシステム階層標準
パーティションやファイルシステムの作成、リンクなどの問題

---

###102試験

- シェルスクリプト、およびデータ管理。シェルスクリプトやSQLの問題
- ユーザインターフェイスとデスクトップ。XWindowSystemやディスプレイマネージャの問題
- ユーザアカウント、ユーザが所属するグループの管理。処理の定期実行について
- システムの時刻設定やプリンター、メールの設定などの問題
- 基本的なネットワークの知識確認問題
- 基本的なセキュリティの確認問題

---

###レベル１の内容をざっくりと

- ハードウェア周りの問題
- サービスを実行する為のプログラム、設定ファイルなどを管理するパッケージ管理システムの問題
- いろんな処理を行うコマンドに関する問題
- ネットワーク、セキュリティの基本に関する問題

---

###GUIとCLI

ざっくりと説明

- GUI
Graphical User Interface(グラフィカルユーザーインターフェース) の略語
マウスでファイルやブラウザのアイコンをクリックするのがそう

- CLI
Command Line Interface(コマンドラインインターフェース)の略語
操作をコマンドによって行うのがそう


---

###なんでコマンドを使うのか

色々な理由があります！

- 複雑な処理をする際、GUIよりもCLIの方が簡単に処理が行える
- GUIの方がCLIよりも容量が大きいので、OSをインストールする際の速度が遅い
- セキュリティ的にGUIを使うとあまり良くなかったりする
v-forの中でv-onを使用する

#目次　
[1.はじめに](#1-はじめに)
[2.状況](#2-内容い)
[3.実際のコード](#3-内容ろ)
[4.おわりに](#5-おわりに)

#1. はじめに
v-forで使用する配列の中にv-onで使用したいメソッドを使用する方法がわかったのでまとめたいと思います。
#2. 状況
v-forの中にv-onのメソッドを使用したいと考えたのは以下のような状況があったからでした。
表示されたメニューにイベントを追加したいと考えました。


![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641519/922ad91d-8ca2-3a11-473d-2f53a4546562.gif)
[vuetify参照](https://vuetifyjs.com/ja/components/menus/)

#3. 実際のコード
```js
export default {
  data () {
    return {
      items: [
        { title: '編集', icon: 'mdi-pencil', action: 'edit' },
        { title: '削除', icon: 'mdi-delete', action: 'remove' }
      ]
    }
  }

```
通常上記のようなオブジェクトを用意してv-forを使用すると思います。今回は``action``にクリックされた時に発火するメソッドがあるとします。

```js
methods: {
    edit () {
      ・・・省略
    },
    remove () {
      ・・・省略
    },
    callAction (action) {
      this[action]
    },
```
① actionと同じ名前のmethodsを用意します
② callactionではブラケット記法で記載します

```js
         <v-list-item
              v-for="item in items"
              :key="item.text"
              link
              @click="callAction(item.action)"
```
③ callactionの引数としてitem.actionを設定する。
ブラケット記法ではドット記法では設定できない値も設定することが可能となっています。
[ブラケットとは](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors)
#4. おわりに
ドット記法しか使用したことがなかったので、ブラケット記法で簡単に解決できるとは知らずに悶々としていました。非常に勉強になりました。
[03] PowerShell実践例 ... 自動対話処理プログラム


|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/0b0605257ad39bc22895|


# はじめに

CI/CD のひとつとして、自動対話処理 (いわゆる expect 相当) を実装することになったので書き残しておく.

このとき、パラメータ定義ファイルに XML を用いた.
Python とは異なり、PowerShell は XML の取り扱いに優れているので併せて記しておく.



# 環境

```
Windows 10 Pro
PowerShell バージョン 6系
```


# プログラムについて

## 処理概要

次の 1 〜 5 の処理をするコードである.

```
1. 挙動パラメータを記した XML ファイルを読み込む.
2. 上記 1 のパラメータを使ってシリアルポートを開く (接続先は Linux 端末とする).
3. 上記 1 のパラメータを使ってシリアルポートにコマンド「ls -ltr」を書き込む.
4. 上記 3 のコマンド結果を読み出す.
5. 上記 4 で読み出した結果をコンソールとログファイルの2つに書き込む.
```

　

# コード

## config.xml

挙動パラメータを記した XML ファイルである.([^1],　[^2],　[^3])

```xml
<?xml version="1.0" encoding="UTF-8"?>
<MY>
  <COM>COM3</COM>    <!-- COM番号 -->
  <BPS>115200</BPS>  <!-- ボーレート -->
  <PRT>None</PRT>    <!-- パリティ-->
  <LEN>8</LEN>       <!-- データ長 -->
  <FLC>one</FLC>     <!-- フロー制御 -->
  <COMMAND>
    <EXEC>cd /tmp; echo 'EOL'</EXEC> <!--「EOL」が表示されたらコマンド終了と見なす -->
  </COMMAND>
  <COMMAND>
    <EXEC>ls -ltr; echo 'EOL' </EXEC> <!--「EOL」が表示されたらコマンド終了と見なす -->
  </COMMAND>
</MY>
```

　

## sample.ps1

下記🛑の「`^[`」と「`^M`」は制御文字である.

```perl
# XML ファイルを読み込む.
$XML    = [xml]( Get-Content config.xml )

# 「.」区切りで要素にアクセスする.
$COM    = $XML.MY.COM
$BPS    = $XML.MY.BPS
$PRT    = $XML.MY.PRT
$LEN    = $XML.MY.LEN
$FLC    = $XML.MY.FLC

# <COMMAND> が複数あるので、配列としてインデックスで指定する
$CMD    = [string] $XML.MY.COMMAND[1].EXEC

# シリアル端末の設定を取得する
$port= New-Object System.IO.Ports.SerialPort $COM,$BPS,$PRT,$LEN,$FLC

# ポートをすでに開いているか判定する. 多重で開こうとすると例外が起きる.
if( $port.IsOpen )
{
    Write-Host "エラー: すでにポート $COM は使用中であるか、あるいは存在しないポートです"
    exit $False
}

# シリアル端末にコマンド「ls -ltr」を入力して実行する. 
# $port.WriteLine の方が確実に改行コードの入力ができることもある.
$port.Write( $CMD + "`r")

# コマンド「ls -ltr」の実行結果を 1秒間隔で 1行ずつ読み出す
do
{
  # コマンド「ls -ltr」の実行結果を 1行読み出す
  $line = $port.Readline()
  # 🛑読み出したログに ANSI Color コードがあるとジャマなので削除する🛑
  $line = $line | % { $_ -replace '\[\d+(;\d+)?m' } | % { $_ -replace '^[' } | % { $_ -replace '^M' }
  # 今回は「EOL」という文字列が出たら、読み込み待ちを終了する
  if( $line -match "EOL" )
  {
    break
  }
  # 表示結果を log.txt に追加書き込みする
  $line | Out-File -Encoding Default -Append log.txt
  # ついでに標準エラーにも出力する (Bash での「echo "〜" 1>&2」に相当する)
  Write-Host "$line"
  # 1秒待機する
  Start-Sleep 1
}
while($line)

```

　

以上.

　

[^1]: 本コードのようにコメントを書くと、PowerShell 以外で解読できない事態に陥ったりする...
[^2]: 自分で定義した変数とわかるように大文字を使っているが, 好みで良いと思う.
[^3]: バグ回避のためにも $local:XML としてスコープを定義する方が良い. このままだと global である.
Nuxt.js and AWS AppSync with nuxt/axios module

Nuxt.js の Axiosモジュールを利用して、AWS AppSyncのAPIに接続する方法のメモです。

# 環境

* mac
* Nuxt.js
* @nuxt/axios
* AWS AppSync

# Nuxt.js 設定

## nuxt.config.js

```js
  plugins: [
    'plugins/axios'
  ],

  modules: [
    '@nuxtjs/axios',

  ],
```

## axios.js

```js
export default ({ $axios }) => {
  // request log
  $axios.onRequest((config) => {
    console.log(config)
  })
  // response log
  $axios.onResponse((config) => {
    console.log(config)
  })
  // error log
  $axios.onError((e) => {
    console.log(e.response)
  })
 }
```

# axios request

```javascript
<script>
  export default {
・・・
  	async asyncData({ $axios }) {
      const APIKEY = '<api-key>' // set API-KEY
      const header = { // set Header
        headers: {
          'Content-Type': 'Content-Type:application/graphql',
          'x-api-key': APIKEY,
        }
      } 
      const query = { // set Query
        query: `query {listNotes{records {id{value},name{value},description{value},owner{value}}}}`
      }
			const url = 'https://<graphql-api-endpoint>/graphql';
			const response = await $axios.$post(url, query, header)
      const posts = response.data.listNotes.records.map((k, i) => {
        return {
                index: i,
                id: k.id.value,
                name: k.name.value,
                description: k.description.value,
                owner: k.owner.value,
                }
      });
			return {
				posts: posts
			};
		}
  };
</script>
```

## ログ


```json
・・・
{
    "logType": "ResponseMapping",
    "path": [
        "listNotes"
    ],
    "fieldName": "listNotes",
・・・（略）
            "statusCode": 200,
            "body": "{\"records\":[{\"owner\":{\"type\":\"SINGLE_LINE_TEXT\",\"value\":\"user2\"},\"createdAt\":{\"type\":\"CREATED_TIME\",\"value\":\"2021-02-01T22:32:00Z\"},\"更新者\":{\"type\":\"MODIFIER\",\"value\":{\"code\":\"Administrator\",\"name\":\"Administrator\"}},\"作成者\":{\"type\":\"CREATOR\",\"value\":{\"code\":\"Administrator\",\"name\":\"Administrator\"}},\"name\":{\"type\":\"SINGLE_LINE_TEXT\",\"value\":\"2/1 やること\"},\"description\":
{\"code\":\"AdminUser\",\"name\":\"AdminUser\"}},\"作成者\":{\"type\":\"CREATOR\",\"value\":{\"code\":\"AdminUser\",\"name\":\"AdminUser\"}},\"name\":
・・・（略）
{\"type\":\"SINGLE_LINE_TEXT\",\"value\":\"1/10 やること\"},\"description\":{\"type\":\"SINGLE_LINE_TEXT\",\"value\":\"部屋の片付け\"},\"id\":{\"type\":\"RECORD_NUMBER\",\"value\":\"1\"},\"$revision\":{\"type\":\"__REVISION__\",\"value\":\"1\"},\"updatedAt\":{\"type\":\"UPDATED_TIME\",\"value\":\"2021-01-10T13:09:00Z\"},\"$id\":{\"type\":\"__ID__\",\"value\":\"1\"}}],\"totalCount\":null}"
        },
        "stash": {},
        "outErrors": []
    },
・・・
```


# 参考

https://axios.nuxtjs.org/
非線形でも相関を捉えられるMIC関数

本記事はQrunchに投稿していた記事の再掲になります。
そのため、本記事に類似して且つ詳しい記事がQiita上に存在するかもしれません。
悪しからず。

# 相関とは
一般的に相関と言われているのは、**ピアソンの相関**(以下、相関)。
相関は2つのデータの直線的な関連度合いを-1 ~ +1で表す。
[相関とは](http://mcn-www.jwu.ac.jp/~kuto/kogo_lab/psi-home/stat2000/DATA/09/03.HTM)
[相関の強さ](http://mcn-www.jwu.ac.jp/~kuto/kogo_lab/psi-home/stat2000/DATA/09/05.HTM)

以下のコードでは、一次関数に従い乱数を生成している。
グラフのプロットの通り、直線的な関係が見て取れる。

相関係数は0.96なので、かなり強い相関だといえる。

```python
import numpy as np
from matplotlib import pyplot as plt

# 乱数生成
x = np.random.normal(0,1, 1000)
noise = np.random.rand(1000)
y = (x + noise)

# グラフ描画
plt.scatter(x, y)
plt.show()

# 相関係数
print(np.corrcoef(x, y))
# 0.96...
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186515/ea560595-5cd0-d500-d674-4cbaab508032.png" width=50%>

# 相関のよくある勘違い
繰り返しだが、
相関は2つのデータの**直線的**な関連度合いを表す。
**相関 = 2つのデータの関連度合い**というのは**間違い**。

以下のコードでは、二次関数に従い乱数を生成している。
グラフのプロットの通り、直線的ではないが「xとyに関係があること」は見て取れる。
相関関係は0.06だった。

```python
import numpy as np
from matplotlib import pyplot as plt

# 乱数生成
x = np.random.normal(0,1, 1000)
noise = np.random.rand(1000)
y = x**2 + noise

# グラフ描画
plt.scatter(x, y)
plt.show()

# 相関係数
print(np.corrcoef(x, y))
# 0.06...
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186515/8f0ce8e1-25d8-08af-c205-6ad9410a6141.png" width=50%>

上述より、「相関係数が0に近い！このデータは関係性がないんだ！」と結論付けるのは危険ということがわかる。
[データの関係性を表せる「相関係数」と2つの落とし穴](https://www.nikkei-r.co.jp/glossary/id=1640)

ちなみに、[BMIと死亡リスク](https://epi.ncc.go.jp/can_prev/evaluation/2830.html)のグラフが同じような形らしい。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186515/8cfb5e7a-f433-6b92-c563-e2dcdcb19d2c.jpeg" width=50%>

# MIC相関
じゃあどうやって上記のような関連度合いを捉えるのか。

今回は**MIC相関**を使う。
MIC相関は21世紀に入ってから考案された手法で、
**非線形(直線的な関係じゃない)データの関連度合いも数値化できる**。

MIC相関はこちらがわかりやすい。
[新しい相関係数"MIC"の解説](https://www.slideshare.net/logics-of-blue/mic-31810194)

# PythonでMIC相関
Pythonなら簡単にMIC相関が使える。

MIC関数を使うにはminepyが必要。

```
pip install minepy
```

上述と同様に、二次関数に従い乱数を生成している。
MIC相関は0.75だった。

このようにMIC相関では**非線形(直線的な関係じゃない)データの関連度合いも数値化できる**。

```python
import numpy as np
from matplotlib import pyplot as plt
from minepy import MINE

# 乱数生成
x = np.random.normal(0,1, 1000)
noise = np.random.rand(1000)
y = x**2 + noise

# グラフ描画
plt.scatter(x, y)
plt.show()

# MIC相関
mine = MINE()
mine.compute_score(x, y)
print(mine.mic())
# 0.75...
```

# あとがき
MIC相関は手法の特性上ノイズに弱い。
非線形でも関連性を捉えられるが、sin波のように周期的なデータには弱い。
OpenFOAM 9 チュートリアルケースの動作確認 : 多相流体、interFoam、ダムブレイク（RAS）

# ケース
$FOAM_TUTORIALS/multiphase/interFoam/RAS/damBreak/damBreak

# 概要
このチュートリアルケースでは、interFoam を用いて、単純化したダムブレイク（水柱の崩壊）の2次元問題を解きます。解析領域の天井は開放されているものとし、壁面はすべり無し（noSlip）条件とします。

# 解析モデル
解析モデルを下図に示します。
![damBreakModel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/5b33a675-1b74-4512-d090-2e2330b75064.png)

# 解析条件
解析条件を下表に示します。

|項目1|項目2|項目3|単位|設定内容|
|---|---|---|:-:|:-:|
|_system_|_controlDict_|開始時刻|sec|0|
|   |   |終了時刻|sec|1|
|   |   |$\Delta$ _t_|sec|自動調整|
|   |   |最大$\Delta$ _t_|sec|1|
|   |   |最大_Co_|-|1|
|_constant_|_transportProperties_|水の動粘性係数 $\nu$|m2/s|1e-06|
|   |   |水の密度 $\rho$|kg/m3|1000|
|   |   |空気の動粘性係数 $\nu$|m2/s|1.48e-05|
|   |   |空気の密度 $\rho$|kg/m3|1|
|   |   |表面張力 $\sigma$|N/m|0.07|
|   |_g_|重力加速度ベクトル|m/s2|(0 -9.81 0)|
|   |_momentumTransport_|シミュレーション型|-|RAS|
|   |   |モデル|-|_k-$\epsilon$_ モデル|

# 解析結果
解析結果を以下に示します。
![animation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784513/9f3d6b48-bc24-ce29-4894-b410109d958c.png)

# 実行コマンド
前処理 (Pre-processing)
`run`
`cp -r $FOAM_TUTORIALS/multiphase/interFoam/RAS/damBreak/damBreak .`
`cd damBreak`
メッシュ作成
`blockMesh`
alpha.water 場の設定
`setFields`
アプリケーションの実行
`interFoam`
後処理 (Post-processing)
`paraFoam`

# 計算時間
3.37 (sec), シングル, AMD Ryzen 7 3750H with Radeon Vega Mobile Gfx

# 参照
- [XSim](https://www.xsim.info/articles/OpenFOAM/tutorials/multiphase-interFoam-ras-damBreak.html)
Lightsail 上の WordPress に Redis Cache を導入する

# はじめに

Lightsail 上の WordPress に Redis Object Cache を導入する。

Object Cache を導入すると、サイト表示が早くなるらしい。

# 環境

動作環境は以下の通り。

```bash
Linux ip-■■■-■■■-■■■ 4.19.0-17-cloud-amd64 #1 SMP Debian 4.19.194-3 (2021-07-18) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
       ___ _ _                   _
      | _ |_) |_ _ _  __ _ _ __ (_)
      | _ \ |  _| ' \/ _` | '  \| |
      |___/_|\__|_|_|\__,_|_|_|_|_|
  
  *** Welcome to the Bitnami WordPress 5.6.1-1                     ***
```

# 手順

## redis-server 導入

Lightsail のインスタンス画面から、ターミナルのアイコンをクリックして、Webuターミナルを起動する。

![20210725-211018-Lightsail.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/497938de-5233-895b-e69c-d50b333b08b2.jpeg)

redis-server をインストールする。

```bash
sudo apt update -y
sudo apt install redis-server -y
```

redis-server を起動する。

```bash
sudo systemctl start redis-server
```

## Redis Object Cache プラグインの導入

プラグインの新規追加画面でRedis Object Cache を選択。

![20210725-210833-プラグインを追加 ‹ Space Software Portal — WordPress.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/69e307b5-af23-fc59-b842-f073d50ddb80.jpeg)

左下の【Enable Object Cache】ボタンをクリック。

![20210725-210854-Redis Object Cache ‹ Space Software Portal — WordPress.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/6e03b653-a8c5-c8a2-f64f-f024ac0fc7aa.jpeg)

【Status】が 【Connected】になったことを確認する。

![20210725-210921-Redis Object Cache ‹ Space Software Portal — WordPress.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/49388aff-63d2-1f14-00d5-501ea09c5279.jpeg)


# 参考サイト

https://8091.info/installing-redis-local-on-nginx-wordpress-lightsail/

https://web-geek-site.com/wp%E3%81%A7%E3%80%8C%E6%B0%B8%E7%B6%9A%E7%9A%84%E3%81%AA%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AF%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%95/
IoTセキュリティについて

IoTシステムを安全・安心に構築・運用するためのIoTセキュリティについて記載する。

##IoTにおけるセキュリティリスク
IoTシステムは下記のハードウェアからなる。
・IoTデバイス
・IoTゲートウェイ
・IoTサーバ

IoTのセキュリティリスクには下記がある。
・webインタフェースの脆弱性
・パーソナルデータの保有
・データ送受信時の暗号化
・パスワードの脆弱性

##セーフティとセキュリティ
誤作動や事故により人や環境に被害を与えないよう、安全性を高める配慮する設計の考え方をセーフティ設計という。
セキュリティ脅威は機器やシステムへの不正アクセス、データ改ざん等による誤作動や予期しない停止についての脅威である。
人、物、金、情報で考えた時にセーフティは人、物を対象とし、セキュリティでは情報、金を対象とする。

##情報セキュリティの分類
情報セキュリティは一般に物理セキュリティと論理セキュリティに分類される。

| セキュリティ種別  | 内容 |
|:----------------:|:---|
| 物理セキュリティ  |防災、防犯、データバックアップ、電源供給、通信回線|
| 論理セキュリティ  |システムセキュリティ、人的セキュリティ|

##情報セキュリティの要件
情報セキュリティを満たすための３大要件には下記がある。

| 要件 | 内容 |
|:-:|:-:|
|機密性   |Confidentiality|
|完全性   |Integrity   |
|可用性   |Availability   |

##リスクへの対処
システムのリスクに対する対処方法として、「発生のしやすさ」と「被害の深刻さ」を尺度に挙げることができる。これら２つの尺度を元に下記の対処方法がある。
①リスクの回避
②リスクの保有
③リスクの移転
④リスクの低減

##セキュリティ対策技術
下記の対策技術がある。
・認証
・暗号化
・デジタル署名
・耐タンバー性
・アクセス制御
・侵入検知
・ログ/監視

##IoTシステムのセキュリティ対策
・耐タンバー性
・セキュアブート
・ファイアウォール
・侵入検知システム、侵入防御システム
・WAF(Web Application Firewall)
・VPN(Virtual Private Network)
・マルウェア対策
・無線LANの暗号化技術

| 対策 | 内容 |
|:--|:--|
| 耐タンバー性  |物理的にデバイスを盗まれたときや不正なアクセスを受けたときに内部データやソフトウェアに対する解析の困難にさせる。   |
| セキュアブート  |電源投入時にデバイス内のソフトウェアが正規品であるかどうかを検証し、問題無ければ起動を許可し、あらかじめデジタル署名を保持したソフトウェアのみ実行できるようにする。   |
| ファイアウォール  |インターネット側からの不正なアクセスを防御するネットワーク機器。   |
| 侵入検知システム、侵入防御システム  |多数のパターンをデータベースとして持ち、通信路を監視して攻撃をリアルタイムに検知するシステム。   |
| WAF(Web Application Firewall)  |WAFはWebアプリケーションにおいてHTTP通信等を分析し、攻撃を検知・防御する。   |
| VPN(Virtual Private Network)  |暗号化処理などを行い仮想的なプライベートネットワーク実現する。   |
| マルウェア対策  |マルウェアの特徴をデータベース化(パターンファイル化)し、同一または類似しているファイルをマルウェアとして検出する。   |
| 無線LANの暗号化技術  | WEP、WPA、WPA2等の暗号化技術がある。  |
Ruby-FFIで構造体のビットフィールド(bit field)を読み書きできるgemをつくりました

# はじめに

## Ruby-FFI とは

Ruby-FFIは`libffi`を使ってRubyでC言語のライブラリのバインディングを作成する有力なツールです。

https://github.com/ffi/ffi

## Ruby-FFI はビットフィールド未対応だった

しかし、2021年7月現在、Ruby-FFIは構造体のビットフィールドをサポートしていません。ビットフィールド未対応であることは[Wikiにも記載](https://github.com/ffi/ffi/wiki/Features-at-a-Glance)されていますし、[issue](https://github.com/ffi/ffi/issues/874)で開発者の方にも直接確認して、たしかに対応していないという返事をいただきました。

筆者の見聞によるとC言語の ビットフィールドへのサポートが進んでいないのはRuby言語に限った話ではないので、ある意味仕方がないことではあります。もしもビットフィールドが一部に使われているだけであれば、その都度カスタムメソッドを用意すれば十分だと思います。しかしターゲットとしているC言語のライブラリのあちこちでビットフィールドが利用されているとなるとその都度カスタムのメソッドを用意するのはとても手間がかかります。gemを作成して一気に解決したくなります。

私は [ruby-htslib](https://github.com/kojix2/ruby-htslib) というバイオインフォマティックス関連のバインディングを作成しています。htslibはライブラリ全体でビットフィールドが多用されているためビットフィールドへの対応が避けられません。しかし、大量のカスタムメソッドを書くのはなんとかして避けたいと思いました。

# ffi-bitfield GEMを作った

そこで、Ruby-FFIでビットフィールドを扱うためのgemを作成しました。

https://github.com/kojix2/ffi-bitfield

ビット演算については全然わからなかったので、ウンウン数時間かけて考えてなんとか初歩的な部分を理解しました。それでも自力で効率的なコードを書くことはできなかったので、Ruby-JPのslackに質問したり、スタックオーバーフローに質問したりしてほかの人にコードを書いてもらいました。こういうときにインターネットのコミュニティーは本当に頼りになると思います。

実装はピュアRubyで書かれており、`[]=` メソッドや `[]` メソッドを挙動を変更するようになっています。C言語やFFIのレベルでどうこうするものではありません。

## インストール

FFI以外の依存は特にありません。

```sh
gem install ffi-bitfield
```

## 使い方

`require 'bit_structs` とすると `FFI::BitStruct` と `FFI::ManagedBitStruct` が使えるようになります。

```ruby
require 'ffi/bit_structs'
require 'ffi/bit_struct'         # FFI::BitStruct        だけ使いたいとき
require 'ffi/managed_bit_struct' # FFI::ManagedBitStruct だけ使いたいとき
```

構造体とビットフィールドは次のような感じで定義します。
`bit_field` と `bit_fields` は同じ挙動で、メソッドの別名です。

```ruby
require 'ffi/bit_struct'

class Struct1 < FFI::BitStruct
  layout \
    :a, :uint8,
    :b, :uint8

    bit_fields :a,
               :a0, 1,
               :a1, 1,
               :a2, 1,
               :a3, 1,
               :a4, 1,
               :a5, 1,
               :a6, 1,
               :a7, 1

    bit_fields :b,
               :b0, 1,
               :b1, 1,
               :b2, 2,
               :b3, 4
end
```

あとは普通のRuby-FFIと全く同じです。

```ruby
a = Struct1.new
```

読み込むときは

```ruby
p a[:a0]
```

書き込むときは

```ruby
a[:a0] = 1
```

とします。

一応テストもちょこっと書いたので、通常の用途ではほとんど問題なく使えると思います。

## バグを見つけたらぜひ報告ください!

しかしなにぶん苦手な分野ですので、コーナーケースでは、ひょっとするとまだまだバグが残っているかも知れません。
もしもおかしな挙動を発見した方は[githubのissue欄](https://github.com/kojix2/ffi-bitfield/issues)にぜひ報告してください。
作者としては**大変助かります**。

気持ちとしてはお礼の品を差し上げたいぐらいですが、そういうわけにもいかないので、そのかわりに幸せな気持ちになるハトのgif画像を貼っておきます。
![pigeon.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/b107e508-a8f1-6a4a-ea22-4f16fa281b1d.gif)

この記事は以上です。
【CSS】画像の位置を調整する

# img画像の縦横比を維持したままトリミングする
```exampl.html
<div>
  <img src="*******" class="img">
</div>
```

```example.module.scss
div {
  width: 100px;
  height: 100px;
  img {
    width: 100%;
    height: 100%;
    object-fit: cover;  
    object-position: 0% -10%;  //数値は例えです 
  }
}

```

`object-fit: cover`
`object-position: 横の位置 縦の位置 // ` 

この２つを設定することで、画像の縦横比を維持したまま画像をトリミングできます。

https://www.webcreatorbox.com/tech/object-fit

こちらの記事が参考になりました。