OmniAICreator/Qiita-1.07M huggingface dataset:
paizaラーニング レベルアップ問題集 paizaの森練習問題コンテスト過去問題6 JavaScript 中央値

中央値 (paizaランク C 相当)

https://paiza.jp/works/mondai/forest_contest_006/forest_contest_006__d_median

小さい順か大きい順に並べ替えて、その真ん中の値が中央値です。
５教科なので、３教科目です。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

console.log(lines.slice(0).map(Number).sort((a, b) => a - b)[2]);
```
paizaラーニング レベルアップ問題集 paizaの森練習問題コンテスト過去問題6 JavaScript 最大の差

最大の差 (paizaランク C 相当)

https://paiza.jp/works/mondai/forest_contest_006/forest_contest_006__d_largest_diff

最大最小を記録し、差を取ります。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

let max = 0;
let min = 100;
lines.slice(0).forEach(m => {
  max = Math.max(max, Number(m));
  min = Math.min(min, Number(m));
});
console.log(max - min);
```
TypeScript 4.9 の "satisfies" 演算子で union の網羅性チェックが少し楽になる

TypeScript 4.9 で新たに導入される satisfies 演算子にとても期待しています。個人的に役に立ちそうだと思ったユースケースとして、switch や if で union を順番に処理していくときの網羅性チェックが挙げられます。

```typescript
declare const difficulty: "easy" | "medium" | "hard";

switch (difficulty) {
    case "easy":
    case "medium":
    case "hard":
        break;
    default:
        // OK
        throw new Error(difficulty satisfies never);
}

switch (difficulty) {
    case "easy":
    case "hard":
        break;
    default:
        // Type 'string' does not satisfy the expected type 'never'.
        throw new Error(difficulty satisfies never);
}
```

1 つ目の switch 文ではエラーが出ませんが、2 つめの switch 文では `"medium"` を忘れているためエラーになります。

TypeScript 4.8 以前は次のように書いていました。

```typescript
switch (difficulty) {
    case "easy":
    case "hard":
        break;
    default:
        // Type 'string' is not assignable to type 'never'.
        const _: never = difficulty;
        throw new Error(difficulty);
}
```

なお TypeScript ESLint の [switch-exhaustiveness-check](https://typescript-eslint.io/rules/switch-exhaustiveness-check/) が使える環境ではそちらを使うほうがよさそうですが、switch 文以外で使う場合など、この記法が役に立つ場合も多いかと思います。
【小ネタ】Prefixリストを調べる

# 背景・目的
S3の（Gatgeway型）VPCエンドポイントへセキュリティグループ（Egressルール）を指定したく、調べたところPrefixリスト（CIDRブロック）を指定すれば良いことがわかったので試した結果になります。

# 概要
## Prefixリストとは？
- CIDRブロックのセット
- 利用することでセキュリティグループとルートテーブルの設定の管理が簡単になる。
    - 複数のCIDRブロックだが、同一プロトコルを指定する場合など複数書かずに済む。
- プレフィックスリストには以下の2つのタイプがある
    - カスタマー管理プレフィックスリスト
        - 他のAWSアカウント共有が可能
    - AWSマネージドプレフィックスリスト
        - AWSサービスのIPアドレス範囲リスト

#＃＃ 概念とルール
- カスタマー管理プレフィックスリスト
    - 1つのプレフィックスリスト内では、単一タイプのIPアドレス（IPv4 or IPv6）のみサポートされる
    - 作成したリージョンにのみ適用される
- AWSマネージドプレフィックスリスト
    - 作成・変更・共有・削除ができない。

# 実践
## CLIで確認
以下のコマンドで確認ができました。デフォルトでは、S3とDynamoDBの2つのAWSマネージドプレフィックスリストが確認できます。
```
aws ec2 describe-prefix-lists

$ aws ec2 describe-prefix-lists                   
{
    "PrefixLists": [
        {
            "Cidrs": [
                "XXXX",
                ・・・・,
                "XXXX"
            ],
            "PrefixListId": "XXXXX",
            "PrefixListName": "com.amazonaws.${AWSリージョン}.dynamodb"
        },
        {
            "Cidrs": [
                "XXXX",
                ・・・・,
                "XXXX"
            ],
            "PrefixListId": "XXXXXX",
            "PrefixListName": "com.amazonaws.${AWSリージョン}.s3"
        }
    ]
}
$

```

# 参考
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/managed-prefix-lists.html

https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-prefix-lists.html
fields_forを使用して新規登録時に別レコードも作成する

# はじめに
railsを利用してポートフォリオを制作しました。制作するにあたって、会員登録時に別モデル内にレコードを作成したいと思いました。
その機能を実装したいと思った理由は、ゲームの成績を管理するスコアシートを制作したかったからです。
会員登録と同時にプレイヤー名としても勝手に登録してくれることで、スコアシートを作成する際に参加しているプレイヤーとして自身の名前が選べるようにする為です。
実装するにあたりfields_forを使用しました。伝わりづらいかもしれませんが自分なりにまとめてみようと思います。

# やり方
会員登録に関してはdeviseを使用しました。
こちらが新規登録を行うページです。
```erb:registrations/new.html.erb
<h2>新規登録画面</h2>

<%= form_with model: @user, url: user_registration_path do |f| %>
  <p>
    <%= f.label :name, "会員名" %>
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </p>
  <p>
    <%= f.label :email, "メールアドレス" %>
    <%= f.email_field :email, autocomplete: "email" %>
  </p>
  <p>
    <%= f.label :password, "パスワード" %>
    <%= f.password_field :password, autocomplete: "new-password" %>
  </p>
  <%= f.submit "登録" %>
<% end %>
```
このページにfields_forを記述することで新規登録時に別レコードを作成出来るようになります。

### 必要なこと
モデルへの記述が必要です。
fields_forを利用することで異なるモデルを編集できるようになります。
そのためにモデル同士のアソシエーションを指定しなければなりません。
今回は会員を登録するUserモデルとゲームに参加するプレイヤーを登録するPlayerモデルがあります。
一人の会員がゲームに参加するプレイヤーを多数登録出来る仕様です。
なのでUserモデルとPlayerモデルは1対多になります。
```rb:user.rb
class User < ApplicationRecord
  has_many :players, dependent: :destroy
end
```
```rb:player.rb
class Player < ApplicationRecord
  belongs_to :user
end
```
次にhtml.erbにfields_forを記述します。
今回はパスワード入力フォームと登録ボタンの間に記述しました。
```erb:registrations/new.html.erb
<h2>新規登録画面</h2>

<%= form_with model: @user, url: user_registration_path do |f| %>
  <p>
    <%= f.label :name, "会員名" %>
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </p>
  <p>
    <%= f.label :email, "メールアドレス" %>
    <%= f.email_field :email, autocomplete: "email" %>
  </p>
  <p>
    <%= f.label :password, "パスワード" %>
    <%= f.password_field :password, autocomplete: "new-password" %>
  </p>

  <%= f.fields_for :players, Player.new do |s| %>
    <%= s.hidden_field :name, :value => "自分" %>
    <%= s.hidden_field :myself_status, :value => true %>
  <% end %>

  <%= f.submit "登録" %>
<% end %>
```
nameカラムに"自分"、myself_statusに"true"の値が入ります。
hidden_fieldで記述しているため、実際のページには表示されませんが検証モードで存在していることを確認できます。

以上で親モデルであるUserモデルに情報を登録した際に子モデルのPlayerモデルにレコードを保存できるようになりました。
paiza.ioでelixir その3

# 概要
paiza.ioでelixirやってみた。
zundokoやってみた。

# サンプルコード

```
defmodule Zundoko do
    def start() do 
        Stream.repeatedly(fn -> ["ズン", "ドコ"] |> Enum.random end) |> run
    end
    def run(input) do
        match = ["ドコ", "ズン", "ズン", "ズン", "ズン", "ドコ"]
        eol = "キ・ヨ・シ！"
        input
        |> Stream.transform([], fn(item, acc) -> 
                if List.last(acc) == eol do
                    { :halt, nil }
                else
                    if Enum.count(acc) < Enum.count(match) do
                        { [item], acc ++ [item] }
                    else
                        if acc == match, do: { [eol], acc ++ [eol] }, else: { [item], [item] }
                    end
                end
           end)
        |> Enum.to_list 
        |> IO.puts
    end
end

Zundoko.start
```

# 実行結果

```
ドコドコズンズンズンドコズンドコドコズンズンズンドコドコズンドコズンドコドコズンズンドコドコズンドコズンズンズンドコドコズンドコドコドコドコズンズンズンズンズンズンドコドコズンズンドコズンズンドコズンズンドコドコズンズンズンズンドコドコズンズンドコドコズンドコズンズンズンズンドコズンドコズンズンズンズンズンズンズンズンドコドコズンズンズンズンドコドコズンズンドコズンドコドコドコドコズンドコドコズンズンズンズンズンズンズンドコドコドコズンズンドコズンドコズンドコズンズンドコドコドコズンズンズンズンズンズンドコズンズンドコドコズンドコドコズンドコドコズンズンドコドコドコドコズンズンドコズンドコドコズンドコドコズンズンドコズンドコドコズンドコドコズンドコドコドコドコドコズンドコズンズンドコドコドコドコズンズンドコズンズンドコズンドコズンズンドコドコドコズンドコドコドコズンドコドコズンズンズンドコズンドコズンズンドコドコズンズンドコドコドコドコズンドコドコズンドコズンドコズンズンドコドコドコズンズンドコズンズンズンズンドコドコドコズンドコドコドコズンズンドコズンズンドコドコドコズンズンズンドコズンズンズンドコドコドコズンドコズンドコズンズンドコズンズンドコズンズンドコズンズンドコドコズンドコズンズンズンズンズンドコドコドコドコズンズンズンドコドコドコドコズンドコドコドコドコドコドコズンズンドコズンズンドコズンズンドコズンドコドコドコズンズンズンドコドコドコズンズンズンズンドコズンドコドコドコドコドコドコズンドコドコドコドコドコドコドコズンドコズンドコドコドコズンドコズンドコズンズンドコドコズンドコズンズンズンドコドコズンズンドコズンドコドコズンドコズンドコズンドコズンズンズンドコドコズンズンズンドコドコズンドコドコズンドコドコドコズンズンズンズンズンズンドコドコドコドコドコドコドコズンズンドコドコズンズンドコズンドコドコズンドコドコズンドコドコズンズンドコズンドコドコドコドコドコズンドコズンズンドコズンズンズンドコズンズンドコドコドコドコズンズンドコドコズンズンドコドコズンドコドコドコズンズンドコズンズンドコズンズンズンドコドコドコズンズンズンドコドコドコズンドコズンドコドコズンドコズンズンズンズンズンズンズンドコズンズンズンドコズンドコドコドコズンズンズンドコドコズンドコドコズンズンドコズンズンズンドコズンズンドコズンズンドコドコドコドコドコズンドコドコドコドコズンズンズンドコズンドコズンズンズンズンドコキ・ヨ・シ！
```

# 成果物

https://paiza.io/projects/Na1qmgxdrFHiyYLbZJZjfQ?language=elixir

以上。
【GitHub Pages】No url found for submodule path 'hoge' in .gitmodules を解消する方法

## 概要
GitHub Pageをビルド＆デプロイする際に以下のエラーが発生した場合の解消方法を記載する。

```
  Error: fatal: No url found for submodule path 'hoge' in .gitmodules
  Error: The process '/usr/bin/git' failed with exit code 128
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/b68c95ca-d67c-e20b-99d3-0d3065a51f11.png)

## 解消方法
`submodule path 'hoge' in .gitmodules` 
hogeディレクトリ配下にある.gitディレクトリを削除して再デプロイする。

## 詳細

```
directory
├─ .git
├─ .github
├─ hoge
│  ├─ .git
│  ├─ img
│  ├─ src
│  └── ...
├─ fuga
│  ├─ img
│  ├─ src
│  └── ...
└─ ...
```

Git管理されたディレクトリ配下のhogeディレクトリにも.gitがある。
どうやらデプロイする際、hogeディレクトリ配下のページを参照するものの
そちらはデプロイしていないのでURLが見つけられずエラーとなってしまう。

hogeディレクトリ内の.gitを削除すればURLを探しにいかなくなるので、
デプロイが正常終了するようになる。
whisperを利用して音声データから音声抽出翻訳する方法

## 検証動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/OwgkV9sELcs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## はじめに
先日OpenAIから公開された多言語音声認識を行うことができるマルチタスクモデルであるWhisperを利用して音声データから音声認識、言語識別、翻訳を検証してみました。

## whispaerのインストール
```
pip install git+https://github.com/openai/whisper.git
```
## whisperを読み込みモデルをダウンロード
```
import whisper
model = whisper.load_model("large")
```
動画内では、「large」モデルを利用しましたが、様々なモデルが存在します。
![](https://storage.googleapis.com/zenn-user-upload/1d2da373bf06-20221023.png)

## 音声認識
```
result = model.transcribe("音声データ", verbose=True)
```
引数で言語を指定しない場合は、自動で言語識別されます。
verboseでログ出力が可能です。

## 翻訳
```
result = model.transcribe("音声データ", verbose=True, task=translate)
```
taskでtranslateを指定することで翻訳することができます。
PowerAutomateDesktopにおける定数の使い方

### はじめに
PowerAutomateDesktop(以後PAD)で定数や変数などを前もって宣言しておきたい場合にどうすれば一番手っ取り早いかを考えた結果、"JSONをカスタムオブジェクトに変換"アクションを使用するのがベターかなという結論に達したという内容の記事になります。

### メリット
###### ①宣言が楽
PAD自体入出力変数であらかじめ変数の宣言などは可能です。しかしこちらはUIでの手入力になるので扱う変数が多くなればその分手間になります。JSONであればあらかじめエディタで作成しておいて本アクションにコピペすればよいので一度に複数の変数を宣言することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/b1236e4f-efe3-bd51-d520-0241971095f9.png)
###### ②可読性が高い
カスタムオブジェクトというぐらいなのでPAD上ではもちろんオブジェクトとして扱われます。PADで変数として呼び出される場合、%Json.test.blog_url%と表記されるのでパット見なんのオブジェクトのどういった要素が呼び出されているのかがわかりやすいですね。

### 使い方
試しに以下のようなJSONを用意して実際に使用してみます。
~~~sample.json
{
    "test":{
        "name":"hoge",
        "age":3,
        "blog_url":null,
        "list_sample":[
            "zero"
            "one",
            "two",
            "three"
        ]
    }
}
~~~
###### 宣言
"アクション"メニューから"JSONをカスタムオブジェクトに変換"をMainフローにドラッグアンドドロップ、JSONの入力欄に上記をコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/49396560-2663-d006-2813-3516d72d76a7.png)

###### 呼び出し
上記の値を変数として呼び出す際は %オブジェクト変数.オブジェクト.key%の順序で記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/3a2353db-9bb0-0239-4785-13bd82ee480a.png)

フローで実行すると下記のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/3aa30a31-6ac1-fd67-670c-7ef258bcbf96.png)

リストを扱う場合は %オブジェクト変数.オブジェクト.key[インデックス番号]%で記述します。
例として%Json.test.list_sample[0]%で呼び出すと以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/a119088a-909b-9178-173e-2ed39949c2e7.png)

当然ですが"PowerShellスクリプトの実行"アクションでも使用可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/9952d3da-ed7e-0b6b-ce84-df89ad5ee270.png)
⇒実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/137d70df-02aa-5ac7-5a2b-2bbd8e05365b.png)

###### 代入
以上ではフロー上で宣言したカスタムオブジェクトの参照について記述していますが、当然カスタムオブジェクトに値を代入することも可能です。
例えば以下のように予めnullで宣言していたblog_urlに対して以下の内容を設定することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/86394cc0-6b6c-a0ae-b461-b58f2b40e94e.png)
⇒結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935823/46f34092-c0bc-dff1-2cf8-7978f5400064.png)

### おわりに
初投稿で大分拙いとは思います。備忘録としての目的がメインですが自己研鑽も兼ねているのでアドヴァイスなどあればコメントなどいただければ幸いです。
Nushellでプログラムのベンチマーク計測

rust製シェルの[Nushell](https://github.com/nushell/nushell)にはコマンドの実行時間を計測できる[benchmark](https://www.nushell.sh/book/commands/benchmark.html)コマンドがあります．今回はそれを使って指定した回数コマンドを実行し，その実行時間の平均と標準偏差を計算するカスタムコマンドを作ってみます．

## benchmarkコマンドの使い方
`benchmark`コマンドの引数にブロックを与えるだけです．以下では`cargo build`コマンドを計測しています．
```nushell
〉benchmark {cargo build --bin mandelbrot --release}
   Compiling nu_with_rust v0.1.0
    Finished release [optimized] target(s) in 5.56s
9sec 4ms 877µs 800ns
```
 戻り値は`duration`型です．

## カスタムコマンド
nushellのforコマンドはリスト内包表記のようにリストを返すため，直接変数`times`に戻り値を代入しています．各イテレーション内で標準出力と標準エラー出力を無視する場合は`do -i {}`としてブロックを実行します(逆に標準出力，標準エラー出力，エラーステータスをデータとして取得したい場合は`do -i {} | complete`とします)．`duration`そのままでは平均などを計算できないため秒で割ることで`float`に変換しています(つまり計算結果の単位は秒となります)．
そして`$times`について`math avg`で平均を，`math stddev`で標準偏差を計算してレコードとして返しています． 

```nu:utils.nu
export def bench [
    command: block  # Run this block
    n: int  # Repeat this number of times
    --ignore(-i)  # Ignore the stdout and stderr
    --echo(-e)  # Echo the list of benchmark
] {
    let times = for _ in 0..$n {
        if ($ignore) {
            benchmark {do -i $command} | $in / 1.0sec  # 秒で割る
        } else {
            benchmark $command | $in / 1.0sec  # 秒で割る
        }
    }
    if ($echo) { echo $times }
    {mean: ($times | math avg ), std: ($times | math stddev)}
}
```

このカスタムコマンドを用いて，rustのプログラムは以下のようにしてベンチマークを計測できます．結果の単位は秒です．
```nushell
〉source utils.nu
〉cargo build --bin mandelbrot --release
〉bench {target/release/mandelbrot} 100 
╭──────┬─────────────────────╮
│ mean │ 0.5057686554455444  │
│ std  │ 0.01427237002986188 │
╰──────┴─────────────────────╯
```

pythonのプログラムは以下のようにしてベンチマークを計測できます．
```nushell
〉bench {poetry run python scripts/mandelbrot_full_jit.py} 100
╭──────┬─────────────────────╮
│ mean │ 4.266813281188116   │
│ std  │ 0.11776477277118129 │
╰──────┴─────────────────────╯
```

今回はNushellを用いてプログラムの実行時間を計測しました．細かい設定が必要な場合は[hyperfine](https://github.com/sharkdp/hyperfine)などのベンチマークツールを使う方がいいと思いますが，Nushellを使うことで計測結果を簡単に使いまわせたり連結したりできることがメリットだと思います．
IT完全未経験からセキュリティエンジニア就職を目指す

①自己紹介
こんにちは。23歳でセキュリティエンジニアを目指している者です。今までITに触れたことはほとんどないです。（なのでQiitaに投稿するのも初めてで、上手くできているか分かりません⋯）


②目標
半年〜1年後にセキュリティエンジニアとして就職すること。具体的には脆弱性診断士。

③達成のための情報収集→そこから得た仮説

正直何をしたらいいか今は全く分からないが、数週間調べてみて

（A）ITの基礎知識

（B）Linuxの知識

（C）ネットワークの知識

（D）kali linuxの知識

（E）その他いくつかのプログラミング言語（php、C言語など）

が少なくとも必要であるという意見が多かった。また、書籍では徳丸氏の｢体系的に学ぶ安全なWebアプリケーションの作り方｣や、IPUSIRON氏の｢ホワイトハッカーの教科書｣がとても参考になると聞いた。さらに、CTF、hack the box、try hack meという練習サイトがあり、そこを中心に学習している人も多かった。

④今後の方針

現在は｢CPU｣という言葉の意味も知らない（知らなかった）レベルなので、まずはハッキングの前に基礎的な知識が必要と思った。また、今まで技術書を読んだことがない＆周りに質問環境がない自分の状態を鑑みると、

今後は

（あ）→（A）〜（E）の分野をUdemyでざっと一通り学習する（目標達成の構成要素の全体像を把握する）（インプット）

（い）→その後、CTF・THM・HTBで練習（アウトプット）し、掘り下げる箇所は（ここでやっと）書籍を使い理解を深める。

という方針でまずやってみる。暗中模索の状態だが、まずは自分で勉強して、上手くいかなそうだったり他の有益な情報が来たりしたら方針を変える。

⑤最後に

半ば備忘録的に書きましたが、もしここまで読んでくださった方がいたらありがとうございます。がんばるぞ・・・
paiza.ioでelixir その2

# 概要
paiza.ioでelixirやってみた。
九九やってみた。

# サンプルコード

```
defmodule Kuku do
    def print do
        for i <- 1..9 do
            a1 = i * 1
            a2 = i * 2
            a3 = i * 3
            a4 = i * 4
            a5 = i * 5
            a6 = i * 6
            a7 = i * 7
            a8 = i * 8
            a9 = i * 9
            IO.puts "#{a1} #{a2} #{a3} #{a4} #{a5} #{a6} #{a7} #{a8} #{a9}"
        end
    end
end


Kuku.print
```

# 実行結果

```
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
```

# 成果物

https://paiza.io/projects/Ju-xmJHgIfD93-7TYJDzWA


以上。
OSS-DB Silver 合格体験記【オンライン受験】

**試験**
---
OSS-DB Silver(Ver2.0)

**受験日**
---
2022/10/22

**点数**
---
78/100 点

**学習期間**
---
1.5ヶ月(90h)

**使用テキスト**
---
・OSS教科書 OSS-DB Silver Ver2.0対応

**参考にしたサイト**
---
・ping-t
・Udemy OSS-DB Silver模擬試験問題集(6回分331問)
・OSS-DB公式サンプル問題

**前提**
---
PostgresQLを実務で2年程度触ったが、自ら構築したことはなく基本的なSQLを打つ程度
その他のDB経験は無し

**学習方法**
---
OSS教科書 OSS-DB Silver Ver2.0対応を1周（30h）
OSS教科書の付録の模擬試験を受け、29/60点(48%)
↓
ping-tを1ヶ月契約
全ての問題で1回以上正解するまで繰り返し問題を解く(50h)
ping-tの模擬試験では安定して90点以上取れるようになる
↓
UdemyのOSS-DB Silver模擬試験問題集(6回分331問)を購入して2回分解いてみたが、
ping-tと同じ言い回しの問題が散見されたため返金申請
解説に関してはほぼ同じレベルの粒度
ping-tの方が機能的に優れているため、ping-tの方がオススメできる
↓
OSS-DB公式のサンプル問題/例題解説を解く(10h)
ping-tよりも深掘りされた問題ばかりで、正解率40%程度
少し自信を無くしたが、ping-tの解約日が迫っていたため受験を決意



**試験の感想**
---
難易度はping-tと同等か少し難しいくらいの印象
公式のサンプルほど深い部分まで答えさせる問題はほとんどなかった。
先駆者が書いている通り、ping-tのみの学習で合格するレベルだと感じた。

ping-tの問題では見なかった、タイムアウトに関する問題（statement_timeout、lock_timeout）が出てきた。
体感で、9割はping-tで学習した内容、1割は深掘りされたものや初見の内容だった。

また今回はピアソンVUEのオンライン試験の形式(自宅)で受験した
試験前に30分準備時間があり、PCのチェック、部屋のチェックがあった。
物が多い部屋だったが、タオル等で物を隠す、デスク周りは何も置かないようにしたところ、問題なく受験できた。
試験中は常にPCのカメラで監視されており、問題を解きながら独り言をボソボソ喋っていたらチャットで注意された。

問題を解くためのソフトを指示されたURLからダウンロードして試験を解く形だった。
試験中は残り時間が表示され、解き終わった後も見直しができるように、問題にチェックをつけることも可能。
ソフトの動作が重く、選択肢にチェックを入れる操作や、次の問題に移る操作で5秒程度待たされるのが少しストレスだった。

試験の出題形式に関しては、公式FAQにも書いてあるとおり
現在は、「単一選択」と「複数選択（個数指定）」の回答パターンで、
「全て選択せよ」といった回答パターンの問題は無かった。
【Bash】指定した条件を満たす名前のファイルだけを抽出し、指定先にコピーする


# 要件
`test[任意の文字列].txt`を満たすファイルを抽出し、別ディレクトリにコピーしたい

## 期待する動き(コピーの様子)
inputディレクトリに存在する`test[任意の文字列].txt`を、outputディレクトリにコピーする。

### Before
```
.
├── input
│   ├── bar.txt
│   ├── hoge
│   │   ├── bar2.txt
│   │   ├── tes1.txt
│   │   ├── test3.txt
│   │   └── test4.txt
│   ├── test1.txt
│   └── test2.txt
└── output
```

### After
```
.
├── input
│   ├── bar.txt
│   ├── hoge
│   │   ├── bar2.txt
│   │   ├── tes1.txt
│   │   ├── test3.txt
│   │   └── test4.txt
│   ├── test1.txt
│   └── test2.txt
└── output
    ├── hoge
    │   ├── test3.txt
    │   └── test4.txt
    ├── test1.txt
    └── test2.txt
```

# 試したこと
## コマンド
inputディレクトリで次のコマンドを実行する。
(カレントディレクトリ次第では想定外の動きをするため、絶対パスでディレクトリを指定するなど工夫したほうがいいかもしれない)
```bash
$ find ./ -type d | xargs -I{} mkdir -p ../output/{} && find -name "test*.txt" | xargs -t -I{} cp {} ../output/{}
```
## コマンドの実行内容
1. input以下のディレクトリ構造をoutputディレクトリにコピーする
(cpコマンドでは、存在しないディレクトリを作成して処理を続ける・・ということはできないため)
2. 条件を満たすファイルを指定ディレクトリにコピーする


# 参考
- [Linux でディレクトリ構造のみコピーする](https://ex1.m-yabe.com/archives/2039)
- [cpコマンド | ファイル操作コマンド | ウナのLinux講座 | ウナのIT資格一問一答](http://una.soragoto.net/lecture/linux/file_cmd/cp.html)
- [xargsコマンドで覚えておきたい使い方・組み合わせ7個(+1個)](https://orebibou.com/ja/home/201507/20150727_001/)
- [findを使って、あるディレクトリ以下のファイルを一箇所に移動mv/コピーcpする方法](https://it-ojisan.tokyo/findmvcp/)
【Laravel】get〜Attributeメソッドのアクセサを理解する

# はじめに
view側で見たことない属性へアクセスしているなあと思って色々調べていたら、Laravelのアクセサという機能を使っている事が判明。
その時に調べた内容・理解したことを記事にしています。

# アクセサとは
[公式より](https://readouble.com/laravel/7.x/ja/eloquent-mutators.html)
> アクセサを定義するには、アクセスしたいカラム名が「studlyケース（Upper Camel Case）」でFooの場合、getFooAttributeメソッドをモデルに作成します。以下の例では、first_name属性のアクセサを定義しています。first_name属性の値にアクセスが起きると、Eloquentは自動的にこのアクセサを呼び出します。

要するに、データベースから取得した値を加工したいときに使うもの。


# アクセサの使い方
サンプルデータ

テーブル名： items
商品テーブルに数量、単価のカラムを用意
| id | quantity | unitprice |
|:-----------|:------------|:------------|
| 1       | 2        | 1000         |
| 2     | 1      | 3       |


購入商品の合計金額が表示されるように実装を書いていきます。

## Modelの準備

まずは、Modelでアクセサ（get〜Attribute）を定義します。

```php:app/Models/Item.php
public function getTotalItemPriceAttribute()
    {
        return $this->unitprice * $this->quantity;
    }
```

:::note warn
アクセサ定義で気をつけること
* キャメルケースで定義する（今回だとTotalItemPriceの部分）
* 予期せぬ挙動を回避するため、DBのカラム名を使用しない
:::

## Controllerの準備

次はControllerでItemデータを取得してviewに値を渡します。


```php:app/Controllers/ItemController.php
public function index()
    {
        $items = Items::get();
        return view('index', compact('items'));
    }
```

## Viewの準備

最後に定義したアクセサを呼び出します。


```php:resources/views/index.blade.php
@foreach ( $items as $item )
    {{ $item->total_item_price }}
@endforach
```

アクセサの呼び出しは、Modelファイルで定義したアクセサ名（getTotalItemPriceAttribute）から`get`と`Attribute`を除いたメソッドのスネークケース（total_item_price）で呼び出せます。
【学習にピッタリ!】プログラミング学習におすすめなYoutuber様

こんにちは☺。今回は**プログラミング学習におすすめなユーチューバー**という点で解説していきます。
# 有料に囚われてない？
今のこの時代は、ネットに無料でいい情報が色々転がっていますこのzennやqiitaなどの記事もそうです。動画教材にはUdemyがありますがお金を使いたくないときや節約と単純にしたいときもあるでしょう。それで「**熱意が感じられない！**」という人もいるかも知れませんが、自分だけでも得をする気持ちで無料のツールを使っていけばいいと私は思っています。
ということで、本題に入りましょう！
# Youtuber紹介
![img](https://upload.wikimedia.org/wikipedia/commons/thumb/0/09/YouTube_full-color_icon_%282017%29.svg/2560px-YouTube_full-color_icon_%282017%29.svg.png)
## 1. キノコード / プログラミング学習チャンネル
----

https://www.youtube.com/c/kinocode/videos

### 学べる内容

1. **Python**
2. **SQL**
3. **用語の解説**
4. PHP,GO,JS,Ruby などが少し
5. 導入・環境構築

#### メリット
様々なことについて解説しているチャンネルではありますが特にpythonに特化しています。
人工知能や一つ一つのpythonの関数を紹介しており、**かゆいところに手が届く**動画が多いです。また、最近を積極的に活動しており、**比較的新しい情報**なのも魅力です。
私がおすすめの動画は **Python超入門コース 合併版｜Pythonの超基本的な部分をたった1時間で学べます【プログラミング初心者向け入門講座】** です。

https://youtu.be/HyU3XL2F9GE

#### デメリット
やってみた体感としてキノコードさんはマックを使用することが多く、windows勢のわたしには少し厳しい部分等がありました。たまにwindows版も解説していますが、環境構築は**Mac中心**です。そこは気をつけてください。また、私がやったチュートリアルでは使ったライブラリが使えなかったり、やはり古め(1〰2年前)の動画は使えないものがあったりしますね。

## 2. だれでもエンジニア / 山浦清透
----

https://www.youtube.com/c/KiyotoUniv/videos

### 学べる内容
1. **Python**
2. **DB/SQL**
3. **Git/Github**
4. **Docker**
5. 現場で役立つ技術/その仕組み・用語　解説

#### メリット
このチャンネルで学べることもたくさんありますが、このチャンネルのいいところはやはり**仕組みや原理を丁寧に解説している**点にあります。仕組みを理解できて技術も習得できるので、定着が早くなると感じました。
私がおすすめの動画は**IT用語66選！エンジニアリングの基本をこの動画1本で！【非エンジニア必見】**　です。かなりおすすめですので必ず見ていってください!!!

https://youtu.be/kZakG8UPZaY

#### デメリット
まず、動画数がそこまで豊富ではありません。また最近のものでないものも多いですが、わかりやすいです。
あと、この方のもっと強い講座はUdemyで買えますので、Youtubeを見てから、「自分にあっているな」と感じたら買ってみてはいかがでしょうか。

### **その他**
----

#### Udemy

https://www.udemy.com/user/kiyotoyamaura/

(Udemyにも無料講座がありますよ^^)

#### 実務スキルが身に付くプログラミング学習サービス『独学エンジニア』
https://dokugaku-engineer.com/

## 3. プログラミングチュートリアル
----

https://www.youtube.com/channel/UCNTxclE0N4qsUuirssL_D8w/videos

### 学べる内容
#### ☆プログラミング言語
1. **HTML**
2. **CSS**
3. **Javascript**
4. **Python**
#### ☆扱っているフレームワークやライブラリ
1. **React**(Next.js)
2. **Three.js**
3. **Node.js**
4. **Express**
5. **Django**

#### メリット
web系の技術がとても広く解説されています。実践が殆どで座学は殆どありません。
気になったweb系の技術が結構あって豊富さにいつも驚かされます。
投稿頻度も高くておすすめです。
投稿時点で最新の動画をおすすめしておきます。
**【初心者OK】Next.jsとNotionAPIで爆速ブログ構築してみよう**

https://youtu.be/My9rXHRn8zc

### **その他**
#### Udemy

https://www.udemy.com/user/jin-tuo-hai/

(* **今ならかなり安く受講できます!!** )

#### ShinCode_Camp 〰幅広いプログラミングの知識を得るための動画プラットフォーム〰
https://code-s-school-5bc2.thinkific.com/bundles/shincode-camp


# 終わりに
今回は無料でプログラミング学習におすすめなYoutuberを紹介していきました。
私がやっている言語の都合上web系の方が増えてしまいましたがご了承下さい。
無料でできるだけ安く、簡単に学んでいきましょう!
それでは!また!
MVCアーキテクチャについて





# はじめに
#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>




Railsでアプリケーションをつくるにあたって、MVCという言葉が出てくると思います。

MVC、MVCアーキテクチャについて深く知らなかったたこともあり調べてみることにしました。


と言ってもRailsは出てきません。


あくまでも学習のメモとしての記事になります。


最後のまとめで自分の意見を言って終わりたいと思います。



# 具体的な内容


- MVCの歴史
- 考え方
- MVCの機能、役割
　- 機能①　Model(モデル)
　- 機能②　view(ビュー)
　- 機能③　Controller（コントローラー）



### 正式名称


正式名称は、Model View Controller　(モデル・ビュー・コントローラー)です。


その頭文字を取ってMVCアーキテクチャといいます。


### 先生！アーキテクチャってなんですか！食べれるんですか！


君はあれだね、ちょっとアニメの観過ぎかな。ワンピースとか好きでしょ



## アーキテクチャとは？英語わからへん


アーキテクチャ 【architecture】
アーキテクチャ（architecture）は、英語で「建築学」、「建築術」、「構造」を意味する語である。


語源は古代ギリシャ語の「αρχιτέκτων arkhitekton」（アルキテクトーン）である。


建築というとしっくりきますねぇ。なんとなくモノづくりのイメージがプログラムにはあるので。


そしてここから派生してアーキテクチャの意味がそれが使われる環境によって変わって行きます。


全部を紹介していくときりがないので、コンピュータアーキテクチャの分野にしぼります。


OKですか？でもコンピュータアーキテクチャだけでも３つに分かれます。ワ〜オ！多っ！



## 「命令セットアーキテクチャ」「マイクロアーキテクチャ」「システムアーキテクチャ」


* 命令セットアーキテクチャ(ISA)



機械語、またはアセンブリ言語から見たプロセッサの抽象化されたイメージで、


命令セット、アドレッシングモード、レジスタ、アドレスとデータの形式


などが含まれる。



* マイクロアーキテクチャ


さらに下位でのより具体的なシステムに関する記述であり、ISAを実


装するためにシステムの構成部品をどのように接続し、それらがどの

ように相互にやりとりするかを示す。



* システムアーキテクチャ


他のコンピュータシステムのハードウェア全般に関するもの。

1 バスやクロスバースイッチなどのシステムインターコネクト

2　メモリコントローラやメモリ階層

３　ダイレクト・メモリー・アクセスなどのCPUオフロード機構

4 マルチプロセッシングに関わる部分

５　複数のコンピュータによるシステム構成に関するもの(コンピュータ・クラスターやNUMAアーキテクチャなど)




# MVCの歴史


## ここで歴史っ！　唐突！


### ええやん細かいことはググっとき　


1979年にパロアルト研究所のトリグヴェ・リーンスカウクが考えた。


1988年に最初の論文「A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk -80」が公開される。


1994年に書籍「Design Patterns:Elements of Reusable Object-Oriented Software」内で取り上げられる。


1999年、MVCのサーバサイド実装としてJavaServer Pages Model 2が発表。



# 考え方・概念


アプリケーションの内部処理と、ユーザーに対する入出力処理を分離することが目的。


デザインパターンの１種と扱われる場合もあるが


一般的な制御フローとしては、


1. コントローラが入力機器を監視する。


2. ユーザが入力機器に入力を与える。


3. コントローラがユーザのアクションに応じてモデルのメソッドを呼ぶ。その結果モデルのデータが書き換えられる場合もある。


4. モデルが変更された場合、自身が変更された旨をビューなどのオブザーバに対して通知する。


5. ビューはモデルから関連するデータを取得し、出力を更新する。典型的には画面に図形を描画する。


このシナリオではビューやコントローラをそれぞれ１つのオブジェクトと


して単純化して説明しているが、実際にはビューは階層構造になって


いて、各ビューごとに対応するコントローラが存在する。


そのためユーザからの入力を処理すべきコントローラを決定する作業が必要となる。



# MVCとデザインパターン



MVCはデザインパターンの１種と扱われる場合もあるが、(MVCパタ


ーンと呼称される)、MVC自体が他の小さなデザインパターン


(Obsaerverパターン・Cmmandパターン・Factory Methodパタ


ーン・Facadeパターンなど)を利用して実装されることが多いところ


からすると、デザインパターンというより、さらに粒度の大きい１種のソ


フトウェアアーキテクチャという方が適当でしょう。


各モジュールが比較的はっきりと分かれ、プログラムの見通しがよくなるとともに、ユーザインタフェース(UI)の部分を別のモジュー


ルに切り替えることが容易となることが利点です。



# MVCの役割、機能



* モデル

そのアプリケーションが扱う領域のデータと手続き(ビジネスロジック、ショッピングの合計額や送料を計算するなど)を表現する要素である。また、データの変更をビューに通知するのもモデルの責任である。(モデルの変更を通知するのにObserverパターンが用いられることもある)


* ビュー

モデルのデータを取り出してユーザが見るのに適した形で表示する要素である。すなわち、UIへの出力を担当する。


* コントローラ

ユーザからの入力(通常イベントとして通知される)をモデルへのメッセージへと変換してモデルに伝える要素である。すなわち、UIからの入力担当する。モデルに変更を引き起こす場合もあるが、直接に描画を行ったり、モデルの内部データを直接操作したりはしない。


なお、UIにおける入力と出力は本質的には不可分なものであり、したがって、ビューとコントローラはいつでも分離できるとは限らない。



# まとめ


新しい知識としてMVCアーキテクチャを調べていくと知らないことばかりで戸惑いましたが、これから学んでいくいいきっかけとなったらいいと思った。
Datadogで同一ユーザが別々のOrganizationに同時にアクセスしたい場合の裏ワザ

## はじめに
複数のOrganizationにユーザ登録していて、各々のOrganizationの画面を同時に見たいことはありませんか？
※例えば、Organization-AとOrganization-BのEvents画面を同時に立ち上げて両方確認しながら運用したいとき　等
複数パターンで検証し、方法を発見したので共有します。

## 検証パターン
以下の2つの方法で検証しました。
　**1．同一ブラウザの別タブで開く（Chrome、Edge）**
　タブ1で、Organization-Aを開いた状態で、Organization-Bを右クリック->新しいタブで開くでタブ2に表示

　**2．同一端末の別ブラウザで開く**
　Organization-AをChromeで表示した状態で、Organization-BをEdgeで表示

## 結果
結論から言うと、
「**2．同一端末の別ブラウザで開く**」は、複数のOrganizationの画面を同時に見ることができました。

「**1．同一ブラウザの別タブで開く（Chrome、Edge）**」は、複数のOrganizationを同時に見ることはできませんでした。ブラウザによって挙動がやや異なり、
　Edge：タブ1を更新するとOrganization-Bに変わってしまう
　Chrome：タブ1を更新すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931968/4e406ae2-55cf-9c48-34e8-baf959aa5f56.png)
が画面内に表示され、それ以上、情報を見れなくなりました。

ということで、別ブラウザで開けば、複数のOrganizationの画面は同時に見ますので、ご活用ください。
マネジメント以外のキャリアパスにも、カッツモデルは適用できるのか

# はじめに
- マネジメントの文脈でよく語られるカッツモデル（カッツ理論）
- しかしキャリアパスとしてスペシャリストやゼネラリストも一般的になっている今、それらにもカッツモデルは活かせるのではないか？を考えてみる

# カッツモデルとは

> 「カッツ・モデル」とは、ハーバード大学のロバート・カッツ教授が提唱した
> マネジメント層に求められる能力に関するモデルです。
> 
> カッツ・モデルでは、まずビジネススキルを以下の３つに分類しています。
> 
> ・業務を遂行するために必要な能力の「テクニカルスキル」
> ・クライアントと交渉力やプレゼンテーション力など対人関係の能力の「ヒューマンスキル」
> ・知識や情報、経験などをもとに物事の本質を見極めて対応する能力「コンセプチュアルスキル」
> 
> また、マネジメントの階層を３つに分類すると、
> それぞれの役職に応じて必要なビジネススキルの割合、重要度が変わるとしています。
> 
> ロワーマネジメントのうちはテクニカルスキルが求められますが、
> 階層が高くなるにつれコンセプチュアルスキルが重要になっていくとしています。
> また、ヒューマンスキルはどの階層であっても求められるスキルであるとされています。

![katzmodel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/85f918df-145b-532e-8e1c-142173caf2ee.png)
文章・画像引用：[マネジメント層に求められる能力を表した「カッツ・モデル」　　](https://en-college.en-japan.com/column/2020/659/)

- ロワーマネジメントはチームリーダーや係長クラス
- ミドルマネジメントは課長やマネージャー、部長クラス
- トップマネジメントは役員クラス
- ぐらいがざっくりの目安

# スペシャリストとは
> スペシャリストとは、特定分野を専門にする人、特殊技能を持つ人、専門家です。ビジネスにおいては、特定分野に深い専門知識を持つ人材を指します。
引用：[スペシャリスト / Specialistとは？【なるにはどうする？】](https://www.kaonavi.jp/dictionary/specialist/)

- 厳密な定義があるわけではなく、上記も一例である

# スペシャリストの中に"ゼネラリスト"を含むのか否か
- スペシャリストの定義で難しいのは、ゼネラリストを含んで指している場合が存在すること
- エンジニアのキャリアパスを説明する際に
    - マネジメント
    - スペシャリスト
    - の2つに大別する時もあれば、
    - マネジメント
    - スペシャリスト
    - ゼネラリスト
    - の3つに大別している場合もある
- かなり雑に説明すると、前者の場合は
    - ヒト・モノ・カネのマネジメントを担う：マネジメント
    - 技術に特化した役割を担う：スペシャリスト
- 後者の場合は
    - ヒト・モノ・カネのマネジメントを担う：マネジメント
    - 技術領域が狭く深い箇所を担う：スペシャリスト
    - 技術領域が広い箇所を担う：ゼネラリスト
- こんな分け方になっている
- この記事では、後者の3つに大別して考えてみる

# マネジメントの場合
- カッツモデルがそもそもマネジメントを前提として書かれている
- なので、このキャリアパスの重要性はいまさら書く必要性が薄いため割愛

# スペシャリストの場合
- 大いに活きるが、必ずしもカッツモデルが適用されるとは限らない
- 例えばコミュニケーションが苦手で、ただひたすらコードを書いている方が好きだったり、生産性が高い方も当然いる
    - その場合は、テクニカルスキルを最優先に伸ばし続けて貢献するのも手
- ただし、カッツモデルが不要というわけではない
    - 一点突破型といえば聞こえは良いが、テクニカルスキルだけでマネジメントレイヤーを上げていくのは大変
    - コンセプチュアルスキルやヒューマンスキルがボトルネックとなり、テクニカルスキルを活かしきれない可能性が出てくるため
        - 例） 技術選定の際に推しの技術があるが、なぜそれを採用すべきか周囲にうまく伝えられない
            - →マネジメントレイヤーが上がればエンジニア以外に伝える機会も増えるため、難易度は上がる

# ゼネラリストの場合
- ゼネラリストの場合、スペシャリストに比べてカッツモデルの重要度は増すと考えられる
- スペシャリストが一点突破型なのに対し、ゼネラリストはカバー範囲が広い
    - 例） フロントエンド、バックエンド、インフラ全ての技術選定や設計を担う
    - 広いがゆえに、全てを自分一人で手を動かすのには限界が来る
        - 場合に応じて、特化領域ごとのスペシャリストの結節点になることも
    - すると他チームメンバーとの **ヒューマンスキル** が必要
    - 技術を組み合わせて事業や自社にどう活かせるか考える **コンセプチュアルスキル** も必要
    - そしてマネジメントレイヤーが上がっていくと、より大きな組織や事業を任されることになる
        - 余計に、ヒューマンスキルやコンセプチュアルスキルの占める割合が増える

# 結論
- マネジメントの場合、カッツモデルは重要
- スペシャリストの場合、大いに活きるが、必ずしもカッツモデルが適用されるとは限らない
- ゼネラリストの場合、スペシャリストに比べてカッツモデルの重要度は増す
- というのが私個人の見解
- 当然 "マネジメント" "スペシャリスト" "ゼネラリスト" は場合によって定義も異なるし求める役割も異なるので、一概には言えない
- ただし、「とにかく技術のキャッチアップだけ続けていれば、大きな役割を任せてもらえる」とだけ考えているのであれば、こういう考え方もあるんだという一助になれば幸い
NFTのホワイトリストとは？やり方やメリット・ミントや獲得条件！

非代替性トークンとも呼ばれるNFTが話題になっています。

とんでもない値段でやり取りされるデジタル資産の話なども耳にしますよね。

そんなNFTの取引でよく聞く「ホワイトリスト」とは一体なんのことなんでしょうか？

ホワイトリストを獲得することで、有利な売買ができるのですが、そのやり方や獲得条件が気になりますよね！




そこで今回は、NFTのホワイトリストについて解説していきます。

メリットや獲得条件、獲得する方法もお教えしますよ！






NFTのホワイトリストとは何か解説

ホワイトリストとは、NFTの購入優先権のことです。

分かりやすく説明すると、ブラックリストの逆で、警戒する必要がなく、購入を優先的に行う権利を持った人のリストのことを意味しています。

NFTプロジェクトの初期段階では特に、抽選を行ったりしてホワイトリストを配ることが多くあります。

ホワイトリストを獲得していれば、一般販売よりも早くお得にNFTを購入することができますよ！




なぜホワイトリストがあるのか？

ホワイトリストを配ることによって、プロジェクトの運営側にも、

・NFTプロジェクトの知名度を上げる
・コミュニティの規模を大きくする

といったメリットがあります。

ホワイトリストを配るときはTwitterを利用することが多いのですが、フォローやRTなどを通じて、広告やマーケティング活動にも繋がっているようです。




ホワイトリストのメリット

ホワイトリストを獲得することによって、通常価格よりも安くミントすることができます。

ミントとは、NFTを新規に発行・作成することを言います。

そもそも人気のNFTの売買は非常に競争が激しいものです。

ホワイトリストを獲得して安くNFTを購入することで、転売などの方法で利益が出せるという仕組みになっています。




また、人気のNFTの一般販売には購入者が殺到するので、ガス代と呼ばれる手数料が高騰する可能性があります。

ホワイトリストを獲得して優先的に購入することで、ガス代を抑えられるというメリットもありますよ。




ホワイトリストの獲得条件


ホワイトリストの獲得は、基本的にはTwitterで開催されているホワイトリストギブアウェイに参加することになります。

ただしその前に、いくつかの準備が必要です。

・仮想通貨取引所の口座
・ウォレット
・NFTの売買に使う暗号資産

全くの初心者には、アプリダウンロード数No1のコインチェックの口座がおすすめですよ。

無料で口座開設することができます。

ウォレットは、暗号資産やNFTを入れるデジタル上の財布のようなものです。

こちらも初心者であれば、メタマスクがおすすめですよ。




暗号資産に関しては、NFTのやりとりにはイーサリアムなどが使われることが多いようです。

これらの準備ができれば、獲得する条件はある程度クリアです。

他に、各種SNSを使う必要があるので、次から紹介していきます。




WLGiveawayに参加

ホワイトリストは、Twitterで開催されるWLGiveaway（ホワイトリストギブアウェイ）に参加するのが基本です。

Twitterで「Giveaway」「WLGiveaway」「ホワイトリスト」などと検索すると、多くの募集が出てきますよ。

それぞれの案件で、フォローやRTなどが条件になっているので、その条件をクリアして応募していきましょう。




Discordの登録

Discordは、簡単なチャットツールです。

Twitterで行われているWLGiveawayでも、Discordの参加や招待、発言などが条件になっているものが多くあるので、事前に登録しておくと良いでしょう。




Telegramの登録

Telegramは無料のメッセージアプリです。

こちらもプロジェクトによっては、同じように必要になることもありますよ。




NFTのホワイトリストとは？やり方・作り方やミントと獲得条件！まとめ

今回は、NFTのホワイトリストについて、メリットややり方、獲得条件などを書いてきました。

ホワイトリストとは、NFTの購入優先権のことです。

・仮想通貨取引所の口座
・ウォレット
・NFTの売買に使う暗号資産
・Twitterの登録
・Discordの登録
・Telegramの登録

などを準備することで、ホワイトリストの獲得やその後のNFTの売買が可能になります。



ただし、発信者が公式サイトであることを確認することは大切です。

きちんとプロジェクトの精査をした上で、ホワイトリストの獲得とNFT売買を行いましょう！

https://sknet-sougou.com/opensea-secondary-distribution/
Refrigerants for air-conditioning systems, ボッシュ自動車handbook 11版(42) p.591

Operating fluids, Urea/water solution, ボッシュ自動車handbook 11版(42)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
# Refrigerants for air-conditioning systems(空調系冷媒)
p.591
## Development up to today 
### Refrigerant R12
### Refrigerant R134a
### Refrigerant R1234yf
### Refrigerant Co2

## Alternative possibilities 
### Water as Refrigerant
### Air as Refrigerant
### Combustible substances as alternative Refrigerants

# Reference
[1] Molina, Mario J. ;  Rowland, F. S., Stratospheric sink for chlorofluoromethanes: chlorine atomc-atalysed destruction of ozone. Nature No.249, pp810-812, June 28. 1974

https://www.nature.com/articles/249810a0

[2] Directive 2006/40/EC of the European Partiament and of the Council of 17 May 2006 relating to emissions from air-conditioning systems in motor vehicles and amending Council Directive 70/156/EEC

https://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2006:161:0012:0018:en:PDF

[3] Regulation (EC) No. 842/2006 of the European Parliament and of the Council of 17 May 2006 on certain fluorinated greenhouse gases (Text with EEA relevance)

https://eur-lex.europa.eu/legal-content/EN/ALL/?uri=CELEX%3A32006R0842

[4] H. Kuruse, Alternative Kalteprozesse unter Umweitschutzgesichtspunkien
Statusberichte Nr. 3

Kruse, H.:
Alternative Kälteprozesse unter Umweltschutzgesichtspunkten *
Für diesen Bericht ist keine Beschreibung verfügbar.

https://edele.de/shop/item/9783922429920

[5] Umweltbundesamt Erprobung Messung und Bewertung von Systemen mit 2015


http://www.ak-uis.de/download/Abschlussberichte/2014-Karlsruhe-2015-Kassel-doku_58_2015_umweltinformationssysteme_1.pdf
# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221023
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Go言語 : システムパフォーマンスチェック

## 概要
システムパフォーマンスを計測するログを出力するためのサンプルである。
計測サンプルとして、素数を求めるためのゴルーチンを5つ起動させて、計算が終了した時点でそのゴルーチンは終了させている。
そして、それぞれの計算が終了した時点でのシステムログを出力させている。

## ライブラリ
今回は"gopsutil"というライブラリを使用している。  
https://github.com/shirou/gopsutil  

このライブラリは、CPUやメモリなど、さまざまな情報を取得することができる。

適宜、以下のコマンドなどでインストールしてほしい。
$ go get github.com/shirou/gopsutil/cpu

## ログ出力コード
```Go
// Output system performance
func checkPerformance() {

	// CPU Performance
	ps, _ := cpu.Percent(100*time.Millisecond, false)
	cpuPercent := int(ps[0])
  
	// Memory Performance
	var ms runtime.MemStats
	runtime.ReadMemStats(&ms)
	heapMem := int(toKb(ms.HeapAlloc))
	sysMem := int(toKb(ms.Sys))
  
	// Counting Goroutines
	goroutineCount := runtime.NumGoroutine()
  
	// Log output of system performance
	fmt.Printf("CPU : %d percent, HeapMemory : %d KB, SystemMemory : %d KB, GoroutineCount : %d \n", cpuPercent, heapMem, sysMem, goroutineCount)
}
```

## 出力サンプル
$ go build -o SystemPerformanceCheck SystemPerformanceCheck.go  
$ ./SystemPerformanceCheck  
100000 Line Target Goroutine Wake UP  
200000 Line Target Goroutine Wake UP  
250000 Line Target Goroutine Wake UP  
150000 Line Target Goroutine Wake UP  
300000 Line Target Goroutine Wake UP  
CPU : 63 percent, HeapMemory : 180 KB, SystemMemory : 9043 KB, GoroutineCount : 6  
PrimeAnswer1 : 100003  
CPU : 51 percent, HeapMemory : 182 KB, SystemMemory : 9299 KB, GoroutineCount : 5  
PrimeAnswer2 : 150001  
CPU : 40 percent, HeapMemory : 182 KB, SystemMemory : 9299 KB, GoroutineCount : 4  
PrimeAnswer3 : 200003  
CPU : 26 percent, HeapMemory : 183 KB, SystemMemory : 9299 KB, GoroutineCount : 3  
PrimeAnswer4 : 250007  
CPU : 12 percent, HeapMemory : 184 KB, SystemMemory : 9299 KB, GoroutineCount : 2  
PrimeAnswer5 : 300007  
CPU : 5 percent, HeapMemory : 184 KB, SystemMemory : 9299 KB, GoroutineCount : 1  

## GitHub
https://github.com/GL-Kageyama/Go_SystemPerformanceCheck
トップエンジニアに学んだ技術より大事なもの

### はじめに

「世界に通用する強い技術者になりたい」
を目標に、日々奮闘中の方も多いのではないでしょうか。

自分もその一人で、技術や知識より大事なものについて、
自戒の念を込めて、思うがままに書いてみることに。

### 考える力って?

問題解決に向けた、切り口や発想、お作法などでしょうか。
モノづくりの哲学みたいな独自の信念も含まれているような。

運よく`Oracle ACE`(日本に数名?)のAさんと仕事ご一緒したことあります。
OSやカーネルなど精通し、その技術力はいろいろ学べるものがありました。
ただし、技術や知識より感銘を受けたのは、課題解決における`考える力`。

Aさんと仕事した中で感じたものを思い起こし、羅列してみます。

### 難題にぶつかったら、三つ以上案を出してみる

思いつく案を、とにかく三つ以上書いてみる。
そして、それぞれのメリット・デメリットを分析/比較。

|案|内容|メリット|デメリット|
|--|--|--|--|
|1|XXX|...|...|
|2|YYY|...|...|
|3|ZZZ|...|...|
... ...

単純比較なら二つの案でも物足りる気がしますが、
二者択一では、ベスト案を見逃す可能性が高いとか。

### ソースコードは、美しさを追究する

Aさんのソースコードを読んでいると、アート作品に見えてきます。
ロジックのみならず、コードの簡潔さやコメント1つもとことん追究する。

わかりやすい、
無駄がない、
読んでいて気持ちいい、
その故、バグを生みにくい。

### 基本を大切にする

コーディング上の疑問は、公式ドキュメントや書籍を読み返し、徹底的に理解する。
例えば、通信プロトコルを使用する場合、RFC定義を注意深く理解し、根拠とする。

### 作業効率を追究する

世に存在する部品は作らない(車輪の再発明をしない)。
自ら作成した新機能は、再利用できるように部品化しておく。

手動テストをしない、自動化するかテストツールを駆使する。
テストツールがなかったら、時間をかけても自前作成する(将来的にコストダウンにつながる)

### 設計は、デザインパターンを意識する

Wikipediaからデザインパターンとは

https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)

- ソフトウェア開発におけるデザインパターンまたは設計パターン(design pattern)
    - パターン(pattern)とは、型紙（かたがみ）やひな形を意味する
- 過去のソフトウェア設計者が発見し編み出した設計ノウハウ
- 蓄積したノウハウに名前をつけ、再利用しやすいように特定の規約に従ってカタログ化されたもの


### 製品リリースに含める機能は、欲張らない

プロジェクトによっては、お客様からさまざまな機能を要求される。
開発者自身が、気に入った機能を付けたくなる場合もあります。

ただし、ここは欲張らず、コア機能に徹すること(特に初版リリースは)。
痛くも痒くもない機能を詰め込むと、肝心な基本機能が疎かになってしまうので。

### OSS(オープンソースソフトウェア)からヒントをもらう

GitHubなど公開されているOSSは、プログラミングの教材でもあります(例えば、Python自体のCコード)。
Aさんも、OSSに着目し、そこからいいヒントをもらっていました。
もちろん、Aさん自身もGitHubに有益な成果物を発表していました(それがOracle ACE推薦につながったとか)。

### おわりに

Aさんとの雑談で、週末は趣味で何かされましたか、と聞きました。
答えは、いいアイディア浮かんだのでプログラム一本書いたよ、と。

趣味を仕事にでき、コードを書くことが楽しくてたまらない、
これこそ、最強で幸せなエンジニア人生と感じた瞬間でした。
Excel: セルの表示された値をそのまま値として利用する


ちょっとした小技です。

###### 実施環境 : Microsoft Office Professional Plus 2016

### やりたいこと

以下のように YYYYMMDDHHMMSS 形式で日付が表示されたセルがあるとします。
この「 YYYYMMDDHHMMSS 」を表示されたそのままの形の文字列として別のセルにコピーすることを考えます。

![WS000275.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/82cf8ca4-6acb-be3b-138a-60c1741b049f.jpeg "コピー元セル")

ここで単純にこのセルの値を別のセルにコピーすると、以下のような謎の数値になってしまいます。

![WS000281.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/858da867-ebbc-4284-67ba-49cb20a325cd.jpeg "コピー先セル")

この値は Excel における日付の内部的な値です。
日付が入力されているセルは表示されている形式がどのように設定されていても、値としてはこのような数値が入っています。

では、どうすればよいでしょうか。

### 方法

答えは簡単で、一旦外部のテキストエディタを経由すればよいです。
例えば以下のように、 Windows のメモ帳にセルをコピーします。
すると、「 YYYYMMDDHHMMSS 」の形の文字列としてコピーされます。

![WS000277.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/2c43d957-961f-74bd-62a7-7846d595b9cc.jpeg "メモ帳")

あとはこのメモ帳の値を再度コピーして Excel のセルに貼り付ければ OK です。
ただし、今回のようにコピーする値が数値として解釈できる場合は形がまた崩れてしまう場合があるので、貼り付け先のセルの形式は「文字列」にしておくのがベストです。

![WS000280.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ab27e50b-05f6-8f90-10e6-d4a0ddc8c1c0.jpeg "エクセル")
vue-papa-parseでCSVをjson形式にパースしようとした時に躓いたthisの話


下記で`vm.members.push(lines[i])`となっているところを`this.members.push(lines[i])`としていた時に、`this.members`が`undefined`になって`members`の値を変えられずに詰まった。

その時の`this`はvueのthisではなく、`vue-papa-parse`のオブジェクトを指していたため`members`というプロパティがなく`undefined`になっていた。
関数内で

```
const vm = this
```
して、以降vmを指定するようにすれば期待していた動きをするようになった。


```
<template>
          <div>
            <input
              ref="input"
              style="display: none"
              type="file"
              accept="text/csv"
              @change="loadCsvFile"
            />
            <button
              class="w-60 text-center bg-gray-200 transition duration-150 ease-in-out focus:outline-none border border-transparent focus:border-gray-800 focus:shadow-outline-gray hover:bg-gray-300 rounded text-indigo-700 px-5 h-10 text-sm"
              @click="btnclick"
            >
              CSVから会員情報を読み込む
            </button>
          </div>
</template>


<script>
export default {
  data() {
    return {
      members: [
        {
          id: "",
          name: ""
        },
      ],
    }
  },
  methods: {
    loadCsvFile(e) {
      const file = e.target.files[0]
      const vm = this
      // 関数の直下thisはvueのthis
      // その下（this.$papa.parse）の下だとvueのthisは参照されない
      // .pushでundefinedで躓いた時 配列かどうかを確認→thisを使ってたらthisの中身を
      this.$papa.parse(file, {
        header: true,
        complete: function (results) {
          console.log(this)
          const lines = results.data
          for (let i = 0; i < lines.length; i++) {
            vm.members.push(lines[i])
          }
        },
      })
    },
  }
}
</script>
Powershellでブラウザを起動し特定のサイトへアクセスする方法

# はじめに

powershell の学習を始めたものの何をすればいいのかわかりません。
そこで超簡単なスクリプトファイルを作成することにしました。

# Powershellでブラウザを起動し特定のサイトへアクセスする

スクリプトファイルの内容は以下のようになります。これだけです。
拡張子は「.ps1」となります。

```
start '開きたいサイトのURL'
```

Mac の場合は「start」を「open」にすればOKです。
もちろんコマンドレットでも実行できます。
AWS JumpStartに参加してきました

AWSのサービスを本格導入を検討中です。
アーキテクチャ図を初めて描いたのですがいまいちこれでいいのか不安な部分がありました。

そんな時にアーキテクティングについて学ぶAWS JumpStartという無料の研修があることを知りました。

https://awsjumpstart221020.splashthat.com/

無料でオンラインで参加できるのでリモートワークをしている私にはちょうどいいと思い早速申し込み👍
チームに分かれて、与えられた課題の解決のためのアーキテクチャを考えるという感じです。

Slack、Bluescape(ホワイトボーディングツール)、Chime(AWSが提供するオンライン会議ツール)などを使って数名でワイワイアーキテクチャを考えるのはなかなか楽しいものですね。

出来上がったアーキテクチャ図がこちら。

![スクリーンショット 2022-10-21 17.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/0f34857a-6e6e-2e60-9291-cff2265afb67.png)

これから同じ研修を受講する人もいるかと思いますので詳細の説明は割愛しますが、ここまでのアーキテクチャ図を描けるようになったという自信につながりました。

Fargateのハンズオンの時間もあり、Slackでのコミュニケーションも盛り上がったので結構楽しかったですよ。

12月にも開催されるようなので、アーキテクチャ図作成について学んで見たい方はぜひ参加してみてはいかがでしょうか？
UiPath Friends Festival 2022 に行ってきたので感じたことをまとめる

# はじめに
昨日UiPath Friends Festival 2022 に行ってきたので
その時の様子や感じたことをメモとして残します。
# UiPath Friends Festival 2022って？
コミュニティであるUiPath Friendsが主催するイベントです。
自分は大手町会場に参加してきました。
Youtubeにもアーカイブが残っていますので、ぜひご覧ください。


https://www.youtube.com/watch?v=3EYTg3mg1ps


# 参加してどうだった？

## 発信のためのモチベーションアップにつながった
発信活動を行っているうえで、同じように発信活動している人、
同じようにUiPathを使って開発している人と話ができたり、登壇者の話を間近で聞けたことでとても刺激になりました。
自分ももっと発信のクオリティを上げたいと思えるようになったのは、参加の意義があったなと思います。

## 製品について調べるきっかけがもらえた
自分はStudio以外は仕事では使っていないのですが、
このイベントではTest Suiteなど他製品の話も聞けたことが個人的にすごくよかったです。
まずは個人的に使ってみてある程度習熟してから職場でも使うことができるかなど、
検討を重ねたいなと思いました。

https://docs.uipath.com/test-suite/lang-ja


## メンバーがすごく楽しそうだった
登壇者、運営メンバーを間近で見ていて感じたのが
「全員すごく楽しそうに参加されていた」ということでした。

ここを感じることができたのは会場参加してよかった点だと思っています。

今度はただ参加するだけではなく、登壇して何かアウトプットできればと思います。
（宣言して奮い立てるタイプ）

# おわりに
当日準備不足で30分前についていたにも関わらず、会場が3階であることを失念しており、1階付近で延々と遭難していたのは多分自分だけだと思います。
（当日運営の方に助けてもらい、ちょっぴり遅れて会場入りができました。ありがとうございました）
次参加するときはもう少し確認します。。。
あとUiPath Friendsのシールもらえてすごい嬉しかったです（小学生並の感想）
開発の時にはTwitterを使おう！

こんにちは、rickyです。

この記事では個人で何かを開発したり勉強する時にTwitterを活用する利点をご紹介します。

私は秋ごろからElixirのお仕事をさせて頂いています。
その関係上Elixirの技術書をゴリゴリ自習しているのですが、わからないことがあったり、考えをまとめたい時にはもっぱらTwitterを活用しています。
現在このやり方がかなりうまくいっていてオススメなので共有出来たらなと思います。

# Twitterを活用する利点
## ・言語化が出来る
自分のやっている作業を言語化するのはなかなか難しいことです。
特に知らない用語やはじめて勉強する内容は言葉に起こそうとすると意外とかけないことに気が付きます。
そこでTwitterを活用して細かく書くようにしています。
そうすることで自分の思考を整理することができます。

こんな具合に一生懸命言語化してます。
![Screenshot_2022-10-24-18-06-33-72.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/1d1ffd7e-65bb-b34b-f174-15eede2c94f9.jpeg)



## ・発信することで他の開発者さんの情報やちょっとした指摘が頂ける
Twitterには色々な方がおられます。
よほど特殊なことに着手していない限り発信を続けると先人の方たちや知見を持った方がいるものです。
わからないことを頑張って言語化するとそういった方が何かしらのツッコミを入れて下さったり、いいねを頂けたりして情報が拡散します。
またそういった方をフォローすることで勉強会の情報や面白い技術的なツイートが見れたりします。

## ・見直しができる
Twitterの検索機能を利用して疑似的な備忘録として活用することが期待できます。
以前にやった内容を忘れてしまった時に自身のアカウントから調べることで情報を抜き出すことが可能です。
この際に特徴的なワードやハッシュタグを用いるとより情報を探しやすくなります。

例えば私のアカウント名とElixirを検索窓に入力して検索すると…
![Screenshot_2022-10-24-18-09-08-75.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/50399492-2a76-2f94-4a9d-df7d661403b2.jpeg)
このように日付がバラバラでもちゃんと自分のツイートを探し出せます。

# 最後に
言うまでもないことだとは思いますが一応念のために
情報をくれたり教えてくれた方にはきちんとお礼を言うことは凄く大切です。
貴重な時間を割いてツイートを読んでくれた、教えて頂いたという感覚は持つべきだと思いますし、きちんと礼儀正しく対応するのはお互いに気持ちの良い関係を築けるものです。
気持ちの良いTwitterライフを！
WSL2で、tensorflowを動かす（cudnn8のインストール方法）

# 課題

WSL2環境に、wsl用のcudaをインストールした場合、cudnn8がレポジトリーに含まれておらず、インストールができません（2022/10/23現在）

https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/

このwsl用のレポジトリーに、`libcudnn8*`が無いんです。


次の方法でインストールできました。
もっと適切な方法があるのかもしれませんが、これでインストールできて、使えました。

### ubuntu用のレポジトリーからパッケージを取得

```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/libcudnn8-dev_8.0.5.39-1+cuda11.1_amd64.deb
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/libcudnn8_8.0.5.39-1+cuda11.1_amd64.deb
```
### インストール

```
$ sudo apt install  ./libcudnn8-dev_8.0.5.39-1+cuda11.1_amd64.deb ./libcudn
n8_8.0.5.39-1+cuda11.1_amd64.deb
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'libcudnn8-dev' instead of './libcudnn8-dev_8.0.5.39-1+cuda11.1_amd64.deb'
Note, selecting 'libcudnn8' instead of './libcudnn8_8.0.5.39-1+cuda11.1_amd64.deb'
The following NEW packages will be installed:
  libcudnn8 libcudnn8-dev
0 upgraded, 2 newly installed, 0 to remove and 294 not upgraded.
Need to get 0 B/896 MB of archives.
After this operation, 4567 MB of additional disk space will be used.
Get:1 /home/masa/deeplearning4/4.2/gridworld/libcudnn8_8.0.5.39-1+cuda11.1_amd64.deb libcudnn8 amd64 8.0.5.39-1+cuda11.1 [506 MB]
Get:2 /home/masa/deeplearning4/4.2/gridworld/libcudnn8-dev_8.0.5.39-1+cuda11.1_amd64.deb libcudnn8-dev amd64 8.0.5.39-1+cuda11.1 [389 MB]
Selecting previously unselected package libcudnn8.
(Reading database ... 77559 files and directories currently installed.)
Preparing to unpack .../libcudnn8_8.0.5.39-1+cuda11.1_amd64.deb ...
Unpacking libcudnn8 (8.0.5.39-1+cuda11.1) ...
Selecting previously unselected package libcudnn8-dev.
Preparing to unpack .../libcudnn8-dev_8.0.5.39-1+cuda11.1_amd64.deb ...
Unpacking libcudnn8-dev (8.0.5.39-1+cuda11.1) ...
Setting up libcudnn8 (8.0.5.39-1+cuda11.1) ...
Setting up libcudnn8-dev (8.0.5.39-1+cuda11.1) ...
update-alternatives: using /usr/include/x86_64-linux-gnu/cudnn_v8.h to provide /usr/include/cudnn.h (libcudnn) in auto mode
```
WSLのイメージ(ext4.vhdx)が肥大化した時の対処

# 手順

※1,2の作業はなくてもよいかもしれない。不要かどうかは今後確認。

1. VM内で次のコマンドを実行してディスクがいっぱいになるまで、内容0のファイルを作成する
dd if=/dev/zefo of=/tmp/zero.img bs=1M

1. Disk Fullになったら/tmp/zero.imgを削除

1. vhdxの場所を確認。
　参考　https://qiita.com/neko_the_shadow/items/ae87b2480345152bc3cb

1. vhdxを最適化する
　参考　https://blackbird-blog.com/optimize-vhd-01

# vhdxの場所を確認

```
PS C:\Users\masat> Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName

PackageFamilyName
-----------------
CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
```

Win+Rキーを押して、　%LOCALAPPDATA%　と入力する

Packages　の中の
PackageFamilyName（↑で調べたCanonical～～）の中の
LocalState　にext4.vhdxがある

このファイルにoptimaize-vhdを実行する


# 最適化

```
PS C:\Users\masat> optimize-vhd C:\Users\masat\AppData\Local\Docker\wsl\data\ext4.vhdx -Mode Full
PS C:\Users\masat>
```
【BGP】ベストパス選択 ⓪用語確認

## はじめに
今回はBGPにおけるベストパス選択の用語確認、設定、動作確認をしていきます。
用語については基本的にはCisco公式ドキュメントより引用します。ドキュメントは日本語が怪しい点がありますので、適宜最適な日本語を記載していきますが、認定試験を受ける方は公式ドキュメントを実際に見て練習代わりにしたほうがいいかもしれません。
引用元は単元ごとに明記しております。
## ベストパス選択とは
BGPルータは通常、同じ宛先への複数のパスを受信します。BGP の最適パス アルゴリズムは、IP ルーティング テーブルに格納し、トラフィック転送に使用する最適なパスを決めるものです。

https://www.cisco.com/c/ja_jp/support/docs/ip/border-gateway-protocol-bgp/13753-25.html

## ベストパス選択の仕組み
BGPでは4つのメッセージを交換します。(https://www.infraexpert.com/study/bgpz02.html)
その中のUPDATEメッセージに含まれる、パスアトリビュートをもとにベストパスの選択をします。
このパスアトリビュートの中でも優先度があり、優先度が高いものから順にアトリビュートを比較します。

## パスアトリビュート
優先度が高いものから順に記載

:::note info　
**前提としてNEXT_HOPアトリビュートにIP到達性があること**
EBGPピアにはNEXT_HOPアトリビュートを自身のIPアドレスにしてアドバタイズしていますが、ルート受け取ったEBGPピアがIBGPピアにルートをアドバタイズする場合、自身をNEXT_HOPとはせずEBGPピアから受け取ったルート情報のままをアドバタイズしてしまいます。なので、受け取ったルート情報はNEXT_HOPに到達できないとみなされ無効なルート情報とみなされます。(static、再配布、next-hop-selfで対応)
:::

1\.最も高い WEIGHT を持つパスが優先されます。(Cisco独自)
2\.最も高い LOCAL_PREF を持つパスが優先されます。
3\.networkコマンド、aggregate-addressコマンドで生成したルート
4\.最短の AS_PATH を持つパスが優先されます。
5\.最小のオリジン タイプを持つパスが優先されます。
6\.最小の Multi-Exit Discriminator（MED）を持つパスが優先されます。

パスアトリビュートは合計13項目ありますが、基本的にはこの6つしか利用しないので割愛いたします。

## 次回
WEIGHTの設定と動作を確認していきます！
Docker gorm MySQLの接続

# DB接続について
## 問題
docker compose up と同時にsplファイルを読んで作られたMySQLサーバーに gorm 上で作ったアカウントでアクセスしようとしてもアカウントは作られるが、接続ができなかった。
```golang:database.go
    func init() {
        USER := os.Getenv("MYSQL_USER")
        PASS := os.Getenv("MYSQL_PASSWORD")
        PROTOCOL := tcp("xxxxx")
        DBNAME := os.Getenv("MYSQL_DATABASE_DS")
        fmt.Println(PASS)
        dialector := mysql.Open(dsn)

        var err error

        if db, err = gorm.Open(dialector); err != nil {
            connect(dialector, 100)
        }
        fmt.Println("db connected!!")
    }
```

## 対処法
USERをrootに、PASSをdocker-compose.ymlの MYSQL_ROOT_PASSWORDと同じに設定し直したら問題なく接続できた。