OmniAICreator/Qiita-1.07M huggingface dataset:
cisco Meraki MR42のOpenWrt化の手順

※[「Standard installation via UART」](https://openwrt.org/toh/meraki/mr42#standard_installation_via_uart)に記載されていない内容を中心に補足する。

- 必要なパッケージ
sudo apt install python3-pip
sudo pip pyserial

- Serial制御ソフトの設定
sudo minicom -s
/dev/ttyUSB0
ハードウェア制御　なし

- u-bootをメモリにuploadする。
sudo python3 ubootwrite.py --write=mr42_u-boot.bin
待機状態になるので、mr42の電源をONすると自動的にuploadする。
20分ぐらい時間がかかるので、気長に待つ。

- Ethernetの10Mb half設定
Full-duplex -> half duplex に変更する。

```bash:コマンド
(YOWIE)# mii dump 0x02                                                          0.     (3100)                 -- PHY control register --                        
  (8000:0000) 0.15    =     0    reset                                          
  (4000:0000) 0.14    =     0    loopback                                       
  (2040:2000) 0. 6,13 =   b01    speed selection = 100 Mbps                     
  (1000:1000) 0.12    =     1    A/N enable                                     
  (0800:0000) 0.11    =     0    power-down                                     
  (0400:0000) 0.10    =     0    isolate                                        
  (0200:0000) 0. 9    =     0    restart A/N                                    
  (0100:0100) 0. 8    =     1    duplex = full                                  
  (0080:0000) 0. 7    =     0    collision test enable                          
  (003f:0000) 0. 5- 0 =     0    (reserved)                                     
(YOWIE)# mii read 0x02 0                                                        
3100                                                                      
(YOWIE)# mii write 0x02 0 3000                                                  
(YOWIE)# mii info                                                               
PHY 0x02: OUI = 0x1374, Model = 0x07, Rev = 0x04,  10baseT, HDX                 
```
- 疎通確認
(YOWIE)# ping 192.168.1.250                                                     
Using eth0 device                                                               
host 192.168.1.250 is alive                                                     
(YOWIE)# 
- 起動
run bootcmd

initramfsで起動
openwrt-ipq806x-generic-meraki_mr42-initramfs-fit-uImage.itb

- u-bootをflashに書き込む
```bash
insmod mtd-rw i_want_a_brick=1
mtd erase /dev/mtd8
nandwrite -pam /dev/mtd8 /root/mr42_u-boot.mbn
```

- http://192.168.1.1 upgradeファームに変更

- /etc/config/network を以下の様にdhcp取得に変更
```bash
config interface 'lan'
	option device 'br-lan'
	option proto 'dhcp'
```
- webインターフェースの有効化
opkg update
opkg install luci
100日後くらいに個人開発するぞ！day070

## 今日は配列の変数を使った一覧ページの表示をやってみた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/506e5ce2-15e6-d404-2662-50a4cfff8f6b.png)

## 今日の学び

### viewファイル内で変数を定義して表示する
* erbファイルでは`＜% %＞`で囲むことでHTMLファイル内にRubyのコードを記述できる
    * erbは「Embedded Ruby(埋め込みRuby)」の略
* 埋め込んだRuby Codeをブラウザに表示したい場合は`<%=変数%>`を用いる

### <%%>と<%=%>
* `<%%>`の場合は何も表示されないので変数の定義などに用いる
* `<%=%>`はRubyコードの中身が表示されるので変数の値などを表示したい場合に用いる


### 投稿データを入れる配列
* コンマで要素を区切ることで複数の要素を配列に代入できる
    * 例：変数postsに複数のデータを入れる
        * `<%`
        * `posts=[`
        * `"文字列1",`
        * `"文字列2",`
        * `"文字列3",`
        * `…`
        * `]`
        * `%>`


### each文を使った複数データの表示
* each文を使って配列postsから要素を1つずつ取り出して変数postに代入し表示する
    * postsの要素の数だけeach文の中身が実行されるので投稿の数だけHTMLを書く必要がなくなる
* 例：配列posts内の複数データを表示をする
    * `<% posts.each do |post| %>`
    * ` <div class = "posts-index-item">`
    * `  <%= post %>`
    * ` </div>`
    * `<% end %>`

### 変数をアクションで定義する
* `def index`と`end`の間で変数を定義することで変数を「index.html.erb」内で使用することができる
    * 変数は「@」をつける


### @変数
* 通常はアクションで定義した変数をビューで使用できない
* 変数名を「@」から始めることでビューでも使用できる
HTTP, WebSocket混在のプロキシサーバに個別の証明書を適用する方法（node-http-proxy）

タイトル通りです


自作アプリ内でHTTPとWebSocketのリクエストを[node-http-proxy](https://github.com/http-party/node-http-proxy)のプロキシサーバで振り分けていて、HTTPにしか証明書を適用しなくても動いていたのが、いつからか動かなくなった（Appleのポリシー変更？）ため、対応した内容を書きます。

ネットにある情報で上手くいかなくて苦労しましたが、
肝心なのはSNICallbackの第二引数で制御することでした

後はコードでご確認ください

```
var httpProxy = require('http-proxy');
var https = require('https');
var tls = require("tls");
var fs = require('fs');

var normalProxy = new httpProxy.createProxyServer({
    target: {
        host: 'localhost',
        port: 8080,
    }
});

var webSocketProxy = new httpProxy.createProxyServer({
    target: {
        host: 'localhost',
        port: 3000,
    }
});

var certs = {
	  "exsample.com": tls.createSecureContext({
                  key: fs.readFileSync('xxx.key', 'utf8'),
                  cert: fs.readFileSync('xxx.cer', 'utf8'),//fullchain
		        }),
	  "ws.exsample": tls.createSecureContext({
		          key: fs.readFileSync('xxx.key', 'utf8'),
		          cert: fs.readFileSync('xxx.cer', 'utf8'),//fullchain
		    })
};

var options = {
    SNICallback: function(hostname, cb){
        var ctx = certs[hostname];
        //このif文が必要だった
        if (cb) {
           cb(null, ctx);
        } else {
           return ctx;
        }
    },
    hostnameOnly: true,
	key: fs.readFileSync('xxx.key', 'utf8'),
	cert: fs.readFileSync('xxx.cer', 'utf8'),

};

var server = https.createServer(options, function(req, res) {
    
    if (req.headers.host == 'exsample.com') {
        normalProxy.web( req, res );
    } else if (req.headers.host == 'ws.exsample') {
        webSocketProxy.web( req, res );
    } else {
        res.writeHead(404);
        res.end();
        return;
    }

});

server.on( 'upgrade', function( req, socket, head ) {
    webSocketProxy.ws( req, socket, head );
});

```
pic32mx_usb_i2sの512fsとEC対応

Microbridgeのテストも兼ねて[pic32mx_usb_i2s](https://github.com/yamori813/pic32mx_usb_i2s/tree/0660f0419db08beab2e88a20352a74eed42ece9e)を久しぶりにいじってみました。

二つコミットありますが、一つ目が512fs対応です。AN1422を久しぶりに見直したところ、512fs対応が簡単にできることに気がついて実装してみました。

DIP SWで256fs/512fsを切り替えられるようにしました。

細かい説明はしませんので、コードを見てください。

もう一つが外部クロック対応です。OSC1にFOXのTCXO 12Mをつないで見ました。

周波数カウンターで見ると明らかに正確なことが分かります。

![IMGP0015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/c5ec2015-790c-c443-59e3-7ba9adcc0420.jpeg)

上記は再生してない状態で、再生を始めると、かなりゆれます。

開発ボードのDM320014も外部クロック12Mでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/dcf5358f-42d5-02e6-4584-fe4118bdb290.png)

PIC32MXは4Mの倍数の外部クロックが使え、FOXのTCXOは入手が難しいので秋月で取り扱いがあるエプソンの20MのTCXOでもよいかもしれません。

開発環境は雪豹のままなので、main32.hexをEl CapitanにscpしてMicrobridgeで焼きました。

512fs対応はFN1241なDACへの布石です。

動作確認には周波数カウンターが重宝しました。

44100HzがUSBのプロファイルに入っていますが、実際は動かないので48000.0Hzにしないと使えません。以下は10.4のAudio MIDI 設定です。

![ピクチャ 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/ae5ecad2-2386-31bb-4a51-2658afd10809.png)
【夏休み企画】#IT用語一問一答【毎朝投稿10日目】XHR

# この記事を読むと、、
- 「関連用語」を使って「XHR」を説明できるようになる
- 「XHR」がもっと好きになる(多分)

# 関連用語
Fetch API / Ajax

[**復習用**] 記事の内容を見る前に上記の言葉で「XHR」を説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

昨日の記事はこちら↓

https://qiita.com/acta/items/4d0a30ff0ed6b9c9f766

# XHRとは
XHR = XMLHttpRequest = ブラウザからサーバーとデータをやり取りするためのAPI

- ブラウザのJavaScript環境で使える
- 実はHttpじゃないプロトコルでも使えるらしい
- 実はXMLじゃない形式でもデータをやり取りできる
    - HTML, Plain Text, JSONの形式が使える

**Fetch API** = XHRを書きやすくしたAPI
- ES6で追加されたPromiseを用いてcallback地獄を解決している

**Ajax** = Asynchronous JavaScript and XML = XHRを用いてwebコンテンツを非同期で取得する手法
- HTMLページ全部ではなく、必要な部分だけリクエストできる

# 参考資料
- https://en.wikipedia.org/wiki/Ajax_(programming)
- https://en.wikipedia.org/wiki/XMLHttpRequest
【Solana 開発】Solana のスマートコントラクト開発環境を作ろう①【Web3 アプリ】


はじめまして。Kawasaki(kawasaki4SOL)です。
オープンソースソフトウェア開発にインセンティブ革命を起こすため、Epics DAO を立ち上げ、分散型クラウドソージングプラットフォーム(Decentralized Crowdsourcing Platform)をSolana チェーン上にて開発しています。
もっと多くの人がオープンソースソフトウェア開発で生きていけるようなコミュニティを創っていければと思います。

Solana 開発に最初に必要な環境設定を

① Solana CLI
② Anchor フレームワーク Framework

の２つに分けて紹介させていただければと思います。

今回はSolana を開発する上で役に立つ情報をまとめます

Solana Labs 公式 GitHub
- [https://github.com/solana-labs](https://github.com/solana-labs)

Solana 公式ドキュメント
- [https://docs.solana.com/](https://docs.solana.com/)

Solana SPLトークン
- [https://spl.solana.com/](https://spl.solana.com/)

Solana ガバナンスUI realms 公式ドキュメント
- [https://docs.realms.today/](https://docs.realms.today/)

Anchor フレームワーク公式 GitHub
- [https://github.com/coral-xyz/anchor](https://github.com/coral-xyz/anchor)




# Solana CLI のインストール（MacOS & Linux）

```bash
$ sh -c "$(curl -sSfL https://release.solana.com/v1.10.35/install)"
```

## PATH の追加

### Zsh の場合
```bash
$ echo -e "\nexport PATH=\"~/.local/share/solana/install/active_release/bin:\$PATH\"" >> ~/.zshrc
$ source ~/.zshrc
```

### Bash の場合
```bash
$ echo -e "\nexport PATH=\"~/.local/share/solana/install/active_release/bin:\$PATH\"" >> ~/.bashrc
$ source ~/.bashrc
```
## バージョン確認
```bash
$ solana --version
solana-cli 1.10.35 (src:a4a23a30; feat:483097211)
```


## Solana ウォレット（Keypair） の作成
```bash
$ solana-keygen new -o ~/.config/solana/id.json
```

## Solana Config の確認

```bash
$ solana config get
Config File: ~/.config/solana/cli/config.yml
RPC URL: https://api.mainnet-beta.solana.com 
WebSocket URL: wss://api.mainnet-beta.solana.com/ (computed)
Keypair Path: ~/.config/solana/id.json 
Commitment: confirmed
```

## Devnet へ接続

```bash
$ solana config set --url devnet
Config File: ~/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com 
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: ~/.config/solana/id.json 
Commitment: confirmed 
```

## Solana を Airdrop
Solana開発には SOL を使用します。Dev 及び Test 環境では自分で SOL を Airdrop することができるので、
予めいくつかの SOL を新規作成したウォレットに Airdrop します。

```bash
$ solana airdrop 2
Requesting airdrop of 2 SOL

Signature: 3GAiRzxJypdpDm1J2RdKoRp86DNRmVSkeyw1AGH4md7k1Fj4DgST6Wu7cRewSMSJPhKJpXbUjNaCkjJNXqHhwFU4

2 SOL
```

本番環境にスマートコントラクトをデプロイする際には実際の SOL が必要になります。
この必要な SOL の量はプログラムの容量によって変わります。

## ウォレットの SOL 残高を確認

```bash
$ solana balance
4 SOL
```

これで Solana CLI の準備はできました。
コントラクトによっては 10SOL 以上必要になるので、
SOL が足りないときには Airdrop しましょう。

それでは次に Anchor フレームワークについて紹介させて頂きます。
React-scrollを使ってナビゲーションバーからスクロール・例

Reactアプリでナビゲーションバーから所定の位置にスクロールしたかったので、React-scrollを使いました。
https://github.com/fisshy/react-scroll/blob/master/README.md

Sandbox上に作ったシンプルな例です。
https://codesandbox.io/s/react-scroll-with-nav-simple-test-3w30ki
Previewの画面ではNavが表示されないので、オプションから新しい画面を開く必要があります。例ではNavのためにBootstrapを使っていますがなくても使えます。


使用方法としてはnpmまたはyarnでプロジェクトにインストールして
```bash
npm install react-scroll
```

ImportしたLinkの「to」と行き先のElementの「name」を合わせると使えます。
```javascript
import { Link, Element } from "react-scroll";
export default function App() {
     <Link to="jump">
          リンク先にジャンプ
     </Link>
    〜
    <Element name="jump">
        リンク先
    </Element>
}

```

ジャンプした先が隠れてしまう場合は、
Linkに　offset={数値}　などを入れると調整できます。
```javascript
     <Link to="jump"　offset={-100}>
          リンク先にジャンプ
     </Link>
```

他にも
smooth={true}でスクロールアニメーション
duration={500}で0.5秒のアニメーション
activeClass="active"でactiveのクラスが追加で色を変えたりなど
spy={true}　画面上の位置から自動的にacitiveClassを更新
などがあります。
詳しくは
https://github.com/fisshy/react-scroll/blob/master/README.md#propsoptions
Ubuntu 22.04.1 LTS へのアップデートと注意点まとめ

# はじめに
先日、Ubuntu 22.04.1 LTS (Jammy Jellyfish) にアップグレードしたので、そのときのことを軽くメモします。



# 環境
* Raspberry Pi 4



# アップグレード方法
以下のコマンドを実行するだけです。

```shell:Shell
do-release-upgrade
```

SSH 経由では推奨しないという警告が出るので、可能であれば SSH 経由ではない状態で実行することをおすすめします。



# アップグレードの注意点
アップグレード後に生じた問題についてざっと紹介します。

## SSH 接続ができなくなった
SSH のアップデートにより、RSA/SHA1 暗号方式の鍵がデフォルトで無効になったようです。

解決策については以下の記事にまとめました。

[SSH で RSA/SHA1 が使えなくなったので対策する](https://zenn.dev/noraworld/articles/ssh-rsa-sha1-disabled)

## 再起動時に日時がずれるようになった
原因は不明ですが、以下の方法で解決しました。

[Raspberry Pi を再起動するとシステム日時が狂う問題の解決法](https://zenn.dev/noraworld/articles/system-clock-synchronization)

## 使っているコマンドが勝手にアンインストールされてしまった
アップグレードの途中でもう必要なくなったパッケージをアンインストールしますか？ という確認メッセージが表示されます。

アンインストールするかしないかは選択できるのですが、必要ないと言っているので筆者はアンインストールすることを選択しました。

すると、今まで使っていたコマンドの一部が使えなくなってしまいました。

もちろん再インストールすれば良いのですが、結構たくさんのパッケージがアンインストールされて全部は追いきれないので、面倒を避けたい人はアンインストールするのは避けたほうが良いかもしれないです。

## 設定が勝手に変更されてしまう
アップグレードの途中で、いくつかのパッケージにおいて、デフォルトの設定ファイルが更新されたが、あなたもそのファイルを編集しているのでどうするかと聞かれます。

たいてい、以下のオプションから選ぶことになります。

* 自分自身で編集した内容を捨てて新しいデフォルトの設定を採用する
* 新しいデフォルトの設定を無視してそのままにする
* 両者をマージする

設定ファイルが更新されたということは、既存の設定では動かなくなる可能性があることもあります。新しい設定はちゃんとチェックしたかったので、両者をマージするオプションなどを採用したりしたのですが、やはりそうすると今まで動いていたのに動かなくなったりとか、意図した通りに動かなくなったりします。

筆者の場合、以下のパッケージで問題が発生しました。

* sudoers
    * cron で sudo を使うときにパスが通っていなくて実行できなくなった
* PulseAudio
    * 接続方式が変わってしまった

なお、パッケージによっては、現状の設定ファイルを別ファイル名でコピーしてバックアップを取り、強制的に新しい設定ファイルに更新してしまうものもあります。ここらへんも要チェックです。



# さいごに
わかってはいたことですが、やはり OS のアップグレードとなると今まで正常に動いていたものが動かなくなることが往々にしてあります。十分な時間があるときに腰を据えてじっくりとアップグレードするのが良さそうです。
PHP8.1で登場した列挙型(Enum)とオブジェクト(object)を区別する方法

`gettype()`だと判別できないし、`is_enum()`関数も無いし、EnumかEnum以外か どうやって判断すれば良いんだ………！？とハマったのでメモ。

# 🌟 結論
Enumかどうかは、「***UnitEnum**インターフェイスのインスタンスかどうか*」で判定する。
```php
if( $hogeEnum instanceof UnitEnum ) {}
```
> このインターフェイスは、型チェックのためだけに存在しています。

と、以下のUnitEnumのページに書かれていますね。

https://www.php.net/manual/ja/class.unitenum.php

# 💬 ちなみに・・・Enumとオブジェクトの違い
Enumはオブジェクトとして扱われるので`is_object()`は`true`になります。
```php
$hogeEnum = HogeEnum::FUGA;
$hogeObject = new HogeObject();

is_object($hogeEnum); // true
is_object($hogeObject); // true
$hogeEnum instanceof UnitEnum; //true
$hogeObject instanceof UnitEnum; // false
```
Enumとオブジェクトとの違いについてはこちらのページに詳しく書かれています。

https://www.php.net/manual/ja/language.enumerations.object-differences.php
SourcetreeにてGitHubを利用する設定

SourceTreeを利用してBitbucketでなくGitHubによるリモートリポジトリを実行する設定例を投稿してみました。
まずは、GitHubのTokenの取得します。GitHub（https://github.com/ ）のWebにサインインします。
画面右上から「Setting」を選択し、「Developer settings」を選択します。
そして、「Personal access tokens」を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/fd4d67af-9398-4d31-4591-2854c9bc085c.png" width="40%">
Personal access tokens生成と同時にtokenを記録する。
Sourcetreeに戻り、ローカルリポジトリを作成。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/b1f9138b-a80f-942e-8032-e5423ba131d9.png" width="50%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/60a85fce-65db-7466-526f-065bc078cd9a.png" width="70%">
更にVSCodeを利用して、今回はテストとして、index.html等のファイルを編集を行い、ローカルリポジトリ上で作成。このリポジトリをリモートリポジトリへプッシュする。その際、SourcetreeにGithubのアカウントを登録する際、前段で作成したtokenをパスワードに設定する。

下記アカウント登録処理より、Githubのアカウントを追加する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/3adb564a-e058-0468-0452-e0eafc3174f2.png" width="50%">
アカウント登録時パスワードを、tokenを下記の様に設定する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/2b3264d1-286d-2e95-d2af-6ca328c5f344.png" width="50%">
更にリモートリポジトリをローカルリポジトリ上で下記の様にGithub上のリポジトリを選択登録する。
![スクリーンショット 2022-08-18 1.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/47417abe-717a-7335-a5db-2b867dfba474.png)
後はローカルのリポジトリをプッシュしアップロードされたかGithub上で確認する。
【Python】DjangoでOracleに接続する際にサービス名を指定したい

## 概要
DjangoでDBの設定をする際、[Django – settings.py – DATABASES](http://taustation.com/django-settings-py-databases/)の記事にあるように、`settings.py`にDBの接続情報を設定します。
今回はOracle Databaseに接続する際の設定内容についてメモ書きします。

## ハマったこと
Oracle Databaseのバージョンについて19cを使用したので、DjangoからはPDBにアクセスしたいです。PDBについて、[徹底解説！Oracle Database 12cのすべて Vol.2](https://www.ashisuto.co.jp/tech-note/article/20130912_oracle.html)の記事にある通り、DB作成時に合わせてPDBのサービスも作成されるので、このサービス名でアクセスしにいきたいと思います。
とりあえずは[こちら](https://docs.djangoproject.com/en/4.1/ref/databases/#id14)のDjangoのドキュメントにある通り、以下のような感じで設定しました。しかしDBにアクセス出来ず。

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'SAMPLE_PDB',
        'USER': 'SAMPLE_USER',
        'PASSWORD': 'SAMPLE_PASSWORD',
        'HOST': 'localhost',
        'PORT': '1521',
    }
}
```

# 原因
[こちら](https://stackoverflow.com/a/20486810)のstackoverflowの記事にある通り、`NAME`中にHOSTとPORTの指定が無いと、SIDによる接続になるそう。[ドキュメント](https://docs.djangoproject.com/en/4.1/ref/databases/#full-dsn-and-easy-connect)にも、`This format is required when using RAC or pluggable databases without tnsnames.ora`とありましたので、`NAME`にHOSTとPORTを指定すればいけそうです。

# 対応後の設定

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'localhost:1521/SAMPLE_PDB',
        'USER': 'SAMPLE_USER',
        'PASSWORD': 'SAMPLE_PASSWORD'
    }
}
```
0から始めるQISKIT#1 PycharmでQISKITを動作させるための環境構築を行う

# 概要
PycharmでQISKITを動作させるための環境構築を行う
# なぜやるのか？
QISKITの環境はJupyter Notebookを使っている記事が多く見える。
それでもPycharmでやってみたかった...
# 端末
何年まえのかわからないMacBookAir（メモリ４GB）
# 手順
QISKITの手順を調べると、しなくてはいけないことが仮装環境の作成とパッケージのインストールだったので、それぞれの手順をここに書いていく
## 1.PycharmでPythonプロジェクトを作る
ここに関しては割愛
## ２.仮想環境を作る
まずはメニューバーからPycharm→preferenceをクリック
![スクリーンショット 2022-08-18 0.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1785809/f2ac1a92-556b-372c-5cc0-1c797b4a9dc2.png)
プロジェクト：プロジェクト名を選択し、Pythonインタープリターを選択
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313738353830392f30663431303039362d613332622d343735622d643463632d3737356232313232613335632e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1785809/57675d2b-8aec-a7a1-1909-538e85cd9571.png)
右上の「インタープリターを追加」をクリック（ローカルでOK）
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313738353830392f31623137323731652d316461342d623230372d653937632d3533383934363630643633622e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1785809/5048867c-54e6-9ff6-65bf-34e2bede3763.png)

次のページではデフォルトでプロジェクトディレクトリが表示されている。
今回はvirtualという名前の仮装環境を作りたいので、（プロジェクトディレクトリパス）/virtualと追記してOKを押す
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313738353830392f31346461306433302d333832302d343032392d623666342d3763346535663063313665642e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1785809/37cce11b-74ef-1f3a-ef60-52789d0c3a52.png)

適用→OKで完了
Pycharmの右下にインタープリター名が表示されていれば成功です
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313738353830392f38666231666361342d653664392d626434302d326363632d3731666531313535336430622e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1785809/c4c92082-c635-40fe-aaba-abd3dd8263ee.png)


## ３.パッケージをインストールする
ターミナルに移動し、プロジェクトのディレクトリに移動する
```
cd プロジェクト名
```
次に、以下のコマンドを実行すると仮装環境に場所が移る。
```
. virtual/bin/activate //virtualは仮想環境名
```
ユーザー名の前に(virtual) とついたらOK

次に、どうやら環境構築の際は以下のパッケージをダウンロードした方がよいので、ダウンロードしていく。
```
pip3 install pipenv
pipenv install requests
pipenv install numpy
pipenv install scipy
pip install qiskit
pip install 'qiskit[visualization]'(いらないかも)
```
インストールしたらちゃんとダウンロードできるか確認する
```
pip list
```
以上で環境開発はOK！

# 参考
JetBrain公式ドキュメント
https://pleiades.io/help/pycharm/creating-virtual-environment.html
QISKITをPycharmで行う方法を載せているブログ（今回は導入を個人でやっていたため、一部参考にした）
https://benjaminwhiteside.com/2019/09/08/quantum-computing-qiskit/
Fakerが理解不足でエラーが出たので調べてみた


はじめに
---
タイトルの通り、RspecでダミーデータをFakerを用いて作成しようとしたところ、単純な理解不足でエラーが起きて一瞬詰まったので備忘録として残します。
同じようなミスをしている人がもしかしたらいるかもしれないので！！

行いたかったこと
--
user_name(ユーザー名）のダミーデータを作成がしたくて、下記のように記述したのですが、"国際化エラー:翻訳に失敗しました"というようなエラーが返ってきてしまいました。

~~~
FactoryBot.define do
  factory :user do
    user_name { Faker::Name.user_name }
    #user_nameのダミーデータを作成したかったがエラーが発生
    ~省略~
  end
end
~~~

~~~
#返ってきたエラー
I18n::MissingTranslationData:
       translation missing: en.faker.name.user_name
~~~

ネットでエラーについて調べたところ、翻訳ミスなのでconfig/initializers/locale.rbのファイルを修正しましょうという記事があったのですが、エラーが変わらず返ってきて解決できませんでした。

そもそもFakerの仕組み
--
公式ドキュメントの[README.md](https://github.com/faker-ruby/faker/blob/master/README.md)を読んだら理解ができました。

僕は勝手に"Faker::Name + カラム名"でダミーデータが作成できると勘違いしていたのですが、
実際はそうではなく、Fakerがデフォルトで準備しているメソッドをFaker::~で呼び出せる、というものでした。
（表現が間違っていたらご指摘いただけると幸いです）

自分が公式ドキュメントを読んで理解した構文は下記です。
{}内は、Fakerのgithubの絶対パスで表現しています。

※こちらクリックをすれば、github（Faker）の絶対パスのページが表示されます。
[faker/doc](https://github.com/faker-ruby/faker/tree/master/doc)
[faker/doc/~](https://github.com/faker-ruby/faker/tree/master/doc/games) 
#例としてgamesのフォルダを選択しています
[faker/doc/~/~](https://github.com/faker-ruby/faker/blob/master/doc/games/super_mario.md) 
#例として、games/super_mario.mdを選択しています。

~~~
Faker::{faker/docの項目名}::{faker/doc/~の項目名}.{faker/doc/~/~の項目名}
=> 例：Faker::Games::SuperMario.game #=> "Super Mario Odyssey"

#Faker/docでdefaultを選択する場合は記述する必要なし
Faker::{faker/doc/defaultの項目名}.{faker/doc/default/~}
=> 例：Faker::Name.name #=> "Tyshawn Johns Sr."
~~~

複数の例
--

要はFakerが項目ごとに複数準備してくれている文字列をランダムで準備してくれているということでした。
※ちなみに{faker/doc/~/~の項目}にも下記のように複数の選択肢があります。

~~~
# 名前だけ
Faker::Name.name #=> "Tyshawn Johns Sr."
# ミドルネームもある名前
Faker::Name.name_with_middle #=> "Aditya Elton Douglas"
# ファーストネームのみ
Faker::Name.first_name       #=> "Kaci"
~~~

~~~
# スーパーマリオのキャラクター
Faker::Games::SuperMario.character #=> "Luigi"
# スーパーマリオのゲーム
Faker::Games::SuperMario.game #=> "Super Mario Odyssey"
# スーパーマリオのエリア
Faker::Games::SuperMario.location #=> "Kong City"
~~~

解決したコード
--
Fakerの仕組みがわかると理由は一目瞭然でした。
user_nameなんてものはFaker内にないので、エラーを吐いていました。
（一応色々やれば、自前でカスタマイズもできるみたいです。）

なので、下記のように修正すればすんなりとダミーデータを作ってくれました。
~~~
FactoryBot.define do
  factory :user do
    user_name { Faker::Name.name }
    #user_nameのダミーデータを作成したかったがエラーが発生
    ~省略~
  end
end
~~~

一応整理するとこんな感じに記述すればOKってことですね。

~~~
FactoryBot.define do
  factory :モデル名 do
    カラム名 { Faker内にある項目 }
    ~省略~
  end
end
~~~

終わりに
--
なんとなくで理解したつもりになって、書いちゃだめってことですね。
仕組みを理解すれば簡単でした。
※間違っている箇所があればご教示いただけるとありがたいです。

参考
--
https://github.com/faker-ruby/faker
Linux 論理ボリュームとUSBデバイスクラスの種類について（自分用メモ

LVM (Logical Volume Manager) は、物理的な記憶デバイスの領域（物理ボリューム：PV）を複数まとめてひとつの大きな仮想的な領域（ボリュームグループ：VG）とし、そこから仮想的なパーティション領域（論理ボリューム：LV）を切り出すことで、従来の物理的なパーティションを用いた方法よりも柔軟に記憶領域を管理することができるようにする仕組みです。

具体的には、各論理ボリューム（LVM を利用しない場合のパーティションに相当）のサイズを後から変更したり、単体のハードディスク（LVM では物理ボリュームと呼ぶ）の容量を超えるサイズの論理ボリュームを作ったり、後から新たな物理ボリュームを追加してボリュームグループ全体のサイズを増やしたり、不要な特定の物理ボリュームだけをボリュームグループから削除したり、といったことが可能です。


・物理ボリューム (PV：Physical Volume)
物理的なハードディスクやパーティション

・ボリュームグループ (VG：Volume Group)
物理ボリュームを集めて作る、仮想的な領域（仮想的なハードディスクのようなものだと思ってよいです）

・論理ボリューム (LV：Logical Volume)
ボリュームグループの一部（または全部）を使って作る、仮想的なパーティション。従来のパーティションと同じように、この論理ボリューム上にファイルシステムを作って利用可能

論理ボリュームを作成する際の主な手順は以下のとおりです。

・物理ボリューム(PV)の作成
pvcreateコマンドを使用して作成します。

・ボリュームグループ(VG)の作成
vgcreateコマンドを使用して作成します。

・論理ボリューム(LV)の作成
lvcreateコマンドを使用して作成します。


なお、論理ボリューム(LV)のデバイスファイルは「/dev/VG名/LV名」となります。
作成した論理ボリューム(LV)を実際に使用するにはmkfsコマンドで、作成した論理ボリュームにファイルシステムを作成し、mountコマンドでマウントを行います。


また、LVMにはLVへの変更前の情報を保持する「スナップショット」という機能があります。バックアップの対象をスナップショットにすることで、運用を停止することなく、安全にバックアップを行うことができます。


●USBデバイスはいくつかのデバイスクラス(種類)に分かれています。それぞれのデバイスクラスにはクラスドライバという汎用ドライバが用意されています。

主なUSBデバイスクラス
・HID(Human Interface Device) キーボード、マウス、ジョイスティックなど
・Mass Storage Class ハードディスク、USBメモリーなど
・ACM Communication Device Class モデム、TAなど
・Audio Class スピーカー、マイクなど
Ubuntu 22.04 pip3 で simstringをインストールする際は、quickumls-simstring を使う。

# 概要
Ubuntu22.04 で pip3 を用いて `simstring` を入れようとするとエラーになる。そのため、代わりに、`quickumls-simstring` を使う。
# simstringをpip3でインストールしようとしてうまく入らない。

[simstring](http://www.chokkan.org/software/simstring/index.html.ja) は高速かつシンプルな類似文字列検索ライブラリだ。pythonで類似文字列を検索する際に利用していた。ubuntu22.04にアップデートした際に、python3.8からpython3.10 へpythonか更新されていた。
simstringをpip3 で入れようとしてもうまく入らない。

いろいろ試行錯誤をしたが、うまくいかなかった。
# simstingは quickumls-simstring で入れる。

いろいろ調べて、 [quickumls-simstring](https://pypi.org/project/quickumls-simstring/) としてメンテしてくれている人が居た。

```
pip3 install quickumls-simstring 
```

で問題なくインストール出来た。

使用方法は、
```
from quickumls_simstring import simstring
```
とすればあとは変えずに使用できた。

# 代替案

pythonで書かれた[simstring-pure ](https://pypi.org/project/simstring-pure/) や [simstring-pure-fast](https://pypi.org/project/simstring-fast/) も試したが、使用用途が、数十万件のレコードのマッチングで、simstringが最も早かったため、simstringを利用した。
PDBにユーザーを作ってSQL Developerで繋ぐ

新卒１年目です。研修でSQL Developerを用いてOracle SQLを勉強しています。
自分なりにDBを勉強をしてたらPDB（プラガブルデータベース）というのを知りました。
そこでデフォルトで存在しているPDBの「xepdb1」を用いて、研修用DB環境を整えたときの方法をまとめてみます。
最終的にSQL Developerで接続することを目指します。
私の理解が足りないこともあり、残念ながら細かいことまでは説明しきれていません。ご容赦ください。

**大まかな流れ**
①既存のPDBの確認・接続
②PDBにユーザーを作成
③作成したユーザーを用いてPDBにSQL Developerで接続

## 前提
OSはWindows10です。sqlplusを利用します。

DBの環境を構築するために、以下の２つを使いました。インストールの方法は省略します。
Oracle SQL Developerの入手にはOracleアカウントが必要です。
> [Oracle Database 21c Express Edition](https://www.oracle.com/jp/database/technologies/xe-downloads.html)
> [Oracle SQL Developer 21.2.1](https://www.oracle.com/jp/database/sqldeveloper/technologies/download/)

## ①既存のPDBの確認・接続

### リスナーの確認

cmd（コマンドプロンプト）を管理者権限で起動。
下記のコマンドでリスナーを起動。

```
> lsnrctl status // リスナーの状態確認
> lsnrctl start  // 状態確認後、リスナーが起動していなければ起動
```

### IPアドレス、ポート番号の確認
リスナーの状態を確認した時と同じコマンドで確認できます。
```
> lsnrctl status // IPアドレスとポート番号（デフォルトでは1521）の確認
```

### PDB名の確認

上記リスナーの起動方法でも確認できる場合があります。
しかし時たまサービスが正しく表示されない場合があるので、より確実な方法を示します。

デフォルトで存在するデータベース「xe」にsystemユーザーで接続。
```
　> sqlplus system/<パスワード>@<IPアドレス or ホスト名>:<ポート番号>/SID

例> sqlplus system/password@XXX.XXX.XXX.XXX:1521/xe
```

接続できたら以下のコマンドでPDB名の確認
```
sql> SELECT name, open_name FROM v$pdbs;

NAME          OPEN_MODE 
------------- ----------
XEPDB1        READ WRITE //PDB名は「XEPDB1」
```

以上でPDB名が確認できました。

### PDBにsystemユーザーで接続

PDBに接続します。xeにsystemユーザーで接続した時と同じ要領で、コマンドを書きます。SIDがPDB名であることに注意してください。

CDBにsystemユーザーで接続。
```
例> sqlplus system/password@XXX.XXX.XXX.XXX:1521/xepdb1 // SIDはPDB名！
```
sqlplusに接続後、正しく接続できているかは以下で確認できます。PDB名が表示されていれば成功です。
```
sql> show con_name
```

## ②PDBにユーザーを作成
以降は一般的なテーブルスペースの作成、ユーザー作成の流れと同じです。
### テーブルスペースの作成
自動拡張等の設定は今回OFFにしましたが、任意で変更してください。
```
sql> CREATE TABLESPACE ＜テーブルスペース名＞
     DATAFILE '＜データファイル名（フルパス指定可）.dbf＞'
     SIZE 100M AUTOEXTEND OFF; // 任意で変更してください。
```

### 新規ユーザーの作成
作成したテーブルスペースを用いて新規ユーザー作成します。
```
sql> CREATE USER ＜ユーザー名＞
     IDENTIFIED BY ＜パスワード＞
     DEFAULT TABLESPACE ＜作成したテーブルスペース名＞
     TEMPORARY TABLESPACE TEMP;
```

### 権限の付与
最低限の権限を付与します。
```
sql> GRANT CONNECT, RESOURCE TO ＜ユーザー名＞;
sql> GRANT UNLIMITED TABLESPACE TO ＜ユーザー名＞;
```

## ③作成したユーザーを用いてPDBにSQL Developerで接続

以下の設定でSQL Developerに新規データベース接続を作成。

**ユーザー名、パスワード：** ユーザ名とパスワードを入力。
**ホスト名：** ホスト名、もしくはIPアドレスを入力
**ポート：** 1521 (デフォルト)
**SID、サービス名：** サービス名を選択し、PDBの名前（サービス名）を入力

![2022-08-17223524.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469348/97f021dd-1f09-bc1b-a1ac-81fa1529f993.jpeg)
以上で完了です。

## まとめ　感想

研修の復習も兼ねて、PDBでDB環境を用意するやり方をまとめました。もしも似た状況の方が居れば、少しでも助けになればと思います。

研修ではOracle Database 21c Express Editionをインストールした時点で、systemユーザーで簡単に接続できるxeというDBを使って、SQLを学ぶことを推奨されました。
しかしxeはCDB（コンテナデータベース）なので、管理用データベースのはず…。なのでセキュリティ的に疑問がありました。
卒業基準だったわけでは無いので、SQLに触れてみる、体感してみるという意図が強かったのかなと思います。

今回のよりもっといい方法がある思うし、知識がごちゃごちゃになっている部分も多いので、この先も勉強しつつ理解していけたらと思います。
また是非アドバイスいただけると嬉しいです。つよつよになりたい。

## 参考

* [新規ユーザー作成時に最低限割り当てるべき権限（外部）](https://cosol.jp/knowledge/knowledge_post/ob0003_new_user/)
* [ユーザー権限およびロールについて（外部）](https://docs.oracle.com/cd/E57425_01/121/ADMQS/GUID-289A4BF6-F703-4ED5-8357-89F651A6D1DE.htm)
macOS Big Sur のVMware FusionでKali Linuxを使う

### 環境
- macOS
    - Big Sur 11.6.1
- VMware Fusion
    - Player バージョン 12.2.3

### やりたいこと
- Kali Linuxを使いたい
### 前提
- VMware Fusionが使用可能な環境であること
- p7zipが使用可能であること
    - zipが解凍できればなんでもok
```zsh
$ uname -a
x86_64
```

### 手順
基本的には以下を参照
- https://help.offensive-security.com/hc/en-us/articles/360049796792-Kali-Linux-Virtual-Machine

1.公式サイトからイメージをダウンロード
https://www.kali.org/get-kali/#kali-virtual-machines

![スクリーンショット 2022-08-17 23.51.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413460/d00cd1e2-bab4-e908-149b-5d7a6cf87344.png)

2.チェックサムでダウンロードファイルの同一性を確認
A. 「sum」ボタンを押下しチェックサムを確認
![スクリーンショット 2022-08-17 23.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413460/6427efc8-2e6b-245a-e4f7-8086a5ec7043.png)
B. コマンドでファイルのチェックサムを確認
```zsh
$ shasum -a 256 kali-linux-2022.3-vmware-amd64.7z
c91b5b1926ae516952282575cbce3f9e3a03a9bc7da316ae912e0977e39866fd  kali-linux-2022.3-vmware-amd64.7z
```
- AとBが同一であれば問題なし

補足：https://unbate.ngontinh24.com/article/downloading-kali-linux-kali-linux-documentation

3.zipを解凍

```
$ 7z x kali-linux-2022.3-vmware-amd64.7z 

7-Zip [64] 17.04 : Copyright (c) 1999-2021 Igor Pavlov : 2017-08-28
p7zip Version 17.04 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,4 CPUs x64)

Scanning the drive for archives:
1 file, 2654994012 bytes (2532 MiB)

Extracting archive: kali-linux-2022.3-vmware-amd64.7z
--
Path = kali-linux-2022.3-vmware-amd64.7z
Type = 7z
Physical Size = 2654994012
Headers Size = 714
Method = LZMA2:26
Solid = +
Blocks = 3

Everything is Ok                                                           

Folders: 1
Files: 43
Size:       12190167845
Compressed: 2654994012
```

4.finderで「kali-linux-2022.3-vmware-amd64.vmwarevm」を開く
(もしくはopenコマンドで開く)

以上です。
[2022年8月現在] LATEX環境構築手順(Windows）

# はじめに
　この投稿は、@rainbartownさんの「VSCode で最高の LaTeX 環境を作る」のフォローアップ記事です。前記記事にまとめてくださった手順をたどるとともに、変更されている点があれば記載します。**VSCodeはインストール済みであるものとします。**
結論として、特に変わっている部分はありませんでした。

# 検証環境
- 検証年月日：2022/08/17
- OS：Windows 11 Education 10.0.22000（ビルド 22000）
- VSCode：Ver 1.70.1

# 検証手順
## TEX Liveのインストール
1. TEX User Groupのサイト（[こちら](https://www.tug.org/texlive/acquire-netinstall.html)）から、TEX Liveのインストーラーをダウンロード。
1. いつも通りWindowsの安全装置が働くので、インストーラーの起動を続行。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/c87ea3d8-f638-4be1-9394-2899b39d7b98.png)
1. インストーラーを起動すると、インストールを行うか、解凍だけするかを聞かれる。「Install」をクリックして次へ。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/1449b1d1-827e-55b5-1fbb-f464b56deccc.png)
1. 「メインインストーラー開くからね？」と聞かれる。「Install」で続行。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/feffda41-7bc1-25ac-daf5-4349ebd10cb3.png)
1. 予告通りTEX Liveのインストーラーが起動。この画面は自動的に遷移する。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/5ae055db-dc95-d4f2-26bd-c396944f9c4f.png)
1. TEX Liveのインストール設定画面が開く。（詳細設定画面のキャプチャも合わせて下記に）デフォルトのまま「インストール」実行。[^1]
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/9b410576-f176-cb9c-54ba-a3136033801c.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/278ac44e-ff6f-b569-d26c-f74944591b10.png)
    [^1]:デフォルトではCドライブ直下にディレクトリを作成してインストールされる。
1. インストール実行中。検証した環境では2時間ほどかかった。TEX Wikiにも2時間かかるという記載があるので、異常なことではない模様。気長に待ちましょう。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/6b63d0b7-9640-cd43-ad1b-9d93c96ca341.png)
1. インストール完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602128/8ca6c20f-1ce9-8ad6-5f9f-b606d623fe97.png)

### 動作確認
1. コマンドプロンプトを開き、`platex --version`を実行。下記のような出力が得られればよい。

    ```
    C:\Users\hoge>platex --version
    e-pTeX 3.141592653-p4.0.0-220214-2.6 (utf8.sjis) (TeX Live 2022)
    ...中略...
    Primary author of e-pTeX: Peter Breitenlohner.
   ```

1. 同様に、`latexmk --version`を実行し、下記のような出力が得られれば良い。
    
    ```
    C:\Users\hoge>latexmk --version
    Win CP console initial and current in/out Win: (932, 932), (932, 932)
    Coding system for system and terminal: 'CP932'
    ---
    Latexmk, John Collins, 17 Mar. 2022. Version 4.77
    ```

## latexmkの設定
`%USERPROFILE%\.latexmkrc`として空のファイルを作成する。ファイル内容はオリジナルの投稿にある通り。

## VS Codeの設定

### LaTeX Workshopのインストール

オリジナル投稿の通り。インストールしたバージョンは8.2.0でした。

### settings.jsonの編集

こちらもオリジナル投稿の通り。

### スペニットの登録

これもオリジナル投稿の通り。

# 余談
VSCodeの設定後、期待通り動かない（ビルドに失敗する）現象がありましたが、PCの再起動をかけたところ期待通り動くようになりました。詳細な原因の調査はしてません。。

# 感想
TEX文書のコンパイルをかける必要がなくなり、革命的にとても便利です。。。！

# 参考資料
1. @rainbartown 様 「VSCode で最高の LaTeX 環境を作る（千葉大学 Advent Calendar 2019 16日目）」 https://qiita.com/rainbartown/items/d7718f12d71e688f3573
1. TEX Wiki 「TeX Live/Windows」https://texwiki.texjp.org/?TeX%20Live%2FWindows
1. TEX User Group (TUG) 「Installing TeX Live over the Internet」 https://www.tug.org/texlive/acquire-netinstall.html

# 変更履歴
| 版 | 日付 | 変更の概要 |
|---:|:---|:---|
| 1 | 2022/08/17 | 初版 |
PycharmでOpenCVの補完が効かない問題の解決

問題の特性上じきに解決されそうなものですがちょっと困ったので一応記事にしました．

現在（2022/8/17），Pycharmで利用できる最新番 opencv-python (4.6.0.66)ではコードの補完が効きません．

以下のIssueの内容によると4.5系にダウングレードすると補完が効きなおすようです．

https://github.com/opencv/opencv/issues/20997#issuecomment-1163745366

Pycharmから特定のバージョンのインストールは，Setting/Project:~/Python Interpreter から opencv-python を選択，Specify version のプルダウンから指定し，Install Package から行えます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371690/9506fd61-56f7-1149-c18c-61518a47c719.png)


実際に直った画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371690/27e96c96-fa3b-4147-d142-9db4315c1e87.png)
Rails7 x Mysql8 Dockerで環境構築をする

## はじめに
備忘録です。
特に説明はしません。　全てコピペして最後に載せたコマンドを打ってもらえると

参考にPostgreSQLのパターンがある
`--api`を付け加えるとapiモードで開発できる

*必要ファイル*
```md
Dockerfile
docker-compose.yml
Gemfile
Gemfile.lock
entrypoint.sh
```
*Dockerfile*
```Dockerfile
FROM ruby:3.1
ARG RUBYGEMS_VERSION=3.3.20

WORKDIR /myapp
COPY Gemfile* /myapp/

RUN gem update --system ${RUBYGEMS_VERSION} && \
    bundle install
COPY . /myapp/

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"]
```

*docker-compose.yml*
```yml
version: '3.8'

services:

  db:
    image: mysql:8.0.29
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./tmp/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - 3306:3306

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

*Gemfile*
```Gemfile
source 'https://rubygems.org'
gem 'rails', '~>7.0.3'
```

*Gemfile.lock*
```ruby
# 空
```

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

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```

## コマンド順序
```shell
# Imageをbuildする
$ docker compose build

# コンテナ内で railsアプリを作成する
# apiモードで作成したい場合は --apiをつける
$ docker compose run --rm web rails new . -f -B -d mysql --skip-test --skip-turbolinks
```
```rb
# config/database.ymlを編集してコンテナのmysqlに接続する
password: root
host: db
```
```shell
# Gemfileが更新されたので再度Imageをbuildする
$ docker compose build

# コンテナを起動させてDBを作成
$ docker compose run --rm web rails db:create

# 最後にwebとdbのサービスを立ち上げる
$ docker compose up -d
```

## tips
```shell
# 開発時はコンテナ内部に入っておくと便利
$ docker compose exec web /bin/bash
```

## 注意点
*注意点*
```rb
# bundlerのversonの問題でエラーが発生する
# v2.3.8 v2.3.7はx

# versionを固定する
# 環境変数を使わない場合失敗する(理由は不明)
# エラーが出た際は下記を実装してみる
ENV BUNDLER_VERSION=2.3.3
RUN gem install bundler -v ${BUNDLER_VERSION} && \
    bundle install
```
*注意点2*
`docker-hubにログインしていること`
`既に動いているコンテナとportが被っていないことを確認する`

## 参考

[この記事のベース](https://qiita.com/Shuhei_Nakada/items/b59964e56482ac911522)

[Rail7 x Postgresql 検証済み成功 bundlerのversion指定必要](https://mseeeen.msen.jp/rails-docker/)
GitHub Actions artifact における symlink

`actions/upload-artifact@v2` でディレクトリを指定してアップロードすると、その中に含まれる symlink は実際のファイルに置き換えられる。これはたぶん [zip の挙動](https://linux.die.net/man/1/zip)。

symlink を保った状態で artifact を維持したい場合は、自前で `zip --symlinks` で作成した zip をアップロードして、ダウンロード時に解凍すると良い。

### 検証用のworkflow
```
name: artifact check

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  test:
    runs-on: ubuntu-latest

    steps:          
      - name: setup
        run: |
          touch base.txt
          echo "base" >> base.txt
          ln -s  base.txt ./linked.txt
          tree
      - name: check1
        run: |
          tree
      - name: Upload current directory as artifact
        uses: actions/upload-artifact@v2
        with:
          name: test1
          path: .

      - name: Create zip with symlink
        run: zip --symlinks -r myzip.zip ./*

      - name: Upload zip as artifact
        uses: actions/upload-artifact@v2
        with:
          name: test2
          path: myzip.zip
          
      - name: Create download directory
        run: |
          mkdir -p ./download/1
          mkdir -p ./download/2
      - name: Download artifact1
        uses: actions/download-artifact@v2
        with:
          name: test1
          path: ./download/1

      - name: Download artifact2
        uses: actions/download-artifact@v2
        with:
          name: test2
          path: ./download/2

      - name: Check download 1
        run: |
          tree download/1
          
      - name: Unzip
        run: |
          cd ./download/2
          unzip myzip.zip
          rm myzip.zip
          cd ../../
          
      - name: Check download 2
        run: |
          tree download/2
```

https://gist.github.com/georgeOsdDev/f403ab9f9787532a8e9da2ddc2475d6d

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/9403bf28-7691-a77a-727d-693cc1cb8898.png)
【ポートフォリオ作成4〜7日目】画面遷移図の作成

# 概要
3日目の続き。
# 画面遷移図を作成
## 1. Adobe XDの準備
- [Adobe XD](https://www.adobe.com/jp/products/xd.html)をインストール（7日間無料体験版あり）
- [スターターキット基礎編＆中級編](https://www.adobe.com/jp/products/xd.html#starterkit)で基本的な操作方法を学習
## 2. アートボードの下準備
-  新規作成でiPhone13サイズのアートボードを作成
-  [Apple Design Resources](https://developer.apple.com/design/resources/)からXD用のデザインテンプレートをダウンロード
-  デザインテンプレートからiPhone13サイズのセーフエリアをコピー
-  作成したアートボードにセーフエリアを貼り付け
## 3. プラグインをインストール
- Flowkit（アートボード同士を矢印で繋いだりして関係性をわかりやすくする）
- Icons 4 Design（いろんなアイコンを使用できる）
## 4. 画面遷移図を作成
- 自分が作りたいポートフォリオと似ているWebサービスを真似しながら、各ページのデザインを作成
-  最低限の機能に関わる部分のみ作成
-  各ページのURLや、そもそもページ遷移が必要かどうかも考えておく

# XDのポイント
- 最初にセーフエリアを把握するのが大事（普通はスマホのカメラ部分などによってディスプレイの上下が隠れるので、最初に考慮しておく）
- ヘッダーやフッターなどの位置を固定する方法を知っておく
- 重ね順の変更方法を知っておく
- ボタンやヘッダーなどは最初にコンポーネント化して使い回す
Linux でシステムのフリーズを検知して自動的に再起動させる方法

# はじめに
我が家の Raspberry Pi が定期的にフリーズするのですが、原因が全くわかません。

何か対応策はないものかと調べていたら、Linux には Watchdog timer という仕組みがあることがわかりました。

今回は Ubuntu 22.04.1 LTS をインストールした Raspberry Pi で Watchdog timer を有効にして、システムフリーズ時に自動的に再起動するようにしてみます。

基本的には Raspberry Pi & Ubuntu でなくても、Linux をインストールしたマシンなら同じ方法で設定できると思いますので、ぜひ参考にしてみてください。



# Watchdog timer の有効化
まずは Watchdog timer を有効にします。

`/boot/config.txt` に以下の 1 行を追加します。このファイルを今までに作ったことがない場合はファイルを新規作成します。

```conf:/boot/config.txt
dtparam=watchdog=on
```



# Heartbeat の設定
Heartbeat は日本語に訳すと心臓の鼓動で、システムが正常に動作しているかどうかの確認を一定間隔ごとに行うものです。後述する設定で、このハートビートが一定期間以上なかった場合は再起動するようにします。

`/etc/systemd/system.conf.d/main.conf` というファイルを作成し、以下の 1 行を追加します[^1][^2]。`/etc/systemd/system.conf.d/` ディレクトリがない場合は作成します。

[^1]: `/etc/systemd/system.conf` をいじっても良いのですが、`/etc/systemd/system.conf.d/*.conf` を使用することが推奨されているので今回はこちらを使用します。

[^2]: ファイル名は任意なので `main.conf` でなくても大丈夫です。ただし拡張子は `.conf` としてください。

```conf:/etc/systemd/system.conf.d/main.conf
[Manager]
RuntimeWatchdogSec=5
```

上記の設定で、5 秒ごとに Heartbeat を行います。



# 再起動のしきい値の設定
先ほど設定した Heartbeat が一定期間以上来なかったら再起動する設定を行います。

`/etc/modprobe.d/bcm2835-wdt.conf` に以下の 1 行を追加します。ファイルがない場合は新規作成します。

```conf:/etc/modprobe.d/bcm2835-wdt.conf
options bcm2835_wdt heartbeat=10 nowayout=0
```

上記の設定で、10 秒以上 Heartbeat が来なかった場合は再起動するようにします。



# 再起動
システムを再起動して設定を反映させます。

```shell:Shell
sudo reboot
```



# 起動しているか確認
ログを見て Watchdog timer が起動しているか確認します。

まずは以下のコマンドを実行します。

```shell:Shell
sudo dmesg | grep bcm2835-wdt
```

以下のような出力があれば OK です。

```
[    1.949143] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
```

次に以下のコマンドを実行します。

```shell:Shell
sudo dmesg | grep systemd | grep watchdog
```

以下のような出力がされれば OK です。

```
[    9.389119] systemd[1]: Using hardware watchdog 'Broadcom BCM2835 Watchdog timer', version 0, device /dev/watchdog
[    9.401138] systemd[1]: Set hardware watchdog to 5s.
```



# 動作確認
本当にフリーズしたときに再起動するのか試してみます。

フリーズさせる方法はいろいろありますが、代表的な方法として [フォーク爆弾](https://ja.wikipedia.org/wiki/Fork%E7%88%86%E5%BC%BE) を投下してみます。以下のコマンド[^3]を実行します。

[^3]: はじめて見る方はコマンドには見えないかもしれませんが、これは Bash や Zsh で動作するコマンドです。

```shell:Shell
:(){ :|:& };:
```

実行後、シェルが急激に重くなります。

数分待って、システムが自動的に再起動されれば成功です。



# さいごに
これはあくまで応急処置であって、本当はシステムが頻繁にフリーズする原因を突き止めるのが得策です。

でも、システムのフリーズなどという漠然とした問題の原因を突き止めるのは容易ではないですし、それなりに時間もかかります。Watchdog timer は根本原因解決までの代替手段としては有効かなと思います。

あるいは、このような問題がなかったとしても、何が起こるかはわからないので、盤石な構成にしておくという意味で有効にするのはありかなと思います。



# 参考
* [ラズパイが2～3日でフリーズするのでウォッチドッグタイマーを設定して回避した](https://torisky.com/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%8C2%EF%BD%9E3%E6%97%A5%E3%81%A7%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BA%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%82%A6%E3%82%A9%E3%83%83%E3%83%81%E3%83%89%E3%83%83/)
* [ラズパイ安定化対策－フリーズ対応編](https://www.my-hacks.info/2019/05/16/post-682/)
* [【WatchDogTimer】Raspberry Pi4サーバがフリーズ(停止)した場合に自動再起動する方法【HeartBeat】](https://debimate.jp/2020/11/28/%E3%80%90watchdogtimer%E3%80%91raspberry-pi4%E3%82%B5%E3%83%BC%E3%83%90%E3%81%8C%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BA%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AB%E8%87%AA%E5%8B%95/)
初心者がわかるVPCとは？

## VPCとは

一言で言うと自分用のバーチャルなクラウド環境。

## VPC の規模感

AWS > Region > Availability Zone > VPCといった感覚。

![https://i.gyazo.com/13207fb617b6f7184b9092cd8e74c10c.png](https://i.gyazo.com/13207fb617b6f7184b9092cd8e74c10c.png)

### Region（リージョン）

- 地理的に独立したAWSのリソース群。
- Regionの中ごとにいろんなサービスが存在している。
- Regionごとに存在しているサービスが違う。

### AvailabilityZone

- 冗長的な電力源・ネットワーク・接続機能を備えているデータセンター。
- Regionの中で切り離されて分離している。
- 例えばAvailabilityZone Aが潰れてもAvailabilityZone Bがあれば大丈夫。

### VPC

- Regionに属していて複数のAvailabilityZoneにまたがっている。
- 自分用のバーチャルなクラウド環境。

## VPC以降の規模感

![https://i.gyazo.com/31967e85ce9ca21afd9618845ef98dba.jpg](https://i.gyazo.com/31967e85ce9ca21afd9618845ef98dba.jpg)

### サブネット

- VPCの中でも切り取ったネットワークの単位。
- EC2やNATなどはサブネットの中に属している。

### セキュリティグループ

- RDSやEC2インスタンスなどを守る役割。
- 具体的にはどのポートとの通信を許可するかを決めて通信を制限する。

### NAT

- EC2などがパブリックIPアドレスを持っていないけど、外と通信したい時にIPアドレスを付与する役割を持つ。

### グローバルIPアドレス（パブリックIPアドレス）

- VPCから外に出る時に使う。

### NATゲートウェイ

- プライベートIPアドレスをグローバルIPアドレスに変更するサービス。
- これによってプライベートサブネットが外に出ることができる。

### ルートテーブル

- 各サブネットなどを繋げて通信経路を定義する役割。

### インターネットゲートウェイ

- インターネットとVPCの境目にある。

### 参考にした記事

[https://www.youtube.com/watch?v=SoawMXZ2rwA](https://www.youtube.com/watch?v=SoawMXZ2rwA)
snapが正常に動かなったときの再インストール手順

環境はArch Linux

```
sudo snap refresh
- Mount snap "core" (snap is unusable due to missing files; contact developer)
- Mount snap "core18" (snap is unusable due to missing files; contact developer)
```

が表示され、再インストールしたつもりが足りなかったらしく、snapインストール後

```
snap list 
error: cannot list local snaps! cannot find publisher details: snap-declaration
```

となった。

https://forum.manjaro.org/t/error-cannot-list-local-snaps-cannot-find-publisher-details-snap-declaration/97382/4

これに従いsnapを再インストールすることで正常に動作する状態に戻った。

```
sudo systemctl disable snapd.socket
pacman -R --nosave snapd 
sudo rm -r /var/lib/snapd
sudo reboot
```
リログイン後
https://qiita.com/mizutoki79/items/30b0cbb0d7449e3d61ee#snapd-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

に従いsnapを再インストール
[Blender]Rigifyで人型のボーンを作る手順

# 概要
Rigifyで人型のボーンを作る時の手順を要点だけに絞ってまとめました。
# 本文
ボーンを付けたい人型のオブジェクトを用意します
![スクリーンショット 2022-08-17 22.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0de030f1-0369-430a-cee3-700e8e6c28c2.png)
Rigifyをインストールしていない人はインストールから始めます。
メニューからEdit > Preferencesと辿ります
![スクリーンショット 2022-08-17 22.08.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/cad34740-5c8f-dd2d-3edf-2df8fc6e16da.png)
ポップアップ表示された画面で、左のメニューからAdd-onsを選び、右上の検索欄にrigifyと入力します。そしてRigifyのチェックを入れてください。
お好みで構いませんが、左下でSaveをしておけば次回からもまたRigifyが使えるようになります。
![スクリーンショット 2022-08-17 22.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/33096d20-44b7-24ad-b11a-bef7c8176384.png)
ショートカットキー「Shift + A」でポップアップメニューを表示します。
Armature > Basic > Basic Human(Meta-Rig)を選ぶとボーンが追加されます。

:::note info
ちなみにArmature > Human(Meta-Rig)の方を選ぶと顔の表情用ボーンや指のボーンが追加されて、より複雑な動きを作れるようになります。
:::

![スクリーンショット 2022-08-17 22.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/40cd988f-5a51-1a51-b7b9-a5a7fc3b2d9a.png)
ボーンが追加されます。
![スクリーンショット 2022-08-17 22.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/fdfa1cde-5dad-9e4d-cf84-4950d0674973.png)
人型オブジェクトにボーンが隠れて見づらいと思います。
画面右側の人間マーク(Object Data Properties)を押してViewport Display > In Frontを選べば
![スクリーンショット 2022-08-17 22.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/040ae9b8-3fcc-34da-56c1-97529ca1270f.png)
ボーンが常に前面に表示されるようになります。
![スクリーンショット 2022-08-17 22.13.56のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/5e663d58-5b58-94c7-3595-c7edf0e8e94d.png)
後は、移動「Gキー」回転「Rキー」などを駆使してちょうどいい位置に移動させたら完成です！
![スクリーンショット 2022-08-17 22.18.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/7bb7f840-a95d-a62a-093c-96bfa173c139.png)
# おまけ（人型オブジェクトとボーンの関連付け）
①人型オブジェクトを選択
②Shiftキーを押しながらボーンを選択
③Ctrl + P キー
④With Automatic Weights
選択の順番を間違えないでください:sunny:
![スクリーンショット 2022-08-17 22.51.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/b747a410-0344-d5fd-bdae-c4ec8900a0d3.png)
AWS クーポンの適用方法

AWSからクーポンコードをいただいたのだが、公式サイトの手順とクーポン適用画面のUIが変更されていて戸惑ったのでメモ

下記の公式サイトを参考に適用する

https://aws.amazon.com/jp/apply-coupon/

# 前提条件
クーポンを適用するAWSアカウントにログインしていること

# クーポン適用手順

1. 画面右上のアカウント名をクリックして、`請求ダッシュボード`をクリック
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/2e71dc9c-67c5-9055-f1d9-91e4917e47e7.png)
1. 画面左の`クレジット`をクリック
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/89372adc-dcf9-3cef-4889-eacbf7951979.png)
1. 画面中央の`クレジットを適用`をクリック
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/24d1a5b6-6e27-8a7a-6e5a-498b6e14dd56.png)
1. 「プロモーションコード」と「セキュリティコード」を入力して、`クレジットを適用`をクリック
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/cfcd35fa-ba9f-d452-71c8-51d76b4b663a.png)
### `クレジットの適用に成功しました。`と表示されれば完了！
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719666/885bbc4b-0f04-f77e-dfab-3501d5232c88.png)
ECSハンズオンをやったメモ

# はじめに

今どきの新人は新人研修でコンテナ周りの扱いを一通りやって簡単なサービスを作るところまで行くらしい。
いいなぁ新人は。僕は教えてくれる人がいないから自分で勉強するしかない。
ハンズオンという良い勉強資材があるらしい。

https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/

今回はこれをやりました。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-ECS-2022-reg-event.html?trk=aws_introduction_page


# ECRでリポジトリ作る
WebコンソールでECRのページにいく。左のメニューからリポジトリを選択。
リポジトリを作成→リポジトリ名を記入してそのまま作成。
URIをコピーしておく。12ケタ.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworldという風になってるはず。

# Cloud9で作業
Cloud9を適当に立てる。以下Cloud9でdockerコマンドを打っていく。

### Dockerfileかく
画面でDockerfileを作って保存する。起動したらapacheが動くというだけのもの。
```
FROM ubuntu:18.04
​
# Install dependencies
RUN apt-get update && \
 apt-get -y install apache2
​
# Install apache and write hello world message
RUN echo 'Hello World!' > /var/www/html/index.html
​
# Configure apache
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
 echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
 echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ 
 echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ 
 chmod 755 /root/run_apache.sh
​
EXPOSE 80
​
CMD /root/run_apache.sh
```

### コンテナイメージつくる
タグはさっきつくったECRリポジトリ名にしておく。
```
docker build -t 12ケタ.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1 .
```

### コンテナつくれたのを確認する
```
docker images
```

### ECRにログインする
```
aws ecr get-login-password | docker login --username AWS --password-stdin 12ケタ.dkr.ecr.ap-northeast-1.amazonaws.com
```

### さっきつくったECRリポジトリにプッシュ
```
docker push 12ケタ.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1
```
これで、さっきのECRリポジトリにイメージが入ったはず。

# VPCを作成
Webコンソールで適当にパブリックVPCを作成する。
VPCウィザードつかうとゲートウェイもルーティングも全部やってくれる。こんなに簡単だったんか。
セキュリティグループで、インバウンドのHTTPを開けておく。

# ECSでFargateクラスターつくる
クラスターの作成：さっきのVPCを指定して作成
タスク定義の作成：さっきECRに突っ込んだイメージのURIを指定した定義をつくる。
　ポートマッピングで80をマップしとく。CPU、メモリなどもここで指定
サービスのデプロイ：作ったクラスターのサービスタブでデプロイ
　必要タスク数(今回は2)、ALB、リスナー(80)、ターゲットグループ、VPC、サブネット、セキュリティグループを指定

# 完成～！
デプロイが終わったらネットワーキングタブのオープンアドレスを開いてみる。無事開ければOK。
あとタスクの一個を手動で落としてみたり、タスクを増やしてみるオマケをやってもよい。

# 片付け
ALB、TargetGroup
ECS サービス、クラスター
VPC
ECR
Cloud9
を消す。

# まとめ
今回のハンズオンは
・Cloud9でdockerイメージ作成し、ECRにつっこむ作業
・ECRにあるイメージでECSのFargateサービスクラスターをALB付きで起動する作業
を行いました。AWS便利だねぇ。