OmniAICreator/Qiita-1.07M huggingface dataset:
composerのinstallだとかupdateだとかlockだとか

いっつも忘れるのでまとめる。
参考文献はいつも長い。知りたいことだけをわかりやすい形で残す。

## 挙動

|  | composer.lockファイルがない | composer.lockファイルがある |
|---|---|---|
| composer install  |composer.jsonを参照  |composer.lockを参照  |
| composer update  |composer.jsonを参照  |composer.jsonを参照してcomposer.lockを更新  |


## 運用用途

途中参画してきたような人は、プロジェクトcloneしたらupdateはしない。基本的にinstall。
updateするような人はTLやULみたいなちょっと責任あるような人、社員さんとか。

朝会を毎日してるとして、朝会時に「ライブラリ更新したからみんなinstallしてな」って共有してもいい。
けど、毎回共有することを覚えてるほど人はしっかりしていない。
忘れてることもあるだって人間だもの。

ので、毎日勤務開始時にinstallするというルールを設ければ共有漏れがあったとしても必ずをチーム内でみんな同じバージョンのライブラリを使うことになるので、あの人の環境ではエラーになるのにこっちではエラーにならない、なんてこともなくなる。

## まとめ

### おらぁただの傭兵だべ
「installだけ使いましょう。updateを使わなければいけないとしたら運用の見直しを提案してみましょう」

### 我こそはチームを任されている中堅エンジニアである
「傭兵にupdateを使わせないためにも、json記述のなにかしらのライブラリのバージョンが上げたらupdateをしてlockを更新させてそれごとpushしチャイナ」

---

まだしっくりこない人は以下は如何かな。

https://helog.jp/php/composer-install-update/
livewireの呼び出しルール これしていると動かなくなる

# この記事の概要
livewireの動作がおかしいと思った際の解決ログです。
## 想定読者
- livewireを使用している
- livewireが上手く動作してくれない部分がある

## 得られること
- livewireのエラーが治るかも
- 正しいlivewireコンポーネントの呼び出し方

# livewireコンポーネントの呼び方
[公式ドキュメント](https://laravel-livewire.com/docs/2.x/rendering-components)に記載されている通り、以下のような呼び出し方をします。

```
<livewire:show-posts />
```
または、

```
@livewire('show-posts')
```

livewireコンポーネントにパラメータを渡す場合は次のようになります。

```
<livewire:show-post :post="$post">
```
または,

```
@livewire('show-post', ['post' => $post])
```

パラメータを渡す場合には、制約があるので、注意が必要です。これを守れていないとlivewireが正しく挙動しなくなります。
## パラメータの制約
パラメータの制約は[公式ドキュメント](https://calebporzio.com/livewire-isnt-actually-live)に記載されています。
livewireは動的に動かすために、Ajaxを使用しており、Ajaxが対応していないパラメータを渡すとerrorになります。

### 使用可能なパラメータの型
以下の型のみパラメータとして、渡すことができます。

- array
- string
- integer
- boolean
- null

### 使用できないパラメータの型
反対に使用できない型は、collection型などがあげられます。
データベースからeloquentなどを用いて、collection型のパラメータを使用している際は、livewireコンポーネント間をidなどでやり取りをし、レンダリング先のコンポーネントで、再度collection型を取得する流れになります。
collection型が動作しないことは確認済みです。datetime型なども動作しないかもしれません。

# 最後に
livewireのコンポーネントに使用できないパラメータを渡していても、Ajaxの層でのエラーなので、phpの画面にはエラー表示されません。
livewireの動作がおかしいと思ったら、コンポーネントに渡しているパラメーターを確認し直すと解決するかもしれません。

是非、お気軽にコメントなどしてください。
【UE4】EUWでMIDIデバイス選択して数値取得するやつ。

いまさらだけどちょっとMIDI周りいじりたかったのでデバイス選択するEUW作ってみたのとちょっとはまったことを。

https://youtu.be/p3U7QfjPQkY

4.27で作業してるんだけど、MIDI in/out両方あるデバイスだとDevaice Nameが同じものになってしまって区別がつかないのでinだけ取得したいんだけど、Find All MIDI Device Infoが何故か機能しない…
でFind MIDI Deviceを使うんだけど、この場合Found MIDI Deviceを分解でCan Receive fromでMIDI inを取得出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102588/f342305f-f0e7-40d9-4014-d8cc516883ea.png)
---
全体はこんな感じ
・MIDI Deviceを取得＞ComboBoxにセット＞カスタムイベントにバインド
・ComboBoxで選択されたDeviceのMIDI Messageを取得
・MIDI Messageの表示/非表示
・On CC Received
・On NN Received
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102588/c374a3c0-f46c-a914-5f42-08a78b6f2fb7.png)
---
On CC Received/On NN Receivedで処理をそれぞれ分けると追々面倒なのでまとめて`` chXX CCXX or NNXX / value/`` になるように処理。
DeviceIDはいらないかなと思って現状は無しで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102588/5ab0961d-6b42-2508-eb06-c6a9162a8baa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102588/c140d176-16a5-6e83-ef45-0c102b18b7f8.png)
Channel/Type/valueとかを諸々AppendしてMIDI Message(String)としてSet。
SetしたMIDI Messageを使いたいときは文字列でスイッチとかで適当に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102588/01b67b3f-490c-91f6-1ef3-e804f5451d6d.png)
---
取得したMIDI Messageを使ってこんなことをしてみたり。
EUW的な概念だけど使い方次第で色々出来るかも。

https://youtu.be/AVW55cpDTD0

Download >> [MIDITools.uasset](https://xxjulexx.gumroad.com/l/PGcXGc)
*UE4.27
AWS CLI ver.2のインストールおよび設定

# はじめに

Amazon ECS (Elastic Container Service) を用いて AWS 上にアプリをデプロイしたい。そのためにまず Amazon ECR (Elastic Container Repository) へコンテナイメージの登録が必要だが、登録するには Docker を認証するために `aws` コマンドを実行しなければならない。（詳細は[Docker イメージをプッシュする](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-push-ecr-image.html)を参照。）自身の環境にインストール済みの AWS CLI は ver.1 であったため、この機会に最新メジャーバージョンの2へとアップデートした。実行環境は以下。

- Ubuntu-20.04 (Windows 10 Pro, WSL2)

# AWS CLI バージョンの確認

以下コマンドで AWS CLI のバージョンを確認する。`aws-cli/1.18.69` であった。

```bash
$ aws --version
aws-cli/1.18.69 Python/3.8.10 Linux/5.10.16.3-microsoft-standard-WSL2 botocore/1.16.19
```

# AWS CLI ver.1 のアンインストール

AWS CLI ver.1 と ver.2 では同じ `aws` コマンド名が使用されるため、片方のみを使用することが公式で推奨されている。そこで、まず AWS CLI ver.1 のアンインストールを行う。[AWS CLI バージョン 1 のインストール、更新、アンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html)に沿って行えばよい。

私の場合、`$ sudo apt install awscli` でインストールしたのだが、そのパターンは書かれていなかったので、以下コマンドでアンインストールした。

```bash
$ sudo apt purge awscli
$ sudo apt autoremove
```

上記リンクには以下の記述があり、そもそも `apt` を使ったインストールは非推奨のようだ。

> awscli パッケージは、apt や yum などの他のパッケージマネージャーのリポジトリで利用できますが、これらのパッケージは AWS によって生成、管理、サポートされません。このガイドに記載されている公式の AWS CLI ディストリビューションポイントからのみ AWS をインストールすることを推奨します。

# AWS CLI ver.2 のインストール

[AWS CLI バージョン 2 のインストール、更新、アンインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)に沿って、AWS CLI ver.2 をインストールする。

```bash
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ sudo apt install unzip   # unzip コマンドがない場合のみ
$ unzip awscliv2.zip
$ sudo ./aws/install
```

以下コマンドでバージョンが2となっていることが確認できる。

```bash
$ aws --version
aws-cli/2.3.0 Python/3.8.8 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off
```

# AWS CLI の設定

以下コマンドで AWS CLI の設定を行う。アクセスキーに関しては、[AWS アカウントとアクセスキー](https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/pstools-appendix-sign-up.html)を参考に発行する（または管理者に発行してもらう）。

```bash
$ aws configure
AWS Access Key ID [None]: [Access Key ID]
AWS Secret Access Key [None]: [Secret Access Key]
Default region name [None]: ap-northeast-1   # リージョンが東京の場合
Default output format [None]: ENTER
```

# おわりに

AWS CLI ver.2 のインストールおよび設定を行った。Docker 認証を行い、ECR へのコンテナイメージの登録、ECS でのデプロイを試していきたい。
Androidで表示されているキーボードを閉じる方法

# 概要

Androidで表示されているキーボードを閉じる方法を記載する。
言語はKotlin

# Androidで表示されているキーボードを閉じる方法

InputMethodManagerのhideSoftInputFromWindowを使用する。
以下のコードを任意のイベントで実行されるようにすることでキーボードを閉じることができる。

```kotlin
val inputMethodManager: InputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(this.windowToken, InputMethodManager.RESULT_UNCHANGED_SHOW)
```
Nuxt3を触ってみたら本気を感じた

Nuxt3がベータになりましたね。
中身は色々変わったことが書かれているので、いちユーザーとして表面上何がどう変わったのかを見ていきたいと思います。

## プロジェクト作成

新規プロジェクトは``nuxi`というNuxt用の新しく作られたCLIを使います。
たった3コマンドでプロジェクトのテンプレートがもう使えちゃいます。

```bash
$ npx nuxi init nuxt3
$ cd nuxt3
$ yarn install
```

この状態でnode modulesのインストールが完了するので、開発用サーバーを起動しましょう。

```bash
$ yarn dev -o
```

`-o`オプション渡していたら以下のページが自動で開くはず。
開かなくても http://localhost:3000/ でいけますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/f27705ec-c0d7-8480-4b57-5e2d6ff0786f.png)

## ディレクトリ見てみる

この状態のディレクトリ見てみるとかなりあっさりです（node周りは省略）。

```text
/.nuxt         - 生成されたVueのアプリがここに作られる。基本触らない。
app.vue        - Nuxtのメイン（ルート）コンポーネント。
nuxt.config.ts - Nuxtの設定周りを記述するファイル。TSになった！
tsconfig.json  - /.nuxt配下にtsconfig.jsonを生成するために必要。良い感じになってるので基本はこのままで良さそう。
```

Nuxt2は`/pages`とか`/components`とかディレクトリすべて生成されて中にREADME.mdが格納されていたんですが、かなりミニマルな作りになったみたいですね。自分でドキュメント読みながら追加していくのが良さそう。個人的にはこっちの方が使う側もドキュメント読みながら自分で取捨選択していくようになると思うので良いんじゃないかと思いました。

## ドキュメント見てみる

あとはドキュメント自体が読みやすくなりましたね。
ConceptsとDocumentsがキッチリ分かれるようになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/625792bb-05d8-6b7d-c743-39cf4b1f2d7d.png)
ディレクトリのアイコンが分かりやすく、アプリをデプロイする為のドキュメントもキッチリ揃ってます。
かなりDeveoloper's Experienceが考えられたカイゼンが見えてイイですね！
Nuxtはディレクトリ構造がカッチリ決まってることが秩序をもたらしてくれるんですけど、
それぞれのディレクトリでどういう機能があるのかがディレクトリの名前更改も相まって理解しやすい。

## pagesとcomponentsにコンポーネント作ってみる

まずは`pages`ディレクトリを作り`index.vue`を作ってみます。

```vue:/pages/index.vue
<template>
  <div>
    <h1>INDEX</h1>
  </div>
</template>
```

このファイルを生成すると、開発サーバーが404になりました。理由は`pages`ディレクトリを検出時に`.nuxt`配下のアプリ生成がうまくいっていないか、`pages`ディレクトリを使うと`vue-router`を使うようになるのでその切替がうまくいかないんだと思います。いったん、`app.vue`自体の修正も必要になるので、先に`<NuxtWelcome/>`コンポーネントではなく`<NuxtPage/>`コンポーネントに差し替えます。

```vue:app.vue
<template>
  <div>
    <NuxtPage />
  </div>
</template>
```
これで`$ yarn dev -o`し直すと、ちゃんとページが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/de7fd0c2-1d99-c0b0-af56-7d30e5782e7d.png)
次はここに子コンポーネントを追加していきます。
`components`ディレクトリを作り中に`TitleComponent.vue`を作ります。

```vue:/components/TitleComponent.vue
<template>
  <h2>COMPONENT</h2>
</template>
```

そして、このコンポーネントを`/pages/index.vue`側で利用してみます。

```vue:/pages/index.vue
<template>
  <div>
    <h1>INDEX</h1>
    <TitleComponent />
  </div>
</template>
```
ドキュメント読むとなんと`components`ディレクトリ配下のコンポーネントはすべて自動的にインポートされるらしいです。Nuxt2ではここは手動でインポートが必要でしたね。ここまでやってくれちゃうと最初にNuxt3触ってからVue触るとわけわからなくなりそうな気も。基本を理解しているなら裏で色々やってくれるのは早くてありがたいですけどね。

ここでまた開発サーバーのページを開くとエラーが出ます。どうやらNuxtの機能に関わるディレクトリの変更はホットリロードできないみたいですね。おとなしく`$yarn dev -o`し直すと、コンポーネントが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/d06b0019-f758-5664-ade7-3dd11a3ad6b6.png)

## 感想

Nuxtというフレームワーク単体ではなく、CLI、ドキュメント、TypeScriptの導入など、総合的にDeveloper's Experienceのカイゼンを意識したエコシステムを目指し仕上げてきたなと言う印象を受けました。ここは個人的に素晴らしいポイントだと思っていて、そういうエコシステムにこそ健全なコミュニティが定着し、そのコミュニティがよりエコシステムを発展させていく良いライフサイクルが生まれることに繋がるはず。

とくにSSRのアプリのデプロイなんかは最初よくわからない人多いと思うんですが、それもメジャーなクラウドやホスティングサイトごとに説明が用意されてるのって親切ですよね。Vue3を少し触ってアプリ作るってなったらNuxt3でストレス少なく開発していくみたいな流れが良さそうです。
SSHトンネリングコンフィグの書き方

# SSHトンネリングとは
SSHトンネリングは、SSHポートフォワーディングとも言われる接続方法です。
例えば、とあるLAN内で公開されているWebサーバに対して、外部NWから接続したい時に、外部公開しているSSHサーバが存在している場合、SSHサーバとのSSH接続を経由して、目的のWebサーバに接続するといった接続方法のことです。


詳しくは、以下のURLを参照のこと。

SSHポートフォワーディング（トンネリング）とは - 小粋空間
https://www.koikikukan.com/archives/2016/09/15-000300.php

基本的に備忘録なので、分かりにくかったらゴメンナサイ。

## 多段SSH
コマンド

```
local$ ssh user@step_host -i <秘密鍵> -p <ポート>

step_host$ ssh user@target_host -i <秘密鍵>
```

Config

```
Host STEP_HOST
   HostName step_host
   Port <ポート>
   IdentityFile <秘密鍵>
   User user

Host TARGET_HOST
   HostName target_host
   IdentityFile <秘密鍵>
   User user
   ProxyCommand ssh -CW %h:%p STEP_HOST
```
これで、```ssh TARGET_HOST```のみで接続できる

## DynamicForward
LAN内のWebサーバにSSH経由で接続する際に用いている

コマンド

```
$ ssh user@step_host -D <ローカルポート> -i <秘密鍵>
```

Config

```
Host STEP_HOST
   HostName step_host
   IdentityFile <秘密鍵>
   User user
   DynamicForward <ローカルポート>
```

上記のコマンド or Config経由でLAN内のWebを閲覧するにはSOCKS Proxyを使います。
私は、Chromeユーザなので、Chromeを使った際の接続方法

ExtensionのProxy SwitchySharpを導入
https://chrome.google.com/webstore/detail/proxy-switchysharp/dpplabbmogkhghncfbfdeeokoefdjegm?hl=ja-JP

設定画面で、Profile Name, SCOKS Host, Portを入力し、SOCKS v5ラジオボタンを選択してSaveする。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34985/4bde8203-e592-217d-dab8-3ca028d18857.png)

アドレスバーの横にExtensionの地球儀の様なマークが出るので、そこで設定したProfileを選択して、LAN内のWebサービスのURLやIPアドレスなどをChromeのアドレスバーに入力すれば接続できるはず。

## LocalForward
LAN内で運用している特定サービス(私の場合Elasticsearch)に接続する際に用いている

コマンド

```
$ ssh user@step_host -i <秘密鍵>　-L <ローカルポート>:<target_host>:<ターゲットポート>
```

Config

```
Host STEP_HOST
   HostName step_host
   IdentityFile <秘密鍵>
   User user
   LocalForward <ローカルポート> <target_host>:<ターゲットポート>
```

LAN内に置いてあるElasticsearchからデータを取る時に、```http://localhost:<ローカルポート>```みたいに使っている。
phpbrew を使って install しようとすると openssl 周りのエラーが起きる

**これは小ネタです**

----

タイトル通りのトラブルが起きた時の解消法です。
端的に言うと、`openssl@3`をインストールしてるとエラーが起こります。

エラー内容

```
 error: use of undeclared identifier 'RSA_SSLV23_PADDING'
        REGISTER_LONG_CONSTANT("OPENSSL_SSLV23_PADDING", RSA_SSLV23_PADDING, CONST_CS|CONST_PERSISTENT);

 warning: 'RSA_new' is deprecated [-Wdeprecated-declarations]
```

だいたいこういうエラーが出てしまいます（`openssl@3`をインストールしてると）

そう言う時は、下記コマンドを打ちましょう（PHP8 をインストールする場合）

```sh
OPENSSL_CFLAGS="-I/usr/local/opt/openssl@1.1/include" \
OPENSSL_LIBS="-L/usr/local/opt/openssl@1.1/lib -lcrypto -lssl" \
phpbrew install 8.0 +default
```

コマンド掲載元：
https://github.com/phpbrew/phpbrew/issues/1249
AWSのEKSのログを(ニア)リアルタイムでBigQuery連携するアーキテクチャ調査メモ

# 背景
- AWSのEKSのアクセスログやアプリケーションログをリアルタイムにBigQueryに連携したい
- 現状の最適アーキテクチャ調査をしたのでメモ

# 方法
## 1. Fluentd -> BigQuery
### [Fluentd と BigQuery を使用したリアルタイムのログ分析](https://cloud.google.com/architecture/fluentd-bigquery?hl=ja)
- 最もシンプルな構成、BQでのアドホックな分析要求だけであればこれで良い
- 割り当て上限: テーブル毎にデフォルト100,000/secondのinsertの上限だが、追加リクエストで増やすこと可能 ([割り当てと上限](https://cloud.google.com/bigquery/quotas?hl=ja#streaming_inserts))
- ストリーミングインサートなので費用がかかる
  - $0.010 per 200MB ([データ取り込みの料金](https://cloud.google.com/bigquery/pricing?hl=ja#data_ingestion_pricing))
- kubenetesクラスタで設定するにはDeamonSet/SidecarContainerとしてエージェントを導入する
  - [[sambaizさんブログ]Kubernetesの1PodでAppとfluentdコンテナを動かしてBigQueryに送る](https://www.sambaiz.net/article/159/)
  - [[kube公式]Logging Architecture#cluster-level-logging-architectures](https://kubernetes.io/docs/concepts/cluster-administration/logging/#cluster-level-logging-architectures)
- (※)正確な分析のためには重複排除処理が必要な場合はviewなどを使って解決する必要がありそう

### その他参照
- [[DevelopersIO]Fluentdのコネクタを使ってBigQueryへのストリーミング挿入を試してみる](https://dev.classmethod.jp/articles/bq-fluentd/)
  - AWSインスタンスからの連携の情報あり。SA使う。

## 2. fluentd -> PubSub → Dataflow →  BigQuery
- 1の構成にPubSub + Dataflow を追加
- PubSubを挟むことにより複数のDestinationに分けられる
- Dataflowを挟むことにより、リアルタイムにログを処理するパイプラインも作成可能
- リアルタイムデータの活用やBQやGCSやMLなど複数に渡っていく場合は1ではなくこちらの方が良い
 
### 参照
- [[メルカリ]GCPでStreamなデータパイプライン始めました](https://engineering.mercari.com/blog/entry/2018-12-03-162618/)
- [ZOZOTOWNを支えるリアルタイムデータ連携基盤](https://techblog.zozo.com/entry/real-time-data-linkage-infrastructure)
- [[zozo]OSSにコントリビュートしてログ収集基盤におけるCloud Pub/Subのリージョン間通信費用を削減した話](https://techblog.zozo.com/entry/fluentd-pubsub-oss)

## 3. Cloud Logging Agent -> Cloud Logging -> BigQuery
- Fluentdではなく、Cloud Logging Agentを経由するところが1との違い
- 一旦Cloud Loggingを経由するため、Cloud Loggingの機能(検索、モニタリング設定)が使えることがメリット
- デメリットとしては、Cloud Loggingの費用がかさむ
- Cloud Logging エージェントの実体は Fluentd + [fluent-plugin-google-cloud](https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud)

### 参照
- [[studistブログ]GCP Cloud Logging でつくる EKS on EC2 のログ収集基盤](https://studist.tech/using-cloud-logging-with-eks-45ed915b4491)


# 結論
シンプルに1のFluentd + BigQueryが良さそう。要求によって2,3などを考える。
【SQL】mysqlでサブクエリを実行する

# 入力データ ※データの作成は一番下を参照

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/bb7fdfff-7702-8e84-8fb0-7e5734f0ba88.png)

#実行文
```SQL
select id,name,price from food_data main
where price =
 (select max(price)from food_data sub where main.category = sub.category);

↓これでもできる

SELECT id,name,max(price) FROM food_data GROUP BY category;


```

１・カテゴリがフルーツ同士で、今の値段が最大値(20)だったらレコードを取得しに行く。
２・同上
３・カテゴリが野菜同士で、今の値段が最大値(100)だったらレコードを取得しに行く。
４・同上


#結果   ※フルーツと野菜の一番多い個数を取得できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/2d7d57f3-5b26-e60b-ab04-a01105354246.png)




#データ作成

```SQL
CREATE TABLE `food_data` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `category` varchar(255) DEFAULT NULL,
  `number` int(10) DEFAULT '0',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2423 DEFAULT CHARSET=utf8mb4;

```
SentenceTransformerで日本語モデル読み込む時に対処したこと

1.git clone https://github.com/sonoisa/sentence-transformers
2.解凍したら、フォルダ内にさらに「sentence_transformers」があるのでこれをアプリケーションフォルダ内に配置。
3.「pip install fugashi」実行。
4.「pip install ipadic」実行。
5.あとは以下のような書き方でモデルを読み込むことができる。（例）

```
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("file_path")
sentence_vectors = model.encode("sentences")
```

※「pip install -U sentence-transformers」だとだめだったので、上記のやり方で対処。
The git repository at 'Users/XXXX' has too many active changes, only a subset of Git features will be enabled.というエラー

#VSCodeでGitのエラー
##背景
ローカルにVue.js用の環境構築を終え、GitHubにpushしようとターミナルで
`git init`をした後に後述するエラーに遭遇しました。

##環境
・MacOS Catalina バージョン 10.15.7
・Git 2.33.0

##エラー文、エラー内容
`The git repository at 'Users/XXXX' has too many active changes, only a subset of Git features will be enabled.`
と出ました。

VSCodeの変更差分の数を見ると10kと膨大な数になっていました。
上記エラー文は「変更箇所が多すぎるよ！」と言っているわけですね。

##解決方法
ググると、上記エラーが出た時`.gitignore`に追記して解決している方も多いのですが、
私の場合VSCodeを再起動だけしたら解決しました。
pytest の PytestUnknownMarkWarning 出力を抑制する

# 結論

以下の方針が良さそう。

* marker の数が少なければ marker を登録する
* marker が多ければ filterwarnings を設定する

# テスト環境

```
$ python --version
Python 3.8.5
$ pytest --version
pytest 6.2.5
$ echo $OSTYPE
darwin20.0
```

# PytestUnknownMarkWarning

pytest では marker を付けることができる。例えば以下のようなテストファイルがあったとして

```python:test_example.py
import pytest

@pytest.mark.testmarker1
def test_example1():
    assert True

@pytest.mark.testmarker2
def test_example2():
    assert True
```

例えば次のように `-m` オプションで marker を指定すればその marker　が付いたテストだけが実行される。この場合は `test_example2`。（`-m` でもう少し複雑な条件も指定できるがここでは割愛。）

```bash
$ pytest -m testmarker2
```

しかし `@pytest.mark.<marker>` でデコレーションしただけでは以下のような warning が出力されてしまう。何も対策しないと鬱陶しいし、確認すべき warning や error が見づらくなるので出力を抑制したい。

```bash
=========================================== warnings summary ===========================================
test_example.py:3
  /Users/guest/test_example.py:3: PytestUnknownMarkWarning: Unknown pytest.mark.testmarker1 - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
    @pytest.mark.testmarker1

test_example.py:7
  /Users/guest/test_example.py:7: PytestUnknownMarkWarning: Unknown pytest.mark.testmarker2 - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
    @pytest.mark.testmarker2

-- Docs: https://docs.pytest.org/en/stable/warnings.html
==================================== 2 passed, 2 warnings in 0.01s =====================================
```

# 対策

## 1. markers を設定する

warning メッセージに表示されている通り [pytest のドキュメントページ](https://docs.pytest.org/en/latest/how-to/mark.html) を見るとこの方法が書かれている。`pytest.ini` もしくは `pyproject.toml` に自分が利用する marker の設定を記載するというもの。記述例は以下。

```ini:pytest.ini
[pytest]
markers =
    testmarker1
    testmarker2
```

```toml:pyproject.toml
[tool.pytest.ini_options]
markers = [
    "testmarker1",
    "testmarker2",
]
```

# 2. filterwarnings を設定する

ドキュメントに記載されている通り、基本的には 1. がよいはずである。が、marker の数が多くなってくると面倒だし、test のメンテナンス（追加・削除）に応じて ini や toml を都度更新しないといけないのも何だかうれしくない。

検索して stackoverflow とか見てもイマイチで、ピンポイントで PytestUnknownMarkWarning だけ抑止するような方法が出てこない。ふと pytest 自体のソースコードを確認していると、[pytest の pyproject.toml](https://github.com/pytest-dev/pytest/blob/main/pyproject.toml#L44) に以下のような設定が記載されていた（抜粋）。

```toml:pyproject.toml
[tool.pytest.ini_options]
filterwarnings = [
    "ignore::_pytest.warning_types.PytestUnknownMarkWarning",
]
```

コメントで `# ignore use of unregistered marks, because we use many to test the implementation` とまで書いてくれているので目的にも合致していそう。これを設定するとピンポイントで PytestUnknownMarkWarning が無視される。

`pytest.ini` であれば以下のように設定すればよい。

```ini:pytest.ini
[pytest]
filterwarnings =
    ignore::_pytest.warning_types.PytestUnknownMarkWarning
```
EAP

***Extensible Authentication Protocol**(***EAP**) over LAN: 802.1X is a framework that defines transport and usage of credentials; usernames, passwords, certificates, tokens, and otp.

EAP is made up of 3 components; supplicant, authenticator and authentication server. Connection between Supplicant(client or peer) and Authenticator(switch or NAD or Policy Enforcement Point) is layer 2.
Authenticator(switch) to Authentication server is layer 3.

***Authenticator***(**NAD**) types can be a switch, WLC, ASA FTD, Load Balancer, or SW applications.

Two main types of EAP types; Native EAP(non-tunneled) and tunneled EAP.

***EAP-MD5***: 
Hidden credentials in hash. Common in IP phones and with MAB instances. Weakness is it is one-way authentication. The client does not check if the authenticator is trusted. 

***EAP-TLS***:
It supports mutual authentication, and uses X509 certificates. Endpoints will possess private key. Gaining popularity with enterprise BYOD cases.

***EAP-MS-CHAPv2***:
Sends encrypted credentials within MS-CHAPv2 session.
Supported as tunneled EAP with ISE only.

***EAP-GTC***(**Generic Token Card**):
Alternative to MS-CHAPv2. Allows for OTP. Supported as tunneled EAP only.

***PEAP***:
Has an inner tunnel and outer tunnel.
Builds the outer tunnel first, then exchanges credential within "inner methods." Supported inner methods : EAP-TLS, EAP-MsCHAPv2, EAP-GTC. The outer identity provides a mechanism to authenticate identity when establishing the tunnel.

***FAST***(**Flexible Authentication via Secure Tunneling**):
Invention of Cisco. Benefit is faster re-auth for wireless roaming. FAST uses Protected Access Credentials(PAC). It is like a secure cookie stored locally to prove it is authenticated. 
FAST configure authentication method list to process in order: authentication order[dot1x][mab][webauth]


***EAP-TTLS*** supports eduroam.org initiative, allowing "federated college students" ability to roam between sites. 
Setup is simpler ability to resume sessions with TLS tunneling are enhanced.

***Tunnel EAP***(**TEAP**) is a combined effort of key vendors to combine all benefits of into a single tunnel method such as EAP chaining, cert provisioning, management & channel binding.

***EAP chaining***:
So you want to use multiple devices in a single session?
Multiple credentials can be authenticated in a single EAP transaction wit EAP Chaining. EAP chaining can be done with Cisco AnyConnect NAM(Network Access Manager) & pushed out manually with EAP-FAST, or in Windows 10 natively with TEAP.
Excel VBA入門 ～その6 アンチパターン～

長年VBAを使い続けた結果、[異世界転生](https://dic.nicovideo.jp/a/%E3%81%AA%E3%82%8D%E3%81%86%E7%B3%BB)した人が書いたVBA入門記事その6です。まずはVBAの基礎を身に付けて、Pythonにステップアップしましょう。→[VBAユーザーのためのPython入門 ～xlwingsでExcelからPythonを呼び出す～](https://qiita.com/k_maki/items/9efdb70f69d6f3b00f80)

**記事一覧**

- [Excel VBA入門 ～その1 Excel VBAとは～](https://qiita.com/k_maki/items/eed5497c704c2ca91699)
- [Excel VBA入門 ～その2 最初のプログラム～](https://qiita.com/k_maki/items/47d6299ecbb293b01f5a)
- [Excel VBA入門 ～その3 基礎1～](https://qiita.com/k_maki/items/852fd4babfd3031b6d72)
- [Excel VBA入門 ～その4 基礎2～](https://qiita.com/k_maki/items/44fe76f5890fedd753b3)
- [Excel VBA入門 ～その5 Tips～](https://qiita.com/k_maki/items/575b6c6c7ec22581061c)
- Excel VBA入門 ～その6 アンチパターン～
 
# アンチパターンとは
良くないコードの書き方。これをやると後の人が困るのでやらないこと。

# [マクロの記録](https://qiita.com/k_maki/items/47d6299ecbb293b01f5a#%E3%83%9E%E3%82%AF%E3%83%AD%E3%81%AE%E8%A8%98%E9%8C%B2)で作成したコードをそのまま使用
読みにくいコードが生成されるため、そのまま利用すると保守が辛くなる。行いたい操作を実現するための方法（オブジェクトやそのメンバーの使い方）の確認に留めるべき。

```VB
'アンチパターン
Sub Macro1()
    Sheets("Sheet1").Select
    Range("C4").Select
    ActiveCell.FormulaR1C1 = "芦川先生"
    ActiveCell.Characters(1, 2).PhoneticCharacters = "アシカワ"
    ActiveCell.Characters(3, 2).PhoneticCharacters = "センセイ"
    Range("C5").Select
End Sub
```

```VB
'修正例
Sub Macro1()
    Sheets("Sheet1").Range("C4").FormulaR1C1 = "芦川先生"
End Sub
```

# アクティブなブックやシートを前提
書かれているコード以外のものに、コードの動作が依存してしまうため。

```VB
'アンチパターン
'シートを追加し、追加されたシートの"A1"セルに値入力
Worksheets.Add
Range("A1").Value = "がんばれ元気"
```

```VB
'修正例
Dim newWS as Worksheet
set newWS = Thisworkbook.Worksheets.Add
newWS.Range("A1").Value = "がんばれ元気"
```

# シートを番号で指定
シートに限らず、番号は何なのか分からなくなるので使わない。

```VB
'アンチパターン
Worksheets(1).Range("A1").Value = "シャーク堀口"
```

```VB
'修正例（シート名で）
Thisworkbook.Worksheets("登場人物").Range("A1").Value = "シャーク堀口"

'修正例（オブジェクト名で（プロパティ ウィンドウから事前に設定しておく））
wsChara.Range("A1").Value = "シャーク堀口"
```

# クリップボードにコピー＆ペースト
クリップボードはOSで共有しているため、タイミングが悪いとユーザー操作でExcel以外でコピーしたものが貼り付けられてしまう。オブジェクトのメンバーを適切に使えばクリップボードへのコピーは回避できることが多いため、極力避ける。

```VB
'アンチパターン
ws.Range("A1:C3").Copy

ws.Range("E1:G3").Select
Selection.Parent.Paste
```

```VB
'修正例
ws.Range("E1:G3").Value = ws.Range("A1:C3").value
```

# モジュールレベル変数（グローバル変数）を使う
モジュールレベル変数とは、プロシージャーや関数の外で定義された変数。他の言語ではグローバル変数と言う。グローバル変数はほとんどの場合用いるべきではない（＝害を多く生み出す）とされている。

使ってはいけない理由:

- プロシージャーや関数の入出力がわからなくなるため、コードが理解しづらくなる
- コードが理解しづらくなるため、保守が難しくなる
- 大量に使用した場合、メモリーがオーバーフローし、ブックを開くだけでExcelが落ちる
- その他は[こちら](https://kimama-vba.com/2019/03/12/module-%CF%89/)

モジュールレベル定数なら使ってもOK:

```VB
Const 定数名 As データ型 = 値
```

# 関数や変数を使わず連続コピペ
少なくとも変数は使用して欲しい。

## 1回しか使わないのに変数を使う
1回しか使わないなら変数を使う意味がない。ただし、読みやすさのためならOK（例：関数の引数が大量にある場合、個々の引数を変数に格納した上で関数に渡す）

# データ整形
データ整形用の機能が最初から備わっているPandasやPower Queryを使用する。

# 帳票作成
VBAで帳票の特定のセルにちまちま値を入力するのはNG。

Excelの関数と組み合わせるようにする。例えば、VBAは特定のシートの特定のテーブルに結果を出力するだけにしておいて、帳票はそのテーブルやそのテーブルを元にしたピボット テーブルからExcelの関数で取得するようにする。

# 参考
みんな苦労しているんだなぁ('A`)

- [Excel VBA に対する防衛術](https://qiita.com/BlueRayi/items/8628781959754f7441a9)
- [なぜVBはC#と比べて駄目なのか](https://crapp.hatenablog.com/entry/2014/12/31/235842)（これはVBだけど）
Excel VBA入門 ～その5 Tips～

VBAが嫌いな人が書いたVBA入門記事その5です。初心者の人も最低限だけ身に付けてPythonに移行しましょう。→[VBAユーザーのためのPython入門 ～xlwingsでExcelからPythonを呼び出す～](https://qiita.com/k_maki/items/9efdb70f69d6f3b00f80)

**記事一覧**

- [Excel VBA入門 ～その1 Excel VBAとは～](https://qiita.com/k_maki/items/eed5497c704c2ca91699)
- [Excel VBA入門 ～その2 最初のプログラム～](https://qiita.com/k_maki/items/47d6299ecbb293b01f5a)
- [Excel VBA入門 ～その3 基礎1～](https://qiita.com/k_maki/items/852fd4babfd3031b6d72)
- [Excel VBA入門 ～その4 基礎2～](https://qiita.com/k_maki/items/44fe76f5890fedd753b3)
- Excel VBA入門 ～その5 Tips～
- [Excel VBA入門 ～その6 アンチパターン～](https://qiita.com/k_maki/items/c40c0eab5af4984f08a2)

# Rangeオブジェクト
- `Range(名前の定義)`でデータ取得: Excelで設定した[名前の定義](https://support.microsoft.com/ja-jp/office/%E6%95%B0%E5%BC%8F%E3%81%A7%E5%90%8D%E5%89%8D%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B-4d0f13ac-53b7-422e-afd2-abd7ff379c64)を使用してセルに保存されたデータを取得することができる。セルの位置を変えてもコードを書き換える必要が無い。

# ListObjectオブジェクト
- Excelのテーブルに対応するオブジェクト
- ListObject.ListRows、ListObject.ListColumnsで行ごと、列ごとにループ

# FileSyetemObjectオブジェクト
- オブジェクトベースでのファイル操作

# Dictionaryオブジェクト
- キー付きで値を保存可能。保存した値はキーで取り出せる。
- 配列やコレクションに比べ、オブジェクトで出来ることが多い

# [ms docs](https://docs.microsoft.com/ja-jp/office/vba/api/overview/)
- 「ms docs オブジェクト名」で検索するとマイクロソフト公式のドキュメントがヒットする。
- 適当にググって分からなければ、メンバー一覧を眺めて機能を探すのも手
Excel VBA入門 ～その2 最初のプログラム～

VBAが嫌いな人が書いたVBA入門記事その2です。初心者の人も最低限だけ身に付けてPythonに移行しましょう。→[VBAユーザーのためのPython入門 ～xlwingsでExcelからPythonを呼び出す～](https://qiita.com/k_maki/items/9efdb70f69d6f3b00f80)

**記事一覧**

- [Excel VBA入門 ～その1 Excel VBAとは～](https://qiita.com/k_maki/items/eed5497c704c2ca91699)
- Excel VBA入門 ～その2～
- [Excel VBA入門 ～その3 基礎1～](https://qiita.com/k_maki/items/852fd4babfd3031b6d72)
- [Excel VBA入門 ～その4 基礎2～](https://qiita.com/k_maki/items/44fe76f5890fedd753b3)
- [Excel VBA入門 ～その5 Tips～](https://qiita.com/k_maki/items/575b6c6c7ec22581061c)
- [Excel VBA入門 ～その6 アンチパターン～](https://qiita.com/k_maki/items/c40c0eab5af4984f08a2)

# エディターを開く & 準備
Excelを起動し、`Alt + F11`でVBAエディターを開く。

最初の設定を行う。 `ALt` -> `T` -> `O`でオプション画面を開き、

- オプション画面の`編集`タブで、`自動構文チェック`のチェックを外す。
- 同じく`編集`タブで、`変数の宣言を強制する`をチェックする。変数の宣言を強制する理由は[こちら](https://www.yosato.net/?p=1400)
- オプション画面の`ドッキング`タブで、`イミディエイトウィンドウ`等、表示されているものの全てをチェックする。

# 最初のプログラム
プロジェクト ウィンドウで開いているファイルを右クリック -> `挿入` -> `標準モジュール` で標準モジュールを作成。

```VB
Option Explicit

Sub test()
    Dim msg As String
    msg = "hello"
    Debug.Print msg
End Sub
```
上記を標準モジュールに貼り付け、`F5`で実行。実行後、イミディエイトウィンドウに`hello`と表示される。

# デバッグ
`Debug.Print msg`の左側の枠をクリックし、ブレーク ポイントを設定する。
先ほどと同様に`F5`で実行すると、ブレーク ポイントでマクロが停止する。

デバッグでできること:

- `F8`でステップ実行が可能（ステップ オーバー、ステップ アウトも）
- イミディエイトウィンドウで簡単なコードを実行可
- ローカル ウィンドウで変数の状態を確認可
- ウォッチ ウィンドウで変数のウォッチまたは指定した条件でのブレークが可能
- 左側の枠にある黄色い矢印を動かすことで、実行中の行をずらすことが可能。


# マクロの記録
Excelをアクティベイト -> リボンの`開発`タブ(`ALT, L`) -> `マクロの記録`(`R`) でマクロの記録を開始。`開発`タブ -> `記録の停止`ボタンで記録を停止。
開始から停止までの間に行ったExcel上での操作が記録され、VBAのモジュールに保存される。

**注意**: 読みにくいコードが生成されるため、そのまま利用すると保守が辛くなる。行いたい操作を実現するための方法（オブジェクトやそのメンバーの使い方）の確認に留めるべき。
Excel VBA入門 ～その1 Excel VBAとは～

長年VBAを使い続けた結果、[とある感情](https://honcierge.jp/articles/shelf_story/9257)を抱えた人が書いたVBA入門記事その1です。まずはこの記事でVBAの基礎を身に付けて、その後Pythonにステップアップしましょう。→[VBAユーザーのためのPython入門 ～xlwingsでExcelからPythonを呼び出す～](https://qiita.com/k_maki/items/9efdb70f69d6f3b00f80)

**記事一覧**

- Excel VBA入門 ～その1 Excel VBAとは～
- [Excel VBA入門 ～その2 最初のプログラム～](https://qiita.com/k_maki/items/47d6299ecbb293b01f5a)
- [Excel VBA入門 ～その3 基礎1～](https://qiita.com/k_maki/items/852fd4babfd3031b6d72)
- [Excel VBA入門 ～その4 基礎2～](https://qiita.com/k_maki/items/44fe76f5890fedd753b3)
- [Excel VBA入門 ～その5 Tips～](https://qiita.com/k_maki/items/575b6c6c7ec22581061c)
- [Excel VBA入門 ～その6 アンチパターン～](https://qiita.com/k_maki/items/c40c0eab5af4984f08a2)

# Excel VBAとは
Excelにくっついているプログラミング言語。Excelでできるほとんどのことが可能（Power QueryやPower Pivotに関するものは不可）。古臭い。

# VBAとPythonの比較

| | VBA | Python | 理由
|:-:|:-:|:-:|:-|
| 開発環境の準備 | ○ | △ | VBAはすぐに使えるが、Pythonはアプリのインストールが必要 |
| MS Officeとの連携 | ○  | △ | Pythonはライブラリーを使えばある程度可能
| 実行速度      | △ | ○ | Pythonはライブラリーを使用すれば早い。並列処理も可能。 |
| 並列処理      | × | ○ | VBAだとCPUの性能を活かしきれない |
| 言語の柔軟性  | × | ○  | VBAは古すぎて制限が多い。Pythonは現代的なプログラミング機能をひと通り揃えている |
| 新機能追加    | × | ○ | VBAは開発が停止されているが、Pythonは現在も開発されており機能追加されている。
| 開発環境の使いやすさ | × | ○ | VBAは古いVBEしか使えないが、PythonはVSCodeが使える |
| 開発速度 | × | ○ | Pythonの方が言語の機能やライブラリーが豊富 |
| ライブラリー  | × | ○ | VBAにはサードパーティーのライブラリーがほとんどない |
| 応用          | × | ○ | Pythonはライブラリーを活用すればいくらでも応用できる |
| 人気          | × | ○ | VBAは嫌われ言語上位常連、Pythonは好きな言語上位常連 |  
| バージョン管理 | × | ○ | VBAは都度モジュールを出力しなければならない |

# VBAやってはいけない
Excel/VBAは業務ツールのフロントエンドとして使用。データ取り込みはPower Queryで、ロジックを伴う処理はPythonで行うのが効率的。

以下はVBAではやってはいけない:

- データ取り込み。Power QueryやPythonで行うこと。
- データ出力。Pythonで行うこと。
- 統計処理。車輪の再発明になるため。Pythonのパッケージで提供されているので、それを使う。
- ロジックを伴う処理。Pythonの方が機能が豊富で環境も優れているため。

VBAでやることは以下くらいしかない:

- PythonやPower Queryの呼び出し
【RSpec】日付連番のデータを大量に作成したい


##環境
Ruby 3.0.2
Rails 6.1.4.1

##成功
前提：userは定義済み、Postテーブルにdateカラムが存在する。
dateのループの中でデータ作成する

```spec.rb
(Date.new(2021, 1, 1)..Date.new(2021, 9, 1)).each do |date|
   create(:post, date: date, user: user)
end
```

##失敗

FactoryBotのdateカラムを定義する際にdateをループして

```factory.rb
FactoryBot.define do
  factory :post do
    date { 
      (Date.new(2021, 1, 1)..Date.new(2021, 9, 1)).each do |date|
        date
      end
    }
  end
end
```

テストの方で200個作成

```spec.rb
...
create_list(:post, 200, user: user)
...
```
すると
「レンジを引用できない」エラー

```
 TypeError:
       can't quote Range
```
MAX IIでLチカ

EPM7032が使えなかったのですが、せっかく苦労してQuatusをインストールしたので、しかたなく安いMAX IIのボードを購入してみました。

よくあるEPM240T100C5の物です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/662a981b-9651-7a22-ea4c-448675bc5b69.png)

このボードはいろいろピーコ品があるようですが、上のタイプのものが届きました。

この手の基板を買ったときはいつもバリを取るためにカット部分にやすりをかけてから使います。

USB-Blasterのピーコ品とでAliだと1000円以下で買えるみたいですがAmazonでも2000円くらいで買えます。Aliに手を出すと際限がなくなるのでAliは使わないことにしています。またガジェットは1000円以下としているのですが二つで2000円なので大目に見てください。

電源はAMS1117 3.3Vのレギュレーターが付いていて、DCジャックはセンターが2.1mmでプラスでした。とりあえず電源をつないで見ると、Lチカが焼いてあるようです。5Vくらいあれば大丈夫なので、USBを電源にすることもできます。

ピンヘッダに+5がありますが、これはDCアダプタ直結なので、DCアダプタが5V以上の場合はそのまま出ますので、注意してください。

VerilogのLチカを検索して探してみました。

```verilog
module test2(clk,led);
input clk;
output led;
reg led;

reg[23:0] cnt;

always @(posedge clk) begin 
   cnt<= cnt + 1'b1; 
   led<=cnt[23];
end

endmodule    
```

Pin Plannerでピンをアサインします。下のNode Nameをドラッグして上の図のピンの位置にあわせると設定できます。このボードはクロックが12でLEDが77に接続されていました。クロックは50MHzのようです。LEDはジャンパー(J2)を外すと切り離せるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/77c199b3-4dc1-464e-1313-064601088074.png)

Programmerで焼きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/ee5590b4-6600-b732-a91c-f36628e59af9.png)

urjtagで焼く場合はProgrammerのウインドのFileメニューの"Create JAM, SVF, or ISC File"でsvfファイルを作ります。

Lチカできました。

24ビットのカウンターは16777216でそれの最上位ビットでOn/Offしているので、8388608カウントごとにOn/Offしています。50MHzなので0.17秒くらいみたいです。一秒間に3回点灯くらいでしょうか。

QuatusはWin7なマシンでもMPLAB XやVSのように重くなくて、きびきび動いてよい感じです。
Windowsサーバー構築時にやること

## サーバー構築
### ネットワークアダプタの変更
### PC名の変更
### ネットワークの設定
### 疎通確認用のファイアウォールの設定
### 疎通確認
受信と送信、どちらも確認しておく
## ドメインコントローラー構築
### 役割と機能の追加
### ドメインコントローラーへの昇格
## ドメインコントローラーの冗長化
### ネットワークにて優先DNSを変更する
### 役割と機能の追加
## ドメイン参加
### 参加する端末の優先DNSを変更する
### 参加する端末にてドメイン変更をする
## ストレージ追加
### 追加したストレージをオンライン化
ディスク管理
### シンプルボリュームの割り当てを行う
## iSCS
NTP

#はじめに

CCNA試験の勉強をしていて、NTPについて勉強したものをまとめています。
ご指摘等ございましたらご教授下さい。

NTP(Network Time Protocol)はなぜ必要なのか？
なぜ、時間同期をする必要があるのか？
しないと、それぞれのルータで時間が違うとダウンした時間も
変わってくるからです。
NTPはUTC(Coordinated Universal Time:協定世界時)を
把握しているサーバと同期をとるプロトコルになります。

##NTPサーバの階層構造

NTPはstratumという階層構造で管理されています。
stratum0は時計と思ってください。
それに同期がされていると考えましょう。
stratum0に世界中が同期されてしまうとNTPサーバに負荷がかかってしまいます。
そのため、負荷分散をしていますが、stratum15までは構築できます。

##NTPの設定例

RT(config)#clock timezone JST9
これは日本の標準時を設定します。UTCより9時間進んでいる意味です。

RT(config)#ntp master 数字
このルータをストラタムのNTPサーバとして有効化する(デフォルトは8)

RT(config)#ntp server ~
同期するNTPサーバを表しています。

RT#show ntp status
これはNTPの情報を表しています。

RT#show ntp associations
これは隣接関係を表すコマンドです。
SparkにおけるPandas API

[Pandas API on Spark \| Databricks on AWS](https://docs.databricks.com/languages/pandas-spark.html) [2021/9/30時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

> **注意**
この機能は[Databricks Runtime 10\.0、および、Databricks Runtime 10\.0 Photon](https://docs.databricks.com/release-notes/runtime/10.0.html)以降で利用できます。[Databricks Runtime 9\.1 LTS、および、Databricks Runtime 9\.1 LTS Photon](https://docs.databricks.com/release-notes/runtime/9.1.html)以前のクラスターでは、[Koalas](https://docs.databricks.com/languages/koalas.html)を使用してください。

データサイエンティストには幅広く使用されている[pandas](https://pandas.pydata.org/)は、Pythonプログラミング言語において利用しやすいデータ構造とデータ分析ツールを提供するPythonパッケージです。しかし、pandasはビッグデータにスケールしません。SparkにおけるPandas APIはApache Sparkで動作するpandasと同等のAPIを提供することで、このギャップを埋めます。Sparkのpandas APIは、PySparkデータフレームからデータを直接プロットするなど、PySparkでは行うのが難しい数多くのタスクをサポートするので、pandasのユーザーだけではなくPySparkのユーザーにもメリットがあります。

# 要件

SparkのPandas APIはApache Spark 3.2以降([Databricks Runtime 10\.0、あるいはDatabricks Runtime 10\.0 Photon以降に含まれています](https://docs.databricks.com/release-notes/runtime/10.0.html))で、以下の`import`文を用いることで利用できます。

```py:Python
import pyspark.pandas as ps
```

# ノートブック

https://github.com/taka-yayoi/public_repo/tree/main/spark_pandas_api

# リソース

- Apache Sparkウェブサイトの[SparkのPandas APIのドキュメント](https://dist.apache.org/repos/dist/dev/spark/v3.2.0-rc4-docs/_site/api/python/user_guide/pandas_on_spark/index.html)
- Apache Sparkウェブサイトにある[Migrating from Koalas to pandas API on Spark](https://dist.apache.org/repos/dist/dev/spark/v3.2.0-rc4-docs/_site/api/python/migration_guide/koalas_to_pyspark.html)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Swift JSON+Codableで不正なURL表現の文字列があった場合のデコードエラーを防ぐ

# URLのCodable

JSONなどのデータをSwiftのStructに落とし込む時、`Codable`が使われます。
structの各プロパティをCodableに対応したクラスにすることで、JSONをstructに変換することができます。

Codableに対応したクラスですが、Appleのドキュメントに、[Encoding and Decoding Custom Types](https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types) というものがあります。
ここには、String, Int, Double, Date, Data, そしてURLが対応していると列挙されています。
なので、struct中にURLがあっても、その文字列がURLで表現される場合、正しくURLとして変換されます。
以下はURLを含む文字列の例です。

```:JSONデータ
let data = """
{
  "id": 1234,
  "name": "Hello World!",
  "url": "http://example.com"
}
""".data(using: .utf8)
```

```swift
struct MyData: Codable {
    let id: Int
    let name: String
    let url: URL
}

let ret = try! JSONDecoder().decode(MyData.self, from: data!)
print(ret) //MyData(id: 1234, name: "Hello World!", url: http://example.com)
```

# 問題

しかし、この文字列→URL変換処理は、`URL(string:)`で変換できることが条件となっているので、URLの部分の文字列が空文字や日本語を含むURL、またはURLとは看做さない文字列がJSONに含まれていると、JSONそのものがDecodingErrorになってしまいます。
この挙動はstructのURLが`URL?`とOptionalで定義してあっても同様です。

```:JSONデータ
let data = """
{
  "id": 1234,
  "name": "Hello World!",
  "url": ""
}
""".data(using: .utf8)
```

```swift
let ret = try! JSONDecoder().decode(MyData.self, from: data!) 
// Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "url", intValue: nil)], debugDescription: "Invalid URL string.", underlyingError: nil))
```

# 対処
この問題を対処するために、一度Codableに対応した別クラス `SafeCodableUrl` を挟んでデコードを行うようにしてみます。
URLにできる文字列がJSONに入っていた場合、SafeCodableUrlのvalueにURLが存在し、URLにできない文字列の場合、valueはnilとなり、より安全にJSONが扱えるようになります。

```swift
struct SafeCodableUrl: Codable {
    let value: URL?
    init(from decoder: Decoder) throws {
        let container = try? decoder.singleValueContainer()
        if let string = try? container?.decode(String.self) {
            self.value = URL(string: string)
        } else {
            self.value = nil
        }
    }
}
```

```:JSONデータ
let data = """
{
  "id": 1234,
  "name": "Hello World!",
  "url": ""
}
""".data(using: .utf8)
```

```swift
struct MyData: Codable {
    let id: Int
    let name: String
    let url: SafeCodableUrl //文字列がURLではない場合もデコードエラーにならない
}

let ret = try! JSONDecoder().decode(MyData.self, from: data!)
print(ret.url.value) //nil
```
システムログの管理

#はじめに
CCNAでシステムログについて勉強したものをまとめました。
修正点や間違えなどがございましたら是非ご教授下さい。

システムログはなんでしょうか？
システムの動作記録を管理することで、ネットワークの監視・保守を行います。

システムログの確認方法は4パターンあります。
コンソールラインと仮想ターミナルラインでリアルタイムに出力させる。
ルータやスイッチのRAMを確認する。
Syslogサーバ

##RAMとROM

どちらもメモリですが、RAM(Random Access Memory)は
揮発性のメモリで、電源を切ると記憶内容は失われます。
しかし、ROM(Read Only Memory)は不揮発性のメモリで、
電源を切っても記憶内容を保持します。

#システムログの分類方法

システムログの種類をファシリティと言います。
Cisoco製のルータやスイッチはデフォルトでLocal7です。
ログの内容の重要度を表す言葉をプライオリティと言います。
これが小さい程、優先度が高くなっています。
一覧はこれです。
0 emergencies システムが不安定
1 alerts　即時処理が必要
2 critical　クリティカルな状態
3 errors エラー状態
4 warnings 警告状態
5 notifications　正常だが注意を要する状態
6 informational 情報メッセージ
7 debugging デバッグメッセージ

もし、ログの出力時にプライオリティ2を出力するとcritical alerts emergenciesが
出力されます。

#システムログの設定

コンソールにはデフォルトでログが出力される。
デフォルトは7だが、debugレベルの出力には別でデバッグコマンドが必要です。

RT(config)# logging console 4
これは出力されるログのレベルを変更します。

Router# terminal monitor
これはVTY接続時にログを出力させるコマンドになります。

RT(config)#logging monitor 5
これはVTY接続時の出力されるログのレベルを変更します。

Router(config)# logging buffered
これはRAMにシステムログを保存します。

Router(config)#logging host
これはSyslogサーバを指定するコマンドです。

Router# show logging
これはログを表示するコマンドになります。

Router# debug all
通常には表示されない機器が送受信するパケットの詳細やネットワークの状況を
表示します。障害調査にはとても有効です。しかし、CPUの負荷が大きいので、
オプションを設定する必要やno debug allかundebug allで停止させましょう。
JavaScript - How to format a Date in MM/dd/yyyy HH:mm:ss format in JavaScript?

```javascript
var dt = new Date();

console.log(`${
    (dt.getMonth()+1).toString().padStart(2, '0')}/${
    dt.getDate().toString().padStart(2, '0')}/${
    dt.getFullYear().toString().padStart(4, '0')} ${
    dt.getHours().toString().padStart(2, '0')}:${
    dt.getMinutes().toString().padStart(2, '0')}:${
    dt.getSeconds().toString().padStart(2, '0')}`
);
```


https://stackoverflow.com/questions/10632346/how-to-format-a-date-in-mm-dd-yyyy-hhmmss-format-in-javascript
CDPとLLDP

#はじめに

CCNA試験の勉強をしていて、CDPとLLDPについて勉強したものをまとめています。
ご指摘等ございましたらご教授下さい。


隣接機器の情報を取得するためのプロトコルとしてCDP(Cisco Discovery Protocol)と
LLDP(Link Layer Discovery Protocol)があります。
CDPはCisco独自のプロトコルで、データリンク層で動作します。
つまり、IPアドレスが無くても動作します。
デフォルトで60秒毎にマルチキャストでVLAN1から送信される。
標準化されているのはLLDPです。
デフォルトで30秒毎にマルチキャストで送信されます。

#CDPのコマンド

RT(config)# no cdp run
これはCDPを一括で無効化にするコマンドです。
デフォルトで有効になっていて、セキュリティ上、外部インターネットと
繋がっているルータにはCDPは無効化することを推奨しています。
一括で有効にするときはcdp runにしましょう。

RT(config-if)# no cdp enable
これは特定のインターフェイスでCDPを無効化にするコマンドです。
一括か特定かで判断しましょう。

RT#　show cdp
これはCDPの情報を取得するコマンドです。

RT# show cdp interface
これはインターフェイス毎のCDPの情報を取得します。

RT(config)# show cdp neighbors
これは隣接機器の情報を取得することができます。
オプションでdetailを付けることでさらに詳細を取得できます。
show cdp entry *にすることで全ての機器を取得でき、
特定の機器を取得する時はentryの後に機器名を付けましょう。

#LLDPのコマンド

RT(config)# lldp run
これはLLDPを一括で有効化することです。
しかし、LLDPだと送信と受信の有効化を分けることができます。
コンフィギュレーションモードでは一括で許可します。
しかし、インターフェイスだとlldpの後にtransmitかreceiveで分けることができます。

RT# show lldp
これはLLDPの動作状況を知るコマンドになります。
機器情報を知りたいときはshow neigborsになります。

RT(config)#lldp timer 数字
これは送信間隔を設定できます。

RT(config)#lldp holdtimer
これは取得情報を180秒間保持する様にする。

RT(config)#lldp reinit 数字
送信後から再初期化までの時間を変える。

RT(config)#no lldp tlv-select オプション
TLVとは自身の情報のことです。デフォルトでは全ての情報を送信することになっている。
なので、オプションで設定ができます。
また、LLDPはトポロジチェンジの情報も伝えます。

RT#show lldp neighbors
これは隣接機器の情報を取得します。

RT# show lldp neigbors detailに関してはCDPと同じです。
PythonのMunkresを用いて割り当て問題を解く

#### 【例題】以下の行列の各行から1つの数を選んで足した最小値を求めよ。ただし各列からは1つしか選べない。

| | A| B| C| D |  E|
|:--:|:---:|:---:|:--:|:--:|:--:|
|a |765| 530| 183| 439| 863|
|b |497| 383| 563| 790| 973|
|c |287| 630| 343| 169| 583|
|d |627| 343| 773| 959| 943|
|e |767| 473| 103| 699| 303|

これをまともに解くとO(n!)となりますが、以下の記事を参考にしてPython のMunkresを使ってみました。
> [割当問題のハンガリアン法をpythonで実装してみた](https://qiita.com/m__k/items/8e2cb9067ec5d720c30d#%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E6%B3%95)

まずmunkresをインストールします。

```python
pip install munkres
```
あとは行列をMunkresに渡すだけという簡単なものです。注意点はarrayをMunkresに渡すと中の値が変更されてしまうのでcopyしてから渡したほうが良いですね。

```python
from munkres import Munkres
import numpy as np
import copy

mtx = np.array([[765,  530, 183, 439, 863],
[497, 383, 563,  790, 973],
[287,  630, 343, 169, 583],
[627, 343, 773, 959, 943],
[767, 473, 103, 699, 303]])

ansMtx = Munkres().compute(copy.copy(mtx))
asum = sum([mtx[idx] for idx in ansMtx])
print(ansMtx)
print(f"Minmum sum = {asum}")
#[(0, 2), (1, 0), (2, 3), (3, 1), (4, 4)]
#Minmum sum = 1495
```

これはProject Euler P345を解くのに役に立ちました。
ArgoCDとKustomizeのバージョン変移

# 対応表

|ArgoCD Version|Release Date|Kustomize Version|Pull Request|
|---|---|---|---|
|[v1.1.0](https://github.com/argoproj/argo-cd/releases/tag/v1.1.0)|2019-07-25|v2.0.3||
|[v1.2.0](https://github.com/argoproj/argo-cd/releases/tag/v1.2.0)|2019-09-05|v3.1.0|[argo-cd#2072](https://github.com/argoproj/argo-cd/pull/2072)|
|[v1.3.0](https://github.com/argoproj/argo-cd/releases/tag/v1.3.0)|2019-11-13|v3.2.0|[argo-cd#2609](https://github.com/argoproj/argo-cd/pull/2607)|
|[v1.4.0](https://github.com/argoproj/argo-cd/releases/tag/v1.4.0)|2020-01-18|v3.2.0||
|[v1.5.0](https://github.com/argoproj/argo-cd/releases/tag/v1.5.0)|2020-04-03|v3.2.0||
|[v1.6.0](https://github.com/argoproj/argo-cd/releases/tag/v1.6.0)|2020-06-17|v3.6.1|[argo-cd#3696](https://github.com/argoproj/argo-cd/pull/3696)|
|[v1.7.0](https://github.com/argoproj/argo-cd/releases/tag/v1.7.0)|2020-08-26|v3.6.1||
|[v1.8.0](https://github.com/argoproj/argo-cd/releases/tag/v1.8.0)|2020-12-10|v3.6.1||
|[v2.0.0](https://github.com/argoproj/argo-cd/releases/tag/v2.0.0)|2021-04-07|v3.9.4|[argo-cd#5672](https://github.com/argoproj/argo-cd/pull/5672)|
|[v2.1.0](https://github.com/argoproj/argo-cd/releases/tag/v2.1.0)|2021-08-20|v4.1.2|[argo-cd#6059](https://github.com/argoproj/argo-cd/pull/6059)|
||||
|[v2.3.0](https://github.com/argoproj/argo-cd/releases/tag/v2.3.0)|2022-03-06|v4.4.1|[argo-cd#8227](https://github.com/argoproj/argo-cd/pull/8227)|
【PHP】Open Weather  Map APIから気象情報を取得してみた

# 初めに
ダッシュボード作成のために、気象情報をAPIにて取得する
[Open Weather Map API](https://openweathermap.org/api)を使用すると取得できることが判明
⇒PHPを用い、HP等で表示させる用途を想定

## 環境
- Windows10
- PHP 8.0.6

## パラメータ
lat (float):必須、取得したい場所の緯度、
lng (float): 必須、取得したい場所の経度
appid:必須、[Open Weather Map API](https://openweathermap.org/api)に登録し、取得してください。
unit:metric 摂氏温度(℃)の取得に固定しています。
lang:ja 日本語に固定しています。

本コードではweather_configにてパラメータをセットしてください。

## コード
```php:owm_api.php
<?php
//Open Weather Map気象情報を取得する
//パラメータをセット
$weather_config = array(
    'appid' => 'XXXXXXXXXXXXXXXXXXXXX',
    'lat' => '35.0000000',
    'lon' => '135.0000000',
);
$weather_json = file_get_contents('http://api.openweathermap.org/data/2.5/weather?lat=' . $weather_config['lat'] . '&lon=' . $weather_config['lon'] . '&units=metric&lang=ja&APPID=' . $weather_config['appid']);
$weather_array = json_decode($weather_json, true);

//必要情報を変数に格納
$weather = $weather_array["weather"]["0"]["main"];
$temp = $weather_array["main"]["temp"];
$temp_min = $weather_array["main"]["temp_min"];
$temp_max = $weather_array["main"]["temp_max"];
$cloud = $weather_array["clouds"]["all"];

echo "天気" . $weather . "\n";
echo "気温:" . $temp . "\n";
echo "最低気温:" . $temp_min . "\n";
echo "最高気温:" . $temp_max . "\n";
echo "雲量:" . $cloud . "\n";
```
# 参考サイト
https://openweathermap.org/api

https://hsmt-web.com/blog/openweathermap-api/

https://qiita.com/thiagomatsui/items/ab923c1fcd6694f6e5bb
Gatsby.jsで「ModuleBuildError: Module build failed :  SyntaxError: Only one default export allowed per module.」というエラーが出たときの対処法

# エラーメッセージ
```bash
ModuleBuildError: Module build failed (from ./node_modules/gatsby/dist/utils/babel-loader.js):
  SyntaxError: /Users/user_name/git/maiamea/portfolio/src/pages/hello.jsx: Only one default export allowed per module. (31:
  0)
    29 |
    30 | export default HelloPage
  > 31 | export default Example
       | ^
```

# エラー発生時のコード
```src/pages/hello.jsx
import React, { useState } from 'react';

const HelloPage = () => {
    return (
        <main>
            <h1>Hello, World!!!</h1>
            <p style={
                {color:"red"}
            }>こんにちは</p>
            <h2>はじめてのGatsby</h2>
        </main>
    )
}

function Example() {
    const [count, setCount] = useState(0);
    return (
        <div>
            <p>You clicked {count} times</p>
            <button onClick={() => setCount(count+1)}>
                Click me
            </button>
        </div>
    )
}

export default HelloPage
export default Example
```

# 原因
1つのファイル内に`export defalt`を複数書いていた。

# 対処法
`export default`には起点となるコンポーネントを書き、一緒のページに表示させたい他のコンポーネントは、起点となるコンポーネント内に`<ExampleComponent></ExampleComponent>`のように埋め込む。

# 修正後
```src/pages/hello.jsx
import React, { useState } from 'react';

const HelloPage = () => {
    return (
        <main>
            <h1>Hello, World!!!</h1>
            <p style={
                {color:"red"}
            }>こんにちは</p>
            <h2>はじめてのGatsby</h2>
            <ExampleComponent></ExampleComponent>
        </main>
    )
}

function ExampleComponent() {
    const [count, setCount] = useState(0);
    return (
        <div>
            <p>You clicked {count} times</p>
            <button onClick={() => setCount(count+1)}>
                Click me
            </button>
        </div>
    )
}

export default HelloPage
```

# 実行結果（ブラウザ）
![スクリーンショット 2021-10-26 15.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/343f0cd7-4063-ef29-c761-98d6335d3a12.png)


# 参考サイト
* [export defaultってなんだろう](https://qiita.com/rena_m/items/b9e79dc88e5c5bc5b245)
* [MDN Export](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export)
* [コンポーネントとprops](https://ja.reactjs.org/docs/components-and-props.html)
python初心者のはじめの一歩


#環境
windows10
python3.9
エディタ　VSCode


#pythonライブラリ　[pandas]
pythonにはライブラリが複数ありますが、今回はcsvデータを読み込んで
色々と加工するときに便利なpandasライブラリを使用します。

ライブラリを使用する時には、importを使用。
これは、どの言語でもだいたい同じですね。

```python
import pandas as pd
```

#csvデータを読み込んで表示してみよう！

csv読み込みは、pandasライブラリの中の「read_csv」関数を使用します。
csvのパスですが、バックスラッシュと¥記号で、躓きました。

データを読み込んだら、表示するだけです。
表示は、様々な方法があるので、以下をコピペして実行してみてください。

```python
import pandas as pd

#msg = "Hello World"
#print(msg)

# \\や/に注意！！
# ↓↓ココにハマった
df_population_data = pd.read_csv('C:\\Users\\xxx\\py_work\\data\\data.csv',encoding='shift-jis')

df_population_data = pd.read_csv('C:/Users/xxx/py_work/data/data.csv',encoding='shift-jis')

pd.set_option('display.max_columns', 10) # 最大表示列数

pd.set_option('display.max_rows', 10) # 最大表示行数


# 全データ表示
print(df_population_data)

# 先頭10行表示
print(df_population_data.head(10))

#デフォルトは、先頭・末尾5行
print(df_population_data.head())
print(df_population_data.tail())

# 50～55行目を表示
print(df_population_data[50:55])

# 先頭行の要素を表示
print(df_population_data.iloc[0])

# 都道府県コードの表示　要素1つ目
print(df_population_data.index.values)


```

お試しで、全データを表示してみます。

```python
> & C:/Users/xxx/AppData/Local/Programs/Python/Python39/python.exe c:/Users/xxx/py_work/test2.py
     都道府県コード 都道府県名  元号  和暦（年）   西暦（年）   人口（総数）    人口（男）    人口（女）
0          1   北海道  大正    9.0  1920.0  2359183  1244322  1114861
1          2   青森県  大正    9.0  1920.0   756454   381293   375161
2          3   岩手県  大正    9.0  1920.0   845540   421069   424471
3          4   宮城県  大正    9.0  1920.0   961768   485309   476459
4          5   秋田県  大正    9.0  1920.0   898537   453682   444855
..       ...   ...  ..    ...     ...      ...      ...      ...
934       43   熊本県  平成   27.0  2015.0  1786170   841046   945124
935       44   大分県  平成   27.0  2015.0  1166338   551932   614406
936       45   宮崎県  平成   27.0  2015.0  1104069   519242   584827
937       46  鹿児島県  平成   27.0  2015.0  1648177   773061   875116
938       47   沖縄県  平成   27.0  2015.0  1433566   704619   728947
```

#参考
こちらを参考にしました。

https://tanuhack.com/pandas-csv-readto/


#感想
今まで、C,C++,Javaなどで開発をしてきましたが、csv読み込みを1行で行えるなんて！
しかもfor文を使用しなくていいなんて！！！と感動しっぱなしでした。
他のライブラリも使用してみたいと思います。