OmniAICreator/Qiita-1.07M huggingface dataset:
Certified Ethical Hacker MASTER を取得したので記事にしてみた！

# はじめに

このたび、Certified Ethical Hacker MASTERという資格を取得したので、書いてみたいと思います。

久しぶりにペンテストの勉強でもしてみようかなという感じです。

# Who am i？

しがないエンジニアです。ペンテストは久しく仕事ではやってません。

どちらかというとシステムの設計・構築をメインに仕事をしている感じです。CTFは開催されていて面白そうなものがあれば参加するという程度でガチ勢ではないです。

# Certified Ethical Hacker MASTERとは？

Certified Ethical Hacker MASTER（以降、CEH MASTER）とはCertified Ethical Hacker（以降、CEH）とCertified Ethical Hacker (Practical)の両方の試験にパスすることで得られる資格のことです。

これらの資格はEC-Councilという組織が主催している資格試験です。CEHについては過去に色んな人が記事やブログ（Qiitaなど）で先見の明があるので、軽く説明する程度にとどめますが、Certified Ethical Hacker (Practical)と呼ばれる試験（以降ではCEH Practicalと記載）については今年から日本でも受験可能になった他、記事にもされていないように思えたので、こちらに記載することにしました。

CEH MASTERについてはBSI社のページがわかりやすいです。こちらから申し込みもできます。

https://www.bsigroup.com/ja-JP/our-services/digital-trust/Cybersecurity-Information-Resilience/Training/certified-ethical-hacker-ceh-master/

# CEHについて

CEHとはNmapやMetasploitなどのツールを正しい倫理観を持ったホワイトハッカーが使うにはどういったことが必要か問う資格試験です。資格試験を受験するためにはある程度の経験年数を問われることもありますが、
GSX社などが有償教育として提供している講座を受講することで、経験年数の代わりとしてペイすることができます。

# CEHとCEH Practicalの違いについて

CEHはCBT形式の筆記テストのようなものですが、CEH PracticalはGSX社等の講座を受講したことのある方ならわかる通り、CEH講座のラボ環境のような試験環境があり、その上でCTFをやるイメージに近いです。
ただ、CEH Practicalについてはオープンブック形式を採用しており、ウェブの情報や事前に勉強したテキストなどの参照が可能になっています。なお、CEHについてはCBTの筆記テストのため、事前の持ち込みやウェブの情報を参照することは不可です。

# 苦労したこと

CEH Practicalについて試験申し込みが大変わかりづらくなっています。Exam Specialistsというページで試験の予約をするのですが、同じようなページが複数存在しており、わかりづらいです。またExam Specialistsで予約をした場合、試験監督は日本人ではないです。そのため本人確認書類はパスポートを準備した方が無難です。ある程度の英語のスピーキングも求められるかもしれません。

なお、CEHについてもExam Specialistsで予約が可能になっていますが、PeasonVueで予約を行い試験センターで受けた方が無難な感じがします。

2022年11月現在、円安の影響が試験料金の値上げに影響しそうな感じがしていて、受験される方は円安が落ち着いてからの受験を考えた方がいいかもしれないですね。

たしか再試験はうろ覚えですが８万円から１０万円かかるはずだったと記憶しています。（2022年11月現在）

# 試験対策として勉強したこと（CEH、CEH Practical両方で共通すること）

GSX社の講座受講＋テキストの復習：
講座自体はCEHのものを受講していて、テキストの復習を適宜やってました。
特にCEHの試験勉強では日本語の問題集は今の所ないです。テキストの復習が一番近道な気もしますが、人によって違うかもしれません。

ラボ環境での演習：
CEH Practicalの対策ではラボの演習は必須かもしれませんね。
CTFに慣れている人はそんなことしなくても初見でクリアしちゃうのかもしれないですけど。

ネットサーフィン（情報収集）：
情報収集は適宜やってました。

以上ですかね。人にもよりけりなのかもしれませんが、私はこれくらいでした。

追加情報ですが、CEHStudyGroupというグループがあり、CEH試験の勉強会を不定期で実施しているそうです。なお、私は参加したことがないため、詳細はよくわかりません。

https://ceh-studygroup.connpass.com/event/


# 認定資格の維持（認定試験合格後）

重要なことを忘れていました。EC-Council主催の認定資格は資格維持のための年会費（80USD）の支払い（クレジットカード）とECEクレジットと呼ばれる継続教育のためのポイント申請（3年間で120クレジット）が必要です。

このあたりは、以下の記事が詳しいので、そちらを参考になさってください。

https://qiita.com/taka0189469/items/1fa6b9900311e44f7cf2

# 最後に

それでは、よいハッカーライフを！！
laravel postgresql 接続



```


//接続設定

php.ini

;for windows 設定
extension_dir = "C:\php\ext"

下記はコメントのままいいです
;extension=php_pdo_pgsql.dll
;外します
extension=php_pgsql.dll

```
test ソース
```

<?php
// エラー表示あり
ini_set('display_errors', 1);

$host="host=127.0.0.1";
$port="port=5432";
$dbname="dbname=postgres";
$credentials="user=postgres password=test";

$db = pg_connect("$host $port $dbname $credentials");

if(!$db){
echo "Error : Unable to open database\n";
} else {
echo "Opened database successfully\n";
}
?>

実行
ブラウザでhttp://localhost/postgresql.phpを入力し、以下の画面を表示ならOK。
Opened database successfully
初心者サービス作成 #2 4つの要件定義

[初心者サービス作成 #2](https://qiita.com/ttttc/items/c5fa86151c94fa1d4bb6)の続き

<h2>要件定義</h2>

今回は、要件定義の項目を4つに分けました。

<ul>
<li>業務要件</li>
<li>機能要件</li>
<li>非機能要件</li>
<li>運用・保守要件</li>
</ul>

<h3>業務要件</h3>

業務フローを書き出します。
ユーザーの行動の流れを図にしたりして書き出します。

<h3>機能要件</h3>

必要な機能の条件をここで定義します。

<ul>
<li>ページの遷移</li>
<li>画面のデザイン・フレーム（WF）</li>
<li>必要な機能を具体的に定義する</li>
<li>必要なデータを確認する</li>
</ul>

<h3>非機能要件</h3>

機能以外で必要な条件を定義する。

<ul>
<li>サイトのスピードなど（性能）</li>
<li>機能の追加のしやすさ（拡張性）</li>
<li>サービスがどれくらい落ちないか？（可用性）</li>
<li>サービスの安全性（セキュリティ）</li>
</ul>

<h3>運用・保守要件</h3>

運用・保守に必要な条件

<ul>
<li>運用体制</li>
<li>保守体制</li>
<li>障害時体制</li>
</ul>

以上が要件定義4つの項目です。

4つ全てここに記述するとかなり長くなってしまうので、別記事で業務要件からやっていきます。
英語を「読む」しかできない人達に捧ぐ勉強方法

英語読めるけど全然聞き取れない方って多いんじゃないかと思います。
そのせいで動画で勉強しようとしてもワカランし時間かかるワケです。

そんな方のために、ワタクシが最近知った便利機能とそれを活用した勉強法を紹介します。


# 結論
<b>手順① <font color="red">Youtubeの文字起こし機能で英語字幕を文字に起こす。</font>
手順② 文字に起こした文章を読みながら動画を見る。または翻訳にかける。


# 詳細
## 手順① Youtubeの文字起こし機能を使って<font color="red">英語字幕</font>を文字に起こす。
なぜ英語翻訳を文字に起こすべきかと言うと、<font color="red">日本語字幕は翻訳漏れが多い気がする＆翻訳が分かりにくい</font>からです。
実際、日本語翻訳の字幕を付けて動画を見るとちょいちょい字幕が出ない部分があるので、一旦文字起こし機能を使って文字にしましょう。（英語でも字幕ミスはありますが、そこは気合と魂と根性で読み解く）

::: note 
Youtubeの文字起こし機能の使い方
↓スマホ、タブレット、PCどれでもできます。

①赤丸で囲んだとこクリックして、「文字起こしを表示」をクリック
![スクリーンショット 2022-11-06 180649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/6289f4b9-e644-7a8b-b5db-ab4c9ab3f9b1.png)

②右側のサイドバーに字幕が出ます。
![スクリーンショット 2022-11-06 180726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1311883/cd9768a8-c958-14e5-0bb6-427ad45ccb4b.png)

字幕参照元：[Learn TypeScript in 50 Minutes - Tutorial for Beginners](https://www.youtube.com/watch?v=WBPrJSw7yQA
)

③コピーもできるのでそのまま翻訳へGO
:::

## 手順② 文字に起こした文章を読みながら動画を見る。または翻訳にかける。

そのままです。ｱｰｲ。英語の勉強にもなって一石二鳥です。

::: note warn
この文字起こしした文章を<b>他人に配布、そのまま全文記事にする</b>などは著作権法上の翻案権辺りに引っかかる気がするので「個人的に又は家庭内その他これに準ずる限られた範囲内における使用」の範囲で収めときましょ。
:::

# おわりに
以前、この機能知らずに「気合で字幕読みつつ、分からないところは手打ちで翻訳にかける」ってやり方で勉強してたら、32分の動画で5時間かかったことあります。
文字起こし機能を使えば半分ぐらいの時間で済むようになり、内容の理解に時間を割けるようになったので、ぜひ活用してみてください。
LPC812MAXで時間関数と繰り返しタイマー割込みと液晶(AQM0802A)で遊ぶ(1秒)



x mbed2リビジョン144
x リビジョンの変更ができる人むけ


目的
簡易な時計づくり



![o_cop234.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/63f37e4e-a59e-6466-4f47-c027e007c21a.jpeg)




```c++



// I2C_LCD_TIMER_1_812_1


#include "mbed.h"


#define ADDR_LCD    (0x7C) //  address

//       SDA    SCL
I2C i2c(A4, A5); //812

//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

char    data_read[16];   //i2cバッファー

//液晶初期化配列
char INIT_com[]= {0x0,0x38,
                  0x0,0x39,
                  0x0,0x4,
                  0x0,0x14,
                  0x0,0x70,
                  0x0,0x56,
                  0x0,0x6C,
                  0x0,0x38,
                  0x0,0xC,
                  0x0,0x1,
                  0x40,0x41
                 };

//液晶のクリア
char INIT_cls[]= {0x0,0x1};

//LEDのポートの定義
DigitalOut myled(LED_RED);   //red

//        TX      RX
Serial pc(USBTX, USBRX); //812 Serial2
//Serial pc(D1, D0);       //812 Serial1


//繰り返しタイマー割込みの定義
Ticker flipper;

//累積時間
time_t seconds = 0 + (60 * 60 * 9); // JST

//繰り返しタイマー割込み
void flip()
{

    myled = !myled;
    seconds++;

}//flip


//メイン関数
int main()
{

    //液晶の初期化
    for(int ii=0; ii<11; ii++) {
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);
        wait_ms(2);
    }//for


    flipper.attach(&flip, 1.0); // the address of the function to be attached (flip) and the interval (1 seconds)


    pc.printf("\r\n<START>\r\n"); //debug


    struct tm *t;

    //無限ループ
    while(1) {

        t = localtime(&seconds);

        pc.printf("%04d/%02d/%02d %02d:%02d:%02d",
                  t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);

        pc.printf("\r\n");

        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);
        wait_ms(2);

        //液晶に出力
        // Display result
        data_read[9] = 0;
        data_read[8] = '0' + t->tm_sec - ( DIV10(t->tm_sec) * 10 ); //1の桁
        data_read[7] = '0' + DIV10(t->tm_sec);                      //10の桁
        data_read[6] = ':';
        data_read[5] = '0' + t->tm_min - ( DIV10(t->tm_min) * 10 ); //1の桁
        data_read[4] = '0' + DIV10(t->tm_min);                      //10の桁
        data_read[3] = ':';
        data_read[2] = '0' + t->tm_hour - ( DIV10(t->tm_hour) * 10 ); //1の桁
        data_read[1] = '0' + DIV10(t->tm_hour);                       //10の桁
        data_read[0] = '@';

        i2c.write(ADDR_LCD, data_read,9);

        wait_ms(1000); //1秒待つ

    }//while

}//main




```
シングルトン とは

## 勉強前イメージ

雰囲気、コード書くときのなんかやった気がする

## 調査

### シングルトン とは

英語でsingletonと書き、オブジェクト指向のプログラミング時のクラスのデザインパターンの一種になります。

デザインパターンとはオブジェクト指向の言語で使われる設計のパターンで
設計のときによく直面する問題とその解決策を整理してまとめたものを指します。

シングルトンはクラスを設計するときの設計の方法の一つということです。
その中でも、クラスのインスタンスを2つ以上作成出来ないようにすることで常に同一のインスタンスが参照されるデザインパターン(設計)になります。
プログラム中でインスタンスの状態を常に持っておきたい場合や、クラス端で共通のデータとしてアクセスする必要がある場合に使われます。

## 勉強後イメージ

全然コード書かないからわからないけど
このインスタンスしか参照されないようにって1つだけ置いておくってことかな？

## 参考

- [Singleton](https://gimo.jp/glossary/details/singleton.html)
- [シングルトン 【singleton】](https://e-words.jp/w/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%88%E3%83%B3.html)
JavaScript(Node) でモジュールが直接実行されているかを判別する

# 概要

Python の `if __name__ == 'main'` と同じことを JavaScript(Node) でも行いたい。

https://note.nkmk.me/python-if-name-main/

# 結論

```javascript
if (require.main === module) {
}
```

# 動作確認

```js:foo.js
function doSomething() {
  console.log('doSomething!!')
}

module.exports = {
  doSomething
}

// foo.js が直接実行された場合だけ、すぐに doSomething を実行する
if (require.main === module) {
  doSomething()
}
```

```js:bar.js
const { doSomething } = require('./foo')
```

```bash
$ node foo.js 
doSomething!!
$ node bar.js 
$ 
```

*コードは割愛するが、TypeScript + ESM でも動作確認済み*

# 参考

https://stackoverflow.com/questions/4981891/node-js-equivalent-of-pythons-if-name-main

https://nodejs.org/api/modules.html#modules_accessing_the_main_module
VSCode使っている拡張機能まとめ

# はじめに

フロントエンド開発において、普段使用しているVSCodeの拡張機能をまとめました。

## Auto Rename Tag

開始タグを修正すると自動で閉じタグも修正

<a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag" target="_blank" rel="nofollow external noopener noreferrer">Auto Rename Tag</a>

## Path Autocomplete

パス補完機能

<a href="https://marketplace.visualstudio.com/items?itemName=ionutvmi.path-autocomplete" target="_blank" rel="nofollow external noopener noreferrer">Path Autocomplete</a>

## Eslint

コードの静的解析ツール

<a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" target="_blank" rel="nofollow external noopener noreferrer">Eslint</a>

## Prettier

コードの自動フォーマット

<a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" target="_blank" rel="nofollow external noopener noreferrer">Prettier</a>

## zenkaku

ファイルの全角スペースをハイライト

<a href="https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku" target="_blank" rel="nofollow external noopener noreferrer">zenkaku</a>

## indent-rainbow

インデントの階層ごとに色を付けてくれる

<a href="https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow" target="_blank" rel="nofollow external noopener noreferrer">indent-rainbow</a>

## Material Icon Theme

ファイルツリーのアイコンをマテリアルアイコンに変更

<a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme" target="_blank" rel="nofollow external noopener noreferrer">Material Icon Theme</a>

## WordPress Snippets

WordPressの関数をスニペットで呼び出し

<a href="https://marketplace.visualstudio.com/items?itemName=wordpresstoolbox.wordpress-toolbox" target="_blank" rel="nofollow external noopener noreferrer">WordPress Snippets</a>

以上、他にも便利な拡張機能があれば追加していこうと思います。
EC2のネットワーク設定を自動化するDHCPオプションセット

# はじめに
EC2構築時に```ipconfig```コマンドでとれるようなDNS等の設定を一括で設定できる「DHCPオプションセット」について記載します。これはVPCの機能なので、EC2だけでなくネットワーク内は丸ごとお任せになりそうです。

# DHCPオプションセットでできること

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_DHCP_Options.html#CreatingaDHCPOptionSet

* ドメイン名の指定：companyname.localのようにサーバー名の後ろにつけるドメインを指定します。
* DNSサーバー：DNSサーバーのIPアドレスを4つまで指定できます。
* NTPサーバー：NTPサーバーのIPアドレスを4つまで指定できます。
* NetBiosサーバー：4つまで指定できます。

# 実施方法
VPCのメニューにあるDHCPオプションセットを作成できます。オプションセットを作成したらVPCにアタッチします。

# おわりに
EC2を作成するたびにDNS設定をするのは大変ですし、ここで指定しておくことで、一括で変更することができるようになるので、とても便利です。
【Swift】UIColorPickerViewControllerをRxSwiftに対応した

# はじめに
1ヶ月前くらいからRxSwiftを学習し始めまして、最近はRxSwiftを使って個人開発をしています。
UIColorPickerViewControllerがRxSwiftに対応していなかったのでDelegateをRxSwiftで使えるようにしてみました。

# 何をするか
`colorPickerViewControllerDidSelectColor`と`colorPickerViewControllerDidFinish`をRxSwiftで使えるようにする
```swift
extension ViewController: UIColorPickerViewControllerDelegate {
    func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) {
    }

    func colorPickerViewController(_ viewController: UIColorPickerViewController, didSelect color: UIColor, continuously: Bool) {
    }
}
```

# 実装
```swift
import RxCocoa
import RxSwift
import UIKit

public extension Reactive where Base: UIColorPickerViewController {
    var didFinish: Observable<Void> {
        return RxUIColorPickerViewProxy.proxy(for: base)
            .didFinishSubject
            .asObservable()
    }

    var didSelectColor: Observable<(UIColor, Bool)> {
        return RxUIColorPickerViewProxy.proxy(for: base)
            .didSelectColorSubject
            .asObservable()
    }
}

public typealias UIColorPickerDelegate = UIColorPickerViewControllerDelegate

extension UIColorPickerViewController: HasDelegate {
    public typealias delegate = UIColorPickerDelegate
}

class RxUIColorPickerViewProxy: DelegateProxy<UIColorPickerViewController, UIColorPickerDelegate>, DelegateProxyType, UIColorPickerViewControllerDelegate {
    public init(colorPicker: UIColorPickerViewController) {
        super.init(parentObject: colorPicker, delegateProxy: RxUIColorPickerViewProxy.self)
    }

    // MARK: DelegateProxyType

    static func registerKnownImplementations() {
        register { RxUIColorPickerViewProxy(colorPicker: $0) }
    }

    static func currentDelegate(for object: UIColorPickerViewController) -> UIColorPickerViewControllerDelegate? {
        return object.delegate
    }

    static func setCurrentDelegate(_ delegate: UIColorPickerViewControllerDelegate?, to object: UIColorPickerViewController) {
        object.delegate = delegate
    }

    // MARK: Proxy Subject

    internal lazy var didFinishSubject = PublishSubject<Void>()
    internal lazy var didSelectColorSubject = PublishSubject<(UIColor, Bool)>()

    // MARK: UIColorPickerViewControllerDelegate

    func colorPickerViewControllerDidFinish(_: UIColorPickerViewController) {
        didFinishSubject.onNext(())
    }

    func colorPickerViewController(_: UIColorPickerViewController, didSelect color: UIColor, continuously: Bool) {
        didSelectColorSubject.onNext((color, continuously))
    }

    // MARK: Completed

    deinit {
        self.didFinishSubject.onCompleted()
        self.didSelectColorSubject.onCompleted()
    }
}
```

# 使い方
```swift
colorPicker.rx.didFinish
    .subscribe(onNext: { _ in
        print("終了しました")
    })
    .disposed(by: disposeBag)

colorPicker.rx.didSelectColor
    .subscribe(onNext: { [weak self] color, continuously in
        print("色を選択しました")
    })
    .disposed(by: disposeBag)
```

# おわり
RxSwiftはめっちゃ便利！！
でも、これからはCombineかな？
多次元スライスにスライスを挿入する

## やりたいこと
```
[[1 2 3]]
```
という多次元スライスに
```
[4 5 6]
```
というスライスを足して
```
[[1 2 3] [4 5 6]]
```
にしたい

## やり方
```golang
package main

import "fmt"

func main() {
    sliceA := [][]int{
        []int{1,2,3},
    }
    
    sliceB := []int{4, 5,6}
    
    sliceA = append(sliceA, sliceB)
    
    fmt.Println(sliceA) //[[1 2 3] [4 5 6]]
}
```
入れ物になる方の型`[][]int`はintのスライス（`[]int`）のスライスという意味。
`[]int`が挿入する方の型と同じじゃないとエラーになるので注意
古くなってしまったrubocopを最新まで一気に上げたい人へ贈るバージョンアップの向き合い方

rubocopは定期的に新バージョンがリリースされていますが、最新もしくはそれに近いバージョンにきっちり保てているプロジェクトは案外少ないのではないでしょうか。
[2023年の3月末でRuby2.7のサポートが終了](https://endoflife.date/ruby)するのですが、3.0移行のrubyでrubocopを動かすにはrubocopのバージョンを1.0.0以上にあげる必要があります。
上記の都合から慌ててrubocopのバージョンを上げる必要になった方もいると思います。
しかし、一気に全部やろうとすると、チーム開発であれば他のメンバーの開発とコンフリクトしますし、長時間対応している間に新しいバージョンが出て規則が追加されるので全部対応しきるのは難しいです。
この記事では、そんなrubocopで疲弊する未来が見えた読者の方へ愚直に向き合いすぎないrubocopのバージョンアップ方法を授けます。

## とりあえずバージョンを上げる
まず兎にも角にもバージョンを上げるのが大事です。
そこでまずはrubocopのバージョンを上げてしまいましょう。
環境によってGemfileに書くのか`gem install`するのか異なるの思うので、コマンドは割愛。

## .rubocop.ymlに`NewCops: enable`を追加する
新しいcopも適用するために.rubocop.ymlを編集して、`NewCops`オプションをオンにします。
新しいcopに関して精査しなくていいの？という声も聞こえてきそうですが、ここでは一旦一括でオンにしてしまって大丈夫です。

```yml:.rubocop.yml
AllCops:
  NewCops: enable
```

## `rubocop --auto-gen-config`で一旦全部の違反を黙らせる
古いバージョンのrubocopから新しいバージョンにする時、大量に違反が検出される場合が多いと思います。
しかし、rubocopのバージョンを上げる時に一つ一つの違反と向き合うのは(元のバージョンが古ければ古いほど)正直辛いです。
そこで、一旦違反は全て黙らせてしまいましょう。

```sh
rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 999999
```

1.37以降はこちらのコマンドでも行うことができます。([@_ydahさん情報提供ありがとうございます！](https://qiita.com/WakameSun/items/e25acff31318b50795a8#comment-ee67bac8252366bbe9df))

```sh
rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit
```

また、`.rubocop.yml`に下記の記述を行いましょう。`.rubocop_todo.yml`の記述を読み込んでくれます。

```diff_yaml:.rubocop_yml
+inherit_from
+  .rubocop_todo.yml
```

上記のコマンドと、`rubocop_todo.yml`の読み込みにより、新しい違反ファイルはきちんと違反を摘出してくれて、従来から違反しているファイルは違反を検出しない、という振る舞いになります。

## リリースをする
このタイミングで一旦リリースをしてしまって、rubocopのバージョンアップを行いましょう。

## 一つ一つのCopと向き合う
ここまでくればあと一息です。
.rubocop_todo.ymlに書かれた違反に関して一つ一つ握りつぶしていきましょう。
コミットの単位や、PRの単位に関しては、レビュワーが読みやすいように調整すると良いでしょう。
不要なCopをDisableにしたり、一部のファイル、行だけDisableにするなどの判断もここで行いましょう。
これを`.rubocop_todo.yml`が空になるまで行いましょう。

## まとめ
この記事で、古いrubocopを頑張って最新まで上げたいけど、違反が多くて悩んでる人の苦しみが少しでも和らげれば幸いです。
特にRuby3系へのアップデートでrubocopと向き合う必要が出た方は、頑張ってください。
benchmark_driver 0.16.0 でワンライナー可能に

Ruby のベンチマークテストツール [benchmark_driver](https://github.com/benchmark-driver/benchmark-driver) のバージョンが 0.16.0 に上がった。

新機能の一つは，ワンライナーでの実行（「インライン Ruby スクリプトのベンチマーキング」）。

短いスクリプトならいちいちファイルを作らなくてもベンチマークテストができる。

ではこれを使って，`CGI.escapeHTML` による HTML エスケープを以下の Ruby バージョンで比較してみよう。

* Ruby 3.1.2
* Ruby 3.2.0-preview2
* Ruby 3.2.0-preview2（YJIT）

rbenv で Ruby をインストールしている場合は，`--rbenv`　オプションによって複数の Ruby での比較ができる。オプションの値は以下のように書く。

```
3.1.2;3.2.0-preview2;3.2.0-preview2 --yjit
```

つまり，複数の Ruby バージョンを `;` で区切る。YJIT を使う場合はスペースを挟んで `--yjit` を付ける。

実行するスクリプトは

```rb
require'cgi';CGI.escapeHTML('F&B<GB>B')
```

だ。

全体としては以下のように書く。スクリプトも `--rbenv` の値も `" "` で囲む。

```
benchmark-driver "require'cgi';CGI.escapeHTML('F&B<GB>B')" --rbenv "3.1.2;3.2.0-preview2;3.2.0-preview2 --yjit"
```

結果は以下のとおり。

```
require'cgi';CGI.escapeHTML('F&B<GB>B')
     3.2.0-preview2 --yjit:   1466638.7 i/s 
            3.2.0-preview2:   1098110.5 i/s - 1.34x  slower
                     3.1.2:     46608.3 i/s - 31.47x  slower
```

えっ，ちょっ，ナニコレ？　Ruby 3.2 速過ぎないか？　マジかよ，何があった？

年末にリリースされるであろう Ruby 3.2.0 正式版が preview2 の速度を維持するかどうかは分からないが，ともかく Ruby 3.1.2 → 3.2.0-preview2 で 20 倍速以上になっている。
YJIT を使うとさらに 30% 以上も速くなっている。
ええ〜っ？

いや，まあ，他にいくつか試したコードでは Ruby 3.2.0 は全然速くなってないので，`CGI.escapeHTML` が特殊なケースなのだろうと思う。
うーん，それにしても `CGI.escapeHTML` はこれまでも [高速化を繰り返してきた](https://qiita.com/scivola/items/b2d749a5a720f9eb02b1) のに，まだ大幅な高速化の余地があったのかね。
これが何か私の勘違いとかではなく正夢であることを祈る。
ARM とは

## 勉強前イメージ

CPUの種類的な？
ただ、CPUの種類だけでなんかEC2とかもいろいろ違ったりするし、そんな違う？って思ってる。
わからん。
CPUといえば、インテル入ってる って感じ。

## 調査

### ARM とは

アームと読み、スマートフォンや携帯電話・タブレットでよく使われるCPUのアーキテクチャになります。
ARMは特定のメーカーのCPUを指すのではなく、CPUの設計のことを指しています。
そのため、色んなメーカーのARMの設計で作られたのCPUが使われています。

### CPUのアーキテクチャ とは

アーキテクチャには色々ありますが、よく聞くのは以下の2つになります。

- x86
	- インテル社のアーキテクチャ
	- CPUのブランドはCeleronやCore
- ARM
	- ARM社のアーキテクチャ
	- 家電やスマホでARMのアーキテクチャが使われている

### そもそもCPUとは

CPUとはCentral Processing Unitの略で、日本語では中央処理装置と呼ばれる電子回路のことです。
HDDやメモリなどからデータを受け取って制御・演算を行うというコンピュータの中核を担っており、人でいうと頭脳の立ち位置です。

CPUでよく気にされるのはPCだと思います。
ただCPUが使われているのはPCだけでなく、スマホや家電にも使われています。
CPUはCPUでもPC用と家電用では全く別で、PC用はCPUの性能を重視するため消費電力が高いものが多くなります。
逆に家電などのCPUは低電力が重視されます。

PC用でよく名前を聞くインテルのCPUは比較的高性能・高消費電力なCPUです。
逆にARMのアーキテクチャで作られているCPUは低電力で小型になっています。
そのため、パソコンの世界ではインテル(x86)のCPUがよく使われていますが、スマートフォンの世界だとARMのアーキテクチャで作られたCPUが使われていることが多いです。

### ARMのアーキテクチャで作られたCPUの特徴

- 小型、かつ省電力

ARMのCPUはインテルのCPUと比べて電力の消費量が少ないです。
また小型なのも特徴で、そのため組み込みの家電やスマートフォンで使われることが多いです。

## 勉強後イメージ

CPUといえばインテルでしょって思ってたけど、そもそもARMはアーキテクチャだった。
EC2買うときに特定のインスタンスタイプがARMしかあかんかったのなんでやろって思ったけど
そもそものAWSのサーバのCPUの構築時の考え方が違うってことか。
↓の画像見た時も別で構築になるんやーって思ったし。

![1EC2 Management Console - Google Chrome 2022-11-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a7e0f06d-7153-b7bf-20e4-93869e53faa0.png)

いろいろへぇって思った。

## 参考

- [ITエンジニアの豆知識　CPUのアーキテクチャって？](https://beyondjapan.com/blog/2021/01/cpu_architecture/)
- [組み込み開発におけるARM入門](https://www.fsi-embedded.jp/kumico/column/3373/)
- [【第１５回】 ARMプロセッサを使ってみよう](https://isabou.net/knowhow/colum-it/colum15.asp)
laravel メモ


```
laravel 常用コマンド
```


```
php artisan route:list
php artisan migrate
php artisan make:model Book

一時サーバ起動
php artisan serve --host=0.0.0.0 --port=8080

デバッグ
dd($val)

DB接続
psql -U postgres
DB今の状況を確認
php artisan migrate:status
DB作成
create database mydb;


-----------------------------------------------laravel バリデーション

blade
@for($i=0;$i<2;$i++)

<p><td><input type="text" id="i[{{$i}}]" name="n[{{$i}}]" value="{{ old('n.'.$i) }}" ></td></p>

@endfor


validate
public function rules()
{
    return [
        'n'.'.*'  => 'required|max:1',
    ];
}




-------------------Laravelで`Target class [〇〇Controller] does not exist.対応方法

Route::get('/hello','App\Http\Controllers\HelloController@index')

これで行けるはず



//----------DB 接続設定

php.ini

;for windows 設定
extension_dir = "C:\php\ext"

下記はコメントのままいいです
;extension=php_pdo_pgsql.dll
;外します
extension=php_pgsql.dll




<?php
// エラー表示あり
ini_set('display_errors', 1);

$host="host=127.0.0.1";
$port="port=5432";
$dbname="dbname=postgres";
$credentials="user=postgres password=test";

$db = pg_connect("$host $port $dbname $credentials");

if(!$db){
echo "Error : Unable to open database\n";
} else {
echo "Opened database successfully\n";
}
?>

実行
ブラウザでhttp://localhost/postgresql.phpを入力し、以下の画面を表示ならOK。
Opened database successfully
初めてのPower BI ＃2 日別/月別 ExcelファイルをPower BI で可視化

# 今回は「日別/月別 Excelファイルの可視化」です

Power BI で色々とデータの分析/可視化ができると聞いて、いざExcelファイルで可視化を始めてみると「あれ？予想と違う。。。」　となることないですか？
こんな感じのExcelファイルがデータソースになっているとそんな「？」が起きるケースが多い印象です。こちらは2019年の訪日外国人を月ごとにまとめているデータです。https://www.jnto.go.jp/jpn/statistics/visitor_trends/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/e9b98616-8dba-159f-1df8-52b359519d1b.png)
このファイルをそのままPower BI に読み込んで素直に画面を作るとこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/ae94b431-5b5f-53a8-371c-c29631af78d4.png)

"1月"から"12月"までの月ごとに列ができていて、"国名"の列がありますが、このデータ構造のままだとできることは月単位での訪日外国人情報を可視化することまでです。
年単位での訪日外国人を国単位で集計とかはメジャー作成をしたりしなきゃできなくなります。
# どうすればいいのか
Power BIは列単位でデータを扱うことができるツールです。
なので、データ形式としては、こんな感じになっているほうが扱いやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/b16e7b11-16bf-02b5-930c-8c9c61d45957.png)

[国名]、[訪問月]、[訪問人数]の3つの列があればBIツールで可視化する際に楽です。
元のデータがこんな形になっているのがベストですが、Excelなどのデータは人間の目に見やすい形になっているので、往々にしてBIツールには優しくない形式です。

# じゃぁどうしようか
データをBIツールが読み込みやすい形に変更してみましょう。
もちろん、元のExcelなどのデータを書き換えると業務に支障が出てしまうので、元のデータはそのままの形でBIツール側で使いやすい形に変更します。
これを”データを整形する”といいます。

Power BI Desktopではデータ整形ツールとしてPower Queryが提供されています。
"Power BI Desktopでのクエリの概要"
<https://learn.microsoft.com/ja-jp/power-bi/transform-model/desktop-query-overview>

Power QueryはPower BI Desktop専用ツールではなくExcelでも利用可能です。
"ExcelのPower Queryについて"
<https://support.microsoft.com/ja-jp/office/-7104fbee-9e62-4cb9-a02e-5bfb1a6c536a>

# 実際の手順
Power BI DesktopでPower Query を起動します。
①　[ホーム]タブの[データの変換]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/699e7426-0d56-11f8-1b84-047eefe472c8.png)
こんな画面が開かれると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/d9d11611-25bb-a056-6c71-e71724518ca6.png)
この中で1月、２月となっている列を"月"と"人数"の２列にしたい。
その際に利用するのが[ピボット解除]という機能です。
詳細はこちらのMicrosoft Learnに詳細記載されてますので是非ご一読ください。
"列のピボットを解除する"
<https://learn.microsoft.com/ja-jp/power-query/unpivot-column>

②　"国名"を右クリックして[その他の列のピボット解除]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/328b0baa-69f7-7ee5-3229-d8661d3212b4.png)

③　BIに使いやすいデータ形式の出来上がり！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851825/8e202a86-b02a-0a99-13f5-774e4a44a40b.png)

④ 画面左上の[閉じて適用]を選択してレポート画面で自由に画面作成

# 終わりに
いかがですか？
データ可視化するときには「ピボット解除」を使うとちょいと気の利いた画面がすぐに作成可能かと思います。
もちろん[ピボット解除]という言葉を知っていればネット検索などで手法は出てきますが、そもそもそんな言葉を知らなければ一人悩むことになってしまうかも。
そんな思いで今回の投稿となりました。

「データの形がBI向けじゃなければBIツールに合う形に変更して使う」
当たり前のことかもしれませんが、Power BI（データ可視化）を触り始めてすぐのころの私には「目から鱗」の発想でした。

データ可視化作業、そんなに構えず気楽に触ってみていただければ大変うれしく存じます。
Capistranoを使って自動デプロイする

某フリマアプリを作成した際、AWSのEC２を利用して自動デプロイするとき、ものすごく手間がかかったので備忘録。
詰まったところをかいつまんで載せる。
まず
```ruby
adapter: mysql2
  database: （アプリ名）_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```
をconfig/database.ymlに記載するわけですが、この記載場所は、
プロダクションのところに記述します。
例えば、
```ruby
production:
  <<: *default
  adapter: mysql2
  database: furima-（番号）_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```
といった感じに。

次につまづきそうになるのが、
```terminal
[ec2-user@ip-172-31-23-189 ~]$ cd /var/www/[リポジトリ]
[ec2-user@ip-172-31-23-189 <リポジトリ名>] git pull origin master
```
のところですが、昨今のGitではmasterではなくmainブランチという名称なので、
config/deploy.rbを
```ruby
set :branch, "main"　　　 ←ここをmasterからmainにかきかえる
```
にする。
そして最後にCapistranoを使って自動デプロイする際は必ずローカルのターミナルで
```terminal
% bundle exec cap production deploy
```
を実行する。

ここまででエラーがたくさん出たのですが、割愛。
大体がnginxでのエラーかマリアDB周りのエラーが多かった気がする。
nginxでエラーがでたらエラーログを見るわけですが、正直わからない・・・
マリアDBに関するエラーとしては最悪DBを一度作り直すという荒技があります。
参考リンク
https://qiita.com/potterqaz/items/ea6db5c5be2be389c0bb

あとはひたすらエラーとの勝負です。

nginxのエラーはとてもふりまわされたので、しっかり勉強したい。
【JavaScript】isPrototypeOf

`isPrototypeOf`メソッドは、対象のオブジェクトが、他のオブジェクトのプロトタイプチェーンに含まれるかどうかを評価するプロパティです。（プロトタイプチェーンについては[こちらの記事](https://qiita.com/howdy39/items/35729490b024ca295d6c)で分かりやすく解説されています！）

対象のオブジェクトが、他のオブジェクトに継承されているかどうかを調べることができます。
~~~javascript
{対象のオブジェクト}.prototype.isPrototypeOf({このオブジェクトのプロトタイプチェーンに"対象のオブジェクト"が含まれるかどうか});
~~~

以下では、コンストラクタ関数`Mutant`のインスタンスに対し、`Human`、`Mutant`、`Alien`が生成したインスタンスのプロトタイプチェーンに含まれるかどうかを出力しています。

~~~javascript
function Human () {}

function Mutant () {}

function Alien () {}

Mutant.prototype = Object.create(Human.prototype);

const mutant = new Mutant();

console.log(Human.prototype.isPrototypeOf(mutant)); // true

console.log(Mutant.prototype.isPrototypeOf(mutant)); // true

console.log(Alien.prototype.isPrototypeOf(mutant)); // false
~~~

オブジェクト`mutant`のプロトタイプチェーンは`Mutant <- Human`となります。

`Human`は、`mutant`のプロトタイプチェーンに含まれる為、1つ目のログは`true`になります。

`Mutant`は、`mutant`のプロトタイプチェーンに含まれる為、2つ目のログは`true`になります。

`Alien`は、`mutant`のプロトタイプチェーンに含まれない為、3つ目のログは`false`になります。

___
#### `instanceof`との違い

`isPrototypeOf`のような`prototype`（継承関係）を評価するメソッドと似たもので、`instanceof`演算子があります。

~~~javascript
{このオブジェクトのプロトタイプチェーンに"対象のオブジェクト"が含まれるかどうか} instanceof {対象のオブジェクト}
~~~

先ほどのコードの`isPrototypeOf`の箇所を`instanceof`に置き換えても、出力結果は同じになります。
~~~javascript
console.log(mutant instanceof Human); // true

console.log(mutant instanceof Mutant); // true

console.log(mutant instanceof Alien); // false
~~~
___
上記のように`isPrototypeOf`と`instanceof`は基本的に同じ挙動を取る為、これらは同じものと考えても問題はないと思います。

ただ、以下のように使用可能な条件が若干異なるようです。

~~~javascript
const Human = {
  prototype: {}
};

function Mutant () {}

Mutant.prototype = Object.create(Human.prototype);

const mutant = new Mutant();
~~~

**1. `instanceof`の右辺は、コンストラクタ（関数）である必要があります。**

その為、通常のオブジェクトを右辺に設定すると、タイプエラーが発生します。

~~~javascript
console.log(mutant instanceof Human); // TypeError: Right-hand side of 'instanceof' is not callable
~~~
**2. 対して`isPrototypeOf`は`Object.prototype`のメソッドなので、評価対象のオブジェクトが`prototype`を持ち、それがオブジェクトであれば実行可能です。**
~~~javascript
console.log(Human.prototype.isPrototypeOf(mutant)); // true
~~~

他にも異なる点などがあれば、是非コメントいただけると嬉しいです🙏

最後まで読んでいただきありがとうございました！
WIDE Project とは

## 勉強前イメージ

JUNETの後に出来たやつって感じだった気がする

## 調査

### WIDE Project とは

Widely Integrated Distributed Environmentの略で
OSの技術及び広域的なスケールにおける通信技術を基盤とした、新しい分散型のコンピューティング環境の確立を目指して開始されたプロジェクトです。
WIDE Projectでは専用のインターネットを運用しており
参加する機関はWNOC(WIDE Network Operation Center)という機関に専用線で接続されています。

[JUNET](https://qiita.com/miyuki_samitani/items/c5796a42808692f04885) を作った村山純が
大学・研究機関とWIDE研究会を作って、その後WIDEプロジェクトになりました。

.jpドメインの登録や管理を行うレジストリの [JPRS](https://qiita.com/miyuki_samitani/items/5379be9bfed25170459c) もWIDEプロジェクトに参加しており
専用インターネットのルートサーバの内の1台の運用管理を行っていたりしており、いろんな企業が参加しております。
WIDEプロジェクトは国内だけでなく海外の組織とも協力して進められています。

実はWIDEプロジェクトは世界のDNSのルートサーバ13台の内、M Root DNSサーバの運用管理も行っています。
世界のDNSルートサーバの一覧は [こちら](https://qiita.com/miyuki_samitani/items/4c32821915bc7316c947) にも記載されています。

## 勉強後イメージ

ルートサーバの管理のところ、昔DNSのルートサーバ調べたときに確かに書いてた・・・
点と点が線で結ばれた感じーー

## 参考

-[WIDEプロジェクトとは](https://www.nic.ad.jp/ja/basics/terms/wide-project.html)
-[WIDE Project（ワイドプロジェクト）](https://jprs.jp/glossary/index.php?ID=0062)
JUNET とは

## 勉強前イメージ

歴史的なやつ好きなの
確かインターネットの歴史的なやつだった気がする

## 調査

### JUNET とは

電話回線を用いて [UUCP](https://qiita.com/miyuki_samitani/items/030801071306b95fda5c) で学術組織を中心として作られた研究用のネットワークで、日本のインターネットの雛形になったものです。

最初に1984年に東京大学・東京工業大学・慶應義塾大学を結ぶネットワークで開始され
最終的に700の機関を結ぶネットワークになりました。
JUNETになる前は経王寺ぎゅく大学と慶応大学で個人的なデータの移動のために大学の許可を得ずに接続しており、それが東京大学も加わってJUNETになりました。

その当時世界中でアカデミアネットワークが作られており、日本もアカデミアネットワークとしてJUNETが作られました。
JUNETのトップレベルドメインは `junet` で、1989年に `.jp` へ移行して、その後1991年にJNIC(JPNICの前身)に引き継ぎました。
1994年に停止が行われました。

JUNETは元々 `Japan University Network` の略でしたが、
大学以外の機関が加わった時点で `Japan UNIX Network` となり
UNIX系以外が加わった時点で `Japan U[a-z]* Network` 担ったと言われています。

## 勉強後イメージ

すご・・・・
最初大学の許可なしで進めてたのww

## 参考

- [JUNETとは](https://www.nic.ad.jp/ja/basics/terms/junet.html)
- [日本のインターネットの起源"JUNET"ってご存知ですか?](https://a-human.net/post/topics/502)
バグバウンティ とは

## 勉強前イメージ

バグをどないかするの？

## 調査

### バグバウンティ とは

日本語で脆弱性報奨金制度やバグ報奨金制度と呼ばれており
システムなどにバグがあると想定して公開し、バグを発見した方に報酬として報奨金を渡すシステムのことを指します。
元々はNetscapeというブラウザを開発した会社から始まったと言われており、
現在はセキュリティエンジニアとして実績づくりもできるとされています。

システムやネットワークが複雑になると、攻撃に使われる手法も多様化します。
開発サイドだけでは十分でないケースも有り一般の攻撃者の視点からのチェックも有効になるケースもあります。
アメリカでは2021年には40億以上の報奨金が支払われて専業のバグハンターもいるようです。

## 勉強後イメージ

バグバウンティって英語ではバグの報奨金みたいな意味だった
いろいろ資料を見ててもあまり日本では活発でないみたい？しらんけど

## 参考

- [バグバウンティとは？バグハンターとしての新たな稼ぎ方](https://cybersecurity-jp.com/column/27759)
- [バグ見つけて賞金を稼ぐ「バグバウンティ」。数字から読み解く「バグハンター」の世界](https://levtech.jp/media/article/column/detail_49/)
【Android】Google Play Billing Libraryのv4以降が必須化した話

# はじめに
11月1日より、色々とストアの事情が変わったようですね。
その中の１つであるBilling Libraryに関しての動きを簡単にまとめようと思います。

# Billing LibraryV4以降が必須化した
タイトルにもあるように、2022年11月1日よりv4以降が必須化されました。
必須化された後は古いバージョンを設定した状態のビルドはストアアップロード時にエラーとなり、更新並びにリリースもできない状況となります。
知らずにこの状況に陥り、ライブラリアップデートが急務となり冷や汗をかいたなんて方がいらっしゃるかもしれません、、、。

そもそもBilling Libraryは各バージョンのサポートを2年と定めており、この期間を過ぎると古いバージョンを含んでいるビルドはリリース時にエラーとなります。

[Billing Libraryリリースノート](https://developer.android.com/google/play/billing/release-notes?hl=ja)
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/cdcec36a-c55c-9761-451b-40bb81552529.png)

上記画像がサポート期間となっていますが、V3が今の時期に切れる様子が伺えるかと思います。
Billing Libraryの更新は差分が多くなる傾向があり、検証も含めて片手間でできるアップデートではないと思いますので、次のV4が切れるタイミングも見据えて対応がまだの場合はなるべく早く更新いただくことをお勧めします。

# さいごに
Android13対応もそうですが、チーム内でこの辺りのコストをしっかりと共有し、いざ対応する際に困らないよう事前に調整しておくことが重要かと思います。
バージョン更新も楽な作業ではないはずなので、作業者も含めチーム全体が幸せになれるようなやり方を模索していきたいところですね。
テキスト入力補助プラグイン（複数行入力）を作ってみた

# はじめに
kintoneの複数文字列フィールドに文字を入力する際に、定型文を選択して入力したい。
しかも、レコードの条件によっては定型文の選択肢を動的に変えたい。
そんな機能をjavascriptで実装していましたが、勉強のためプラグインとして作成してみました。

ドロップダウンでは、まかなえないんだけど日々同じような文言を入力する時に、単語登録も一つの選択肢ではありますが、利用する人が多い場合には、どうしても文言の揺れが発生してします。
そんな悩みを解消したい場合に使ってみて下さい。

# 導入方法
githubによりファイルをダウンロードして、distフォルダ内にあるzipファイルをkintoneのプラグインとして登録して下さい。
* リポジトリ:https://github.com/necomochi/textInput_assistance
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/b42fec4a-0408-cef9-e868-1aa3479724d1.png)

# 出来ること
* 定型文をプラグインの設定として保存された値、もしくは文字列（１行）にカンマ区切りで設定した値に対し動的に複数選択のテキスト補助を作成し、クリックすることで対象の入力フィールドに文字をコピーします。
* チェックを外すことで入力フィールドから文字も消えます。
* 定型文の保存先を文字列（１行）にした場合は、文字列フィールドのチェンジイベントで定型文を再作成します。ルックアップの他のフィールドのコピー先のフィールドを定型文設定フィールドとして設定することで、動的に定型文を変更することが可能です。
* テキスト入力補助は＋ボタンで折りたたむことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/0d0f0710-0acb-6857-f2c5-6526f6ba97a3.png)

# プラグインの設定方法
* アプリにはテキスト入力補助を表示するスペースを設定して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/6928da40-cd39-6df1-2a78-12835bbb8cac.png)
* 入力補助を表示するスペースを設定
* 入力元を文字列（１行）フィールドか文字列のいずれかを設定
* 入力先となるフィールドを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879170/5a8867d0-ed38-14f5-725c-0d28828b7499.png)
[簡単に]DockerでSQLをいじれる環境をつくろう[入門]

## アジェンダ
業務でSQLでデータ抽出を行うことが増えました。
SQLコマンドは開発業務を行う上で、基本言語のように扱えなければいけませんが、練習する環境があまりない…

なので、どんな環境でも簡単にSQLでDBを操作できるようにしたい！
Dockerを用いて、SQLをいじれる環境を簡単に構築できるように、備忘録として残していきます。

※使用するDBはMySQLです。

## 前提
* ターミナル上でMySQLをいじりたい
* Dockerを用いて爆速で環境構築したい
* 入門者である

## 環境構成
* mac OS ventura 13
* mysql: 8.0.29-debian

## ディレクトリ構成
```
sqlmanabu
    └ Docker-Compose.yml
    └ mysql
        ├ Dockerfile 
        ├ my.cnf
        └ db
```

## 各種ファイルの詳細
### Docker-Compose.yml
```
version: "3.8"
services:
  db:
    build:
      context: .
      dockerfile: ./mysql/Dockerfile
    ports:
      - "3306:3306"
    container_name: sqlmanabu
    image: sqlmanabu
    platform: linux/amd64
    volumes:
      - ./mysql/db:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_DATABASE=sqlmanabu
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=admin
      - MYSQL_ROOT_PASSWORD=admin
      - TZ="Asia/Tokyo"
```

### Dockerfile
```
FROM mysql:8.0.29-debian

RUN apt-get update \
    && apt-get install -y locales \
    && sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen \
    && locale-gen \
    && update-locale LANG=ja_JP.UTF-8 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ENV LC_ALL ja_JP.UTF-8

EXPOSE 3306

COPY ./mysql/my.cnf etc/my.cnf
```

### my.cnf
```
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
```

### Makefile
```
build:
        docker-compose build
up:
        docker-compose up -d
sql:
        docker exec -it sqlmanabu bash -p
down:
        docker-compose down
```

## MySQLサーバーの起動
```.zsh:zsh
# Dockerイメージのビルド
$ make build

# Dockerコンテナの作成
$ make up

# コンテナにログイン
$ make sql

# MySQLサーバーへログイン
$ mysql -u root -p -h 127.0.0.1
$ Enter password: admin

# 以下が表示されれば成功
$ Welcome to the MySQL monitor.  Commands end with ; or \g.
$ Your MySQL connection id is 11
$ Server version: 8.0.29 MySQL Community Server - GPL

$ Copyright (c) 2000, 2022, Oracle and/or its affiliates.

$ Oracle is a registered trademark of Oracle Corporation and/or its
$ affiliates. Other names may be trademarks of their respective
$ owners.

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

$ mysql>
```
##### success!

## 終わりに
一旦備忘録としてメモ程度に残しています。
※なので「こうして、次にこうして」という手順を、今時点では残しておりません。肉付けを徐々にしていきます…

徐々に肉付けしていければと思いますので、ご指摘等あればお気軽にコメントいただければ幸いです😋


##### めちゃくちゃ参考にしたリンク
https://zenn.dev/takuho/articles/efc40344f3122e
https://next-k.site/blog/archives/2022/04/27/785
[OCI] hostnameの変更で詰まったのでメモ

# 概要
Linux kernelを搭載しているOSにおいて、
```
$ hostnamectl set-hostname <hostname>
```
でhostnameを変更できるのは一般に知られていることだが、
OCIのOracle Linuxで変更時、再起動したら元のhostnameに戻る事象が発生したので、変更方法をメモ。

# 方法
/etc/oci-hostname.confの変更が必要。
```
$ sudo sed -ie "s/PRESERVE_HOSTINFO=0/PRESERVE_HOSTINFO=2" /etc/oci-hostname.conf
```

# 確認
実際に実施して確認してみる。
## 1. vNICを修正する。
アタッチされているvNICのhostnameを、修正したいhostnameにする。
今回は `hostname1` → `hostname2` に変更したい状況を想定している。

## 2. 変更後、再起動してみる。
```
$ hostname
hostname1
$ sudo hostnamectl set-hostname hostname2
$ sudo reboot
```

## 3. 変更が適用されているのがわかる。
```
$ hostname
hostname2
```

# 参考
https://www.devopszones.com/2021/08/how-to-permanently-change-hostname-in.html
mb_check_encoding関数の調査

## はじめに
久しぶりに文字コード絡みの不具合を調査したので備忘録として経緯をまとめます。

## 背景

- PHPのCSVファイルのアップロード処理で不具合が発生しました。
- 特に変わった処理はなく、ファイルをアップロードして、DBに取り込むというよくある処理。
- ただし、アップロードしたファイルをfilterを使用して、チャンクごとにmb_check_encoding関数で文字コードをチェックしていた。

## 不具合

- 1年以上運用されているサービスで、基本的には問題なく動作していた。
- 極稀にCSVファイルが最後まで読み込めずに処理が終わるという現象が発生する。
- 例外が捕捉されず、システムエラーとして扱えない。

## 原因
調べた結果、「髙」（はしごだか）などの文字コードが原因のようでした。
「髙」自体はよく使われているので、「極稀に」発生するという現象の辻褄があいませんでした。

Shift-JISでは、一部の文字には「IBM拡張文字」と「NEC選定IBM拡張文字」の２つの文字コードが割当てられているようです。
https://ja.wiktionary.org/wiki/%E9%AB%99

今回発生した不具合は、「IBM拡張文字」ではなく、「NEC選定IBM拡張文字」の文字コードが使われている場合に発生していました。
Windowsでは「IBM拡張文字」と「NEC選定IBM拡張文字」が割り当てられている場合、「IBM拡張文字」でエンコードされるのがデフォルトのようです。
確かに、エラーの原因となったファイルを再保存すると、不具合が再現しなくなりました。（再保存することによって「髙」が「IBM拡張文字」にエンコードされ不具合が発生しない）

結局、「髙」（はしごだか）が「NEC選定IBM拡張文字」でエンコードされた文字を含むCSVファイルのときに不具合が発生していると結論しました。
（デフォルトでは「NEC選定IBM拡張文字」でエンコードされないので、発生頻度が少ないことにも辻褄が合う）

## 解決方法
チャンクに分けることによりバイトコードの判定がおかしくなっているのかなと思い、filterでの文字コードチェックをしないようにし、最終的にはmb_check_encoding関数を使用しないようにしました。

「IBM拡張文字」と「NEC選定IBM拡張文字」による不具合報告は検索しても見つけられなかったんですが、他では発生してないのかな？
【Windows】QWERTY以外のキー配列に慣れたい【DvorakJ】【kbv】

# 概要
Windowsのキー配列を変更するには，DvorakJを使います。
詳しくは，前の記事を見てください。

https://qiita.com/toracatman/items/84cfd8cbb0fcb175007e

Eucalyn配列など，QWERTY配列以外でタッチタイピングを習得するまでは，どのキーがどの位置にあるかがわからないです。
それまでは，そのキー配列を見ながら，タッチタイピングを習得したいです。
そんなときは，kbvというソフトが役に立ちます。

http://hp.vector.co.jp/authors/VA054714/

このソフトは，画面上にキーボードを表示するソフトです。表示されているキー配列を変更することもできます。現在押されているキーをハイライトしたりもします。
kbvのキー配列を使いたいキー配列にすれば，画面上にそのキー配列を表示しながら，使うことができます。

# バグなど
次のようなことがありますが，キー配列を表示する分には問題ないでしょう。

バグ
- kbvではShiftキーを押している間は，表示されている文字が変化するけど，「]」キーは変化しない
- テンキーのPgDnキーがハイライトするのが，Page Upキーを押している間なっている

仕様
- 設定ファイルがShift_JISなので，Unicode文字が表示できない

他のソフトとの相性
- DvorakJを有効にしている間はハイライト一瞬しか表示されないし，時々ハイライトがずれる

# カスタマイズした設定ファイル
自分で慣れたいキー配列にするのは，結構めんどくさいので，カスタマイズした設定ファイルを用意しました。
初期状態のkbvはこんな感じです。
![kbv1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/80d62a25-c57a-35a6-51c8-211a04601a85.png)

## JISキーボード版
初期状態だと地味なので，特殊キーは可能な限り刻印通りの表示をして，色も変更すると，こうなりました。
![kbv2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/434eadc3-463e-606e-9cc9-262a73116adb.png)
僕が使っているパソコンが青いので，青くしました。好みに合わせて，カスタマイズしてください。

上はQWERTY配列です。Eucalyn配列，Eucalyn改配列では，こうなります。
![kbv3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/dd539f36-00fa-6e15-aa3d-60a3270f8974.png)
![kbv4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/927fc513-c58b-4f2e-5e37-1c80f2fb0681.png)

## 英語キーボード版
英語キーボード版の設定ファイルも用意しました。Dvorak配列、Colemak配列、Eucalyn配列、Eucalyn改配列もあります。
英語キーボードには「￥」キー、「＼」キー、無変換キー、変換キーがないので，空欄になっています。
右Windowsキーがあるので，右Altキーをずらして，右Windowsキーを入れています。
![kbv5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/9f76128a-d361-8d1e-f9e6-8c7ce7d56797.png)

## おまけ
通常のキーも含めて，完全にJISキーボードの刻印通りの表示をする設定ファイルも作ってみました。
こちらは，Shiftキー、Caps Lockキー、Num Lockキーによる変化はありません。
QWERTY配列のみです。
![kbv6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/903209/10ea40e3-f5c4-2f8b-c810-9cfd942fe673.png)

# 使い方
1. kbvをインストールします。
1. kbv設定ファイル.7zをダウンロードして，解凍します。
1. kbvのフォルダーに，使いたいキー配列のkbv.iniをコピーします。

# ダウンロード
JISフォルダーがJISキーボード，USフォルダーが英語キーボードです。
直下のkbv.iniはQWERTY配列です。

https://drive.google.com/file/d/1AOZ1FwactNBKS8eCI-uC6jk9E6RYIknx/view?usp=sharing

# 最後に
わからないことや，おかしいところ，作ってほしいキー配列などがあれば，コメントでお知らせください。
[Rails]dependent: :destroyオプションとは

## きっかけ
アプリ作成を復習中に？？？となりましたので、復習として、投稿します。

## dependent: :destroyオプションとは

dependentオプションとは親モデルを削除した時に、
親モデルと関連している子モデルに対する挙動を指定するオプションです。

＜例＞
1つのツイートに対して5つのコメントがあるとします。
そのツイートが削除されたら、それに付随する5つのコメントも削除されるべきです。

その場合、Tweetモデル（親モデル）に関連している
Commentモデル（子モデル）のdependentオプションに、:destroyを指定します。

## 実際のコード
モデルのアソシエーションに追記します
```ruby
class Tweet < ApplicationRecord
   has_many :comments, dependent: :destroy
end
```
上記記述により、
tweetsテーブルのレコードが削除された場合、
関連しているcommentsテーブルのレコードも同時にdestroyメソッドが実行され、一緒に削除されます。
Cloud Pub/Subを利用するCloud Runのサービスにおいて同時実行数を超えるリクエストを送るとどうなるか

# はじめに

Google Cloud PaltformのCloud Runのサービスについて確認したいことがあり、試行して確認しましたので、それについて記述します。
なお、2022年11月6日に確認した結果です。

# 確認したかったこと

　**Cloud Pub/Subを利用するCloud Runの「サービス」においてサービスの同時実行数を超えるリクエストを送るとどうなるか**です。
　公式のドキュメントでは同時実行数は「コンテナあたりの最大リクエスト数」のことのようです。ただ、「インスタンスの最大数」というパラメータもあり、同時に処理できるリクエストの数は「コンテナあたりの最大リクエスト数」×「インスタンスの最大数」（ここではサービスの　同時実行数と呼ぶことにします）ということになると思います。
　予想としては、Cloud Pub/Subはメッセージング・サービスであり、リクエスト（メッセージ）がキューイングされ（Queueに入れられ）、Cloud Runで処理できるようになったら順次リクエストが処理されると思っていました。

# 結果
　リクエスト（メッセージ）がキューイングされ（Queueに入れられ）、Cloud Runで処理できるようになったら順次リクエストが処理されました。
　予想と違っていたのは、サービスの同時実行数の上限一杯まで処理が行われていると、Pub/Subによるサブスクライバーへのpush配信によるサービス起動のリクエストに対し「429 Too Many Requests」が返ってきます。Pub/Subによるリトライが何度か行われて、最終的には空きができ、処理が実行されるという結果になりました。

# 確認方法
## チュートリアルの実施
基本的に以下の公式のチュートリアルを参考に試行を行いました。

https://cloud.google.com/run/docs/tutorials/pubsub?hl=ja

コードとしては、チュートリアルにあるとおり、以下のリポジトリにあるコードを使いました。

https://github.com/GoogleCloudPlatform/nodejs-docs-samples

## 実施した修正
そのままでは検証をやりにくいので、いくつか修正を行いました。
まず、サンプルのコードに少し修正を入れました（修正は[こちら](https://github.com/takanattie/nodejs-docs-samples/commit/071792ddff49c443c486e3e6345895665600f03a)）。30秒の待ち時間を入れるために[このページ](https://hirooooo-lab.com/development/javascript-sleep/)を参考にしました（コードを参考にしました）。
次はCloud Runの「同時実行」（コンテナあたりの最大リクエスト数）と「最大インスタンス数」をそれぞれ1にしました。つまり、サービスの同時実行数は1です。

![screen1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470635/4774672a-7edd-5c4b-65de-a760c3138bfc.png)

# 確認の実施
チュートリアルにあるとおり、以下のコマンドで3つのメッセージを連続で送りました。

```shell
gcloud pubsub topics publish myRunTopic --message "Runner"
```
オペレーションのロギング（Cloud Logging）で見ると以下のようになっています。
最終的に3つのリクエストが処理されましたが、途中では「429 Too Many Requests」が返ってきており、リトライが行われています。
![screen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470635/ae9516a6-08d1-c333-3165-0066ebf7f0f3.png)

## 考察
リトライが行われたのは、サブスクリプションの設定でリトライを行うようになっているからです。参考ですが「デッドレタリング」のところで「配信の最大試行回数」を設定できます。
![screen3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470635/9c05982a-af49-1593-e8ed-2e0cf200f5bb.png)

# 補足
GCPコンソールの画像は、公開したくない情報をマスクするため、一部白抜きにしてあります。
［SwiftUI / CoreMotion］iPhone で測定した気圧を画面に表示する

## 記事の内容
iPhone で測定した気圧を画面に表示する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/8f8ce6a1-c2ea-9356-e843-461886f5769e.png" width="300">


## 開発環境
|項目|内容|備考|
|---|---|---|
|PC|MacBook Air M1 （2020） メモリ：16GB ストレージ：1TB <br> macOS Ventura（ver 13.0）||
|iPhone|iPhone SE（2nd） iOS 16.1||
|IDE|Xcode ver 14.1||

## 注意事項
- このアプリを起動するためには PC と iPhone を接続する必要があります。
- 下記で紹介するコードにはエラー処理を実装していません。必要に応じて実装してください。

## ポイント
クロージャを利用して気圧のデータを ContentView に渡す

```swift:測定した値を渡す処理
func startUpdate(completion: @escaping (Double) -> Void){
    //
    completion(/* 測定した値(Double)を引数に */)
}
```

```swift:画面に表示する処理
altimator.startUpdate { value in
    self.pressureValue = value // 画面が持っているプロパティに代入
}
```

## コード
```swift:Altimator.swift
import Foundation
import CoreMotion

final class Altimator {
    var altimeter: CMAltimeter?
    
    init() {
        altimeter = CMAltimeter()
    }
    
    func startUpdate(completion: @escaping (Double) -> Void) {
        guard let altimeter = altimeter else {
            return
        }
        
        if CMAltimeter.isRelativeAltitudeAvailable() {
            altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main) { data, error in
                if error == nil {
                    guard let pressure = data?.pressure.doubleValue else {
                        return
                    }
                    print("気圧", pressure * 10)
                    completion(pressure * 10)
                } else {
                    // エラー対応
                }
            }
        }
    }
    
    func stopUpdate() {
        altimeter?.stopRelativeAltitudeUpdates()
    }
}
```

```swift:ContentView.swift
import SwiftUI
import CoreMotion

struct ContentView: View {
    private let altimator = Altimator()
    @State var pressureValue = 0.0
    
    var body: some View {
        VStack {
            Text(String(format: "%.2f",pressureValue))
                .font(.largeTitle)
                .fontWeight(.semibold)
            Text("hPa")
                .font(.title)
                .fontWeight(.semibold)
            startButton
            stopButton
        }
    }
    
    private var startButton: some View {
        Button {
            altimator.startUpdate { value in
                self.pressureValue = value
            }
        } label: {
            Text("測定開始")
        }
        .buttonStyle(.borderedProminent)
    }
    
    private var stopButton: some View {
        Button {
            altimator.stopUpdate()
        } label: {
            Text("測定終了")
        }
        .buttonStyle(.bordered)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

```

## 実行イメージ （動画）
- PC と iPhone を接続し、実装したアプリを実行
- アプリを実行し 「測定開始」 ボタンをクリックすると、iPhone が測定した気圧を表示

https://youtube.com/shorts/y1I52ja9V7Q?feature=share

## GitHub
https://github.com/tanakadaichi1989/Barometer

## 謝辞
CoreMotion を利用して気圧を測定するコードは下記記事で紹介されているコードを流用しました。
（わかりやすいのでオススメです）

https://qiita.com/ken_sasaki2/items/14ba696d49810b4ed33b
【Rails】content_forに関する学習メモ

## 学習背景

現職でよく`content_for`が記述されている箇所を見かけるものの、いまいちまだ理解しきれていなかったため、学習したメモを残します。

## content_forとは

content_forは個別のビューで表示させたい内容を表示するのに使用されます。 例えば、各ページでタブの内容を変えたい場合、railsアプリを作成した際のデフォルトだと、`application.html.erb`にtitleタグで 設定されているため、全ページ同じタブになってしまいます。

![application_html_erb_—_study_content.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673263/4abc8ee9-735e-caf1-9c24-7fcb6cb88d8c.png)

![StudyContent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673263/b1df7a97-42dd-f976-2f56-225993749099.png)


そのため、各ページで別のタブ名を表示するのに使用するのが、content_forです。 まずapplication.html.erbに赤線のように「yield :任意のキーワードのシンボル」を記述します。

<img width="659" alt="application_html_erb_—_study_content" src="https://user-images.githubusercontent.com/66200883/200158341-e4fac225-73b0-4817-b458-8aaf7156de42.png">


そして、タブ名を変えたいページに以下のように記述することで実現できます。

```rails
<% content_for :任意のキーワードのシンボル do %>
表示したいERBの内容
<% end %>
```

<img width="624" alt="world_html_erb_—_study_content" src="https://user-images.githubusercontent.com/66200883/200158502-7310f78d-9713-4125-a39c-6c5bc5296eaa.png">


そうするとタブには上記で指定したメッセージを表示することができます。
<img width="1675" alt="オラオラ" src="https://user-images.githubusercontent.com/66200883/200158556-e8621717-6d09-44e9-8494-5f57e072a3ca.png">



## 参考文献

[【Rails入門】yieldとcontent_forを使ってページ毎にタイトルを変更](https://www.sejuku.net/blog/75657)
pythonでデザインパターンの「Command」を実装する。

GoFのデザインパターン「Command」をpythonで書くときのためのテンプレートです。

```フォルダ構成
command
 └─command.py
main.py
```

```command.py
from abc import ABCMeta, abstractmethod

#命令のインタフェース(API)を定義する役。
class Command(metaclass=ABCMeta):
    @abstractmethod
    def execute(self):
        pass

    @abstractmethod
    def display(self):
        pass

#ConcreteCommand役の命令を実行するときに対象となる役。つまり、命令の受け取り手。例:複合機
class Receiver(object):
    def DoSomething1(self, arg1):
        print("{0}引数を指定して、DoSomething1コマンドを受領。".format(arg1))

    def DoSomething2(self, arg1, arg2):
        print("{0}と{1}引数を指定して、DoSomething2コマンドを受領。".format(arg1,arg2))


#Invokerは命令の実行を開始する役です。Command役で定義されているインタフェースを呼び出す役。例:印刷キュー
#コマンドをリストに格納することで、コマンドの実行履歴を管理できる。
class Invoker(Command):
    def __init__(self):
        self.__cmds = []

    def append_cmd(self, cmd):
        self.__cmds.append(cmd)

    def execute(self):
        for cmd in self.__cmds:
            cmd.execute()
    
    def display(self):
        for cmd in self.__cmds:
            cmd.display()


#Command役のインタフェースを実際に実装している役です。(ConcreteCommand1とConcreteCommand2)　例:印刷対象書類
class ConcreteCommand1(Command):
    def __init__(self, arg1, receiverObj):
        self.__arg1 = arg1
        self.__receiver = receiverObj

    def execute(self):
        self.__receiver.DoSomething1(self.__arg1)

    def display(self):
        print("実効内容 {0}".format(self.__arg1))


class ConcreteCommand2(Command):
    def __init__(self, arg1, arg2, receiverObj):
        self.__arg1 = arg1
        self.__arg2 = arg2
        self.__receiver = receiverObj

    def execute(self):
        self.__receiver.DoSomething2(self.__arg1, self.__arg2)

    def display(self):
        arg2 = format(self.__arg2)
        print("実効内容  {0} {1}".format(arg2, self.__arg1))
```

```main.py
import sys
from command.command import Receiver, Invoker, ConcreteCommand1, ConcreteCommand2


def startMain(arg1, arg2):
    recv = Receiver()
    inv = Invoker()
    inv.append_cmd(ConcreteCommand1(arg1, recv))
    inv.append_cmd(ConcreteCommand2(arg1, arg2, recv))
    inv.execute()
    inv.display()


if __name__ == "__main__":
    startMain(sys.argv[1], sys.argv[2])
```